diff --git a/.github/README-de.md b/.github/README-de.md index 427429aee52..757e58a32de 100644 --- a/.github/README-de.md +++ b/.github/README-de.md @@ -24,13 +24,13 @@ PKHeX erwartet Spielstände, die mit konsolenspezifischen Schlüsseln entschlüs ## Screenshots -![Main Window](https://i.imgur.com/ApbTkM0.png) +![Main Window](https://i.imgur.com/5421hUR.png) ## Erstellen -PKHeX ist eine Windows Forms Anwendung, die das [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137) benötigt, mit experimenteller Unterstützung für [.NET 5.0](https://dotnet.microsoft.com/download/dotnet/5.0). +PKHeX ist eine Windows Forms Anwendung, die das [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137) benötigt, mit experimenteller Unterstützung für [.NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0). -Die Anwendung kann mit jedem Kompiler erstellt werde, der C# 8 unterstützt. +Die Anwendung kann mit jedem Kompiler erstellt werde, der C# 10 unterstützt. ### Erstell Konfiguration diff --git a/.github/README-es.md b/.github/README-es.md index dede01c7e3e..cc00e89d4d6 100644 --- a/.github/README-es.md +++ b/.github/README-es.md @@ -24,13 +24,13 @@ PKHeX espera archivos de guardado que no estén cifrados con las claves específ ## Capturas de Pantalla -![Pantalla principal](https://i.imgur.com/tw9zZap.png) +![Pantalla principal](https://i.imgur.com/umit9S2.png) ## Building -PKHeX es una aplicación de Windows Forms que requiere [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137), con soporte experimental para [.NET 5.0](https://dotnet.microsoft.com/download/dotnet/5.0). +PKHeX es una aplicación de Windows Forms que requiere [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137), con soporte experimental para [.NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0). -El archivo ejecutable puede ser construido con cualquier compilador que soporte C# 8. +El archivo ejecutable puede ser construido con cualquier compilador que soporte C# 10. ### Configuraciones del Build diff --git a/.github/README-fr.md b/.github/README-fr.md index 3d3bbbfaba6..d9631ccf3a0 100644 --- a/.github/README-fr.md +++ b/.github/README-fr.md @@ -23,13 +23,13 @@ PKHeX attend des fichiers de sauvegarde qui ne sont pas chiffrés avec des clés ## Captures d'écran -![Main Window](https://i.imgur.com/OqOD05v.png) +![Main Window](https://i.imgur.com/EhtQ14x.png) ## Construction -PKHeX est une application Windows Forms qui nécessite [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137), avec une prise en charge expérimentale de [.NET 5.0.](https://dotnet.microsoft.com/download/dotnet/5.0) +PKHeX est une application Windows Forms qui nécessite [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137), avec une prise en charge expérimentale de [.NET 6.0.](https://dotnet.microsoft.com/download/dotnet/6.0) -L'exécutable peut être construit avec n'importe quel compilateur prenant en charge C# 8. +L'exécutable peut être construit avec n'importe quel compilateur prenant en charge C# 10. ### Construire les configurations diff --git a/PKHeX.Core/Editing/Applicators/MoveShopRecordApplicator.cs b/PKHeX.Core/Editing/Applicators/MoveShopRecordApplicator.cs new file mode 100644 index 00000000000..5a652cf9ff9 --- /dev/null +++ b/PKHeX.Core/Editing/Applicators/MoveShopRecordApplicator.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; + +namespace PKHeX.Core; + +/// +/// Logic for modifying the Move Shop Record flags of a . +/// +public static class MoveShopRecordApplicator +{ + public static void ClearMoveShopFlags(this IMoveShop8 shop) + { + var bits = shop.MoveShopPermitFlags; + for (int i = 0; i < bits.Length; i++) + shop.SetPurchasedRecordFlag(i, false); + + if (shop is IMoveShop8Mastery m) + m.ClearMoveShopFlagsMastered(); + } + + public static void ClearMoveShopFlagsMastered(this IMoveShop8Mastery shop) + { + var bits = shop.MoveShopPermitFlags; + for (int i = 0; i < bits.Length; i++) + shop.SetMasteredRecordFlag(i, false); + } + + public static void SetMoveShopFlags(this IMoveShop8 shop, bool value, int max = 100) + { + var bits = shop.MoveShopPermitFlags; + max = Math.Min(bits.Length, max); + for (int i = 0; i < max; i++) + shop.SetPurchasedRecordFlag(i, value); + } + + public static void SetMoveShopFlagsMastered(this IMoveShop8Mastery shop) + { + var bits = shop.MoveShopPermitFlags; + for (int i = 0; i < bits.Length; i++) + shop.SetMasteredRecordFlag(i, shop.GetPurchasedRecordFlag(i)); + } + + public static void SetMoveShopFlags(this IMoveShop8 shop) + { + var permit = shop.MoveShopPermitFlags; + for (int index = 0; index < permit.Length; index++) + { + if (permit[index]) + shop.SetPurchasedRecordFlag(index, true); + } + } + + /// + /// Sets the Shop Record flags for the based on the current moves. + /// + /// Pokémon to modify. + /// Moves to set flags for. If a move is not a Technical Record, it is skipped. + public static void SetMoveShopFlags(this IMoveShop8 shop, IEnumerable moves) + { + var permit = shop.MoveShopPermitFlags; + var moveIDs = shop.MoveShopPermitIndexes; + foreach (var m in moves) + { + var index = moveIDs.IndexOf(m); + if (index == -1) + continue; + if (permit[index]) + shop.SetPurchasedRecordFlag(index, true); + } + } +} \ No newline at end of file diff --git a/PKHeX.Core/Editing/Applicators/TechnicalRecordApplicator.cs b/PKHeX.Core/Editing/Applicators/TechnicalRecordApplicator.cs index f0f747cb4fd..c9b6435c705 100644 --- a/PKHeX.Core/Editing/Applicators/TechnicalRecordApplicator.cs +++ b/PKHeX.Core/Editing/Applicators/TechnicalRecordApplicator.cs @@ -14,38 +14,37 @@ public static class TechnicalRecordApplicator /// Pokémon to modify. /// Value to set for the record. /// Max record to set. - public static void SetRecordFlags(this PKM pk, bool value, int max = 100) + public static void SetRecordFlags(this ITechRecord8 pk, bool value, int max = 100) { - if (pk is not PK8 pk8) - return; for (int i = 0; i < max; i++) - pk8.SetMoveRecordFlag(i, value); + pk.SetMoveRecordFlag(i, value); } /// /// Clears the Technical Record flags for the . /// /// Pokémon to modify. - public static void ClearRecordFlags(this PKM pk) => pk.SetRecordFlags(false, 112); + public static void ClearRecordFlags(this ITechRecord8 pk) => pk.SetRecordFlags(false, 112); /// /// Sets the Technical Record flags for the based on the current moves. /// /// Pokémon to modify. /// Moves to set flags for. If a move is not a Technical Record, it is skipped. - public static void SetRecordFlags(this PKM pk, IEnumerable moves) + public static void SetRecordFlags(this ITechRecord8 pk, IEnumerable moves) { - if (pk is not PK8 pk8) + if (pk is PA8) return; - var permit = pk8.PersonalInfo.TMHM.AsSpan(PersonalInfoSWSH.CountTM); - var moveIDs = Legal.TMHM_SWSH.AsSpan(PersonalInfoSWSH.CountTM); + + var permit = pk.TechRecordPermitFlags; + var moveIDs = pk.TechRecordPermitIndexes; foreach (var m in moves) { var index = moveIDs.IndexOf(m); if (index == -1) continue; if (permit[index]) - pk8.SetMoveRecordFlag(index, true); + pk.SetMoveRecordFlag(index, true); } } @@ -53,15 +52,13 @@ public static void SetRecordFlags(this PKM pk, IEnumerable moves) /// Sets all the Technical Record flags for the if they are permitted to be learned in-game. /// /// Pokémon to modify. - public static void SetRecordFlags(this PKM pk) + public static void SetRecordFlags(this ITechRecord8 pk) { - if (pk is not PK8 pk8) - return; - var permit = pk8.PersonalInfo.TMHM.AsSpan(PersonalInfoSWSH.CountTM); // tm[100], tr[100] + var permit = pk.TechRecordPermitFlags; for (int i = 0; i < permit.Length; i++) { if (permit[i]) - pk8.SetMoveRecordFlag(i, true); + pk.SetMoveRecordFlag(i, true); } } } diff --git a/PKHeX.Core/Editing/Bulk/BatchEditing.cs b/PKHeX.Core/Editing/Bulk/BatchEditing.cs index fea55b69e65..388e9012b3d 100644 --- a/PKHeX.Core/Editing/Bulk/BatchEditing.cs +++ b/PKHeX.Core/Editing/Bulk/BatchEditing.cs @@ -18,7 +18,7 @@ public static class BatchEditing { public static readonly Type[] Types = { - typeof (PK8), typeof (PB8), + typeof (PK8), typeof (PA8), typeof (PB8), typeof (PB7), typeof (PK7), typeof (PK6), typeof (PK5), typeof (PK4), typeof(BK4), typeof (PK3), typeof (XK3), typeof (CK3), diff --git a/PKHeX.Core/Editing/Bulk/Suggestion/BatchModifications.cs b/PKHeX.Core/Editing/Bulk/Suggestion/BatchModifications.cs index 0361fccf3d3..463ebab63a4 100644 --- a/PKHeX.Core/Editing/Bulk/Suggestion/BatchModifications.cs +++ b/PKHeX.Core/Editing/Bulk/Suggestion/BatchModifications.cs @@ -14,13 +14,13 @@ internal static class BatchModifications public static ModifyResult SetSuggestedRelearnData(BatchInfo info, string propValue) { var pk = info.Entity; - if (pk.Format >= 8) + if (pk is ITechRecord8 t) { - pk.ClearRecordFlags(); + t.ClearRecordFlags(); if (IsAll(propValue)) - pk.SetRecordFlags(); // all + t.SetRecordFlags(); // all else if (!IsNone(propValue)) - pk.SetRecordFlags(pk.Moves); // whatever fit the current moves + t.SetRecordFlags(pk.Moves); // whatever fit the current moves } pk.SetRelearnMoves(info.SuggestedRelearn); diff --git a/PKHeX.Core/Editing/CommonEdits.cs b/PKHeX.Core/Editing/CommonEdits.cs index ad4c347e049..491a6405c19 100644 --- a/PKHeX.Core/Editing/CommonEdits.cs +++ b/PKHeX.Core/Editing/CommonEdits.cs @@ -248,14 +248,19 @@ public static void ApplySetDetails(this PKM pk, IBattleTemplate Set) b.ResetCalculatedValues(); } } + if (pk is IGanbaru g) + g.SetSuggestedGanbaruValues(pk); if (pk is IGigantamax c) c.CanGigantamax = Set.CanGigantamax; if (pk is IDynamaxLevel d) d.DynamaxLevel = d.CanHaveDynamaxLevel(pk) ? (byte)10 : (byte)0; - pk.ClearRecordFlags(); - pk.SetRecordFlags(Set.Moves); + if (pk is ITechRecord8 t) + { + t.ClearRecordFlags(); + t.SetRecordFlags(Set.Moves); + } if (ShowdownSetBehaviorNature && pk.Format >= 8) pk.Nature = pk.StatNature; diff --git a/PKHeX.Core/Editing/Saves/BoxManip/BoxManipBase.cs b/PKHeX.Core/Editing/Saves/BoxManip/BoxManipBase.cs index a58891f474f..926a078930e 100644 --- a/PKHeX.Core/Editing/Saves/BoxManip/BoxManipBase.cs +++ b/PKHeX.Core/Editing/Saves/BoxManip/BoxManipBase.cs @@ -54,23 +54,25 @@ protected BoxManipBase(BoxManipType type, Func usable) public static readonly IReadOnlyList ClearCommon = new List { new BoxManipClear(BoxManipType.DeleteAll, _ => true), - new BoxManipClear(BoxManipType.DeleteEggs, pk => pk.IsEgg, s => s.Generation >= 2), + new BoxManipClear(BoxManipType.DeleteEggs, pk => pk.IsEgg, s => s.Generation >= 2 & s is not SAV8LA), new BoxManipClearComplex(BoxManipType.DeletePastGen, (pk, sav) => pk.Generation != sav.Generation, s => s.Generation >= 4), new BoxManipClearComplex(BoxManipType.DeleteForeign, (pk, sav) => !sav.IsOriginalHandler(pk, pk.Format > 2)), - new BoxManipClear(BoxManipType.DeleteUntrained, pk => pk.EVTotal == 0), - new BoxManipClear(BoxManipType.DeleteItemless, pk => pk.HeldItem == 0), + new BoxManipClear(BoxManipType.DeleteUntrained, pk => pk.EVTotal == 0, s => s is not SAV8LA), + new BoxManipClear(BoxManipType.DeleteUntrained, pk => !((PA8)pk).IsGanbaruValuesMax(pk), s => s is SAV8LA), + new BoxManipClear(BoxManipType.DeleteItemless, pk => pk.HeldItem == 0, s => s is not SAV8LA), new BoxManipClear(BoxManipType.DeleteIllegal, pk => !new LegalityAnalysis(pk).Valid), new BoxManipClearDuplicate(BoxManipType.DeleteClones, pk => SearchUtil.GetCloneDetectMethod(CloneDetectionMethod.HashDetails)(pk)), }; public static readonly IReadOnlyList ModifyCommon = new List { - new(BoxManipType.ModifyHatchEggs, pk => pk.ForceHatchPKM(), s => s.Generation >= 2), + new(BoxManipType.ModifyHatchEggs, pk => pk.ForceHatchPKM(), s => s.Generation >= 2 & s is not SAV8LA), new(BoxManipType.ModifyMaxFriendship, pk => pk.MaximizeFriendship()), new(BoxManipType.ModifyMaxLevel, pk => pk.MaximizeLevel()), new(BoxManipType.ModifyResetMoves, pk => pk.SetMoves(pk.GetMoveSet()), s => s.Generation >= 3), new(BoxManipType.ModifyRandomMoves, pk => pk.SetMoves(pk.GetMoveSet(true))), - new(BoxManipType.ModifyHyperTrain,pk => pk.SetSuggestedHyperTrainingData(), s => s.Generation >= 7), + new(BoxManipType.ModifyHyperTrain,pk => pk.SetSuggestedHyperTrainingData(), s => s.Generation >= 7 && s is not SAV8LA), + new(BoxManipType.ModifyGanbaru,pk => ((IGanbaru)pk).SetSuggestedGanbaruValues(pk), s => s is SAV8LA), new(BoxManipType.ModifyRemoveNicknames, pk => pk.SetDefaultNickname()), new(BoxManipType.ModifyRemoveItem, pk => pk.HeldItem = 0, s => s.Generation >= 2), new(BoxManipType.ModifyHeal, pk => pk.Heal(), s => s.Generation >= 8 || s is SAV7b), diff --git a/PKHeX.Core/Editing/Saves/BoxManip/BoxManipType.cs b/PKHeX.Core/Editing/Saves/BoxManip/BoxManipType.cs index 0f8d52c7e50..54255268ebd 100644 --- a/PKHeX.Core/Editing/Saves/BoxManip/BoxManipType.cs +++ b/PKHeX.Core/Editing/Saves/BoxManip/BoxManipType.cs @@ -42,6 +42,7 @@ public enum BoxManipType ModifyResetMoves, ModifyRandomMoves, ModifyHyperTrain, + ModifyGanbaru, ModifyRemoveNicknames, ModifyRemoveItem, ModifyHeal, diff --git a/PKHeX.Core/Editing/Saves/Slots/Extensions.cs b/PKHeX.Core/Editing/Saves/Slots/Extensions.cs index 6bd16354935..7aafb5fd2b8 100644 --- a/PKHeX.Core/Editing/Saves/Slots/Extensions.cs +++ b/PKHeX.Core/Editing/Saves/Slots/Extensions.cs @@ -55,6 +55,7 @@ public static List GetExtraSlots(this SaveFile sav, bool all = fal SAV7b lgpe => GetExtraSlots7b(lgpe), SAV8SWSH ss => GetExtraSlots8(ss), SAV8BS bs => GetExtraSlots8b(bs), + SAV8LA la => GetExtraSlots8a(la), _ => None, }; @@ -218,5 +219,10 @@ private static List GetExtraSlots8b(SAV8BS sav) new(sav.Data, 8, sav.UgSaveData.GetSlotOffset(8), true) { Type = StorageSlotType.Misc }, }; } + + private static List GetExtraSlots8a(SAV8LA sav) + { + return new List(); + } } } diff --git a/PKHeX.Core/Game/Enums/Ball.cs b/PKHeX.Core/Game/Enums/Ball.cs index 42556f95446..71565de87ac 100644 --- a/PKHeX.Core/Game/Enums/Ball.cs +++ b/PKHeX.Core/Game/Enums/Ball.cs @@ -38,6 +38,19 @@ public enum Ball : byte Sport = 24, Dream = 25, Beast = 26, + + // Legends: Arceus + Strange = 27, + LAPoke = 28, + LAGreat = 29, + LAUltra = 30, + LAFeather = 31, + LAWing = 32, + LAJet = 33, + LAHeavy = 34, + LALeaden = 35, + LAGigaton = 36, + LAOrigin = 37, } public static class BallExtensions diff --git a/PKHeX.Core/Game/Enums/GameVersion.cs b/PKHeX.Core/Game/Enums/GameVersion.cs index 1ca0ff8f50b..7f68f148cd1 100644 --- a/PKHeX.Core/Game/Enums/GameVersion.cs +++ b/PKHeX.Core/Game/Enums/GameVersion.cs @@ -204,7 +204,7 @@ public enum GameVersion SH = 45, // HOME = 46, - // PLA = 47, + PLA = 47, /// /// Pokémon Brilliant Diamond (NX) @@ -459,6 +459,7 @@ public enum GameVersion /// /// /// + /// Gen8, /// diff --git a/PKHeX.Core/Game/Enums/Move.cs b/PKHeX.Core/Game/Enums/Move.cs index 388618338e6..3a1f5236384 100644 --- a/PKHeX.Core/Game/Enums/Move.cs +++ b/PKHeX.Core/Game/Enums/Move.cs @@ -832,6 +832,30 @@ public enum Move GlacialLance, AstralBarrage, EerieSpell, + DireClaw, + PsyshieldBash, + PowerShift, + StoneAxe, + SpringtideStorm, + MysticalPower, + RagingFury, + WaveCrash, + Chloroblast, + MountainGale, + VictoryDance, + HeadlongRush, + BarbBarrage, + EsperWing, + BitterMalice, + Shelter, + TripleArrows, + InfernalParade, + CeaselessEdge, + BleakwindStorm, + WildboltStorm, + SandsearStorm, + LunarBlessing, + TakeHeart, MAX_COUNT, } } diff --git a/PKHeX.Core/Game/Enums/Species.cs b/PKHeX.Core/Game/Enums/Species.cs index b0aba26a9ef..19d72b04a9a 100644 --- a/PKHeX.Core/Game/Enums/Species.cs +++ b/PKHeX.Core/Game/Enums/Species.cs @@ -904,6 +904,13 @@ public enum Species : ushort Glastrier, Spectrier, Calyrex, + Wyrdeer, + Kleavor, + Ursaluna, + Basculegion, + Sneasler, + Overqwil, + Enamorus, MAX_COUNT, } } diff --git a/PKHeX.Core/Game/GameStrings/GameDataSource.cs b/PKHeX.Core/Game/GameStrings/GameDataSource.cs index 7259748a2cb..2129015a8d5 100644 --- a/PKHeX.Core/Game/GameStrings/GameDataSource.cs +++ b/PKHeX.Core/Game/GameStrings/GameDataSource.cs @@ -74,8 +74,8 @@ public GameDataSource(GameStrings s) private static IReadOnlyList GetBalls(string[] itemList) { // ignores Poke/Great/Ultra - ReadOnlySpan ball_nums = stackalloc ushort[] { 007, 576, 013, 492, 497, 014, 495, 493, 496, 494, 011, 498, 008, 006, 012, 015, 009, 005, 499, 010, 001, 016, 851 }; - ReadOnlySpan ball_vals = stackalloc byte[] { 007, 025, 013, 017, 022, 014, 020, 018, 021, 019, 011, 023, 008, 006, 012, 015, 009, 005, 024, 010, 001, 016, 026 }; + ReadOnlySpan ball_nums = stackalloc ushort[] { 007, 576, 013, 492, 497, 014, 495, 493, 496, 494, 011, 498, 008, 006, 012, 015, 009, 005, 499, 010, 001, 016, 851, 1785, 1710, 1711, 1712, 1713, 1746, 1747, 1748, 1749, 1750, 1771 }; + ReadOnlySpan ball_vals = stackalloc byte[] { 007, 025, 013, 017, 022, 014, 020, 018, 021, 019, 011, 023, 008, 006, 012, 015, 009, 005, 024, 010, 001, 016, 026, 0027, 0028, 0029, 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037 }; return Util.GetVariedCBListBall(itemList, ball_nums, ball_vals); } @@ -84,6 +84,7 @@ private static IReadOnlyList GetVersionList(GameStrings s) var list = s.gamelist; ReadOnlySpan games = stackalloc byte[] { + 47, // 8 legends arceus 48, 49, // 8 bdsp 44, 45, // 8 swsh 42, 43, // 7 gg diff --git a/PKHeX.Core/Game/GameStrings/GameStrings.cs b/PKHeX.Core/Game/GameStrings/GameStrings.cs index 3329c349a4f..091819ccc97 100644 --- a/PKHeX.Core/Game/GameStrings/GameStrings.cs +++ b/PKHeX.Core/Game/GameStrings/GameStrings.cs @@ -25,6 +25,7 @@ public sealed class GameStrings : IBasicStrings public readonly string[] metGG_00000, metGG_30000, metGG_40000, metGG_60000; public readonly string[] metSWSH_00000, metSWSH_30000, metSWSH_40000, metSWSH_60000; public readonly string[] metBDSP_00000, metBDSP_30000, metBDSP_40000, metBDSP_60000; + public readonly string[] metLA_00000, metLA_30000, metLA_40000, metLA_60000; // Misc public readonly string[] wallpapernames, puffs, walkercourses; @@ -48,9 +49,11 @@ public sealed class GameStrings : IBasicStrings /// private static readonly ushort[] Items_Ball = { - 000, 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, - 013, 014, 015, 016, 492, 493, 494, 495, 496, 497, 498, 499, 576, - 851, + 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, 0008, 0009, + 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0492, 0493, 0494, + 0495, 0496, 0497, 0498, 0499, 0576, 0851, + 1785, 1710, 1711, + 1712, 1713, 1746, 1747, 1748, 1749, 1750, 1771, }; public GameStrings(string l) @@ -138,6 +141,11 @@ public GameStrings(string l) metSWSH_40000 = Get("swsh_40000"); metSWSH_60000 = Get("swsh_60000"); + metLA_00000 = Get("la_00000"); + metLA_30000 = Get("la_30000"); + metLA_40000 = Get("la_40000"); + metLA_60000 = Get("la_60000"); + metBDSP_00000 = Get("bdsp_00000"); metBDSP_30000 = Get("bdsp_30000"); metBDSP_40000 = Get("bdsp_40000"); @@ -250,6 +258,86 @@ private void SanitizeItemNames() g3coloitems[500 + i] += $" ({i - 11:00})"; // differentiate G3 Card Key from Colo g3coloitems[500 + 10] += " (COLO)"; + + SanitizeItemsLA(itemlist); + + if (lang is "fr") + { + itemlist[1681] += " (LA)"; // Galet Noir dup with 617 (Dark Stone | Black Tumblestone) + } + else if (lang is "ja") + { + itemlist[1693] += " (LA)"; // むしよけスプレー dup with 79 (Repel) + itemlist[1716] += " (LA)"; // ビビリだま dup with 847 (Adrenaline Orb | Scatter Bang) + itemlist[1717] += " (LA)"; // けむりだま dup with 228 (Smoke Ball | Smoke Bomb) + } + + itemlist[464] += " (G4)"; // Secret Medicine + itemlist[1763] += " (LA)"; // Secret Medicine + } + + private static void SanitizeItemsLA(string[] items) + { + // Recipes + items[1784] += " (~)"; // Gigaton Ball + items[1783] += " (~)"; // Leaden Ball + items[1753] += " (~)"; // Heavy Ball + items[1752] += " (~)"; // Jet Ball + items[1751] += " (~)"; // Wing Ball + items[1731] += " (~)"; // Twice-Spiced Radish + items[1730] += " (~)"; // Choice Dumpling + items[1729] += " (~)"; // Swap Snack + items[1677] += " (~)"; // Aux Powerguard + items[1676] += " (~)"; // Aux Evasion + items[1675] += " (~)"; // Dire Hit + items[1674] += " (~)"; // Aux Guard + items[1673] += " (~)"; // Aux Power + items[1671] += " (~)"; // Stealth Spray + items[1670] += " (~)"; // Max Elixir + items[1669] += " (~)"; // Max Ether + items[1668] += " (~)"; // Max Revive + items[1667] += " (~)"; // Revive + items[1666] += " (~)"; // Full Heal + items[1665] += " (~)"; // Jubilife Muffin + items[1664] += " (~)"; // Old Gateau + items[1663] += " (~)"; // Superb Remedy + items[1662] += " (~)"; // Fine Remedy + items[1661] += " (~)"; // Remedy + items[1660] += " (~)"; // Full Restore + items[1659] += " (~)"; // Max Potion + items[1658] += " (~)"; // Hyper Potion + items[1657] += " (~)"; // Super Potion + items[1656] += " (~)"; // Potion + items[1655] += " (~)"; // Salt Cake + items[1654] += " (~)"; // Bean Cake + items[1653] += " (~)"; // Grain Cake + items[1652] += " (~)"; // Honey Cake + items[1650] += " (~)"; // Mushroom Cake + items[1649] += " (~)"; // Star Piece + items[1648] += " (~)"; // Sticky Glob + items[1647] += " (~)"; // Scatter Bang + items[1646] += " (~)"; // Smoke Bomb + items[1644] += " (~)"; // Pokéshi Doll + items[1643] += " (~)"; // Feather Ball + items[1642] += " (~)"; // Ultra Ball + items[1641] += " (~)"; // Great Ball + items[1640] += " (~)"; // Poké Ball + + // Items + items[1616] += " (LA)"; // Dire Hit + items[1689] += " (LA)"; // Snowball + items[1710] += " (LA)"; // Poké Ball + items[1711] += " (LA)"; // Great Ball + items[1712] += " (LA)"; // Ultra Ball + items[1748] += " (LA)"; // Heavy Ball + + // Key Items + items[1622] += " (-)"; // Poké Ball + items[1765] += " (1)"; // Lost Satchel + items[1766] += " (2)"; // Lost Satchel + items[1767] += " (3)"; // Lost Satchel + items[1768] += " (4)"; // Lost Satchel + items[1769] += " (5)"; // Lost Satchel } private void SanitizeMetLocations() @@ -260,7 +348,9 @@ private void SanitizeMetLocations() SanitizeMetG6XY(); SanitizeMetG7SM(); SanitizeMetG8SWSH(); + SanitizeMetG8LA(); SanitizeMetG8BDSP(); + SanitizeMetG8PLA(); if (lang is "es" or "it") { @@ -394,6 +484,12 @@ private void SanitizeMetG8SWSH() // metSWSH_30000[18] += " (-)"; // Pokémon HOME -- duplicate with 40000's entry } + private void SanitizeMetG8LA() + { + metBDSP_30000[1] += $" ({NPC})"; // Anything from an NPC + metBDSP_30000[2] += $" ({EggName})"; // Egg From Link Trade + } + private void SanitizeMetG8BDSP() { metBDSP_30000[1] += $" ({NPC})"; // Anything from an NPC @@ -405,6 +501,48 @@ private void SanitizeMetG8BDSP() Deduplicate(metBDSP_60000, 60000); } + private void SanitizeMetG8PLA() + { + metLA_00000[31] += " (2)"; // in Floaro Gardens + metLA_30000[1] += $" ({NPC})"; // Anything from an NPC + metLA_30000[2] += $" ({EggName})"; // Egg From Link Trade + for (int i = 3; i <= 6; i++) // distinguish first set of regions (unused) from second (used) + metLA_30000[i] += " (-)"; + metLA_30000[19] += " (?)"; // Kanto for the third time + + metLA_40000[30] += " (-)"; // a Video game Event (in spanish etc) -- duplicate with line 39 + metLA_40000[53] += " (-)"; // a Pokémon event -- duplicate with line 37 + + metLA_40000[81] += " (-)"; // Pokémon GO -- duplicate with 30000's entry + metLA_40000[86] += " (-)"; // Pokémon HOME -- duplicate with 30000's entry + // metLA_30000[12] += " (-)"; // Pokémon GO -- duplicate with 40000's entry + // metLA_30000[18] += " (-)"; // Pokémon HOME -- duplicate with 40000's entry + + for (int i = 55; i <= 60; i++) // distinguish second set of YYYY Event from the first + metLA_40000[i] += " (-)"; + + if (lang is "es") + { + // en un lugar misterioso + metLA_00000[2] += " (2)"; // in a mystery zone + metLA_00000[4] += " (4)"; // in a faraway place + } + else if (lang is "ja") + { + // ひょうざんのいくさば + metLA_00000[099] += " (099)"; // along the Arena’s Approach + metLA_00000[142] += " (142)"; // at Icepeak Arena + } + else if (lang is "fr" or "it") + { + // Final four locations are not nouns, rather the same location reference (at the...) as prior entries. + metLA_00000[152] += " (152)"; // Galaxy Hall + metLA_00000[153] += " (153)"; // Front Gate + metLA_00000[154] += " (154)"; // Farm + metLA_00000[155] += " (155)"; // Training Grounds + } + } + private static void Deduplicate(string[] arr, int group) { var counts = new Dictionary(); @@ -557,7 +695,11 @@ public string GetLocationName(bool isEggLocation, int location, int format, int 5 => GetLocationNames5(bankID), 6 => GetLocationNames6(bankID), 7 => GameVersion.Gen7b.Contains(version) ? GetLocationNames7GG(bankID) : GetLocationNames7(bankID), - 8 => GameVersion.BDSP.Contains(version) ? GetLocationNames8b(bankID) : GetLocationNames8(bankID), + + 8 when version is GameVersion.PLA => GetLocationNames8a(bankID), + 8 when GameVersion.BDSP.Contains(version) => GetLocationNames8b(bankID), + 8 => GetLocationNames8(bankID), + _ => Array.Empty(), }; @@ -614,6 +756,15 @@ public string GetLocationName(bool isEggLocation, int location, int format, int _ => Array.Empty(), }; + public IReadOnlyList GetLocationNames8a(int bankID) => bankID switch + { + 0 => metLA_00000, + 3 => metLA_30000, + 4 => metLA_40000, + 6 => metLA_60000, + _ => Array.Empty(), + }; + public IReadOnlyList GetLocationNames8b(int bankID) => bankID switch { 0 => metBDSP_00000, diff --git a/PKHeX.Core/Game/GameStrings/MetDataSource.cs b/PKHeX.Core/Game/GameStrings/MetDataSource.cs index 43b2b093d02..ce44db40e10 100644 --- a/PKHeX.Core/Game/GameStrings/MetDataSource.cs +++ b/PKHeX.Core/Game/GameStrings/MetDataSource.cs @@ -18,6 +18,7 @@ public sealed class MetDataSource private readonly List MetGen7; private readonly List MetGen7GG; private readonly List MetGen8; + private readonly List MetGen8a; private readonly List MetGen8b; private IReadOnlyList? MetGen4Transfer; @@ -34,6 +35,7 @@ public MetDataSource(GameStrings s) MetGen7 = CreateGen7(s); MetGen7GG = CreateGen7GG(s); MetGen8 = CreateGen8(s); + MetGen8a = CreateGen8a(s); MetGen8b = CreateGen8b(s); } @@ -152,6 +154,17 @@ private static List CreateGen8(GameStrings s) return locations; } + private static List CreateGen8a(GameStrings s) + { + var locations = Util.GetCBList(s.metLA_00000, 0); + Util.AddCBWithOffset(locations, s.metLA_30000, 30000, Locations.LinkTrade6); + Util.AddCBWithOffset(locations, s.metLA_00000, 00000, Legal.Met_LA_0); + Util.AddCBWithOffset(locations, s.metLA_30000, 30000, Legal.Met_LA_3); + Util.AddCBWithOffset(locations, s.metLA_40000, 40000, Legal.Met_LA_4); + Util.AddCBWithOffset(locations, s.metLA_60000, 60000, Legal.Met_LA_6); + return locations; + } + private static List CreateGen8b(GameStrings s) { // Manually add invalid (-1) location from SWSH as ID 65535 @@ -201,6 +214,7 @@ or RD or BU or GN or YW GP or GE or GO => Partition2(MetGen7GG, z => z <= 54), // Pokémon League SW or SH => Partition2(MetGen8, z => z < 400), BD or SP => Partition2(MetGen8b, z => z < 628), + PLA => Partition2(MetGen8a, z => z < 512), _ => GetLocationListModified(version, currentGen), }; diff --git a/PKHeX.Core/Game/GameUtil.cs b/PKHeX.Core/Game/GameUtil.cs index 7807737e46d..1578b83d3da 100644 --- a/PKHeX.Core/Game/GameUtil.cs +++ b/PKHeX.Core/Game/GameUtil.cs @@ -76,6 +76,7 @@ private static GameVersion[] GetValidGameVersions() // Gen8 SW or SH => SWSH, BD or SP => BDSP, + PLA => PLA, _ => Invalid, }; @@ -138,6 +139,7 @@ public static int GetMaxSpeciesID(this GameVersion game) return Legal.MaxSpeciesID_7_USUM; return Legal.MaxSpeciesID_7_USUM; } + if (PLA == game) return Legal.MaxSpeciesID_8a; if (BDSP.Contains(game)) return Legal.MaxSpeciesID_8b; if (Gen8.Contains(game)) return Legal.MaxSpeciesID_8; return -1; @@ -200,7 +202,7 @@ public static bool Contains(this GameVersion g1, GameVersion g2) SWSH => g2 is SW or SH, BDSP => g2 is BD or SP, - Gen8 => SWSH.Contains(g2) || BDSP.Contains(g2), + Gen8 => SWSH.Contains(g2) || BDSP.Contains(g2) || PLA == g2, _ => false, }; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea1.cs b/PKHeX.Core/Legality/Areas/EncounterArea1.cs index 235779811f0..b789ca0f9a6 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea1.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea1.cs @@ -14,10 +14,10 @@ public sealed record EncounterArea1 : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea1[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea1[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea1[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea1(input[i], game); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea2.cs b/PKHeX.Core/Legality/Areas/EncounterArea2.cs index 1244cb000b7..0a70c4e0f82 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea2.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea2.cs @@ -20,10 +20,10 @@ public sealed record EncounterArea2 : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea2[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea2[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea2[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea2(input[i], game); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea3.cs b/PKHeX.Core/Legality/Areas/EncounterArea3.cs index 0420f48a5a7..55b6e01cbf9 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea3.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea3.cs @@ -15,18 +15,18 @@ public sealed record EncounterArea3 : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea3[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea3[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea3[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea3(input[i], game); return result; } - public static EncounterArea3[] GetAreasSwarm(byte[][] input, GameVersion game) + public static EncounterArea3[] GetAreasSwarm(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea3[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea3(input[i], game, SlotType.Swarm | SlotType.Grass); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea4.cs b/PKHeX.Core/Legality/Areas/EncounterArea4.cs index 6543278713c..fe578b97264 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea4.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea4.cs @@ -16,10 +16,10 @@ public sealed record EncounterArea4 : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea4[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea4[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea4[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea4(input[i], game); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea5.cs b/PKHeX.Core/Legality/Areas/EncounterArea5.cs index 8fa4dc1ea5b..69f0a5ce8b0 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea5.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea5.cs @@ -14,10 +14,10 @@ public sealed record EncounterArea5 : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea5[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea5[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea5[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea5(input[i], game); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs b/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs index 0a01b78fc84..9bb7e47b384 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea6AO.cs @@ -14,10 +14,10 @@ public sealed record EncounterArea6AO : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea6AO[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea6AO[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea6AO[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea6AO(input[i], game); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs b/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs index 07f1f112491..8f884245167 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea6XY.cs @@ -14,10 +14,11 @@ public sealed record EncounterArea6XY : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea6XY[] GetAreas(byte[][] input, GameVersion game, EncounterArea6XY safari) + public static EncounterArea6XY[] GetAreas(BinLinkerAccessor input, GameVersion game, EncounterArea6XY safari) { - var result = new EncounterArea6XY[input.Length + 1]; - for (int i = 0; i < input.Length; i++) + int count = input.Length; + var result = new EncounterArea6XY[count + 1]; + for (int i = 0; i < count; i++) result[i] = new EncounterArea6XY(input[i], game); result[^1] = safari; return result; diff --git a/PKHeX.Core/Legality/Areas/EncounterArea7.cs b/PKHeX.Core/Legality/Areas/EncounterArea7.cs index 6c10e7cd3af..54a1c67e509 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea7.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea7.cs @@ -14,10 +14,10 @@ public sealed record EncounterArea7 : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea7[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea7[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea7[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea7(input[i], game); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea7b.cs b/PKHeX.Core/Legality/Areas/EncounterArea7b.cs index 0372fffc8c8..0ad2879a6b1 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea7b.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea7b.cs @@ -13,10 +13,10 @@ public sealed record EncounterArea7b : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea7b[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea7b[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea7b[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea7b(input[i], game); return result; } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea7g.cs b/PKHeX.Core/Legality/Areas/EncounterArea7g.cs index 690b7e3d381..4b39e31468a 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea7g.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea7g.cs @@ -28,7 +28,7 @@ private EncounterArea7g(int species, int form, EncounterSlot7GO[] slots) : base( Slots = slots; } - internal static EncounterArea7g[] GetArea(byte[][] data) + internal static EncounterArea7g[] GetArea(BinLinkerAccessor data) { var areas = new EncounterArea7g[data.Length]; for (int i = 0; i < areas.Length; i++) diff --git a/PKHeX.Core/Legality/Areas/EncounterArea8.cs b/PKHeX.Core/Legality/Areas/EncounterArea8.cs index 2556e12b061..ad450979f1d 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea8.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea8.cs @@ -355,15 +355,15 @@ private static bool CanCrossoverTo(int fromLocation, int toLocation, AreaSlotTyp _ => false, }; - public static EncounterArea8[] GetAreas(byte[][] input, GameVersion game, bool symbol = false) + public static EncounterArea8[] GetAreas(BinLinkerAccessor input, GameVersion game, bool symbol = false) { var result = new EncounterArea8[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea8(input[i], symbol, game); return result; } - private EncounterArea8(byte[] areaData, bool symbol, GameVersion game) : base(game) + private EncounterArea8(ReadOnlySpan areaData, bool symbol, GameVersion game) : base(game) { PermitCrossover = symbol; Location = areaData[0]; diff --git a/PKHeX.Core/Legality/Areas/EncounterArea8a.cs b/PKHeX.Core/Legality/Areas/EncounterArea8a.cs new file mode 100644 index 00000000000..5c5f1228696 --- /dev/null +++ b/PKHeX.Core/Legality/Areas/EncounterArea8a.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// +/// encounter area +/// +public sealed record EncounterArea8a : EncounterArea +{ + public readonly EncounterSlot8a[] Slots; + public readonly int ParentLocation; + + protected override IReadOnlyList Raw => Slots; + + public override bool IsMatchLocation(int location) + { + if (base.IsMatchLocation(location)) + return true; + return CanCrossoverTo(location); + } + + private bool CanCrossoverTo(int location) + { + return location == ParentLocation; + } + + public override IEnumerable GetMatchingSlots(PKM pkm, IReadOnlyList chain) => GetMatches(chain, pkm.Met_Level); + + private IEnumerable GetMatches(IReadOnlyList chain, int metLevel) + { + foreach (var slot in Slots) + { + foreach (var evo in chain) + { + if (slot.Species != evo.Species) + continue; + + if (!slot.IsLevelWithinRange(metLevel)) + break; + + if (slot.Form != evo.Form && slot.Species is not ((int)Species.Rotom or (int)Species.Burmy or (int)Species.Wormadam)) + break; + + yield return slot; + break; + } + } + } + + public static EncounterArea8a[] GetAreas(BinLinkerAccessor input, GameVersion game) + { + var result = new EncounterArea8a[input.Length]; + for (int i = 0; i < result.Length; i++) + result[i] = new EncounterArea8a(input[i], game); + return result; + } + + private EncounterArea8a(ReadOnlySpan areaData, GameVersion game) : base(game) + { + // Area Metadata + Location = areaData[0]; + ParentLocation = areaData[1]; + Type = areaData[2] + SlotType.Overworld; + var count = areaData[3]; + + var slots = areaData[4..]; + Slots = ReadSlots(slots, count); + } + + private EncounterSlot8a[] ReadSlots(ReadOnlySpan areaData, byte slotCount) + { + var slots = new EncounterSlot8a[slotCount]; + const int bpe = 8; + for (int i = 0; i < slotCount; i++) + { + var ofs = i * bpe; + var entry = areaData.Slice(ofs, bpe); + byte flawless = entry[7]; + var gender = (Gender)entry[6]; + int max = entry[5]; + int min = entry[4]; + var alpha = entry[3]; + var form = entry[2]; + var species = ReadUInt16LittleEndian(entry); + + slots[i] = new EncounterSlot8a(this, species, form, min, max, alpha, flawless, gender); + } + return slots; + } +} diff --git a/PKHeX.Core/Legality/Areas/EncounterArea8b.cs b/PKHeX.Core/Legality/Areas/EncounterArea8b.cs index 028c15ac3c1..9c1a8bf69af 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea8b.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea8b.cs @@ -14,10 +14,10 @@ public sealed record EncounterArea8b : EncounterArea protected override IReadOnlyList Raw => Slots; - public static EncounterArea8b[] GetAreas(byte[][] input, GameVersion game) + public static EncounterArea8b[] GetAreas(BinLinkerAccessor input, GameVersion game) { var result = new EncounterArea8b[input.Length]; - for (int i = 0; i < input.Length; i++) + for (int i = 0; i < result.Length; i++) result[i] = new EncounterArea8b(input[i], game); return result; } @@ -123,27 +123,27 @@ private static bool IsInaccessibleHoneySlotLocation(EncounterSlot8b slot, PKM pk private static readonly ushort[] LocationID_HoneyTree = { - 359, // 00 Route 205 Floaroma - 361, // 01 Route 205 Eterna - 362, // 02 Route 206 - 364, // 03 Route 207 - 365, // 04 Route 208 - 367, // 05 Route 209 - 373, // 06 Route 210 Solaceon - 375, // 07 Route 210 Celestic - 378, // 08 Route 211 - 379, // 09 Route 212 Hearthome - 383, // 10 Route 212 Pastoria - 385, // 11 Route 213 - 392, // 12 Route 214 - 394, // 13 Route 215 - 400, // 14 Route 218 - 404, // 15 Route 221 - 407, // 16 Route 222 - 197, // 17 Valley Windworks - 199, // 18 Eterna Forest - 201, // 19 Fuego Ironworks - 253, // 20 Floaroma Meadow + 359, // 00 Route 205 Floaroma + 361, // 01 Route 205 Eterna + 362, // 02 Route 206 + 364, // 03 Route 207 + 365, // 04 Route 208 + 367, // 05 Route 209 + 373, // 06 Route 210 Solaceon + 375, // 07 Route 210 Celestic + 378, // 08 Route 211 + 379, // 09 Route 212 Hearthome + 383, // 10 Route 212 Pastoria + 385, // 11 Route 213 + 392, // 12 Route 214 + 394, // 13 Route 215 + 400, // 14 Route 218 + 404, // 15 Route 221 + 407, // 16 Route 222 + 197, // 17 Valley Windworks + 199, // 18 Eterna Forest + 201, // 19 Fuego Ironworks + 253, // 20 Floaroma Meadow }; } } diff --git a/PKHeX.Core/Legality/Areas/EncounterArea8g.cs b/PKHeX.Core/Legality/Areas/EncounterArea8g.cs index 480916ab249..730bdad288d 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea8g.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea8g.cs @@ -28,7 +28,7 @@ private EncounterArea8g(int species, int form, EncounterSlot8GO[] slots) : base( Slots = slots; } - internal static EncounterArea8g[] GetArea(byte[][] data) + internal static EncounterArea8g[] GetArea(BinLinkerAccessor data) { var areas = new EncounterArea8g[data.Length]; for (int i = 0; i < areas.Length; i++) diff --git a/PKHeX.Core/Legality/BinLinker.cs b/PKHeX.Core/Legality/BinLinker.cs deleted file mode 100644 index f894a279a74..00000000000 --- a/PKHeX.Core/Legality/BinLinker.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace PKHeX.Core -{ - public static class BinLinker - { - /// - /// Unpacks a BinLinkerAccessor generated file container into individual arrays. - /// - /// Packed data - /// Signature expected in the first two bytes (ASCII) - /// Unpacked array containing all files that were packed. - public static byte[][] Unpack(ReadOnlySpan fileData, string identifier) - { -#if DEBUG - System.Diagnostics.Debug.Assert(fileData.Length > 4); - System.Diagnostics.Debug.Assert(identifier[0] == fileData[0] && identifier[1] == fileData[1]); -#endif - MemoryMarshal.TryRead(fileData[4..], out int start); - MemoryMarshal.TryRead(fileData[2..], out ushort count); - var offsetBytes = fileData[8..(8 + (count * sizeof(int)))]; - var offsets = MemoryMarshal.Cast(offsetBytes); - - byte[][] returnData = new byte[count][]; - for (int i = 0; i < offsets.Length; i++) - { - int end = offsets[i]; - returnData[i] = fileData[start..end].ToArray(); - start = end; - } - return returnData; - } - } -} diff --git a/PKHeX.Core/Legality/BinLinkerAccessor.cs b/PKHeX.Core/Legality/BinLinkerAccessor.cs new file mode 100644 index 00000000000..e22fd408e5a --- /dev/null +++ b/PKHeX.Core/Legality/BinLinkerAccessor.cs @@ -0,0 +1,50 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Unpacks a BinLinkerAccessor generated file container into individual arrays. +/// +public readonly ref struct BinLinkerAccessor +{ + /// Backing data object + private readonly ReadOnlySpan Data; + + /// Total count of files available for accessing. + public int Length => ReadUInt16LittleEndian(Data[2..]); + + /// Magic identifier for the file. + public string Identifier => new(new[] {(char)Data[0], (char)Data[1]}); + + /// + /// Retrieves a view of the entry at the requested . + /// + /// Entry to retrieve. + public ReadOnlySpan this[int index] => GetEntry(index); + + private BinLinkerAccessor(ReadOnlySpan data) => Data = data; + + private ReadOnlySpan GetEntry(int index) + { + int offset = 4 + (index * sizeof(int)); + int end = ReadInt32LittleEndian(Data[(offset + 4)..]); + int start = ReadInt32LittleEndian(Data[offset..]); + return Data[start..end]; + } + + /// + /// Sanity checks the input only in DEBUG builds, and returns a new wrapper. + /// + /// Data reference + /// Expected identifier (debug verification only) + public static BinLinkerAccessor Get(ReadOnlySpan data, string identifier) + { + var result = new BinLinkerAccessor(data); +#if DEBUG + System.Diagnostics.Debug.Assert(data.Length > 4); + System.Diagnostics.Debug.Assert(identifier[0] == data[0] && identifier[1] == data[1]); +#endif + return result; + } +} diff --git a/PKHeX.Core/Legality/Breeding.cs b/PKHeX.Core/Legality/Breeding.cs index 9501671479c..3872a398965 100644 --- a/PKHeX.Core/Legality/Breeding.cs +++ b/PKHeX.Core/Legality/Breeding.cs @@ -111,6 +111,9 @@ public static bool CanHatchAsEgg(int species, int form, int generation) if (FormInfo.IsTotemForm(species, form, generation)) return false; + if (FormInfo.IsLordForm(species, form, generation)) + return false; + return IsBreedableForm(species, form); } @@ -199,6 +202,7 @@ public static bool CanHatchAsEgg(int species, int form, GameVersion game) (int)Kubfu, (int)Urshifu, (int)Zarude, (int)Regieleki, (int)Regidrago, (int)Glastrier, (int)Spectrier, (int)Calyrex, + (int)Enamorus, }; } } diff --git a/PKHeX.Core/Legality/Core.cs b/PKHeX.Core/Legality/Core.cs index 1a0aad0990a..2cf61e4e253 100644 --- a/PKHeX.Core/Legality/Core.cs +++ b/PKHeX.Core/Legality/Core.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using static PKHeX.Core.BinLinkerAccessor; namespace PKHeX.Core { @@ -16,50 +17,50 @@ public static partial class Legal internal static readonly Learnset[] LevelUpC = LearnsetReader.GetArray(Util.GetBinaryResource("lvlmove_c.pkl"), MaxSpeciesID_2); // Gen 3 - internal static readonly Learnset[] LevelUpE = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_e.pkl"), "em")); - internal static readonly Learnset[] LevelUpRS = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_rs.pkl"), "rs")); - internal static readonly Learnset[] LevelUpFR = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_fr.pkl"), "fr")); - internal static readonly Learnset[] LevelUpLG = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_lg.pkl"), "lg")); - internal static readonly EggMoves6[] EggMovesRS = EggMoves6.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_rs.pkl"), "rs")); + internal static readonly Learnset[] LevelUpE = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_e.pkl"), "em")); + internal static readonly Learnset[] LevelUpRS = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_rs.pkl"), "rs")); + internal static readonly Learnset[] LevelUpFR = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_fr.pkl"), "fr")); + internal static readonly Learnset[] LevelUpLG = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_lg.pkl"), "lg")); + internal static readonly EggMoves6[] EggMovesRS = EggMoves6.GetArray(Get(Util.GetBinaryResource("eggmove_rs.pkl"), "rs")); // Gen 4 - internal static readonly Learnset[] LevelUpDP = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_dp.pkl"), "dp")); - internal static readonly Learnset[] LevelUpPt = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_pt.pkl"), "pt")); - internal static readonly Learnset[] LevelUpHGSS = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_hgss.pkl"), "hs")); - internal static readonly EggMoves6[] EggMovesDPPt = EggMoves6.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_dppt.pkl"), "dp")); - internal static readonly EggMoves6[] EggMovesHGSS = EggMoves6.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_hgss.pkl"), "hs")); + internal static readonly Learnset[] LevelUpDP = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_dp.pkl"), "dp")); + internal static readonly Learnset[] LevelUpPt = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_pt.pkl"), "pt")); + internal static readonly Learnset[] LevelUpHGSS = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_hgss.pkl"), "hs")); + internal static readonly EggMoves6[] EggMovesDPPt = EggMoves6.GetArray(Get(Util.GetBinaryResource("eggmove_dppt.pkl"), "dp")); + internal static readonly EggMoves6[] EggMovesHGSS = EggMoves6.GetArray(Get(Util.GetBinaryResource("eggmove_hgss.pkl"), "hs")); // Gen 5 - internal static readonly Learnset[] LevelUpBW = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_bw.pkl"), "51")); - internal static readonly Learnset[] LevelUpB2W2 = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_b2w2.pkl"), "52")); - internal static readonly EggMoves6[] EggMovesBW = EggMoves6.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_bw.pkl"), "bw")); + internal static readonly Learnset[] LevelUpBW = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_bw.pkl"), "51")); + internal static readonly Learnset[] LevelUpB2W2 = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_b2w2.pkl"), "52")); + internal static readonly EggMoves6[] EggMovesBW = EggMoves6.GetArray(Get(Util.GetBinaryResource("eggmove_bw.pkl"), "bw")); // Gen 6 - internal static readonly EggMoves6[] EggMovesXY = EggMoves6.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_xy.pkl"), "xy")); - internal static readonly Learnset[] LevelUpXY = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_xy.pkl"), "xy")); - internal static readonly EggMoves6[] EggMovesAO = EggMoves6.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_ao.pkl"), "ao")); - internal static readonly Learnset[] LevelUpAO = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_ao.pkl"), "ao")); + internal static readonly EggMoves6[] EggMovesXY = EggMoves6.GetArray(Get(Util.GetBinaryResource("eggmove_xy.pkl"), "xy")); + internal static readonly Learnset[] LevelUpXY = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_xy.pkl"), "xy")); + internal static readonly EggMoves6[] EggMovesAO = EggMoves6.GetArray(Get(Util.GetBinaryResource("eggmove_ao.pkl"), "ao")); + internal static readonly Learnset[] LevelUpAO = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_ao.pkl"), "ao")); // Gen 7 - internal static readonly EggMoves7[] EggMovesSM = EggMoves7.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_sm.pkl"), "sm")); - internal static readonly Learnset[] LevelUpSM = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_sm.pkl"), "sm")); - internal static readonly EggMoves7[] EggMovesUSUM = EggMoves7.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_uu.pkl"), "uu")); - internal static readonly Learnset[] LevelUpUSUM = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_uu.pkl"), "uu")); - internal static readonly Learnset[] LevelUpGG = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_gg.pkl"), "gg")); + internal static readonly EggMoves7[] EggMovesSM = EggMoves7.GetArray(Get(Util.GetBinaryResource("eggmove_sm.pkl"), "sm")); + internal static readonly Learnset[] LevelUpSM = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_sm.pkl"), "sm")); + internal static readonly EggMoves7[] EggMovesUSUM = EggMoves7.GetArray(Get(Util.GetBinaryResource("eggmove_uu.pkl"), "uu")); + internal static readonly Learnset[] LevelUpUSUM = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_uu.pkl"), "uu")); + internal static readonly Learnset[] LevelUpGG = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_gg.pkl"), "gg")); // Gen 8 - internal static readonly EggMoves7[] EggMovesSWSH = EggMoves7.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_swsh.pkl"), "ss")); - internal static readonly Learnset[] LevelUpSWSH = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_swsh.pkl"), "ss")); - internal static readonly EggMoves7[] EggMovesBDSP = EggMoves7.GetArray(BinLinker.Unpack(Util.GetBinaryResource("eggmove_bdsp.pkl"), "bs")); - internal static readonly Learnset[] LevelUpBDSP = LearnsetReader.GetArray(BinLinker.Unpack(Util.GetBinaryResource("lvlmove_bdsp.pkl"), "bs")); + internal static readonly EggMoves7[] EggMovesSWSH = EggMoves7.GetArray(Get(Util.GetBinaryResource("eggmove_swsh.pkl"), "ss")); + internal static readonly Learnset[] LevelUpSWSH = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_swsh.pkl"), "ss")); + internal static readonly EggMoves7[] EggMovesBDSP = EggMoves7.GetArray(Get(Util.GetBinaryResource("eggmove_bdsp.pkl"), "bs")); + internal static readonly Learnset[] LevelUpBDSP = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_bdsp.pkl"), "bs")); + internal static readonly Learnset[] LevelUpLA = LearnsetReader.GetArray(Get(Util.GetBinaryResource("lvlmove_la.pkl"), "la")); - public static IReadOnlyList GetPPTable(PKM pkm, int format) + public static IReadOnlyList GetPPTable(PKM pkm, int format) => format switch { - if (format != 7) - return GetPPTable(format); - var lgpe = pkm.Version is (int) GameVersion.GO or (int) GameVersion.GP or (int) GameVersion.GE; - return lgpe ? MovePP_GG : MovePP_SM; - } + 7 when pkm is PB7 => MovePP_GG, + 8 when pkm is PA8 => MovePP_LA, + _ => GetPPTable(format), + }; public static IReadOnlyList GetPPTable(int format) => format switch { @@ -78,6 +79,7 @@ public static IReadOnlyList GetPPTable(PKM pkm, int format) { PK8 => DummiedMoves_SWSH, PB8 => DummiedMoves_BDSP, + PA8 => DummiedMoves_LA, _ => Array.Empty(), }; @@ -99,7 +101,7 @@ internal static int GetMaxSpeciesOrigin(PKM pkm) 5 => MaxSpeciesID_5, 6 => MaxSpeciesID_6, 7 => MaxSpeciesID_7b, - 8 => MaxSpeciesID_8, + 8 => MaxSpeciesID_8a, _ => -1, }; @@ -112,7 +114,7 @@ internal static int GetMaxSpeciesOrigin(PKM pkm) <= MaxSpeciesID_5 => 5, <= MaxSpeciesID_6 => 6, <= MaxSpeciesID_7b => 7, - <= MaxSpeciesID_8 => 8, + <= MaxSpeciesID_8a => 8, _ => -1, }; @@ -138,7 +140,7 @@ internal static int GetMaxSpeciesOrigin(PKM pkm) 5 => MaxMoveID_5, 6 => MaxMoveID_6_AO, 7 => MaxMoveID_7b, - 8 => MaxMoveID_8, + 8 => MaxMoveID_8a, _ => -1, }; @@ -161,6 +163,18 @@ internal static bool HasVisitedBDSP(this PKM pkm, int species) return pi.IsPresentInGame; } + internal static bool HasVisitedLA(this PKM pkm, int species) + { + if (!pkm.InhabitedGeneration(8, species)) + return false; + if (pkm.LA) + return true; + if (pkm.IsUntraded) + return false; + var pi = (PersonalInfoLA)PersonalTable.LA[species]; + return pi.IsPresentInGame; + } + /// /// Indicates if the moveset is restricted to only the original version. /// @@ -172,6 +186,8 @@ internal static bool IsMovesetRestricted(this PKM pkm) return true; if (pkm.BDSP) return true; + if (pkm.LA) + return true; return false; } diff --git a/PKHeX.Core/Legality/Encounters/Data/EncounterEvent.cs b/PKHeX.Core/Legality/Encounters/Data/EncounterEvent.cs index 9e55e0bfe8a..1dd481c7e4c 100644 --- a/PKHeX.Core/Legality/Encounters/Data/EncounterEvent.cs +++ b/PKHeX.Core/Legality/Encounters/Data/EncounterEvent.cs @@ -30,6 +30,9 @@ public static class EncounterEvent /// Event Database for Generation 8 public static IReadOnlyList MGDB_G8 { get; private set; } = Array.Empty(); + /// Event Database for Generation 8 + public static IReadOnlyList MGDB_G8A { get; private set; } = Array.Empty(); + /// Event Database for Generation 8 public static IReadOnlyList MGDB_G8B { get; private set; } = Array.Empty(); @@ -45,6 +48,7 @@ public static class EncounterEvent private static WB7[] GetWB7DB(ReadOnlySpan bin) => Get(bin, WB7.SizeFull, d => new WB7(d)); private static WC8[] GetWC8DB(ReadOnlySpan bin) => Get(bin, WC8.Size, d => new WC8(d)); private static WB8[] GetWB8DB(ReadOnlySpan bin) => Get(bin, WB8.Size, d => new WB8(d)); + private static WA8[] GetWA8DB(ReadOnlySpan bin) => Get(bin, WA8.Size, d => new WA8(d)); private static T[] Get(ReadOnlySpan bin, int size, Func ctor) { @@ -68,6 +72,7 @@ public static void RefreshMGDB(params string[] paths) ICollection b7 = GetWB7DB(Util.GetBinaryResource("wb7full.pkl")); ICollection g8 = GetWC8DB(Util.GetBinaryResource("wc8.pkl")); ICollection b8 = GetWB8DB(Util.GetBinaryResource("wb8.pkl")); + ICollection a8 = GetWA8DB(Util.GetBinaryResource("wa8.pkl")); foreach (var gift in paths.Where(Directory.Exists).SelectMany(MysteryUtil.GetGiftsFromFolder)) { @@ -87,6 +92,7 @@ static void AddOrExpand(ref ICollection arr, T obj) case WB7 wb7: AddOrExpand(ref b7, wb7); continue; case WC8 wc8: AddOrExpand(ref g8, wc8); continue; case WB8 wb8: AddOrExpand(ref b8, wb8); continue; + case WA8 wa8: AddOrExpand(ref a8, wa8); continue; } } @@ -108,6 +114,7 @@ static T[] SetArray(ICollection arr) MGDB_G7 = SetArray(g7); MGDB_G7GG = SetArray(b7); MGDB_G8 = SetArray(g8); + MGDB_G8A = SetArray(a8); MGDB_G8B = SetArray(b8); } @@ -121,6 +128,7 @@ public static IEnumerable GetAllEvents(bool sorted = true) MGDB_G7, MGDB_G7GG, MGDB_G8, + MGDB_G8A, MGDB_G8B, }.SelectMany(z => z); regular = regular.Where(mg => !mg.IsItem && mg.IsPokémon && mg.Species > 0); diff --git a/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs b/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs index 60340365692..c8b56113cd1 100644 --- a/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs +++ b/PKHeX.Core/Legality/Encounters/Data/EncounterUtil.cs @@ -8,6 +8,8 @@ namespace PKHeX.Core /// internal static class EncounterUtil { + internal static BinLinkerAccessor Get(string resource, string ident) => BinLinkerAccessor.Get(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); + /// /// Gets the relevant objects that appear in the relevant game. /// diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs index 32388c68134..57ef2d9381c 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters1.cs @@ -1,5 +1,6 @@ using static PKHeX.Core.GameVersion; using static PKHeX.Core.EncounterGBLanguage; +using static PKHeX.Core.EncounterUtil; namespace PKHeX.Core { @@ -8,17 +9,14 @@ namespace PKHeX.Core /// internal static class Encounters1 { - internal static readonly EncounterArea1[] SlotsRD = Get("red", "g1", RD); - internal static readonly EncounterArea1[] SlotsGN = Get("blue", "g1", GN); - internal static readonly EncounterArea1[] SlotsYW = Get("yellow", "g1", YW); - internal static readonly EncounterArea1[] SlotsBU = Get("blue_jp", "g1", BU); + internal static readonly EncounterArea1[] SlotsRD = EncounterArea1.GetAreas(Get("red", "g1"), RD); + internal static readonly EncounterArea1[] SlotsGN = EncounterArea1.GetAreas(Get("blue", "g1"), GN); + internal static readonly EncounterArea1[] SlotsYW = EncounterArea1.GetAreas(Get("yellow", "g1"), YW); + internal static readonly EncounterArea1[] SlotsBU = EncounterArea1.GetAreas(Get("blue_jp", "g1"), BU); internal static readonly EncounterArea1[] SlotsRBY = ArrayUtil.ConcatAll(SlotsRD, SlotsGN, SlotsYW); internal static readonly EncounterArea1[] SlotsRGBY = ArrayUtil.ConcatAll(SlotsRBY, SlotsBU); - private static EncounterArea1[] Get(string name, string ident, GameVersion game) => - EncounterArea1.GetAreas(BinLinker.Unpack(Util.GetBinaryResource($"encounter_{name}.pkl"), ident), game); - - static Encounters1() => EncounterUtil.MarkEncounterTradeNicknames(TradeGift_RBY, TradeGift_RBY_OTs); + static Encounters1() => MarkEncounterTradeNicknames(TradeGift_RBY, TradeGift_RBY_OTs); internal static readonly EncounterStatic1[] StaticRBY = { diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs index 4c309a57184..e9d2c2b48f1 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters2.cs @@ -10,14 +10,12 @@ namespace PKHeX.Core /// internal static class Encounters2 { - internal static readonly EncounterArea2[] SlotsGD = Get("gold", "g2", GD); - internal static readonly EncounterArea2[] SlotsSV = Get("silver", "g2", SV); - internal static readonly EncounterArea2[] SlotsC = Get("crystal", "g2", C); + internal static readonly EncounterArea2[] SlotsGD = EncounterArea2.GetAreas(Get("gold", "g2"), GD); + internal static readonly EncounterArea2[] SlotsSV = EncounterArea2.GetAreas(Get("silver", "g2"), SV); + internal static readonly EncounterArea2[] SlotsC = EncounterArea2.GetAreas(Get("crystal", "g2"), C); internal static readonly EncounterArea2[] SlotsGS = ArrayUtil.ConcatAll(SlotsGD, SlotsSV); internal static readonly EncounterArea2[] SlotsGSC = ArrayUtil.ConcatAll(SlotsGS, SlotsC); - private static EncounterArea2[] Get(string name, string ident, GameVersion game) => - EncounterArea2.GetAreas(BinLinker.Unpack(Util.GetBinaryResource($"encounter_{name}.pkl"), ident), game); static Encounters2() => MarkEncounterTradeStrings(TradeGift_GSC, TradeGift_GSC_OTs); diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs index bad365970f5..bf9176cd7ba 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters3.cs @@ -10,15 +10,14 @@ namespace PKHeX.Core internal static class Encounters3 { private static readonly EncounterArea3[] SlotsSwarmRSE = GetSwarm("rse_swarm", "rs", RSE); - internal static readonly EncounterArea3[] SlotsR = ArrayUtil.ConcatAll(Get("r", "ru", R), SlotsSwarmRSE); - internal static readonly EncounterArea3[] SlotsS = ArrayUtil.ConcatAll(Get("s", "sa", S), SlotsSwarmRSE); - internal static readonly EncounterArea3[] SlotsE = ArrayUtil.ConcatAll(Get("e", "em", E), SlotsSwarmRSE); - internal static readonly EncounterArea3[] SlotsFR = Get("fr", "fr", FR); - internal static readonly EncounterArea3[] SlotsLG = Get("lg", "lg", LG); - - private static byte[][] ReadUnpack(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); - private static EncounterArea3[] Get(string resource, string ident, GameVersion game) => EncounterArea3.GetAreas(ReadUnpack(resource, ident), game); - private static EncounterArea3[] GetSwarm(string resource, string ident, GameVersion game) => EncounterArea3.GetAreasSwarm(ReadUnpack(resource, ident), game); + internal static readonly EncounterArea3[] SlotsR = ArrayUtil.ConcatAll(GetRegular("r", "ru", R), SlotsSwarmRSE); + internal static readonly EncounterArea3[] SlotsS = ArrayUtil.ConcatAll(GetRegular("s", "sa", S), SlotsSwarmRSE); + internal static readonly EncounterArea3[] SlotsE = ArrayUtil.ConcatAll(GetRegular("e", "em", E), SlotsSwarmRSE); + internal static readonly EncounterArea3[] SlotsFR = GetRegular("fr", "fr", FR); + internal static readonly EncounterArea3[] SlotsLG = GetRegular("lg", "lg", LG); + + private static EncounterArea3[] GetRegular(string resource, string ident, GameVersion game) => EncounterArea3.GetAreas(Get(resource, ident), game); + private static EncounterArea3[] GetSwarm(string resource, string ident, GameVersion game) => EncounterArea3.GetAreasSwarm(Get(resource, ident), game); static Encounters3() { diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs index 238a850f530..50dc6d8a9b2 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs @@ -15,7 +15,6 @@ internal static class Encounters4 internal static readonly EncounterArea4[] SlotsPt = EncounterArea4.GetAreas(Get("pt", "pt"), Pt); internal static readonly EncounterArea4[] SlotsHG = EncounterArea4.GetAreas(Get("hg", "hg"), HG); internal static readonly EncounterArea4[] SlotsSS = EncounterArea4.GetAreas(Get("ss", "ss"), SS); - private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters4() { diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs index 8e356719154..b2eb1cf5461 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters5.cs @@ -13,7 +13,6 @@ public static class Encounters5 internal static readonly EncounterArea5[] SlotsW = EncounterArea5.GetAreas(Get("w", "51"), W); internal static readonly EncounterArea5[] SlotsB2 = EncounterArea5.GetAreas(Get("b2", "52"), B2); internal static readonly EncounterArea5[] SlotsW2 = EncounterArea5.GetAreas(Get("w2", "52"), W2); - private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters5() { diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs index 1683659afe5..a799a488d37 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters6.cs @@ -14,7 +14,6 @@ internal static class Encounters6 internal static readonly EncounterArea6XY[] SlotsY = EncounterArea6XY.GetAreas(Get("y", "xy"), Y, FriendSafari); internal static readonly EncounterArea6AO[] SlotsA = EncounterArea6AO.GetAreas(Get("as", "ao"), AS); internal static readonly EncounterArea6AO[] SlotsO = EncounterArea6AO.GetAreas(Get("or", "ao"), OR); - private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters6() { diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs index 7c616bdacbd..526698902cb 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters7.cs @@ -13,7 +13,6 @@ internal static class Encounters7 internal static readonly EncounterArea7[] SlotsMN = EncounterArea7.GetAreas(Get("mn", "sm"), MN); internal static readonly EncounterArea7[] SlotsUS = EncounterArea7.GetAreas(Get("us", "uu"), US); internal static readonly EncounterArea7[] SlotsUM = EncounterArea7.GetAreas(Get("um", "uu"), UM); - private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); static Encounters7() { diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs index 7297cd6c9b2..7d3d641bf91 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters7b.cs @@ -7,7 +7,6 @@ internal static class Encounters7b { internal static readonly EncounterArea7b[] SlotsGP = EncounterArea7b.GetAreas(Get("gp", "gg"), GP); internal static readonly EncounterArea7b[] SlotsGE = EncounterArea7b.GetAreas(Get("ge", "gg"), GE); - private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); private static readonly EncounterStatic7b[] Encounter_GG = { diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs index 03ddac92098..efbb715153f 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters8.cs @@ -17,7 +17,6 @@ internal static class Encounters8 private static readonly EncounterArea8[] SlotsSH_Symbol = EncounterArea8.GetAreas(Get("sh_symbol", "sh"), SH, true); private static readonly EncounterArea8[] SlotsSW_Hidden = EncounterArea8.GetAreas(Get("sw_hidden", "sw"), SW); private static readonly EncounterArea8[] SlotsSH_Hidden = EncounterArea8.GetAreas(Get("sh_hidden", "sh"), SH); - private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"encounter_{resource}.pkl"), ident); internal static readonly EncounterArea8[] SlotsSW = ArrayUtil.ConcatAll(SlotsSW_Symbol, SlotsSW_Hidden); internal static readonly EncounterArea8[] SlotsSH = ArrayUtil.ConcatAll(SlotsSH_Symbol, SlotsSH_Hidden); diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters8a.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters8a.cs new file mode 100644 index 00000000000..b026a268357 --- /dev/null +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters8a.cs @@ -0,0 +1,128 @@ +using static PKHeX.Core.EncounterUtil; +using static PKHeX.Core.Shiny; +using static PKHeX.Core.GameVersion; + +namespace PKHeX.Core; + +internal static class Encounters8a +{ + internal static readonly EncounterArea8a[] SlotsLA = EncounterArea8a.GetAreas(Get("la", "la"), PLA); + + private const byte M = 127; // Middle Height/Weight + private const byte A = 255; // Max Height/Weight for Alphas + private const byte U = 128; // Middle Height - Unown + + internal static readonly EncounterStatic8a[] StaticLA = + { + // Gifts + new(722,000,05,M,M) { Location = 006, Gift = true, Ball = (int)Ball.LAPoke }, // Rowlet + new(155,000,05,M,M) { Location = 006, Gift = true, Ball = (int)Ball.LAPoke }, // Cyndaquil + new(501,000,05,M,M) { Location = 006, Gift = true, Ball = (int)Ball.LAPoke }, // Oshawott + new(037,001,40,M,M) { Location = 088, Gift = true, Ball = (int)Ball.LAPoke }, // Vulpix-1 + new(483,000,65,M,M) { Location = 109, FlawlessIVCount = 3, Gift = true, Ball = (int)Ball.LAOrigin }, // Dialga + new(484,000,65,M,M) { Location = 109, FlawlessIVCount = 3, Gift = true, Ball = (int)Ball.LAOrigin }, // Palkia + new(493,000,75,M,M) { Location = 109, FlawlessIVCount = 3, Gift = true, Ball = (int)Ball.LAPoke, Fateful = true }, // Arceus + + // Static Encounters - Scripted Table Slots + new(480,000,70,M,M) { Location = 111, FlawlessIVCount = 3 }, // Uxie + new(481,000,70,M,M) { Location = 104, FlawlessIVCount = 3 }, // Mesprit + new(482,000,70,M,M) { Location = 105, FlawlessIVCount = 3 }, // Azelf + new(485,000,70,M,M) { Location = 068, FlawlessIVCount = 3 }, // Heatran + new(488,000,70,M,M) { Location = 082, FlawlessIVCount = 3 }, // Cresselia + + new(641,000,70,M,M) { Location = 090, FlawlessIVCount = 3 }, // Tornadus + new(642,000,70,M,M) { Location = 009, FlawlessIVCount = 3 }, // Thundurus + new(645,000,70,M,M) { Location = 027, FlawlessIVCount = 3 }, // Landorus + new(905,000,70,M,M) { Location = 038, FlawlessIVCount = 3 }, // Enamorus + + new(077,000,15 ) { Location = 014, Shiny = Always}, // Ponyta* + new(442,000,60,M,M) { Location = 043, FlawlessIVCount = 3 }, // Spiritomb + + new(489,000,33 ) { Location = 064, Fateful = true }, // Phione + new(489,000,34 ) { Location = 064, Fateful = true }, // Phione + new(489,000,35 ) { Location = 064, Fateful = true }, // Phione + new(489,000,36 ) { Location = 064, Fateful = true }, // Phione + new(490,000,50,M,M) { Location = 064, FlawlessIVCount = 3, Fateful = true }, // Manaphy + new(491,000,70,M,M) { Location = 010, FlawlessIVCount = 3, Fateful = true }, // Darkrai + new(492,000,70,M,M) { Location = 026, FlawlessIVCount = 3, Fateful = true }, // Shaymin + + // Unown Notes + new(201,000,25,U) { Location = 040 }, // Unown A + new(201,001,25,U) { Location = 056 }, // Unown B + new(201,002,25,U) { Location = 081 }, // Unown C + new(201,003,25,U) { Location = 008 }, // Unown D + new(201,004,25,U) { Location = 022 }, // Unown E + new(201,005,25,U) { Location = 010 }, // Unown F + new(201,006,25,U) { Location = 017 }, // Unown G + new(201,007,25,U) { Location = 006 }, // Unown H + new(201,008,25,U) { Location = 023 }, // Unown I + new(201,009,25,U) { Location = 072 }, // Unown J + new(201,010,25,U) { Location = 043 }, // Unown K + new(201,011,25,U) { Location = 086 }, // Unown L + new(201,012,25,U) { Location = 037 }, // Unown M + new(201,013,25,U) { Location = 009 }, // Unown N + new(201,014,25,U) { Location = 102 }, // Unown O + new(201,015,25,U) { Location = 075 }, // Unown P + new(201,016,25,U) { Location = 058 }, // Unown Q + new(201,017,25,U) { Location = 059 }, // Unown R + new(201,018,25,U) { Location = 025 }, // Unown S + new(201,019,25,U) { Location = 092 }, // Unown T + new(201,020,25,U) { Location = 011 }, // Unown U + new(201,021,25,U) { Location = 038 }, // Unown V + new(201,022,25,U) { Location = 006 }, // Unown W + new(201,023,25,U) { Location = 021 }, // Unown X + new(201,024,25,U) { Location = 097 }, // Unown Y + new(201,025,25,U) { Location = 051 }, // Unown Z + new(201,026,25,U) { Location = 142 }, // Unown ! at Snowfall Hot Spring + new(201,026,25,U) { Location = 099 }, // Unown ! along the Arena’s Approach (crossover) + new(201,027,25,U) { Location = 006 }, // Unown ? + + // Static Encounters + new(046,000,50,M,M) { Location = 019 }, // paras01: Paras + new(390,000,12,M,M) { Location = 007 }, // hikozaru_01: Chimchar + new(434,000,20,M,M) { Location = 008 }, // skunpuu01: Stunky + new(441,000,34,M,M) { Location = 129 }, // perap01: Chatot + new(450,000,34,M,M) { Location = 036, Gender = 0 }, // kabaldon01: Hippowdon + new(459,000,50,M,M) { Location = 101, Gender = 1 }, // yukikaburi01: Snover + + new(483,000,65,M,M) { Location = 109, FlawlessIVCount = 3 }, // dialga01: Dialga + new(484,000,65,M,M) { Location = 109, FlawlessIVCount = 3 }, // palkia01: Palkia + new(486,000,70,M,M) { Location = 095, FlawlessIVCount = 3 }, // regigigas01: Regigigas + new(487,001,70,M,M) { Location = 067, FlawlessIVCount = 3 }, // giratina02: Giratina-1 + + new(362,000,64,A,A) { Location = 011, IsAlpha = true, Moves = new[] {442,059,556,242}, Mastery = new[] {true,true,true, true } }, // onigohri01: Glalie + new(402,000,12,A,A) { Location = 007, IsAlpha = true, Gender = 0, Moves = new[] {206,071,033,332}, Mastery = new[] {true,true,false,false} }, // mev002: Kricketune + new(416,000,60,A,A) { Location = 022, IsAlpha = true, Gender = 1, FlawlessIVCount = 3, Moves = new[] {188,403,408,405}, Mastery = new[] {true,true,true ,true } }, // beequen01: Vespiquen + new(571,001,58,M,M) { Location = 111, IsAlpha = true, Moves = new[] {555,421,841,417}, Mastery = new[] {true,true,true ,true } }, // zoroark01: Zoroark-1 + new(706,001,58,M,M) { Location = 104, IsAlpha = true, Moves = new[] {231,406,842,056}, Mastery = new[] {true,true,true ,true } }, // numelgon01: Goodra-1 + new(904,000,58,M,M) { Location = 105, IsAlpha = true, Moves = new[] {301,398,401,038}, Mastery = new[] {true,true,true ,false} }, // harysen01: Overqwil + + // Uncatchable + // new(901,000,26,M,M) { Location = -01, Gender = 0, Nature = Adamant, FlawlessIVCount = 3, GVs = new[]{2,3,0,2,2,0} }, // ringuma01: Ursaluna + // new(190,000,30,M,M) { Location = -01, Gender = 0 }, // aipom01: Aipom + // new(190,000,30,M,M) { Location = -01, Gender = 1 }, // aipom01: Aipom + // new(185,000,26,S,S) { Location = -01, Gender = 0 }, // usokkie01: Sudowoodo + // new(460,000,55,M,M) { Location = -01, Gender = 0 }, // yukinooh01: Abomasnow + // new(478,000,55,M,M) { Location = -01, Gender = 1 }, // yukimenoko01: Froslass + // new(448,000,62,M,M) { Location = -01, Gender = 0, FlawlessIVCount = 3 }, // lucario01: Lucario + // new(628,001,54,M,M) { Location = -01, Gender = 0, Nature = Adamant }, // warrgle01: Braviary-1 + // new(217,000,30,M,M) { Location = -01, Gender = 0, Nature = Modest }, // ringuma02: Ursaring + // new(483,001,65,M,M) { Location = -01, FlawlessIVCount = 3 }, // nsi_ex_07: Dialga-1 + // new(484,001,65,M,M) { Location = -01, FlawlessIVCount = 3 }, // nsi_ex_08: Palkia-1 + // new(900,001,18,M,M) { Location = -01, Gender = 0, Nature = Adamant }, // ns001: Kleavor-1 + // new(900,001,18,M,M) { Location = -01, Gender = 0, Nature = Adamant, FlawlessIVCount = 3 }, // nsi_ex_01: Kleavor-1 + // new(549,002,30,M,M) { Location = -01, Gender = 1, Nature = Adamant, FlawlessIVCount = 3, Moves = new[] {078,077,412,249}, Mastery = new[] {true,true,true,true } }, // dredear01: Lilligant-2 + // new(059,002,36,M,M) { Location = -01, Gender = 0, Nature = Adamant, FlawlessIVCount = 3 }, // nsi_ex_06: Arcanine-2 + // new(101,002,46,M,M) { Location = -01, Gender = 0, Nature = Modest, FlawlessIVCount = 3, Moves = new[] {086,412,085,087}, Mastery = new[] {true,true,true,false} }, // nsi_ex_04: Electrode-2 + // new(713,002,56,M,M) { Location = -01, Gender = 0, Nature = Relaxed, FlawlessIVCount = 3 }, // nsi_ex_03: Avalugg-2 + // new(493,000,75,M,M) { Location = -01, FlawlessIVCount = 3, Moves = new[] {347,326,449,063}, Mastery = new[] {true,true,true,true } }, // nsi_ex_09: Arceus + // new(483,001,85,M,M) { Location = -01, GVs = new[]{10,10,10,10,10,10} }, // nsi_ex_07_r: Dialga-1 + // new(484,001,85,M,M) { Location = -01, GVs = new[]{10,10,10,10,10,10} }, // nsi_ex_08_r: Palkia-1 + // new(900,001,70,M,M) { Location = -01, Gender = 0, Nature = Adamant, GVs = new[]{10,10,10,10,10,10}, Moves = new[] {830,403,404,370}, Mastery = new[] {true,true,true,true} }, // nsi_ex_01_r: Kleavor-1 + // new(549,002,70,M,M) { Location = -01, Gender = 1, Nature = Adamant, GVs = new[]{10,10,10,10,10,10}, Moves = new[] {837,080,409,416}, Mastery = new[] {true,true,true,true} }, // dredear01_r: Lilligant-2 + // new(059,002,70,M,M) { Location = -01, Gender = 0, Nature = Adamant, GVs = new[]{10,10,10,10,10,10}, Moves = new[] {833,444,242,528}, Mastery = new[] {true,true,true,true} }, // nsi_ex_06_r: Arcanine-2 + // new(101,002,70,M,M) { Location = -01, Gender = 0, Nature = Modest, GVs = new[]{10,10,10,10,10,10}, Moves = new[] {835,087,063,086}, Mastery = new[] {true,true,true,true} }, // nsi_ex_04_r: Electrode-2 + // new(713,002,70,M,M) { Location = -01, Gender = 0, Nature = Relaxed, GVs = new[]{10,10,10,10,10,10}, Moves = new[] {836,667,444,442}, Mastery = new[] {true,true,true,true} }, // nsi_ex_03_r: Avalugg-2 + // new(493,000,100,M,M){ Location = -01, GVs = new[]{10,10,10,10,10,10}, Moves = new[] {347,326,449,063}, Mastery = new[] {true,true,true,true} }, // nsi_ex_09_r: Arceus + }; +} diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters8b.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters8b.cs index 709c2526673..565dc9850f7 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters8b.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters8b.cs @@ -7,16 +7,14 @@ namespace PKHeX.Core { internal static class Encounters8b { - private static readonly EncounterArea8b[] SlotsBD_OW = EncounterArea8b.GetAreas(Get("encounter_bd", "bs"), BD); - private static readonly EncounterArea8b[] SlotsSP_OW = EncounterArea8b.GetAreas(Get("encounter_sp", "bs"), SP); - private static readonly EncounterArea8b[] SlotsBD_UG = EncounterArea8b.GetAreas(Get("underground_bd", "bs"), BD); - private static readonly EncounterArea8b[] SlotsSP_UG = EncounterArea8b.GetAreas(Get("underground_sp", "bs"), SP); + private static readonly EncounterArea8b[] SlotsBD_OW = EncounterArea8b.GetAreas(Get("bd", "bs"), BD); + private static readonly EncounterArea8b[] SlotsSP_OW = EncounterArea8b.GetAreas(Get("sp", "bs"), SP); + private static readonly EncounterArea8b[] SlotsBD_UG = EncounterArea8b.GetAreas(Get("bd_underground", "bs"), BD); + private static readonly EncounterArea8b[] SlotsSP_UG = EncounterArea8b.GetAreas(Get("sp_underground", "bs"), SP); internal static readonly EncounterArea8b[] SlotsBD = ArrayUtil.ConcatAll(SlotsBD_OW, SlotsBD_UG); internal static readonly EncounterArea8b[] SlotsSP = ArrayUtil.ConcatAll(SlotsSP_OW, SlotsSP_UG); - private static byte[][] Get(string resource, string ident) => BinLinker.Unpack(Util.GetBinaryResource($"{resource}.pkl"), ident); - static Encounters8b() => MarkEncounterTradeStrings(TradeGift_BDSP, TradeBDSP); private static readonly EncounterStatic8b[] Encounter_BDSP = diff --git a/PKHeX.Core/Legality/Encounters/Data/EncountersGO.cs b/PKHeX.Core/Legality/Encounters/Data/EncountersGO.cs index 71c79befc94..daca237415f 100644 --- a/PKHeX.Core/Legality/Encounters/Data/EncountersGO.cs +++ b/PKHeX.Core/Legality/Encounters/Data/EncountersGO.cs @@ -8,15 +8,8 @@ internal static class EncountersGO { internal const int MAX_LEVEL = 50; - internal static readonly EncounterArea7g[] SlotsGO_GG = EncounterArea7g.GetArea(Get("go_lgpe", "go")); - internal static readonly EncounterArea8g[] SlotsGO = EncounterArea8g.GetArea(Get("go_home", "go")); - - private static byte[][] Get(string resource, string ident) - { - var name = $"encounter_{resource}.pkl"; - var data = Util.GetBinaryResource(name); - return BinLinker.Unpack(data, ident); - } + internal static readonly EncounterArea7g[] SlotsGO_GG = EncounterArea7g.GetArea(EncounterUtil.Get("go_lgpe", "go")); + internal static readonly EncounterArea8g[] SlotsGO = EncounterArea8g.GetArea(EncounterUtil.Get("go_home", "go")); } #else public static class EncountersGO @@ -32,11 +25,11 @@ public static void Reload() SlotsGO = EncounterArea8g.GetArea(Get("go_home", "go")); } - private static byte[][] Get(string resource, string ident) + private static BinLinkerAccessor Get(string resource, string ident) { var name = $"encounter_{resource}.pkl"; var data = System.IO.File.Exists(name) ? System.IO.File.ReadAllBytes(name) : Util.GetBinaryResource(name); - return BinLinker.Unpack(data, ident); + return BinLinkerAccessor.Get(data, ident); } } #endif diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot.cs index 51a0981cab0..4b1174f2d96 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot.cs @@ -91,8 +91,7 @@ protected virtual void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria pk.Version = (int)version; pk.Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation); - var ball = FixedBall; - pk.Ball = (int)(ball == Ball.None ? Ball.Poke : ball); + ApplyDetailsBall(pk); pk.Language = lang; pk.Form = GetWildForm(pk, Form, sav); pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; @@ -114,6 +113,12 @@ protected virtual void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria } } + protected virtual void ApplyDetailsBall(PKM pk) + { + var ball = FixedBall; + pk.Ball = (int)(ball == Ball.None ? Ball.Poke : ball); + } + protected virtual void SetEncounterMoves(PKM pk, GameVersion version, int level) { var moves = MoveLevelUp.GetEncounterMoves(pk, level, version); diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs index c167ca0a26b..ac7777a0583 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot7b.cs @@ -17,5 +17,15 @@ protected override void SetPINGA(PKM pk, EncounterCriteria criteria) base.SetPINGA(pk, criteria); pk.SetRandomEC(); } + + protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) + { + base.ApplyDetails(sav, criteria, pk); + if (pk is IScaledSizeValue v) + { + v.ResetHeight(); + v.ResetWeight(); + } + } } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8a.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8a.cs new file mode 100644 index 00000000000..16f1dda1357 --- /dev/null +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8a.cs @@ -0,0 +1,101 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Encounter Slot found in . +/// +/// +public sealed record EncounterSlot8a : EncounterSlot, IAlpha +{ + public override int Generation => 8; + + public bool IsAlpha { get => AlphaType is not 0; set => throw new InvalidOperationException("Do not mutate this field."); } + public byte FlawlessIVCount { get; } + public Gender Gender { get; } + public byte AlphaType { get; } // 0=Never, 1=Random, 2=Guaranteed + + public EncounterSlot8a(EncounterArea8a area, int species, int form, int min, int max, byte alphaType, byte flawlessIVs, Gender gender) : base(area, species, form, min, max) + { + AlphaType = alphaType; + FlawlessIVCount = flawlessIVs; + Gender = gender; + } + + protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) + { + base.ApplyDetails(sav, criteria, pk); + pk.SetRandomEC(); + if (Gender != Gender.Random) + pk.Gender = (int)Gender; + + if (IsAlpha) + { + if (pk is IAlpha a) + a.IsAlpha = true; + if (pk is IScaledSize s) + s.HeightScalar = s.WeightScalar = byte.MaxValue; + if (pk is PA8 pa) + pa.SetMasteryFlagMove(pa.AlphaMove = pa.GetRandomAlphaMove()); + } + if (pk is IScaledSizeValue v) + { + v.ResetHeight(); + v.ResetWeight(); + } + if (pk is PA8 pa8) + { + pa8.HeightScalarCopy = pa8.HeightScalar; + pa8.SetMasteryFlags(); + } + if (FlawlessIVCount > 0) + pk.SetRandomIVs(flawless: FlawlessIVCount); + } + + protected override void ApplyDetailsBall(PKM pk) => pk.Ball = (int)Ball.LAPoke; + + public override EncounterMatchRating GetMatchRating(PKM pkm) + { + if (pkm is IAlpha a && a.IsAlpha != IsAlpha) + return EncounterMatchRating.DeferredErrors; + if (Gender is not Gender.Random && pkm.Gender != (int)Gender) + return EncounterMatchRating.DeferredErrors; + if (FlawlessIVCount is not 0 && pkm.FlawlessIVCount != FlawlessIVCount) + return EncounterMatchRating.DeferredErrors; + + var result = GetAlphaMoveCompatibility(pkm); + var orig = base.GetMatchRating(pkm); + return result > orig ? result : orig; + } + + private EncounterMatchRating GetAlphaMoveCompatibility(PKM pkm) + { + // Check for Alpha move compatibility. + if (pkm is not PA8 pa) + return EncounterMatchRating.Match; + + var alphaMove = pa.AlphaMove; + if (!pa.IsAlpha) + return alphaMove == 0 ? EncounterMatchRating.Match : EncounterMatchRating.DeferredErrors; + + var pi = PersonalTable.LA.GetFormEntry(Species, Form); + var tutors = pi.SpecialTutors[0]; + + if (alphaMove is 0) + { + bool hasAnyTutor = Array.IndexOf(tutors, true) >= 0; + if (hasAnyTutor) + return EncounterMatchRating.Deferred; + } + else + { + var idx = pa.MoveShopPermitIndexes; + var index = idx.IndexOf(idx); + if (index == -1) + return EncounterMatchRating.Deferred; + if (!tutors[index]) + return EncounterMatchRating.Deferred; + } + return EncounterMatchRating.Match; + } +} diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic.cs index f8c6b8ab0e9..66d1f862b54 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic.cs @@ -77,7 +77,7 @@ protected virtual void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria pk.Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation); pk.CurrentLevel = level; - pk.Ball = Ball; + ApplyDetailsBall(pk); pk.HeldItem = HeldItem; pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; @@ -111,6 +111,8 @@ protected virtual void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria pd.DynamaxLevel = d.DynamaxLevel; } + protected virtual void ApplyDetailsBall(PKM pk) => pk.Ball = Ball; + protected virtual int GetMinimalLevel() => LevelMin; protected virtual void SetPINGA(PKM pk, EncounterCriteria criteria) diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic7b.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic7b.cs index a13a4307b4b..e75f93ca524 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic7b.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic7b.cs @@ -11,6 +11,11 @@ public sealed record EncounterStatic7b(GameVersion Version) : EncounterStatic(Ve protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) { base.ApplyDetails(sav, criteria, pk); + if (pk is IScaledSizeValue v) + { + v.ResetHeight(); + v.ResetWeight(); + } pk.SetRandomEC(); } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8a.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8a.cs new file mode 100644 index 00000000000..a2863635e1f --- /dev/null +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8a.cs @@ -0,0 +1,131 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Generation 8 Static Encounter +/// +/// +public sealed record EncounterStatic8a(GameVersion Version) : EncounterStatic(Version), IAlpha +{ + public bool[]? Mastery; + public override int Generation => 8; + + public byte HeightScalar { get; } + public byte WeightScalar { get; } + public bool IsAlpha { get; set; } + + public bool HasFixedHeight => HeightScalar != NoScalar; + public bool HasFixedWeight => WeightScalar != NoScalar; + private const byte NoScalar = 0; + + public EncounterStatic8a(ushort species, ushort form, byte level, byte h = NoScalar, byte w = NoScalar) : this(GameVersion.PLA) + { + Species = species; + Form = form; + Level = level; + HeightScalar = h; + WeightScalar = w; + Shiny = Shiny.Never; + } + + protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) + { + base.ApplyDetails(sav, criteria, pk); + if (pk is IScaledSize s) + { + if (HasFixedHeight) + s.HeightScalar = HeightScalar; + if (HasFixedWeight) + s.WeightScalar = WeightScalar; + } + if (pk is IScaledSizeValue v) + { + v.ResetHeight(); + v.ResetWeight(); + } + + if (IsAlpha && pk is IAlpha a) + a.IsAlpha = true; + + if (pk is PA8 pa) + { + pa.SetMasteryFlags(); + pa.HeightScalarCopy = pa.HeightScalar; + if (IsAlpha) + pa.SetMasteryFlagMove(pa.AlphaMove = pa.GetRandomAlphaMove()); + } + + pk.SetRandomEC(); + } + + protected override void ApplyDetailsBall(PKM pk) => pk.Ball = Gift ? Ball : (int)Core.Ball.LAPoke; + + public override bool IsMatchExact(PKM pkm, DexLevel evo) + { + if (!base.IsMatchExact(pkm, evo)) + return false; + + if (pkm is IScaledSize s) + { + if (HasFixedHeight && s.HeightScalar != HeightScalar) + return false; + if (HasFixedWeight && s.WeightScalar != WeightScalar) + return false; + } + + if (pkm is IAlpha a && a.IsAlpha != IsAlpha) + return false; + + return true; + } + + public override EncounterMatchRating GetMatchRating(PKM pkm) + { + if (Shiny != Shiny.Random && !Shiny.IsValid(pkm)) + return EncounterMatchRating.DeferredErrors; + if (Gift && pkm.Ball != Ball) + return EncounterMatchRating.DeferredErrors; + + if (!IsForcedMasteryCorrect(pkm)) + return EncounterMatchRating.PartialMatch; + + var orig = base.GetMatchRating(pkm); + if (orig is not EncounterMatchRating.Match) + return orig; + + if (IsAlpha && pkm is PA8 { AlphaMove: 0 }) + return EncounterMatchRating.Deferred; + + return EncounterMatchRating.Match; + } + + private bool IsForcedMasteryCorrect(PKM pkm) + { + if (Mastery is not { } m) + return true; + + if (Species == (int)Core.Species.Kricketune && Level == 12) + { + if (pkm is PA8 { AlphaMove: not (int)Move.FalseSwipe }) + return false; + } + + if (pkm is not IMoveShop8Mastery p) + return true; + + for (int i = 0; i < m.Length; i++) + { + if (!m[i]) + continue; + var move = Moves[i]; + var index = p.MoveShopPermitIndexes.IndexOf(move); + if (index == -1) + continue; // manually mastered for encounter, not a tutor + if (!p.GetMasteredRecordFlag(index)) + return false; + } + + return true; + } +} diff --git a/PKHeX.Core/Legality/Encounters/EncounterTrade/EncounterTrade7b.cs b/PKHeX.Core/Legality/Encounters/EncounterTrade/EncounterTrade7b.cs index e125a9a6770..1b604852e77 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterTrade/EncounterTrade7b.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterTrade/EncounterTrade7b.cs @@ -14,5 +14,15 @@ public EncounterTrade7b(GameVersion game) : base(game) Shiny = Shiny.Random; IsNicknamed = false; } + + protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk) + { + base.ApplyDetails(sav, criteria, pk); + if (pk is IScaledSizeValue v) + { + v.ResetHeight(); + v.ResetWeight(); + } + } } } diff --git a/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs b/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs index 41728f8e826..c477aea26e3 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs @@ -17,6 +17,7 @@ public static IEnumerable GetEncounters(PKM pkm) return pkm.Version switch { (int)GameVersion.GO => EncounterGenerator7.GetEncountersGO(pkm, chain), + (int)GameVersion.PLA => EncounterGenerator8a.GetEncounters(pkm, chain), (int)GameVersion.BD or (int)GameVersion.SP => EncounterGenerator8b.GetEncounters(pkm, chain), _ => GetEncountersMainline(pkm, chain), }; diff --git a/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8a.cs b/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8a.cs new file mode 100644 index 00000000000..b9ea8de1a83 --- /dev/null +++ b/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8a.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; + +using static PKHeX.Core.MysteryGiftGenerator; +using static PKHeX.Core.EncounterSlotGenerator; +using static PKHeX.Core.EncounterStaticGenerator; +using static PKHeX.Core.EncounterMatchRating; + +namespace PKHeX.Core; + +internal static class EncounterGenerator8a +{ + public static IEnumerable GetEncounters(PKM pkm, IReadOnlyList chain) + { + if (pkm.IsEgg) + yield break; + + int ctr = 0; + if (pkm.FatefulEncounter) + { + foreach (var z in GetValidGifts(pkm, chain)) + { yield return z; ++ctr; } + if (ctr != 0) yield break; + } + + IEncounterable? cache = null; + EncounterMatchRating rating = None; + + // Static Encounters can collide with wild encounters (close match); don't break if a Static Encounter is yielded. + var encs = GetValidStaticEncounter(pkm, chain); + foreach (var z in encs) + { + var match = z.GetMatchRating(pkm); + if (match == Match) + { + yield return z; + } + else if (match < rating) + { + cache = z; + rating = match; + } + } + + foreach (var z in GetValidWildEncounters(pkm, chain)) + { + var match = z.GetMatchRating(pkm); + if (match == Match) + { + yield return z; + } + else if (match < rating) + { + cache = z; + rating = match; + } + } + + if (cache != null) + yield return cache; + } +} diff --git a/PKHeX.Core/Legality/Encounters/Generator/Moveset/EncounterMovesetGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/Moveset/EncounterMovesetGenerator.cs index e630f5e46a1..faad87741b1 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/Moveset/EncounterMovesetGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/Moveset/EncounterMovesetGenerator.cs @@ -202,7 +202,7 @@ private static IEnumerable GetMovesForGeneration(PKM pk, IReadOnlyList GetEncounterAreas(PKM pkm, GameVersion SH => SlotsSH, BD => SlotsBD, SP => SlotsSP, + PLA => SlotsLA, _ => Array.Empty(), }; diff --git a/PKHeX.Core/Legality/Encounters/Generator/Specific/EncounterStaticGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/Specific/EncounterStaticGenerator.cs index 63c1f6d715a..a43d1912fe4 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/Specific/EncounterStaticGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/Specific/EncounterStaticGenerator.cs @@ -13,6 +13,7 @@ using static PKHeX.Core.Encounters7; using static PKHeX.Core.Encounters7b; using static PKHeX.Core.Encounters8; +using static PKHeX.Core.Encounters8a; using static PKHeX.Core.Encounters8b; using static PKHeX.Core.GameVersion; @@ -175,6 +176,7 @@ internal static EncounterStatic7 GetVCStaticTransferEncounter(PKM pkm, IEncounte SH => StaticSH, BD => StaticBD, SP => StaticSP, + PLA => StaticLA, _ => Array.Empty(), }; diff --git a/PKHeX.Core/Legality/Encounters/Generator/Specific/MysteryGiftGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/Specific/MysteryGiftGenerator.cs index a69e5983f24..d4f9f5666f9 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/Specific/MysteryGiftGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/Specific/MysteryGiftGenerator.cs @@ -39,7 +39,7 @@ public static IEnumerable GetValidGifts(PKM pkm, IReadOnlyList MGDB_G5, 6 => MGDB_G6, 7 => pkm.LGPE ? MGDB_G7GG : MGDB_G7, - 8 => pkm.BDSP ? MGDB_G8B : MGDB_G8, + 8 => pkm.BDSP ? MGDB_G8B : pkm.LA ? MGDB_G8A : MGDB_G8, _ => Array.Empty(), }; diff --git a/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs b/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs index 250eadbea99..4caaa7db87c 100644 --- a/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs +++ b/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs @@ -140,7 +140,8 @@ private static CheckMoveResult[] ParseMovesGenGB(PKM pkm, IReadOnlyList cur { var res = new CheckMoveResult[4]; var enc = info.EncounterMatch; - var level = info.EvoChainsAllGens[enc.Generation][^1].MinLevel; + var evos = info.EvoChainsAllGens[enc.Generation]; + var level = evos.Count > 0 ? evos[^1].MinLevel : enc.LevelMin; var InitialMoves = Array.Empty(); var SpecialMoves = GetSpecialMoves(enc); var games = enc.Generation == 1 ? GBRestrictions.GetGen1Versions(enc) : GBRestrictions.GetGen2Versions(enc, pkm.Korean); diff --git a/PKHeX.Core/Legality/Enums/SlotType.cs b/PKHeX.Core/Legality/Enums/SlotType.cs index 7df14e955b7..3bc79d5ed12 100644 --- a/PKHeX.Core/Legality/Enums/SlotType.cs +++ b/PKHeX.Core/Legality/Enums/SlotType.cs @@ -85,6 +85,10 @@ public enum SlotType : byte /// SOS = 15, + Overworld = 16, + Distortion = 17, + Landmark = 18, + // Modifiers /// diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionMethod.cs b/PKHeX.Core/Legality/Evolutions/EvolutionMethod.cs index abc72eb059f..28afa9a3e16 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionMethod.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionMethod.cs @@ -74,13 +74,14 @@ public bool Valid(PKM pkm, int lvl, bool skipChecks) RequiresLevelUp = false; switch ((EvolutionType)Method) { - case UseItem or UseItemWormhole: + case UseItem or UseItemWormhole or UseItemFullMoon: case CriticalHitsInBattle or HitPointsLostInBattle or Spin: + case UseAgileStyleMoves or UseStrongStyleMoves: case TowerOfDarkness or TowerOfWaters: return true; - case UseItemMale: + case UseItemMale or RecoilDamageMale: return pkm.Gender == 0; - case UseItemFemale: + case UseItemFemale or RecoilDamageFemale: return pkm.Gender == 1; case Trade or TradeHeldItem or TradeShelmetKarrablast: @@ -104,6 +105,9 @@ public bool Valid(PKM pkm, int lvl, bool skipChecks) // Level Up (any); the above Level Up (with condition) cases will reach here if they were valid default: + if (IsThresholdCheckMode(pkm)) + return lvl >= Level; + if (Level == 0 && lvl < 2) return false; if (lvl < Level) @@ -118,6 +122,13 @@ public bool Valid(PKM pkm, int lvl, bool skipChecks) } } + private static bool IsThresholdCheckMode(PKM pkm) + { + // Starting in Legends: Arceus, level-up evolutions can be triggered if the current level is >= criteria. + // This allows for evolving over-leveled captures immediately without leveling up from capture level. + return pkm is PA8; + } + private bool HasMetLevelIncreased(PKM pkm, int lvl) { int origin = pkm.Generation; diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet6.cs b/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet6.cs index 2a3812e1609..3e47818fa4e 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet6.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet6.cs @@ -35,9 +35,9 @@ private static EvolutionMethod GetMethod(ReadOnlySpan entry) return new EvolutionMethod(method, species, argument: arg, level: lvl); } - public static IReadOnlyList GetArray(IReadOnlyList data) + public static IReadOnlyList GetArray(BinLinkerAccessor data) { - var evos = new EvolutionMethod[data.Count][]; + var evos = new EvolutionMethod[data.Length][]; for (int i = 0; i < evos.Length; i++) evos[i] = GetMethods(data[i]); return evos; diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet7.cs b/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet7.cs index 5201955294c..b3aa03da154 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet7.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionSets/EvolutionSet7.cs @@ -32,9 +32,9 @@ private static EvolutionMethod ReadEvolution(ReadOnlySpan entry) return new EvolutionMethod(method, species, argument: arg, level: level, form: form); } - public static IReadOnlyList GetArray(IReadOnlyList data) + public static IReadOnlyList GetArray(BinLinkerAccessor data) { - var evos = new EvolutionMethod[data.Count][]; + var evos = new EvolutionMethod[data.Length][]; for (int i = 0; i < evos.Length; i++) evos[i] = GetMethods(data[i]); return evos; diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionTree.cs b/PKHeX.Core/Legality/Evolutions/EvolutionTree.cs index 28b466b3877..159ff829272 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionTree.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionTree.cs @@ -14,25 +14,27 @@ namespace PKHeX.Core /// public sealed class EvolutionTree { - private static readonly EvolutionTree Evolves1 = new(new[] { Get("rby") }, Gen1, PersonalTable.Y, MaxSpeciesID_1); - private static readonly EvolutionTree Evolves2 = new(new[] { Get("gsc") }, Gen2, PersonalTable.C, MaxSpeciesID_2); - private static readonly EvolutionTree Evolves3 = new(new[] { Get("g3") }, Gen3, PersonalTable.RS, MaxSpeciesID_3); - private static readonly EvolutionTree Evolves4 = new(new[] { Get("g4") }, Gen4, PersonalTable.DP, MaxSpeciesID_4); - private static readonly EvolutionTree Evolves5 = new(new[] { Get("g5") }, Gen5, PersonalTable.BW, MaxSpeciesID_5); - private static readonly EvolutionTree Evolves6 = new(Unpack("ao"), Gen6, PersonalTable.AO, MaxSpeciesID_6); - private static readonly EvolutionTree Evolves7 = new(Unpack("uu"), Gen7, PersonalTable.USUM, MaxSpeciesID_7_USUM); - private static readonly EvolutionTree Evolves7b = new(Unpack("gg"), Gen7, PersonalTable.GG, MaxSpeciesID_7b); - private static readonly EvolutionTree Evolves8 = new(Unpack("ss"), Gen8, PersonalTable.SWSH, MaxSpeciesID_8); - private static readonly EvolutionTree Evolves8b = new(Unpack("bs"), Gen8, PersonalTable.BDSP, MaxSpeciesID_8b); - - private static byte[] Get(string resource) => Util.GetBinaryResource($"evos_{resource}.pkl"); - private static byte[][] Unpack(string resource) => BinLinker.Unpack(Get(resource), resource); + private static readonly EvolutionTree Evolves1 = new(GetResource("rby"), Gen1, PersonalTable.Y, MaxSpeciesID_1); + private static readonly EvolutionTree Evolves2 = new(GetResource("gsc"), Gen2, PersonalTable.C, MaxSpeciesID_2); + private static readonly EvolutionTree Evolves3 = new(GetResource("g3"), Gen3, PersonalTable.RS, MaxSpeciesID_3); + private static readonly EvolutionTree Evolves4 = new(GetResource("g4"), Gen4, PersonalTable.DP, MaxSpeciesID_4); + private static readonly EvolutionTree Evolves5 = new(GetResource("g5"), Gen5, PersonalTable.BW, MaxSpeciesID_5); + private static readonly EvolutionTree Evolves6 = new(GetReader("ao"), Gen6, PersonalTable.AO, MaxSpeciesID_6); + private static readonly EvolutionTree Evolves7 = new(GetReader("uu"), Gen7, PersonalTable.USUM, MaxSpeciesID_7_USUM); + private static readonly EvolutionTree Evolves7b = new(GetReader("gg"), Gen7, PersonalTable.GG, MaxSpeciesID_7b); + private static readonly EvolutionTree Evolves8 = new(GetReader("ss"), Gen8, PersonalTable.SWSH, MaxSpeciesID_8); + private static readonly EvolutionTree Evolves8a = new(GetReader("la"), Gen8, PersonalTable.LA, MaxSpeciesID_8a); + private static readonly EvolutionTree Evolves8b = new(GetReader("bs"), Gen8, PersonalTable.BDSP, MaxSpeciesID_8b); + + private static ReadOnlySpan GetResource(string resource) => Util.GetBinaryResource($"evos_{resource}.pkl"); + private static BinLinkerAccessor GetReader(string resource) => BinLinkerAccessor.Get(GetResource(resource), resource); static EvolutionTree() { // Add in banned evolution data! Evolves7.FixEvoTreeSM(); Evolves8.FixEvoTreeSS(); + Evolves8a.FixEvoTreeLA(); Evolves8b.FixEvoTreeBS(); } @@ -57,7 +59,12 @@ static EvolutionTree() 5 => Evolves5, 6 => Evolves6, 7 => pkm.Version is (int)GO or (int)GP or (int)GE ? Evolves7b : Evolves7, - _ => pkm.Version is (int)BD or (int)SP ? Evolves8b : Evolves8, + _ => pkm.Version switch + { + (int)PLA => Evolves8a, + (int)BD or (int)SP => Evolves8b, + _ => Evolves8, + }, }; private readonly IReadOnlyList Entries; @@ -69,7 +76,22 @@ static EvolutionTree() #region Constructor - private EvolutionTree(IReadOnlyList data, GameVersion game, PersonalTable personal, int maxSpeciesTree) + private EvolutionTree(ReadOnlySpan data, GameVersion game, PersonalTable personal, int maxSpeciesTree) + { + Game = game; + Personal = personal; + MaxSpeciesTree = maxSpeciesTree; + Entries = GetEntries(data, game); + + // Starting in Generation 7, forms have separate evolution data. + int format = Game - Gen1 + 1; + var oldStyle = format < 7; + var connections = oldStyle ? CreateTreeOld() : CreateTree(); + + Lineage = connections.ToLookup(obj => obj.Key, obj => obj.Value); + } + + private EvolutionTree(BinLinkerAccessor data, GameVersion game, PersonalTable personal, int maxSpeciesTree) { Game = game; Personal = personal; @@ -134,13 +156,18 @@ private IEnumerable> CreateTree() } } - private IReadOnlyList GetEntries(IReadOnlyList data, GameVersion game) => game switch + private IReadOnlyList GetEntries(ReadOnlySpan data, GameVersion game) => game switch + { + Gen1 => EvolutionSet1.GetArray(data, MaxSpeciesTree), + Gen2 => EvolutionSet1.GetArray(data, MaxSpeciesTree), + Gen3 => EvolutionSet3.GetArray(data), + Gen4 => EvolutionSet4.GetArray(data), + Gen5 => EvolutionSet5.GetArray(data), + _ => throw new ArgumentOutOfRangeException(), + }; + + private IReadOnlyList GetEntries(BinLinkerAccessor data, GameVersion game) => game switch { - Gen1 => EvolutionSet1.GetArray(data[0], MaxSpeciesTree), - Gen2 => EvolutionSet1.GetArray(data[0], MaxSpeciesTree), - Gen3 => EvolutionSet3.GetArray(data[0]), - Gen4 => EvolutionSet4.GetArray(data[0]), - Gen5 => EvolutionSet5.GetArray(data[0]), Gen6 => EvolutionSet6.GetArray(data), Gen7 => EvolutionSet7.GetArray(data), Gen8 => EvolutionSet7.GetArray(data), @@ -174,6 +201,10 @@ private void FixEvoTreeSS() BanEvo(s, 0, pkm => pkm is IGigantamax {CanGigantamax: true}); } + private void FixEvoTreeLA() + { + } + private void FixEvoTreeBS() { BanEvo((int)Species.Glaceon, 0, pkm => pkm.CurrentLevel == pkm.Met_Level); // Ice Stone is unreleased, requires Route 217 Ice Rock Level Up instead diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionType.cs b/PKHeX.Core/Legality/Evolutions/EvolutionType.cs index 505e1aff924..ff9d20b5e65 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionType.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionType.cs @@ -54,6 +54,11 @@ public enum EvolutionType : byte LevelUpNatureLowKey = 47, // Toxtricity TowerOfDarkness = 48, // Urshifu TowerOfWaters = 49, // Urshifu + UseItemFullMoon = 50, // Ursaluna + UseAgileStyleMoves = 51, // Wyrdeer + UseStrongStyleMoves = 52, // Overqwil + RecoilDamageMale = 53, // Basculegion-0 + RecoilDamageFemale = 54, // Basculegion-1 } public static class EvolutionTypeExtensions diff --git a/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs b/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs index fa1e68ade24..59d18f65682 100644 --- a/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs +++ b/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs @@ -269,6 +269,7 @@ public static class LegalityCheckStrings public static string LHyperBelow100 { get; set; } = "Can't Hyper Train a Pokémon that isn't level 100."; public static string LHyperPerfectAll { get; set; } = "Can't Hyper Train a Pokémon with perfect IVs."; public static string LHyperPerfectOne { get; set; } = "Can't Hyper Train a perfect IV."; + public static string LHyperPerfectUnavailable { get; set; } = "Can't Hyper Train any IV(s)."; public static string LItemEgg { get; set; } = "Eggs cannot hold items."; public static string LItemUnreleased { get; set; } = "Held item is unreleased."; @@ -353,6 +354,7 @@ public static class LegalityCheckStrings public static string LMoveNincadaEvo { get; set; } = "Learned by evolving Nincada into Ninjask."; public static string LMoveNincadaEvoF_0 { get; set; } = "Learned by evolving Nincada into Ninjask in Generation {0}."; public static string LMovePPTooHigh_0 { get; set; } = "Move {0} PP is above the amount allowed."; + public static string LMovePPUpsTooHigh_0 { get; set; } = "Move {0} PP Ups is above the amount allowed."; public static string LMoveSourceShared { get; set; } = "Shared Non-Relearn Move."; public static string LMoveSourceSharedF { get; set; } = "Shared Non-Relearn Move in Generation {0}."; @@ -365,6 +367,13 @@ public static class LegalityCheckStrings public static string LMoveRelearnInvalid { get; set; } = "Not an expected Relearnable move."; public static string LMoveRelearnNone { get; set; } = "Expected no Relearn Move in slot."; + public static string LMoveShopAlphaMoveShouldBeMastered { get; set; } = "Alpha Move should be marked as mastered."; + public static string LMoveShopAlphaMoveShouldBeOther { get; set; } = "Alpha encounter cannot be found with this Alpha Move."; + public static string LMoveShopAlphaMoveShouldBeZero { get; set; } = "Only Alphas may have an Alpha Move set."; + public static string LMoveShopMasterInvalid_0 { get; set; } = "Cannot manually master {0}: not permitted to master."; + public static string LMoveShopMasterNotLearned_0 { get; set; } = "Cannot manually master {0}: not in possible learned level up moves."; + public static string LMoveShopPurchaseInvalid_0 { get; set; } = "Cannot purchase {0} from the move shop."; + public static string LMoveSourceDefault { get; set; } = "Default move."; public static string LMoveSourceDuplicate { get; set; } = "Duplicate Move."; public static string LMoveSourceEgg { get; set; } = "Egg Move."; @@ -414,6 +423,9 @@ public static class LegalityCheckStrings public static string LPIDTypeMismatch { get; set; } = "Encounter Type PID mismatch."; public static string LPIDZero { get; set; } = "PID is not set."; + public static string LPokerusDaysTooHigh_0 { get; set; } = "Pokérus Days Remaining value is too high; expected <= {0}."; + public static string LPokerusStrainUnobtainable_0 { get; set; } = "Pokérus Strain {0} cannot be obtained."; + public static string LRibbonAllValid { get; set; } = "All ribbons accounted for."; public static string LRibbonEgg { get; set; } = "Can't receive Ribbon(s) as an Egg."; public static string LRibbonFInvalid_0 { get; set; } = "Invalid Ribbons: {0}"; @@ -423,13 +435,18 @@ public static class LegalityCheckStrings public static string LStatDynamaxInvalid { get; set; } = "Dynamax Level is not within the expected range."; public static string LStatIncorrectHeight { get; set; } = "Calculated Height does not match stored value."; + public static string LStatIncorrectHeightCopy { get; set; } = "Copy Height does not match the original value."; + public static string LStatIncorrectHeightValue { get; set; } = "Height does not match the expected value."; public static string LStatIncorrectWeight { get; set; } = "Calculated Weight does not match stored value."; + public static string LStatIncorrectWeightValue { get; set; } = "Weight does not match the expected value."; public static string LStatInvalidHeightWeight { get; set; } = "Height / Weight values are statistically improbable."; public static string LStatIncorrectCP { get; set; } = "Calculated CP does not match stored value."; public static string LStatGigantamaxInvalid { get; set; } = "Gigantamax Flag mismatch."; public static string LStatGigantamaxValid { get; set; } = "Gigantamax Flag was changed via Max Soup."; public static string LStatNatureInvalid { get; set; } = "Stat Nature is not within the expected range."; public static string LStatBattleVersionInvalid { get; set; } = "Battle Version is not within the expected range."; + public static string LStatNobleInvalid { get; set; } = "Noble Flag mismatch."; + public static string LStatAlphaInvalid { get; set; } = "Alpha Flag mismatch."; public static string LSuperComplete { get; set; } = "Super Training complete flag mismatch."; public static string LSuperDistro { get; set; } = "Distribution Super Training missions are not released."; diff --git a/PKHeX.Core/Legality/Learnset/Learnset.cs b/PKHeX.Core/Legality/Learnset/Learnset.cs index 92f21aa521b..f3e5aa8cbf9 100644 --- a/PKHeX.Core/Legality/Learnset/Learnset.cs +++ b/PKHeX.Core/Legality/Learnset/Learnset.cs @@ -94,7 +94,8 @@ public int[] GetEncounterMoves(int level) { const int count = 4; var moves = new int[count]; - return GetEncounterMoves(level, moves); + SetEncounterMoves(level, moves); + return moves; } /// Returns the moves a Pokémon would have if it were encountered at the specified level. @@ -103,7 +104,7 @@ public int[] GetEncounterMoves(int level) /// Move array to write to /// Starting index to begin overwriting at /// Array of Move IDs - public int[] GetEncounterMoves(int level, int[] moves, int ctr = 0) + public void SetEncounterMoves(int level, Span moves, int ctr = 0) { for (int i = 0; i < Moves.Length; i++) { @@ -111,14 +112,50 @@ public int[] GetEncounterMoves(int level, int[] moves, int ctr = 0) break; int move = Moves[i]; - bool alreadyHasMove = Array.IndexOf(moves, move) >= 0; + bool alreadyHasMove = moves.IndexOf(move) >= 0; + if (alreadyHasMove) + continue; + + moves[ctr++] = move; + ctr &= 3; + } + } + + /// Adds the learned moves by level up to the specified level. + public void SetLevelUpMoves(int startLevel, int endLevel, Span moves, int ctr = 0) + { + int startIndex = Array.FindIndex(Levels, z => z >= startLevel); + int endIndex = Array.FindIndex(Levels, z => z > endLevel); + for (int i = startIndex; i < endIndex; i++) + { + int move = Moves[i]; + bool alreadyHasMove = moves.IndexOf(move) >= 0; + if (alreadyHasMove) + continue; + + moves[ctr++] = move; + ctr &= 3; + } + } + + /// Adds the moves that are gained upon evolving. + /// Move array to write to + /// Starting index to begin overwriting at + public void SetEvolutionMoves(Span moves, int ctr = 0) + { + for (int i = 0; i < Moves.Length; i++) + { + if (Levels[i] != 0) + break; + + int move = Moves[i]; + bool alreadyHasMove = moves.IndexOf(move) >= 0; if (alreadyHasMove) continue; moves[ctr++] = move; ctr &= 3; } - return moves; } public IList GetUniqueMovesLearned(IEnumerable seed, int maxLevel, int minLevel = 0) diff --git a/PKHeX.Core/Legality/Learnset/LearnsetReader.cs b/PKHeX.Core/Legality/Learnset/LearnsetReader.cs index 24cb47af65e..77c21e29be4 100644 --- a/PKHeX.Core/Legality/Learnset/LearnsetReader.cs +++ b/PKHeX.Core/Legality/Learnset/LearnsetReader.cs @@ -15,7 +15,7 @@ public static class LearnsetReader /// /// Raw ROM data containing the contiguous moves /// Highest species ID for the input game. - public static Learnset[] GetArray(byte[] input, int maxSpecies) + public static Learnset[] GetArray(ReadOnlySpan input, int maxSpecies) { var data = new Learnset[maxSpecies + 1]; @@ -30,7 +30,7 @@ public static Learnset[] GetArray(byte[] input, int maxSpecies) /// Loads a learnset by reading 16-bit move,level pairs. /// /// Entry data - public static Learnset[] GetArray(byte[][] entries) + public static Learnset[] GetArray(BinLinkerAccessor entries) { Learnset[] data = new Learnset[entries.Length]; for (int i = 0; i < data.Length; i++) diff --git a/PKHeX.Core/Legality/LegalityAnalysis.cs b/PKHeX.Core/Legality/LegalityAnalysis.cs index 34ccc727f4b..293edfee759 100644 --- a/PKHeX.Core/Legality/LegalityAnalysis.cs +++ b/PKHeX.Core/Legality/LegalityAnalysis.cs @@ -1,4 +1,4 @@ -#define SUPPRESS +//#define SUPPRESS using System; using System.Collections.Generic; @@ -311,6 +311,7 @@ private void UpdateChecks() return; Mark.Verify(this); + Arceus.Verify(this); } } } diff --git a/PKHeX.Core/Legality/LegalityAnalyzers.cs b/PKHeX.Core/Legality/LegalityAnalyzers.cs index fcb0a054ee5..d079e364b8a 100644 --- a/PKHeX.Core/Legality/LegalityAnalyzers.cs +++ b/PKHeX.Core/Legality/LegalityAnalyzers.cs @@ -32,5 +32,6 @@ internal static class LegalityAnalyzers public static readonly MiscVerifier MiscValues = new(); public static readonly TransferVerifier Transfer = new(); public static readonly MarkVerifier Mark = new(); + public static readonly LegendsArceusVerifier Arceus = new(); } } diff --git a/PKHeX.Core/Legality/MoveList.cs b/PKHeX.Core/Legality/MoveList.cs index c2e0101717d..2ab193e6489 100644 --- a/PKHeX.Core/Legality/MoveList.cs +++ b/PKHeX.Core/Legality/MoveList.cs @@ -142,10 +142,18 @@ internal static int[] GetBaseEggMoves(PKM pkm, int species, int form, GameVersio } break; + case PLA: + if (pkm.InhabitedGeneration(8)) + { + int index = PersonalTable.LA.GetFormIndex(species, form); + return LevelUpLA[index].GetMoves(lvl); + } + break; + case BD or SP or BDSP: if (pkm.InhabitedGeneration(8)) { - int index = PersonalTable.SWSH.GetFormIndex(species, form); + int index = PersonalTable.BDSP.GetFormIndex(species, form); return LevelUpBDSP[index].GetMoves(lvl); } break; diff --git a/PKHeX.Core/Legality/Moves/GameData.cs b/PKHeX.Core/Legality/Moves/GameData.cs index 731ad8e62bc..a6728c89263 100644 --- a/PKHeX.Core/Legality/Moves/GameData.cs +++ b/PKHeX.Core/Legality/Moves/GameData.cs @@ -44,6 +44,7 @@ public static Learnset GetLearnset(GameVersion game, int species, int form) SW or SH or SWSH => Legal.LevelUpSWSH, BD or SP or BDSP => Legal.LevelUpBDSP, + PLA => Legal.LevelUpLA, Gen1 => Legal.LevelUpY, Gen2 => Legal.LevelUpC, @@ -88,6 +89,7 @@ public static Learnset GetLearnset(GameVersion game, int species, int form) SW or SH or SWSH => PersonalTable.SWSH, BD or SP or BDSP => PersonalTable.BDSP, + PLA => PersonalTable.LA, Gen1 => PersonalTable.Y, Gen2 => PersonalTable.C, diff --git a/PKHeX.Core/Legality/Moves/MoveEgg.cs b/PKHeX.Core/Legality/Moves/MoveEgg.cs index e09031fe918..e4293d9796e 100644 --- a/PKHeX.Core/Legality/Moves/MoveEgg.cs +++ b/PKHeX.Core/Legality/Moves/MoveEgg.cs @@ -61,6 +61,7 @@ internal static int[] GetRelearnLVLMoves(PKM pkm, int species, int form, int lvl US or UM => getMoves(LevelUpUSUM, PersonalTable.USUM), SW or SH => getMoves(LevelUpSWSH, PersonalTable.SWSH), BD or SP => getMoves(LevelUpBDSP, PersonalTable.BDSP), + PLA => getMoves(LevelUpLA, PersonalTable.LA), _ => Array.Empty(), }; @@ -79,6 +80,7 @@ public static int[] GetSharedEggMoves(PKM pkm, int gen) { if (gen < 8 || pkm.IsEgg) return Array.Empty(); + if (pkm.BDSP) { var table = PersonalTable.BDSP; diff --git a/PKHeX.Core/Legality/Moves/MoveLevelUp.cs b/PKHeX.Core/Legality/Moves/MoveLevelUp.cs index dda6625ab91..75ed98271ce 100644 --- a/PKHeX.Core/Legality/Moves/MoveLevelUp.cs +++ b/PKHeX.Core/Legality/Moves/MoveLevelUp.cs @@ -9,6 +9,7 @@ namespace PKHeX.Core public static class MoveLevelUp { private static readonly LearnLookup + LearnLA = new(PersonalTable.LA, LevelUpLA, PLA), LearnBDSP = new(PersonalTable.BDSP, LevelUpBDSP, BDSP), LearnSWSH = new(PersonalTable.SWSH, LevelUpSWSH, SWSH), LearnSM = new(PersonalTable.SM, LevelUpSM, SM), @@ -215,6 +216,11 @@ private static LearnVersion GetIsLevelUp8(int species, int form, int move, int m return LearnNONE; return LearnSWSH.GetIsLevelUp(species, form, move, maxLevel); + case PLA: + if (species > MaxSpeciesID_8a) + return LearnNONE; + return LearnLA.GetIsLevelUp(species, form, move, maxLevel); + case BD or SP or BDSP: if (species > MaxSpeciesID_8b) return LearnNONE; @@ -478,6 +484,11 @@ private static List AddMovesLevelUp8(List moves, GameVersion ver, int return moves; return LearnSWSH.AddMoves(moves, species, form, maxLevel); + case PLA: + if (species > MaxSpeciesID_8a) + return moves; + return LearnLA.AddMoves(moves, species, form, maxLevel); + case BD or SP or BDSP: if (species > MaxSpeciesID_8b) return moves; @@ -501,7 +512,8 @@ private static int[] GetEncounterMoves1(int species, int level, GameVersion vers var lvl0 = (int[])((PersonalInfoG1) table[index]).Moves.Clone(); int start = Math.Max(0, Array.IndexOf(lvl0, 0)); - return learn[index].GetEncounterMoves(level, lvl0, start); + learn[index].SetEncounterMoves(level, lvl0, start); + return lvl0; } private static int[] GetEncounterMoves2(int species, int level, GameVersion version) @@ -512,7 +524,8 @@ private static int[] GetEncounterMoves2(int species, int level, GameVersion vers var lvl0 = learn[species].GetEncounterMoves(1); int start = Math.Max(0, Array.IndexOf(lvl0, 0)); - return learn[index].GetEncounterMoves(level, lvl0, start); + learn[index].SetEncounterMoves(level, lvl0, start); + return lvl0; } public static int[] GetEncounterMoves(int species, int form, int level, GameVersion version) diff --git a/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs b/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs index 9f114177c1d..fc821cc24f4 100644 --- a/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs +++ b/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs @@ -245,7 +245,7 @@ private static GameVersion GetIsMachine8(int species, int move, int form, GameVe if (GameVersion.BDSP.Contains(ver)) { - for (int i = 0; i < PersonalInfoSWSH.CountTM; i++) + for (int i = 0; i < PersonalInfoBDSP.CountTM; i++) { if (Legal.TMHM_BDSP[i] != move) continue; @@ -272,7 +272,7 @@ private static GameVersion GetIsRecord8(PKM pkm, int species, int move, int form break; if (allowBit) return GameVersion.SWSH; - if (((G8PKM)pkm).GetMoveRecordFlag(i)) + if (((ITechRecord8)pkm).GetMoveRecordFlag(i)) return GameVersion.SWSH; if (i == 12 && species == (int)Species.Calyrex && form == 0) // TR12 return GameVersion.SWSH; // Agility Calyrex without TR glitch. @@ -421,7 +421,7 @@ private static void AddMachine8(List r, int species, int form, GameVersion case GameVersion.Any: case GameVersion.SW or GameVersion.SH or GameVersion.SWSH: AddMachineSWSH(r, species, form); - break; + return; case GameVersion.BD or GameVersion.SP or GameVersion.BDSP: AddMachineBDSP(r, species, form); return; diff --git a/PKHeX.Core/Legality/Moves/MoveTutor.cs b/PKHeX.Core/Legality/Moves/MoveTutor.cs index 6a6ba3e4fe0..3e30360742c 100644 --- a/PKHeX.Core/Legality/Moves/MoveTutor.cs +++ b/PKHeX.Core/Legality/Moves/MoveTutor.cs @@ -153,6 +153,17 @@ private static GameVersion GetIsTutor7(PKM pkm, int species, int form, bool spec private static GameVersion GetIsTutor8(PKM pkm, int species, int form, bool specialTutors, int move) { + if (pkm.LA) + { + var pi = (PersonalInfoLA)PersonalTable.LA.GetFormEntry(species, form); + if (!pi.IsPresentInGame) + return NONE; + var index = Array.IndexOf(MoveShop8_LA, move); + if (index != -1 && pi.SpecialTutors[0][index]) + return GameVersion.PLA; + + return NONE; + } if (pkm.BDSP) { var pi = (PersonalInfoBDSP)PersonalTable.BDSP.GetFormEntry(species, form); @@ -267,6 +278,13 @@ private static void AddMovesTutor7(List moves, int species, int form, PKM p private static void AddMovesTutor8(List moves, int species, int form, PKM pkm, bool specialTutors) { + if (pkm.LA) + { + var pi = (PersonalInfoLA)PersonalTable.LA.GetFormEntry(species, form); + if (!pi.IsPresentInGame) + return; + moves.AddRange(MoveShop8_LA.Where((_, i) => pi.SpecialTutors[0][i])); + } if (pkm.BDSP) { var pi = (PersonalInfoBDSP)PersonalTable.BDSP.GetFormEntry(species, form); diff --git a/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs b/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs index f6b8a09fe11..903089c9ef3 100644 --- a/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs +++ b/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs @@ -85,6 +85,20 @@ internal static class EvolutionRestrictions new byte[] { 00, 00, 00, 00, 00, 00, 00, 00, 35 }, // Grapploct (Clobbopus with Taunt) }; + private static readonly byte[] MinLevelEvolutionWithMove_8LA = + { + 00, // Sylveon (Eevee with Fairy Move) + 25, // Mr. Mime (Mime Jr with Mimic) + 29, // Sudowoodo (Bonsly with Mimic) + 25, // Ambipom (Aipom with Double Hit) + 34, // Lickilicky (Lickitung with Rollout) + 34, // Tangrowth (Tangela with Ancient Power) + 34, // Yanmega (Yanma with Ancient Power) + 34, // Mamoswine (Piloswine with Ancient Power) + 99, // Tsareena (Steenee with Stomp) + 99, // Grapploct (Clobbopus with Taunt) + }; + private static readonly bool[][] CanEggHatchWithEvolveMove = { new [] { false, false, true, true, true, true, true, true, true }, // Sylveon (Eevee with Fairy Move) @@ -153,6 +167,9 @@ public static bool IsValidEvolutionWithMove(PKM pkm, LegalInfo info) private static int GetMinLevelKnowRequiredMove(PKM pkm, int gen, int index) { + if (gen == 8 && pkm.LA) // No Level Up required, and different levels than mainline SW/SH. + return MinLevelEvolutionWithMove_8LA[index]; + var lvl = GetLevelLearnMove(pkm, gen, index); // If has original met location the minimum evolution level is one level after met level diff --git a/PKHeX.Core/Legality/Restrictions/ItemRestrictions.cs b/PKHeX.Core/Legality/Restrictions/ItemRestrictions.cs index ab4faf5e988..06aa16a4cf2 100644 --- a/PKHeX.Core/Legality/Restrictions/ItemRestrictions.cs +++ b/PKHeX.Core/Legality/Restrictions/ItemRestrictions.cs @@ -45,6 +45,7 @@ public static bool IsHeldItemAllowed(int item, int generation, PKM pk) 5 => ReleasedHeldItems_5, 6 => ReleasedHeldItems_6, 7 => ReleasedHeldItems_7, + 8 when pk is PA8 => Array.Empty(), 8 when pk is PB8 => ReleasedHeldItems_8b, 8 => ReleasedHeldItems_8, _ => Array.Empty(), diff --git a/PKHeX.Core/Legality/Structures/EggMoves.cs b/PKHeX.Core/Legality/Structures/EggMoves.cs index 02f8286ec55..5b08a8f77e6 100644 --- a/PKHeX.Core/Legality/Structures/EggMoves.cs +++ b/PKHeX.Core/Legality/Structures/EggMoves.cs @@ -61,7 +61,7 @@ private static EggMoves6 Get(ReadOnlySpan data) return new EggMoves6(moves); } - public static EggMoves6[] GetArray(byte[][] entries) + public static EggMoves6[] GetArray(BinLinkerAccessor entries) { EggMoves6[] data = new EggMoves6[entries.Length]; for (int i = 0; i < data.Length; i++) @@ -92,7 +92,7 @@ private static EggMoves7 Get(ReadOnlySpan data) return new EggMoves7(moves, formIndex); } - public static EggMoves7[] GetArray(byte[][] entries) + public static EggMoves7[] GetArray(BinLinkerAccessor entries) { EggMoves7[] data = new EggMoves7[entries.Length]; for (int i = 0; i < data.Length; i++) diff --git a/PKHeX.Core/Legality/Tables/FormInfo.cs b/PKHeX.Core/Legality/Tables/FormInfo.cs index c221cb98aa2..44bd16d28f2 100644 --- a/PKHeX.Core/Legality/Tables/FormInfo.cs +++ b/PKHeX.Core/Legality/Tables/FormInfo.cs @@ -100,25 +100,28 @@ public static bool IsFormChangeable(int species, int oldForm, int newForm, int f private static readonly HashSet FormChange = new() { // Sometimes considered for wild encounters - 412, // Burmy - 479, // Rotom - 676, // Furfrou - 741, // Oricorio - - 386, // Deoxys - 487, // Giratina - 492, // Shaymin - 493, // Arceus - 641, // Tornadus - 642, // Thundurus - 645, // Landorus - 646, // Kyurem - 647, // Keldeo - 649, // Genesect - 720, // Hoopa - 773, // Silvally - 800, // Necrozma - 898, // Calyrex + (int)Burmy, + (int)Rotom, + (int)Furfrou, + (int)Oricorio, + + (int)Deoxys, + (int)Dialga, + (int)Palkia, + (int)Giratina, + (int)Shaymin, + (int)Arceus, + (int)Tornadus, + (int)Thundurus, + (int)Landorus, + (int)Kyurem, + (int)Keldeo, + (int)Genesect, + (int)Hoopa, + (int)Silvally, + (int)Necrozma, + (int)Calyrex, + (int)Enamorus, }; /// @@ -234,6 +237,24 @@ public static int GetTotemBaseForm(int species, int form) return form - 1; } + + public static bool IsLordForm(int species, int form, int generation) + { + if (generation != 8) + return false; + return IsLordForm(species, form); + } + + private static bool IsLordForm(int species, int form) => form != 0 && species switch + { + (int)Arcanine when form == 2 => true, + (int)Electrode when form == 2 => true, + (int)Lilligant when form == 2 => true, + (int)Avalugg when form == 2 => true, + (int)Kleavor when form == 1 => true, + _ => false, + }; + /// /// Checks if the exists for the without having an associated index. /// diff --git a/PKHeX.Core/Legality/Tables/Tables.cs b/PKHeX.Core/Legality/Tables/Tables.cs index 297d86452b8..9005111b0ef 100644 --- a/PKHeX.Core/Legality/Tables/Tables.cs +++ b/PKHeX.Core/Legality/Tables/Tables.cs @@ -32,6 +32,7 @@ public static partial class Legal {(int)Thundurus,(g, _) => g >= 6}, {(int)Landorus, (g, _) => g >= 6}, {(int)Urshifu, (g, _) => g >= 8}, + {(int)Enamorus, (g, _) => g >= 8}, // Fused {(int)Kyurem, (g, _) => g >= 6}, @@ -127,8 +128,14 @@ public static bool IsValidSketch(int move, int generation) return false; if (generation is 6 && move is ((int)ThousandArrows or (int)ThousandWaves)) return false; - if (generation is 8 && (SignatureSketch_BDSP.Contains(move) || DummiedMoves_BDSP.Contains(move))) // can't Sketch unusable moves in BDSP - return false; + if (generation is 8) // can't Sketch unusable moves in BDSP, no Sketch in PLA + { + if (SignatureSketch_BDSP.Contains(move) || DummiedMoves_BDSP.Contains(move)) + return false; + if (move > MaxMoveID_8) + return false; + } + return move <= GetMaxMoveID(generation); } @@ -177,7 +184,7 @@ public static bool IsValidSketch(int move, int generation) (int)TypeNull, (int)Silvally, (int)TapuKoko, (int)TapuLele, (int)TapuBulu, (int)TapuFini, (int)Nihilego, (int)Buzzwole, (int)Pheromosa, (int)Xurkitree, (int)Celesteela, (int)Kartana, (int)Guzzlord, (int)Poipole, (int)Naganadel, (int)Stakataka, (int)Blacephalon, - (int)Kubfu, (int)Urshifu, (int)Regieleki, (int)Regidrago, (int)Glastrier, (int)Spectrier, + (int)Kubfu, (int)Urshifu, (int)Regieleki, (int)Regidrago, (int)Glastrier, (int)Spectrier, (int)Enamorus, }; /// diff --git a/PKHeX.Core/Legality/Tables/Tables8a.cs b/PKHeX.Core/Legality/Tables/Tables8a.cs new file mode 100644 index 00000000000..b298e95542b --- /dev/null +++ b/PKHeX.Core/Legality/Tables/Tables8a.cs @@ -0,0 +1,309 @@ +using System.Collections.Generic; + +namespace PKHeX.Core +{ + public static partial class Legal + { + internal const int MaxSpeciesID_8a = (int)Species.Enamorus; + internal const int MaxMoveID_8a = (int)Move.TakeHeart; + internal const int MaxItemID_8a = 1828; // Legend Plate + internal const int MaxBallID_8a = (int)Ball.LAOrigin; + internal const int MaxGameID_8a = (int)GameVersion.SP; + internal const int MaxAbilityID_8a = MaxAbilityID_8_R2; + + #region Met Locations + + internal static readonly int[] Met_LA_0 = + { + 000, 002, 004, 006, 007, 008, 009, + 010, 011, 012, 013, 014, 015, 016, 017, 018, 019, + 020, 021, 022, 023, 024, 025, 026, 027, 028, 029, + 030, 031, 032, 033, 034, 035, 036, 037, 038, 039, + 040, 041, 042, 043, 045, 046, 047, 048, 049, + 050, 051, 052, 053, 054, 055, 056, 057, 058, 059, + 060, 061, 063, 064, 065, 066, 067, 068, 069, + 070, 071, 072, 073, 074, 075, 076, 077, 079, + 080, 081, 082, 083, 084, 085, 086, 087, 088, 089, + 090, 092, 093, 094, 095, 096, 097, 098, 099, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, + }; + + internal static readonly int[] Met_LA_3 = + { + 30001, 30002, 30003, 30004, 30005, 30006, 30007, 30008, 30009, 30010, 30011, 30012, 30013, 30014, 30015, 30016, 30017, 30018, 30019, 30020, 30021, 30022, + }; + + internal static readonly int[] Met_LA_4 = + { + 40001, 40002, 40003, 40005, 40006, 40007, 40008, 40009, + 40010, 40011, 40012, 40013, 40014, 40016, 40017, 40018, 40019, + 40020, 40021, 40022, 40024, 40025, 40026, 40027, 40028, 40029, + 40030, 40032, 40033, 40034, 40035, 40036, 40037, 40038, 40039, + 40040, 40041, 40042, 40043, 40044, 40045, 40047, 40048, 40049, + 40050, 40051, 40052, 40053, 40055, 40056, 40057, 40058, 40059, + 40060, 40061, 40063, 40064, 40065, 40066, 40067, 40068, 40069, + 40070, 40071, 40072, 40074, 40075, 40076, 40077, 40078, 40079, + 40080, 40081, 40082, 40083, 40084, 40085, 40086, + }; + + internal static readonly int[] Met_LA_6 = {/* XY */ 60001, 60003, /* ORAS */ 60004 }; + + #endregion + + internal static readonly ushort[] Pouch_Items_LA = + { + 017, 023, 024, 025, 026, 027, 028, 029, 039, 041, + 050, 054, 072, 073, 075, 080, 081, 082, 083, 084, + 085, 090, 091, 092, 107, 108, 109, 110, 149, 150, + 151, 152, 153, 154, 155, 157, 158, 159, 160, 161, + 162, 163, 164, 166, 168, 233, 252, 321, 322, 323, + 324, 325, 326, 327, 583, 849, + + 1125, 1126, 1127, 1128, 1231, 1232, 1233, 1234, 1235, 1236, + 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, + 1247, 1248, 1249, 1250, 1251, + + 1611, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, + 1628, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, + 1651, 1679, 1681, 1682, 1684, 1686, 1687, 1688, 1689, 1690, + 1691, 1692, 1693, 1694, 1695, 1696, 1699, 1700, 1701, 1702, + 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, + 1713, 1716, 1717, 1720, 1724, 1725, 1726, 1727, 1728, 1732, + 1733, 1734, 1735, 1736, 1738, 1739, 1740, 1741, 1742, 1746, + 1747, 1748, 1749, 1750, 1754, 1755, 1756, 1757, 1758, 1759, + 1760, 1761, 1762, 1764, 1785, + }; + + internal static readonly ushort[] Pouch_Recipe_LA = + { + 1640, 1641, 1642, 1643, 1644, 1646, 1647, 1648, 1649, + 1650, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, + 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, + 1670, 1671, 1673, 1674, 1675, 1676, 1677, + + 1729, + 1730, 1731, + + 1751, 1752, 1753, + + 1783, 1784, + }; + + internal static readonly ushort[] Pouch_Key_LA = + { + 111, + 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, + 441, 455, 466, + 632, 638, 644, + 1608, 1609, 1610, 1612, 1622, 1624, 1625, 1626, 1627, 1629, + 1639, 1678, 1721, 1722, 1723, 1737, 1743, 1744, 1745, 1763, + 1765, 1766, 1767, 1768, 1769, 1771, 1776, 1777, 1778, 1779, + 1780, 1782, 1786, 1787, 1788, 1789, 1790, 1792, 1793, 1794, + 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, + 1805, 1806, 1807, + 1828, + }; + + internal static readonly ushort[] HeldItems_LA = { 0 }; + + internal static readonly HashSet HisuiOriginForms = new() + { + (int)Species.Sneasel, + (int)Species.Growlithe, + (int)Species.Arcanine, + (int)Species.Voltorb, + (int)Species.Electrode, + (int)Species.Qwilfish, + (int)Species.Sliggoo, + (int)Species.Goodra, + }; + + internal static readonly IReadOnlyDictionary HisuiForm0Evolutions = new Dictionary + { + {(int)Species.Sneasler, 1}, + }; + + internal static readonly HashSet HisuiVariantFormEvolutions = new() + { + (int)Species.Decidueye, + (int)Species.Typhlosion, + (int)Species.Samurott, + (int)Species.Lilligant, + (int)Species.Braviary, + (int)Species.Avalugg, + }; + + #region Moves + + internal static readonly int[] MoveShop8_LA = + { + (int)Move.FalseSwipe, + (int)Move.FireFang, + (int)Move.ThunderFang, + (int)Move.IceFang, + (int)Move.IceBall, + (int)Move.RockSmash, + (int)Move.Spikes, + (int)Move.Bulldoze, + (int)Move.AerialAce, + (int)Move.StealthRock, + (int)Move.Swift, + (int)Move.TriAttack, + (int)Move.MagicalLeaf, + (int)Move.OminousWind, + (int)Move.PowerShift, + (int)Move.FocusEnergy, + (int)Move.BulkUp, + (int)Move.CalmMind, + (int)Move.Rest, + (int)Move.BabyDollEyes, + (int)Move.FirePunch, + (int)Move.ThunderPunch, + (int)Move.IcePunch, + (int)Move.DrainPunch, + (int)Move.PoisonJab, + (int)Move.PsychoCut, + (int)Move.ZenHeadbutt, + (int)Move.LeechLife, + (int)Move.XScissor, + (int)Move.RockSlide, + (int)Move.ShadowClaw, + (int)Move.IronHead, + (int)Move.IronTail, + (int)Move.MysticalFire, + (int)Move.WaterPulse, + (int)Move.ChargeBeam, + (int)Move.EnergyBall, + (int)Move.IcyWind, + (int)Move.SludgeBomb, + (int)Move.EarthPower, + (int)Move.ShadowBall, + (int)Move.Snarl, + (int)Move.FlashCannon, + (int)Move.DazzlingGleam, + (int)Move.GigaImpact, + (int)Move.AquaTail, + (int)Move.WildCharge, + (int)Move.HighHorsepower, + (int)Move.Megahorn, + (int)Move.StoneEdge, + (int)Move.Outrage, + (int)Move.PlayRough, + (int)Move.HyperBeam, + (int)Move.Flamethrower, + (int)Move.Thunderbolt, + (int)Move.IceBeam, + (int)Move.Psychic, + (int)Move.DarkPulse, + (int)Move.DracoMeteor, + (int)Move.SteelBeam, + (int)Move.VoltTackle, + }; + + internal static readonly byte[] MovePP_LA = + { + 00, + 35, 25, 10, 15, 20, 20, 10, 10, 10, 35, 30, 05, 10, 20, 30, 25, 35, 20, 15, 20, 20, 25, 20, 30, 05, 10, 15, 15, 15, 25, 20, 05, 30, 15, 20, 20, 10, 05, 30, 20, 20, 20, 30, 20, 40, 20, 15, 20, 20, 20, + 30, 25, 10, 30, 25, 05, 15, 10, 05, 20, 20, 20, 05, 35, 20, 20, 20, 20, 20, 15, 20, 15, 10, 20, 25, 10, 20, 20, 20, 10, 40, 10, 15, 25, 10, 20, 05, 15, 10, 05, 10, 10, 20, 10, 20, 40, 30, 20, 20, 20, + 15, 10, 40, 15, 10, 30, 10, 20, 10, 40, 40, 20, 30, 30, 20, 20, 10, 10, 20, 05, 10, 30, 20, 20, 20, 05, 15, 15, 20, 10, 15, 35, 20, 15, 10, 10, 30, 15, 20, 20, 10, 10, 05, 10, 25, 10, 10, 20, 15, 40, + 20, 10, 05, 15, 10, 10, 10, 15, 30, 30, 10, 10, 15, 10, 01, 01, 10, 25, 10, 05, 15, 20, 15, 10, 15, 30, 05, 40, 15, 10, 25, 10, 20, 10, 20, 10, 10, 10, 20, 15, 20, 05, 40, 05, 05, 20, 05, 10, 05, 10, + 10, 10, 10, 20, 20, 30, 15, 10, 20, 20, 25, 05, 15, 10, 05, 20, 15, 20, 25, 20, 05, 30, 05, 05, 20, 40, 05, 20, 40, 20, 05, 35, 10, 05, 05, 05, 15, 05, 25, 05, 05, 10, 20, 10, 05, 15, 10, 10, 20, 15, + 10, 10, 10, 20, 10, 10, 10, 10, 15, 15, 15, 10, 20, 20, 10, 20, 20, 20, 20, 20, 10, 10, 10, 20, 20, 05, 15, 10, 10, 15, 10, 20, 05, 05, 10, 10, 20, 05, 10, 20, 10, 20, 20, 20, 05, 05, 15, 20, 10, 15, + 20, 15, 10, 10, 15, 10, 05, 05, 10, 25, 10, 05, 20, 15, 05, 40, 15, 15, 40, 15, 20, 20, 05, 15, 20, 15, 15, 15, 05, 10, 30, 20, 30, 20, 05, 40, 10, 05, 10, 05, 15, 25, 25, 05, 20, 15, 10, 10, 20, 10, + 20, 20, 05, 05, 10, 05, 40, 10, 10, 05, 10, 10, 15, 10, 20, 15, 30, 10, 20, 05, 10, 10, 15, 10, 10, 05, 15, 05, 10, 10, 30, 20, 20, 10, 10, 05, 05, 10, 05, 20, 10, 20, 10, 05, 10, 10, 20, 10, 10, 15, + 10, 15, 10, 10, 10, 10, 10, 10, 10, 30, 05, 10, 05, 10, 10, 05, 20, 20, 10, 20, 15, 15, 15, 15, 20, 15, 15, 10, 10, 10, 20, 15, 05, 05, 15, 15, 05, 10, 05, 15, 05, 10, 20, 05, 20, 20, 20, 20, 05, 20, + 15, 05, 20, 15, 10, 10, 05, 10, 05, 05, 10, 05, 05, 10, 05, 15, 05, 15, 10, 10, 10, 10, 10, 15, 15, 20, 15, 10, 15, 10, 15, 10, 20, 10, 10, 10, 20, 20, 20, 20, 20, 15, 15, 15, 15, 15, 15, 20, 15, 10, + 15, 15, 15, 15, 10, 15, 10, 10, 10, 15, 15, 15, 15, 05, 05, 15, 05, 10, 10, 10, 20, 20, 20, 10, 10, 30, 15, 10, 10, 15, 25, 10, 15, 10, 10, 10, 20, 10, 10, 10, 10, 05, 15, 15, 05, 05, 10, 10, 10, 05, + 05, 10, 05, 05, 15, 10, 05, 05, 05, 10, 10, 10, 10, 20, 25, 10, 20, 30, 25, 20, 20, 15, 20, 15, 20, 20, 15, 10, 10, 10, 10, 20, 10, 25, 10, 10, 10, 10, 20, 20, 05, 05, 05, 20, 10, 10, 20, 15, 20, 20, + 10, 20, 30, 10, 10, 40, 40, 20, 20, 40, 20, 20, 10, 10, 10, 10, 05, 10, 10, 05, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, + 01, 01, 01, 01, 01, 01, 01, 01, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 25, 15, 20, 30, 20, 15, 15, 20, 10, 15, 15, 10, 05, 10, 10, 20, 15, 10, 15, 15, 15, 05, 15, 20, 20, 01, 01, 01, 01, 01, 01, + 01, 01, 01, 05, 05, 10, 10, 10, 20, 10, 10, 10, 05, 05, 20, 10, 10, 10, 01, 05, 15, 05, 01, 01, 01, 01, 01, 01, 10, 15, 15, 20, 20, 20, 20, 15, 15, 10, 10, 05, 20, 05, 10, 05, 15, 10, 10, 05, 15, 20, + 10, 10, 15, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 05, 10, 15, 10, 15, 05, 05, 05, 10, 15, 40, 10, 10, 10, 15, 10, 10, 10, 10, 05, 05, 05, 10, 05, 20, 10, + 10, 05, 20, 20, 10, 10, 05, 05, 05, 40, 10, 20, 10, 10, 10, 10, 05, 05, 15, 05, 10, 10, 10, 05, 05, 35, 15, 10, 10, 15, 05, 10, 10, 10, 05, 05, 10, 05, 15, 10, 15, 10, 15, 15, 15, 05, 05, 05, 10, 10, + }; + + /// + /// Moves that are kill + /// + public static readonly HashSet DummiedMoves_LA = new() + { + 001, 002, 003, 004, 005, 006, 010, 011, 012, 013, + 015, 017, 018, 019, 020, 021, 022, 023, 024, 025, + 026, 027, 028, 029, 030, 031, 032, 034, 035, 036, + 037, 039, 041, 043, 045, 046, 047, 048, 049, 050, + 051, 054, 055, 057, 060, 061, 062, 064, 065, 066, + 067, 068, 069, 070, 072, 073, 074, 075, 076, 081, + 082, 083, 088, 089, 090, 091, 092, 096, 097, 099, + 101, 103, 104, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 117, 118, 119, 121, 122, 123, 124, + 125, 127, 128, 130, 131, 132, 133, 134, 136, 137, + 138, 140, 142, 143, 144, 146, 148, 149, 152, 153, + 154, 155, 158, 159, 160, 162, 164, 166, 167, 168, + 169, 170, 171, 173, 174, 175, 176, 177, 178, 179, + 180, 182, 184, 185, 186, 187, 192, 193, 194, 195, + 197, 198, 199, 201, 202, 203, 204, 207, 208, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 225, 226, 227, 228, 229, 230, 232, + 233, 234, 235, 236, 238, 240, 241, 243, 244, 245, + 248, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 302, 303, 304, 305, 306, 307, 308, 309, + 311, 312, 313, 316, 317, 319, 320, 321, 322, 323, + 324, 325, 327, 328, 329, 330, 331, 333, 335, 336, + 338, 340, 341, 342, 343, 346, 349, 350, 351, 353, + 354, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 395, 397, + 402, 407, 410, 411, 415, 419, 429, 431, 432, 433, + 435, 436, 438, 439, 441, 443, 445, 447, 448, 450, + 454, 455, 456, 461, 468, 469, 470, 471, 472, 473, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 524, 525, 526, 527, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 578, 579, 580, 581, 582, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 606, 607, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 668, 669, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, + 793, 794, 795, 797, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, + 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, + 824, 825, 826, + }; + + #endregion + } +} diff --git a/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs b/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs index 3f91a65d2a6..3e4fb47b58a 100644 --- a/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/Ability/AbilityVerifier.cs @@ -68,7 +68,7 @@ private CheckResult VerifyAbility(LegalityAnalysis data) if (format >= 8) // Ability Patch { - if (pkm.AbilityNumber == 4) + if (pkm.AbilityNumber == 4 && !pkm.LA) { if (CanAbilityPatch(format, abilities, pkm.Species)) return GetValid(LAbilityPatchUsed); @@ -452,6 +452,8 @@ private static bool IsAbilityCapsuleModified(PKM pkm, IReadOnlyList abiliti return false; if (pkm.AbilityNumber == 4) return false; // Cannot alter to hidden ability. + if (pkm.LA) + return false; // Not available. if (encounterAbility == AbilityPermission.OnlyHidden) return false; // Cannot alter from hidden ability. return true; @@ -481,6 +483,7 @@ public static bool CanAbilityPatch(int format, IReadOnlyList abilities, int (int)Species.Tornadus => true, // Form-0 is a/a/h (int)Species.Thundurus => true, // Form-0 is a/a/h (int)Species.Landorus => true, // Form-0 is a/a/h + (int)Species.Enamorus => true, // Form-0 is a/a/h _ => false, }; } diff --git a/PKHeX.Core/Legality/Verifiers/Ball/BallUseLegality.cs b/PKHeX.Core/Legality/Verifiers/Ball/BallUseLegality.cs index a45f405a7f4..ddc7dffb9f3 100644 --- a/PKHeX.Core/Legality/Verifiers/Ball/BallUseLegality.cs +++ b/PKHeX.Core/Legality/Verifiers/Ball/BallUseLegality.cs @@ -16,6 +16,7 @@ internal static class BallUseLegality 6 => WildPokeballs6, 7 => GameVersion.Gen7b.Contains(game) ? WildPokeballs7b : WildPokeballs7, 8 when GameVersion.BDSP.Contains(game) => WildPokeBalls4_HGSS, + 8 when GameVersion.PLA == game => WildPokeBalls8a, 8 => GameVersion.GO == game ? WildPokeballs8g : WildPokeballs8, _ => Array.Empty(), }; @@ -66,5 +67,20 @@ 8 when GameVersion.BDSP.Contains(game) => WildPokeBalls4_HGSS, (int)Sport, // no cherish ball }; + + private static readonly HashSet WildPokeBalls8a = new() + { + (int)LAPoke, + (int)LAGreat, + (int)LAUltra, + + (int)LAFeather, + (int)LAWing, + (int)LAJet, + + (int)LAHeavy, + (int)LALeaden, + (int)LAGigaton, + }; } } diff --git a/PKHeX.Core/Legality/Verifiers/FormVerifier.cs b/PKHeX.Core/Legality/Verifiers/FormVerifier.cs index d60b366b849..f1b1f378bd0 100644 --- a/PKHeX.Core/Legality/Verifiers/FormVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/FormVerifier.cs @@ -42,12 +42,6 @@ private CheckResult VerifyForm(LegalityAnalysis data) if (!PersonalInfo.IsFormWithinRange(form) && !FormInfo.IsValidOutOfBoundsForm(species, form, Info.Generation)) return GetInvalid(string.Format(LFormInvalidRange, count - 1, form)); - switch (enc) - { - case EncounterEgg e when FormInfo.IsTotemForm(species, form, e.Generation): - return GetInvalid(LFormInvalidGame); - } - switch ((Species)species) { case Pikachu when Info.Generation == 6: // Cosplay @@ -72,6 +66,8 @@ private CheckResult VerifyForm(LegalityAnalysis data) break; case Unown when Info.Generation == 2 && form >= 26: return GetInvalid(string.Format(LFormInvalidRange, "Z", form == 26 ? "!" : "?")); + case Dialga or Palkia or Giratina or Arceus when form > 0 && pkm.LA: // can change forms with key items + break; case Giratina when form == 1 ^ pkm.HeldItem == 112: // Giratina, Origin form only with Griseous Orb return GetInvalid(LFormItemInvalid); @@ -279,6 +275,57 @@ private CheckResult VerifyFormArgument(LegalityAnalysis data, IFormArgument f) > (uint) AlcremieDecoration.Ribbon => GetInvalid(LFormArgumentHigh), _ => GetValid(LFormArgumentValid), }, + Overqwil when enc.Species == (int)Overqwil => arg switch + { + not 0 => GetInvalid(LFormArgumentNotAllowed), + _ => GetValid(LFormArgumentValid), + }, + Wyrdeer when enc.Species == (int)Wyrdeer => arg switch + { + not 0 => GetInvalid(LFormArgumentNotAllowed), + _ => GetValid(LFormArgumentValid), + }, + Basculegion when enc.Species == (int)Basculegion => arg switch + { + not 0 => GetInvalid(LFormArgumentNotAllowed), + _ => GetValid(LFormArgumentValid), + }, + Basculin when pkm.Form is 2 => arg switch + { + not 0 when pkm.IsEgg => GetInvalid(LFormArgumentNotAllowed), + > 9_999 => GetInvalid(LFormArgumentHigh), + _ => GetValid(LFormArgumentValid), + }, + Qwilfish when pkm.Form is 1 => arg switch + { + not 0 when pkm.IsEgg => GetInvalid(LFormArgumentNotAllowed), + > 9_999 => GetInvalid(LFormArgumentHigh), + _ => GetValid(LFormArgumentValid), + }, + Stantler when pkm is PA8 => arg switch + { + not 0 when pkm.IsEgg => GetInvalid(LFormArgumentNotAllowed), + > 9_999 => GetInvalid(LFormArgumentHigh), + _ => GetValid(LFormArgumentValid), + }, + Wyrdeer => arg switch // From Stantler + { + < 20 => GetInvalid(LFormArgumentLow), + > 9_999 => GetInvalid(LFormArgumentHigh), + _ => GetValid(LFormArgumentValid), + }, + Overqwil => arg switch // From Qwilfish-1 + { + < 20 => GetInvalid(LFormArgumentLow), + > 9_999 => GetInvalid(LFormArgumentHigh), + _ => GetValid(LFormArgumentValid), + }, + Basculegion => arg switch // From Basculin-2 + { + < 294 => GetInvalid(LFormArgumentLow), + > 9_999 => GetInvalid(LFormArgumentHigh), + _ => GetValid(LFormArgumentValid), + }, _ => VerifyFormArgumentNone(pkm, f), }; } diff --git a/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs b/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs index 38a82443627..69a6d0a5bbb 100644 --- a/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/HistoryVerifier.cs @@ -187,6 +187,7 @@ public static bool GetCanOTHandle(IEncounterTemplate enc, PKM pkm, int generatio WC7 wc7 when wc7.OT_Name.Length > 0 && wc7.TID != 18075 => false, // Ash Pikachu QR Gift doesn't set Current Handler WC8 wc8 when wc8.GetHasOT(pkm.Language) => false, WB8 wb8 when wb8.GetHasOT(pkm.Language) => false, + WA8 wa8 when wa8.GetHasOT(pkm.Language) => false, WC8 {IsHOMEGift: true} => false, _ => true, }; diff --git a/PKHeX.Core/Legality/Verifiers/HyperTrainingVerifier.cs b/PKHeX.Core/Legality/Verifiers/HyperTrainingVerifier.cs index a651e83111f..00d1b22fbfc 100644 --- a/PKHeX.Core/Legality/Verifiers/HyperTrainingVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/HyperTrainingVerifier.cs @@ -18,6 +18,12 @@ public override void Verify(LegalityAnalysis data) if (!t.IsHyperTrained()) return; + if (!t.IsHyperTrainingAvailable()) + { + data.AddLine(GetInvalid(LHyperPerfectUnavailable)); + return; + } + if (pkm.CurrentLevel != 100) { data.AddLine(GetInvalid(LHyperBelow100)); diff --git a/PKHeX.Core/Legality/Verifiers/LegendsArceusVerifier.cs b/PKHeX.Core/Legality/Verifiers/LegendsArceusVerifier.cs new file mode 100644 index 00000000000..5747e2d3de9 --- /dev/null +++ b/PKHeX.Core/Legality/Verifiers/LegendsArceusVerifier.cs @@ -0,0 +1,238 @@ +using System; +using System.Collections.Generic; +using static PKHeX.Core.LegalityCheckStrings; + +namespace PKHeX.Core; + +/// +/// Verifies the stat details of data that has not yet left . +/// +public sealed class LegendsArceusVerifier : Verifier +{ + protected override CheckIdentifier Identifier => CheckIdentifier.RelearnMove; + + public override void Verify(LegalityAnalysis data) + { + var pk = data.pkm; + if (!pk.LA || pk is not PA8 pa) + return; + + CheckLearnset(data, pa); + CheckMastery(data, pa); + + if (pa.IsNoble) + data.AddLine(GetInvalid(LStatNobleInvalid)); + if (pa.IsAlpha != data.EncounterMatch is IAlpha { IsAlpha: true }) + data.AddLine(GetInvalid(LStatAlphaInvalid)); + + CheckScalars(data, pa); + } + + private void CheckScalars(LegalityAnalysis data, PA8 pa) + { + // Static encounters hard-match the Height & Weight; only slots are unchecked for Alpha Height/Weight. + if (pa.IsAlpha && data.EncounterMatch is EncounterSlot8a) + { + if (pa.HeightScalar != 255) + data.AddLine(GetInvalid(LStatIncorrectHeightValue)); + if (pa.WeightScalar != 255) + data.AddLine(GetInvalid(LStatIncorrectWeightValue)); + } + + // No way to mutate the display height scalar value. Must match! + if (pa.HeightScalar != pa.HeightScalarCopy) + data.AddLine(GetInvalid(LStatIncorrectHeightCopy, CheckIdentifier.Encounter)); + } + + private static void CheckLearnset(LegalityAnalysis data, PA8 pa) + { + var moveCount = GetMoveCount(pa); + if (moveCount == 4) + return; + + // Get the bare minimum moveset. + Span expect = stackalloc int[4]; + var minMoveCount = LoadBareMinimumMoveset(data.EncounterMatch, data.Info.EvoChainsAllGens[8], pa, expect); + + // Flag move slots that are empty. + for (int i = moveCount; i < minMoveCount; i++) + { + // Expected move should never be empty, but just future-proof against any revisions. + var msg = expect[i] != 0 ? string.Format(LMoveFExpect_0, ParseSettings.MoveStrings[expect[i]]) : LMoveSourceEmpty; + data.Info.Moves[i] = new CheckMoveResult(data.Info.Moves[i], Severity.Invalid, msg, CheckIdentifier.CurrentMove); + } + } + + /// + /// Gets the expected minimum count of moves, and modifies the input with the bare minimum move IDs. + /// + private static int LoadBareMinimumMoveset(ISpeciesForm enc, IReadOnlyList evos, PA8 pa, Span moves) + { + // Get any encounter moves + var pt = PersonalTable.LA; + var index = pt.GetFormIndex(enc.Species, enc.Form); + var moveset = Legal.LevelUpLA[index]; + moveset.SetEncounterMoves(pa.Met_Level, moves); + var count = moves.IndexOf(0); + if ((uint)count >= 4) + return 4; + + // Level up to current level + moveset.SetLevelUpMoves(pa.Met_Level, pa.CurrentLevel, moves, count); + count = moves.IndexOf(0); + if ((uint)count >= 4) + return 4; + + // Evolve and try + for (int i = 0; i < evos.Count - 1; i++) + { + var (species, form) = evos[i]; + index = pt.GetFormIndex(species, form); + moveset = Legal.LevelUpLA[index]; + moveset.SetEvolutionMoves(moves, count); + count = moves.IndexOf(0); + if ((uint)count >= 4) + return 4; + } + + // Any tutored moves we don't know about?? + return AddMasteredMissing(pa, moves, count); + } + + private static int AddMasteredMissing(PA8 pa, Span current, int ctr) + { + for (int i = 0; i < pa.MoveShopPermitIndexes.Length; i++) + { + // Buying the move tutor grants access, but does not learn the move. + // Mastering requires the move to be present in the movepool. + if (!pa.GetMasteredRecordFlag(i)) + continue; + + // Purchased moves can be swapped with existing moves; we're only interested in special granted moves. + if (pa.GetPurchasedRecordFlag(i)) + continue; + + var move = pa.MoveShopPermitIndexes[i]; + if (current.IndexOf(move) == -1) + current[ctr++] = move; + if (ctr == 4) + return 4; + } + return ctr; + } + + private static int GetMoveCount(PKM pa) + { + var count = 0; + for (int i = 0; i < 4; i++) + { + if (pa.GetMove(i) is not 0) + count++; + } + return count; + } + + private void CheckMastery(LegalityAnalysis data, PA8 pa) + { + var bits = pa.MoveShopPermitFlags; + var moves = pa.MoveShopPermitIndexes; + var alphaMove = pa.AlphaMove; + if (alphaMove is not 0) + VerifyAlphaMove(data, pa, alphaMove, moves, bits); + else + VerifyAlphaMoveZero(data); + + for (int i = 0; i < bits.Length; i++) + VerifyTutorMoveIndex(data, pa, i, bits, moves); + } + + private void VerifyTutorMoveIndex(LegalityAnalysis data, PA8 pa, int i, ReadOnlySpan bits, ReadOnlySpan moves) + { + bool isPurchased = pa.GetPurchasedRecordFlag(i); + if (isPurchased) + { + // Check if the move can be purchased. + if (bits[i]) + return; // If it has been legally purchased, then any mastery state is legal. + + data.AddLine(GetInvalid(string.Format(LMoveShopPurchaseInvalid_0, ParseSettings.MoveStrings[moves[i]]))); + return; + } + + bool isMastered = pa.GetMasteredRecordFlag(i); + if (!isMastered) + return; // All good. + + // Check if the move can be purchased; using a Mastery Seed checks the permission. + if (pa.AlphaMove == moves[i]) + return; // Previously checked. + if (data.EncounterMatch is IAlpha { IsAlpha: true } && CanMasterMoveFromMoveShop(moves[i], moves, bits)) + return; // Alpha forced move. + if (!bits[i]) + data.AddLine(GetInvalid(string.Format(LMoveShopMasterInvalid_0, ParseSettings.MoveStrings[moves[i]]))); + else if (!CanLearnMoveByLevelUp(data, pa, i, moves)) + data.AddLine(GetInvalid(string.Format(LMoveShopMasterNotLearned_0, ParseSettings.MoveStrings[moves[i]]))); + } + + private static bool CanLearnMoveByLevelUp(LegalityAnalysis data, PA8 pa, int i, ReadOnlySpan moves) + { + // Check if the move can be learned in the learnset... + // Changing forms do not have separate tutor permissions, so we don't need to bother with form changes. + // Level up movepools can grant moves for mastery at lower levels for earlier evolutions... find the minimum. + int level = 101; + foreach (var (species, form) in data.Info.EvoChainsAllGens[8]) + { + var pt = PersonalTable.LA; + var index = pt.GetFormIndex(species, form); + var moveset = Legal.LevelUpLA[index]; + var lvl = moveset.GetLevelLearnMove(moves[i]); + if (lvl == -1) + continue; // cannot learn via level up + level = Math.Min(lvl, level); + } + return pa.CurrentLevel >= level; + } + + private void VerifyAlphaMove(LegalityAnalysis data, PA8 pa, int alphaMove, ReadOnlySpan moves, ReadOnlySpan bits) + { + if (!pa.IsAlpha) + { + data.AddLine(GetInvalid(LMoveShopAlphaMoveShouldBeZero)); + return; + } + if (!CanMasterMoveFromMoveShop(alphaMove, moves, bits)) + { + data.AddLine(GetInvalid(LMoveShopAlphaMoveShouldBeOther)); + return; + } + + // An Alpha Move must be marked as mastered. + var masteredIndex = moves.IndexOf(alphaMove); + // Index is already >= 0, implicitly via the above call not returning false. + if (!pa.GetMasteredRecordFlag(masteredIndex)) + data.AddLine(GetInvalid(LMoveShopAlphaMoveShouldBeMastered)); + } + + private void VerifyAlphaMoveZero(LegalityAnalysis data) + { + var enc = data.Info.EncounterMatch; + if (enc is IAlpha { IsAlpha: false }) + return; // okay + + var pi = PersonalTable.LA.GetFormEntry(enc.Species, enc.Form); + var tutors = pi.SpecialTutors[0]; + bool hasAnyTutor = Array.IndexOf(tutors, true) >= 0; + if (hasAnyTutor) // must have had a tutor flag + data.AddLine(GetInvalid(LMoveShopAlphaMoveShouldBeOther)); + } + + private static bool CanMasterMoveFromMoveShop(int move, ReadOnlySpan moves, ReadOnlySpan bits) + { + var index = moves.IndexOf(move); + if (index == -1) + return false; // not in the list + if (!bits[index]) + return false; // not a possible move + return true; + } +} diff --git a/PKHeX.Core/Legality/Verifiers/MemoryVerifier.cs b/PKHeX.Core/Legality/Verifiers/MemoryVerifier.cs index a2971c67041..5ed8bc37911 100644 --- a/PKHeX.Core/Legality/Verifiers/MemoryVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/MemoryVerifier.cs @@ -14,10 +14,11 @@ public sealed class MemoryVerifier : Verifier public override void Verify(LegalityAnalysis data) { - if (data.pkm.BDSP) + var pkm = data.pkm; + if (pkm.BDSP || pkm.LA) { VerifyOTMemoryIs(data, 0, 0, 0, 0); - VerifyHTMemoryNone(data, (ITrainerMemories)data.pkm); + VerifyHTMemoryNone(data, (ITrainerMemories)pkm); return; } VerifyOTMemory(data); @@ -259,6 +260,7 @@ private static bool CanHaveMemoryForOT(PKM pkm, int origin, int memory) case 8 when pkm.GO_HOME: // HOME does not set memories. case 8 when pkm.Met_Location == Locations.HOME8: // HOME does not set memories. case 8 when pkm.BDSP: // BDSP does not set memories. + case 8 when pkm.LA: // LA does not set memories. return false; // Eggs cannot have memories diff --git a/PKHeX.Core/Legality/Verifiers/MiscVerifier.cs b/PKHeX.Core/Legality/Verifiers/MiscVerifier.cs index 80ae078409c..a78491fd349 100644 --- a/PKHeX.Core/Legality/Verifiers/MiscVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/MiscVerifier.cs @@ -62,6 +62,9 @@ public override void Verify(LegalityAnalysis data) case PB8 pb8: VerifyBDSPStats(data, pb8); break; + case PA8 pa8: + VerifyPLAStats(data, pa8); + break; } if (pkm.Format >= 6) @@ -113,8 +116,34 @@ public override void Verify(LegalityAnalysis data) } VerifyMiscFatefulEncounter(data); + VerifyMiscPokerus(data); + } + + private void VerifyMiscPokerus(LegalityAnalysis data) + { + var pkm = data.pkm; + if (pkm.Format == 1) + return; + + var strain = pkm.PKRS_Strain; + var days = pkm.PKRS_Days; + bool strainValid = IsPokerusStrainValid(pkm, strain, days); + if (!strainValid) + data.AddLine(GetInvalid(string.Format(LPokerusStrainUnobtainable_0, strain))); + + var expect = (strain % 4) + 1; + if (days > expect) + data.AddLine(GetInvalid(string.Format(LPokerusDaysTooHigh_0, expect))); } + private static bool IsPokerusStrainValid(PKM pkm, int strain, int days) => strain switch + { + 0 when days is not 0 => false, + 8 => false, + not 0 when pkm is PA8 => false, + _ => true, + }; + public void VerifyMiscG1(LegalityAnalysis data) { var pkm = data.pkm; @@ -246,6 +275,19 @@ private static void VerifyMiscFatefulEncounter(LegalityAnalysis data) private static void VerifyMiscMovePP(LegalityAnalysis data) { var pkm = data.pkm; + + if (pkm is PA8) // No PP Ups + { + if (pkm.Move1_PPUps is not 0) + data.AddLine(GetInvalid(string.Format(LMovePPUpsTooHigh_0, 1), CurrentMove)); + if (pkm.Move2_PPUps is not 0) + data.AddLine(GetInvalid(string.Format(LMovePPUpsTooHigh_0, 2), CurrentMove)); + if (pkm.Move3_PPUps is not 0) + data.AddLine(GetInvalid(string.Format(LMovePPUpsTooHigh_0, 3), CurrentMove)); + if (pkm.Move4_PPUps is not 0) + data.AddLine(GetInvalid(string.Format(LMovePPUpsTooHigh_0, 4), CurrentMove)); + } + if (pkm.Move1_PP > pkm.GetMovePP(pkm.Move1, pkm.Move1_PPUps)) data.AddLine(GetInvalid(string.Format(LMovePPTooHigh_0, 1), CurrentMove)); if (pkm.Move2_PP > pkm.GetMovePP(pkm.Move2, pkm.Move2_PPUps)) @@ -275,11 +317,11 @@ private static void VerifyMiscEggCommon(LegalityAnalysis data) data.AddLine(GetInvalid(msg, Egg)); } - if (pkm is G8PKM pk8) + if (pkm is ITechRecord8 pk8) { - if (pk8.HasAnyMoveRecordFlag()) + if (pk8.GetMoveRecordFlagAny()) data.AddLine(GetInvalid(LEggRelearnFlags, Egg)); - if (pk8.StatNature != pk8.Nature) + if (pkm.StatNature != pkm.Nature) data.AddLine(GetInvalid(LEggNature, Egg)); } } @@ -331,6 +373,7 @@ private static void VerifyReceivability(LegalityAnalysis data, MysteryGift g) case WC7 wc7 when !wc7.CanBeReceivedByVersion(pkm.Version) && !pkm.WasTradedEgg: case WC8 wc8 when !wc8.CanBeReceivedByVersion(pkm.Version): case WB8 wb8 when !wb8.CanBeReceivedByVersion(pkm.Version): + case WA8 wa8 when !wa8.CanBeReceivedByVersion(pkm.Version): data.AddLine(GetInvalid(LEncGiftVersionNotDistributed, GameOrigin)); return; case WC6 wc6 when wc6.RestrictLanguage != 0 && pkm.Language != wc6.RestrictLanguage: @@ -423,15 +466,20 @@ private static void VerifyFullness(LegalityAnalysis data, PKM pkm) }; private static void VerifyBelugaStats(LegalityAnalysis data, PB7 pb7) + { + VerifyAbsoluteSizes(data, pb7); + if (pb7.Stat_CP != pb7.CalcCP && !IsStarterLGPE(pb7)) + data.AddLine(GetInvalid(LStatIncorrectCP, Encounter)); + } + + private static void VerifyAbsoluteSizes(LegalityAnalysis data, IScaledSizeValue obj) { // ReSharper disable once CompareOfFloatsByEqualityOperator -- THESE MUST MATCH EXACTLY - if (!IsCloseEnough(pb7.HeightAbsolute, pb7.CalcHeightAbsolute)) + if (!IsCloseEnough(obj.HeightAbsolute, obj.CalcHeightAbsolute)) data.AddLine(GetInvalid(LStatIncorrectHeight, Encounter)); // ReSharper disable once CompareOfFloatsByEqualityOperator -- THESE MUST MATCH EXACTLY - if (!IsCloseEnough(pb7.WeightAbsolute, pb7.CalcWeightAbsolute)) + if (!IsCloseEnough(obj.WeightAbsolute, obj.CalcWeightAbsolute)) data.AddLine(GetInvalid(LStatIncorrectWeight, Encounter)); - if (pb7.Stat_CP != pb7.CalcCP && !IsStarterLGPE(pb7)) - data.AddLine(GetInvalid(LStatIncorrectCP, Encounter)); } private static bool IsCloseEnough(float a, float b) @@ -518,6 +566,40 @@ private void VerifySWSHStats(LegalityAnalysis data, PK8 pk8) data.AddLine(Get(LStatInvalidHeightWeight, ParseSettings.ZeroHeightWeight, Encounter)); } + private void VerifyPLAStats(LegalityAnalysis data, PA8 pa8) + { + VerifyAbsoluteSizes(data, pa8); + + if (pa8.Favorite) + data.AddLine(GetInvalid(LFavoriteMarkingUnavailable, Encounter)); + + var affix = pa8.AffixedRibbon; + if (affix != -1) // None + data.AddLine(GetInvalid(string.Format(LRibbonMarkingAffixedF_0, affix))); + + var social = pa8.Sociability; + if (social != 0) + data.AddLine(GetInvalid(LMemorySocialZero, Encounter)); + + VerifyStatNature(data, pa8); + + var bv = pa8.BattleVersion; + if (bv != 0) + data.AddLine(GetInvalid(LStatBattleVersionInvalid)); + + if (pa8.CanGigantamax) + data.AddLine(GetInvalid(LStatGigantamaxInvalid)); + + if (pa8.DynamaxLevel != 0) + data.AddLine(GetInvalid(LStatDynamaxInvalid)); + + if (pa8.GetMoveRecordFlagAny() && !pa8.IsEgg) // already checked for eggs + data.AddLine(GetInvalid(LEggRelearnFlags)); + + if (CheckHeightWeightOdds(data.EncounterMatch) && pa8.HeightScalar == 0 && pa8.WeightScalar == 0 && ParseSettings.ZeroHeightWeight != Severity.Valid) + data.AddLine(Get(LStatInvalidHeightWeight, ParseSettings.ZeroHeightWeight, Encounter)); + } + private void VerifyBDSPStats(LegalityAnalysis data, PB8 pb8) { if (pb8.Favorite) @@ -543,7 +625,7 @@ private void VerifyBDSPStats(LegalityAnalysis data, PB8 pb8) if (pb8.DynamaxLevel != 0) data.AddLine(GetInvalid(LStatDynamaxInvalid)); - if (pb8.HasAnyMoveRecordFlag() && !pb8.IsEgg) // already checked for eggs + if (pb8.GetMoveRecordFlagAny() && !pb8.IsEgg) // already checked for eggs data.AddLine(GetInvalid(LEggRelearnFlags)); if (CheckHeightWeightOdds(data.EncounterMatch) && pb8.HeightScalar == 0 && pb8.WeightScalar == 0 && ParseSettings.ZeroHeightWeight != Severity.Valid) @@ -555,7 +637,7 @@ private static bool CheckHeightWeightOdds(IEncounterTemplate enc) if (enc.Generation < 8) return false; - if (GameVersion.BDSP.Contains(enc.Version)) + if (GameVersion.BDSP.Contains(enc.Version) || GameVersion.PLA == enc.Version) return true; if (enc is WC8 { IsHOMEGift: true }) diff --git a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonVerifier.cs b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonVerifier.cs index 73cfcd68a36..20b06dcc915 100644 --- a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonVerifier.cs @@ -467,8 +467,8 @@ private static IEnumerable GetInvalidRibbons8Any(PKM pkm, IRibbonS yield return new RibbonResult(nameof(s8.RibbonTwinklingStar)); } - // new ribbon likely from Legends: Arceus; inaccessible until then - if (s8.RibbonPioneer) + // received when capturing photos with Pokémon in the Photography Studio + if (s8.RibbonPioneer && !pkm.LA) { yield return new RibbonResult(nameof(s8.RibbonPioneer)); } diff --git a/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs b/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs index 3d94c8d680b..9f9e18180e3 100644 --- a/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/TransferVerifier.cs @@ -125,16 +125,21 @@ public void VerifyTransferLegalityG4(LegalityAnalysis data) public void VerifyTransferLegalityG8(LegalityAnalysis data) { var pkm = data.pkm; + if (pkm is PA8 pa8) + { + VerifyTransferLegalityG8a(data, pa8); + return; + } if (pkm is PB8 pb8) { - VerifyTransferLegalityG8(data, pb8); + VerifyTransferLegalityG8b(data, pb8); return; } // PK8 int species = pkm.Species; var pi = (PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(species, pkm.Form); - if (!pi.IsPresentInGame || pkm.BDSP) // Can't transfer + if (!pi.IsPresentInGame || pkm.BDSP || pkm.LA) // Can't transfer { data.AddLine(GetInvalid(LTransferBad)); return; @@ -159,9 +164,20 @@ public void VerifyTransferLegalityG8(LegalityAnalysis data) VerifyHOMETracker(data, pkm); } } + private void VerifyTransferLegalityG8a(LegalityAnalysis data, PA8 pk) + { + // Tracker value is set via Transfer across HOME. + // No HOME access yet. + if (pk is IHomeTrack { Tracker: not 0 }) + data.AddLine(GetInvalid(LTransferTrackerShouldBeZero)); + + var pi = (PersonalInfoLA)PersonalTable.LA.GetFormEntry(pk.Species, pk.Form); + if (!pi.IsPresentInGame || !pk.LA) // Can't transfer + data.AddLine(GetInvalid(LTransferBad)); + } // bdsp logic - private void VerifyTransferLegalityG8(LegalityAnalysis data, PB8 pk) + private void VerifyTransferLegalityG8b(LegalityAnalysis data, PB8 pk) { // Tracker value is set via Transfer across HOME. // No HOME access yet. diff --git a/PKHeX.Core/MysteryGifts/MysteryGift.cs b/PKHeX.Core/MysteryGifts/MysteryGift.cs index f779186b366..599fb81b594 100644 --- a/PKHeX.Core/MysteryGifts/MysteryGift.cs +++ b/PKHeX.Core/MysteryGifts/MysteryGift.cs @@ -17,7 +17,7 @@ public abstract class MysteryGift : IEncounterable, IMoveset, IRelearn /// A boolean indicating whether or not the given length is valid for a mystery gift. public static bool IsMysteryGift(long len) => Sizes.Contains((int)len); - private static readonly HashSet Sizes = new() { WB8.Size, WC8.Size, WC6Full.Size, WC6.Size, PGF.Size, PGT.Size, PCD.Size }; + private static readonly HashSet Sizes = new() { WA8.Size, WB8.Size, WC8.Size, WC6Full.Size, WC6.Size, PGF.Size, PGT.Size, PCD.Size }; /// /// Converts the given data to a . @@ -37,6 +37,7 @@ public abstract class MysteryGift : IEncounterable, IMoveset, IRelearn WR7.Size when ext == ".wr7" => new WR7(data), WC8.Size when ext is ".wc8" or ".wc8full" => new WC8(data), WB8.Size when ext is ".wb8" => new WB8(data), + WA8.Size when ext is ".wa8" => new WA8(data), WB7.SizeFull when ext == ".wb7full" => new WB7(data), WC6Full.Size when ext == ".wc6full" => new WC6Full(data).Gift, @@ -57,6 +58,7 @@ public abstract class MysteryGift : IEncounterable, IMoveset, IRelearn WR7.Size => new WR7(data), WC8.Size => new WC8(data), WB8.Size => new WB8(data), + WA8.Size => new WA8(data), // WC6/WC7: Check year WC6.Size => ReadUInt32LittleEndian(data.AsSpan(0x4C)) / 10000 < 2000 ? new WC7(data) : new WC6(data), diff --git a/PKHeX.Core/MysteryGifts/WA8.cs b/PKHeX.Core/MysteryGifts/WA8.cs new file mode 100644 index 00000000000..5825384742d --- /dev/null +++ b/PKHeX.Core/MysteryGifts/WA8.cs @@ -0,0 +1,773 @@ +using System; +using System.Collections.Generic; +using static PKHeX.Core.RibbonIndex; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core +{ + /// + /// Generation 8 Mystery Gift Template File, same as with fields at the end. + /// + public sealed class WA8 : DataMysteryGift, ILangNick, INature, IGigantamax, IDynamaxLevel, IRibbonIndex, IMemoryOT, ILangNicknamedTemplate, IGanbaru, + IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IRibbonSetCommon7, IRibbonSetCommon8, IRibbonSetMark8 + { + public const int Size = 0x2C8; + + public override int Generation => 8; + + public enum GiftType : byte + { + None = 0, + Pokemon = 1, + Item = 2, + } + + public WA8() : this(new byte[Size]) { } + public WA8(byte[] data) : base(data) { } + + public bool CanBeReceivedByVersion(int v) => v is (int) GameVersion.PLA; + + // General Card Properties + public override int CardID + { + get => ReadUInt16LittleEndian(Data.AsSpan(0x8)); + set => WriteUInt16LittleEndian(Data.AsSpan(0x8), (ushort)value); + } + + public byte CardFlags { get => Data[0x10]; set => Data[0x10] = value; } + public GiftType CardType { get => (GiftType)Data[0x11]; set => Data[0x11] = (byte)value; } + public bool GiftRepeatable { get => (CardFlags & 1) == 0; set => CardFlags = (byte)((CardFlags & ~1) | (value ? 0 : 1)); } + public override bool GiftUsed { get => false; set { } } + + public int CardTitleIndex + { + get => Data[0x13]; + set => Data[0x13] = (byte) value; + } + + public override string CardTitle + { + get => "Mystery Gift"; // TODO: Use text string from CardTitleIndex + set => throw new Exception(); + } + + // Item Properties + public override bool IsItem { get => CardType == GiftType.Item; set { if (value) CardType = GiftType.Item; } } + + public override int ItemID + { + get => GetItem(0); + set => SetItem(0, (ushort)value); + } + + public override int Quantity + { + get => GetQuantity(0); + set => SetQuantity(0, (ushort)value); + } + + public int GetItem(int index) => ReadUInt16LittleEndian(Data.AsSpan(0x18 + (0x4 * index))); + public void SetItem(int index, ushort item) => WriteUInt16LittleEndian(Data.AsSpan(0x18 + (4 * index)), item); + public int GetQuantity(int index) => ReadUInt16LittleEndian(Data.AsSpan(0x1A + (0x4 * index))); + public void SetQuantity(int index, ushort quantity) => WriteUInt16LittleEndian(Data.AsSpan(0x1A + (4 * index)), quantity); + + // Pokémon Properties + public override bool IsPokémon { get => CardType == GiftType.Pokemon; set { if (value) CardType = GiftType.Pokemon; } } + + public override bool IsShiny => Shiny.IsShiny(); + + public override Shiny Shiny + { + get + { + var type = PIDType; + if (type is not Shiny.FixedValue) + return type; + return GetShinyXor() switch + { + 0 => Shiny.AlwaysSquare, + <= 15 => Shiny.AlwaysStar, + _ => Shiny.Never, + }; + } + } + + private int GetShinyXor() + { + // Player owned anti-shiny fixed PID + if (TID == 0 && SID == 0) + return int.MaxValue; + + var pid = PID; + var psv = (int)(pid >> 16 ^ (pid & 0xFFFF)); + var tsv = (TID ^ SID); + return psv ^ tsv; + } + + public override int TID + { + get => ReadUInt16LittleEndian(Data.AsSpan(0x18)); + set => WriteUInt16LittleEndian(Data.AsSpan(0x18), (ushort)value); + } + + public override int SID { + get => ReadUInt16LittleEndian(Data.AsSpan(0x1A)); + set => WriteUInt16LittleEndian(Data.AsSpan(0x1A), (ushort)value); + } + + public int OriginGame + { + get => ReadInt32LittleEndian(Data.AsSpan(0x1C)); + set => WriteInt32LittleEndian(Data.AsSpan(0x1C), value); + } + + public uint EncryptionConstant + { + get => ReadUInt32LittleEndian(Data.AsSpan(0x20)); + set => WriteUInt32LittleEndian(Data.AsSpan(0x20), value); + } + + public uint PID + { + get => ReadUInt32LittleEndian(Data.AsSpan(0x24)); + set => WriteUInt32LittleEndian(Data.AsSpan(0x24), value); + } + + // Nicknames, OT Names 0x30 - 0x228 + public override int EggLocation { get => ReadUInt16LittleEndian(Data.AsSpan(0x220)); set => WriteUInt16LittleEndian(Data.AsSpan(0x220), (ushort)value); } + public int MetLocation { get => ReadUInt16LittleEndian(Data.AsSpan(0x222)); set => WriteUInt16LittleEndian(Data.AsSpan(0x222), (ushort)value); } + + public override int Ball + { + get => ReadUInt16LittleEndian(Data.AsSpan(0x224)); + set => WriteUInt16LittleEndian(Data.AsSpan(0x224), (ushort)value); + } + + public override int HeldItem + { + get => ReadUInt16LittleEndian(Data.AsSpan(0x226)); + set => WriteUInt16LittleEndian(Data.AsSpan(0x226), (ushort)value); + } + + public int Move1 { get => ReadUInt16LittleEndian(Data.AsSpan(0x228)); set => WriteUInt16LittleEndian(Data.AsSpan(0x228), (ushort)value); } + public int Move2 { get => ReadUInt16LittleEndian(Data.AsSpan(0x22A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x22A), (ushort)value); } + public int Move3 { get => ReadUInt16LittleEndian(Data.AsSpan(0x22C)); set => WriteUInt16LittleEndian(Data.AsSpan(0x22C), (ushort)value); } + public int Move4 { get => ReadUInt16LittleEndian(Data.AsSpan(0x22E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x22E), (ushort)value); } + public int RelearnMove1 { get => ReadUInt16LittleEndian(Data.AsSpan(0x230)); set => WriteUInt16LittleEndian(Data.AsSpan(0x230), (ushort)value); } + public int RelearnMove2 { get => ReadUInt16LittleEndian(Data.AsSpan(0x232)); set => WriteUInt16LittleEndian(Data.AsSpan(0x232), (ushort)value); } + public int RelearnMove3 { get => ReadUInt16LittleEndian(Data.AsSpan(0x234)); set => WriteUInt16LittleEndian(Data.AsSpan(0x234), (ushort)value); } + public int RelearnMove4 { get => ReadUInt16LittleEndian(Data.AsSpan(0x236)); set => WriteUInt16LittleEndian(Data.AsSpan(0x236), (ushort)value); } + + public override int Species { get => ReadUInt16LittleEndian(Data.AsSpan(0x238)); set => WriteUInt16LittleEndian(Data.AsSpan(0x238), (ushort)value); } + public override int Form { get => Data[0x23A]; set => Data[0x23A] = (byte)value; } + public override int Gender { get => Data[0x23B]; set => Data[0x23B] = (byte)value; } + public override int Level { get => Data[0x23C]; set => Data[0x23C] = (byte)value; } + public override bool IsEgg { get => Data[0x23D] == 1; set => Data[0x23D] = value ? (byte)1 : (byte)0; } + public int Nature { get => (sbyte)Data[0x23E]; set => Data[0x23E] = (byte)value; } + public override int AbilityType { get => Data[0x23F]; set => Data[0x23F] = (byte)value; } + + private byte PIDTypeValue => Data[0x240]; + + public Shiny PIDType => PIDTypeValue switch + { + 0 => Shiny.Never, + 1 => Shiny.Random, + 2 => Shiny.AlwaysStar, + 3 => Shiny.AlwaysSquare, + 4 => Shiny.FixedValue, + _ => throw new ArgumentOutOfRangeException(nameof(PIDType)), + }; + + public int MetLevel { get => Data[0x241]; set => Data[0x241] = (byte)value; } + public byte DynamaxLevel { get => Data[0x242]; set => Data[0x242] = value; } + public bool CanGigantamax { get => Data[0x243] != 0; set => Data[0x243] = value ? (byte)1 : (byte)0; } + + // Ribbons 0x24C-0x26C + private const int RibbonBytesOffset = 0x244; + private const int RibbonBytesCount = 0x20; + private const int RibbonByteNone = 0xFF; // signed -1 + + public bool HasMark() + { + for (int i = 0; i < RibbonBytesCount; i++) + { + var value = Data[RibbonBytesOffset + i]; + if (value == RibbonByteNone) + return false; + if ((RibbonIndex)value is >= MarkLunchtime and <= MarkSlump) + return true; + } + return false; + } + + public byte GetRibbonAtIndex(int byteIndex) + { + if ((uint)byteIndex >= RibbonBytesCount) + throw new IndexOutOfRangeException(); + return Data[RibbonBytesOffset + byteIndex]; + } + + public void SetRibbonAtIndex(int byteIndex, byte ribbonIndex) + { + if ((uint)byteIndex >= RibbonBytesCount) + throw new IndexOutOfRangeException(); + Data[RibbonBytesOffset + byteIndex] = ribbonIndex; + } + + public int IV_HP { get => Data[0x264]; set => Data[0x264] = (byte)value; } + public int IV_ATK { get => Data[0x265]; set => Data[0x265] = (byte)value; } + public int IV_DEF { get => Data[0x266]; set => Data[0x266] = (byte)value; } + public int IV_SPE { get => Data[0x267]; set => Data[0x267] = (byte)value; } + public int IV_SPA { get => Data[0x268]; set => Data[0x268] = (byte)value; } + public int IV_SPD { get => Data[0x269]; set => Data[0x269] = (byte)value; } + + public int OTGender { get => Data[0x26A]; set => Data[0x26A] = (byte)value; } + + public int EV_HP { get => Data[0x26B]; set => Data[0x26B] = (byte)value; } + public int EV_ATK { get => Data[0x26C]; set => Data[0x26C] = (byte)value; } + public int EV_DEF { get => Data[0x26D]; set => Data[0x26D] = (byte)value; } + public int EV_SPE { get => Data[0x26E]; set => Data[0x26E] = (byte)value; } + public int EV_SPA { get => Data[0x26F]; set => Data[0x26F] = (byte)value; } + public int EV_SPD { get => Data[0x270]; set => Data[0x270] = (byte)value; } + + public int OT_Intensity { get => Data[0x271]; set => Data[0x271] = (byte)value; } + public int OT_Memory { get => Data[0x272]; set => Data[0x272] = (byte)value; } + public int OT_Feeling { get => Data[0x273]; set => Data[0x273] = (byte)value; } + public int OT_TextVar { get => ReadUInt16LittleEndian(Data.AsSpan(0x274)); set => WriteUInt16LittleEndian(Data.AsSpan(0x274), (ushort)value); } + + // Only derivations to WC8 + public int GV_HP { get => Data[0x27E]; set => Data[0x27E] = (byte)value; } + public int GV_ATK { get => Data[0x27F]; set => Data[0x27F] = (byte)value; } + public int GV_DEF { get => Data[0x280]; set => Data[0x280] = (byte)value; } + public int GV_SPE { get => Data[0x281]; set => Data[0x281] = (byte)value; } + public int GV_SPA { get => Data[0x282]; set => Data[0x282] = (byte)value; } + public int GV_SPD { get => Data[0x283]; set => Data[0x283] = (byte)value; } + + // Meta Accessible Properties + public override int[] IVs + { + get => new[] { IV_HP, IV_ATK, IV_DEF, IV_SPE, IV_SPA, IV_SPD }; + set + { + if (value.Length != 6) return; + IV_HP = value[0]; IV_ATK = value[1]; IV_DEF = value[2]; + IV_SPE = value[3]; IV_SPA = value[4]; IV_SPD = value[5]; + } + } + + public int[] EVs + { + get => new[] { EV_HP, EV_ATK, EV_DEF, EV_SPE, EV_SPA, EV_SPD }; + set + { + if (value.Length != 6) return; + EV_HP = value[0]; EV_ATK = value[1]; EV_DEF = value[2]; + EV_SPE = value[3]; EV_SPA = value[4]; EV_SPD = value[5]; + } + } + + public bool GetIsNicknamed(int language) => ReadUInt16LittleEndian(Data.AsSpan(GetNicknameOffset(language))) != 0; + + public bool CanBeAnyLanguage() + { + for (int i = 0; i < 9; i++) + { + var ofs = GetLanguageOffset(i); + var lang = ReadInt16LittleEndian(Data.AsSpan(ofs)); + if (lang != 0) + return false; + } + return true; + } + + public bool CanHaveLanguage(int language) + { + if (language is < (int)LanguageID.Japanese or > (int)LanguageID.ChineseT) + return false; + + if (CanBeAnyLanguage()) + return true; + + for (int i = 0; i < 9; i++) + { + var ofs = GetLanguageOffset(i); + var lang = ReadInt16LittleEndian(Data.AsSpan(ofs)); + if (lang == language) + return true; + } + return false; + } + + public int GetLanguage(int redeemLanguage) => Data[GetLanguageOffset(GetLanguageIndex(redeemLanguage))]; + private static int GetLanguageOffset(int index) => 0x28 + (index * 0x1C) + 0x1A; + + public bool GetHasOT(int language) => ReadUInt16LittleEndian(Data.AsSpan(GetOTOffset(language))) != 0; + + private static int GetLanguageIndex(int language) + { + var lang = (LanguageID) language; + if (lang is < LanguageID.Japanese or LanguageID.UNUSED_6 or > LanguageID.ChineseT) + return (int) LanguageID.English; // fallback + return lang < LanguageID.UNUSED_6 ? language - 1 : language - 2; + } + + public override int Location { get => MetLocation; set => MetLocation = (ushort)value; } + + public override IReadOnlyList Moves + { + get => new[] { Move1, Move2, Move3, Move4 }; + set + { + if (value.Count > 0) Move1 = value[0]; + if (value.Count > 1) Move2 = value[1]; + if (value.Count > 2) Move3 = value[2]; + if (value.Count > 3) Move4 = value[3]; + } + } + + public override IReadOnlyList Relearn + { + get => new[] { RelearnMove1, RelearnMove2, RelearnMove3, RelearnMove4 }; + set + { + if (value.Count > 0) RelearnMove1 = value[0]; + if (value.Count > 1) RelearnMove2 = value[1]; + if (value.Count > 2) RelearnMove3 = value[2]; + if (value.Count > 3) RelearnMove4 = value[3]; + } + } + + public override string OT_Name { get; set; } = string.Empty; + public string Nickname => string.Empty; + public bool IsNicknamed => false; + public int Language => 2; + + public string GetNickname(int language) => StringConverter8.GetString(Data.AsSpan(GetNicknameOffset(language), 0x1A)); + public void SetNickname(int language, string value) => StringConverter8.SetString(Data.AsSpan(GetNicknameOffset(language), 0x1A), value.AsSpan(), 12, StringConverterOption.ClearZero); + + public string GetOT(int language) => StringConverter8.GetString(Data.AsSpan(GetOTOffset(language), 0x1A)); + public void SetOT(int language, string value) => StringConverter8.SetString(Data.AsSpan(GetOTOffset(language), 0x1A), value.AsSpan(), 12, StringConverterOption.ClearZero); + + private static int GetNicknameOffset(int language) + { + int index = GetLanguageIndex(language); + return 0x28 + (index * 0x1C); + } + + private static int GetOTOffset(int language) + { + int index = GetLanguageIndex(language); + return 0x124 + (index * 0x1C); + } + + public bool CanHandleOT(int language) => !GetHasOT(language); + + public override GameVersion Version + { + get => OriginGame != 0 ? (GameVersion)OriginGame : GameVersion.PLA; + set { } + } + + public override PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria) + { + if (!IsPokémon) + throw new ArgumentException(nameof(IsPokémon)); + + int currentLevel = Level > 0 ? Level : (1 + Util.Rand.Next(100)); + int metLevel = MetLevel > 0 ? MetLevel : currentLevel; + var pi = PersonalTable.LA.GetFormEntry(Species, Form); + var language = sav.Language; + var OT = GetOT(language); + bool hasOT = GetHasOT(language); + + var pk = new PA8 + { + EncryptionConstant = EncryptionConstant != 0 ? EncryptionConstant : Util.Rand32(), + TID = TID, + SID = SID, + Species = Species, + Form = Form, + CurrentLevel = currentLevel, + Ball = Ball != 0 ? Ball : 4, // Default is Pokeball + Met_Level = metLevel, + HeldItem = HeldItem, + + EXP = Experience.GetEXP(currentLevel, pi.EXPGrowth), + + Move1 = Move1, + Move2 = Move2, + Move3 = Move3, + Move4 = Move4, + RelearnMove1 = RelearnMove1, + RelearnMove2 = RelearnMove2, + RelearnMove3 = RelearnMove3, + RelearnMove4 = RelearnMove4, + + Version = OriginGame != 0 ? OriginGame : sav.Game, + + OT_Name = OT.Length > 0 ? OT : sav.OT, + OT_Gender = OTGender < 2 ? OTGender : sav.Gender, + HT_Name = hasOT ? sav.OT : string.Empty, + HT_Gender = hasOT ? sav.Gender : 0, + HT_Language = hasOT ? language : 0, + CurrentHandler = hasOT ? 1 : 0, + OT_Friendship = pi.BaseFriendship, + + OT_Intensity = OT_Intensity, + OT_Memory = OT_Memory, + OT_TextVar = OT_TextVar, + OT_Feeling = OT_Feeling, + FatefulEncounter = true, + + EVs = EVs, + + CanGigantamax = CanGigantamax, + DynamaxLevel = DynamaxLevel, + + Met_Location = MetLocation, + Egg_Location = EggLocation, + }; + pk.SetMaximumPPCurrent(); + + if ((sav.Generation > Generation && OriginGame == 0) || !CanBeReceivedByVersion(pk.Version)) + pk.Version = (int)GameVersion.PLA; + + if (OTGender >= 2) + { + pk.TID = sav.TID; + pk.SID = sav.SID; + } + + // Official code explicitly corrects for Meowstic + if (pk.Species == (int)Core.Species.Meowstic) + pk.Form = pk.Gender; + + pk.MetDate = DateTime.Now; + + var nickname_language = GetLanguage(language); + pk.Language = nickname_language != 0 ? nickname_language : sav.Language; + pk.IsNicknamed = GetIsNicknamed(language); + pk.Nickname = pk.IsNicknamed ? GetNickname(language) : SpeciesName.GetSpeciesNameGeneration(Species, pk.Language, Generation); + + for (var i = 0; i < RibbonBytesCount; i++) + { + var ribbon = GetRibbonAtIndex(i); + if (ribbon != RibbonByteNone) + pk.SetRibbon(ribbon); + } + + SetPINGA(pk, criteria); + + if (IsEgg) + SetEggMetData(pk); + pk.CurrentFriendship = pk.IsEgg ? pi.HatchCycles : pi.BaseFriendship; + + { + pk.HeightScalar = PokeSizeUtil.GetRandomScalar(); + pk.WeightScalar = PokeSizeUtil.GetRandomScalar(); + pk.HeightScalarCopy = pk.HeightScalar; + pk.ResetHeight(); + pk.ResetWeight(); + } + + pk.ResetPartyStats(); + pk.RefreshChecksum(); + return pk; + } + + private void SetEggMetData(PKM pk) + { + pk.IsEgg = true; + pk.EggMetDate = DateTime.Now; + pk.Nickname = SpeciesName.GetSpeciesNameGeneration(0, pk.Language, Generation); + pk.IsNicknamed = true; + } + + private void SetPINGA(PKM pk, EncounterCriteria criteria) + { + var pi = PersonalTable.LA.GetFormEntry(Species, Form); + pk.Nature = (int)criteria.GetNature(Nature == -1 ? Core.Nature.Random : (Nature)Nature); + pk.StatNature = pk.Nature; + pk.Gender = criteria.GetGender(Gender, pi); + var av = GetAbilityIndex(criteria); + pk.RefreshAbility(av); + SetPID(pk); + SetIVs(pk); + } + + private int GetAbilityIndex(EncounterCriteria criteria) => AbilityType switch + { + 00 or 01 or 02 => AbilityType, // Fixed 0/1/2 + 03 or 04 => criteria.GetAbilityFromNumber(Ability), // 0/1 or 0/1/H + _ => throw new ArgumentOutOfRangeException(nameof(AbilityType)), + }; + + public override AbilityPermission Ability => AbilityType switch + { + 0 => AbilityPermission.OnlyFirst, + 1 => AbilityPermission.OnlySecond, + 2 => AbilityPermission.OnlyHidden, + 3 => AbilityPermission.Any12, + _ => AbilityPermission.Any12H, + }; + + private uint GetPID(ITrainerID tr, byte type) + { + return type switch + { + 0 => GetAntishiny(tr), // Random, Never Shiny + 1 => Util.Rand32(), // Random, Any + 2 => (uint) (((tr.TID ^ tr.SID ^ (PID & 0xFFFF) ^ 1) << 16) | (PID & 0xFFFF)), // Fixed, Force Star + 3 => (uint) (((tr.TID ^ tr.SID ^ (PID & 0xFFFF) ^ 0) << 16) | (PID & 0xFFFF)), // Fixed, Force Square + 4 => PID, // Fixed, Force Value + _ => throw new ArgumentOutOfRangeException(nameof(type)), + }; + + static uint GetAntishiny(ITrainerID tr) + { + var pid = Util.Rand32(); + if (tr.IsShiny(pid, 8)) + return pid ^ 0x1000_0000; + return pid; + } + } + + private void SetPID(PKM pk) + { + pk.PID = GetPID(pk, PIDTypeValue); + } + + private void SetIVs(PKM pk) + { + Span finalIVs = stackalloc int[6]; + var ivflag = Array.Find(IVs, iv => (byte)(iv - 0xFC) < 3); + var rng = Util.Rand; + if (ivflag == 0) // Random IVs + { + for (int i = 0; i < 6; i++) + finalIVs[i] = IVs[i] > 31 ? rng.Next(32) : IVs[i]; + } + else // 1/2/3 perfect IVs + { + int IVCount = ivflag - 0xFB; + do { finalIVs[rng.Next(6)] = 31; } + while (finalIVs.Count(31) < IVCount); + for (int i = 0; i < 6; i++) + finalIVs[i] = finalIVs[i] == 31 ? 31 : rng.Next(32); + } + pk.SetIVs(finalIVs); + } + + public override bool IsMatchExact(PKM pkm, DexLevel evo) + { + if (pkm.Egg_Location == 0) // Not Egg + { + if (OTGender < 2) + { + if (SID != pkm.SID) return false; + if (TID != pkm.TID) return false; + if (OTGender != pkm.OT_Gender) return false; + } + + if (!CanBeAnyLanguage() && !CanHaveLanguage(pkm.Language)) + return false; + + var OT = GetOT(pkm.Language); // May not be guaranteed to work. + if (!string.IsNullOrEmpty(OT) && OT != pkm.OT_Name) return false; + if (OriginGame != 0 && OriginGame != pkm.Version) return false; + if (EncryptionConstant != 0) + { + if (EncryptionConstant != pkm.EncryptionConstant) + return false; + } + } + + if (Form != evo.Form && !FormInfo.IsFormChangeable(Species, Form, pkm.Form, pkm.Format)) + return false; + + if (IsEgg) + { + if (EggLocation != pkm.Egg_Location) // traded + { + if (pkm.Egg_Location != Locations.LinkTrade6) + return false; + if (PIDType == Shiny.Random && pkm.IsShiny && pkm.ShinyXor > 1) + return false; // shiny traded egg will always have xor0/1. + } + if (!PIDType.IsValid(pkm)) + { + return false; // can't be traded away for unshiny + } + + if (pkm.IsEgg && !pkm.IsNative) + return false; + } + else + { + if (!PIDType.IsValid(pkm)) return false; + if (EggLocation != pkm.Egg_Location) return false; + if (MetLocation != pkm.Met_Location) return false; + } + + if (MetLevel != 0 && MetLevel != pkm.Met_Level) return false; + if (OTGender < 2 && OTGender != pkm.OT_Gender) return false; + if (Nature != -1 && pkm.Nature != Nature) return false; + if (Gender != 3 && Gender != pkm.Gender) return false; + + const int poke = (int)Core.Ball.LAPoke; + var expectedBall = (Ball == 0 ? poke : Ball); + if (expectedBall < poke) // Not even Cherish balls are safe! They get set to the proto-Poké ball. + expectedBall = poke; + if (expectedBall != pkm.Ball) + return false; + + if (pkm is IGigantamax g && g.CanGigantamax != CanGigantamax && !g.CanToggleGigantamax(pkm.Species, pkm.Form, Species, Form)) + return false; + + if (pkm is not IDynamaxLevel dl || dl.DynamaxLevel < DynamaxLevel) + return false; + + // PID Types 0 and 1 do not use the fixed PID value. + // Values 2,3 are specific shiny states, and 4 is fixed value. + // 2,3,4 can change if it is a traded egg to ensure the same shiny state. + var type = PIDTypeValue; + if (type <= 1) + return true; + return pkm.PID == GetPID(pkm, type); + } + + protected override bool IsMatchDeferred(PKM pkm) => Species != pkm.Species; + protected override bool IsMatchPartial(PKM pkm) => false; // no version compatibility checks yet. + + #region Lazy Ribbon Implementation + public bool RibbonEarth { get => this.GetRibbonIndex(Earth); set => this.SetRibbonIndex(Earth, value); } + public bool RibbonNational { get => this.GetRibbonIndex(National); set => this.SetRibbonIndex(National, value); } + public bool RibbonCountry { get => this.GetRibbonIndex(Country); set => this.SetRibbonIndex(Country, value); } + public bool RibbonChampionBattle { get => this.GetRibbonIndex(ChampionBattle); set => this.SetRibbonIndex(ChampionBattle, value); } + public bool RibbonChampionRegional { get => this.GetRibbonIndex(ChampionRegional); set => this.SetRibbonIndex(ChampionRegional, value); } + public bool RibbonChampionNational { get => this.GetRibbonIndex(ChampionNational); set => this.SetRibbonIndex(ChampionNational, value); } + public bool RibbonClassic { get => this.GetRibbonIndex(Classic); set => this.SetRibbonIndex(Classic, value); } + public bool RibbonWishing { get => this.GetRibbonIndex(Wishing); set => this.SetRibbonIndex(Wishing, value); } + public bool RibbonPremier { get => this.GetRibbonIndex(Premier); set => this.SetRibbonIndex(Premier, value); } + public bool RibbonEvent { get => this.GetRibbonIndex(Event); set => this.SetRibbonIndex(Event, value); } + public bool RibbonBirthday { get => this.GetRibbonIndex(Birthday); set => this.SetRibbonIndex(Birthday, value); } + public bool RibbonSpecial { get => this.GetRibbonIndex(Special); set => this.SetRibbonIndex(Special, value); } + public bool RibbonWorld { get => this.GetRibbonIndex(World); set => this.SetRibbonIndex(World, value); } + public bool RibbonChampionWorld { get => this.GetRibbonIndex(ChampionWorld); set => this.SetRibbonIndex(ChampionWorld, value); } + public bool RibbonSouvenir { get => this.GetRibbonIndex(Souvenir); set => this.SetRibbonIndex(Souvenir, value); } + public bool RibbonChampionG3 { get => this.GetRibbonIndex(ChampionG3); set => this.SetRibbonIndex(ChampionG3, value); } + public bool RibbonArtist { get => this.GetRibbonIndex(Artist); set => this.SetRibbonIndex(Artist, value); } + public bool RibbonEffort { get => this.GetRibbonIndex(Effort); set => this.SetRibbonIndex(Effort, value); } + public bool RibbonChampionSinnoh { get => this.GetRibbonIndex(ChampionSinnoh); set => this.SetRibbonIndex(ChampionSinnoh, value); } + public bool RibbonAlert { get => this.GetRibbonIndex(Alert); set => this.SetRibbonIndex(Alert, value); } + public bool RibbonShock { get => this.GetRibbonIndex(Shock); set => this.SetRibbonIndex(Shock, value); } + public bool RibbonDowncast { get => this.GetRibbonIndex(Downcast); set => this.SetRibbonIndex(Downcast, value); } + public bool RibbonCareless { get => this.GetRibbonIndex(Careless); set => this.SetRibbonIndex(Careless, value); } + public bool RibbonRelax { get => this.GetRibbonIndex(Relax); set => this.SetRibbonIndex(Relax, value); } + public bool RibbonSnooze { get => this.GetRibbonIndex(Snooze); set => this.SetRibbonIndex(Snooze, value); } + public bool RibbonSmile { get => this.GetRibbonIndex(Smile); set => this.SetRibbonIndex(Smile, value); } + public bool RibbonGorgeous { get => this.GetRibbonIndex(Gorgeous); set => this.SetRibbonIndex(Gorgeous, value); } + public bool RibbonRoyal { get => this.GetRibbonIndex(Royal); set => this.SetRibbonIndex(Royal, value); } + public bool RibbonGorgeousRoyal { get => this.GetRibbonIndex(GorgeousRoyal); set => this.SetRibbonIndex(GorgeousRoyal, value); } + public bool RibbonFootprint { get => this.GetRibbonIndex(Footprint); set => this.SetRibbonIndex(Footprint, value); } + public bool RibbonRecord { get => this.GetRibbonIndex(Record); set => this.SetRibbonIndex(Record, value); } + public bool RibbonLegend { get => this.GetRibbonIndex(Legend); set => this.SetRibbonIndex(Legend, value); } + public bool RibbonChampionKalos { get => this.GetRibbonIndex(ChampionKalos); set => this.SetRibbonIndex(ChampionKalos, value); } + public bool RibbonChampionG6Hoenn { get => this.GetRibbonIndex(ChampionG6Hoenn); set => this.SetRibbonIndex(ChampionG6Hoenn, value); } + public bool RibbonBestFriends { get => this.GetRibbonIndex(BestFriends); set => this.SetRibbonIndex(BestFriends, value); } + public bool RibbonTraining { get => this.GetRibbonIndex(Training); set => this.SetRibbonIndex(Training, value); } + public bool RibbonBattlerSkillful { get => this.GetRibbonIndex(BattlerSkillful); set => this.SetRibbonIndex(BattlerSkillful, value); } + public bool RibbonBattlerExpert { get => this.GetRibbonIndex(BattlerExpert); set => this.SetRibbonIndex(BattlerExpert, value); } + public bool RibbonContestStar { get => this.GetRibbonIndex(ContestStar); set => this.SetRibbonIndex(ContestStar, value); } + public bool RibbonMasterCoolness { get => this.GetRibbonIndex(MasterCoolness); set => this.SetRibbonIndex(MasterCoolness, value); } + public bool RibbonMasterBeauty { get => this.GetRibbonIndex(MasterBeauty); set => this.SetRibbonIndex(MasterBeauty, value); } + public bool RibbonMasterCuteness { get => this.GetRibbonIndex(MasterCuteness); set => this.SetRibbonIndex(MasterCuteness, value); } + public bool RibbonMasterCleverness { get => this.GetRibbonIndex(MasterCleverness); set => this.SetRibbonIndex(MasterCleverness, value); } + public bool RibbonMasterToughness { get => this.GetRibbonIndex(MasterToughness); set => this.SetRibbonIndex(MasterToughness, value); } + + public int RibbonCountMemoryContest { get => 0; set { } } + public int RibbonCountMemoryBattle { get => 0; set { } } + + public bool RibbonChampionAlola { get => this.GetRibbonIndex(ChampionAlola); set => this.SetRibbonIndex(ChampionAlola, value); } + public bool RibbonBattleRoyale { get => this.GetRibbonIndex(BattleRoyale); set => this.SetRibbonIndex(BattleRoyale, value); } + public bool RibbonBattleTreeGreat { get => this.GetRibbonIndex(BattleTreeGreat); set => this.SetRibbonIndex(BattleTreeGreat, value); } + public bool RibbonBattleTreeMaster { get => this.GetRibbonIndex(BattleTreeMaster); set => this.SetRibbonIndex(BattleTreeMaster, value); } + public bool RibbonChampionGalar { get => this.GetRibbonIndex(ChampionGalar); set => this.SetRibbonIndex(ChampionGalar, value); } + public bool RibbonTowerMaster { get => this.GetRibbonIndex(TowerMaster); set => this.SetRibbonIndex(TowerMaster, value); } + public bool RibbonMasterRank { get => this.GetRibbonIndex(MasterRank); set => this.SetRibbonIndex(MasterRank, value); } + public bool RibbonMarkLunchtime { get => this.GetRibbonIndex(MarkLunchtime); set => this.SetRibbonIndex(MarkLunchtime, value); } + public bool RibbonMarkSleepyTime { get => this.GetRibbonIndex(MarkSleepyTime); set => this.SetRibbonIndex(MarkSleepyTime, value); } + public bool RibbonMarkDusk { get => this.GetRibbonIndex(MarkDusk); set => this.SetRibbonIndex(MarkDusk, value); } + public bool RibbonMarkDawn { get => this.GetRibbonIndex(MarkDawn); set => this.SetRibbonIndex(MarkDawn, value); } + public bool RibbonMarkCloudy { get => this.GetRibbonIndex(MarkCloudy); set => this.SetRibbonIndex(MarkCloudy, value); } + public bool RibbonMarkRainy { get => this.GetRibbonIndex(MarkRainy); set => this.SetRibbonIndex(MarkRainy, value); } + public bool RibbonMarkStormy { get => this.GetRibbonIndex(MarkStormy); set => this.SetRibbonIndex(MarkStormy, value); } + public bool RibbonMarkSnowy { get => this.GetRibbonIndex(MarkSnowy); set => this.SetRibbonIndex(MarkSnowy, value); } + public bool RibbonMarkBlizzard { get => this.GetRibbonIndex(MarkBlizzard); set => this.SetRibbonIndex(MarkBlizzard, value); } + public bool RibbonMarkDry { get => this.GetRibbonIndex(MarkDry); set => this.SetRibbonIndex(MarkDry, value); } + public bool RibbonMarkSandstorm { get => this.GetRibbonIndex(MarkSandstorm); set => this.SetRibbonIndex(MarkSandstorm, value); } + public bool RibbonMarkMisty { get => this.GetRibbonIndex(MarkMisty); set => this.SetRibbonIndex(MarkMisty, value); } + public bool RibbonMarkDestiny { get => this.GetRibbonIndex(MarkDestiny); set => this.SetRibbonIndex(MarkDestiny, value); } + public bool RibbonMarkFishing { get => this.GetRibbonIndex(MarkFishing); set => this.SetRibbonIndex(MarkFishing, value); } + public bool RibbonMarkCurry { get => this.GetRibbonIndex(MarkCurry); set => this.SetRibbonIndex(MarkCurry, value); } + public bool RibbonMarkUncommon { get => this.GetRibbonIndex(MarkUncommon); set => this.SetRibbonIndex(MarkUncommon, value); } + public bool RibbonMarkRare { get => this.GetRibbonIndex(MarkRare); set => this.SetRibbonIndex(MarkRare, value); } + public bool RibbonMarkRowdy { get => this.GetRibbonIndex(MarkRowdy); set => this.SetRibbonIndex(MarkRowdy, value); } + public bool RibbonMarkAbsentMinded { get => this.GetRibbonIndex(MarkAbsentMinded); set => this.SetRibbonIndex(MarkAbsentMinded, value); } + public bool RibbonMarkJittery { get => this.GetRibbonIndex(MarkJittery); set => this.SetRibbonIndex(MarkJittery, value); } + public bool RibbonMarkExcited { get => this.GetRibbonIndex(MarkExcited); set => this.SetRibbonIndex(MarkExcited, value); } + public bool RibbonMarkCharismatic { get => this.GetRibbonIndex(MarkCharismatic); set => this.SetRibbonIndex(MarkCharismatic, value); } + public bool RibbonMarkCalmness { get => this.GetRibbonIndex(MarkCalmness); set => this.SetRibbonIndex(MarkCalmness, value); } + public bool RibbonMarkIntense { get => this.GetRibbonIndex(MarkIntense); set => this.SetRibbonIndex(MarkIntense, value); } + public bool RibbonMarkZonedOut { get => this.GetRibbonIndex(MarkZonedOut); set => this.SetRibbonIndex(MarkZonedOut, value); } + public bool RibbonMarkJoyful { get => this.GetRibbonIndex(MarkJoyful); set => this.SetRibbonIndex(MarkJoyful, value); } + public bool RibbonMarkAngry { get => this.GetRibbonIndex(MarkAngry); set => this.SetRibbonIndex(MarkAngry, value); } + public bool RibbonMarkSmiley { get => this.GetRibbonIndex(MarkSmiley); set => this.SetRibbonIndex(MarkSmiley, value); } + public bool RibbonMarkTeary { get => this.GetRibbonIndex(MarkTeary); set => this.SetRibbonIndex(MarkTeary, value); } + public bool RibbonMarkUpbeat { get => this.GetRibbonIndex(MarkUpbeat); set => this.SetRibbonIndex(MarkUpbeat, value); } + public bool RibbonMarkPeeved { get => this.GetRibbonIndex(MarkPeeved); set => this.SetRibbonIndex(MarkPeeved, value); } + public bool RibbonMarkIntellectual { get => this.GetRibbonIndex(MarkIntellectual); set => this.SetRibbonIndex(MarkIntellectual, value); } + public bool RibbonMarkFerocious { get => this.GetRibbonIndex(MarkFerocious); set => this.SetRibbonIndex(MarkFerocious, value); } + public bool RibbonMarkCrafty { get => this.GetRibbonIndex(MarkCrafty); set => this.SetRibbonIndex(MarkCrafty, value); } + public bool RibbonMarkScowling { get => this.GetRibbonIndex(MarkScowling); set => this.SetRibbonIndex(MarkScowling, value); } + public bool RibbonMarkKindly { get => this.GetRibbonIndex(MarkKindly); set => this.SetRibbonIndex(MarkKindly, value); } + public bool RibbonMarkFlustered { get => this.GetRibbonIndex(MarkFlustered); set => this.SetRibbonIndex(MarkFlustered, value); } + public bool RibbonMarkPumpedUp { get => this.GetRibbonIndex(MarkPumpedUp); set => this.SetRibbonIndex(MarkPumpedUp, value); } + public bool RibbonMarkZeroEnergy { get => this.GetRibbonIndex(MarkZeroEnergy); set => this.SetRibbonIndex(MarkZeroEnergy, value); } + public bool RibbonMarkPrideful { get => this.GetRibbonIndex(MarkPrideful); set => this.SetRibbonIndex(MarkPrideful, value); } + public bool RibbonMarkUnsure { get => this.GetRibbonIndex(MarkUnsure); set => this.SetRibbonIndex(MarkUnsure, value); } + public bool RibbonMarkHumble { get => this.GetRibbonIndex(MarkHumble); set => this.SetRibbonIndex(MarkHumble, value); } + public bool RibbonMarkThorny { get => this.GetRibbonIndex(MarkThorny); set => this.SetRibbonIndex(MarkThorny, value); } + public bool RibbonMarkVigor { get => this.GetRibbonIndex(MarkVigor); set => this.SetRibbonIndex(MarkVigor, value); } + public bool RibbonMarkSlump { get => this.GetRibbonIndex(MarkSlump); set => this.SetRibbonIndex(MarkSlump, value); } + public bool RibbonTwinklingStar { get => this.GetRibbonIndex(TwinklingStar); set => this.SetRibbonIndex(TwinklingStar, value); } + public bool RibbonPioneer { get => this.GetRibbonIndex(Pioneer); set => this.SetRibbonIndex(Pioneer, value); } + + public int GetRibbonByte(int index) => Array.FindIndex(Data, RibbonBytesOffset, RibbonBytesCount, z => z == index); + public bool GetRibbon(int index) => GetRibbonByte(index) >= 0; + + public void SetRibbon(int index, bool value = true) + { + if ((uint)index > (uint)MarkSlump) + throw new ArgumentOutOfRangeException(nameof(index)); + + if (value) + { + if (GetRibbon(index)) + return; + var openIndex = Array.FindIndex(Data, RibbonBytesOffset, RibbonBytesCount, z => z != RibbonByteNone); + if (openIndex < 0) + throw new ArgumentOutOfRangeException(nameof(index)); + SetRibbonAtIndex(openIndex, (byte)index); + } + else + { + var ofs = GetRibbonByte(index); + if (ofs < 0) + return; + SetRibbonAtIndex(ofs, RibbonByteNone); + } + } + #endregion + } +} diff --git a/PKHeX.Core/PKM/G8PKM.cs b/PKHeX.Core/PKM/G8PKM.cs index c1a050a082c..077dcf61ede 100644 --- a/PKHeX.Core/PKM/G8PKM.cs +++ b/PKHeX.Core/PKM/G8PKM.cs @@ -5,7 +5,7 @@ namespace PKHeX.Core { /// Generation 8 format. public abstract class G8PKM : PKM, ISanityChecksum, - IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IRibbonSetCommon7, IRibbonSetCommon8, IRibbonSetMark8, IRibbonSetAffixed, + IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IRibbonSetCommon7, IRibbonSetCommon8, IRibbonSetMark8, IRibbonSetAffixed, ITechRecord8, ISociability, IContestStats, IContestStatsMutable, IHyperTrain, IScaledSize, IGigantamax, IFavorite, IDynamaxLevel, IRibbonIndex, IHandlerLanguage, IFormArgument, IHomeTrack, IBattleVersion, ITrainerMemories { public sealed override int Format => 8; @@ -28,6 +28,8 @@ private ushort CalculateChecksum() } // Simple Generated Attributes + public ReadOnlySpan TechRecordPermitFlags => PersonalInfo.TMHM.AsSpan(PersonalInfoSWSH.CountTM); + public ReadOnlySpan TechRecordPermitIndexes => Legal.TMHM_SWSH.AsSpan(PersonalInfoSWSH.CountTM); public override int CurrentFriendship { get => CurrentHandler == 0 ? OT_Friendship : HT_Friendship; @@ -458,7 +460,7 @@ public void SetMoveRecordFlag(int index, bool value) FlagUtil.SetFlag(Data, 0x127 + ofs, index & 7, value); } - public bool HasAnyMoveRecordFlag() => Array.FindIndex(Data, 0x127, 14, z => z != 0) >= 0; + public bool GetMoveRecordFlagAny() => Array.FindIndex(Data, 0x127, 14, z => z != 0) >= 0; // Why did you mis-align this field, GameFreak? public ulong Tracker diff --git a/PKHeX.Core/PKM/PA8.cs b/PKHeX.Core/PKM/PA8.cs new file mode 100644 index 00000000000..429ad8c7f36 --- /dev/null +++ b/PKHeX.Core/PKM/PA8.cs @@ -0,0 +1,866 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// Generation 8 format. +public sealed class PA8 : PKM, ISanityChecksum, + IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IRibbonSetCommon7, IRibbonSetCommon8, IRibbonSetMark8, IRibbonSetAffixed, IGanbaru, IAlpha, INoble, ITechRecord8, ISociability, IMoveShop8Mastery, + IContestStats, IContestStatsMutable, IHyperTrain, IScaledSizeValue, IGigantamax, IFavorite, IDynamaxLevel, IRibbonIndex, IHandlerLanguage, IFormArgument, IHomeTrack, IBattleVersion, ITrainerMemories +{ + private static readonly ushort[] Unused = + { + 0x17, 0x1A, 0x1B, 0x23, 0x33, + 0x4C, 0x4D, 0x4E, 0x4F, + 0x52, 0x53, + 0xA0, 0xA1, 0xA2, 0xA3, + 0xAA, 0xAB, + 0xB4, 0xB5, 0xB6, 0xB7, + 0xD5, + 0xD6, 0xD7, + 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xE9, + 0xF0, 0xF1, + 0xF3, + 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x018, 0x109, 0x10A, 0x10B, 0x10C, 0x10D, 0x10E, 0x10F, + 0x12D, 0x13C, + }; + + public override IReadOnlyList ExtraBytes => Unused; + public override PersonalInfo PersonalInfo => PersonalTable.LA.GetFormEntry(Species, Form); + + public override int Format => 8; + public PA8() : base(PokeCrypto.SIZE_8APARTY) => AffixedRibbon = -1; // 00 would make it show Kalos Champion :) + public PA8(byte[] data) : base(DecryptParty(data)) { } + + public override int SIZE_PARTY => PokeCrypto.SIZE_8APARTY; + public override int SIZE_STORED => PokeCrypto.SIZE_8ASTORED; + public override bool ChecksumValid => CalculateChecksum() == Checksum; + public override PKM Clone() => new PA8((byte[])Data.Clone()); + + private static byte[] DecryptParty(byte[] data) + { + PokeCrypto.DecryptIfEncrypted8A(ref data); + Array.Resize(ref data, PokeCrypto.SIZE_8APARTY); + return data; + } + + private ushort CalculateChecksum() + { + ushort chk = 0; + for (int i = 8; i < PokeCrypto.SIZE_8ASTORED; i += 2) + chk += ReadUInt16LittleEndian(Data.AsSpan(i)); + return chk; + } + + // Simple Generated Attributes + public ReadOnlySpan TechRecordPermitFlags => PersonalInfo.TMHM.AsSpan(PersonalInfoSWSH.CountTM); + public ReadOnlySpan TechRecordPermitIndexes => Legal.TMHM_SWSH.AsSpan(PersonalInfoSWSH.CountTM); + public ReadOnlySpan MoveShopPermitFlags => PersonalInfo.SpecialTutors[0]; + public ReadOnlySpan MoveShopPermitIndexes => Legal.MoveShop8_LA; + + public override int CurrentFriendship + { + get => CurrentHandler == 0 ? OT_Friendship : HT_Friendship; + set { if (CurrentHandler == 0) OT_Friendship = value; else HT_Friendship = value; } + } + + public override void RefreshChecksum() => Checksum = CalculateChecksum(); + public override bool Valid { get => Sanity == 0 && ChecksumValid; set { if (!value) return; Sanity = 0; RefreshChecksum(); } } + + // Trash Bytes + public override Span Nickname_Trash => Data.AsSpan(0x60, 26); + public override Span HT_Trash => Data.AsSpan(0xB8, 26); + public override Span OT_Trash => Data.AsSpan(0x110, 26); + + // Maximums + public override int MaxIV => 31; + public override int MaxEV => 252; + public override int OTLength => 12; + public override int NickLength => 12; + + public override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4); + public override int TSV => (TID ^ SID) >> 4; + public override bool IsUntraded => Data[0xB8] == 0 && Data[0xB8 + 1] == 0 && Format == Generation; // immediately terminated HT_Name data (\0) + + // Complex Generated Attributes + public override int Characteristic + { + get + { + int pm6 = (int)(EncryptionConstant % 6); + int maxIV = MaximumIV; + int pm6stat = 0; + for (int i = 0; i < 6; i++) + { + pm6stat = (pm6 + i) % 6; + if (GetIV(pm6stat) == maxIV) + break; + } + return (pm6stat * 5) + (maxIV % 5); + } + } + + // Methods + protected override byte[] Encrypt() + { + RefreshChecksum(); + return PokeCrypto.EncryptArray8A(Data); + } + + public void FixRelearn() + { + while (true) + { + if (RelearnMove4 != 0 && RelearnMove3 == 0) + { + RelearnMove3 = RelearnMove4; + RelearnMove4 = 0; + } + if (RelearnMove3 != 0 && RelearnMove2 == 0) + { + RelearnMove2 = RelearnMove3; + RelearnMove3 = 0; + continue; + } + if (RelearnMove2 != 0 && RelearnMove1 == 0) + { + RelearnMove1 = RelearnMove2; + RelearnMove2 = 0; + continue; + } + break; + } + } + + public override uint EncryptionConstant { get => ReadUInt32LittleEndian(Data.AsSpan(0x00)); set => WriteUInt32LittleEndian(Data.AsSpan(0x00), value); } + public ushort Sanity { get => ReadUInt16LittleEndian(Data.AsSpan(0x04)); set => WriteUInt16LittleEndian(Data.AsSpan(0x04), value); } + public ushort Checksum { get => ReadUInt16LittleEndian(Data.AsSpan(0x06)); set => WriteUInt16LittleEndian(Data.AsSpan(0x06), value); } + + // Structure + #region Block A + public override int Species { get => ReadUInt16LittleEndian(Data.AsSpan(0x08)); set => WriteUInt16LittleEndian(Data.AsSpan(0x08), (ushort)value); } + public override int HeldItem { get => ReadUInt16LittleEndian(Data.AsSpan(0x0A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x0A), (ushort)value); } + public override int TID { get => ReadUInt16LittleEndian(Data.AsSpan(0x0C)); set => WriteUInt16LittleEndian(Data.AsSpan(0x0C), (ushort)value); } + public override int SID { get => ReadUInt16LittleEndian(Data.AsSpan(0x0E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x0E), (ushort)value); } + public override uint EXP { get => ReadUInt32LittleEndian(Data.AsSpan(0x10)); set => WriteUInt32LittleEndian(Data.AsSpan(0x10), value); } + public override int Ability { get => ReadUInt16LittleEndian(Data.AsSpan(0x14)); set => WriteUInt16LittleEndian(Data.AsSpan(0x14), (ushort)value); } + public override int AbilityNumber { get => Data[0x16] & 7; set => Data[0x16] = (byte)((Data[0x16] & ~7) | (value & 7)); } + public bool Favorite { get => (Data[0x16] & 8) != 0; set => Data[0x16] = (byte)((Data[0x16] & ~8) | ((value ? 1 : 0) << 3)); } // unused, was in LGPE but not in SWSH + public bool CanGigantamax { get => (Data[0x16] & 16) != 0; set => Data[0x16] = (byte)((Data[0x16] & ~16) | (value ? 16 : 0)); } + public bool IsAlpha { get => (Data[0x16] & 32) != 0; set => Data[0x16] = (byte)((Data[0x16] & ~32) | ((value ? 1 : 0) << 5)); } + public bool IsNoble { get => (Data[0x16] & 64) != 0; set => Data[0x16] = (byte)((Data[0x16] & ~64) | ((value ? 1 : 0) << 6)); } + // 0x17 alignment unused + public override int MarkValue { get => ReadUInt16LittleEndian(Data.AsSpan(0x18)); protected set => WriteUInt16LittleEndian(Data.AsSpan(0x18), (ushort)value); } + // 0x1A alignment unused + // 0x1B alignment unused + public override uint PID { get => ReadUInt32LittleEndian(Data.AsSpan(0x1C)); set => WriteUInt32LittleEndian(Data.AsSpan(0x1C), value); } + public override int Nature { get => Data[0x20]; set => Data[0x20] = (byte)value; } + public override int StatNature { get => 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 int Gender { get => (Data[0x22] >> 2) & 0x3; set => Data[0x22] = (byte)((Data[0x22] & 0xF3) | (value << 2)); } + // 0x23 alignment unused + + public override int Form { get => ReadUInt16LittleEndian(Data.AsSpan(0x24)); set => WriteUInt16LittleEndian(Data.AsSpan(0x24), (ushort)value); } + public override int EV_HP { get => Data[0x26]; set => Data[0x26] = (byte)value; } + public override int EV_ATK { get => Data[0x27]; set => Data[0x27] = (byte)value; } + public override int EV_DEF { get => Data[0x28]; set => Data[0x28] = (byte)value; } + public override int EV_SPE { get => Data[0x29]; set => Data[0x29] = (byte)value; } + public override int EV_SPA { get => Data[0x2A]; set => Data[0x2A] = (byte)value; } + public override int EV_SPD { get => Data[0x2B]; set => Data[0x2B] = (byte)value; } + public byte CNT_Cool { get => Data[0x2C]; set => Data[0x2C] = value; } + public byte CNT_Beauty { get => Data[0x2D]; set => Data[0x2D] = value; } + public byte CNT_Cute { get => Data[0x2E]; set => Data[0x2E] = value; } + public byte CNT_Smart { get => Data[0x2F]; set => Data[0x2F] = value; } + public byte CNT_Tough { get => Data[0x30]; set => Data[0x30] = value; } + public byte CNT_Sheen { get => Data[0x31]; set => Data[0x31] = value; } + private byte PKRS { get => Data[0x32]; set => Data[0x32] = value; } + public override int PKRS_Days { get => PKRS & 0xF; set => PKRS = (byte)((PKRS & ~0xF) | value); } + public override int PKRS_Strain { get => PKRS >> 4; set => PKRS = (byte)((PKRS & 0xF) | value << 4); } + // 0x33 unused padding + + // ribbon u32 + public bool RibbonChampionKalos { get => FlagUtil.GetFlag(Data, 0x34, 0); set => FlagUtil.SetFlag(Data, 0x34, 0, value); } + public bool RibbonChampionG3 { get => FlagUtil.GetFlag(Data, 0x34, 1); set => FlagUtil.SetFlag(Data, 0x34, 1, value); } + public bool RibbonChampionSinnoh { get => FlagUtil.GetFlag(Data, 0x34, 2); set => FlagUtil.SetFlag(Data, 0x34, 2, value); } + public bool RibbonBestFriends { get => FlagUtil.GetFlag(Data, 0x34, 3); set => FlagUtil.SetFlag(Data, 0x34, 3, value); } + public bool RibbonTraining { get => FlagUtil.GetFlag(Data, 0x34, 4); set => FlagUtil.SetFlag(Data, 0x34, 4, value); } + public bool RibbonBattlerSkillful { get => FlagUtil.GetFlag(Data, 0x34, 5); set => FlagUtil.SetFlag(Data, 0x34, 5, value); } + public bool RibbonBattlerExpert { get => FlagUtil.GetFlag(Data, 0x34, 6); set => FlagUtil.SetFlag(Data, 0x34, 6, value); } + public bool RibbonEffort { get => FlagUtil.GetFlag(Data, 0x34, 7); set => FlagUtil.SetFlag(Data, 0x34, 7, value); } + + public bool RibbonAlert { get => FlagUtil.GetFlag(Data, 0x35, 0); set => FlagUtil.SetFlag(Data, 0x35, 0, value); } + public bool RibbonShock { get => FlagUtil.GetFlag(Data, 0x35, 1); set => FlagUtil.SetFlag(Data, 0x35, 1, value); } + public bool RibbonDowncast { get => FlagUtil.GetFlag(Data, 0x35, 2); set => FlagUtil.SetFlag(Data, 0x35, 2, value); } + public bool RibbonCareless { get => FlagUtil.GetFlag(Data, 0x35, 3); set => FlagUtil.SetFlag(Data, 0x35, 3, value); } + public bool RibbonRelax { get => FlagUtil.GetFlag(Data, 0x35, 4); set => FlagUtil.SetFlag(Data, 0x35, 4, value); } + public bool RibbonSnooze { get => FlagUtil.GetFlag(Data, 0x35, 5); set => FlagUtil.SetFlag(Data, 0x35, 5, value); } + public bool RibbonSmile { get => FlagUtil.GetFlag(Data, 0x35, 6); set => FlagUtil.SetFlag(Data, 0x35, 6, value); } + public bool RibbonGorgeous { get => FlagUtil.GetFlag(Data, 0x35, 7); set => FlagUtil.SetFlag(Data, 0x35, 7, value); } + + public bool RibbonRoyal { get => FlagUtil.GetFlag(Data, 0x36, 0); set => FlagUtil.SetFlag(Data, 0x36, 0, value); } + public bool RibbonGorgeousRoyal { get => FlagUtil.GetFlag(Data, 0x36, 1); set => FlagUtil.SetFlag(Data, 0x36, 1, value); } + public bool RibbonArtist { get => FlagUtil.GetFlag(Data, 0x36, 2); set => FlagUtil.SetFlag(Data, 0x36, 2, value); } + public bool RibbonFootprint { get => FlagUtil.GetFlag(Data, 0x36, 3); set => FlagUtil.SetFlag(Data, 0x36, 3, value); } + public bool RibbonRecord { get => FlagUtil.GetFlag(Data, 0x36, 4); set => FlagUtil.SetFlag(Data, 0x36, 4, value); } + public bool RibbonLegend { get => FlagUtil.GetFlag(Data, 0x36, 5); set => FlagUtil.SetFlag(Data, 0x36, 5, value); } + public bool RibbonCountry { get => FlagUtil.GetFlag(Data, 0x36, 6); set => FlagUtil.SetFlag(Data, 0x36, 6, value); } + public bool RibbonNational { get => FlagUtil.GetFlag(Data, 0x36, 7); set => FlagUtil.SetFlag(Data, 0x36, 7, value); } + + public bool RibbonEarth { get => FlagUtil.GetFlag(Data, 0x37, 0); set => FlagUtil.SetFlag(Data, 0x37, 0, value); } + public bool RibbonWorld { get => FlagUtil.GetFlag(Data, 0x37, 1); set => FlagUtil.SetFlag(Data, 0x37, 1, value); } + public bool RibbonClassic { get => FlagUtil.GetFlag(Data, 0x37, 2); set => FlagUtil.SetFlag(Data, 0x37, 2, value); } + public bool RibbonPremier { get => FlagUtil.GetFlag(Data, 0x37, 3); set => FlagUtil.SetFlag(Data, 0x37, 3, value); } + public bool RibbonEvent { get => FlagUtil.GetFlag(Data, 0x37, 4); set => FlagUtil.SetFlag(Data, 0x37, 4, value); } + public bool RibbonBirthday { get => FlagUtil.GetFlag(Data, 0x37, 5); set => FlagUtil.SetFlag(Data, 0x37, 5, value); } + public bool RibbonSpecial { get => FlagUtil.GetFlag(Data, 0x37, 6); set => FlagUtil.SetFlag(Data, 0x37, 6, value); } + public bool RibbonSouvenir { get => FlagUtil.GetFlag(Data, 0x37, 7); set => FlagUtil.SetFlag(Data, 0x37, 7, value); } + + // ribbon u32 + public bool RibbonWishing { get => FlagUtil.GetFlag(Data, 0x38, 0); set => FlagUtil.SetFlag(Data, 0x38, 0, value); } + public bool RibbonChampionBattle { get => FlagUtil.GetFlag(Data, 0x38, 1); set => FlagUtil.SetFlag(Data, 0x38, 1, value); } + public bool RibbonChampionRegional { get => FlagUtil.GetFlag(Data, 0x38, 2); set => FlagUtil.SetFlag(Data, 0x38, 2, value); } + public bool RibbonChampionNational { get => FlagUtil.GetFlag(Data, 0x38, 3); set => FlagUtil.SetFlag(Data, 0x38, 3, value); } + public bool RibbonChampionWorld { get => FlagUtil.GetFlag(Data, 0x38, 4); set => FlagUtil.SetFlag(Data, 0x38, 4, value); } + public bool HasContestMemoryRibbon { get => FlagUtil.GetFlag(Data, 0x38, 5); set => FlagUtil.SetFlag(Data, 0x38, 5, value); } + public bool HasBattleMemoryRibbon { get => FlagUtil.GetFlag(Data, 0x38, 6); set => FlagUtil.SetFlag(Data, 0x38, 6, value); } + public bool RibbonChampionG6Hoenn { get => FlagUtil.GetFlag(Data, 0x38, 7); set => FlagUtil.SetFlag(Data, 0x38, 7, value); } + + public bool RibbonContestStar { get => FlagUtil.GetFlag(Data, 0x39, 0); set => FlagUtil.SetFlag(Data, 0x39, 0, value); } + public bool RibbonMasterCoolness { get => FlagUtil.GetFlag(Data, 0x39, 1); set => FlagUtil.SetFlag(Data, 0x39, 1, value); } + public bool RibbonMasterBeauty { get => FlagUtil.GetFlag(Data, 0x39, 2); set => FlagUtil.SetFlag(Data, 0x39, 2, value); } + public bool RibbonMasterCuteness { get => FlagUtil.GetFlag(Data, 0x39, 3); set => FlagUtil.SetFlag(Data, 0x39, 3, value); } + public bool RibbonMasterCleverness { get => FlagUtil.GetFlag(Data, 0x39, 4); set => FlagUtil.SetFlag(Data, 0x39, 4, value); } + public bool RibbonMasterToughness { get => FlagUtil.GetFlag(Data, 0x39, 5); set => FlagUtil.SetFlag(Data, 0x39, 5, value); } + public bool RibbonChampionAlola { get => FlagUtil.GetFlag(Data, 0x39, 6); set => FlagUtil.SetFlag(Data, 0x39, 6, value); } + public bool RibbonBattleRoyale { get => FlagUtil.GetFlag(Data, 0x39, 7); set => FlagUtil.SetFlag(Data, 0x39, 7, value); } + + public bool RibbonBattleTreeGreat { get => FlagUtil.GetFlag(Data, 0x3A, 0); set => FlagUtil.SetFlag(Data, 0x3A, 0, value); } + public bool RibbonBattleTreeMaster { get => FlagUtil.GetFlag(Data, 0x3A, 1); set => FlagUtil.SetFlag(Data, 0x3A, 1, value); } + public bool RibbonChampionGalar { get => FlagUtil.GetFlag(Data, 0x3A, 2); set => FlagUtil.SetFlag(Data, 0x3A, 2, value); } + public bool RibbonTowerMaster { get => FlagUtil.GetFlag(Data, 0x3A, 3); set => FlagUtil.SetFlag(Data, 0x3A, 3, value); } + public bool RibbonMasterRank { get => FlagUtil.GetFlag(Data, 0x3A, 4); set => FlagUtil.SetFlag(Data, 0x3A, 4, value); } + public bool RibbonMarkLunchtime { get => FlagUtil.GetFlag(Data, 0x3A, 5); set => FlagUtil.SetFlag(Data, 0x3A, 5, value); } + public bool RibbonMarkSleepyTime { get => FlagUtil.GetFlag(Data, 0x3A, 6); set => FlagUtil.SetFlag(Data, 0x3A, 6, value); } + public bool RibbonMarkDusk { get => FlagUtil.GetFlag(Data, 0x3A, 7); set => FlagUtil.SetFlag(Data, 0x3A, 7, value); } + + public bool RibbonMarkDawn { get => FlagUtil.GetFlag(Data, 0x3B, 0); set => FlagUtil.SetFlag(Data, 0x3B, 0, value); } + public bool RibbonMarkCloudy { get => FlagUtil.GetFlag(Data, 0x3B, 1); set => FlagUtil.SetFlag(Data, 0x3B, 1, value); } + public bool RibbonMarkRainy { get => FlagUtil.GetFlag(Data, 0x3B, 2); set => FlagUtil.SetFlag(Data, 0x3B, 2, value); } + public bool RibbonMarkStormy { get => FlagUtil.GetFlag(Data, 0x3B, 3); set => FlagUtil.SetFlag(Data, 0x3B, 3, value); } + public bool RibbonMarkSnowy { get => FlagUtil.GetFlag(Data, 0x3B, 4); set => FlagUtil.SetFlag(Data, 0x3B, 4, value); } + public bool RibbonMarkBlizzard { get => FlagUtil.GetFlag(Data, 0x3B, 5); set => FlagUtil.SetFlag(Data, 0x3B, 5, value); } + public bool RibbonMarkDry { get => FlagUtil.GetFlag(Data, 0x3B, 6); set => FlagUtil.SetFlag(Data, 0x3B, 6, value); } + public bool RibbonMarkSandstorm { get => FlagUtil.GetFlag(Data, 0x3B, 7); set => FlagUtil.SetFlag(Data, 0x3B, 7, value); } + public int RibbonCountMemoryContest { get => Data[0x3C]; set => HasContestMemoryRibbon = (Data[0x3C] = (byte)value) != 0; } + public int RibbonCountMemoryBattle { get => Data[0x3D]; set => HasBattleMemoryRibbon = (Data[0x3D] = (byte)value) != 0; } + + public int AlphaMove { get => ReadUInt16LittleEndian(Data.AsSpan(0x3E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x3E), (ushort)value); } + + // 0x40 Ribbon 1 + public bool RibbonMarkMisty { get => FlagUtil.GetFlag(Data, 0x40, 0); set => FlagUtil.SetFlag(Data, 0x40, 0, value); } + public bool RibbonMarkDestiny { get => FlagUtil.GetFlag(Data, 0x40, 1); set => FlagUtil.SetFlag(Data, 0x40, 1, value); } + public bool RibbonMarkFishing { get => FlagUtil.GetFlag(Data, 0x40, 2); set => FlagUtil.SetFlag(Data, 0x40, 2, value); } + public bool RibbonMarkCurry { get => FlagUtil.GetFlag(Data, 0x40, 3); set => FlagUtil.SetFlag(Data, 0x40, 3, value); } + public bool RibbonMarkUncommon { get => FlagUtil.GetFlag(Data, 0x40, 4); set => FlagUtil.SetFlag(Data, 0x40, 4, value); } + public bool RibbonMarkRare { get => FlagUtil.GetFlag(Data, 0x40, 5); set => FlagUtil.SetFlag(Data, 0x40, 5, value); } + public bool RibbonMarkRowdy { get => FlagUtil.GetFlag(Data, 0x40, 6); set => FlagUtil.SetFlag(Data, 0x40, 6, value); } + public bool RibbonMarkAbsentMinded { get => FlagUtil.GetFlag(Data, 0x40, 7); set => FlagUtil.SetFlag(Data, 0x40, 7, value); } + + public bool RibbonMarkJittery { get => FlagUtil.GetFlag(Data, 0x41, 0); set => FlagUtil.SetFlag(Data, 0x41, 0, value); } + public bool RibbonMarkExcited { get => FlagUtil.GetFlag(Data, 0x41, 1); set => FlagUtil.SetFlag(Data, 0x41, 1, value); } + public bool RibbonMarkCharismatic { get => FlagUtil.GetFlag(Data, 0x41, 2); set => FlagUtil.SetFlag(Data, 0x41, 2, value); } + public bool RibbonMarkCalmness { get => FlagUtil.GetFlag(Data, 0x41, 3); set => FlagUtil.SetFlag(Data, 0x41, 3, value); } + public bool RibbonMarkIntense { get => FlagUtil.GetFlag(Data, 0x41, 4); set => FlagUtil.SetFlag(Data, 0x41, 4, value); } + public bool RibbonMarkZonedOut { get => FlagUtil.GetFlag(Data, 0x41, 5); set => FlagUtil.SetFlag(Data, 0x41, 5, value); } + public bool RibbonMarkJoyful { get => FlagUtil.GetFlag(Data, 0x41, 6); set => FlagUtil.SetFlag(Data, 0x41, 6, value); } + public bool RibbonMarkAngry { get => FlagUtil.GetFlag(Data, 0x41, 7); set => FlagUtil.SetFlag(Data, 0x41, 7, value); } + + public bool RibbonMarkSmiley { get => FlagUtil.GetFlag(Data, 0x42, 0); set => FlagUtil.SetFlag(Data, 0x42, 0, value); } + public bool RibbonMarkTeary { get => FlagUtil.GetFlag(Data, 0x42, 1); set => FlagUtil.SetFlag(Data, 0x42, 1, value); } + public bool RibbonMarkUpbeat { get => FlagUtil.GetFlag(Data, 0x42, 2); set => FlagUtil.SetFlag(Data, 0x42, 2, value); } + public bool RibbonMarkPeeved { get => FlagUtil.GetFlag(Data, 0x42, 3); set => FlagUtil.SetFlag(Data, 0x42, 3, value); } + public bool RibbonMarkIntellectual { get => FlagUtil.GetFlag(Data, 0x42, 4); set => FlagUtil.SetFlag(Data, 0x42, 4, value); } + public bool RibbonMarkFerocious { get => FlagUtil.GetFlag(Data, 0x42, 5); set => FlagUtil.SetFlag(Data, 0x42, 5, value); } + public bool RibbonMarkCrafty { get => FlagUtil.GetFlag(Data, 0x42, 6); set => FlagUtil.SetFlag(Data, 0x42, 6, value); } + public bool RibbonMarkScowling { get => FlagUtil.GetFlag(Data, 0x42, 7); set => FlagUtil.SetFlag(Data, 0x42, 7, value); } + + public bool RibbonMarkKindly { get => FlagUtil.GetFlag(Data, 0x43, 0); set => FlagUtil.SetFlag(Data, 0x43, 0, value); } + public bool RibbonMarkFlustered { get => FlagUtil.GetFlag(Data, 0x43, 1); set => FlagUtil.SetFlag(Data, 0x43, 1, value); } + public bool RibbonMarkPumpedUp { get => FlagUtil.GetFlag(Data, 0x43, 2); set => FlagUtil.SetFlag(Data, 0x43, 2, value); } + public bool RibbonMarkZeroEnergy { get => FlagUtil.GetFlag(Data, 0x43, 3); set => FlagUtil.SetFlag(Data, 0x43, 3, value); } + public bool RibbonMarkPrideful { get => FlagUtil.GetFlag(Data, 0x43, 4); set => FlagUtil.SetFlag(Data, 0x43, 4, value); } + public bool RibbonMarkUnsure { get => FlagUtil.GetFlag(Data, 0x43, 5); set => FlagUtil.SetFlag(Data, 0x43, 5, value); } + public bool RibbonMarkHumble { get => FlagUtil.GetFlag(Data, 0x43, 6); set => FlagUtil.SetFlag(Data, 0x43, 6, value); } + public bool RibbonMarkThorny { get => FlagUtil.GetFlag(Data, 0x43, 7); set => FlagUtil.SetFlag(Data, 0x43, 7, value); } + // 0x44 Ribbon 2 + + public bool RibbonMarkVigor { get => FlagUtil.GetFlag(Data, 0x44, 0); set => FlagUtil.SetFlag(Data, 0x44, 0, value); } + public bool RibbonMarkSlump { get => FlagUtil.GetFlag(Data, 0x44, 1); set => FlagUtil.SetFlag(Data, 0x44, 1, value); } + public bool RibbonPioneer { get => FlagUtil.GetFlag(Data, 0x44, 2); set => FlagUtil.SetFlag(Data, 0x44, 2, value); } + public bool RibbonTwinklingStar { get => FlagUtil.GetFlag(Data, 0x44, 3); set => FlagUtil.SetFlag(Data, 0x44, 3, value); } + public bool RIB44_4 { get => FlagUtil.GetFlag(Data, 0x44, 4); set => FlagUtil.SetFlag(Data, 0x44, 4, value); } + public bool RIB44_5 { get => FlagUtil.GetFlag(Data, 0x44, 5); set => FlagUtil.SetFlag(Data, 0x44, 5, value); } + public bool RIB44_6 { get => FlagUtil.GetFlag(Data, 0x44, 6); set => FlagUtil.SetFlag(Data, 0x44, 6, value); } + public bool RIB44_7 { get => FlagUtil.GetFlag(Data, 0x44, 7); set => FlagUtil.SetFlag(Data, 0x44, 7, value); } + + public bool RIB45_0 { get => FlagUtil.GetFlag(Data, 0x45, 0); set => FlagUtil.SetFlag(Data, 0x45, 0, value); } + public bool RIB45_1 { get => FlagUtil.GetFlag(Data, 0x45, 1); set => FlagUtil.SetFlag(Data, 0x45, 1, value); } + public bool RIB45_2 { get => FlagUtil.GetFlag(Data, 0x45, 2); set => FlagUtil.SetFlag(Data, 0x45, 2, value); } + public bool RIB45_3 { get => FlagUtil.GetFlag(Data, 0x45, 3); set => FlagUtil.SetFlag(Data, 0x45, 3, value); } + public bool RIB45_4 { get => FlagUtil.GetFlag(Data, 0x45, 4); set => FlagUtil.SetFlag(Data, 0x45, 4, value); } + public bool RIB45_5 { get => FlagUtil.GetFlag(Data, 0x45, 5); set => FlagUtil.SetFlag(Data, 0x45, 5, value); } + public bool RIB45_6 { get => FlagUtil.GetFlag(Data, 0x45, 6); set => FlagUtil.SetFlag(Data, 0x45, 6, value); } + public bool RIB45_7 { get => FlagUtil.GetFlag(Data, 0x45, 7); set => FlagUtil.SetFlag(Data, 0x45, 7, value); } + + public bool RIB46_0 { get => FlagUtil.GetFlag(Data, 0x41, 0); set => FlagUtil.SetFlag(Data, 0x41, 0, value); } + public bool RIB46_1 { get => FlagUtil.GetFlag(Data, 0x46, 1); set => FlagUtil.SetFlag(Data, 0x46, 1, value); } + public bool RIB46_2 { get => FlagUtil.GetFlag(Data, 0x46, 2); set => FlagUtil.SetFlag(Data, 0x46, 2, value); } + public bool RIB46_3 { get => FlagUtil.GetFlag(Data, 0x46, 3); set => FlagUtil.SetFlag(Data, 0x46, 3, value); } + public bool RIB46_4 { get => FlagUtil.GetFlag(Data, 0x46, 4); set => FlagUtil.SetFlag(Data, 0x46, 4, value); } + public bool RIB46_5 { get => FlagUtil.GetFlag(Data, 0x46, 5); set => FlagUtil.SetFlag(Data, 0x46, 5, value); } + public bool RIB46_6 { get => FlagUtil.GetFlag(Data, 0x46, 6); set => FlagUtil.SetFlag(Data, 0x46, 6, value); } + public bool RIB46_7 { get => FlagUtil.GetFlag(Data, 0x46, 7); set => FlagUtil.SetFlag(Data, 0x46, 7, value); } + + public bool RIB47_0 { get => FlagUtil.GetFlag(Data, 0x47, 0); set => FlagUtil.SetFlag(Data, 0x47, 0, value); } + public bool RIB47_1 { get => FlagUtil.GetFlag(Data, 0x47, 1); set => FlagUtil.SetFlag(Data, 0x47, 1, value); } + public bool RIB47_2 { get => FlagUtil.GetFlag(Data, 0x47, 2); set => FlagUtil.SetFlag(Data, 0x47, 2, value); } + public bool RIB47_3 { get => FlagUtil.GetFlag(Data, 0x47, 3); set => FlagUtil.SetFlag(Data, 0x47, 3, value); } + public bool RIB47_4 { get => FlagUtil.GetFlag(Data, 0x47, 4); set => FlagUtil.SetFlag(Data, 0x47, 4, value); } + public bool RIB47_5 { get => FlagUtil.GetFlag(Data, 0x47, 5); set => FlagUtil.SetFlag(Data, 0x47, 5, value); } + public bool RIB47_6 { get => FlagUtil.GetFlag(Data, 0x47, 6); set => FlagUtil.SetFlag(Data, 0x47, 6, value); } + public bool RIB47_7 { get => FlagUtil.GetFlag(Data, 0x47, 7); set => FlagUtil.SetFlag(Data, 0x47, 7, value); } + + public bool HasMark() + { + var d = Data.AsSpan(); + if ((ReadUInt16LittleEndian(d[0x3A..]) & 0xFFE0) != 0) + return true; + if (ReadUInt32LittleEndian(d[0x40..]) != 0) + return true; + return (d[0x44] & 3) != 0; + } + + public uint Sociability { get => ReadUInt32LittleEndian(Data.AsSpan(0x48)); set => WriteUInt32LittleEndian(Data.AsSpan(0x48), value); } + + // 0x4C-0x4F unused + + public int HeightScalar { get => Data[0x50]; set => Data[0x50] = (byte)value; } + public int WeightScalar { get => Data[0x51]; set => Data[0x51] = (byte)value; } + public int HeightScalarCopy { get => Data[0x52]; set => Data[0x52] = (byte)value; } + + // 0x53 unused + + public override int Move1 { get => ReadUInt16LittleEndian(Data.AsSpan(0x54)); set => WriteUInt16LittleEndian(Data.AsSpan(0x54), (ushort)value); } + public override int Move2 { get => ReadUInt16LittleEndian(Data.AsSpan(0x56)); set => WriteUInt16LittleEndian(Data.AsSpan(0x56), (ushort)value); } + public override int Move3 { get => ReadUInt16LittleEndian(Data.AsSpan(0x58)); set => WriteUInt16LittleEndian(Data.AsSpan(0x58), (ushort)value); } + public override int Move4 { get => ReadUInt16LittleEndian(Data.AsSpan(0x5A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x5A), (ushort)value); } + + public override int Move1_PP { get => Data[0x5C]; set => Data[0x5C] = (byte)value; } + public override int Move2_PP { get => Data[0x5D]; set => Data[0x5D] = (byte)value; } + public override int Move3_PP { get => Data[0x5E]; set => Data[0x5E] = (byte)value; } + public override int Move4_PP { get => Data[0x5F]; set => Data[0x5F] = (byte)value; } + #endregion + #region Block B + public override string Nickname + { + get => StringConverter8.GetString(Nickname_Trash); + set => StringConverter8.SetString(Nickname_Trash, value.AsSpan(), 12, StringConverterOption.None); + } + + // 2 bytes for \0, automatically handled above + + public override int Move1_PPUps { get => Data[0x86]; set => Data[0x86] = (byte)value; } + public override int Move2_PPUps { get => Data[0x87]; set => Data[0x87] = (byte)value; } + public override int Move3_PPUps { get => Data[0x88]; set => Data[0x88] = (byte)value; } + public override int Move4_PPUps { get => Data[0x89]; set => Data[0x89] = (byte)value; } + + public override int RelearnMove1 { get => ReadUInt16LittleEndian(Data.AsSpan(0x8A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x8A), (ushort)value); } + public override int RelearnMove2 { get => ReadUInt16LittleEndian(Data.AsSpan(0x8C)); set => WriteUInt16LittleEndian(Data.AsSpan(0x8C), (ushort)value); } + public override int RelearnMove3 { get => ReadUInt16LittleEndian(Data.AsSpan(0x8E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x8E), (ushort)value); } + public override int RelearnMove4 { get => ReadUInt16LittleEndian(Data.AsSpan(0x90)); set => WriteUInt16LittleEndian(Data.AsSpan(0x90), (ushort)value); } + + public override int Stat_HPCurrent { get => ReadUInt16LittleEndian(Data.AsSpan(0x92)); set => WriteUInt16LittleEndian(Data.AsSpan(0x92), (ushort)value); } + private uint IV32 { get => ReadUInt32LittleEndian(Data.AsSpan(0x94)); set => WriteUInt32LittleEndian(Data.AsSpan(0x94), value); } + public override int IV_HP { get => (int)(IV32 >> 00) & 0x1F; set => IV32 = (IV32 & ~(0x1Fu << 00)) | ((value > 31 ? 31u : (uint)value) << 00); } + public override int IV_ATK { get => (int)(IV32 >> 05) & 0x1F; set => IV32 = (IV32 & ~(0x1Fu << 05)) | ((value > 31 ? 31u : (uint)value) << 05); } + public override int IV_DEF { get => (int)(IV32 >> 10) & 0x1F; set => IV32 = (IV32 & ~(0x1Fu << 10)) | ((value > 31 ? 31u : (uint)value) << 10); } + public override int IV_SPE { get => (int)(IV32 >> 15) & 0x1F; set => IV32 = (IV32 & ~(0x1Fu << 15)) | ((value > 31 ? 31u : (uint)value) << 15); } + public override int IV_SPA { get => (int)(IV32 >> 20) & 0x1F; set => IV32 = (IV32 & ~(0x1Fu << 20)) | ((value > 31 ? 31u : (uint)value) << 20); } + public override int IV_SPD { get => (int)(IV32 >> 25) & 0x1F; set => IV32 = (IV32 & ~(0x1Fu << 25)) | ((value > 31 ? 31u : (uint)value) << 25); } + public override bool IsEgg { get => ((IV32 >> 30) & 1) == 1; set => IV32 = (IV32 & ~0x40000000u) | (value ? 0x40000000u : 0u); } + public override bool IsNicknamed { get => ((IV32 >> 31) & 1) == 1; set => IV32 = (IV32 & 0x7FFFFFFFu) | (value ? 0x80000000u : 0u); } + + public byte DynamaxLevel { get => Data[0x98]; set => Data[0x98] = value; } + + public override int Status_Condition { get => ReadInt32LittleEndian(Data.AsSpan(0x9C)); set => WriteInt32LittleEndian(Data.AsSpan(0x9C), value); } + public int UnkA0 { get => ReadInt32LittleEndian(Data.AsSpan(0xA0)); set => WriteInt32LittleEndian(Data.AsSpan(0xA0), value); } + public int GV_HP { get => Data[0xA4]; set => Data[0xA4] = (byte)value; } + public int GV_ATK { get => Data[0xA5]; set => Data[0xA5] = (byte)value; } + public int GV_DEF { get => Data[0xA6]; set => Data[0xA6] = (byte)value; } + public int GV_SPE { get => Data[0xA7]; set => Data[0xA7] = (byte)value; } + public int GV_SPA { get => Data[0xA8]; set => Data[0xA8] = (byte)value; } + public int GV_SPD { get => Data[0xA9]; set => Data[0xA9] = (byte)value; } + + // 0xAA-0xAB unused + + public float HeightAbsolute { get => ReadSingleLittleEndian(Data.AsSpan(0xAC)); set => WriteSingleLittleEndian(Data.AsSpan(0xAC), value); } + public float WeightAbsolute { get => ReadSingleLittleEndian(Data.AsSpan(0xB0)); set => WriteSingleLittleEndian(Data.AsSpan(0xB0), value); } + + // 0xB4-0xB7 unused + + #endregion + #region Block C + public override string HT_Name + { + get => StringConverter8.GetString(HT_Trash); + set => StringConverter8.SetString(HT_Trash, value.AsSpan(), 12, StringConverterOption.None); + } + + public override int HT_Gender { get => Data[0xD2]; set => Data[0xD2] = (byte)value; } + public int HT_Language { get => Data[0xD3]; set => Data[0xD3] = (byte)value; } + public override int CurrentHandler { get => Data[0xD4]; set => Data[0xD4] = (byte)value; } + // 0xD5 unused (alignment) + public int HT_TrainerID { get => ReadUInt16LittleEndian(Data.AsSpan(0xD6)); set => WriteUInt16LittleEndian(Data.AsSpan(0xD6), (ushort)value); } // unused? + public override int HT_Friendship { get => Data[0xD8]; set => Data[0xD8] = (byte)value; } + public int HT_Intensity { get => Data[0xD9]; set => Data[0xD9] = (byte)value; } + public int HT_Memory { get => Data[0xDA]; set => Data[0xDA] = (byte)value; } + public int HT_Feeling { get => Data[0xDB]; set => Data[0xDB] = (byte)value; } + public int HT_TextVar { get => ReadUInt16LittleEndian(Data.AsSpan(0xDC)); set => WriteUInt16LittleEndian(Data.AsSpan(0xDC), (ushort)value); } + + // 0xDE-0xEB unused + + public override byte Fullness { get => Data[0xEC]; set => Data[0xEC] = value; } + public override byte Enjoyment { get => Data[0xED]; set => Data[0xED] = value; } + public override int Version { get => Data[0xEE]; set => Data[0xEE] = (byte)value; } + public int BattleVersion { get => Data[0xEF]; set => Data[0xEF] = (byte)value; } + // public override int Region { get => Data[0xF0]; set => Data[0xF0] = (byte)value; } + // public override int ConsoleRegion { get => Data[0xF1]; set => Data[0xF1] = (byte)value; } + public override int Language { get => Data[0xF2]; set => Data[0xF2] = (byte)value; } + public int UnkF3 { get => Data[0xF3]; set => Data[0xF3] = (byte)value; } + public uint FormArgument { get => ReadUInt32LittleEndian(Data.AsSpan(0xF4)); set => WriteUInt32LittleEndian(Data.AsSpan(0xF4), value); } + public byte FormArgumentRemain { get => (byte)FormArgument; set => FormArgument = (FormArgument & ~0xFFu) | value; } + public byte FormArgumentElapsed { get => (byte)(FormArgument >> 8); set => FormArgument = (FormArgument & ~0xFF00u) | (uint)(value << 8); } + public byte FormArgumentMaximum { get => (byte)(FormArgument >> 16); set => FormArgument = (FormArgument & ~0xFF0000u) | (uint)(value << 16); } + public sbyte AffixedRibbon { get => (sbyte)Data[0xF8]; set => Data[0xF8] = (byte)value; } // selected ribbon + // remainder unused + #endregion + #region Block D + public override string OT_Name + { + get => StringConverter8.GetString(OT_Trash); + set => StringConverter8.SetString(OT_Trash, value.AsSpan(), 12, StringConverterOption.None); + } + + public override int OT_Friendship { get => Data[0x12A]; set => Data[0x12A] = (byte)value; } + public int OT_Intensity { get => Data[0x12B]; set => Data[0x12B] = (byte)value; } + public int OT_Memory { get => Data[0x12C]; set => Data[0x12C] = (byte)value; } + // 0x12D unused align + public int OT_TextVar { get => ReadUInt16LittleEndian(Data.AsSpan(0x12E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x12E), (ushort)value); } + public int OT_Feeling { get => Data[0x130]; set => Data[0x130] = (byte)value; } + public override int Egg_Year { get => Data[0x131]; set => Data[0x131] = (byte)value; } + public override int Egg_Month { get => Data[0x132]; set => Data[0x132] = (byte)value; } + public override int Egg_Day { get => Data[0x133]; set => Data[0x133] = (byte)value; } + public override int Met_Year { get => Data[0x134]; set => Data[0x134] = (byte)value; } + public override int Met_Month { get => Data[0x135]; set => Data[0x135] = (byte)value; } + public override int Met_Day { get => Data[0x136]; set => Data[0x136] = (byte)value; } + public override int Ball { get => Data[0x137]; set => Data[0x137] = (byte)value; } + public override int Egg_Location { get => ReadUInt16LittleEndian(Data.AsSpan(0x138)); set => WriteUInt16LittleEndian(Data.AsSpan(0x138), (ushort)value); } + public override int Met_Location { get => ReadUInt16LittleEndian(Data.AsSpan(0x13A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x13A), (ushort)value); } + // 0x13C unused align + public override int Met_Level { get => Data[0x13D] & ~0x80; set => Data[0x13D] = (byte)((Data[0x13D] & 0x80) | value); } + public override int OT_Gender { get => Data[0x13D] >> 7; set => Data[0x13D] = (byte)((Data[0x13D] & ~0x80) | (value << 7)); } + public int HyperTrainFlags { get => Data[0x13E]; set => Data[0x13E] = (byte)value; } + public bool HT_HP { get => ((HyperTrainFlags >> 0) & 1) == 1; set => HyperTrainFlags = (HyperTrainFlags & ~(1 << 0)) | ((value ? 1 : 0) << 0); } + public bool HT_ATK { get => ((HyperTrainFlags >> 1) & 1) == 1; set => HyperTrainFlags = (HyperTrainFlags & ~(1 << 1)) | ((value ? 1 : 0) << 1); } + public bool HT_DEF { get => ((HyperTrainFlags >> 2) & 1) == 1; set => HyperTrainFlags = (HyperTrainFlags & ~(1 << 2)) | ((value ? 1 : 0) << 2); } + public bool HT_SPA { get => ((HyperTrainFlags >> 3) & 1) == 1; set => HyperTrainFlags = (HyperTrainFlags & ~(1 << 3)) | ((value ? 1 : 0) << 3); } + public bool HT_SPD { get => ((HyperTrainFlags >> 4) & 1) == 1; set => HyperTrainFlags = (HyperTrainFlags & ~(1 << 4)) | ((value ? 1 : 0) << 4); } + public bool HT_SPE { get => ((HyperTrainFlags >> 5) & 1) == 1; set => HyperTrainFlags = (HyperTrainFlags & ~(1 << 5)) | ((value ? 1 : 0) << 5); } + + public bool GetMoveRecordFlag(int index) + { + if ((uint)index > 112) // 14 bytes, 8 bits + throw new ArgumentOutOfRangeException(nameof(index)); + int ofs = index >> 3; + return FlagUtil.GetFlag(Data, 0x13F + ofs, index & 7); + } + + public void SetMoveRecordFlag(int index, bool value) + { + if ((uint)index > 112) // 14 bytes, 8 bits + throw new ArgumentOutOfRangeException(nameof(index)); + int ofs = index >> 3; + FlagUtil.SetFlag(Data, 0x13F + ofs, index & 7, value); + } + + public bool GetMoveRecordFlagAny() => Array.FindIndex(Data, 0x13F, 14, z => z != 0) >= 0; + + // Why did you mis-align this field, GameFreak? + public ulong Tracker + { + get => ReadUInt64LittleEndian(Data.AsSpan(0x14D)); + set => WriteUInt64LittleEndian(Data.AsSpan(0x14D), value); + } + + public bool GetPurchasedRecordFlag(int index) + { + if ((uint)index > 63) // 8 bytes, 8 bits + throw new ArgumentOutOfRangeException(nameof(index)); + int ofs = index >> 3; + return FlagUtil.GetFlag(Data, 0x155 + ofs, index & 7); + } + + public void SetPurchasedRecordFlag(int index, bool value) + { + if ((uint)index > 63) // 8 bytes, 8 bits + throw new ArgumentOutOfRangeException(nameof(index)); + int ofs = index >> 3; + FlagUtil.SetFlag(Data, 0x155 + ofs, index & 7, value); + } + + public bool GetPurchasedRecordFlagAny() => Array.FindIndex(Data, 0x155, 8, z => z != 0) >= 0; + + public bool GetMasteredRecordFlag(int index) + { + if ((uint)index > 63) // 8 bytes, 8 bits + throw new ArgumentOutOfRangeException(nameof(index)); + int ofs = index >> 3; + return FlagUtil.GetFlag(Data, 0x15D + ofs, index & 7); + } + + public void SetMasteredRecordFlag(int index, bool value) + { + if ((uint)index > 63) // 8 bytes, 8 bits + throw new ArgumentOutOfRangeException(nameof(index)); + int ofs = index >> 3; + FlagUtil.SetFlag(Data, 0x15D + ofs, index & 7, value); + } + + public bool GetMasteredRecordFlagAny() => Array.FindIndex(Data, 0x15D, 8, z => z != 0) >= 0; + + #endregion + #region Battle Stats + public override int Stat_Level { get => Data[0x168]; set => Data[0x168] = (byte)value; } + // 0x149 unused alignment + public override int Stat_HPMax { get => ReadUInt16LittleEndian(Data.AsSpan(0x16A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x16A), (ushort)value); } + public override int Stat_ATK { get => ReadUInt16LittleEndian(Data.AsSpan(0x16C)); set => WriteUInt16LittleEndian(Data.AsSpan(0x16C), (ushort)value); } + public override int Stat_DEF { get => ReadUInt16LittleEndian(Data.AsSpan(0x16E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x16E), (ushort)value); } + public override int Stat_SPE { get => ReadUInt16LittleEndian(Data.AsSpan(0x170)); set => WriteUInt16LittleEndian(Data.AsSpan(0x170), (ushort)value); } + public override int Stat_SPA { get => ReadUInt16LittleEndian(Data.AsSpan(0x172)); set => WriteUInt16LittleEndian(Data.AsSpan(0x172), (ushort)value); } + public override int Stat_SPD { get => ReadUInt16LittleEndian(Data.AsSpan(0x174)); set => WriteUInt16LittleEndian(Data.AsSpan(0x174), (ushort)value); } + #endregion + + public override ushort[] GetStats(PersonalInfo p) => CalculateStatsArceus(p); + + public ushort[] CalculateStatsArceus(PersonalInfo p) + { + int level = CurrentLevel; + int nature = StatNature; + + return new[] + { + (ushort)(GetGanbaruStat(p.HP, HT_HP ? 31 : IV_HP, GV_HP, level) + GetStatHp(p.HP, level)), + (ushort)(GetGanbaruStat(p.ATK, HT_ATK ? 31 : IV_ATK, GV_ATK, level) + GetStat(p.ATK, level, nature, 0)), + (ushort)(GetGanbaruStat(p.DEF, HT_DEF ? 31 : IV_DEF, GV_DEF, level) + GetStat(p.DEF, level, nature, 1)), + (ushort)(GetGanbaruStat(p.SPE, HT_SPE ? 31 : IV_SPE, GV_SPE, level) + GetStat(p.SPE, level, nature, 4)), + (ushort)(GetGanbaruStat(p.SPA, HT_SPA ? 31 : IV_SPA, GV_SPA, level) + GetStat(p.SPA, level, nature, 2)), + (ushort)(GetGanbaruStat(p.SPD, HT_SPD ? 31 : IV_SPD, GV_SPD, level) + GetStat(p.SPD, level, nature, 3)), + }; + } + + public static int GetGanbaruStat(int baseStat, int iv, int gv, int level) + { + int mul = GanbaruExtensions.GetGanbaruMultiplier(gv, iv); + double step1 = Math.Abs(Math.Sqrt((float)baseStat)) * mul; // The game does abs after sqrt; should be before. It's fine because baseStat is never negative. + var result = ((float)step1 + level) / 2.5f; + return (int)Math.Round(result, MidpointRounding.AwayFromZero); + } + + public static int GetStatHp(int baseStat, int level) + { + return (int)((((level / 100.0f) + 1.0f) * baseStat) + level); + } + + public static int GetStat(int baseStat, int level, int nature, int statIndex) + { + var initial = (int)((((level / 50.0f) + 1.0f) * baseStat) / 1.5f); + return AmplifyStat(nature, statIndex, initial); + } + + private static int AmplifyStat(int nature, int index, int initial) => GetNatureAmp(nature, index) switch + { + 1 => 110 * initial / 100, // 110% + -1 => 90 * initial / 100, // 90% + _ => initial, + }; + + private static sbyte GetNatureAmp(int nature, int index) + { + if ((uint)nature >= 25) + return -1; + return NatureAmpTable[(5 * nature) + index]; + } + + private static readonly sbyte[] NatureAmpTable = + { + 0, 0, 0, 0, 0, // Hardy + 1,-1, 0, 0, 0, // Lonely + 1, 0, 0, 0,-1, // Brave + 1, 0,-1, 0, 0, // Adamant + 1, 0, 0,-1, 0, // Naughty + -1, 1, 0, 0, 0, // Bold + 0, 0, 0, 0, 0, // Docile + 0, 1, 0, 0,-1, // Relaxed + 0, 1,-1, 0, 0, // Impish + 0, 1, 0,-1, 0, // Lax + -1, 0, 0, 0, 1, // Timid + 0,-1, 0, 0, 1, // Hasty + 0, 0, 0, 0, 0, // Serious + 0, 0,-1, 0, 1, // Jolly + 0, 0, 0,-1, 1, // Naive + -1, 0, 1, 0, 0, // Modest + 0,-1, 1, 0, 0, // Mild + 0, 0, 1, 0,-1, // Quiet + 0, 0, 0, 0, 0, // Bashful + 0, 0, 1,-1, 0, // Rash + -1, 0, 0, 1, 0, // Calm + 0,-1, 0, 1, 0, // Gentle + 0, 0, 0, 1,-1, // Sassy + 0, 0,-1, 1, 0, // Careful + 0, 0, 0, 0, 0, // Quirky + }; + + public override int[] Markings + { + get + { + int[] marks = new int[8]; + int val = MarkValue; + for (int i = 0; i < marks.Length; i++) + marks[i] = ((val >> (i * 2)) & 3) % 3; + return marks; + } + set => SetMarkings(value); + } + + public override void SetMarkings(ReadOnlySpan value) + { + if (value.Length > 8) + return; + int v = 0; + for (int i = 0; i < value.Length; i++) + v |= (value[i] % 3) << (i * 2); + MarkValue = v; + } + + public bool GetRibbon(int index) => FlagUtil.GetFlag(Data, GetRibbonByte(index), index & 7); + public void SetRibbon(int index, bool value = true) => FlagUtil.SetFlag(Data, GetRibbonByte(index), index & 7, value); + + public int GetRibbonByte(int index) + { + if ((uint)index >= 128) + throw new ArgumentOutOfRangeException(nameof(index)); + if (index < 64) + return 0x34 + (index >> 3); + index -= 64; + return 0x40 + (index >> 3); + } + + public void Trade(ITrainerInfo tr, int Day = 29, int Month = 1, int Year = 2022) + { + if (IsEgg) + { + // Apply link trade data, only if it left the OT (ignore if dumped & imported, or cloned, etc) + if ((tr.OT != OT_Name) || (tr.TID != TID) || (tr.SID != SID) || (tr.Gender != OT_Gender)) + SetLinkTradeEgg(Day, Month, Year, Locations.LinkTrade6NPC); + return; + } + + // Process to the HT if the OT of the Pokémon does not match the SAV's OT info. + if (!TradeOT(tr)) + TradeHT(tr); + } + + public void FixMemories() + { + if (LA) + { + OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; + HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; // future inter-format conversion? + } + + if (IsEgg) // No memories if is egg. + { + HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; + OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; + + // Clear Handler + if (!IsTradedEgg) + { + HT_Friendship = HT_Language = HT_Gender = 0; + HT_Trash.Clear(); + } + return; + } + + if (IsUntraded) + HT_Language = HT_Friendship = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = HT_Gender = 0; + + int gen = Generation; + if (gen < 6) + OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; + // if (gen != 8) // must be transferred via HOME, and must have memories + // this.SetTradeMemoryHT8(); // not faking HOME tracker. + } + + private bool TradeOT(ITrainerInfo tr) + { + // Check to see if the OT matches the SAV's OT info. + if (!(tr.OT == OT_Name && tr.TID == TID && tr.SID == SID && tr.Gender == OT_Gender)) + return false; + + CurrentHandler = 0; + return true; + } + + private void TradeHT(ITrainerInfo tr) + { + if (HT_Name != tr.OT) + { + HT_Friendship = PersonalInfo.BaseFriendship; + HT_Name = tr.OT; + } + CurrentHandler = 1; + HT_Gender = tr.Gender; + HT_Language = tr.Language; + } + + // Maximums + public override int MaxMoveID => Legal.MaxMoveID_8a; + public override int MaxSpeciesID => Legal.MaxSpeciesID_8a; + public override int MaxAbilityID => Legal.MaxAbilityID_8a; + public override int MaxItemID => Legal.MaxItemID_8a; + public override int MaxBallID => Legal.MaxBallID_8a; + public override int MaxGameID => Legal.MaxGameID_8a; + + // Casts are as per the game code; they may seem redundant but every bit of precision matters? + // This still doesn't precisely match :( -- just use a tolerance check when updating. + // If anyone can figure out how to get all precision to match, feel free to update :) + public float HeightRatio => GetHeightRatio(HeightScalar); + public float WeightRatio => GetWeightRatio(WeightScalar); + + public float CalcHeightAbsolute => GetHeightAbsolute(PersonalInfo, HeightScalar); + public float CalcWeightAbsolute => GetWeightAbsolute(PersonalInfo, HeightScalar, WeightScalar); + + public void ResetHeight() + { + var current = HeightAbsolute; + var updated = CalcHeightAbsolute; + if (Math.Abs(current - updated) > 0.0001f) + HeightAbsolute = updated; + } + + public void ResetWeight() + { + var current = WeightAbsolute; + var updated = CalcWeightAbsolute; + if (Math.Abs(current - updated) > 0.0001f) + WeightAbsolute = updated; + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + private static float GetHeightRatio(int heightScalar) + { + // +/- 20% (down from +/- 40% in LGP/E) + float result = (byte)heightScalar / 255f; + result *= 0.4f; + result += 0.8f; + return result; + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + private static float GetWeightRatio(int weightScalar) + { + // +/- 20% + float result = (byte)weightScalar / 255f; + result *= 0.4f; + result += 0.8f; + return result; + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public static float GetHeightAbsolute(PersonalInfo p, int heightScalar) + { + float HeightRatio = GetHeightRatio(heightScalar); + return HeightRatio * p.Height; + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public static float GetWeightAbsolute(PersonalInfo p, int heightScalar, int weightScalar) + { + float HeightRatio = GetHeightRatio(heightScalar); + float WeightRatio = GetWeightRatio(weightScalar); + + float weight = WeightRatio * p.Weight; + return HeightRatio * weight; + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public static byte GetHeightScalar(float height, int avgHeight) + { + // height is already *100 + float biasH = avgHeight * -0.8f; + float biasL = avgHeight * 0.4f; + float numerator = biasH + height; + float result = numerator / biasL; + result *= 255f; + int value = (int)result; + int unsigned = value & ~(value >> 31); + return (byte)Math.Min(255, unsigned); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public static byte GetWeightScalar(float height, float weight, int avgHeight, int avgWeight) + { + // height is already *100 + // weight is already *10 + float heightRatio = height / avgHeight; + float weightComponent = heightRatio * weight; + float top = avgWeight * -0.8f; + top += weightComponent; + float bot = avgWeight * 0.4f; + float result = top / bot; + result *= 255f; + int value = (int)result; + int unsigned = value & ~(value >> 31); + return (byte)Math.Min(255, unsigned); + } + + public int GetRandomAlphaMove() + { + var index = MoveShopPermitFlags.IndexOf(true); + if (index == -1) + return 0; + return MoveShopPermitIndexes[index]; + } + + public void SetMasteryFlags() + { + for (int i = 0; i < 4; i++) + SetMasteryFlagMove(GetMove(i)); + } + + public void SetMasteryFlagMove(int move) + { + var moves = MoveShopPermitIndexes; + int flagIndex = moves.IndexOf(move); + if (flagIndex == -1) + return; + if (MoveShopPermitFlags[flagIndex]) + SetMasteredRecordFlag(flagIndex, true); + } +} diff --git a/PKHeX.Core/PKM/PB7.cs b/PKHeX.Core/PKM/PB7.cs index a8f89fd7bbf..48c3c839691 100644 --- a/PKHeX.Core/PKM/PB7.cs +++ b/PKHeX.Core/PKM/PB7.cs @@ -6,7 +6,7 @@ namespace PKHeX.Core { /// Generation 7 format used for . - public sealed class PB7 : G6PKM, IHyperTrain, IAwakened, IScaledSize, IFavorite, IFormArgument + public sealed class PB7 : G6PKM, IHyperTrain, IAwakened, IScaledSizeValue, ICombatPower, IFavorite, IFormArgument { public static readonly ushort[] Unused = { diff --git a/PKHeX.Core/PKM/PB8.cs b/PKHeX.Core/PKM/PB8.cs index 28213ddf088..ca1c01790c9 100644 --- a/PKHeX.Core/PKM/PB8.cs +++ b/PKHeX.Core/PKM/PB8.cs @@ -1,121 +1,120 @@ using System.Collections.Generic; -namespace PKHeX.Core +namespace PKHeX.Core; + +/// Generation 8 format. +public sealed class PB8 : G8PKM { - /// Generation 8 format. - public sealed class PB8 : G8PKM + private static readonly ushort[] Unused = { - private static readonly ushort[] Unused = - { - // Alignment bytes - 0x17, 0x1A, 0x1B, 0x23, 0x33, 0x3E, 0x3F, - 0x4C, 0x4D, 0x4E, 0x4F, - 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + // Alignment bytes + 0x17, 0x1A, 0x1B, 0x23, 0x33, 0x3E, 0x3F, + 0x4C, 0x4D, 0x4E, 0x4F, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x91, 0x92, 0x93, - 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, + 0x91, 0x92, 0x93, + 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, - 0xC5, - 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, - 0xE0, 0xE1, // Old Console Region / Region - 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, - 0x115, 0x11F, // Alignment + 0xC5, + 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, + 0xE0, 0xE1, // Old Console Region / Region + 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0x115, 0x11F, // Alignment - 0x13D, 0x13E, 0x13F, - 0x140, 0x141, 0x142, 0x143, 0x144, 0x145, 0x146, 0x147, - }; + 0x13D, 0x13E, 0x13F, + 0x140, 0x141, 0x142, 0x143, 0x144, 0x145, 0x146, 0x147, + }; - public override IReadOnlyList ExtraBytes => Unused; - public override PersonalInfo PersonalInfo => PersonalTable.BDSP.GetFormEntry(Species, Form); + public override IReadOnlyList ExtraBytes => Unused; + public override PersonalInfo PersonalInfo => PersonalTable.BDSP.GetFormEntry(Species, Form); - public PB8() - { - Egg_Location = Met_Location = Locations.Default8bNone; - AffixedRibbon = -1; // 00 would make it show Kalos Champion :) - } + public PB8() + { + Egg_Location = Met_Location = Locations.Default8bNone; + AffixedRibbon = -1; // 00 would make it show Kalos Champion :) + } - public PB8(byte[] data) : base(data) { } - public override PKM Clone() => new PB8((byte[])Data.Clone()); + public PB8(byte[] data) : base(data) { } + public override PKM Clone() => new PB8((byte[])Data.Clone()); - public void Trade(ITrainerInfo tr, int Day = 1, int Month = 1, int Year = 2015) + public void Trade(ITrainerInfo tr, int Day = 1, int Month = 1, int Year = 2015) + { + if (IsEgg) { - if (IsEgg) - { - // Apply link trade data, only if it left the OT (ignore if dumped & imported, or cloned, etc) - if ((tr.OT != OT_Name) || (tr.TID != TID) || (tr.SID != SID) || (tr.Gender != OT_Gender)) - SetLinkTradeEgg(Day, Month, Year, Locations.LinkTrade6NPC); + // Apply link trade data, only if it left the OT (ignore if dumped & imported, or cloned, etc) + if ((tr.OT != OT_Name) || (tr.TID != TID) || (tr.SID != SID) || (tr.Gender != OT_Gender)) + SetLinkTradeEgg(Day, Month, Year, Locations.LinkTrade6NPC); - // Unfortunately, BDSP doesn't return if it's an egg, and can update the HT details & handler. - // Continue to the rest of the method. - // return; - } + // Unfortunately, BDSP doesn't return if it's an egg, and can update the HT details & handler. + // Continue to the rest of the method. + // return; + } - // Process to the HT if the OT of the Pokémon does not match the SAV's OT info. - if (!TradeOT(tr)) - TradeHT(tr); + // Process to the HT if the OT of the Pokémon does not match the SAV's OT info. + if (!TradeOT(tr)) + TradeHT(tr); + } + + public void FixMemories() + { + if (BDSP) + { + OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; + HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; // future inter-format conversion? } - public void FixMemories() + if (IsEgg) // No memories if is egg. { - if (BDSP) - { - OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; - HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; // future inter-format conversion? - } + HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; + OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; - if (IsEgg) // No memories if is egg. + // Clear Handler + if (!IsTradedEgg) { - HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; - OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; - - // Clear Handler - if (!IsTradedEgg) - { - HT_Friendship = HT_Language = HT_Gender = 0; - HT_Trash.Clear(); - } - return; + HT_Friendship = HT_Language = HT_Gender = 0; + HT_Trash.Clear(); } + return; + } - if (IsUntraded) - HT_Language = HT_Friendship = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = HT_Gender = 0; + if (IsUntraded) + HT_Language = HT_Friendship = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = HT_Gender = 0; - int gen = Generation; - if (gen < 6) - OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; - // if (gen != 8) // must be transferred via HOME, and must have memories - // this.SetTradeMemoryHT8(); // not faking HOME tracker. - } + int gen = Generation; + if (gen < 6) + OT_TextVar = OT_Memory = OT_Intensity = OT_Feeling = 0; + // if (gen != 8) // must be transferred via HOME, and must have memories + // this.SetTradeMemoryHT8(); // not faking HOME tracker. + } - private bool TradeOT(ITrainerInfo tr) - { - // Check to see if the OT matches the SAV's OT info. - if (!(tr.OT == OT_Name && tr.TID == TID && tr.SID == SID && tr.Gender == OT_Gender)) - return false; + private bool TradeOT(ITrainerInfo tr) + { + // Check to see if the OT matches the SAV's OT info. + if (!(tr.OT == OT_Name && tr.TID == TID && tr.SID == SID && tr.Gender == OT_Gender)) + return false; - CurrentHandler = 0; - return true; - } + CurrentHandler = 0; + return true; + } - private void TradeHT(ITrainerInfo tr) + private void TradeHT(ITrainerInfo tr) + { + if (HT_Name != tr.OT) { - if (HT_Name != tr.OT) - { - HT_Friendship = PersonalInfo.BaseFriendship; - HT_Name = tr.OT; - } - CurrentHandler = 1; - HT_Gender = tr.Gender; - HT_Language = tr.Language; - //this.SetTradeMemoryHT8(); + HT_Friendship = PersonalInfo.BaseFriendship; + HT_Name = tr.OT; } - - // Maximums - public override int MaxMoveID => Legal.MaxMoveID_8b; - public override int MaxSpeciesID => Legal.MaxSpeciesID_8b; - public override int MaxAbilityID => Legal.MaxAbilityID_8b; - public override int MaxItemID => Legal.MaxItemID_8b; - public override int MaxBallID => Legal.MaxBallID_8b; - public override int MaxGameID => Legal.MaxGameID_8b; + CurrentHandler = 1; + HT_Gender = tr.Gender; + HT_Language = tr.Language; + //this.SetTradeMemoryHT8(); } + + // Maximums + public override int MaxMoveID => Legal.MaxMoveID_8b; + public override int MaxSpeciesID => Legal.MaxSpeciesID_8b; + public override int MaxAbilityID => Legal.MaxAbilityID_8b; + public override int MaxItemID => Legal.MaxItemID_8b; + public override int MaxBallID => Legal.MaxBallID_8b; + public override int MaxGameID => Legal.MaxGameID_8b; } diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index b7bbb4bbd52..30ab18d5298 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -289,6 +289,7 @@ private void SetID7(int sid7, int tid7) public bool LGPE => Version is (int)GP or (int)GE; public bool SWSH => Version is (int)SW or (int)SH; public bool BDSP => Version is (int)BD or (int)SP; + public bool LA => Version is (int)PLA; public bool GO_LGPE => GO && Met_Location == Locations.GO7; public bool GO_HOME => GO && Met_Location == Locations.GO8; diff --git a/PKHeX.Core/PKM/Shared/IAlpha.cs b/PKHeX.Core/PKM/Shared/IAlpha.cs new file mode 100644 index 00000000000..4cdcbe076b3 --- /dev/null +++ b/PKHeX.Core/PKM/Shared/IAlpha.cs @@ -0,0 +1,9 @@ +namespace PKHeX.Core; + +/// +/// Interface that exposes an indication if the Pokémon is an alpha Pokémon. +/// +public interface IAlpha +{ + bool IsAlpha { get; set; } +} diff --git a/PKHeX.Core/PKM/Shared/IDynamaxLevel.cs b/PKHeX.Core/PKM/Shared/IDynamaxLevel.cs index 2307f125990..5c5fe38acf9 100644 --- a/PKHeX.Core/PKM/Shared/IDynamaxLevel.cs +++ b/PKHeX.Core/PKM/Shared/IDynamaxLevel.cs @@ -13,7 +13,7 @@ public static bool CanHaveDynamaxLevel(this IDynamaxLevel _, PKM pkm) { if (pkm.IsEgg) return false; - if (pkm.BDSP) + if (pkm.BDSP || pkm.LA) return false; return CanHaveDynamaxLevel(pkm.Species); } diff --git a/PKHeX.Core/PKM/Shared/IFormArgument.cs b/PKHeX.Core/PKM/Shared/IFormArgument.cs index 1eb1bec1c6f..ae001ed7edf 100644 --- a/PKHeX.Core/PKM/Shared/IFormArgument.cs +++ b/PKHeX.Core/PKM/Shared/IFormArgument.cs @@ -53,6 +53,9 @@ public static void SetSuggestedFormArgument(this PKM pkm, int originalSpecies = var suggest = originalSpecies switch { (int) Yamask when pkm.Species == (int) Runerigus => 49u, + (int) Qwilfish when pkm.Species == (int) Overqwil => 20u, + (int) Stantler when pkm.Species == (int) Wyrdeer => 20u, + (int) Basculin when pkm.Species == (int) Basculegion => 294u, _ => 0u, }; pkm.ChangeFormArgument(suggest); @@ -114,6 +117,10 @@ public static uint GetFormArgumentMax(int species, int form, int generation) (int)Yamask when form == 1 => 9999, (int)Runerigus when form == 0 => 9999, (int)Alcremie => (uint)AlcremieDecoration.Ribbon, + ((int)Qwilfish or (int)Overqwil) when generation == 8 => 9999, // 20 + ((int)Stantler or (int)Wyrdeer) when generation == 8 => 9999, // 20 + (int)Basculin when form == 2 => 9999, + (int)Basculegion => 9999, _ => 0, }; } diff --git a/PKHeX.Core/PKM/Shared/IGanbaru.cs b/PKHeX.Core/PKM/Shared/IGanbaru.cs new file mode 100644 index 00000000000..fa54f55af2c --- /dev/null +++ b/PKHeX.Core/PKM/Shared/IGanbaru.cs @@ -0,0 +1,109 @@ +using System; + +namespace PKHeX.Core; + +public interface IGanbaru +{ + int GV_HP { get; set; } + int GV_ATK { get; set; } + int GV_DEF { get; set; } + int GV_SPE { get; set; } + int GV_SPA { get; set; } + int GV_SPD { get; set; } +} + +public static class GanbaruExtensions +{ + public const int TrueMax = 10; + + private static readonly ushort[] GanbaruMultiplier = { 0, 2, 3, 4, 7, 8, 9, 14, 15, 16, 25 }; + + public static int GetMax(this IGanbaru _, PKM pk, int index) => GetMaxGanbaru(pk, index); + + public static int GetMaxGanbaru(this PKM pk, int index) + { + var iv = pk.GetIV(index); + return GetMaxGanbaru(iv); + } + + private static int GetMaxGanbaru(int iv) + { + var bias = GetBias(iv); + return TrueMax - bias; + } + + public static int GetBias(int iv) => iv switch + { + >= 31 => 3, + >= 26 => 2, + >= 20 => 1, + _ => 0, + }; + + public static void SetSuggestedGanbaruValues(this IGanbaru g, PKM pk) + { + g.GV_HP = GetMaxGanbaru(pk.IV_HP); + g.GV_ATK = pk.IV_ATK == 0 ? 0 : GetMaxGanbaru(pk.IV_ATK); + g.GV_DEF = GetMaxGanbaru(pk.IV_DEF); + g.GV_SPE = pk.IV_SPE == 0 ? 0 : GetMaxGanbaru(pk.IV_SPE); + g.GV_SPA = GetMaxGanbaru(pk.IV_SPA); + g.GV_SPD = GetMaxGanbaru(pk.IV_SPD); + } + + public static bool IsGanbaruValuesMax(this IGanbaru g, PKM pk) + { + var result = true; + result &= g.GV_HP == GetMaxGanbaru(pk.IV_HP); + result &= g.GV_ATK >= (pk.IV_ATK == 0 ? 0 : GetMaxGanbaru(pk.IV_ATK)); + result &= g.GV_DEF == GetMaxGanbaru(pk.IV_DEF); + result &= g.GV_SPE >= (pk.IV_SPE == 0 ? 0 : GetMaxGanbaru(pk.IV_SPE)); + result &= g.GV_SPA == GetMaxGanbaru(pk.IV_SPA); + result &= g.GV_SPD == GetMaxGanbaru(pk.IV_SPD); + return result; + } + + public static void ClearGanbaruValues(this IGanbaru g) + { + g.GV_HP = 0; + g.GV_ATK = 0; + g.GV_DEF = 0; + g.GV_SPE = 0; + g.GV_SPA = 0; + g.GV_SPD = 0; + } + + public static int GetGanbaruMultiplier(int gv, int iv) => GanbaruMultiplier[Math.Min(gv + GetBias(iv), 10)]; + + /// + /// Sets one of the values based on its index within the array. + /// + /// Pokémon to modify. + /// Index to set to + /// Value to set + public static int SetGV(this IGanbaru pk, int index, int value) => index switch + { + 0 => pk.GV_HP = value, + 1 => pk.GV_ATK = value, + 2 => pk.GV_DEF = value, + 3 => pk.GV_SPE = value, + 4 => pk.GV_SPA = value, + 5 => pk.GV_SPD = value, + _ => throw new ArgumentOutOfRangeException(nameof(index)), + }; + + /// + /// Sets one of the values based on its index within the array. + /// + /// Pokémon to check. + /// Index to get + public static int GetGV(this IGanbaru pk, int index) => index switch + { + 0 => pk.GV_HP, + 1 => pk.GV_ATK, + 2 => pk.GV_DEF, + 3 => pk.GV_SPE, + 4 => pk.GV_SPA, + 5 => pk.GV_SPD, + _ => throw new ArgumentOutOfRangeException(nameof(index)), + }; +} diff --git a/PKHeX.Core/PKM/Shared/IHyperTrain.cs b/PKHeX.Core/PKM/Shared/IHyperTrain.cs index 2b7088a2ef6..6b9846cb536 100644 --- a/PKHeX.Core/PKM/Shared/IHyperTrain.cs +++ b/PKHeX.Core/PKM/Shared/IHyperTrain.cs @@ -61,7 +61,7 @@ public static void SetSuggestedHyperTrainingData(this PKM pkm, int[]? IVs = null { if (pkm is not IHyperTrain t) return; - if (pkm.CurrentLevel < 100) + if (!pkm.IsHyperTrainingAvailable()) { t.HyperTrainFlags = 0; return; @@ -82,5 +82,32 @@ public static void SetSuggestedHyperTrainingData(this PKM pkm, int[]? IVs = null if (pkm is PB7 pb) pb.ResetCP(); } + + /// + /// Indicates if Hyper Training is available for toggling. + /// + /// Entity to train + /// True if available, otherwise false. + public static bool IsHyperTrainingAvailable(this IHyperTrain t) + { + // Check for game formats where training is unavailable: + if (t is PA8) + return false; + + return true; + } + + /// + /// Entity data + public static bool IsHyperTrainingAvailable(this PKM pk) + { + if (pk is not IHyperTrain t) + return false; + if (!t.IsHyperTrainingAvailable()) + return false; + + // Gated behind level 100. + return pk.CurrentLevel == 100; + } } } diff --git a/PKHeX.Core/PKM/Shared/IMoveShop8.cs b/PKHeX.Core/PKM/Shared/IMoveShop8.cs new file mode 100644 index 00000000000..8cc9972c047 --- /dev/null +++ b/PKHeX.Core/PKM/Shared/IMoveShop8.cs @@ -0,0 +1,19 @@ +using System; + +namespace PKHeX.Core; + +public interface IMoveShop8 +{ + ReadOnlySpan MoveShopPermitFlags { get; } + ReadOnlySpan MoveShopPermitIndexes { get; } + bool GetPurchasedRecordFlag(int index); + void SetPurchasedRecordFlag(int index, bool value); + bool GetPurchasedRecordFlagAny(); +} + +public interface IMoveShop8Mastery : IMoveShop8 +{ + bool GetMasteredRecordFlag(int index); + void SetMasteredRecordFlag(int index, bool value); + bool GetMasteredRecordFlagAny(); +} diff --git a/PKHeX.Core/PKM/Shared/INoble.cs b/PKHeX.Core/PKM/Shared/INoble.cs new file mode 100644 index 00000000000..97da21d3d39 --- /dev/null +++ b/PKHeX.Core/PKM/Shared/INoble.cs @@ -0,0 +1,9 @@ +namespace PKHeX.Core; + +/// +/// Interface that exposes an indication if the Pokémon is a Noble Pokémon. +/// +public interface INoble +{ + bool IsNoble { get; set; } +} diff --git a/PKHeX.Core/PKM/Shared/IScaledSize.cs b/PKHeX.Core/PKM/Shared/IScaledSize.cs index e42a92f5423..13ac63fa431 100644 --- a/PKHeX.Core/PKM/Shared/IScaledSize.cs +++ b/PKHeX.Core/PKM/Shared/IScaledSize.cs @@ -1,8 +1,27 @@ -namespace PKHeX.Core -{ - public interface IScaledSize - { - int WeightScalar { get; set; } - int HeightScalar { get; set; } - } -} \ No newline at end of file +namespace PKHeX.Core; + +public interface IScaledSize +{ + int WeightScalar { get; set; } + int HeightScalar { get; set; } +} + +public interface IScaledSizeAbsolute +{ + float HeightAbsolute { get; set; } + float WeightAbsolute { get; set; } +} + +public interface IScaledSizeValue : IScaledSize, IScaledSizeAbsolute +{ + void ResetHeight(); + void ResetWeight(); + float CalcHeightAbsolute { get; } + float CalcWeightAbsolute { get; } +} + +public interface ICombatPower +{ + int Stat_CP { get; set; } + void ResetCP(); +} diff --git a/PKHeX.Core/PKM/Shared/ITechRecord8.cs b/PKHeX.Core/PKM/Shared/ITechRecord8.cs new file mode 100644 index 00000000000..2384abfdd77 --- /dev/null +++ b/PKHeX.Core/PKM/Shared/ITechRecord8.cs @@ -0,0 +1,12 @@ +using System; + +namespace PKHeX.Core; + +public interface ITechRecord8 +{ + ReadOnlySpan TechRecordPermitFlags { get; } + ReadOnlySpan TechRecordPermitIndexes { get; } + bool GetMoveRecordFlag(int index); + void SetMoveRecordFlag(int index, bool state = true); + bool GetMoveRecordFlagAny(); +} diff --git a/PKHeX.Core/PKM/Util/FormConverter.cs b/PKHeX.Core/PKM/Util/FormConverter.cs index 846da7ccdf0..499c033beb8 100644 --- a/PKHeX.Core/PKM/Util/FormConverter.cs +++ b/PKHeX.Core/PKM/Util/FormConverter.cs @@ -34,8 +34,8 @@ public static string[] GetFormList(int species, IReadOnlyList types, IRe <= Legal.MaxSpeciesID_3 => GetFormsGen3(species, types, forms, generation), <= Legal.MaxSpeciesID_4 => GetFormsGen4(species, types, forms, generation), <= Legal.MaxSpeciesID_5 => GetFormsGen5(species, types, forms, generation), - <= Legal.MaxSpeciesID_6 => GetFormsGen6(species, types, forms, genders), - <= Legal.MaxSpeciesID_7_USUM => GetFormsGen7(species, types, forms), + <= Legal.MaxSpeciesID_6 => GetFormsGen6(species, types, forms, genders, generation), + <= Legal.MaxSpeciesID_7_USUM => GetFormsGen7(species, types, forms, generation), _ => GetFormsGen8(species, types, forms, genders), }; } @@ -62,6 +62,8 @@ Eevee when IsGG() => new[] Weezing or Ponyta or Rapidash or Slowpoke or MrMime or Farfetchd or Articuno or Zapdos or Moltres when generation >= 8 => GetFormsGalar(types, forms), + Growlithe or Arcanine or Voltorb or Electrode when generation >= 8 => GetFormsHisui(species, types, forms), + _ => GetFormsAlolan(generation, types, forms, species), }; } @@ -72,6 +74,7 @@ private static string[] GetFormsGen2(int species, IReadOnlyList types, I { Pichu when generation == 4 => GetFormsPichu(types, forms), Slowking or Corsola when generation >= 8 => GetFormsGalar(types, forms), + Typhlosion or Qwilfish or Sneasel when generation >= 8 => GetFormsHisui(species, types, forms), Unown => GetFormsUnown(generation), _ => EMPTY, }; @@ -131,6 +134,10 @@ private static string[] GetFormsGen4(int species, IReadOnlyList types, I forms[920], // Fan forms[921], // Mow }, + Dialga or Palkia when generation >= 8 => new[] { + types[000], // Normal + forms[922], // Origin + }, Giratina => new[] { forms[487], // Altered forms[922], // Origin @@ -139,7 +146,7 @@ private static string[] GetFormsGen4(int species, IReadOnlyList types, I forms[492], // Land forms[923], // Sky }, - Arceus => GetFormsArceus(generation, types), + Arceus => GetFormsArceus(species, generation, types, forms), _ => EMPTY, }; } @@ -148,6 +155,12 @@ private static string[] GetFormsGen5(int species, IReadOnlyList types, I { return (Species)species switch { + Samurott or Lilligant or Zorua or Zoroark or Braviary when generation >= 8 => GetFormsHisui(species, types, forms), + Basculin when generation >= 8 => new[] { + forms[550], // Red + forms[942], // Blue + forms[989], // White + }, Basculin => new[] { forms[550], // Red forms[942], // Blue @@ -197,7 +210,7 @@ private static string[] GetFormsGen5(int species, IReadOnlyList types, I }; } - private static string[] GetFormsGen6(int species, IReadOnlyList types, IReadOnlyList forms, IReadOnlyList genders) + private static string[] GetFormsGen6(int species, IReadOnlyList types, IReadOnlyList forms, IReadOnlyList genders, int generation) { return (Species)species switch { @@ -263,6 +276,7 @@ private static string[] GetFormsGen6(int species, IReadOnlyList types, I forms[681], // Shield forms[1005], // Blade }, + Sliggoo or Goodra or Avalugg when generation >= 8 => GetFormsHisui(species, types, forms), Pumpkaboo or Gourgeist => new[] { forms[710], // Average forms[1006], // Small @@ -288,10 +302,11 @@ private static string[] GetFormsGen6(int species, IReadOnlyList types, I }; } - private static string[] GetFormsGen7(int species, IReadOnlyList types, IReadOnlyList forms) + private static string[] GetFormsGen7(int species, IReadOnlyList types, IReadOnlyList forms, int generation) { return (Species)species switch { + Decidueye when generation >= 8 => GetFormsHisui(species, types, forms), Oricorio => new[] { forms[741], // "RED" - Baile forms[1021], // "YLW" - Pom-Pom @@ -311,7 +326,7 @@ private static string[] GetFormsGen7(int species, IReadOnlyList types, I forms[746], forms[1025], // School }, - Silvally => GetFormsArceus(7, types), + Silvally => GetFormsArceus(species, 7, types, forms), Minior => new[] { forms[774], // "R-Meteor", // Meteor Red forms[1045], // "O-Meteor", // Meteor Orange @@ -359,7 +374,7 @@ private static string[] GetFormsGen8(int species, IReadOnlyList types, I forms[(int)Toxtricity], // Amped forms[LowKey], }, - Indeedee => new[] { + Indeedee or Basculegion => new[] { genders[000], // Male genders[001], // Female }, @@ -407,6 +422,14 @@ private static string[] GetFormsGen8(int species, IReadOnlyList types, I forms[CalyIce], forms[CalyGhost], }, + Kleavor => new[] { + types[000], + forms[Lord], + }, + Enamorus => new[] { + forms[641], // Incarnate + forms[952], // Therian + }, _ => EMPTY, }; } @@ -501,7 +524,7 @@ private static string[] GetFormsPichu(IReadOnlyList types, IReadOnlyList }; } - private static string[] GetFormsArceus(int generation, IReadOnlyList types) + private static string[] GetFormsArceus(int species, int generation, IReadOnlyList types, IReadOnlyList forms) { return generation switch { @@ -544,6 +567,28 @@ private static string[] GetFormsArceus(int generation, IReadOnlyList typ types[15], types[16], // No Fairy type }, + 8 when (Species)species is Arceus => new[] + { + types[00], // Normal + types[01], // Fighting + types[02], // Flying + types[03], // Poison + types[04], // etc + types[05], + types[06], + types[07], + types[08], + types[09], + types[10], + types[11], + types[12], + types[13], + types[14], + types[15], + types[16], + types[17], + forms[Legend], + }, _ => new[] { types[00], // Normal types[01], // Fighting @@ -664,6 +709,30 @@ private static string[] GetFormsGalar(IReadOnlyList types, IReadOnlyList }; } + private static string[] GetFormsHisui(int species, IReadOnlyList types, IReadOnlyList forms) + { + return (Species)species switch + { + Lilligant => new[] + { + types[000], // Normal + forms[Hisuian], + forms[Lady], + }, + Arcanine or Electrode or Avalugg => new[] + { + types[000], // Normal + forms[Hisuian], + forms[Lord], + }, + _ => new[] + { + types[000], // Normal + forms[Hisuian], + } + }; + } + private static string[] GetFormsGalarSlowbro(IReadOnlyList types, IReadOnlyList forms) { return new[] @@ -704,6 +773,11 @@ private static string[] GetFormsGalarSlowbro(IReadOnlyList types, IReadO private const int CalyIce = 1089; // Ice private const int CalyGhost = 1090; // Shadow + private const int Hisuian = 1094; + private const int Lord = 1095; + private const int Lady = 1096; + private const int Legend = 1097; + public static string GetGigantamaxName(IReadOnlyList forms) => forms[Gigantamax]; public static string[] GetAlcremieFormList(IReadOnlyList forms) diff --git a/PKHeX.Core/PKM/Util/PKMConverter.cs b/PKHeX.Core/PKM/Util/PKMConverter.cs index f1f28963418..e0f0e35f532 100644 --- a/PKHeX.Core/PKM/Util/PKMConverter.cs +++ b/PKHeX.Core/PKM/Util/PKMConverter.cs @@ -67,7 +67,7 @@ public static int GetPKMDataFormat(ReadOnlySpan data) return 3; case PokeCrypto.SIZE_4PARTY or PokeCrypto.SIZE_4STORED: case PokeCrypto.SIZE_5PARTY: - if ((ReadUInt16LittleEndian(data[0x4..]) == 0) && (ReadUInt16LittleEndian(data.Slice(0x80)) >= 0x3333 || data[0x5F] >= 0x10) && ReadUInt16LittleEndian(data[0x46..]) == 0) // PK5 + if ((ReadUInt16LittleEndian(data[0x4..]) == 0) && (ReadUInt16LittleEndian(data[0x80..]) >= 0x3333 || data[0x5F] >= 0x10) && ReadUInt16LittleEndian(data[0x46..]) == 0) // PK5 return 5; return 4; case PokeCrypto.SIZE_6STORED: @@ -90,6 +90,8 @@ public static int GetPKMDataFormat(ReadOnlySpan data) return 6; case PokeCrypto.SIZE_8PARTY or PokeCrypto.SIZE_8STORED: return 8; + case PokeCrypto.SIZE_8APARTY or PokeCrypto.SIZE_8ASTORED: + return 8; default: return -1; @@ -125,9 +127,14 @@ public static int GetPKMDataFormat(ReadOnlySpan data) private static PKM CheckPKMFormat8(byte[] data) { + if (data.Length is PokeCrypto.SIZE_8ASTORED or PokeCrypto.SIZE_8APARTY) + return new PA8(data); + var pk8 = new PB8(data); - if (GameVersion.BDSP.Contains(pk8.Version)) + var ver = pk8.Version; + if (GameVersion.BDSP.Contains(ver)) return pk8; + return new PK8(data); } @@ -447,6 +454,7 @@ public static PKM GetBlank(Type type) 1 when ver == GameVersion.BU => new PK1(true), 7 when GameVersion.Gen7b.Contains(ver) => new PB7(), 8 when GameVersion.BDSP.Contains(ver) => new PB8(), + 8 when GameVersion.PLA == ver => new PA8(), _ => GetBlank(gen), }; diff --git a/PKHeX.Core/PKM/Util/PKX.cs b/PKHeX.Core/PKM/Util/PKX.cs index 33a84f7060b..b6c3e77ff8c 100644 --- a/PKHeX.Core/PKM/Util/PKX.cs +++ b/PKHeX.Core/PKM/Util/PKX.cs @@ -9,7 +9,7 @@ namespace PKHeX.Core /// public static class PKX { - internal static readonly PersonalTable Personal = PersonalTable.SWSH; + internal static readonly PersonalTable Personal = PersonalTable.LA; public const int Generation = 8; private static readonly HashSet Sizes = new() @@ -22,6 +22,7 @@ public static class PKX PokeCrypto.SIZE_5PARTY, PokeCrypto.SIZE_6STORED, PokeCrypto.SIZE_6PARTY, PokeCrypto.SIZE_8STORED, PokeCrypto.SIZE_8PARTY, + PokeCrypto.SIZE_8ASTORED, PokeCrypto.SIZE_8APARTY, }; /// @@ -203,6 +204,7 @@ public static int GetGenderFromPID(int species, uint pid) internal const string ExtensionPB7 = "pb7"; internal const string ExtensionPB8 = "pb8"; + internal const string ExtensionPA8 = "pa8"; /// /// Gets an array of valid file extensions. @@ -227,6 +229,8 @@ public static string[] GetPKMExtensions(int maxGeneration = Generation) result.Add(ExtensionPB7); // let's go if (maxGeneration >= 8) result.Add(ExtensionPB8); // Brilliant Diamond & Shining Pearl + if (maxGeneration >= 8) + result.Add(ExtensionPA8); // Legends: Arceus return result.ToArray(); } diff --git a/PKHeX.Core/PKM/Util/PokeCrypto.cs b/PKHeX.Core/PKM/Util/PokeCrypto.cs index 10d97a4cd3b..4c28de6fc3f 100644 --- a/PKHeX.Core/PKM/Util/PokeCrypto.cs +++ b/PKHeX.Core/PKM/Util/PokeCrypto.cs @@ -45,6 +45,10 @@ public static class PokeCrypto internal const int SIZE_8PARTY = SIZE_8STORED + 0x10; // 0x158 internal const int SIZE_8BLOCK = 80; // 0x50 + internal const int SIZE_8ASTORED = 8 + (4 * SIZE_8ABLOCK); // 0x168 + internal const int SIZE_8APARTY = SIZE_8ASTORED + 0x10; // 0x178 + internal const int SIZE_8ABLOCK = 88; // 0x58 + /// /// Positions for shuffling. /// @@ -133,6 +137,21 @@ public static byte[] DecryptArray8(Span ekm) return ShuffleArray(ekm, sv, SIZE_8BLOCK); } + /// + /// Decrypts a Gen8 pkm byte array. + /// + /// Encrypted Pokémon data. + /// Decrypted Pokémon data. + /// Encrypted Pokémon data. + public static byte[] DecryptArray8A(Span ekm) + { + uint pv = ReadUInt32LittleEndian(ekm); + uint sv = pv >> 13 & 31; + + CryptPKM(ekm, pv, SIZE_8ABLOCK); + return ShuffleArray(ekm, sv, SIZE_8ABLOCK); + } + /// /// Encrypts a Gen8 pkm byte array. /// @@ -147,6 +166,20 @@ public static byte[] EncryptArray8(Span pkm) return ekm; } + /// + /// Encrypts a Gen8 pkm byte array. + /// + /// Decrypted Pokémon data. + public static byte[] EncryptArray8A(Span pkm) + { + uint pv = ReadUInt32LittleEndian(pkm); + uint sv = pv >> 13 & 31; + + byte[] ekm = ShuffleArray(pkm, blockPositionInvert[sv], SIZE_8ABLOCK); + CryptPKM(ekm, pv, SIZE_8ABLOCK); + return ekm; + } + /// /// Decrypts a 232 byte + party stat byte array. /// @@ -390,8 +423,19 @@ public static void DecryptIfEncrypted67(ref byte[] pkm) public static void DecryptIfEncrypted8(ref byte[] pkm) { var span = pkm.AsSpan(); - if (ReadUInt16LittleEndian(span[0x70..]) != 0 || ReadUInt16LittleEndian(span[0xC0..]) != 0) + if (ReadUInt16LittleEndian(span[0x70..]) != 0 || ReadUInt16LittleEndian(span[0x110..]) != 0) pkm = DecryptArray8(span); } + + /// + /// Decrypts the input data into a new array if it is encrypted, and updates the reference. + /// + /// Generation 8 Format encryption check + public static void DecryptIfEncrypted8A(ref byte[] pkm) + { + var span = pkm.AsSpan(); + if (ReadUInt16LittleEndian(span[0x78..]) != 0 || ReadUInt16LittleEndian(span[0x128..]) != 0) + pkm = DecryptArray8A(span); + } } } diff --git a/PKHeX.Core/PersonalInfo/PersonalInfoBDSP.cs b/PKHeX.Core/PersonalInfo/PersonalInfoBDSP.cs index dbb4542e985..638387f94d2 100644 --- a/PKHeX.Core/PersonalInfo/PersonalInfoBDSP.cs +++ b/PKHeX.Core/PersonalInfo/PersonalInfoBDSP.cs @@ -10,7 +10,7 @@ namespace PKHeX.Core public sealed class PersonalInfoBDSP : PersonalInfo { public const int SIZE = 0x44; - private const int CountTM = 100; + internal const int CountTM = 100; public override int HP { get => Data[0x00]; set => Data[0x00] = (byte)value; } public override int ATK { get => Data[0x01]; set => Data[0x01] = (byte)value; } diff --git a/PKHeX.Core/PersonalInfo/PersonalInfoLA.cs b/PKHeX.Core/PersonalInfo/PersonalInfoLA.cs new file mode 100644 index 00000000000..72d46993276 --- /dev/null +++ b/PKHeX.Core/PersonalInfo/PersonalInfoLA.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// class with values from the games. +/// +public sealed class PersonalInfoLA : PersonalInfo +{ + public const int SIZE = 0xB0; + + public PersonalInfoLA(byte[] data) : base(data) + { + // TM/TR and Special Tutors are inaccessible; dummy data. + + // 0xA8-0xAF are armor type tutors, one bit for each type + var moveShop = new bool[Legal.MoveShop8_LA.Length]; + for (int i = 0; i < moveShop.Length; i++) + moveShop[i] = FlagUtil.GetFlag(Data, 0xA8 + (i >> 3), i); + SpecialTutors = new[] + { + moveShop, + }; + } + + public override byte[] Write() + { + for (int i = 0; i < SpecialTutors[0].Length; i++) + FlagUtil.SetFlag(Data, 0xA8 + (i >> 3), i, SpecialTutors[0][i]); + return Data; + } + + public override int HP { get => Data[0x00]; set => Data[0x00] = (byte)value; } + public override int ATK { get => Data[0x01]; set => Data[0x01] = (byte)value; } + public override int DEF { get => Data[0x02]; set => Data[0x02] = (byte)value; } + public override int SPE { get => Data[0x03]; set => Data[0x03] = (byte)value; } + public override int SPA { get => Data[0x04]; set => Data[0x04] = (byte)value; } + public override int SPD { get => Data[0x05]; set => Data[0x05] = (byte)value; } + public override int Type1 { get => Data[0x06]; set => Data[0x06] = (byte)value; } + public override int Type2 { get => Data[0x07]; set => Data[0x07] = (byte)value; } + public override int CatchRate { get => Data[0x08]; set => Data[0x08] = (byte)value; } + public override int EvoStage { get => Data[0x09]; set => Data[0x09] = (byte)value; } + private int EVYield { get => ReadUInt16LittleEndian(Data.AsSpan(0x0A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x0A), (ushort)value); } + public override int EV_HP { get => EVYield >> 0 & 0x3; set => EVYield = (EVYield & ~(0x3 << 0)) | (value & 0x3) << 0; } + public override int EV_ATK { get => EVYield >> 2 & 0x3; set => EVYield = (EVYield & ~(0x3 << 2)) | (value & 0x3) << 2; } + public override int EV_DEF { get => EVYield >> 4 & 0x3; set => EVYield = (EVYield & ~(0x3 << 4)) | (value & 0x3) << 4; } + public override int EV_SPE { get => EVYield >> 6 & 0x3; set => EVYield = (EVYield & ~(0x3 << 6)) | (value & 0x3) << 6; } + public override int EV_SPA { get => EVYield >> 8 & 0x3; set => EVYield = (EVYield & ~(0x3 << 8)) | (value & 0x3) << 8; } + public override int EV_SPD { get => EVYield >> 10 & 0x3; set => EVYield = (EVYield & ~(0x3 << 10)) | (value & 0x3) << 10; } + public int Item1 { get => ReadInt16LittleEndian(Data.AsSpan(0x0C)); set => WriteInt16LittleEndian(Data.AsSpan(0x0C), (short)value); } + public int Item2 { get => ReadInt16LittleEndian(Data.AsSpan(0x0E)); set => WriteInt16LittleEndian(Data.AsSpan(0x0E), (short)value); } + public int Item3 { get => ReadInt16LittleEndian(Data.AsSpan(0x10)); set => WriteInt16LittleEndian(Data.AsSpan(0x10), (short)value); } + public override int Gender { get => Data[0x12]; set => Data[0x12] = (byte)value; } + public override int HatchCycles { get => Data[0x13]; set => Data[0x13] = (byte)value; } + public override int BaseFriendship { get => Data[0x14]; set => Data[0x14] = (byte)value; } + public override int EXPGrowth { get => Data[0x15]; set => Data[0x15] = (byte)value; } + public override int EggGroup1 { get => Data[0x16]; set => Data[0x16] = (byte)value; } + public override int EggGroup2 { get => Data[0x17]; set => Data[0x17] = (byte)value; } + public int Ability1 { get => ReadUInt16LittleEndian(Data.AsSpan(0x18)); set => WriteUInt16LittleEndian(Data.AsSpan(0x18), (ushort)value); } + public int Ability2 { get => ReadUInt16LittleEndian(Data.AsSpan(0x1A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x1A), (ushort)value); } + public int AbilityH { get => ReadUInt16LittleEndian(Data.AsSpan(0x1C)); set => WriteUInt16LittleEndian(Data.AsSpan(0x1C), (ushort)value); } + public override int EscapeRate { get => 0; set { } } // moved? + protected internal override int FormStatsIndex { get => ReadUInt16LittleEndian(Data.AsSpan(0x1E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x1E), (ushort)value); } + public override int FormSprite { get => ReadUInt16LittleEndian(Data.AsSpan(0x1E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x1E), (ushort)value); } // ??? + public override int FormCount { get => Data[0x20]; set => Data[0x20] = (byte)value; } + public override int Color { get => Data[0x21] & 0x3F; set => Data[0x21] = (byte)((Data[0x21] & 0xC0) | (value & 0x3F)); } + public bool IsPresentInGame { get => ((Data[0x21] >> 6) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x40) | (value ? 0x40 : 0)); } + public bool SpriteForm { get => ((Data[0x21] >> 7) & 1) == 1; set => Data[0x21] = (byte)((Data[0x21] & ~0x80) | (value ? 0x80 : 0)); } + public override int BaseEXP { get => ReadUInt16LittleEndian(Data.AsSpan(0x22)); set => WriteUInt16LittleEndian(Data.AsSpan(0x22), (ushort)value); } + public override int Height { get => ReadUInt16LittleEndian(Data.AsSpan(0x24)); set => WriteUInt16LittleEndian(Data.AsSpan(0x24), (ushort)value); } + public override int Weight { get => ReadUInt16LittleEndian(Data.AsSpan(0x26)); set => WriteUInt16LittleEndian(Data.AsSpan(0x26), (ushort)value); } + + public override IReadOnlyList Items + { + get => new[] { Item1, Item2, Item3 }; + set + { + if (value.Count != 3) return; + Item1 = value[0]; + Item2 = value[1]; + Item3 = value[2]; + } + } + + public override IReadOnlyList Abilities + { + get => new[] { Ability1, Ability2, AbilityH }; + set + { + if (value.Count != 3) return; + Ability1 = value[0]; + Ability2 = value[1]; + AbilityH = value[2]; + } + } + + public override int GetAbilityIndex(int abilityID) => abilityID == Ability1 ? 0 : abilityID == Ability2 ? 1 : abilityID == AbilityH ? 2 : -1; + + public int HatchSpecies { get => ReadUInt16LittleEndian(Data.AsSpan(0x56)); set => WriteUInt16LittleEndian(Data.AsSpan(0x56), (ushort)value); } + public int HatchFormIndex { get => ReadUInt16LittleEndian(Data.AsSpan(0x58)); set => WriteUInt16LittleEndian(Data.AsSpan(0x58), (ushort)value); } // local region base form + public ushort RegionalFlags { get => ReadUInt16LittleEndian(Data.AsSpan(0x5A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x5A), value); } + public bool IsRegionalForm { get => (RegionalFlags & 1) == 1; set => RegionalFlags = (ushort)((RegionalFlags & 0xFFFE) | (value ? 1 : 0)); } + public int Species { get => ReadUInt16LittleEndian(Data.AsSpan(0x5C)); set => WriteUInt16LittleEndian(Data.AsSpan(0x5C), (ushort)value); } + public int Form { get => ReadUInt16LittleEndian(Data.AsSpan(0x5E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x5E), (ushort)value); } + public int DexIndexHisui { get => ReadUInt16LittleEndian(Data.AsSpan(0x60)); set => WriteUInt16LittleEndian(Data.AsSpan(0x60), (ushort)value); } + public int DexIndexLocal1 { get => ReadUInt16LittleEndian(Data.AsSpan(0x62)); set => WriteUInt16LittleEndian(Data.AsSpan(0x62), (ushort)value); } + public int DexIndexLocal2 { get => ReadUInt16LittleEndian(Data.AsSpan(0x64)); set => WriteUInt16LittleEndian(Data.AsSpan(0x64), (ushort)value); } + public int DexIndexLocal3 { get => ReadUInt16LittleEndian(Data.AsSpan(0x66)); set => WriteUInt16LittleEndian(Data.AsSpan(0x66), (ushort)value); } + public int DexIndexLocal4 { get => ReadUInt16LittleEndian(Data.AsSpan(0x68)); set => WriteUInt16LittleEndian(Data.AsSpan(0x68), (ushort)value); } + public int DexIndexLocal5 { get => ReadUInt16LittleEndian(Data.AsSpan(0x6A)); set => WriteUInt16LittleEndian(Data.AsSpan(0x6A), (ushort)value); } +} diff --git a/PKHeX.Core/PersonalInfo/PersonalTable.cs b/PKHeX.Core/PersonalInfo/PersonalTable.cs index 63815c3a530..8532b0ff5b8 100644 --- a/PKHeX.Core/PersonalInfo/PersonalTable.cs +++ b/PKHeX.Core/PersonalInfo/PersonalTable.cs @@ -12,6 +12,11 @@ namespace PKHeX.Core /// public sealed class PersonalTable { + /// + /// Personal Table used in . + /// + public static readonly PersonalTable LA = GetTable("la", GameVersion.PLA); + /// /// Personal Table used in . /// @@ -127,6 +132,7 @@ public sealed class PersonalTable GameVersion.SM or GameVersion.USUM => z => new PersonalInfoSM(z), GameVersion.GG => z => new PersonalInfoGG(z), GameVersion.SWSH => z => new PersonalInfoSWSH(z), + GameVersion.PLA => z => new PersonalInfoLA(z), _ => z => new PersonalInfoBDSP(z), }; @@ -143,6 +149,7 @@ public sealed class PersonalTable GameVersion.SM or GameVersion.USUM or GameVersion.GG => PersonalInfoSM.SIZE, GameVersion.SWSH => PersonalInfoSWSH.SIZE, GameVersion.BDSP => PersonalInfoBDSP.SIZE, + GameVersion.PLA => PersonalInfoLA.SIZE, _ => -1, }; @@ -165,8 +172,8 @@ private static void FixPersonalTableG1() private static void PopulateGen3Tutors() { // Update Gen3 data with Emerald's data, FR/LG is a subset of Emerald's compatibility. - var machine = BinLinker.Unpack(Util.GetBinaryResource("hmtm_g3.pkl"), "g3"); - var tutors = BinLinker.Unpack(Util.GetBinaryResource("tutors_g3.pkl"), "g3"); + var machine = BinLinkerAccessor.Get(Util.GetBinaryResource("hmtm_g3.pkl"), "g3"); + var tutors = BinLinkerAccessor.Get(Util.GetBinaryResource("tutors_g3.pkl"), "g3"); var table = E.Table; for (int i = Legal.MaxSpeciesID_3; i >= 0; i--) { @@ -182,9 +189,10 @@ private static void PopulateGen3Tutors() private static void PopulateGen4Tutors() { - var tutors = BinLinker.Unpack(Util.GetBinaryResource("tutors_g4.pkl"), "g4"); + var tutors = BinLinkerAccessor.Get(Util.GetBinaryResource("tutors_g4.pkl"), "g4"); var table = HGSS.Table; - for (int i = 0; i < tutors.Length; i++) + var count = tutors.Length; + for (int i = 0; i < count; i++) table[i].AddTypeTutors(tutors[i]); } @@ -203,16 +211,34 @@ private static void CopyDexitGenders() if (ss.HP == 0) ss.Gender = usum[i].Gender; } + + var la = LA; + for (int i = 1; i <= Legal.MaxSpeciesID_8_R2; i++) + { + var e = la.Table[i]; + var fc = e.FormCount; + for (int f = 0; f < fc; f++) + { + var l = (PersonalInfoLA)la.GetFormEntry(i, f); + if (l.HP != 0) + continue; + var s = (PersonalInfoSWSH)SWSH.GetFormEntry(i, f); + l.Ability1 = s.Ability1; + l.Ability2 = s.Ability2; + l.AbilityH = s.AbilityH; + l.Gender = s.Gender; + } + } } public PersonalTable(ReadOnlySpan data, GameVersion format) { var get = GetConstructor(format); int size = GetEntrySize(format); - byte[][] entries = data.Split(size); - var table = new PersonalInfo[entries.Length]; + var count = data.Length / size; + var table = new PersonalInfo[count]; for (int i = 0; i < table.Length; i++) - table[i] = get(entries[i]); + table[i] = get(data.Slice(size * i, size).ToArray()); Table = table; MaxSpeciesID = format.GetMaxSpeciesID(); diff --git a/PKHeX.Core/Resources/byte/evolve/evos_la.pkl b/PKHeX.Core/Resources/byte/evolve/evos_la.pkl new file mode 100644 index 00000000000..b7744d77712 Binary files /dev/null and b/PKHeX.Core/Resources/byte/evolve/evos_la.pkl differ diff --git a/PKHeX.Core/Resources/byte/levelup/lvlmove_la.pkl b/PKHeX.Core/Resources/byte/levelup/lvlmove_la.pkl new file mode 100644 index 00000000000..871f7d030a8 Binary files /dev/null and b/PKHeX.Core/Resources/byte/levelup/lvlmove_la.pkl differ diff --git a/PKHeX.Core/Resources/byte/personal/personal_la b/PKHeX.Core/Resources/byte/personal/personal_la new file mode 100644 index 00000000000..6a693d16dd2 Binary files /dev/null and b/PKHeX.Core/Resources/byte/personal/personal_la differ diff --git a/PKHeX.Core/Resources/byte/zukan_research/researchtask_la.pkl b/PKHeX.Core/Resources/byte/zukan_research/researchtask_la.pkl new file mode 100644 index 00000000000..d6a5660cc99 Binary files /dev/null and b/PKHeX.Core/Resources/byte/zukan_research/researchtask_la.pkl differ diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_de.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_de.txt index baad994dc57..3d870e55750 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_de.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_de.txt @@ -205,6 +205,7 @@ LGeoNoRegion = GeoLocation Memory: Region without Country. LHyperBelow100 = Can't Hyper Train a Pokémon that isn't level 100. LHyperPerfectAll = Can't Hyper Train a Pokémon with perfect IVs. LHyperPerfectOne = Can't Hyper Train a perfect IV. +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = Eggs cannot hold items. LItemUnreleased = Held item is unreleased. LIVAllEqual_0 = All IVs are {0}. @@ -279,6 +280,7 @@ LMoveNincada = Only one Ninjask move allowed. LMoveNincadaEvo = Learned by evolving Nincada into Ninjask. LMoveNincadaEvoF_0 = Learned by evolving Nincada into Ninjask in Generation {0}. LMovePPTooHigh_0 = Move {0} PP is above the amount allowed. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = Not an expected DexNav move. LMoveRelearnEgg = Base Egg move. LMoveRelearnEggMissing = Base Egg move missing. @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = Relearn Moves missing: {0} LMoveRelearnInvalid = Not an expected Relearnable move. LMoveRelearnNone = Expected no Relearn Move in slot. LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = Default move. LMoveSourceDuplicate = Duplicate Move. LMoveSourceEgg = Egg Move. @@ -333,21 +341,28 @@ LPIDNatureMatch = Nature matches PID. LPIDNatureMismatch = PID-Nature mismatch. LPIDTypeMismatch = Encounter Type PID mismatch. LPIDZero = PID is not set. +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = All ribbons accounted for. LRibbonEgg = Can't receive Ribbon(s) as an Egg. LRibbonFInvalid_0 = Invalid Ribbons: {0} LRibbonFMissing_0 = Missing Ribbons: {0} LRibbonMarkingAffixedF_0 = Invalid Affixed Ribbon/Marking: {0} LRibbonMarkingFInvalid_0 = Invalid Marking: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = Battle Version is not within the expected range. LStatDynamaxInvalid = Dynamax Level is not within the expected range. LStatGigantamaxInvalid = Gigantamax Flag mismatch. LStatGigantamaxValid = Gigantamax Flag was changed via Max Soup. LStatIncorrectCP = Calculated CP does not match stored value. LStatIncorrectHeight = Calculated Height does not match stored value. +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = Calculated Weight does not match stored value. +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = Stat Nature is not within the expected range. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = Super Training complete flag mismatch. LSuperDistro = Distribution Super Training missions are not released. LSuperEgg = Can't Super Train an Egg. diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_en.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_en.txt index ab438eb6f85..99ea6861bda 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_en.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_en.txt @@ -205,6 +205,7 @@ LGeoNoRegion = GeoLocation Memory: Region without Country. LHyperBelow100 = Can't Hyper Train a Pokémon that isn't level 100. LHyperPerfectAll = Can't Hyper Train a Pokémon with perfect IVs. LHyperPerfectOne = Can't Hyper Train a perfect IV. +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = Eggs cannot hold items. LItemUnreleased = Held item is unreleased. LIVAllEqual_0 = All IVs are {0}. @@ -279,6 +280,7 @@ LMoveNincada = Only one Ninjask move allowed. LMoveNincadaEvo = Learned by evolving Nincada into Ninjask. LMoveNincadaEvoF_0 = Learned by evolving Nincada into Ninjask in Generation {0}. LMovePPTooHigh_0 = Move {0} PP is above the amount allowed. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = Not an expected DexNav move. LMoveRelearnEgg = Base Egg move. LMoveRelearnEggMissing = Base Egg move missing. @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = Relearn Moves missing: {0} LMoveRelearnInvalid = Not an expected Relearnable move. LMoveRelearnNone = Expected no Relearn Move in slot. LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = Default move. LMoveSourceDuplicate = Duplicate Move. LMoveSourceEgg = Egg Move. @@ -333,21 +341,28 @@ LPIDNatureMatch = Nature matches PID. LPIDNatureMismatch = PID-Nature mismatch. LPIDTypeMismatch = Encounter Type PID mismatch. LPIDZero = PID is not set. +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = All ribbons accounted for. LRibbonEgg = Can't receive Ribbon(s) as an Egg. LRibbonFInvalid_0 = Invalid Ribbons: {0} LRibbonFMissing_0 = Missing Ribbons: {0} LRibbonMarkingAffixedF_0 = Invalid Affixed Ribbon/Marking: {0} LRibbonMarkingFInvalid_0 = Invalid Marking: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = Battle Version is not within the expected range. LStatDynamaxInvalid = Dynamax Level is not within the expected range. LStatGigantamaxInvalid = Gigantamax Flag mismatch. LStatGigantamaxValid = Gigantamax Flag was changed via Max Soup. LStatIncorrectCP = Calculated CP does not match stored value. LStatIncorrectHeight = Calculated Height does not match stored value. +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = Calculated Weight does not match stored value. +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = Stat Nature is not within the expected range. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = Super Training complete flag mismatch. LSuperDistro = Distribution Super Training missions are not released. LSuperEgg = Can't Super Train an Egg. diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_es.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_es.txt index 627aff6dcfe..a95bdc161d6 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_es.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_es.txt @@ -205,6 +205,7 @@ LGeoNoRegion = Recuerdo de Geolocalización: Región sin país. LHyperBelow100 = No se puede usar el Hiper Entrenamiento en un Pokémon que no esté al nivel 100. LHyperPerfectAll = No se puede usar el Hiper Entrenamiento con IVs perfectos. LHyperPerfectOne = No se puede usar el Hiper Entrenamiento con un IV perfecto. +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = Los Huevos no pueden tener objetos equipados. LItemUnreleased = El Objeto Equipado aún no está disponible. LIVAllEqual_0 = Todos los IVs son {0}. @@ -279,6 +280,7 @@ LMoveNincada = Solo un movimiento de Ninjask permitido. LMoveNincadaEvo = Aprendido al evolucionar a Nincada en Ninjask LMoveNincadaEvoF_0 = Aprendido al evolucionar a Nincada en Ninjask en Generación {0}. LMovePPTooHigh_0 = Los PP del movimiento {0} están por encima de los permitidos. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = No es un Movimiento de DexNav. LMoveRelearnEgg = Movimiento Huevo base. LMoveRelearnEggMissing = Faltan los Movimientos Huevo base. @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = Faltan movimientos recordables: {0} LMoveRelearnInvalid = No es un Movimiento Recordable. LMoveRelearnNone = No se esperaba un Movimiento Recordable en esta casilla. LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = Movimiento por Defecto. LMoveSourceDuplicate = Movimiento duplicado. LMoveSourceEgg = Movimiento Huevo. @@ -333,21 +341,28 @@ LPIDNatureMatch = La Naturaleza coincide con el PID. LPIDNatureMismatch = La Naturaleza y el PID no coinciden. LPIDTypeMismatch = El PID del Tipo de Encuentro no es correcto. LPIDZero = PID no establecido. +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = Todas las cintas están justificadas. LRibbonEgg = No se pueden recibir Cintas siendo un Huevo. LRibbonFInvalid_0 = Cintas inválidas: {0} LRibbonFMissing_0 = Cintas que faltan: {0} LRibbonMarkingAffixedF_0 = Cinta / marca pegada no válida: {0} LRibbonMarkingFInvalid_0 = Marca Inválida: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = La Versión de Batalla no está dentro del rango esperado. LStatDynamaxInvalid = El nivel Dinamax no está dentro del rango esperado. LStatGigantamaxInvalid = Gigamax incompatible. LStatGigantamaxValid = La marca de Gigamax fue cambiada por Maxi Sopa. LStatIncorrectCP = Los CP calculados no concuerdan con el valor almacenado. LStatIncorrectHeight = La Altura calculada no concuerda con el valor almacenado. +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = El Peso calculado no concuerda con el valor almacenado. +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = La Estadística de la Naturaleza no está dentro del rango esperado. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = El Super Entrenamiento completo no es correcto. LSuperDistro = Las misiones de Super Entrenamiento distribuidas no están liberadas. LSuperEgg = No se puede Super Entrenar un Huevo diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_fr.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_fr.txt index 3b3f94a98ff..0aa06e41df6 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_fr.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_fr.txt @@ -205,6 +205,7 @@ LGeoNoRegion = Mémoire géolocalisations : Région sans pays. LHyperBelow100 = Impossible de faire subir l'Entraînement Ultime à un Pokémon au-dessous du niveau 100. LHyperPerfectAll = Impossible de faire subir l'Entraînement Ultime à un Pokémon aux IVs parfaits. LHyperPerfectOne = Impossible de faire subir l'Entraînement Ultime à une statistique aux IVs parfaits. +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = Les Œufs ne peuvent pas tenir d'objet. LItemUnreleased = L'objet tenu n'a pas encore été dévoilé. LIVAllEqual_0 = Tous les IVs sont {0}. @@ -279,6 +280,7 @@ LMoveNincada = Une seule capacité de Ninjask est permise. LMoveNincadaEvo = Apprise en faisant évoluer Ningale en Ninjask. LMoveNincadaEvoF_0 = Apprise en faisant évoluer Ningale en Ninjask dans la génération {0}. LMovePPTooHigh_0 = Le déplacement {0} PP est supérieur au montant autorisé. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = Ce n'est pas un mouvement DexNav. LMoveRelearnEgg = Mouvement de base de l'œuf. LMoveRelearnEggMissing = Mouvement de base de l'oeuf manquant. @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = Capacités réapprises manquantess : {0} LMoveRelearnInvalid = Ce n'est pas un mouvement enregistrable. LMoveRelearnNone = Pas de capacité réapprise prévue. LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = Mouvement par défaut. LMoveSourceDuplicate = Capacité dupliquée. LMoveSourceEgg = Capacité d'Œuf. @@ -333,21 +341,28 @@ LPIDNatureMatch = Le PID correspond à la nature. LPIDNatureMismatch = Le PID ne correspond pas à la nature. LPIDTypeMismatch = Le PID ne correspond pas au type de rencontre. LPIDZero = Le PID n'a pas été défini. +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = Tous les rubans ont été comptabilisés. LRibbonEgg = L'Œuf ne peut pas recevoir de Rubans. LRibbonFInvalid_0 = Rubans invalides : {0} LRibbonFMissing_0 = Rubans manquants : {0} LRibbonMarkingAffixedF_0 = Ruban / marquage apposé non valide: {0} LRibbonMarkingFInvalid_0 = Marquage non valide: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = La version Battle n'est pas dans le rang attendue. LStatDynamaxInvalid = Le niveau Dynamax n'est pas dans le rang attendue. LStatGigantamaxInvalid = Gigamax incompatible. LStatGigantamaxValid = La marque Gigamax a été changée via Max Soup. LStatIncorrectCP = Le CP calculé ne correspond pas à la valeur enregistrée. LStatIncorrectHeight = La hauteur calculée ne correspond pas à la valeur stockée. +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = Le poids calculé ne correspond pas à la valeur stockée. +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = La Nature Stat n'est pas dans le rang attendue. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = Contradiction avec le flag d'entraînement SPV complété. LSuperDistro = Les missions Super Training distribuées ne sont pas publiées. LSuperEgg = Un Œuf ne peut pas participer au Système de Perfectionnement Virtuel. diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_it.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_it.txt index baad994dc57..3d870e55750 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_it.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_it.txt @@ -205,6 +205,7 @@ LGeoNoRegion = GeoLocation Memory: Region without Country. LHyperBelow100 = Can't Hyper Train a Pokémon that isn't level 100. LHyperPerfectAll = Can't Hyper Train a Pokémon with perfect IVs. LHyperPerfectOne = Can't Hyper Train a perfect IV. +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = Eggs cannot hold items. LItemUnreleased = Held item is unreleased. LIVAllEqual_0 = All IVs are {0}. @@ -279,6 +280,7 @@ LMoveNincada = Only one Ninjask move allowed. LMoveNincadaEvo = Learned by evolving Nincada into Ninjask. LMoveNincadaEvoF_0 = Learned by evolving Nincada into Ninjask in Generation {0}. LMovePPTooHigh_0 = Move {0} PP is above the amount allowed. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = Not an expected DexNav move. LMoveRelearnEgg = Base Egg move. LMoveRelearnEggMissing = Base Egg move missing. @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = Relearn Moves missing: {0} LMoveRelearnInvalid = Not an expected Relearnable move. LMoveRelearnNone = Expected no Relearn Move in slot. LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = Default move. LMoveSourceDuplicate = Duplicate Move. LMoveSourceEgg = Egg Move. @@ -333,21 +341,28 @@ LPIDNatureMatch = Nature matches PID. LPIDNatureMismatch = PID-Nature mismatch. LPIDTypeMismatch = Encounter Type PID mismatch. LPIDZero = PID is not set. +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = All ribbons accounted for. LRibbonEgg = Can't receive Ribbon(s) as an Egg. LRibbonFInvalid_0 = Invalid Ribbons: {0} LRibbonFMissing_0 = Missing Ribbons: {0} LRibbonMarkingAffixedF_0 = Invalid Affixed Ribbon/Marking: {0} LRibbonMarkingFInvalid_0 = Invalid Marking: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = Battle Version is not within the expected range. LStatDynamaxInvalid = Dynamax Level is not within the expected range. LStatGigantamaxInvalid = Gigantamax Flag mismatch. LStatGigantamaxValid = Gigantamax Flag was changed via Max Soup. LStatIncorrectCP = Calculated CP does not match stored value. LStatIncorrectHeight = Calculated Height does not match stored value. +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = Calculated Weight does not match stored value. +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = Stat Nature is not within the expected range. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = Super Training complete flag mismatch. LSuperDistro = Distribution Super Training missions are not released. LSuperEgg = Can't Super Train an Egg. diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ja.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ja.txt index 29ce256fb71..2cfc04dff34 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ja.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ja.txt @@ -205,6 +205,7 @@ LGeoNoRegion = GeoLocation Memory: Region without Country. LHyperBelow100 = 王冠を使用するにはレベル100でなければなりません LHyperPerfectAll = 全ての個体値は31のため王冠は使用できません LHyperPerfectOne = 個体値31には王冠は使用できません +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = タマゴはアイテムを持てません LItemUnreleased = この持ち物は解禁されていません LIVAllEqual_0 = All IVs are {0}. @@ -279,6 +280,7 @@ LMoveNincada = Only one Ninjask move allowed. LMoveNincadaEvo = Learned by evolving Nincada into Ninjask. LMoveNincadaEvoF_0 = Learned by evolving Nincada into Ninjask in Generation {0}. LMovePPTooHigh_0 = Move {0} PP is above the amount allowed. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = Not an expected DexNav move. LMoveRelearnEgg = 遺伝技 LMoveRelearnEggMissing = ベースの遺伝技を設定してください @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = 通常では覚えられません: {0} LMoveRelearnInvalid = Not an expected Relearnable Move. LMoveRelearnNone = 遺伝技が設定されていません LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = Default move. LMoveSourceDuplicate = Duplicate Move. LMoveSourceEgg = Egg Move. @@ -333,21 +341,28 @@ LPIDNatureMatch = 性格と性格値は一致しています LPIDNatureMismatch = 性格と性格値が一致しません LPIDTypeMismatch = エンカウントタイプと性格値が一致しません LPIDZero = PID is not set. +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = All ribbons accounted for. LRibbonEgg = タマゴにリボンは設定できません LRibbonFInvalid_0 = 無効なリボンが設定されています: {0} LRibbonFMissing_0 = 次のリボンが不足しています: {0} LRibbonMarkingAffixedF_0 = Invalid Affixed Ribbon/Marking: {0} LRibbonMarkingFInvalid_0 = Invalid Marking: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = Battle Version is not within the expected range. LStatDynamaxInvalid = Dynamax Level is not within the expected range. LStatGigantamaxInvalid = Gigantamax Flag mismatch. LStatGigantamaxValid = Gigantamax Flag was changed via Max Soup. LStatIncorrectCP = Calculated CP does not match stored value. LStatIncorrectHeight = Calculated Height does not match stored value. +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = Calculated Weight does not match stored value. +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = Stat Nature is not within the expected range. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = Super Training complete flag mismatch. LSuperDistro = Distribution Super Training missions are not released. LSuperEgg = Can't Super Train an Egg. diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ko.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ko.txt index 08dc0c908bc..6f2fba7d79b 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ko.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_ko.txt @@ -205,6 +205,7 @@ LGeoNoRegion = 지오로케이션 기억: 국가는 설정되어 있지만 지 LHyperBelow100 = 레벨 100 미만인 포켓몬은 대단한 특훈을 받을 수 없습니다. LHyperPerfectAll = 모든 IV가 31인 포켓몬은 대단한 특훈을 받을 수 없습니다. LHyperPerfectOne = IV 31은 대단한 특훈을 시킬 수 없습니다. +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = 알은 물건을 지닐 수 없습니다. LItemUnreleased = 지닌 물건이 배포되지 않은 물건입니다. LIVAllEqual_0 = All IVs are {0}. @@ -279,6 +280,7 @@ LMoveNincada = 하나의 아이스크 기술만 가질 수 있습니다. LMoveNincadaEvo = 토중몬에서 아이스크로 진화하면서 배운 기술입니다. LMoveNincadaEvoF_0 = {0}세대에서 토중몬에서 아이스크로 진화하면서 배운 기술입니다. LMovePPTooHigh_0 = 기술 {0}의 PP가 허용된 값보다 많습니다. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = 도감 내비 기술이 예상과 다릅니다. LMoveRelearnEgg = 베이스 자력기입니다. LMoveRelearnEggMissing = 베이스 자력기가 없습니다. @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = 떠올리기 기술이 없습니다: {0} LMoveRelearnInvalid = 떠올리기 기술이 예상과 다릅니다. LMoveRelearnNone = 슬롯에 떠올리기 기술이 없어야 할 것으로 예상됩니다. LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = 기본 기술입니다. LMoveSourceDuplicate = 중복되는 기술입니다. LMoveSourceEgg = 자력기입니다. @@ -333,21 +341,28 @@ LPIDNatureMatch = PID와 성격이 일치합니다. LPIDNatureMismatch = PID와 성격이 일치하지 않습니다. LPIDTypeMismatch = 인카운터 유형 PID가 일치하지 않습니다. LPIDZero = PID가 지정되지 않았습니다. +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = 모든 리본이 채워졌습니다. LRibbonEgg = 알은 리본을 얻을 수 없습니다. LRibbonFInvalid_0 = 사용할 수 없는 리본: {0} LRibbonFMissing_0 = 없는 리본: {0} LRibbonMarkingAffixedF_0 = Invalid Affixed Ribbon/Marking: {0} LRibbonMarkingFInvalid_0 = Invalid Marking: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = Battle Version is not within the expected range. LStatDynamaxInvalid = 다이맥스 레벨이 예상 범위를 벗어났습니다. LStatGigantamaxInvalid = 거다이맥스 플래그가 일치하지 않습니다. LStatGigantamaxValid = Gigantamax Flag was changed via Max Soup. LStatIncorrectCP = 계산된 CP와 저장된 값이 일치하지 않습니다. LStatIncorrectHeight = 계산된 키와 저장된 값이 일치하지 않습니다. +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = 계산된 몸무게와 저장된 값이 일치하지 않습니다. +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = Stat Nature is not within the expected range. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = 대단한 특훈 완료 플래그가 일치하지 않습니다. LSuperDistro = 배분한 대단한 특훈 미션이 배포되지 않은 미션입니다. LSuperEgg = 알은 대단한 특훈을 시킬 수 없습니다. diff --git a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_zh.txt b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_zh.txt index 3727a181551..df66424d7a4 100644 --- a/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_zh.txt +++ b/PKHeX.Core/Resources/legality/checks/LegalityCheckStrings_zh.txt @@ -205,6 +205,7 @@ LGeoNoRegion = 地理位置回忆: 地区没有国家。 LHyperBelow100 = 不能对未满100级的宝可梦极限训练。 LHyperPerfectAll = 不能对完美个体的宝可梦极限训练。 LHyperPerfectOne = 不能对完美个体项极限训练。 +LHyperPerfectUnavailable = Can't Hyper Train any IV(s). LItemEgg = 蛋不能有持有物。 LItemUnreleased = 持有物未解禁。 LIVAllEqual_0 = 所有个体值都是 {0}。 @@ -279,6 +280,7 @@ LMoveNincada = 只能拥有一个铁面忍者的招式。 LMoveNincadaEvo = 通过土居忍士进化为铁面忍者习得。 LMoveNincadaEvoF_0 = 通过土居忍士在第{0}世代进化为铁面忍者习得。 LMovePPTooHigh_0 = 技能 {0} PP高于允许值. +LMovePPUpsTooHigh_0 = Move {0} PP Ups is above the amount allowed. LMoveRelearnDexNav = 非正确忍足招式。 LMoveRelearnEgg = 基本遗传招式。 LMoveRelearnEggMissing = 缺失基本遗传招式。 @@ -287,6 +289,12 @@ LMoveRelearnFMiss_0 = 缺失可回忆招式: {0} LMoveRelearnInvalid = 非正确回忆招式。 LMoveRelearnNone = 应该没有回忆招式。 LMoveRelearnUnderground = Not an expected Underground egg move. +LMoveShopAlphaMoveShouldBeMastered = Alpha Move should be marked as mastered. +LMoveShopAlphaMoveShouldBeOther = Alpha encounter cannot be found with this Alpha Move. +LMoveShopAlphaMoveShouldBeZero = Only Alphas may have an Alpha Move set. +LMoveShopMasterInvalid_0 = Cannot manually master {0}: not permitted to master. +LMoveShopMasterNotLearned_0 = Cannot manually master {0}: not in possible learned level up moves. +LMoveShopPurchaseInvalid_0 = Cannot purchase {0} from the move shop. LMoveSourceDefault = 默认招式。 LMoveSourceDuplicate = 重复招式。 LMoveSourceEgg = 遗传招式。 @@ -333,21 +341,28 @@ LPIDNatureMatch = 性格与PID匹配。 LPIDNatureMismatch = 性格与PID不匹配。 LPIDTypeMismatch = 遇见类型与 PID 不一致。 LPIDZero = 未设置PID。 +LPokerusDaysTooHigh_0 = Pokérus Days Remaining value is too high; expected <= {0}. +LPokerusStrainUnobtainable_0 = Pokérus Strain {0} cannot be obtained. LRibbonAllValid = 所有奖章合法。 LRibbonEgg = 蛋不能接受奖章。 LRibbonFInvalid_0 = 不合法奖章: {0} LRibbonFMissing_0 = 缺失奖章: {0} LRibbonMarkingAffixedF_0 = 无效的奖章/证章: {0} LRibbonMarkingFInvalid_0 = 无效标记: {0} +LStatAlphaInvalid = Alpha Flag mismatch. LStatBattleVersionInvalid = 对战版本不在期望范围内. LStatDynamaxInvalid = 极巨等级不在预期范围内. LStatGigantamaxInvalid = 超级极巨标志不匹配. LStatGigantamaxValid = 超级极巨标志已被极巨汤修改. LStatIncorrectCP = 计算的CP值与存储值不匹配. LStatIncorrectHeight = 计算的高度与存储值不匹配 +LStatIncorrectHeightCopy = Copy Height does not match the original value. +LStatIncorrectHeightValue = Height does not match the expected value. LStatIncorrectWeight = 计算的重量与存储值不匹配 +LStatIncorrectWeightValue = Weight does not match the expected value. LStatInvalidHeightWeight = Height / Weight values are statistically improbable. LStatNatureInvalid = 性格不在期望范围内. +LStatNobleInvalid = Noble Flag mismatch. LSuperComplete = 超级训练完成标记不匹配。 LSuperDistro = 配信超级训练任务未发布。 LSuperEgg = 不能对蛋进行超级训练。 diff --git a/PKHeX.Core/Resources/legality/mgdb/wa8.pkl b/PKHeX.Core/Resources/legality/mgdb/wa8.pkl new file mode 100644 index 00000000000..fef4b50f39c Binary files /dev/null and b/PKHeX.Core/Resources/legality/mgdb/wa8.pkl differ diff --git a/PKHeX.Core/Resources/legality/mgdb/wb8.pkl b/PKHeX.Core/Resources/legality/mgdb/wb8.pkl index 15855533a40..07ae003c521 100644 Binary files a/PKHeX.Core/Resources/legality/mgdb/wb8.pkl and b/PKHeX.Core/Resources/legality/mgdb/wb8.pkl differ diff --git a/PKHeX.Core/Resources/legality/mgdb/wc4.pkl b/PKHeX.Core/Resources/legality/mgdb/wc4.pkl index efdb442bdc8..a63e32b0aec 100644 Binary files a/PKHeX.Core/Resources/legality/mgdb/wc4.pkl and b/PKHeX.Core/Resources/legality/mgdb/wc4.pkl differ diff --git a/PKHeX.Core/Resources/legality/wild/Gen8/underground_bd.pkl b/PKHeX.Core/Resources/legality/wild/Gen8/encounter_bd_underground.pkl similarity index 100% rename from PKHeX.Core/Resources/legality/wild/Gen8/underground_bd.pkl rename to PKHeX.Core/Resources/legality/wild/Gen8/encounter_bd_underground.pkl diff --git a/PKHeX.Core/Resources/legality/wild/Gen8/encounter_la.pkl b/PKHeX.Core/Resources/legality/wild/Gen8/encounter_la.pkl new file mode 100644 index 00000000000..217037c06a3 Binary files /dev/null and b/PKHeX.Core/Resources/legality/wild/Gen8/encounter_la.pkl differ diff --git a/PKHeX.Core/Resources/legality/wild/Gen8/underground_sp.pkl b/PKHeX.Core/Resources/legality/wild/Gen8/encounter_sp_underground.pkl similarity index 100% rename from PKHeX.Core/Resources/legality/wild/Gen8/underground_sp.pkl rename to PKHeX.Core/Resources/legality/wild/Gen8/encounter_sp_underground.pkl diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_de.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_de.txt new file mode 100644 index 00000000000..44555b67b39 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_de.txt @@ -0,0 +1,21 @@ +Unterschied zwischen Schaloko und Panekon erforscht +Zubats nächtliches Sehvermögen erforscht +Die frechen Bidiza im Dorf erforscht +Evolis Entwicklungen erforscht +Paraseks Pilz erforscht +Das seltene Ponita erforscht +Das mit Kindern spielende Driftlon erforscht +Die sich den Kopf haltenden Enton erforscht +Das niedergeschlagene Mogelbaum erforscht +Das sich merkwürdig verhaltende Pantimos erforscht +Den Geschmack von Wadribies Honig erforscht +[~ 110] +Den Kampfstil von Pachirisu erforscht +Aus Glibunkels Gift hergestellte Medizin erforscht +Das Sprichwort zu Nasgnet erforscht +[~ 114] +Die in Vollmondnächten tanzenden Piepi erforscht +Quiekels besonderes Talent erforscht +Heiteiras Angewohnheit, Menschen zu helfen, erforscht +Vulpix aus der Alola-Region erforscht +Das Palimpalim unterm Vordach erforscht \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_en.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_en.txt new file mode 100644 index 00000000000..6433da68159 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_en.txt @@ -0,0 +1,21 @@ +Investigated how Silcoon and Cascoon differ +Investigated Zubat’s knack for navigating in the dark +Investigated the Bidoof that bother the village +Investigated more about how Eevee evolves +Investigated the mushroom growing on Parasect +Investigated a sighting of an unusual Ponyta +Investigated whether Drifloon truly does play with kids +Investigated the Psyduck cradling their heads +Investigated the causes behind a listless Sudowoodo +Investigated the suspicious movements of Mr. Mime +Investigated the different flavors of Combee honey +[~ 110] +Investigated strategies for battling with Pachirisu +Investigated Croagunk poison’s medicinal properties +Investigated an old saying about Nosepass’s handiness +[~ 114] +Investigated whether Clefairy dance under a full moon +Investigated Swinub’s supposed special skill +Investigated what would make Blissey help a human +Investigated about Vulpix from the Alola region +Investigated a Chimecho settled in a human home \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_es.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_es.txt new file mode 100644 index 00000000000..be935e375eb --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_es.txt @@ -0,0 +1,21 @@ +Investiga las diferencias entre Silcoon y Cascoon +Investiga la increíble visión nocturna de los Zubat +Investiga a los Bidoof que causan estragos por la villa +Investiga acerca de las evoluciones de Eevee +Investiga acerca de la seta de Parasect +Investiga al extraño Ponyta +Investiga el caso del Drifloon que juega con el niño +Investiga el caso de los Psyduck con cefaleas +Investiga el caso del Sudowoodo alicaído +Investiga el caso del Mr. Mime sospechoso +Investiga acerca del sabor de la miel de Combee +[~ 110] +Investiga formas de combatir junto a Pachirisu +Investiga acerca del veneno de Croagunk +Investiga el proverbio acerca de Nosepass +[~ 114] +Investiga si los Clefairy bailan bajo la luz de la luna +Investiga acerca de la habilidad especial de Swinub +Investiga el caso del Blissey samaritano +Investiga a los Vulpix de Alola +Investiga el caso del Chimecho instalado bajo el alero \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_fr.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_fr.txt new file mode 100644 index 00000000000..e6f2799a7ba --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_fr.txt @@ -0,0 +1,21 @@ +Étudier les différences entre Armulys et Blindalys +Étudier la vision nocturne des Nosferapti +Enquêter sur les Keunotor retors du village +Étudier les évolutions d’Évoli +Étudier le champignon de Parasect +Étudier le Ponyta étrange +Enquêter sur le Baudrive qui joue avec les enfants +Étudier les maux de tête des Psykokwak +Étudier le Simularbre mal en point +Étudier le M. Mime étrange +Étudier le goût du miel des Apitrini +[~ 110] +Étudier le style de combat de Pachirisu +Étudier le remède à base de venin de Cradopaud +Étudier le dicton « Un Tarinor ne perd jamais le nord. » +[~ 114] +Découvrir si Mélofée danse les soirs de pleine lune +Étudier le talent particulier de Marcacrin +Étudier Leuphorie, le Pokémon qui aide les gens +Étudier les Goupix d’Alola +Étudier l’Éoko qui s’est installé dans une habitation \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_it.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_it.txt new file mode 100644 index 00000000000..c238e707818 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_it.txt @@ -0,0 +1,21 @@ +Ricerca sulle differenze tra Silcoon e Cascoon +Ricerca su come Zubat possa volare anche al buio +Ricerca sui Bidoof birboni nel villaggio +Ricerca sulle evoluzioni di Eevee +Ricerca sul fungo di Parasect +Ricerca sul Ponyta raro +Ricerca sul Drifloon che gioca con i bambini +Ricerca sugli Psyduck con l’emicrania +Ricerca sul Sudowoodo giù di corda +Ricerca sul Mr. Mime dall’atteggiamento sospetto +Ricerca sul gusto del miele dei Combee +[~ 110] +Ricerca su come lottare assieme a Pachirisu +Ricerca sulla medicina fatta con il veleno di Croagunk +Ricerca sul proverbio "Un Nosepass per il disperso" +[~ 114] +Ricerca sulla danza dei Clefairy con la luna piena +Ricerca sul talento di Swinub +Ricerca su come Blissey aiuti gli esseri umani +Ricerca sui Vulpix di Alola +Ricerca sul Chimecho in una casa del villaggio \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ja.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ja.txt new file mode 100644 index 00000000000..ad76f0eabe5 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ja.txt @@ -0,0 +1,21 @@ +カラサリスとマユルドの違いを調査 +暗闇の中 自由自在に飛ぶズバットの調査 +ムラでいたずらを繰り返すビッパの調査 +イーブイの進化について調査 +パラセクトのキノコの調査 +ミニポニータ調査 +こどもと遊ぶフワンテの調査 +頭をかかえたコダック調査 +元気がないウソッキーの調査 +怪しい動きをするバリヤードの調査 +ミツハニーのミツの味の調査 +[~ 110] +パチリスに適した戦い方の調査 +グレッグルの毒から作るくすりの調査 +ことわざ「迷子にノズパス」の調査 +[~ 114] +満月の夜 ピッピが踊るか調査 +ウリムーの特技の調査 +人を助けるハピナスの習性を調査 +アローラ地方のロコンの調査 +民家に住み着いたチリーンの調査 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ko.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ko.txt new file mode 100644 index 00000000000..9f57451d436 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ko.txt @@ -0,0 +1,21 @@ +실쿤과 카스쿤의 차이 조사 +캄캄한 어둠 속을 자유자재로 나는 주뱃 조사 +마을에서 장난을 반복하는 비버니 조사 +이브이의 진화 조사 +파라섹트의 버섯 조사 +특이한 포니타 조사 +아이와 노는 흔들풍손 조사 +머리를 싸매고 있는 고라파덕 무리 조사 +기운이 없는 꼬지모 조사 +수상한 행동을 하는 마임맨 조사 +세꿀버리의 꿀맛 조사 +[~ 110] +파치리스에게 알맞은 전법 조사 +삐딱구리의 독으로 만드는 약 조사 +속담 “길치에겐 코코파스를” 조사 +[~ 114] +보름달이 뜨는 밤에 삐삐가 춤을 추는지 조사 +꾸꾸리의 특기 조사 +사람을 돕는 해피너스의 습성 조사 +알로라지방의 식스테일 조사 +민가에 자리 잡은 치렁 조사 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_zh.txt b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_zh.txt new file mode 100644 index 00000000000..a0ec65e6b1c --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_zh.txt @@ -0,0 +1,21 @@ +调查甲壳茧与盾甲茧的差异 +调查能在黑暗中自由自在飞行的超音蝠 +调查在村子里不断做恶作剧的大牙狸 +调查伊布的进化 +调查派拉斯特的蘑菇 +调查稀有的小火马 +调查与小孩玩耍的飘飘球 +调查抱头的可达鸭们 +调查没精神的树才怪 +调查举止怪异的魔墙人偶 +调查三蜜蜂蜂蜜的味道 +[~ 110] +调查适合帕奇利兹的战斗方式 +调查用不良蛙的毒制作的药 +调查“迷路就找朝北鼻”这句谚语 +[~ 114] +调查皮皮是否会在满月之夜跳舞 +调查小山猪的特技 +调查乐于助人的幸福蛋的习性 +调查阿罗拉地区的六尾 +调查住进了民宅的风铃铃 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_de.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_de.txt new file mode 100644 index 00000000000..cc091083dd3 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_de.txt @@ -0,0 +1,27 @@ +Exemplare gefangen +Einsatz von {0} gesehen +Mit Attacke vom Typ {0} besiegt +Exemplare besiegt +Exemplare, die sich entwickelt haben +Elite-Pokémon gefangen +Große Exemplare gefangen +Kleine Exemplare gefangen +Schwere Exemplare gefangen +Leichte Exemplare gefangen +Bei {0} gefangen +Gefangen, während es geschlafen hat +Gefangen, während es in der Luft war +Exemplare gefangen, ohne entdeckt zu werden +Mit Nahrung gefüttert +Schwerfällig gemacht +Mit einer Knallkugel erschreckt +Mit einer Pokémon-Kokeshi angelockt +Krafttechnik gesehen +Tempotechnik gesehen +Von einem Baum springen gesehen +Aus einem grünen Laubhaufen springen gesehen +Aus dem Schnee springen gesehen +Aus einem Kristallstein springen gesehen +Aus einem Heukopf springen gesehen +Registrierte Formen +Einen Teil von Arceus anvertraut bekommen \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_en.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_en.txt new file mode 100644 index 00000000000..90c789f4456 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_en.txt @@ -0,0 +1,27 @@ +Number caught +Times you’ve seen it use {0} +Number you’ve defeated with {0}-type moves +Number defeated +Number you’ve evolved +Number of alpha specimens caught +Number of large specimens you’ve caught +Number of small specimens you’ve caught +Number of heavy specimens you’ve caught +Number of light specimens you’ve caught +Number caught during {0} +Number you’ve caught while they were sleeping +Number you’ve caught while they were in the air +Number you’ve caught without being spotted +Times you’ve given it food +Times you’ve stunned it by using items +Times you’ve scared it off with a Scatter Bang +Number you’ve lured with Pokéshi Dolls +Times you’ve seen it use a strong style move +Times you’ve seen it use an agile style move +Number you’ve seen leap out of trees +Number you’ve seen leap out from piles of leaves +Number you’ve seen leap out of piles of snow +Number you’ve seen leap out of ore deposits +Number you’ve seen leap out of tussocks +Number of different forms you’ve obtained +Received a part of Arceus \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_es.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_es.txt new file mode 100644 index 00000000000..134f24b5d5d --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_es.txt @@ -0,0 +1,27 @@ +Ejemplares capturados +Veces que lo has visto usar {0} +Ejemplares derrotados con movimientos de tipo {0} +Ejemplares derrotados +Ejemplares evolucionados +Ejemplares alfa capturados +Ejemplares grandes capturados +Ejemplares pequeños capturados +Ejemplares pesados capturados +Ejemplares ligeros capturados +Ejemplares capturados durante el {0} +Ejemplares capturados mientras dormían +Ejemplares capturados en el aire +Ejemplares capturados sin que te detecten +Veces que lo has alimentado +Veces que lo has fatigado +Veces que lo has asustado con una Bola Ruidosa +Veces que lo has atraído con una Poké Muñeca +Veces que ha usado movimientos con estilo fuerte +Veces que ha usado movimientos con estilo rápido +Ejemplares avistados saliendo de árboles +Ejemplares avistados saliendo de hojas caídas +Ejemplares avistados saliendo de montones de nieve +Ejemplares avistados saliendo de rocas agrietadas +Ejemplares avistados saliendo de matas de hierba +Variaciones de forma y aspecto avistadas +Has recibido la gracia de Arceus \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_fr.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_fr.txt new file mode 100644 index 00000000000..1c0d775709e --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_fr.txt @@ -0,0 +1,27 @@ +Spécimens attrapés +Fois où l’espèce a utilisé {0} +Spécimens vaincus par une capacité de type {0} +Spécimens vaincus +Spécimens que vous avez fait évoluer +Spécimens Barons attrapés +Spécimens de grande taille attrapés +Spécimens de petite taille attrapés +Spécimens poids lourds attrapés +Spécimens poids plumes attrapés +Spécimens attrapés pendant la {0} +Spécimens attrapés dans leur sommeil +Spécimens attrapés en plein vol +Spécimens attrapés sans qu’ils vous repèrent +Fois où l’espèce a reçu de la nourriture +Fois où vous avez ralenti les mouvements de l’espèce +Fois où l’espèce a été effrayée par un Sachet Pétarade +Fois où l’espèce a été attirée par une Poupée Pokéshi +Fois où l’espèce a utilisé le Style Puissant +Fois où l’espèce a utilisé le Style Rapide +Spécimens aperçus surgissant d’un arbre +Spécimens aperçus surgissant d’un tas de feuilles vertes +Spécimens aperçus surgissant de la neige +Spécimens aperçus surgissant d’un gisement minier +Spécimens aperçus surgissant d’un touradon +Apparences différentes constatées +Bénédiction d’Arceus reçue \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_it.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_it.txt new file mode 100644 index 00000000000..f619ad48474 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_it.txt @@ -0,0 +1,27 @@ +Esemplari catturati +Volte che l’hai visto usare {0} +Volte che l’hai sconfitto con mosse di tipo {0} +Esemplari sconfitti +Volte che l’hai fatto evolvere +Esemplari alfa catturati +Esemplari di grossa taglia catturati +Esemplari di piccola taglia catturati +Esemplari pesanti catturati +Esemplari leggeri catturati +Esemplari catturati durante il {0} +Esemplari catturati mentre dormivano +Esemplari catturati in aria +Esemplari catturati senza farti notare +Volte che gli hai dato del cibo +Volte che ne hai rallentato i movimenti +Esemplari spaventati con una Scoppiosfera +Esemplari attirati con una Pokékokeshi +Tecniche potenti viste +Tecniche rapide viste +Esemplari visti saltare fuori dalle piante +Esemplari visti saltare fuori da mucchi di foglie +Esemplari visti saltare fuori dalla neve +Esemplari visti saltare fuori da depositi minerali +Esemplari visti saltare fuori da cespugli di carice +Variazioni di forma e aspetto accertate +Ti è stata affidata una parte di Arceus \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ja.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ja.txt new file mode 100644 index 00000000000..257136b468f --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ja.txt @@ -0,0 +1,27 @@ +つかまえたかず +わざ「{0}」をみたかず +{0}タイプの技で倒した数 +たおしたかず +進化させた数 +オヤブンを捕まえた数 +おおきいサイズをつかまえたかず +ちいさいサイズをつかまえたかず +おもいサイズをつかまえたかず +かるいサイズをつかまえたかず +{0}中に捕まえた数 +寝ているところを捕まえた数 +上空にいるところを捕まえた数 +見つからずに捕まえた数 +エサをあげたかず +疲れさせた数 +ばりばりだまでビビらせた数 +ポケモンこけしで引き寄せた数 +チカラワザをみた数 +ハヤワザをみた数 +木から飛び出たところを見た数 +落ち葉から飛び出たところを見た数 +雪から飛び出たところを見た数 +鉱床から飛び出たところを見た数 +ヤチボウズから飛び出たところを見た数 +確認した姿種類 +アルセウスを託された \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ko.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ko.txt new file mode 100644 index 00000000000..b18c8b7610b --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ko.txt @@ -0,0 +1,27 @@ +잡은 횟수 +{0}[VAR 1900(0002)] 사용하는 것을 본 횟수 +{0}타입 기술로 쓰러뜨린 횟수 +쓰러뜨린 횟수 +진화시킨 횟수 +우두머리를 잡은 횟수 +큰 사이즈를 잡은 횟수 +작은 사이즈를 잡은 횟수 +무거운 사이즈를 잡은 횟수 +가벼운 사이즈를 잡은 횟수 +{0}간대에 잡은 횟수 +잠든 사이에 잡은 횟수 +나는 중에 잡은 횟수 +들키지 않고 잡은 횟수 +먹이를 준 횟수 +지치게 한 횟수 +팡팡환으로 놀라게 한 횟수 +포켓몬목각인형으로 유인한 횟수 +강공을 본 횟수 +속공을 본 횟수 +나무에서 튀어나오는 것을 본 횟수 +낙엽에서 튀어나오는 것을 본 횟수 +눈에서 튀어나오는 것을 본 횟수 +광상에서 튀어나오는 것을 본 횟수 +사초에서 튀어나오는 것을 본 횟수 +확인한 모습 수 +아르세우스의 분신을 맡았다 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_zh.txt b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_zh.txt new file mode 100644 index 00000000000..17080ef6d25 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_tasks8a_zh.txt @@ -0,0 +1,27 @@ +捕获的次数 +看到“{0}”的次数 +使用{0}属性招式打倒的次数 +打倒的次数 +让它进化的次数 +捕获头目的次数 +捕获体型较大宝可梦的次数 +捕获体型较小的宝可梦的次数 +捕获体重较重的宝可梦的次数 +捕获体重较轻的宝可梦的次数 +{0}捕获的次数 +趁它在睡觉时捕获的次数 +趁它在空中时捕获的次数 +未被察觉就捕获的次数 +喂食食物的次数 +让它疲劳的次数 +用声弹吓它的次数 +用宝可梦木娃娃吸引它的次数 +看到刚猛的次数 +看到迅疾的次数 +看见它从树里跑出来的次数 +看见它从落叶跑出来的次数 +看见它从雪里跑出来的次数 +看见它从矿床跑出来的次数 +看见它从草团跑出来的次数 +已确认到的样子的种类数 +被托付阿尔宙斯 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_de.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_de.txt new file mode 100644 index 00000000000..02adf9e274e --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_de.txt @@ -0,0 +1,5 @@ +Morgens gefangen +Tagsüber gefangen +Abends gefangen +Nachts gefangen +Bei Tageslicht gefangen \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_en.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_en.txt new file mode 100644 index 00000000000..ec27d7fe26f --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_en.txt @@ -0,0 +1,5 @@ +Number caught in the morning +Number caught at midday +Number caught in the evening +Number caught at night +Number caught during daylight hours \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_es.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_es.txt new file mode 100644 index 00000000000..2e339bd6288 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_es.txt @@ -0,0 +1,5 @@ +Ejemplares capturados por la mañana +Ejemplares capturados al mediodía +Ejemplares capturados por la tarde +Ejemplares capturados por la noche +Ejemplares capturados durante el día \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_fr.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_fr.txt new file mode 100644 index 00000000000..febf968b91d --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_fr.txt @@ -0,0 +1,5 @@ +Spécimens attrapés le matin +Spécimens attrapés l’après-midi +Spécimens attrapés le soir +Spécimens attrapés la nuit +Spécimens attrapés pendant la journée \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_it.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_it.txt new file mode 100644 index 00000000000..1e6ae6055a3 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_it.txt @@ -0,0 +1,5 @@ +Esemplari catturati di mattina +Esemplari catturati di pomeriggio +Esemplari catturati di sera +Esemplari catturati di notte +Esemplari catturati durante il giorno \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ja.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ja.txt new file mode 100644 index 00000000000..b1c77189da9 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ja.txt @@ -0,0 +1,5 @@ +朝に捕まえた数 +昼に捕まえた数 +夕方に捕まえた数 +夜に捕まえた数 +日中に捕まえた数 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ko.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ko.txt new file mode 100644 index 00000000000..498b0653903 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ko.txt @@ -0,0 +1,5 @@ +아침에 잡은 횟수 +낮에 잡은 횟수 +저녁에 잡은 횟수 +밤에 잡은 횟수 +낮 시간대에 잡은 횟수 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_zh.txt b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_zh.txt new file mode 100644 index 00000000000..90931485369 --- /dev/null +++ b/PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_zh.txt @@ -0,0 +1,5 @@ +在上午捕获的次数 +在下午捕获的次数 +在傍晚捕获的次数 +在晚上捕获的次数 +在白天捕获的次数 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_de.txt b/PKHeX.Core/Resources/text/items/text_Items_de.txt index 2dbd51b9508..0a450587d3c 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_de.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_de.txt @@ -1606,206 +1606,206 @@ Dyna-Erz Karottensamen Fähigk.-Pflaster Zügel des Bundes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Zeitruhegabe +Raumruhegabe +Ruhegabe +Verbindungsschnur +Heimatmuffin +Aprikoko +Jubelmuffin +Kombivitamine +Treffervitamine +Wahlreishappen +Doppelrettich +Umkehrbratling +Rundblatt +Meistersamen +Pokéball +??? +Perma-Eis +Selfe-Kralle +Tobutz-Fangzahn +Vesprit-Feder +Glanzstein +Elysien-Flöte +Arznei +Superarznei +Funkelhonig +Munterreis +Kullerbohne +Zähpilz +Knirschmineral +Holz +Königsblatt +Moorruhegabe +Pokéball +Superball +Hyperball +Federball +Pokémon-Kokeshi +??? +Rauchkugel +Knallkugel +Klebkugel +Sternenstück +Pilzköder +Schutzblume +Honigköder +Reisköder +Bohnenköder +Mineralköder +Trank +Supertrank +Hypertrank +Top-Trank +Top-Genesung +Arznei +Superarznei +Hyperarznei +Spezialität +Jubelmuffin +Hyperheiler +Beleber +Top-Beleber +Ätherpillen +Elixierpillen +Schleichspray +??? +Offensivvitamine +Defensivvitamine +Treffervitamine +Ausweichvitamine +Kombivitamine +Waldruhegabe +Eisenbrocken +??? +Schwarzglanzstein +Azurglanzstein +??? +Lehmball +??? +Knallmoos +Rauchknolle +Löchrige Aprikoko +Schneeball +Klebkugel +Schwarzaugit +Torfblock +Schleichspray +Fitlauch +Vitalknospe +Ätherkraut +??? +??? +Wahrungstalisman 2 +Wahrungstalisman 3 +Schwertling +Schildling +Flinkling +Volltrefferling +Strandrettich +Wahrungstalisman 4 +Wahrungstalisman 5 +Süßtrüffel +Köderteig +Pokéball +Superball +Hyperball +Federball +??? +??? +Knallkugel +Rauchkugel +??? +??? +Pokémon-Kokeshi +Vulkanruhegabe +Bergruhegabe +Schneeruhegabe +Honigköder +Reisköder +Bohnenköder +Pilzköder +Mineralköder +Umkehrbratling +Wahlreishappen +Doppelrettich +Schutztalisman 1 +Schutztalisman 2 +Schutztalisman 3 +Schutztalisman 4 +Schutztalisman 5 +Kaputtes Journal +Statustalisman 1 +Statustalisman 2 +Statustalisman 3 +Statustalisman 4 +Statustalisman 5 +Plattenfragment +Salmagnis-Kloß +Altes Journal +Flügelball +Düsenball +Schwerball +Zentnerball +Tonnenball +Flügelball +Düsenball +Schwerball +Pfohbeere +Hyperarznei +Offensivvitamine +Defensivvitamine +Ausweichvitamine +Leistungssand +Leistungskies +Leistungsstein +Leistungsfels +Geheimmedizin +Wahrungstalisman 1 +Verlorene Items +Verlorene Items +Verlorene Items +Verlorene Items +Verlorene Items +??? +Urball +??? +??? +??? +??? +Urerz +Adamantkristall +Weißkristall +Platinumkristall +Neutraltafel +??? +Handwerkskiste +Zentnerball +Tonnenball +Rätselball +Pokédex +Altes Gedicht 1 +Altes Gedicht 2 +Altes Gedicht 3 +Altes Gedicht 4 +??? +Altes Gedicht 5 +Altes Gedicht 6 +Altes Gedicht 7 +Altes Gedicht 8 +Altes Gedicht 9 +Altes Gedicht 10 +Altes Gedicht 11 +Altes Gedicht 12 +Altes Gedicht 13 +Altes Gedicht 14 +Altes Gedicht 15 +Altes Gedicht 16 +Altes Gedicht 17 +Altes Gedicht 18 +Altes Gedicht 19 +Altes Gedicht 20 Enigmafragment S Enigmafragment L Einwegbohrer @@ -1820,4 +1820,10 @@ Himmelsplatte Genplatte Weisungsplatte Zerrplatte -DS-Player \ No newline at end of file +DS-Player + + + + + +Legendentafel \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_en.txt b/PKHeX.Core/Resources/text/items/text_Items_en.txt index d090dc0a1ba..3d4eca5fc25 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_en.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_en.txt @@ -431,7 +431,7 @@ Loot Sack Rule Book Poké Radar Point Card -Guidebook +Journal Seal Case Fashion Case Seal Bag @@ -1606,206 +1606,206 @@ Dynite Ore Carrot Seeds Ability Patch Reins of Unity - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Time Balm +Space Balm +Mysterious Balm +Linking Cord +Hometown Muffin +Apricorn +Jubilife Muffin +Aux Powerguard +Dire Hit +Choice Dumpling +Twice-Spiced Radish +Swap Snack +Caster Fern +Seed of Mastery +Poké Ball +??? +Eternal Ice +Uxie’s Claw +Azelf’s Fang +Mesprit’s Plume +Tumblestone +Celestica Flute +Remedy +Fine Remedy +Dazzling Honey +Hearty Grains +Plump Beans +Springy Mushroom +Crunchy Salt +Wood +King’s Leaf +Marsh Balm +Poké Ball +Great Ball +Ultra Ball +Feather Ball +Pokéshi Doll +??? +Smoke Bomb +Scatter Bang +Sticky Glob +Star Piece +Mushroom Cake +Bugwort +Honey Cake +Grain Cake +Bean Cake +Salt Cake +Potion +Super Potion +Hyper Potion +Max Potion +Full Restore +Remedy +Fine Remedy +Superb Remedy +Old Gateau +Jubilife Muffin +Full Heal +Revive +Max Revive +Max Ether +Max Elixir +Stealth Spray +??? +Aux Power +Aux Guard +Dire Hit +Aux Evasion +Aux Powerguard +Forest Balm +Iron Chunk +??? +Black Tumblestone +Sky Tumblestone +??? +Ball of Mud +??? +Pop Pod +Sootfoot Root +Spoiled Apricorn +Snowball +Sticky Glob +Black Augurite +Peat Block +Stealth Spray +Medicinal Leek +Vivichoke +Pep-Up Plant +??? +??? +Tempting Charm B +Tempting Charm P +Swordcap +Iron Barktongue +Doppel Bonnets +Direshroom +Sand Radish +Tempting Charm T +Tempting Charm Y +Candy Truffle +Cake-Lure Base +Poké Ball +Great Ball +Ultra Ball +Feather Ball +??? +??? +Scatter Bang +Smoke Bomb +??? +??? +Pokéshi Doll +Volcano Balm +Mountain Balm +Snow Balm +Honey Cake +Grain Cake +Bean Cake +Mushroom Cake +Salt Cake +Swap Snack +Choice Dumpling +Twice-Spiced Radish +Survival Charm R +Survival Charm B +Survival Charm P +Survival Charm T +Survival Charm Y +Torn Journal +Warding Charm R +Warding Charm B +Warding Charm P +Warding Charm T +Warding Charm Y +Wall Fragment +Basculegion Food +Old Journal +Wing Ball +Jet Ball +Heavy Ball +Leaden Ball +Gigaton Ball +Wing Ball +Jet Ball +Heavy Ball +Hopo Berry +Superb Remedy +Aux Power +Aux Guard +Aux Evasion +Grit Dust +Grit Gravel +Grit Pebble +Grit Rock +Secret Medicine +Tempting Charm R +Lost Satchel +Lost Satchel +Lost Satchel +Lost Satchel +Lost Satchel +??? +Origin Ball +??? +??? +??? +??? +Origin Ore +Adamant Crystal +Lustrous Globe +Griseous Core +Blank Plate +??? +Crafting Kit +Leaden Ball +Gigaton Ball +Strange Ball +Pokédex +Old Verse 1 +Old Verse 2 +Old Verse 3 +Old Verse 4 +??? +Old Verse 5 +Old Verse 6 +Old Verse 7 +Old Verse 8 +Old Verse 9 +Old Verse 10 +Old Verse 11 +Old Verse 12 +Old Verse 13 +Old Verse 14 +Old Verse 15 +Old Verse 16 +Old Verse 17 +Old Verse 18 +Old Verse 19 +Old Verse 20 Mysterious Shard S Mysterious Shard L Digger Drill @@ -1820,4 +1820,10 @@ Stratospheric Slate Genome Slate Discovery Slate Distortion Slate -DS Sounds \ No newline at end of file +DS Sounds + + + + + +Legend Plate \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_es.txt b/PKHeX.Core/Resources/text/items/text_Items_es.txt index a654b07ea9c..c735e03f32d 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_es.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_es.txt @@ -1,4 +1,4 @@ -Ningún +Ningún objeto Master Ball Ultra Ball Super Ball @@ -37,9 +37,9 @@ Raíz Energía Polvo Curación Hierba Revivir Éter -Éter Máximo +Píldora Éter Elixir -Elixir Máximo +Píldora Elixir Galleta Lava Zumo de Baya Ceniza Sagrada @@ -54,7 +54,7 @@ Zinc PP Máximos Barrita Plus Protección X -Crítico X +Gragea Crítica Ataque X Defensa X Velocidad X @@ -1606,206 +1606,206 @@ Maxinium Sem. Zanahoria Parche Habilidad Riendas Unión - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Calmasfera Tiempo +Calmasfera Espacio +Calmasfera +Cordón Unión +Bizcocho Clásico +Bonguri +Bizcocho Jubileo +Gragea Multi +Gragea Crítica +Aperitivo Elección +Encurtidoble +Bocadito Inversión +Helecho Rizado +Semilla Dominio +Poké Ball +(?) +Hielo Eterno +Garra de Uxie +Diente de Azelf +Pluma de Mesprit +Guijarro Rojo +Flauta Celestial +Remedio +Superremedio +Miel Brillante +Espiga Vivaz +Haba Suculenta +Seta Esponjosa +Mineral Crocante +Madera +Hierba Regia +Calmasfera Pantano +Poké Ball +Super Ball +Ultra Ball +Pluma Ball +Poké Muñeca +(?) +Bola Humareda +Bola Ruidosa +Bola Pegajosa +Trozo Estrella +Cebo de Setas +Hierba Repelente +Cebo Meloso +Cebo de Grano +Cebo de Habas +Cebo Mineral +Poción +Superpoción +Hiperpoción +Poción Máxima +Restaurar Todo +Remedio +Superremedio +Hiperremedio +Barrita Plus +Bizcocho Jubileo +Cura Total +Revivir +Revivir Máximo +Píldora Éter +Píldora Elixir +Aerosol Sigilo +(?) +Gragea Ofensiva +Gragea Defensiva +Gragea Crítica +Gragea Evasiva +Gragea Multi +Calmasfera Bosque +Pepita de Hierro +(?) +Guijarro Negro +Guijarro Celeste +(?) +Bola de Lodo +(?) +Marimo Ruidoso +Fumibulbo +Bonguri Pocho +Bola de Nieve +Bola Pegajosa +Mineral Negro +Bloque de Turba +Aerosol Sigilo +Puerro Medicinal +Revibrote +Hierba Éter +(?) +(?) +Amuleto Sustituto 2 +Amuleto Sustituto 3 +Seta Espada +Seta Férrea +Seta Evasiva +Seta Crítica +Rábano Arenero +Amuleto Sustituto 4 +Amuleto Sustituto 5 +Trufa Dulce +Masa para Cebo +Poké Ball +Super Ball +Ultra Ball +Pluma Ball +(?) +(?) +Bola Ruidosa +Bola Humareda +(?) +(?) +Poké Muñeca +Calmasfera Volcán +Calmasfera Montaña +Calmasfera Nieve +Cebo Meloso +Cebo de Grano +Cebo de Habas +Cebo de Setas +Cebo Mineral +Bocadito Inversión +Aperitivo Elección +Encurtidoble +Amuleto Protector 1 +Amuleto Protector 2 +Amuleto Protector 3 +Amuleto Protector 4 +Amuleto Protector 5 +Diario Rasgado +Amuleto Salud 1 +Amuleto Salud 2 +Amuleto Salud 3 +Amuleto Salud 4 +Amuleto Salud 5 +Trozo de Losa +Cebo Basculegion +Diario Antiguo +Ala Ball +Aero Ball +Peso Ball +Kilo Ball +Quintal Ball +Ala Ball +Aero Ball +Peso Ball +Baya Lupu +Hiperremedio +Gragea Ofensiva +Gragea Defensiva +Gragea Evasiva +Polvo Esfuerzo +Grava Esfuerzo +Piedra Esfuerzo +Roca Esfuerzo +Medicina Secreta +Amuleto Sustituto 1 +Objeto perdido +Objeto perdido +Objeto perdido +Objeto perdido +Objeto perdido +(?) +Origen Ball +(?) +(?) +(?) +(?) +Mena Origen +Gran Diamansfera +Gran Lustresfera +Gran Griseosfera +Tabla Neutra +(?) +Kit de Artesanía +Kilo Ball +Quintal Ball +Extraña Ball +Pokédex +Poema Antiguo 1 +Poema Antiguo 2 +Poema Antiguo 3 +Poema Antiguo 4 +(?) +Poema Antiguo 5 +Poema Antiguo 6 +Poema Antiguo 7 +Poema Antiguo 8 +Poema Antiguo 9 +Poema Antiguo 10 +Poema Antiguo 11 +Poema Antiguo 12 +Poema Antiguo 13 +Poema Antiguo 14 +Poema Antiguo 15 +Poema Antiguo 16 +Poema Antiguo 17 +Poema Antiguo 18 +Poema Antiguo 19 +Poema Antiguo 20 Esquirla Extraña S Esquirla Extraña L Taladro @@ -1820,4 +1820,10 @@ Losa Cielo Losa Genética Losa Inicio Losa Distorsión -Reproductor DS \ No newline at end of file +Reproductor DS + + + + + +Tabla Legendaria \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_fr.txt b/PKHeX.Core/Resources/text/items/text_Items_fr.txt index d2ac9422315..8417960ff20 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_fr.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_fr.txt @@ -1606,206 +1606,206 @@ Dynamaxium Graines Carotte Patch Talent Rênes de l’Unité - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Pacifi-Temps +Pacifi-Espace +Pacifisphère +Fil de Liaison +Muffin Tradition +Noigrume +Rusti-Muffin +Double Extra +Muscle + +Papillote Choix +Bouchée Double +En-cas Contraire +Feuille Ronde +Graine Maîtrise +Poké Ball +??? +Glaçon Éternel +Griffe de Créhelf +Croc de Créfadet +Aile de Créfollet +Galet +Flûte Céleste +Remède +Super Remède +Miel Kibrille +Riz Zélé +Fève Dodue +Champi Toumou +Sel Rochedur +Bois +Herbe Souveraine +Pacifi-Marais +Poké Ball +Super Ball +Hyper Ball +Plume Ball +Poupée Pokéshi +??? +Bombe Aveuglante +Sachet Pétarade +Boule Gluante +Morceau d’Étoile +Appât Toumou +Plante Répulsive +Appât Kibrille +Appât Zélé +Appât Dodu +Appât Rochedur +Potion +Super Potion +Hyper Potion +Potion Max +Guérison +Remède +Super Remède +Hyper Remède +Vieux Gâteau +Rusti-Muffin +Total Soin +Rappel +Rappel Max +Soin PP +Maxi Soin PP +Solution Furtive +??? +Offensive Extra +Défense Extra +Muscle + +Esquive Extra +Double Extra +Pacifi-Forêt +Fragment de Fer +??? +Galet Noir +Galet Azur +??? +Boule de Boue +??? +Pétaralgue +Rutabagaz +Noigrume Rongé +Boule de Neige +Boule Gluante +Obsidienne +Bloc de Tourbe +Solution Furtive +Soignon +Bourgeon Vivace +Plante PP +??? +??? +Remplamulette 2 +Remplamulette 3 +Fortichampi +Carapachampi +Champinja +Champiscoto +Radis des Plages +Remplamulette 4 +Remplamulette 5 +Truffe Sucrée +Appâte +Poké Ball +Super Ball +Hyper Ball +Plume Ball +??? +??? +Sachet Pétarade +Bombe Aveuglante +??? +??? +Poupée Pokéshi +Pacifi-Volcan +Pacifi-Montagne +Pacifi-Neige +Appât Kibrille +Appât Zélé +Appât Dodu +Appât Toumou +Appât Rochedur +En-cas Contraire +Papillote Choix +Bouchée Double +Enduramulette 1 +Enduramulette 2 +Enduramulette 3 +Enduramulette 4 +Enduramulette 5 +Journal Déchiré +Zenamulette 1 +Zenamulette 2 +Zenamulette 3 +Zenamulette 4 +Zenamulette 5 +Fragment de Mur +Appâragruel +Vieux Journal +Envol Ball +Propulse Ball +Masse Ball +Mégamasse Ball +Gigamasse Ball +Envol Ball +Propulse Ball +Masse Ball +Baie Bouhlon +Hyper Remède +Offensive Extra +Défense Extra +Esquive Extra +Sable Effort +Cailloux Effort +Pierre Effort +Rocher Effort +Remède Secret +Remplamulette 1 +Objet Perdu +Objet Perdu +Objet Perdu +Objet Perdu +Objet Perdu +??? +Origine Ball +??? +??? +??? +??? +Minerai Origine +Globe Adamant +Globe Perlé +Globe Platiné +Plaque Renouveau +??? +Boîte à Outils +Mégamasse Ball +Gigamasse Ball +Étrange Ball +Pokédex +Vieux Poème (1) +Vieux Poème (2) +Vieux Poème (3) +Vieux Poème (4) +??? +Vieux Poème (5) +Vieux Poème (6) +Vieux Poème (7) +Vieux Poème (8) +Vieux Poème (9) +Vieux Poème (10) +Vieux Poème (11) +Vieux Poème (12) +Vieux Poème (13) +Vieux Poème (14) +Vieux Poème (15) +Vieux Poème (16) +Vieux Poème (17) +Vieux Poème (18) +Vieux Poème (19) +Vieux Poème (20) Éclat Étrange S Éclat Étrange L Foreuse @@ -1820,4 +1820,10 @@ Tablette Cieux Tablette Génétique Tablette Guides Tablette Distorsion -Lecteur DS \ No newline at end of file +Lecteur DS + + + + + +Plaque Légende \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_it.txt b/PKHeX.Core/Resources/text/items/text_Items_it.txt index 20f57e20d5a..230b7411782 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_it.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_it.txt @@ -1606,206 +1606,206 @@ Rocciamax Semi di carota Cerotto abilità Briglie legame - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Sferazen tempo +Sferazen spazio +Sferazen +Filo dell’unione +Muffin classico +Bacca ghicocca +Muffin Giubilo +Multi extra +Supercolpo +Involtoscelta +Doppiaceto +Invertigratin +Felcetonda +Seme padronanza +Poké Ball +??? +Ghiaccio perenne +Artiglio di Uxie +Zanna di Azelf +Piuma di Mesprit +Ciottolo +Flauto memordei +Preparato +Preparato buono +Miele luccicante +Spiga rigogliosa +Fagiolo paffuto +Fungo gommoso +Minerale duro +Legno +Foglia regina +Sferazen palude +Poké Ball +Mega Ball +Ultra Ball +Piuma Ball +Pokékokeshi +??? +Palla orba +Scoppiosfera +Sfera viscosa +Pezzo Stella +Polpetta funghi +Erba repellente +Polpetta miele +Polpetta spighe +Polpetta fagioli +Polpetta minerale +Pozione +Superpozione +Iperpozione +Pozione Max +Ricarica totale +Preparato +Preparato buono +Preparato ottimo +Dolce Gateau +Muffin Giubilo +Cura totale +Revitalizzante +Revitalizz. Max +Tonico PP +Tonico PP Max +Furtivizzante +??? +Offensiva extra +Difensiva extra +Supercolpo +Elusione X +Multi extra +Sferazen foresta +Pezzo di ferro +??? +Ciottolo nero +Ciottolo celeste +??? +Palla di fango +??? +Scoppiettalga +Patata fumosa +Ghicocca bacata +Palla di neve +Sfera viscosa +Augite nera +Blocco di torba +Furtivizzante +Porro officinale +Revitalboccio +Erba PP +??? +??? +Amuleto Sostituto 2 +Amuleto Sostituto 3 +Danzaspaditola +Ferroscudino +Doppioteamillo +Colpogone +Rafano costiero +Amuleto Sostituto 4 +Amuleto Sostituto 5 +Tartufo dolce +Polpetta base +Poké Ball +Mega Ball +Ultra Ball +Piuma Ball +??? +??? +Scoppiosfera +Palla orba +??? +??? +Pokékokeshi +Sferazen vulcano +Sferazen monte +Sferazen neve +Polpetta miele +Polpetta spighe +Polpetta fagioli +Polpetta funghi +Polpetta minerale +Invertigratin +Involtoscelta +Doppiaceto +Amuleto tutela 1 +Amuleto tutela 2 +Amuleto tutela 3 +Amuleto tutela 4 +Amuleto tutela 5 +Diario rovinato +Amuleto salute 1 +Amuleto salute 2 +Amuleto salute 3 +Amuleto salute 4 +Amuleto salute 5 +Pezzo di lastra +Esca Basculegion +Vecchio diario +Wing Ball +Jet Ball +Peso Ball +Megaton Ball +Gigaton Ball +Wing Ball +Jet Ball +Peso Ball +Baccaluppo +Preparato ottimo +Offensiva extra +Difensiva extra +Elusione X +Sabbia impegno +Ghiaia impegno +Pietra impegno +Roccia impegno +Rimedio segreto +Amuleto Sostituto 1 +Oggetto smarrito +Oggetto smarrito +Oggetto smarrito +Oggetto smarrito +Oggetto smarrito +??? +Origin Ball +??? +??? +??? +??? +Rocciorigine +Adamasferoide +Splendisferoide +Grigiosferoide +Lastraripristino +??? +Kit faidaté +Megaton Ball +Gigaton Ball +Strange Ball +Pokédex +Antica poesia 1 +Antica poesia 2 +Antica poesia 3 +Antica poesia 4 +??? +Antica poesia 5 +Antica poesia 6 +Antica poesia 7 +Antica poesia 8 +Antica poesia 9 +Antica poesia 10 +Antica poesia 11 +Antica poesia 12 +Antica poesia 13 +Antica poesia 14 +Antica poesia 15 +Antica poesia 16 +Antica poesia 17 +Antica poesia 18 +Antica poesia 19 +Antica poesia 20 Frammento insolito S Frammento insolito L Trivella @@ -1820,4 +1820,10 @@ Piastra dei cieli Piastra del gene Piastra degli esordi Piastra distorta -Lettore DS \ No newline at end of file +Lettore DS + + + + + +Lastraleggenda \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_ja.txt b/PKHeX.Core/Resources/text/items/text_Items_ja.txt index 7a0cc3d9675..516037877d2 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_ja.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_ja.txt @@ -1606,206 +1606,206 @@ にんじんのタネ とくせいパッチ キズナのタヅナ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +ときのシズメダマ +そらのシズメダマ +しずめだま +つながりのヒモ +ふるさとマフィン +ぼんぐりのみ +コトブキマフィン +ビルドアッパー +クリティカッター +こだわりちまき +にばいづけ +あべこべやき +まるいはっぱ +たくみのえまき +モンスターボール +ススキのおとしもの +こだいのこおり +ユクシーのつめ +アグノムのきば +エムリットのはね +たまいし +カミナギのふえ +カンポーやく +いいカンポーやく +きらきらミツ +いきいきイナホ +ころころマメ +もちもちキノコ +ごりごりミネラル +もくざい +キングリーフ +シズメダマ2 +モンスターボール +スーパーボール +ハイパーボール +クラフトレシピ41 +ポケモンこけし +クラフトレシピ06 +クラフトレシピ07 +ばりばりだま +ねばりだま +クラフトレシピ10 +クラフトレシピ11 +むらさきハーブ +クラフトレシピ12 +クラフトレシピ13 +クラフトレシピ14 +クラフトレシピ15 +クラフトレシピ16 +クラフトレシピ17 +クラフトレシピ18 +クラフトレシピ19 +クラフトレシピ20 +クラフトレシピ21 +クラフトレシピ22 +クラフトレシピ23 +クラフトレシピ24 +クラフトレシピ25 +クラフトレシピ26 +クラフトレシピ27 +クラフトレシピ28 +クラフトレシピ29 +クラフトレシピ30 +クラフトレシピ31 +??? +クラフトレシピ33 +クラフトレシピ34 +クラフトレシピ35 +クラフトレシピ36 +クラフトレシピ37 +しずめダマ +てつのかけら +??? +くろいろたまいし +そらいろたまいし +??? +どろだんご +??? +バリバリモズク +ケムリイモ +むしくいぼんぐり +ゆきだま +ねばりだま +くろのきせき +ピートブロック +むしよけスプレー +クスリソウ +ゲンキツボミ +ピーピーグサ +??? +??? +ふしぎなおまもり2(仮) +ふしぎなおまもり3(仮) +ツルギマイタケ +テッペキクラゲ +カゲブンシメジ(仮) +キュウショウロ(仮) +すなはまダイコン +ふしぎなおまもり4(仮) +ふしぎなおまもり5(仮) +スイートトリュフ +よせだまのもと +モンスターボール +スーパーボール +ハイパーボール +フェザーボール +アーチボール +とくしゅボール +ビビリだま +けむりだま +??? +??? +ポケモンこけし +かざんのシズメダマ +やまのシズメダマ +ゆきのシズメダマ +ミツよせだま +イナホよせだま +マメよせだま +キノコよせだま +ミネラルよせだま +クラフトレシピ38 +クラフトレシピ39 +クラフトレシピ40 +あんぜんおまもり1 +あんぜんおまもり2 +あんぜんおまもり3 +あんぜんおまもり4 +あんぜんおまもり5 +やぶれたにっき +けんこうおまもり1 +けんこうおまもり2 +けんこうおまもり3 +けんこうおまもり4 +けんこうおまもり5 +せきばんのかけら +イダイトウだんご +ふるいにっき +ウイングボール +ジェットボール +ヘビーボール +メガトンボール +ギガトンボール +ウイングボール +クラフトレシピ42 +クラフトレシピ43 +ポフのみ +すごいカンポーやく +アタックアップ +ディフェンスアップ +ヨクアタラーヌ +ガンバリのすな +ガンバリのじゃり +ガンバリのいし +ガンバリのいわ +ガンバリセット +ふしぎなおまもり +だれかのポーチ +だれかのポーチ +だれかのポーチ +だれかのポーチ +だれかのポーチ +スマートフォン +オリジンボール +だれかのきんちゃく +タマカゴ +だんいんしょう +くさりのはへん +オリジンこうせき +だいこんごうだま +だいしらたま +だいはっきんだま +まっさらプレート +??? +クラフトキット +クラフトレシピ44 +クラフトレシピ45 +ストレンジボール +ポケモンずかん +ふるいポエム1 +ふるいポエム2 +ふるいポエム3 +ふるいポエム4 +アルセウスフォン +ふるいポエム5 +ふるいポエム6 +ふるいポエム7 +ふるいポエム8 +ふるいポエム9 +ふるいポエム10 +ふるいポエム11 +ふるいポエム12 +ふるいポエム13 +ふるいポエム14 +ふるいポエム15 +ふるいポエム16 +ふるいポエム17 +ふるいポエム18 +ふるいポエム19 +ふるいポエム20 なぞのかけらS なぞのかけらL あなほりドリル @@ -1820,4 +1820,10 @@ いでんしのせきばん みちびきのせきばん やぶれたせきばん -DSプレイヤー \ No newline at end of file +DSプレイヤー + + + + + +レジェンドプレート \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_ko.txt b/PKHeX.Core/Resources/text/items/text_Items_ko.txt index a6f621200c3..0ea76ec7342 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_ko.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_ko.txt @@ -1606,206 +1606,206 @@ PP회복캡슐토이 당근씨 특성패치 유대의고삐 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +시간의진정환 +공간의진정환 +진정환 +연결의끈 +고향머핀 +규토리열매 +축복머핀 +멀티업 +크리티컬커터 +구애잎사귀떡 +두배절임 +뒤바뀜구이 +둥근고비 +숙달의씨 +몬스터볼 +??? +영원한얼음 +유크시의손톱 +아그놈의이빨 +엠라이트의깃털 +옥돌 +공신의피리 +한방약 +좋은한방약 +반짝반짝꿀 +싱싱이삭 +통통콩 +쫄깃쫄깃버섯 +단단미네랄 +목재 +킹리프 +늪의진정환 +몬스터볼 +수퍼볼 +하이퍼볼 +페더볼 +포켓몬목각인형 +??? +눈속임환 +팡팡환 +끈끈환 +별의조각 +버섯유인환 +벌레회피풀 +꿀유인환 +이삭유인환 +콩유인환 +미네랄유인환 +상처약 +좋은상처약 +고급상처약 +풀회복약 +회복약 +한방약 +좋은한방약 +고급한방약 +숲의양갱 +축복머핀 +만병통치제 +기력의조각 +기력의덩어리 +PP회복 +PP맥스 +살금살금스프레이 +??? +공격의환약 +방어의환약 +크리티컬커터 +잘-안맞기 +멀티업 +숲의진정환 +철조각 +??? +검은옥돌 +하늘색옥돌 +??? +진흙경단 +??? +팡팡마리모 +연기토란 +벌레먹은규토리 +눈덩이 +끈끈환 +검은휘석 +피트블록 +살금살금스프레이 +약초 +기력의봉오리 +PP풀 +??? +??? +대타부적2 +대타부적3 +칼춤버섯 +철벽버섯 +그림자분신버섯 +급소버섯 +모래해변무 +대타부적4 +대타부적5 +스위트러플 +유인환반죽 +몬스터볼 +수퍼볼 +하이퍼볼 +페더볼 +??? +??? +팡팡환 +눈속임환 +??? +??? +포켓몬목각인형 +화산의진정환 +산의진정환 +눈의진정환 +꿀유인환 +이삭유인환 +콩유인환 +버섯유인환 +미네랄유인환 +뒤바뀜구이 +구애잎사귀떡 +두배절임 +안전부적1 +안전부적2 +안전부적3 +안전부적4 +안전부적5 +찢어진일기 +건강부적1 +건강부적2 +건강부적3 +건강부적4 +건강부적5 +석판조각 +대쓰여너경단 +낡은일기 +윙볼 +제트볼 +헤비볼 +메가톤볼 +기가톤볼 +윙볼 +제트볼 +헤비볼 +포흐열매 +고급한방약 +공격의환약 +방어의환약 +잘-안맞기 +노력의모래 +노력의자갈 +노력의돌 +노력의바위 +비전신약 +대타부적1 +누군가의분실물 +누군가의분실물 +누군가의분실물 +누군가의분실물 +누군가의분실물 +??? +오리진볼 +??? +??? +??? +??? +오리진광석 +큰금강옥 +큰백옥 +큰백금옥 +순백플레이트 +??? +공작키트 +메가톤볼 +기가톤볼 +스트레인지볼 +포켓몬 도감 +오래된 시1 +오래된 시2 +오래된 시3 +오래된 시4 +??? +오래된 시5 +오래된 시6 +오래된 시7 +오래된 시8 +오래된 시9 +오래된 시10 +오래된 시11 +오래된 시12 +오래된 시13 +오래된 시14 +오래된 시15 +오래된 시16 +오래된 시17 +오래된 시18 +오래된 시19 +오래된 시20 수수께끼의조각S 수수께끼의조각L 구멍파기드릴 @@ -1820,4 +1820,10 @@ PP회복캡슐토이 유전자의석판 인도의석판 깨어진석판 -DS플레이어 \ No newline at end of file +DS플레이어 + + + + + +레전드플레이트 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/items/text_Items_zh.txt b/PKHeX.Core/Resources/text/items/text_Items_zh.txt index 864dfeb82c4..6860920b749 100644 --- a/PKHeX.Core/Resources/text/items/text_Items_zh.txt +++ b/PKHeX.Core/Resources/text/items/text_Items_zh.txt @@ -1606,206 +1606,206 @@ 萝卜种子 特性膏药 牵绊缰绳 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +时之镇宝 +空之镇宝 +镇宝 +联系绳 +家乡玛芬 +球果果 +祝庆玛芬 +多重强化 +要害攻击 +讲究粽 +双倍腌菜 +颠倒烧 +弹子萁 +精通种子 +精灵球 +??? +永恒之冰 +由克希之爪 +亚克诺姆之牙 +艾姆利多之翅 +玉石 +神阖之笛 +中药 +好中药 +晶晶蜜 +旺旺谷 +滚滚豆 +糯糯菇 +坚坚矿 +木材 +皇叶 +沼之镇宝 +精灵球 +超级球 +高级球 +飞羽球 +宝可梦木娃娃 +??? +烟弹 +声弹 +黏丸 +星星碎片 +菇诱团 +除虫草 +蜜诱团 +谷诱团 +豆诱团 +矿诱团 +伤药 +好伤药 +厉害伤药 +全满药 +全复药 +中药 +好中药 +厉害中药 +森之羊羹 +祝庆玛芬 +万灵药 +活力碎片 +活力块 +PP单项全补剂 +PP多项全补剂 +匿声喷雾 +??? +进攻药丸 +防守药丸 +要害攻击 +闪避强化 +多重强化 +森之镇宝 +碎铁 +??? +黑玉石 +天蓝玉石 +??? +泥丸 +??? +惊声藻 +烟芋 +蛀球果 +雪丸 +黏丸 +黑奇石 +泥炭块 +匿声喷雾 +疗草 +活力蕾 +PP草 +??? +??? +替身护符2 +替身护符3 +剑舞菇 +铁壁木耳 +影分菇 +要害松露 +沙滩萝卜 +替身护符4 +替身护符5 +甜松露 +诱团原料 +精灵球 +超级球 +高级球 +飞羽球 +??? +??? +声弹 +烟弹 +??? +??? +宝可梦木娃娃 +火山镇宝 +山之镇宝 +雪之镇宝 +蜜诱团 +谷诱团 +豆诱团 +菇诱团 +矿诱团 +颠倒烧 +讲究粽 +双倍腌菜 +安全护符1 +安全护符2 +安全护符3 +安全护符4 +安全护符5 +破损日记 +健康护符1 +健康护符2 +健康护符3 +健康护符4 +健康护符5 +石板碎块 +幽尾玄鱼丸 +古老日记 +飞翼球 +飞梭球 +沉重球 +超重球 +巨重球 +飞翼球 +飞梭球 +沉重球 +花啤果 +厉害中药 +进攻药丸 +防守药丸 +闪避强化 +奋斗沙 +奋斗砾 +奋斗石 +奋斗岩 +秘传之药 +替身护符1 +他人的遗失物 +他人的遗失物 +他人的遗失物 +他人的遗失物 +他人的遗失物 +??? +起源球 +??? +??? +??? +??? +起源矿石 +大金刚宝玉 +大白宝玉 +大白金宝玉 +净空石板 +??? +工艺套组 +超重球 +巨重球 +奇异球 +宝可梦图鉴 +古老诗文1 +古老诗文2 +古老诗文3 +古老诗文4 +??? +古老诗文5 +古老诗文6 +古老诗文7 +古老诗文8 +古老诗文9 +古老诗文10 +古老诗文11 +古老诗文12 +古老诗文13 +古老诗文14 +古老诗文15 +古老诗文16 +古老诗文17 +古老诗文18 +古老诗文19 +古老诗文20 谜之碎片S 谜之碎片L 挖洞钻 @@ -1820,4 +1820,10 @@ 基因石板 引导石板 毁坏石板 -DS播放器 \ No newline at end of file +DS播放器 + + + + + +传说石板 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_de.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_de.txt new file mode 100644 index 00000000000..a51bf1e9615 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_de.txt @@ -0,0 +1,156 @@ +---------- + +an einem mysteriösen Ort + +an einem fernen Ort + +in Jubeldorf +im Obsidian-Grasland +im Roten Sumpfland +im Kobalt-Küstenland +im Kraterberg-Hochland +im Weißen Frostland +in der Uralten Siedlung +auf dem Ambitionshügel +auf den Hufeisenwiesen +auf dem Geweihbergweg +auf der Geweihanhöhe +am Obsidian-Wasserfall +im Erztunnel +in der Waldesküche +im Innerwald +auf dem Baumriesenkampffeld +im Strapazenhain +am See der Wahrheit +in der Sandgemmenheide +am Mündungsdamm +auf der Flora-Rodefläche +auf der Hamanasu-Insel +in der Graslandbasis +in der Anhöhenbasis +in der Windpassage +auf der Flora-Rodefläche +bei der Felsenbrücke +beim Moosfelsen +auf den Güldenen Feldern +in den Ruinen des Trostes +im Großmaulmoor +auf dem Schlammplateau +im Purpurroten Moor +auf dem Geröllhügel +in der Diamant-Siedlung +am See der Kühnheit +auf dem Wolkenmeerkamm +in den Nebelruinen +[~ 44] +auf der Prüfungsbarre +auf den Surrenden Feldern +in der Sumpflandbasis +in der Ödnisbasis +am Übergangshang +am Ginkgo-Strand +im Schaurigen Welkwald +in der Versteckten Bucht +auf dem Tombolo-Weg +am Schleierkap +beim Seegrasidyll +auf der Feuerspei-Insel +im Haus von Susuki +auf dem Quellenpfad +am Großfischfelsen +am Inselblickufer +im Windbruchwald +[~ 62] +im Gezeitentunnel +in der Kleinen Meeresgrotte +in der Strandbasis +in der Küstenlandbasis +in der Höhle der Umkehr +am Lavadom-Schrein +in der Hochlandbasis +auf dem Sakralplateau +im Wirrwald +im Uralten Steinbruch +auf dem Elysien-Bergpfad +an der Einsamen Quelle +am Feenweiher +in den Geröllbergen +auf dem Steinplattenpass +[~ 78] +in der Urzeitlichen Höhle +bei der Kletterklippe +bei den Elysien-Tempelruinen +auf dem Mondgrußkampffeld +in der Gipfelbasis +im Gipfelschwadentunnel +auf der Speersäule +in der Bizarren Höhle +in der Schneefeldbasis +im Blizzardtal +in der Gletscherpassage +in der Eisigen Ödnis +[~ 91] +am Arktilas-Eisblock +auf den Gletscherstufen +am See der Stärke +im Blizzard-Tempel +in der Winterschlafhöhle +bei den Firnfällen +auf dem Lawinenhügel +auf dem Pfad zum Kampffeld +in der Perl-Siedlung +am Geistesfelsen +in der Eissäulenkammer +in der Eisgipfelbasis +in der Wahrheitsgrotte +in der Kühnheitsgrotte +auf der Wollgraswiese +in der Bergbasis +an der Steinpforte +im Sinnoh-Tempel +beim Eisfelsen +in der Stärkegrotte +in der Eisgipfelhöhle +in der Geheimen Höhle +im Galaktik-Hauptsitz +im Gemischtwarenladen +am Bonbonstand +im Handwerksladen +bei der Ginkgo-Gilde +bei der Tauschbörse +auf der Weide +in der Schneiderei +im Friseursalon +im Fotoatelier +auf dem Acker +auf dem Übungsplatz +am Glücksschrein +im Quartier +an der Küste der Verirrten +bei den Sandfingern +auf dem Pilgerpfad +auf dem Platz der Huldigung +am Haupttor +am Strandtor +auf der Fleetstraße +auf der Floristraße +am Strand des Aufbruchs +auf dem Übungsgelände +an einem Unbekannten Ort +auf dem Bühnenkampffeld +auf dem Lavakampffeld +auf dem Eisgipfelkampffeld +bei der Schneeblicktherme +im Erdgeschoss +in der ersten Etage +in der zweiten Etage +im Untergeschoss +auf dem Prankenplatz +auf der Diamant-Ebene +auf den Griffel-Hügeln +bei der Badelagune +im Stillen Binnenmeer +Galaktik-Hauptsitz +Haupttor +Acker +Übungsplatz diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_en.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_en.txt new file mode 100644 index 00000000000..546af32f34d --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_en.txt @@ -0,0 +1,156 @@ +—————— + +in a mystery zone + +in a faraway place + +in Jubilife Village +in the Obsidian Fieldlands +in the Crimson Mirelands +in the Cobalt Coastlands +in the Coronet Highlands +in the Alabaster Icelands +at the Ancient Retreat +on Aspiration Hill +in the Horseshoe Plains +on Deertrack Path +upon Deertrack Heights +at the Obsidian Falls +in Oreburrow Tunnel +in Nature’s Pantry +in the Heartwood +at Grandtree Arena +in Grueling Grove +at Lake Verity +in Sandgem Flats +at Tidewater Dam +in Floaro Gardens +on Ramanas Island +at the Fieldlands Camp +at the Heights Camp +on Windswept Run +in Floaro Gardens +at the Worn Bridge +at the Moss Rock +in the Golden Lowlands +at the Solaceon Ruins +at Gapejaw Bog +on Sludge Mound +at the Scarlet Bog +on Bolderoll Slope +at the Diamond Settlement +at Lake Valor +on Cloudpool Ridge +at the Shrouded Ruins +[~ 44] +at the Holm of Trials +in the Droning Meadow +at the Mirelands Camp +at the Bogbound Camp +on Crossing Slope +at Ginkgo Landing +at Deadwood Haunt +at Hideaway Bay +along Tombolo Walk +at Veilstone Cape +at Seagrass Haven +on Firespit Island +at Iscan’s home +on Spring Path +at Lunker’s Lair +on Islespy Shore +in Windbreak Stand +[~ 62] +in the Tidal Passage +in the Seaside Hollow +at the Beachside Camp +at the Coastlands Camp +in Turnback Cave +in the Lava Dome Sanctum +at the Highlands Camp +at the Heavenward Lookout +in the Wayward Wood +in the Ancient Quarry +on Celestica Trail +at the Lonely Spring +at the Fabled Spring +in Bolderoll Ravine +at Stonetooth Rows +[~ 78] +in the Primeval Grotto +at the Clamberclaw Cliffs +at the Celestica Ruins +at Moonview Arena +at the Summit Camp +along Cloudcap Pass +at the Spear Pillar +in Wayward Cave +at the Snowfields Camp +in Whiteout Valley +in the Crevasse Passage +in the Bonechill Wastes +[~ 91] +at Avalugg’s Legacy +on Glacier Terrace +at Lake Acuity +at Snowpoint Temple +in Hibernal Cave +at the Icebound Falls +at the Avalanche Slopes +along the Arena’s Approach +at the Pearl Settlement +at Heart’s Crag +in the Ice Column Chamber +at the Icepeak Camp +in Verity Cavern +in Valor Cavern +in Cottonsedge Prairie +at the Mountain Camp +at the Stone Portal +at the Temple of Sinnoh +at the Ice Rock +in Acuity Cavern +in Icepeak Cavern +in the Secret Hollow +at Galaxy Hall +at the general store +at the candy stand +at the craftworks +at the Ginkgo Guild cart +at the trading post +at the pastures +at the clothier +at the hairdresser +at the photography studio +at the farm +at the training grounds +at the folk shrine +in your quarters +on Castaway Shore +at Sand’s Reach +on Sonorous Path +at the Sacred Plaza +at the front gate +at the seaside gate +on Canala Avenue +on Floaro Main Street +on Prelude Beach +at the practice field +at an unknown location +at Brava Arena +at Molten Arena +at Icepeak Arena +at Snowfall Hot Spring +on the first floor +on the second floor +on the third floor +in the basement +at Ursa’s Ring +on the Diamond Heath +on Aipom Hill +at Bathers’ Lagoon +in Tranquility Cove +Galaxy Hall +Front Gate +Farm +Training Grounds diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_es.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_es.txt new file mode 100644 index 00000000000..2c07afab7ef --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_es.txt @@ -0,0 +1,156 @@ +- + +en un lugar misterioso + +en un lugar misterioso + +en Villa Jubileo +en la Pradera Obsidiana +en el Pantanal Carmesí +en la Costa Cobalto +en la Ladera Corona +en la Tundra Alba +en la Antigua Aldea Oculta +en la Colina del Anhelo +en el Prado Herradura +en la Senda del Venado +en la Loma del Venado +en la Cascada Obsidiana +en la Gruta Pirita +en la Alacena del Bosque +en el Bosque Recóndito +en la Arena del Gran Árbol +en la Foresta Funesta +en el Lago Veraz +en la Planicie Arena +en la Presa del Estuario +en el Campo Aromaflor +en la Isla Hansa +en la base de la pradera +en la base de la loma +en la Vereda del Viento +en el Campo Aromaflor +en el Puente Erosionado +en la roca musgo +en la Pradera Áurea +en las Ruinas Sosiego +en la Ciénaga Bocazas +en la Loma Lodosa +en la Ciénaga Bermeja +en la Ladera Derrumbe +en el Poblado Diamante +en el Lago Valor +en el Rellano Nebuloso +en las Ruinas de la Niebla +[~ 44] +en el Banco del Juicio +en la Pradera Aleteo +en la base del pantanal +en la base del páramo +en el Paso Costanero +en la Playa Ginkgo +en la Arboleda Tétrica +en la Cala Oculta +en el Camino del Tómbolo +en el Cabo Rocavelo +en el Vergel Marino +en la Isla Escupefuego +en la casa de Erio +en la Vía Manantial +en la Guarida del Gran Pez +en la Costa Ínsola +en el Bosque Rompeviento +[~ 62] +en la Gruta Pasamar +en la Cueva Costera +en la base de la playa +en la base de la costa +en la Cueva Retorno +en el Altar Domo Lava +en la base de la ladera +en la Loma Sagrada +en el Bosque Extravío +en la Cantera Ancestral +en la Senda Celestial +en el Manantial Solitario +en la Fuente de las Hadas +en la Cordillera Derrumbe +en el Cañón Lítico +[~ 78] +en la Caverna Inmemorial +en el Risco Riscoso +en las Ruinas Celestiales +en la Arena de la Luna +en la base de la cima +en el Paso Píleo +en las Columnas Lanza +en la Cueva Extravío +en la base de las nieves +en el Valle Nevasca +en el Pasaje de la Grieta +en el Páramo Algente +[~ 91] +en el Témpano Avalugg +en la Terraza Glaciar +en el Lago Agudeza +en el Templo Puntaneva +en la Caverna Hiberna +en la Cascada Glaliar +en el Desfiladero Alud +en la Senda de la Arena +en el Poblado Perla +en el Peñasco Espíritu +en la Cámara Carámbano +en la base del glaciar +en la Caverna Veraz +en la Caverna Valor +en el Prado Erióforo +en la base de la montaña +en el Umbral Pétreo +en el Templo de Sinnoh +en la roca helada +en la Caverna Agudeza +en la Gruta Glacial +en el Pasaje Oculto +en la Sede Galaxia +en el bazar +en el puesto de caramelos +en el taller +en la Compañía Ginkgo +en el puesto de trueque +en el redil +en la sastrería +en el salón de peluquería +en el estudio fotográfico +en la huerta +en el dojo +junto a la estatuilla sagrada +en la residencia +en la Playa del Errante +en la Mano de Arena +en la Senda del Peregrino +en el Ágora de la Plegaria +en la puerta principal +en la puerta costera +en la Vía Canal +en la Vía Aromaflor +en la Playa del Albor +en el Campo de Práctica +en un lugar desconocido +en la Arena del Escenario +en la Arena del Magma +en la Arena del Glaciar +en las Termas Nevavista +en la planta baja +en la primera planta +en la segunda planta +en el sótano +en la Palestra Ursa +en la Llanura Diamante +en el Cerro Aipom +en las Albuferas Chapuzón +en la Bahía Silente +Sede Galaxia +Puerta principal +Huerta +Dojo diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_fr.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_fr.txt new file mode 100644 index 00000000000..5202d081f1b --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_fr.txt @@ -0,0 +1,156 @@ +---------- + +dans un endroit mystérieux + +dans un endroit lointain + +à Rusti-Cité +dans les Plaines Obsidiennes +au Marais Carmin +sur la Côte Lazuli +au Contrefort Couronné +sur les Terres Immaculées +au Hameau Oublié +sur la Colline Ambition +dans le Val Ferrache +sur le Sentier Cer-Mont +sur le Plateau Cer-Mont +à la Chute d’Obsidienne +dans le Tunnel de Fer +au Cellier Champêtre +dans la Forêt Lointaine +à l’Arène du Grand Arbre +dans le Bocage Agité +au Lac Vérité +dans la Plaine Littorella +sur la Digue de l’Estuaire +dans le Champ Flora +sur l’Île Rosa Rugosa +au Bivouac des Plaines +au Bivouac du Plateau +sur la Rive Filevent +dans le Champ Flora +sur le Pont Rocheux +au Rocher Moussu +dans la Plaine d’Or +aux Ruines Bonvivre +au Marais Bouchebée +sur le Plateau Tourbeux +au Marais Carlate +sur la Pente des Gringoles +au Hameau Diamant +au Lac Courage +au Col Mer-de-Nuages +aux Ruines Brumeuses +[~ 44] +sur l’Île de l’Épreuve +dans le Champ Bourdonne +au Bivouac du Marais +au Bivouac de la Friche +sur le Coteau du Passage +sur la Plage Ginkgo +sur la Rive des Revenants +dans la Crique Paisible +sur la Presqu’île Tombolo +au Cap du Voile +dans le Havre des Algues +sur l’Île Crache-Feu +chez Graham +sur le Chemin de la Source +à l’Arche Poissigrand +sur la Plage Long-des-Îles +au Bois Brise-Vent +[~ 62] +au Passage des Marées +au Creux du Cap +au Bivouac des Plages +au Bivouac Côtier +dans la Grotte du Retour +à l’Autel de la Caldeira +au Bivouac Contrefort +dans les Hauts de l’Humilité +dans la Forêt des Égarés +dans l’Ancienne Carrière +sur le Sentier Céleste +à la Source Reculée +à la Source Féérique +au Mont des Gringoles +au Col Pierlevé +[~ 78] +dans la Grotte Préhistorique +sur la Falaise Calade +au Temple Céleste +à l’Arène de la Lune +au Bivouac des Cimes +au Passage des Nuages +aux Colonnes Lances +dans la Grotte des Égarés +au Bivouac des Neiges +dans la Vallée Enneigée +sur la Voie de Glace +sur l’Étendue Polaire +[~ 91] +au Glacier Séracrawl +sur la Terrasse du Glacier +au Lac Savoir +au Temple de Frimapic +dans la Grotte Hibernale +à la Chute d’Oglacé +sur la Pente de l’Avalanche +sur le Sentier de l’Arène +au Hameau Perle +au Rocher Esprit +dans la Chambre des Piliers +au Bivouac du Glacier +dans la Caverne Vérité +dans la Caverne Courage +dans la Lande Herbacoton +au Bivouac de Montagne +à la Porte de Pierre +au Temple de Sinnoh +à la Pierre Gelée +dans la Caverne Savoir +dans le Souterrain de Givre +dans la Grotte Secrète +au Siège du Groupe Galaxie +dans la Boutique +au Stand de Bonbons +dans l’Atelier +à la Compagnie Ginkgo +à l’Étal d’Échanges +sur l’Aire de Pâturage +à la Maison du Textile +chez Art Capillaire +chez le Photographe +au Verger +au Dojo +à la Statuette Gardienne +au Logis +sur la Plage de l’Errance +à la Main de Sable +sur le Sentier des Pèlerins +sur le Parvis des Prières +à la Porte Principale +à la Porte Maritime +sur Joliallée +sur Florallée +sur la Plage Premiépas +sur l’Aire d’Initiation +dans un endroit inconnu +à l’Arène du Théâtre +à l’Arène de la Lave +à l’Arène de l’Iceberg +à la Source Panora-Neige +au rez-de-chaussée +au 1ᵉʳ étage +au 2ᵉ étage +au sous-sol +à l’Arène Ursa +à la Lisière du Hameau +au Mont des Capumain +à la Lagune des Bains +dans la Baie Sérénité +au Siège du Groupe Galaxie +à la Porte Principale +au Verger +au Dojo diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_it.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_it.txt new file mode 100644 index 00000000000..25de52808e6 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_it.txt @@ -0,0 +1,156 @@ +---------- + +in una zona misteriosa + +in un luogo remoto + +al Villaggio Giubilo +nella Landa Ossidiana +all’Acquitrino Vermiglio +sulla Costa Oltremare +alle Pendici Corona +ai Ghiacci Candidi +alla Dimora Remota +sul Colle Ambizione +alla Piana Ferdicavallo +sul Sentiero Grancorno +sull’Altura Grancorno +alla Cascata Ossidiana +nel Tunnel Minerario +alla Cucina della Foresta +nella Foresta Lontana +all’Arena del Colosso +nel Bosco Ostico +al Lago Verità +alla Pianura Sabbiafine +alla Diga della Foce +nel Giardino Bonificato +sull’Isola Rosa Rugosa +alla Base della Landa +alla Base sull’Altura +alla Spianata Filavento +nel Giardino Bonificato +sul Ponte Eroso +al Masso Muschioso +nel Bassopiano Dorato +alle Rovine Flemma +alla Palude Boccalarga +sull’Altopiano Melmoso +alla Palude Purpurea +sul Pendio Rotolio +al Campo Diamante +al Lago Valore +sulla Cresta Mardinubi +alle Rovine Brumose +[~ 44] +sull’Isolotto della Prova +alla Piana del Frullo +alla Base dell’Acquitrino +alla Base Brulla +sul Clivo del Passaggio +alla Spiaggia Ginkgo +nel Fantasmeto +alla Cala Celata +sulla Via del Tombolo +sul Capo Rupevelo +nel Paradiso Erbamarina +sull’Isola Mangiafuoco +a Casa di Sinen +sul Sentiero Fonte +al Rifugio Pescegrosso +alla Spiaggia Ondisola +nella Foresta Controvento +[~ 62] +al Varco della Marea +nella Cavità Marina +alla Base sulla Spiaggia +alla Base della Costa +nella Grotta Ritorno +al Tempietto Cratere +alla Base sulle Pendici +sull’Altura del Divino +nel Bosco Labirinto +nella Cava degli Antichi +sul Sentiero dei Memordei +alla Sorgente Recondita +alla Fonte Folletto +sul Massiccio Rotolio +sulla Cresta Pietrinfila +[~ 78] +nella Caverna Primitiva +alle Scarpate Scalande +al Tempio dei Memordei +all’Arena Accogliluna +alla Base della Vetta +sul Passo Nubiloso +sulla Vetta Lancia +nella Grotta Labirinto +alla Base delle Nevi +alla Valle Nevefitta +sulla Via del Crepaccio +alla Distesa Polare +[~ 91] +ai Blocchi d’Avalugg +alla Scala del Ghiacciaio +al Lago Arguzia +al Tempio di Punta Neve +nella Caverna del Letargo +alla Cascata Tuttogelo +sul Pendio Valanga +sulla Via dell’Arena +al Campo Perla +alla Roccia dello Spirito +al Colonnato Glaciale +alla Base dei Ghiacci +nella Grotta Verità +nella Grotta Valore +al Prato dei Pennacchi +alla Base di Montagna +alla Porta di Roccia +al Tempio di Sinnoh +al Masso Ghiacciato +nella Grotta Arguzia +nel Cunicolo dei Ghiacci +nella Grotta Segreta +alla Sede del Team Galassia +all’Emporio +al Chiosco di Caramelle +alla Bottega +alla Ditta Ginkgo +al Banco degli Scambi +al Pascolo +alla Sartoria +al Salone Acconciature +allo Studio Fotografico +al Podere +all’Area Allenamento +alla Pietra degli Amuleti +all’Alloggio +al Lido degli Sperduti +alla Mano di Sabbia +sulla Via dei Pellegrini +alla Piazza della Preghiera +alla Porta Principale +alla Porta della Spiaggia +in Via Canale +in Corso Fiorito +alla Spiaggia Origine +allo Spiazzo Allenamento +in un luogo sconosciuto +all’Arena della Ribalta +all’Arena della Lava +all’Arena dell’Iceberg +alle Terme Miraneve +al piano terra +al primo piano +al secondo piano +nel piano interrato +al Ring Ursino +alla Radura Diamante +sul Monte degli Aipom +nella Laguna Bagnetto +nel Mar Silente +alla Sede del Team Galassia +alla Porta Principale +al Podere +all’Area Allenamento diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ja.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ja.txt new file mode 100644 index 00000000000..a5f8f7729b9 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ja.txt @@ -0,0 +1,156 @@ +---------- + +なぞのばしょ + +とおいばしょ + +コトブキムラ +こくようのげんや +ぐれんのしっち +ぐんじょうのかいがん +てんがんのさんろく +じゅんぱくのとうど +いにしえのかくれざと +たいしざか +ていてつがはら +シシのやまみち +シシのたかだい +こくようのたき +くろがねトンネル +もりのだいどころ +おくのもり +きょぼくのせんじょう +けわしばやし +シンジこ +マサゴへいげん +かこうのえんてい +そのおのかいこんち +ハマナスのしま +げんやベース +たかだいベース +かぜぬけみち +そのおのかいこんち +けずらればし +苔むした岩 +こんじきのへいや +ズイのいせき +おおぐちのぬま +ヘドロだいち +こうけつぬま +ゴロゴロざか +コンゴウしゅうらく +リッシこ +うんかいとうげ +きりのいせき +[~ 44] +クマのけいこば +はおとのはら +しっちベース +あれちベース +わたりのなぞえ +イチョウのはまべ +オバケワラ +うらのはま +トンボロみち +とばりみさき +うみくさのらくえん +ひふきじま +ススキのいえ +かくれいずみへのみち +おおうおのかくれいわ +しまなみはま +かぜさらしのもり +[~ 62] +しおのぬけみち +うみべのこあな +すなはまベース +かいがんベース +もどりのどうくつ +かこうのほこら +さんろくベース +しんぜんのたかだい +まよいのさんりん +こだいのいしきりば +カミナギさんどう +はなれゆうすい +フェアリーのいずみ +ゴロゴロさんち +れっせきとうげ +[~ 78] +たいこのほらあな +がけのぼりがけ +カミナギじいんあと +げいげつのせんじょう +さんちょうベース +かさぐものきりとおし +やりのはしら +まよいのすいろ +せつげんベース +ごうせつだに +クレバスのぬけみち +ごっかんのあれち +[~ 91] +クレベースひょうかい +ひょうがのだんきゅう +エイチこ +キッサキしんでん +ふゆごもりのほらあな +おにごおりだき +なだれざか +ひょうざんのいくさば +シンジュしゅうらく +しんぎょういわやま +ふとうのいずみ +ひょうざんベース +シンジこのくうどう +リッシこのくうどう +けやりのそうげん +さんちゅうベース +いわのもん +シンオウしんでん +こおったいし +エイチこのくうどう +ひょうざんのちかどう +ひみつのよこあな +ギンガ団本部 +雑貨屋 +アメ屋 +クラフト屋 +イチョウ商会 +交換屋 +放牧場 +呉服屋 +散髪屋 +写真屋 +農場 +訓練場 +おまもり石 +[VAR 0100(0000)]の部屋 +迷子の磯辺 +砂の手 +じゅんれいしゃのみち +いのりのひろば +おもてもん +はまもん +ミオどおり +ソノオどおり +はじまりのはま +やがいくんれんじょう +みしらぬばしょ +ぶたいのいくさば +ようがんのいくさば +ひょうざんのいくさば +雪見の出で湯 +1階 +2階 +3階 +地下1階 +クマの稽古場 +コンゴウの里山 +エイパム山 +水浴び潟 +静かな内海 +ほんぶまえ +おもてもんまえ +はたけまえ +くんれんじょうまえ diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ko.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ko.txt new file mode 100644 index 00000000000..3e5841d6c8e --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ko.txt @@ -0,0 +1,156 @@ +---------- + +수수께끼의 장소 + +먼 곳 + +축복마을 +흑요 들판 +홍련 습지 +군청 해안 +천관산 기슭 +순백 동토 +숨겨진 옛마을 +포부의 언덕 +편자 들판 +큰뿔 산길 +큰뿔 고지 +흑요 폭포 +무쇠터널 +숲속 부엌 +안쪽 숲 +거목의 전장 +험한 숲 +진실호수 +잔모래 평원 +하굿둑 +꽃향기 개척지 +해당화섬 +들판 기지 +고지 기지 +바람 샛길 +꽃향기 개척지 +절삭다리 +이끼 낀 바위 +금색 평야 +신수유적 +큰입 늪 +진흙 대지 +진홍늪 +데굴데굴 언덕 +금강부락 +입지호수 +구름바다 고개 +안개의 유적 +[~ 44] +시련의 모래톱 +날갯소리 들판 +습지 기지 +황무지 기지 +건넘의 비탈 +은행 해변 +유령의 모래톱 +숨겨진 해변 +톰볼로 길 +장막해안가 +해초의 낙원 +불뿜는섬 +억새의 집 +숨겨진 샘의 길 +큰물고기의 암초 +섬줄기 해변 +바람막이 숲 +[~ 62] +바닷물 샛길 +바닷가 작은 굴 +모래해변 기지 +해안 기지 +귀혼동굴 +화구의 사당 +산기슭 기지 +신전 고지 +미혹의 산림 +고대의 채석장 +공신 산길 +외딴 용수 +페어리의 샘 +데굴데굴 산지 +열석 고개 +[~ 78] +태고의 동굴 +등반 절벽 +공신 사원터 +영월의 전장 +산정 기지 +삿갓구름 산길 +창기둥 +미혹의 동굴 +설원 기지 +폭설 골짜기 +크레바스 샛길 +극한의 황무지 +[~ 91] +크레베이스 빙괴 +빙하 단구 +예지호수 +선단신전 +동면 동굴 +얼음귀신 폭포 +눈사태 언덕 +전장으로 가는 길 +진주부락 +마음 바위산 +빙주의 방 +빙산 기지 +진실호수의 공동 +입지호수의 공동 +황새풀 초원 +산중 기지 +바위의 문 +신오신전 +얼어붙은 바위 +예지호수의 공동 +빙산 지하도 +비밀의 옆굴 +은하단 본부 +잡화점 +사탕가게 +공작상점 +은행상회 +교환소 +방목장 +포목점 +이발소 +사진관 +농장 +훈련장 +수호석 +숙소 +미아의 바위해변 +모래손 +순례자의 길 +기도의 광장 +정문 +해안문 +운하 도로 +꽃향기 도로 +시작의 해변 +야외 훈련장 +미지의 장소 +무대의 전장 +용암의 전장 +빙산의 전장 +설경 온천 +1층 +2층 +3층 +지하 1층 +이탄 수련장 +금강부락 뒷산 +에이팜산 +미역감기 석호 +고요한 내해 +본부 앞 +정문 앞 +농장 앞 +훈련장 앞 diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_zh.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_zh.txt new file mode 100644 index 00000000000..63b14d158b9 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_zh.txt @@ -0,0 +1,156 @@ +---------- + +神秘的地方 + +遥远的地方 + +祝庆村 +黑曜原野 +红莲湿地 +群青海岸 +天冠山麓 +纯白冻土 +古昔隐居地 +大志坡 +蹄铁草原 +角鹿山道 +角鹿高岗 +黑曜瀑布 +黑金隧道 +森林膳房 +深幽森林 +巨木战场 +险林 +心齐湖 +真砂平原 +河口堤堰 +荒园开垦地 +玫瑰岛 +原野基地 +高岗基地 +驰风道 +荒园开垦地 +削石桥 +苔岩 +金色平野 +随意遗迹 +大嘴沼泽 +泥炭台地 +绯红沼 +隆隆坡 +金刚聚落 +立志湖 +云海山道 +云雾遗迹 +[~ 44] +试炼沙洲 +羽音原野 +湿地基地 +荒地基地 +通海坡 +银杏沙滩 +鬼枯原 +后浦 +沙洲道 +帷幕海角 +海草乐园 +吹火岛 +阿芒的家 +隐泉之路 +大鱼隐岩 +望岛滩 +迎风林 +[~ 62] +潮路 +海边小洞 +沙滩基地 +海岸基地 +归途洞窟 +火山口祠 +山麓基地 +神前高岗 +迷失山林 +古代采石场 +神阖山道 +离泉 +妖精之泉 +隆隆山地 +列石山道 +[~ 78] +太古洞穴 +攀崖崖 +神阖寺院遗址 +迎月战场 +山顶基地 +笠云锥道 +枪之柱 +迷幻洞窟 +雪原基地 +雪涛谷 +冰隙小径 +酷寒荒地 +[~ 91] +冰岩块 +冰河阶坡 +睿智湖 +雪峰神殿 +冬蛰洞穴 +冰鬼瀑 +雪崩坡 +往战场的路 +珍珠聚落 +心形岩山 +冰柱窟 +冰山基地 +心齐湖洞窟 +立志湖洞窟 +羊胡草原 +山中基地 +岩门 +神奥神殿 +冻石 +睿智湖洞窟 +冰山地道 +秘密小洞 +银河队总部 +杂货店 +糖果铺 +工艺店 +银杏商会 +易宝摊 +放牧场 +衣铺 +理发店 +照相馆 +农场 +训练场 +御护石 +宿舍 +离散石滩 +沙手 +巡礼者之路 +祈祷广场 +正门 +滨海门 +水脉道 +花苑道 +起始海滩 +野外训练场 +陌生的地方 +舞台战场 +熔岩战场 +冰山战场 +观雪温泉 +1楼 +2楼 +3楼 +地下1楼 +熊的比武场 +金刚后山 +长尾怪手山 +戏水潟湖 +宁静湾 +总部前 +正门前 +农场前 +训练场前 diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_de.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_de.txt new file mode 100644 index 00000000000..f9b855b2f4e --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_de.txt @@ -0,0 +1,23 @@ + +Link-Tausch +Link-Tausch +Kanto-Region +Johto-Region +Hoenn-Region +Sinnoh-Region +Fernes Land +---------- +Einall-Region +Kalos-Region +Pokémon-Link +Pokémon GO +Kanto-Region +Hoenn-Region +Alola-Region +Pokémon-Resort +Johto-Region +Pokémon HOME +Kanto-Region +Galar-Region +Hisui-Region +Sinnoh-Region \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_en.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_en.txt new file mode 100644 index 00000000000..b01ad43bf59 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_en.txt @@ -0,0 +1,23 @@ + +a Link Trade +a Link Trade +the Kanto region +the Johto region +the Hoenn region +the Sinnoh region +a distant land +—————— +the Unova region +the Kalos region +Pokémon Link +Pokémon GO +the Kanto region +the Hoenn region +the Alola region +Poké Pelago +the Johto region +Pokémon HOME +the Kanto region +the Galar region +the Hisui region +the Sinnoh region \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_es.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_es.txt new file mode 100644 index 00000000000..7f702538681 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_es.txt @@ -0,0 +1,23 @@ + +Intercambio en conexión +Intercambio en conexión +Kanto +Johto +Hoenn +Sinnoh +Tierra lejana +---------- +Teselia +Kalos +Nexo Pokémon +Pokémon GO +Kanto +Hoenn +Alola +Poké Resort +Johto +Pokémon HOME +Kanto +Galar +Hisui +Sinnoh \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_fr.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_fr.txt new file mode 100644 index 00000000000..9094d84b958 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_fr.txt @@ -0,0 +1,23 @@ + +Échange en réseau +Échange en réseau +Kanto +Johto +Hoenn +Sinnoh +Pays lointain +---------- +Unys +Kalos +Poké Lien +Pokémon GO +Kanto +Hoenn +Alola +Poké Loisir +Johto +Pokémon HOME +Kanto +Galar +Hisui +Sinnoh \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_it.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_it.txt new file mode 100644 index 00000000000..fd54348aebc --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_it.txt @@ -0,0 +1,23 @@ + +Scambio in link +Scambio in link +Kanto +Johto +Hoenn +Sinnoh +Terra lontana +---------- +Unima +Kalos +Pokémon Link +Pokémon GO +Kanto +Hoenn +Alola +Poké Resort +Johto +Pokémon HOME +Kanto +Galar +Hisui +Sinnoh \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ja.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ja.txt new file mode 100644 index 00000000000..457ee848643 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ja.txt @@ -0,0 +1,23 @@ + +つうしんこうかん +つうしんこうかん +カントーちほう +ジョウトちほう +ホウエンちほう +シンオウちほう +とおくはなれたとち +---------- +イッシュちほう +カロスちほう +ポケモンリンク +Pokémon GO +カントーちほう +ホウエンちほう +アローラちほう +ポケリゾート +ジョウトちほう +Pokémon HOME +カントーちほう +ガラルちほう +ヒスイちほう +シンオウちほう \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ko.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ko.txt new file mode 100644 index 00000000000..647214ca342 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ko.txt @@ -0,0 +1,23 @@ + +통신교환 +통신교환 +관동지방 +성도지방 +호연지방 +신오지방 +아주 먼 땅 +---------- +하나지방 +칼로스지방 +포켓몬링크 +Pokémon GO +관동지방 +호연지방 +알로라지방 +포켓리조트 +성도지방 +Pokémon HOME +관동지방 +가라르지방 +히스이지방 +신오지방 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_zh.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_zh.txt new file mode 100644 index 00000000000..355b7ac4b53 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_zh.txt @@ -0,0 +1,23 @@ + +连接交换 +连接交换 +关都地区 +城都地区 +丰缘地区 +神奥地区 +遥远的土地 +---------- +合众地区 +卡洛斯地区 +宝可梦连接 +Pokémon GO +关都地区 +丰缘地区 +阿罗拉地区 +宝可度假地 +城都地区 +Pokémon HOME +关都地区 +伽勒尔地区 +洗翠地区 +神奥地区 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_de.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_de.txt new file mode 100644 index 00000000000..c6fc4a40558 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_de.txt @@ -0,0 +1,87 @@ + +Netter Ort +Ferner Ort +Pokémon-Film +[~ 3] +Pokémon-Film 2019 +Pokémon-Film 2020 +Pokémon-Film 2021 +Pokémon-Film 2022 +Pokémon-Film 2023 +Pokémon-Film 2024 +Pokémon-Zeichentrickserie +Pokémon Center +Pokémon Center Tohoku +WCS +[~ 14] +WCS 2019 +WCS 2020 +WCS 2021 +WCS 2022 +WCS 2023 +WCS 2024 +Worlds +[~ 22] +Worlds 2019 +Worlds 2020 +Worlds 2021 +Worlds 2022 +Worlds 2023 +Worlds 2024 +VGE +[~ 30] +VGE 2019 +VGE 2020 +VGE 2021 +VGE 2022 +VGE 2023 +VGE 2024 +Pokémon-Veranstaltung +Kampfturnier +Videospiel-Veranstaltung +Pokémon Daisuki Club +Pokémon-TV-Programm +Konzert +Online-Geschenk +PGL +[~ 45] +Pokémon-Veranstaltung 2019 +Pokémon-Veranstaltung 2020 +Pokémon-Veranstaltung 2021 +Pokémon-Veranstaltung 2022 +Pokémon-Veranstaltung 2023 +Pokémon-Veranstaltung 2024 +Pokémon-Veranstaltung +[~ 53] +Pokémon-Veranstaltung 2019 +Pokémon-Veranstaltung 2020 +Pokémon-Veranstaltung 2021 +Pokémon-Veranstaltung 2022 +Pokémon-Veranstaltung 2023 +Pokémon-Veranstaltung 2024 +PokéPark +[~ 61] +PokéPark 2019 +PokéPark 2020 +PokéPark 2021 +PokéPark 2022 +PokéPark 2023 +PokéPark 2024 +Veranstaltung +GAME FREAK +Stadion +VGC +[~ 72] +VGC 2019 +VGC 2020 +VGC 2021 +VGC 2022 +VGC 2023 +VGC 2024 +Virtual Console +Pokémon GO +Pokémon Bank +Pokémon-Geschäft +Demoversion +Pokéball Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_en.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_en.txt new file mode 100644 index 00000000000..edf6378f8a5 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_en.txt @@ -0,0 +1,87 @@ + +a lovely place +a faraway place +a Pokémon movie +[~ 3] +a 2019 Pokémon movie +a 2020 Pokémon movie +a 2021 Pokémon movie +a 2022 Pokémon movie +a 2023 Pokémon movie +a 2024 Pokémon movie +the Pokémon animated show +a Pokémon Center +Pokémon Center Tohoku +a WCS +[~ 14] +WCS 2019 +WCS 2020 +WCS 2021 +WCS 2022 +WCS 2023 +WCS 2024 +Worlds +[~ 22] +2019 Worlds +2020 Worlds +2021 Worlds +2022 Worlds +2023 Worlds +2024 Worlds +a VGE +[~ 30] +VGE 2019 +VGE 2020 +VGE 2021 +VGE 2022 +VGE 2023 +VGE 2024 +a Pokémon event +a Battle Competition +a game event +the Pokémon Daisuki Club +a Pokémon TV program +a concert +an online present +the PGL +[~ 45] +a 2019 Pokémon event +a 2020 Pokémon event +a 2021 Pokémon event +a 2022 Pokémon event +a 2023 Pokémon event +a 2024 Pokémon event +a Pokémon event +[~ 53] +a 2019 Pokémon event +a 2020 Pokémon event +a 2021 Pokémon event +a 2022 Pokémon event +a 2023 Pokémon event +a 2024 Pokémon event +PokéPark +[~ 61] +PokéPark 2019 +PokéPark 2020 +PokéPark 2021 +PokéPark 2022 +PokéPark 2023 +PokéPark 2024 +an event site +GAME FREAK +a stadium +a VGC event +[~ 72] +the VGC 2019 +the VGC 2020 +the VGC 2021 +the VGC 2022 +the VGC 2023 +the VGC 2024 +a Virtual Console game +Pokémon GO +Pokémon Bank +a Pokémon shop +a demo version +the Poké Ball Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_es.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_es.txt new file mode 100644 index 00000000000..6e0cb118da6 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_es.txt @@ -0,0 +1,87 @@ + +Lugar encantador +Lugar lejano +Película Pokémon +[~ 3] +Película Pokémon 2019 +Película Pokémon 2020 +Película Pokémon 2021 +Película Pokémon 2022 +Película Pokémon 2023 +Película Pokémon 2024 +Dibujos animados Pokémon +Pokémon Center +Pokémon Center Tohoku +WCS +[~ 14] +WCS 2019 +WCS 2020 +WCS 2021 +WCS 2022 +WCS 2023 +WCS 2024 +Worlds +[~ 22] +Worlds 2019 +Worlds 2020 +Worlds 2021 +Worlds 2022 +Worlds 2023 +Worlds 2024 +Evento de Videojuegos +[~ 30] +Evento Videojuegos 2019 +Evento Videojuegos 2020 +Evento Videojuegos 2021 +Evento Videojuegos 2022 +Evento Videojuegos 2023 +Evento Videojuegos 2024 +Evento Pokémon +Torneo +Evento de Videojuegos +Pokémon Daisuki Club +Programa sobre Pokémon +Concierto +Regalo en línea +Pokémon Global Link +[~ 45] +Evento Pokémon 2019 +Evento Pokémon 2020 +Evento Pokémon 2021 +Evento Pokémon 2022 +Evento Pokémon 2023 +Evento Pokémon 2024 +Evento Pokémon +[~ 53] +Evento Pokémon 2019 +Evento Pokémon 2020 +Evento Pokémon 2021 +Evento Pokémon 2022 +Evento Pokémon 2023 +Evento Pokémon 2024 +PokéPark +[~ 61] +PokéPark 2019 +PokéPark 2020 +PokéPark 2021 +PokéPark 2022 +PokéPark 2023 +PokéPark 2024 +Evento +GAME FREAK +Estadio +VGC +[~ 72] +VGC 2019 +VGC 2020 +VGC 2021 +VGC 2022 +VGC 2023 +VGC 2024 +Consola Virtual +Pokémon GO +Banco de Pokémon +Establecimiento Pokémon +Versión de prueba +Poké Ball Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_fr.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_fr.txt new file mode 100644 index 00000000000..76609309aa8 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_fr.txt @@ -0,0 +1,87 @@ + +Endroit superbe +Endroit lointain +Film Pokémon +[~ 3] +Film Pokémon 2019 +Film Pokémon 2020 +Film Pokémon 2021 +Film Pokémon 2022 +Film Pokémon 2023 +Film Pokémon 2024 +Dessin animé Pokémon +Pokémon Center +Pokémon Center Tohoku +WCS +[~ 14] +WCS 2019 +WCS 2020 +WCS 2021 +WCS 2022 +WCS 2023 +WCS 2024 +Worlds +[~ 22] +Worlds 2019 +Worlds 2020 +Worlds 2021 +Worlds 2022 +Worlds 2023 +Worlds 2024 +Évènement Jeu Vidéo +[~ 30] +Évènement Jeu Vidéo 2019 +Évènement Jeu Vidéo 2020 +Évènement Jeu Vidéo 2021 +Évènement Jeu Vidéo 2022 +Évènement Jeu Vidéo 2023 +Évènement Jeu Vidéo 2024 +Évènement Pokémon +Compétition +Évènement +Pokémon Daisuki Club +Émission Pokémon +Concert +Cadeau téléchargeable +Pokémon Global Link +[~ 45] +Évènement Pokémon 2019 +Évènement Pokémon 2020 +Évènement Pokémon 2021 +Évènement Pokémon 2022 +Évènement Pokémon 2023 +Évènement Pokémon 2024 +Évènement Pokémon +[~ 53] +Évènement Pokémon 2019 +Évènement Pokémon 2020 +Évènement Pokémon 2021 +Évènement Pokémon 2022 +Évènement Pokémon 2023 +Évènement Pokémon 2024 +PokéPark +[~ 61] +PokéPark 2019 +PokéPark 2020 +PokéPark 2021 +PokéPark 2022 +PokéPark 2023 +PokéPark 2024 +Lieu d’évènement +GAME FREAK +Stade +VGC +[~ 72] +VGC 2019 +VGC 2020 +VGC 2021 +VGC 2022 +VGC 2023 +VGC 2024 +Console virtuelle +Pokémon GO +Banque Pokémon +Boutique Pokémon +Démo +Poké Ball Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_it.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_it.txt new file mode 100644 index 00000000000..fba11758f35 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_it.txt @@ -0,0 +1,87 @@ + +Luogo grazioso +Luogo remoto +Film Pokémon +[~ 3] +Film Pokémon 2019 +Film Pokémon 2020 +Film Pokémon 2021 +Film Pokémon 2022 +Film Pokémon 2023 +Film Pokémon 2024 +Cartone animato Pokémon +Pokémon Center +Pokémon Center Tohoku +WCS +[~ 14] +WCS 2019 +WCS 2020 +WCS 2021 +WCS 2022 +WCS 2023 +WCS 2024 +Worlds +[~ 22] +Worlds 2019 +Worlds 2020 +Worlds 2021 +Worlds 2022 +Worlds 2023 +Worlds 2024 +Evento di gioco +[~ 30] +Evento di gioco 2019 +Evento di gioco 2020 +Evento di gioco 2021 +Evento di gioco 2022 +Evento di gioco 2023 +Evento di gioco 2024 +Evento Pokémon +Gara +Evento di gioco +Pokémon Daisuki Club +Programma TV Pokémon +Concerto +Regalo online +PGL +[~ 45] +Evento Pokémon 2019 +Evento Pokémon 2020 +Evento Pokémon 2021 +Evento Pokémon 2022 +Evento Pokémon 2023 +Evento Pokémon 2024 +Evento Pokémon +[~ 53] +Evento Pokémon 2019 +Evento Pokémon 2020 +Evento Pokémon 2021 +Evento Pokémon 2022 +Evento Pokémon 2023 +Evento Pokémon 2024 +PokéPark +[~ 61] +PokéPark 2019 +PokéPark 2020 +PokéPark 2021 +PokéPark 2022 +PokéPark 2023 +PokéPark 2024 +Evento +GAME FREAK +Stadio +VGC +[~ 72] +VGC 2019 +VGC 2020 +VGC 2021 +VGC 2022 +VGC 2023 +VGC 2024 +Virtual Console +Pokémon GO +Banca Pokémon +Negozio Pokémon +Demo +Poké Ball Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ja.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ja.txt new file mode 100644 index 00000000000..5d510c4d19f --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ja.txt @@ -0,0 +1,87 @@ + +すてきなばしょ +とおいばしょ +ポケモンえいが +[~ 3] +ポケモンえいが19 +ポケモンえいが20 +ポケモンえいが21 +ポケモンえいが22 +ポケモンえいが23 +ポケモンえいが24 +ポケモンアニメ +ポケモンセンター +PCトウホク +WCS +[~ 14] +WCS2019 +WCS2020 +WCS2021 +WCS2022 +WCS2023 +WCS2024 +Worlds +[~ 22] +Worlds2019 +Worlds2020 +Worlds2021 +Worlds2022 +Worlds2023 +Worlds2024 +VGE +[~ 30] +VGE2019 +VGE2020 +VGE2021 +VGE2022 +VGE2023 +VGE2024 +ポケモンイベント +バトルたいかい +ゲームイベント +だいすきクラブ +ポケモンばんぐみ +コンサート +オンラインプレゼント +PGL +[~ 45] +ポケモンイベント19 +ポケモンイベント20 +ポケモンイベント21 +ポケモンイベント22 +ポケモンイベント23 +ポケモンイベント24 +ポケモンフェスタ +[~ 53] +ポケモンフェスタ19 +ポケモンフェスタ20 +ポケモンフェスタ21 +ポケモンフェスタ22 +ポケモンフェスタ23 +ポケモンフェスタ24 +ポケパーク +[~ 61] +ポケパーク2019 +ポケパーク2020 +ポケパーク2021 +ポケパーク2022 +ポケパーク2023 +ポケパーク2024 +イベントかいじょう +ゲームフリーク +スタジアム +VGC +[~ 72] +VGC2019 +VGC2020 +VGC2021 +VGC2022 +VGC2023 +VGC2024 +バーチャルコンソール +Pokémon GO +ポケモンバンク +ポケモンのショップ +たいけんばん +モンスターボール Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ko.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ko.txt new file mode 100644 index 00000000000..942988ddad9 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ko.txt @@ -0,0 +1,87 @@ + +근사한 장소 +먼 곳 +포켓몬영화 +[~ 3] +포켓몬영화19 +포켓몬영화20 +포켓몬영화21 +포켓몬영화22 +포켓몬영화23 +포켓몬영화24 +포켓몬 애니메이션 +포켓몬센터 +PC도호쿠 +WCS +[~ 14] +WCS2019 +WCS2020 +WCS2021 +WCS2022 +WCS2023 +WCS2024 +Worlds +[~ 22] +Worlds2019 +Worlds2020 +Worlds2021 +Worlds2022 +Worlds2023 +Worlds2024 +VGE +[~ 30] +VGE2019 +VGE2020 +VGE2021 +VGE2022 +VGE2023 +VGE2024 +포켓몬이벤트 +배틀 대회 +게임 이벤트 +the Pokémon Daisuki Club +포켓몬 방송 +콘서트 +온라인 선물 +PGL +[~ 45] +포켓몬이벤트19 +포켓몬이벤트20 +포켓몬이벤트21 +포켓몬이벤트22 +포켓몬이벤트23 +포켓몬이벤트24 +포켓몬페스타 +[~ 53] +포켓몬페스타19 +포켓몬페스타20 +포켓몬페스타21 +포켓몬페스타22 +포켓몬페스타23 +포켓몬페스타24 +포켓파크 +[~ 61] +포켓파크2019 +포켓파크2020 +포켓파크2021 +포켓파크2022 +포켓파크2023 +포켓파크2024 +이벤트회장 +게임프리크 +스타디움 +VGC +[~ 72] +VGC2019 +VGC2020 +VGC2021 +VGC2022 +VGC2023 +VGC2024 +버추얼 콘솔 +Pokémon GO +포켓몬 뱅크 +a Pokémon shop +체험판 +몬스터볼 Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_zh.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_zh.txt new file mode 100644 index 00000000000..80f5320646a --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_zh.txt @@ -0,0 +1,87 @@ + +美丽的地方 +遥远的地方 +宝可梦电影 +[~ 3] +宝可梦电影19 +宝可梦电影20 +宝可梦电影21 +宝可梦电影22 +宝可梦电影23 +宝可梦电影24 +宝可梦动画片 +宝可梦中心 +东北PC +WCS +[~ 14] +WCS2019 +WCS2020 +WCS2021 +WCS2022 +WCS2023 +WCS2024 +Worlds +[~ 22] +Worlds2019 +Worlds2020 +Worlds2021 +Worlds2022 +Worlds2023 +Worlds2024 +VGE +[~ 30] +VGE2019 +VGE2020 +VGE2021 +VGE2022 +VGE2023 +VGE2024 +宝可梦活动 +对战大赛 +游戏活动 +发烧友俱乐部 +宝可梦节目 +音乐会 +在线礼物 +PGL +[~ 45] +宝可梦活动19 +宝可梦活动20 +宝可梦活动21 +宝可梦活动22 +宝可梦活动23 +宝可梦活动24 +宝可梦庆典 +[~ 53] +宝可梦庆典19 +宝可梦庆典20 +宝可梦庆典21 +宝可梦庆典22 +宝可梦庆典23 +宝可梦庆典24 +宝可公园 +[~ 61] +宝可公园2019 +宝可公园2020 +宝可公园2021 +宝可公园2022 +宝可公园2023 +宝可公园2024 +活动会场 +GAME FREAK +竞技场 +VGC +[~ 72] +VGC2019 +VGC2020 +VGC2021 +VGC2022 +VGC2023 +VGC2024 +Virtual Console +Pokémon GO +宝可梦虚拟银行 +宝可梦的店 +体验版 +精灵球 Plus +Pokémon HOME \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_de.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_de.txt new file mode 100644 index 00000000000..6d82d023f0c --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_de.txt @@ -0,0 +1,5 @@ + +Ferne Person +Hortleiterinnen +Schatzsucher +Dame der Heißen Quellen \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_en.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_en.txt new file mode 100644 index 00000000000..ebc1954ad91 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_en.txt @@ -0,0 +1,5 @@ + +a stranger +a Nursery worker +a treasure hunter +an old hot-springs visitor \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_es.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_es.txt new file mode 100644 index 00000000000..cea5aefee29 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_es.txt @@ -0,0 +1,5 @@ + +Persona lejana +Cuidados Pokémon +Buscatesoros +Anciana del Balneario \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_fr.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_fr.txt new file mode 100644 index 00000000000..5b994fdfaef --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_fr.txt @@ -0,0 +1,5 @@ + +Personne lointaine +Responsable de la Garderie +Chercheur de Trésors +Dame des Eaux Thermales \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_it.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_it.txt new file mode 100644 index 00000000000..c9a0e46e353 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_it.txt @@ -0,0 +1,5 @@ + +Persona lontana +Ostello Pokémon +Cercatesori +Vecchina delle terme \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ja.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ja.txt new file mode 100644 index 00000000000..9e89927dec0 --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ja.txt @@ -0,0 +1,5 @@ + +とおくにいるひと +あずかりやさん +トレジャーハンター +おんせんばあさん \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ko.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ko.txt new file mode 100644 index 00000000000..38cc06a9b4c --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ko.txt @@ -0,0 +1,5 @@ + +멀리 있는 사람 +맡기미집 +트레져헌터 +온천 할머니 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_zh.txt b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_zh.txt new file mode 100644 index 00000000000..7e76786093f --- /dev/null +++ b/PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_zh.txt @@ -0,0 +1,5 @@ + +远处的人 +寄放屋 +寻宝猎人 +温泉婆婆 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/de/text_Forms_de.txt b/PKHeX.Core/Resources/text/other/de/text_Forms_de.txt index 65508d3fd24..b5281afe00e 100644 --- a/PKHeX.Core/Resources/text/other/de/text_Forms_de.txt +++ b/PKHeX.Core/Resources/text/other/de/text_Forms_de.txt @@ -1091,4 +1091,8 @@ Schimmelreiter Rappenreiter Tiefkühlkopf Pappsattmuster -Heldenhafter \ No newline at end of file +Heldenhafter +Hisui +Königs +Königinnen +Legende \ No newline at end of file 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 8a586234162..9219793019d 100644 --- a/PKHeX.Core/Resources/text/other/de/text_Games_de.txt +++ b/PKHeX.Core/Resources/text/other/de/text_Games_de.txt @@ -45,6 +45,6 @@ Let's Go, Evoli! Schwert Schild - +Legenden: Arceus Strahlender Diamant Leuchtende Perle \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/de/text_Moves_de.txt b/PKHeX.Core/Resources/text/other/de/text_Moves_de.txt index 07fda357aa6..b4d35286c9c 100644 --- a/PKHeX.Core/Resources/text/other/de/text_Moves_de.txt +++ b/PKHeX.Core/Resources/text/other/de/text_Moves_de.txt @@ -824,4 +824,28 @@ Brennender Zorn Donnernder Tritt Blizzardlanze Astralfragmente -Schauderspruch \ No newline at end of file +Schauderspruch +Unheilsklauen +Barrierenstoß +Kraftwechsel +Felsaxt +Frühlingsorkan +Mythenkraft +Flammenwut +Wellentackle +Chlorostrahl +Frostfallwind +Siegestanz +Schmetterramme +Giftstachelregen +Auraschwingen +Niedertracht +Refugium +Drillingspfeile +Phantomparade +Klingenschwall +Polarorkan +Donnerorkan +Wüstenorkan +Lunargebet +Mutschub \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/de/text_Species_de.txt b/PKHeX.Core/Resources/text/other/de/text_Species_de.txt index 980c25de418..25728b1ee68 100644 --- a/PKHeX.Core/Resources/text/other/de/text_Species_de.txt +++ b/PKHeX.Core/Resources/text/other/de/text_Species_de.txt @@ -896,4 +896,11 @@ Regieleki Regidrago Polaross Phantoross -Coronospa \ No newline at end of file +Coronospa +Damythir +Axantor +Ursaluna +Salmagnis +Snieboss +Myriador +Cupidos \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/en/text_Forms_en.txt b/PKHeX.Core/Resources/text/other/en/text_Forms_en.txt index 704702fcaa3..a829f1df5fe 100644 Binary files a/PKHeX.Core/Resources/text/other/en/text_Forms_en.txt and b/PKHeX.Core/Resources/text/other/en/text_Forms_en.txt differ diff --git a/PKHeX.Core/Resources/text/other/en/text_Games_en.txt b/PKHeX.Core/Resources/text/other/en/text_Games_en.txt index a5fc3a7eb4c..481318d116c 100644 --- a/PKHeX.Core/Resources/text/other/en/text_Games_en.txt +++ b/PKHeX.Core/Resources/text/other/en/text_Games_en.txt @@ -45,6 +45,6 @@ Let's Go, Eevee! Sword Shield - +Legends: Arceus Brilliant Diamond Shining Pearl \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/en/text_Moves_en.txt b/PKHeX.Core/Resources/text/other/en/text_Moves_en.txt index afe46e3d63c..d0592adcafd 100644 --- a/PKHeX.Core/Resources/text/other/en/text_Moves_en.txt +++ b/PKHeX.Core/Resources/text/other/en/text_Moves_en.txt @@ -824,4 +824,28 @@ Fiery Wrath Thunderous Kick Glacial Lance Astral Barrage -Eerie Spell \ No newline at end of file +Eerie Spell +Dire Claw +Psyshield Bash +Power Shift +Stone Axe +Springtide Storm +Mystical Power +Raging Fury +Wave Crash +Chloroblast +Mountain Gale +Victory Dance +Headlong Rush +Barb Barrage +Esper Wing +Bitter Malice +Shelter +Triple Arrows +Infernal Parade +Ceaseless Edge +Bleakwind Storm +Wildbolt Storm +Sandsear Storm +Lunar Blessing +Take Heart \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/en/text_Species_en.txt b/PKHeX.Core/Resources/text/other/en/text_Species_en.txt index 30dd05a69ed..d875dc01626 100644 --- a/PKHeX.Core/Resources/text/other/en/text_Species_en.txt +++ b/PKHeX.Core/Resources/text/other/en/text_Species_en.txt @@ -896,4 +896,11 @@ Regieleki Regidrago Glastrier Spectrier -Calyrex \ No newline at end of file +Calyrex +Wyrdeer +Kleavor +Ursaluna +Basculegion +Sneasler +Overqwil +Enamorus \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/es/text_Forms_es.txt b/PKHeX.Core/Resources/text/other/es/text_Forms_es.txt index 45d0b54b59c..2d67024a895 100644 Binary files a/PKHeX.Core/Resources/text/other/es/text_Forms_es.txt and b/PKHeX.Core/Resources/text/other/es/text_Forms_es.txt differ diff --git a/PKHeX.Core/Resources/text/other/es/text_Games_es.txt b/PKHeX.Core/Resources/text/other/es/text_Games_es.txt index d2c6263a40c..c591fac5f26 100644 --- a/PKHeX.Core/Resources/text/other/es/text_Games_es.txt +++ b/PKHeX.Core/Resources/text/other/es/text_Games_es.txt @@ -45,6 +45,6 @@ Let's Go, Eevee! Espada Escudo - +Leyendas: Arceus Diamante Brillante Perla Reluciente \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/es/text_Moves_es.txt b/PKHeX.Core/Resources/text/other/es/text_Moves_es.txt index 4529369f9b3..7d0d2a253bd 100644 --- a/PKHeX.Core/Resources/text/other/es/text_Moves_es.txt +++ b/PKHeX.Core/Resources/text/other/es/text_Moves_es.txt @@ -824,4 +824,28 @@ Furia Candente Patada Relámpago Lanza Glacial Orbes Espectro -Conjuro Funesto \ No newline at end of file +Conjuro Funesto +Garra Nociva +Asalto Barrera +Cambiapoder +Hachazo Pétreo +Ciclón Primavera +Poder Místico +Erupción de Ira +Envite Acuático +Clorofiláser +Viento Carámbano +Danza Triunfal +Arremetida +Mil Púas Tóxicas +Ala Aural +Rencor Reprimido +Retracción +Triple Flecha +Marcha Espectral +Tajo Metralla +Vendaval Gélido +Electormenta +Simún de Arena +Plegaria Lunar +Bálsamo Osado \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/es/text_Species_es.txt b/PKHeX.Core/Resources/text/other/es/text_Species_es.txt index 337dc2f7c7b..a61ce0bd80a 100644 --- a/PKHeX.Core/Resources/text/other/es/text_Species_es.txt +++ b/PKHeX.Core/Resources/text/other/es/text_Species_es.txt @@ -896,4 +896,11 @@ Regieleki Regidrago Glastrier Spectrier -Calyrex \ No newline at end of file +Calyrex +Wyrdeer +Kleavor +Ursaluna +Basculegion +Sneasler +Overqwil +Enamorus \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/fr/text_Forms_fr.txt b/PKHeX.Core/Resources/text/other/fr/text_Forms_fr.txt index 019d6b26734..c920169a019 100644 Binary files a/PKHeX.Core/Resources/text/other/fr/text_Forms_fr.txt and b/PKHeX.Core/Resources/text/other/fr/text_Forms_fr.txt differ diff --git a/PKHeX.Core/Resources/text/other/fr/text_Games_fr.txt b/PKHeX.Core/Resources/text/other/fr/text_Games_fr.txt index a019719ef61..2295810fe8b 100644 --- a/PKHeX.Core/Resources/text/other/fr/text_Games_fr.txt +++ b/PKHeX.Core/Resources/text/other/fr/text_Games_fr.txt @@ -45,6 +45,6 @@ Let's Go, Évoli Épée Bouclier - +Légendes: Arceus Diamant Étincelant Perle Scintillante \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/fr/text_Moves_fr.txt b/PKHeX.Core/Resources/text/other/fr/text_Moves_fr.txt index f4e3c6dac72..1cb4c80da2b 100644 --- a/PKHeX.Core/Resources/text/other/fr/text_Moves_fr.txt +++ b/PKHeX.Core/Resources/text/other/fr/text_Moves_fr.txt @@ -824,4 +824,28 @@ Fureur Ardente Coup Fulgurant Lance de Glace Éclat Spectral -Sort Sinistre \ No newline at end of file +Sort Sinistre +Griffes Funestes +Sprint Bouclier +Échange Force +Hache de Pierre +Typhon Passionné +Force Mystique +Grand Courroux +Aquatacle +Herblast +Bise Glaciaire +Danse Victoire +Assaut Frontal +Multitoxik +Ailes Psycho +Cœur de Rancœur +Mur Fumigène +Triple Flèche +Cortège Funèbre +Vagues à Lames +Typhon Hivernal +Typhon Fulgurant +Typhon Pyrosable +Prière Lunaire +Extravaillance \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/fr/text_Species_fr.txt b/PKHeX.Core/Resources/text/other/fr/text_Species_fr.txt index 83fce233e00..37ecfc2b57e 100644 --- a/PKHeX.Core/Resources/text/other/fr/text_Species_fr.txt +++ b/PKHeX.Core/Resources/text/other/fr/text_Species_fr.txt @@ -896,4 +896,11 @@ Regieleki Regidrago Blizzeval Spectreval -Sylveroy \ No newline at end of file +Sylveroy +Cerbyllin +Hachécateur +Ursaking +Paragruel +Farfurex +Qwilpik +Amovénus \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/it/text_Forms_it.txt b/PKHeX.Core/Resources/text/other/it/text_Forms_it.txt index 478493f54df..873de549493 100644 Binary files a/PKHeX.Core/Resources/text/other/it/text_Forms_it.txt and b/PKHeX.Core/Resources/text/other/it/text_Forms_it.txt differ 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 38af96540d9..a647efa9995 100644 --- a/PKHeX.Core/Resources/text/other/it/text_Games_it.txt +++ b/PKHeX.Core/Resources/text/other/it/text_Games_it.txt @@ -45,6 +45,6 @@ Let's Go, Eevee! Spada Scudo - +Leggende: Arceus Diamante Lucente Perla Splendente \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/it/text_Moves_it.txt b/PKHeX.Core/Resources/text/other/it/text_Moves_it.txt index 6bbdf2c6260..a5a70f5a8d0 100644 --- a/PKHeX.Core/Resources/text/other/it/text_Moves_it.txt +++ b/PKHeX.Core/Resources/text/other/it/text_Moves_it.txt @@ -824,4 +824,28 @@ Furia Ardente Calcio Tonante Lancia Glaciale Schegge Astrali -Inquietantesimo \ No newline at end of file +Inquietantesimo +Artigli Fatali +Barrierassalto +Scambioforza +Rocciascure +Tempesta Zefirea +Forza Mistica +Ira Furente +Ondaschianto +Clorofillaser +Soffio d’Iceberg +Danzavittoria +Scontro Frontale +Mille Fielespine +Ali d’Aura +Livore +Barricata +Triplodardo +Corteo Spettrale +Lama Milleflutti +Tempesta Boreale +Tempesta Tonante +Tempesta Ardente +Invocaluna +Baldimpulso \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/it/text_Species_it.txt b/PKHeX.Core/Resources/text/other/it/text_Species_it.txt index cc6ba718682..0d09b2453f3 100644 --- a/PKHeX.Core/Resources/text/other/it/text_Species_it.txt +++ b/PKHeX.Core/Resources/text/other/it/text_Species_it.txt @@ -896,4 +896,11 @@ Regieleki Regidrago Glastrier Spectrier -Calyrex \ No newline at end of file +Calyrex +Wyrdeer +Kleavor +Ursaluna +Basculegion +Sneasler +Overqwil +Enamorus \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/ja/text_Forms_ja.txt b/PKHeX.Core/Resources/text/other/ja/text_Forms_ja.txt index fd287cfe65b..06d58279da2 100644 --- a/PKHeX.Core/Resources/text/other/ja/text_Forms_ja.txt +++ b/PKHeX.Core/Resources/text/other/ja/text_Forms_ja.txt @@ -1091,4 +1091,8 @@ こくばじょうのすがた アイスフェイス まんぷくもよう -ゆうしゃ \ No newline at end of file +ゆうしゃ +ヒスイのすがた +キングのすがた +クイーンのすがた +レジェンド \ No newline at end of file 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 61b20dedd9a..722a2b152cf 100644 --- a/PKHeX.Core/Resources/text/other/ja/text_Games_ja.txt +++ b/PKHeX.Core/Resources/text/other/ja/text_Games_ja.txt @@ -45,6 +45,6 @@ Let's Go! イーブイ ソード シールド - +LEGENDS アルセウス ブリリアントダイヤモンド シャイニングパール \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/ja/text_Moves_ja.txt b/PKHeX.Core/Resources/text/other/ja/text_Moves_ja.txt index d4b75c63215..f1fb569fa77 100644 --- a/PKHeX.Core/Resources/text/other/ja/text_Moves_ja.txt +++ b/PKHeX.Core/Resources/text/other/ja/text_Moves_ja.txt @@ -824,4 +824,28 @@ らいめいげり ブリザードランス アストラルビット -ぶきみなじゅもん \ No newline at end of file +ぶきみなじゅもん +フェイタルクロー +バリアーラッシュ +パワーシフト +がんせきアックス +はるのあらし +しんぴのちから +だいふんげき +ウェーブタックル +クロロブラスト +ひょうざんおろし +しょうりのまい +ぶちかまし +どくばりセンボン +オーラウイング +うらみつらみ +たてこもる +3ぼんのや +ひゃっきやこう +ひけん・ちえなみ +こがらしあらし +かみなりあらし +ねっさのあらし +みかづきのいのり +ブレイブチャージ \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/ja/text_Species_ja.txt b/PKHeX.Core/Resources/text/other/ja/text_Species_ja.txt index e94095bce22..4ba1f1714f2 100644 --- a/PKHeX.Core/Resources/text/other/ja/text_Species_ja.txt +++ b/PKHeX.Core/Resources/text/other/ja/text_Species_ja.txt @@ -896,4 +896,11 @@ レジドラゴ ブリザポス レイスポス -バドレックス \ No newline at end of file +バドレックス +アヤシシ +バサギリ +ガチグマ +イダイトウ +オオニューラ +ハリーマン +ラブトロス \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/ko/text_Forms_ko.txt b/PKHeX.Core/Resources/text/other/ko/text_Forms_ko.txt index 6376c7ffbdf..158cc321bf6 100644 Binary files a/PKHeX.Core/Resources/text/other/ko/text_Forms_ko.txt and b/PKHeX.Core/Resources/text/other/ko/text_Forms_ko.txt differ 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 5cb07cef7d3..f9ee22717f5 100644 --- a/PKHeX.Core/Resources/text/other/ko/text_Games_ko.txt +++ b/PKHeX.Core/Resources/text/other/ko/text_Games_ko.txt @@ -45,6 +45,6 @@ Y 소드 실드 - +LEGENDS 아르세우스 브릴리언트 다이아몬드 샤이닝 펄 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/ko/text_Moves_ko.txt b/PKHeX.Core/Resources/text/other/ko/text_Moves_ko.txt index c69dd9972ad..2067731cab1 100644 --- a/PKHeX.Core/Resources/text/other/ko/text_Moves_ko.txt +++ b/PKHeX.Core/Resources/text/other/ko/text_Moves_ko.txt @@ -824,4 +824,28 @@ G의힘 천둥차기 블리자드랜스 아스트랄비트 -섬뜩한주문 \ No newline at end of file +섬뜩한주문 +페이탈클로 +배리어러시 +파워시프트 +암석액스 +봄의폭풍 +신비의힘 +대격분 +웨이브태클 +클로로블라스트 +빙산바람 +승리의춤 +들이받기 +독침천발 +오라윙 +천추지한 +농성 +3연화살 +백귀야행 +비검천중파 +찬바람폭풍 +번개폭풍 +열사의폭풍 +초승달의기도 +브레이브차지 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/ko/text_Species_ko.txt b/PKHeX.Core/Resources/text/other/ko/text_Species_ko.txt index ee1eaa8445f..4c640609384 100644 --- a/PKHeX.Core/Resources/text/other/ko/text_Species_ko.txt +++ b/PKHeX.Core/Resources/text/other/ko/text_Species_ko.txt @@ -896,4 +896,11 @@ 레지드래고 블리자포스 레이스포스 -버드렉스 \ No newline at end of file +버드렉스 +신비록 +사마자르 +다투곰 +대쓰여너 +포푸니크 +장침바루 +러브로스 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/zh/text_Forms_zh.txt b/PKHeX.Core/Resources/text/other/zh/text_Forms_zh.txt index cf3b4571df1..119b79ae05f 100644 --- a/PKHeX.Core/Resources/text/other/zh/text_Forms_zh.txt +++ b/PKHeX.Core/Resources/text/other/zh/text_Forms_zh.txt @@ -1091,4 +1091,8 @@ World 骑黑马的样子 結凍頭 滿腹花紋 -勇者 \ No newline at end of file +勇者 +洗翠的样子 +王的样子 +女王的样子 +传说 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/zh/text_Games_zh.txt b/PKHeX.Core/Resources/text/other/zh/text_Games_zh.txt index 9f6ae5ead55..8d7d15f6670 100644 --- a/PKHeX.Core/Resources/text/other/zh/text_Games_zh.txt +++ b/PKHeX.Core/Resources/text/other/zh/text_Games_zh.txt @@ -45,6 +45,6 @@ Let's Go!伊布 剑 盾 - +夢傳說 阿爾宙斯 晶灿钻石 -明亮珍珠 +明亮珍珠 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/zh/text_Moves_zh.txt b/PKHeX.Core/Resources/text/other/zh/text_Moves_zh.txt index 8d286b45820..ab9804910c6 100644 --- a/PKHeX.Core/Resources/text/other/zh/text_Moves_zh.txt +++ b/PKHeX.Core/Resources/text/other/zh/text_Moves_zh.txt @@ -10,10 +10,10 @@ 雷电拳 抓 夹住 -断头钳 +极落钳 旋风刀 剑舞 -居合斩 +居合劈 起风 翅膀攻击 吹飞 @@ -64,7 +64,7 @@ 破坏光线 啄 啄钻 -地狱翻滚 +深渊翻滚 踢倒 双倍奉还 地球上投 @@ -118,7 +118,7 @@ 忍耐 挥指 鹦鹉学舌 -自爆 +玉石俱碎 炸蛋 舌舔 浊雾 @@ -139,7 +139,7 @@ 食梦 毒瓦斯 投球 -吸血 +汲取 恶魔之吻 神鸟猛击 变身 @@ -156,7 +156,7 @@ 骨头回力镖 睡觉 岩崩 -必杀门牙 +终结门牙 棱角化 纹理 三重攻击 @@ -172,17 +172,17 @@ 恶梦 火焰轮 打鼾 -诅咒 +咒术 抓狂 纹理2 气旋攻击 棉孢子 -起死回生 +绝处逢生 怨恨 细雪 守住 音速拳 -鬼面 +可怕面孔 出奇一击 天使之吻 腹鼓 @@ -193,7 +193,7 @@ 电磁炮 识破 同命 -灭亡之歌 +终焉之歌 冰冻之风 看穿 骨棒乱打 @@ -259,7 +259,7 @@ 冰雹 无理取闹 吹捧 -鬼火 +磷火 临别礼物 硬撑 真气拳 @@ -287,7 +287,7 @@ 封印 焕然一新 怨念 -抢夺 +化为己用 秘密之力 潜水 猛推 @@ -326,7 +326,7 @@ 暗影拳 神通力 冲天拳 -流沙地狱 +流沙深渊 绝对零度 浊流 种子机关枪 @@ -401,7 +401,7 @@ 暗袭要害 水流尾 种子炸弹 -空气斩 +空气之刃 十字剪 虫鸣 龙之波动 @@ -490,7 +490,7 @@ 盘蜷 下盘踢 酸液炸弹 -欺诈 +移花接木 单纯光束 找伙伴 您先请 @@ -508,14 +508,14 @@ 自由落体 换档 巴投 -烧尽 +烧净 延后 杂技 镜面属性 报仇 搏命 传递礼物 -炼狱 +烈火深渊 水之誓约 火之誓约 草之誓约 @@ -569,7 +569,7 @@ 战吼 等离子浴 抛物面充电 -森林诅咒 +森林咒术 落英缤纷 冷冻干燥 魅惑之声 @@ -609,9 +609,9 @@ 圆瞳 蹭蹭脸颊 手下留情 -死缠烂打 +纠缠不休 增强拳 -死亡之翼 +归天之翼 千箭齐发 千波激荡 大地神力 @@ -673,7 +673,7 @@ 毒丝 磨砺 辅助齿轮 -地狱突刺 +深渊突刺 花粉团 掷锚 精神场地 @@ -736,7 +736,7 @@ 熊熊火爆 哗哗气场 坏坏领域 -茁茁轰炸 +茁茁炸弹 冰冰霜冻 亮亮风暴 砰砰击破 @@ -824,4 +824,28 @@ 雷鸣蹴击 雪矛 星碎 -诡异咒语 \ No newline at end of file +诡异咒语 +克命爪 +屏障猛攻 +力量转换 +岩斧 +阳春风暴 +神秘之力 +大愤慨 +波动冲 +叶绿爆震 +冰山风 +胜利之舞 +突飞猛扑 +毒千针 +气场之翼 +冤冤相报 +闭关 +三连箭 +群魔乱舞 +秘剑・千重涛 +枯叶风暴 +鸣雷风暴 +热沙风暴 +新月祈祷 +勇气填充 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/zh/text_Species_zh.txt b/PKHeX.Core/Resources/text/other/zh/text_Species_zh.txt index a47225c7820..73c67fdc449 100644 --- a/PKHeX.Core/Resources/text/other/zh/text_Species_zh.txt +++ b/PKHeX.Core/Resources/text/other/zh/text_Species_zh.txt @@ -896,4 +896,11 @@ 雷吉铎拉戈 雪暴马 灵幽马 -蕾冠王 \ No newline at end of file +蕾冠王 +诡角鹿 +劈斧螳螂 +月月熊 +幽尾玄鱼 +大狃拉 +万针鱼 +眷恋云 \ No newline at end of file diff --git a/PKHeX.Core/Resources/text/other/zh/text_Species_zh2.txt b/PKHeX.Core/Resources/text/other/zh/text_Species_zh2.txt index 92b8f9bda26..f2b4553ef94 100644 --- a/PKHeX.Core/Resources/text/other/zh/text_Species_zh2.txt +++ b/PKHeX.Core/Resources/text/other/zh/text_Species_zh2.txt @@ -896,4 +896,11 @@ 雷吉鐸拉戈 雪暴馬 靈幽馬 -蕾冠王 \ No newline at end of file +蕾冠王 +詭角鹿 +劈斧螳螂 +月月熊 +幽尾玄魚 +大狃拉 +萬針魚 +眷戀雲 \ No newline at end of file diff --git a/PKHeX.Core/Ribbons/IRibbonSetAffixed.cs b/PKHeX.Core/Ribbons/IRibbonSetAffixed.cs index e39a8be757a..bca30b5911d 100644 --- a/PKHeX.Core/Ribbons/IRibbonSetAffixed.cs +++ b/PKHeX.Core/Ribbons/IRibbonSetAffixed.cs @@ -1,7 +1,12 @@ -namespace PKHeX.Core +namespace PKHeX.Core; + +/// +/// Specifies that a single ribbon index is prominently selected. +/// +/// +/// values. +/// +public interface IRibbonSetAffixed { - public interface IRibbonSetAffixed - { - sbyte AffixedRibbon { get; set; } - } + sbyte AffixedRibbon { get; set; } } diff --git a/PKHeX.Core/Ribbons/ISociability.cs b/PKHeX.Core/Ribbons/ISociability.cs new file mode 100644 index 00000000000..059206b8866 --- /dev/null +++ b/PKHeX.Core/Ribbons/ISociability.cs @@ -0,0 +1,9 @@ +namespace PKHeX.Core; + +/// +/// Indicates how sociable the entity is. +/// +public interface ISociability +{ + uint Sociability { get; set; } +} diff --git a/PKHeX.Core/Saves/Access/ISCBlockArray.cs b/PKHeX.Core/Saves/Access/ISCBlockArray.cs new file mode 100644 index 00000000000..65d4f7b7f94 --- /dev/null +++ b/PKHeX.Core/Saves/Access/ISCBlockArray.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace PKHeX.Core; + +/// +/// Exposes useful access information useful for more advanced data requests. +/// +public interface ISCBlockArray +{ + /// + /// Gets the list of all data blocks the implementing object has. + /// + public IReadOnlyList AllBlocks { get; } + + /// + /// Gets the for the implementing object, allowing for looking up specific blocks by key. + /// + SCBlockAccessor Accessor { get; } +} diff --git a/PKHeX.Core/Saves/Access/ISaveBlock8LA.cs b/PKHeX.Core/Saves/Access/ISaveBlock8LA.cs new file mode 100644 index 00000000000..a827a1c0796 --- /dev/null +++ b/PKHeX.Core/Saves/Access/ISaveBlock8LA.cs @@ -0,0 +1,17 @@ +namespace PKHeX.Core; + +/// +/// Interface for Accessing named blocks within a Generation 8 save file. +/// +public interface ISaveBlock8LA +{ + Box8 BoxInfo { get; } + Party8a PartyInfo { get; } + MyStatus8a MyStatus { get; } + PokedexSave8a PokedexSave { get; } + BoxLayout8a BoxLayout { get; } + MyItem8a Items { get; } + AdventureStart8a AdventureStart { get; } + LastSaved8a LastSaved { get; } + PlayTime8a Played { get; } +} diff --git a/PKHeX.Core/Saves/Access/SaveBlockAccessor8LA.cs b/PKHeX.Core/Saves/Access/SaveBlockAccessor8LA.cs new file mode 100644 index 00000000000..b2aaa1e0895 --- /dev/null +++ b/PKHeX.Core/Saves/Access/SaveBlockAccessor8LA.cs @@ -0,0 +1,175 @@ +using System.Collections.Generic; + +namespace PKHeX.Core; + +// ReSharper disable UnusedMember.Local +#pragma warning disable IDE0051 // Remove unused private members +#pragma warning disable RCS1213 // Remove unused member declaration. +public sealed class SaveBlockAccessor8LA : SCBlockAccessor, ISaveBlock8LA +{ + public override IReadOnlyList BlockInfo { get; } + public Party8a PartyInfo { get; } + public Box8 BoxInfo { get; } + public MyStatus8a MyStatus { get; } + public PokedexSave8a PokedexSave { get; } + public BoxLayout8a BoxLayout { get; } + public MyItem8a Items { get; } + public AdventureStart8a AdventureStart { get; } + public Coordinates8a Coordinates { get; } + public LastSaved8a LastSaved { get; } + public PlayerFashion8a FashionPlayer { get; } + public PlayTime8a Played { get; } + + public SaveBlockAccessor8LA(SAV8LA sav) + { + BlockInfo = sav.AllBlocks; + BoxInfo = new Box8(sav, GetBlock(KBox)); + PokedexSave = new PokedexSave8a(sav, GetBlock(KZukan)); + BoxLayout = new BoxLayout8a(sav, GetBlock(KBoxLayout)); + PartyInfo = new Party8a(sav, GetBlock(KParty)); + MyStatus = new MyStatus8a(sav, GetBlock(KMyStatus)); + Items = new MyItem8a(sav, GetBlock(KItemRegular)); + AdventureStart = new AdventureStart8a(sav, GetBlock(KAdventureStart)); + LastSaved = new LastSaved8a(sav, GetBlock(KLastSaved)); + Played = new PlayTime8a(sav, GetBlock(KPlayTime)); + Coordinates = new Coordinates8a(sav, GetBlock(KCoordinates)); + FashionPlayer = new PlayerFashion8a(sav, GetBlock(KFashionPlayer)); + // Misc = new Misc8(sav, GetBlock(KMisc)); + // TrainerCard = new TrainerCard8(sav, GetBlock(KTrainerCard)); + // Fashion = new FashionUnlock8(sav, GetBlock(KFashionUnlock)); + } + + // Arrays (Blocks) + private const uint KBoxLayout = 0x19722c89; // Box Names + public const uint KBoxWallpapersUnused = 0x2EB1B190; // Box Wallpapers + public const uint KItemFavorite = 0x00EF4BAE; // Favorite Item ID bitflags + + // Objects (Blocks) + private const uint KBox = 0x47E1CEAB; // Box Data + public const uint KItemRegular = 0x9FE2790A; + public const uint KItemKey = 0x59A4D0C3; + public const uint KItemStored = 0x8E434F0D; + public const uint KItemRecipe = 0xF5D9F4A5; + private const uint KMysteryGift = 0x99E1625E; + private const uint KZukan = 0x02168706; + private const uint KAdventureStart = 0xAEE903A2; // Save File Started + private const uint KParty = 0x2985fe5d; // Party Data + private const uint KPlayTime = 0xC4FA7C8C; // Time Played + private const uint KMyStatus = 0xf25c070e; // Trainer Details + private const uint KLastSaved = 0x1B1E3D8B; // Last Saved + private const uint KCoordinates = 0x267DD9DA; // Coordinates + private const uint KFashionPlayer = 0x6B35BADB; // Player's Current Fashion + private const uint KFashionUnlock = 0x3ADB8A98; // Unlocked Fashion Data + private const uint KSwarm = 0x1E0F1BA3; // 5 entries, 0x50 each + private const uint KCaptureRecords = 0x6506EE96; // 1000 entries, 0x1C each + private const uint KOverworld = 0x511622B3; // 0x100 entries, 0x880 each + + // Values + public const uint KCurrentBox = 0x017C3CBB; // U8 Box Index + public const uint KBoxesUnlocked = 0x71825204; // U8 + + private const uint KVolumeBGM = 0xF8154AC9; // U32 Background Music volume control (0-10) + private const uint KVolumeSFX = 0x62F05895; // U32 Sound Effects volume control (0-10) + private const uint KVolumeCry = 0x1D482A63; // U32 Pokémon Cries volume control (0-10) + + private const uint KOptionTextSpeed = 0x92EB0306; // U32 text speed (0 = Slow, 1 = Normal, 2 = Fast, 3 = Instant) + private const uint KOptionCameraVertical = 0x2846B7DB; // U32 vertical camera controls (0 = Normal, 1 = Inverted) + private const uint KOptionCameraHorizontal = 0x7D249649; // U32 horizontal camera controls (0 = Normal, 1 = Inverted) + private const uint KOptionCameraSensitivity = 0x22DEF108; // U32 camera sensitivity (0-4) + private const uint KOptionMotionSensitivity = 0x82AD5F84; // U32 motion sensitivity (0-3) + private const uint KOptionAutosave = 0xB027F396; // U32 Autosave (0 = Enabled, 1 = Disabled) + private const uint KOptionToggleHUD = 0xF62D79D3; // U32 HUD Toggling (0 = Enabled, 1 = Disabled) + private const uint KOptionZRButtonConfirmation = 0x4D7EADDD; // U32 ZR Button confirmation (0 = Enabled, 1 = Disabled) + private const uint KOptionDynamicRange = 0xA4317061; // U32 Dynamic Range (0 = Wide, 1 = Narrow) + + public const uint KGameLanguage = 0x0BFDEBA1; // U32 Game Language + public const uint KMoney = 0x3279D927; // U32 Money + public const uint KMeritCurrent = 0x9D5D1CA5; // U32 Current Merit Points + public const uint KMeritEarnedTotal = 0xC25B0D5A; // U32 Merit Points Earned + public const uint KSatchelUpgrades = 0x75CE2CF6; // U32 Satchel Upgrades (0-39) + public const uint KExpeditionTeamRank = 0x50FE632A; // U32 Galaxy Expedition Team Rank (0-10) + private const uint KTotalUnownCaptured = 0x3EBEE1A7; // U32 Unown Captured (0-28) + private const uint KStealthSpray = 0x385F9860; // U32 time remaining on active Stealth Spray (0-60000 in milliseconds) + + private const uint KRepelUnused = 0x9ec079da; // U16 Repel Steps remaining + + private const uint KWispsFoundArea00 = 0x8B18ADE5; // U32 Wisps obtained in Jubilife Village (0-7) + private const uint KWispsFoundArea01 = 0x8B18AC32; // U32 Wisps obtained in Obsidian Fieldlands (0-20) + private const uint KWispsFoundArea02 = 0x8B18AA7F; // U32 Wisps obtained in Crimson Mirelands (0-20) + private const uint KWispsFoundArea03 = 0x8B18A8CC; // U32 Wisps obtained in Cobalt Coastlands (0-20) + private const uint KWispsFoundArea04 = 0x8B18A719; // U32 Wisps obtained in Coronet Highlands (0-20) + private const uint KWispsFoundArea05 = 0x8B18A566; // U32 Wisps obtained in Alabaster Icelands (0-20) + private const uint KWispsFoundTotal = 0xB79EF1FE; // U32 total Wisps obtained (0-107) + private const uint KWispsReported = 0x8F0D8720; // U32 Wisps reported to Vessa (0-107) + + // Flags + private const uint KEnableSpawnerSpiritomb = 0x2DC7E4CC; // FSYS_MKRG_100_SPAWN + private const uint KEnableSpawnerUxie = 0x9EC1F2C4; // FEVE_YUKUSII_ENCOUNT_ENABLE + private const uint KEnableSpawnerMesprit = 0xEF5C95D8; // FEVE_EMURITTO_ENCOUNT_ENABLE + private const uint KEnableSpawnerAzelf = 0xD038BD89; // FEVE_AGUNOMU_ENCOUNT_ENABLE + private const uint KEnableSpawnerHeatran = 0x3F6301AC; // FEVE_HIIDORAN__ENCOUNT_ENABLE + private const uint KEnableSpawnerCresselia = 0x85134D02; // FEVE_KURESERIA_ENCOUNT_ENABLE + private const uint KEnableSpawnerDarkrai = 0xEE027506; // FSYS_SPAWN_START_DARKRAI + private const uint KEnableSpawnerShaymin = 0x0DCE6659; // FSYS_SPAWN_START_SHAYMIN + private const uint KEnableSpawnerTornadus = 0x07D8EC38; // FSYS_SPAWN_START_TORNELOS + private const uint KEnableSpawnerThundurus = 0x136D3D88; // FSYS_SPAWN_START_VOLTOLOS + private const uint KEnableSpawnerLandorus = 0xE079071B; // FSYS_SPAWN_START_LANDLOS + private const uint KEnableSpawnerEnamorus = 0x3AA64045; // FSYS_SPAWN_START_FAIRTOLOS + + private const uint KDisableSpawnerSpiritomb = 0x0AB16F69; // FSYS_MKRG_VALID_SPAWN + private const uint KDisableSpawnerGiratina = 0x40B908EC; // FMAP_CANNOT_RESPAWN_GIRATINA + private const uint KDisableSpawnerPhione01 = 0x3C4DB3BE; // FMAP_CANNOT_RESPAWN_PHIONE + private const uint KDisableSpawnerPhione02 = 0xF6B469D3; // FMAP_CANNOT_RESPAWN_PHIONE_2 + private const uint KDisableSpawnerPhione03 = 0xF6B46820; // FMAP_CANNOT_RESPAWN_PHIONE_3 + private const uint KDisableSpawnerManaphy = 0xBBE677C7; // FMAP_CANNOT_RESPAWN_MANAPHY + private const uint KDisableSpawnerDarkrai = 0x8AE49E85; // FMAP_CANNOT_RESPAWN_DARKRAI + private const uint KDisableSpawnerShaymin = 0xF873BBFA; // FMAP_CANNOT_RESPAWN_SHAYMIN + private const uint KDisableSpawnerTornadus = 0xC8AA3D69; // FMAP_CANNOT_RESPAWN_TORNELOS + private const uint KDisableSpawnerThundurus = 0x79E259CD; // FMAP_CANNOT_RESPAWN_VOLTOLOS + private const uint KDisableSpawnerLandorus = 0xD613F320; // FMAP_CANNOT_RESPAWN_LANDLOS + private const uint KDisableSpawnerEnamorus = 0xE50F4B4E; // FMAP_CANNOT_RESPAWN_FAIRTOLOS + + private const uint KReceivedAlolanVulpix = 0xAC90C782; // FEVE_POKE_SUB092_GET + + private const uint KCanRideWyrdeer = 0x47365FE8; // FSYS_RIDE_OPEN_01 + //private const uint KCanRideUnused02 = 0x47366501; // FSYS_RIDE_OPEN_02 + private const uint KCanRideUrsaluna = 0x4736634E; // FSYS_RIDE_OPEN_03 + //private const uint KCanRideUnused04 = 0x47366867; // FSYS_RIDE_OPEN_04 + private const uint KCanRideBasculegion = 0x473666B4; // FSYS_RIDE_OPEN_05 + //private const uint KCanRideUnused06 = 0x47366BCD; // FSYS_RIDE_OPEN_06 + private const uint KCanRideSneasler = 0x47366A1A; // FSYS_RIDE_OPEN_07 + //private const uint KCanRideUnused08 = 0x47365403; // FSYS_RIDE_OPEN_08 + //private const uint KCanRideUnused09 = 0x47365250; // FSYS_RIDE_OPEN_09 + private const uint KCanRideBraviary = 0x47334812; // FSYS_RIDE_OPEN_10 + + private const uint KDefeatedLordKleavor = 0x96774421; // FSYS_NS_01_CLEARED + private const uint KDefeatedLadyLilligant = 0x3A50000C; // FSYS_NS_02_CLEARED + private const uint KDefeatedLordArcanine = 0xA5981A37; // FSYS_NS_03_CLEARED + private const uint KDefeatedLordElectrode = 0x6EF3C712; // FSYS_NS_04_CLEARED + private const uint KDefeatedLordAvalugg = 0x424E9F0D; // FSYS_NS_05_CLEARED + private const uint KDefeatedOriginDialga = 0x5185ADC0; // FSYS_NS_D_CLEARED + private const uint KDefeatedOriginPalkia = 0x5E5BFD94; // FSYS_NS_P_CLEARED + private const uint KDefeatedArceus = 0x2F91EFD3; // FSYS_SCENARIO_CLEARED_URA + private const uint KCompletedPokedex = 0xD985E1C2; // FEVE_EV110100_END (Enables using Azure Flute to reach Arceus) + private const uint KPerfectedPokedex = 0x98ED661E; // FSYS_POKEDEX_COMPLETE_WITHOUT_EXCEPTION + private const uint KUnlockedUnownNotes = 0xC9127B4E; // FSYS_UNNN_ENABLE_PLACEMENT + private const uint KUnlockedLostAndFound = 0xFE837926; // FSYS_LOSTBAG_SEARCH_REQUEST_ENABLE + private const uint KUnlockedMassRelease = 0x0C16BEF4; // FSYS_APP_BOX_SUMFREE_ENABLE + private const uint KUnlockedDistortions = 0x7611BFC3; // FSYS_WORMHOLE_OPEN + private const uint KCanFastTravel = 0xFE98F73F; // FSYS_CAN_USE_FAST_TRAVEL + private const uint KUnlockedArea01 = 0x24C0252D; // FSYS_AREA_01_OPEN + private const uint KUnlockedArea02 = 0x1599C206; // FSYS_AREA_02_OPEN + private const uint KUnlockedArea03 = 0x408DE1D3; // FSYS_AREA_03_OPEN + private const uint KUnlockedArea04 = 0x8C062C9C; // FSYS_AREA_04_OPEN + private const uint KUnlockedArea05 = 0xC08D4C69; // FSYS_AREA_05_OPEN + private const uint KUnlockedArea06 = 0x76350E52; // FSYS_AREA_06_OPEN + private const uint KAutoConnectInternet = 0xAFA034A5; + + private const uint KHasPlayRecordsBDSP = 0x52CE2052; // FSYS_SAVEDATA_LINKAGE_DEL_01 + private const uint KHasPlayRecordsSWSH = 0x530EF0B9; // FSYS_SAVEDATA_LINKAGE_ORI_01 + private const uint KHasPlayRecordsLGPE = 0x6CFA9468; // FSYS_SAVEDATA_LINKAGE_BEL_01 + + public const uint KUnlockedSecretBox01 = 0xF224CA8E; // FSYS_SECRET_BOX_01_OPEN + public const uint KUnlockedSecretBox02 = 0x06924515; // FSYS_SECRET_BOX_02_OPEN + public const uint KUnlockedSecretBox03 = 0xF67C6DC8; // FSYS_SECRET_BOX_03_OPEN +} diff --git a/PKHeX.Core/Saves/Access/SaveBlockAccessor8SWSH.cs b/PKHeX.Core/Saves/Access/SaveBlockAccessor8SWSH.cs index a525444c458..1cf0cf9d2d5 100644 --- a/PKHeX.Core/Saves/Access/SaveBlockAccessor8SWSH.cs +++ b/PKHeX.Core/Saves/Access/SaveBlockAccessor8SWSH.cs @@ -555,5 +555,3 @@ public SaveBlockAccessor8SWSH(SAV8SWSH sav) public const uint KGSTVictoriesOpal = 0xDBE374D7; // U32 Galarian Star Tournament victories with Opal } } -#pragma warning restore IDE0051 // Remove unused private members -#pragma warning restore RCS1213 // Remove unused member declaration. diff --git a/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlock.cs b/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlock.cs index ff1ba6f69b8..5ca76eaafca 100644 --- a/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlock.cs +++ b/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlock.cs @@ -161,7 +161,7 @@ public static SCBlock ReadFromOffset(ReadOnlySpan data, ref int offset) for (int i = 0; i < arr.Length; i++) arr[i] ^= (byte)xk.Next(); #if DEBUG - Debug.Assert(sub > SCTypeCode.Array || Array.TrueForAll(arr, z => z <= 1)); + Debug.Assert(sub > SCTypeCode.Array || (sub == SCTypeCode.Bool3 && Array.TrueForAll(arr, z => z <= 2)) || Array.TrueForAll(arr, z => z <= 1)); #endif return new SCBlock(key, arr, sub); } diff --git a/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockUtil.cs b/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockUtil.cs index 5560e7371aa..b8fdf374fdd 100644 --- a/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockUtil.cs +++ b/PKHeX.Core/Saves/Encryption/SwishCrypto/SCBlockUtil.cs @@ -73,7 +73,7 @@ public static string GetBlockSummary(SCBlock b) return sb.ToString(); } - public static List ImportBlocksFromFolder(string path, SAV8SWSH sav) + public static List ImportBlocksFromFolder(string path, ISCBlockArray sav) { var failed = new List(); var files = Directory.EnumerateFiles(path); @@ -89,7 +89,7 @@ public static List ImportBlocksFromFolder(string path, SAV8SWSH sav) var hex = Util.GetHexValue(fn); try { - var block = sav.Blocks.GetBlock(hex); + var block = sav.Accessor.GetBlock(hex); var len = block.Data.Length; var fi = new FileInfo(f); if (fi.Length != len) diff --git a/PKHeX.Core/Saves/Encryption/SwishCrypto/SwishCrypto.cs b/PKHeX.Core/Saves/Encryption/SwishCrypto/SwishCrypto.cs index 6447f476eb0..cc63dfbef8d 100644 --- a/PKHeX.Core/Saves/Encryption/SwishCrypto/SwishCrypto.cs +++ b/PKHeX.Core/Saves/Encryption/SwishCrypto/SwishCrypto.cs @@ -9,7 +9,7 @@ namespace PKHeX.Core /// MemeCrypto V2 - The Next Generation /// /// - /// A variant of encryption and obfuscation used in . + /// A variant of encryption and obfuscation used in and . ///
Individual save blocks are stored in a hash map, with some object-type details prefixing the block's raw data.
///
Once the raw save file data is dumped, the binary is hashed with SHA256 using a static Intro salt and static Outro salt.
///
With the hash computed, the data is encrypted with a repeating irregular-sized static xor cipher.
@@ -89,6 +89,21 @@ public static bool GetIsHashValid(byte[] data) return span.SequenceEqual(hash); } + /// + /// Checks if the file is a rough example of a save file. + /// + /// Encrypted save data + /// True if hash matches + public static bool GetIsHashValidLA(byte[] data) + { + if (data.Length != SaveUtil.SIZE_G8LA) + return false; + + var hash = ComputeHash(data); + var span = data.AsSpan()[^hash.Length..]; + return span.SequenceEqual(hash); + } + /// /// Decrypts the save data in-place, then unpacks the blocks. /// diff --git a/PKHeX.Core/Saves/SAV8LA.cs b/PKHeX.Core/Saves/SAV8LA.cs new file mode 100644 index 00000000000..ad5f079aa86 --- /dev/null +++ b/PKHeX.Core/Saves/SAV8LA.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; + +namespace PKHeX.Core; + +/// +/// Generation 8 object for games. +/// +public sealed class SAV8LA : SaveFile, ISaveBlock8LA, ISCBlockArray +{ + protected internal override string ShortSummary => $"{OT} ({Version}) - {LastSaved.LastSavedTime}"; + public override string Extension => string.Empty; + + public SAV8LA(byte[] data) : base(data) + { + Data = Array.Empty(); + AllBlocks = SwishCrypto.Decrypt(data); + Blocks = new SaveBlockAccessor8LA(this); + Initialize(); + } + + private SAV8LA(byte[] data, IReadOnlyList blocks) : base(data) + { + Data = Array.Empty(); + AllBlocks = blocks; + Blocks = new SaveBlockAccessor8LA(this); + Initialize(); + } + + public SAV8LA() + { + AllBlocks = Meta8.GetBlankDataLA(); + Blocks = new SaveBlockAccessor8LA(this); + Initialize(); + ClearBoxes(); + } + + public override string GetString(ReadOnlySpan data) => StringConverter8.GetString(data); + public override int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, StringConverterOption option) => StringConverter8.SetString(destBuffer, value, maxLength, option); + + public override void CopyChangesFrom(SaveFile sav) + { + // Absorb changes from all blocks + var z = (SAV8LA)sav; + var mine = AllBlocks; + var newB = z.AllBlocks; + for (int i = 0; i < mine.Count; i++) + newB[i].Data.CopyTo(mine[i].Data, 0); + State.Edited = true; + } + + protected override int SIZE_STORED => PokeCrypto.SIZE_8ASTORED; + protected override int SIZE_PARTY => PokeCrypto.SIZE_8APARTY; + public override int SIZE_BOXSLOT => PokeCrypto.SIZE_8ASTORED; + protected override PKM GetPKM(byte[] data) => new PA8(data); + protected override byte[] DecryptPKM(byte[] data) => PokeCrypto.DecryptArray8A(data); + + public override PKM BlankPKM => new PA8(); + public override Type PKMType => typeof(PA8); + public override int MaxEV => 252; + public override int Generation => 8; + public override int OTLength => 12; + public override int NickLength => 12; + + public SCBlockAccessor Accessor => Blocks; + public IReadOnlyList AllBlocks { get; } + public override bool ChecksumsValid => true; + public override string ChecksumInfo => string.Empty; + public override int BoxCount => BoxLayout8a.BoxCount; // 32 + public override int TID { get => MyStatus.TID; set => MyStatus.TID = value; } + public override int SID { get => MyStatus.SID; set => MyStatus.SID = value; } + public override int Game { get => MyStatus.Game; set => MyStatus.Game = value; } + public override int Gender { get => MyStatus.Gender; set => MyStatus.Gender = value; } + public override int Language { get => MyStatus.Language; set => MyStatus.Language = value; } + public override string OT { get => MyStatus.OT; set => MyStatus.OT = value; } + + public override GameVersion Version => Game switch + { + (int)GameVersion.PLA => GameVersion.PLA, + _ => GameVersion.Invalid, + }; + + protected override void SetChecksums() { } // None! + protected override byte[] GetFinalData() => SwishCrypto.Encrypt(AllBlocks); + + public override PersonalTable Personal => PersonalTable.LA; + public override IReadOnlyList HeldItems => Legal.HeldItems_SWSH; + + #region Blocks + public SaveBlockAccessor8LA Blocks { get; } + + public T GetValue(uint key) where T : struct + { + if (!State.Exportable) + return default; + var value = Blocks.GetBlockValue(key); + if (value is T v) + return v; + throw new ArgumentException($"Incorrect type request! Expected {typeof(T).Name}, received {value.GetType().Name}", nameof(T)); + } + + public void SetValue(uint key, T value) where T : struct + { + if (!State.Exportable) + return; + Blocks.SetBlockValue(key, value); + } + + #endregion + protected override SaveFile CloneInternal() + { + var blockCopy = new SCBlock[AllBlocks.Count]; + for (int i = 0; i < AllBlocks.Count; i++) + blockCopy[i] = AllBlocks[i].Clone(); + return new SAV8LA(State.BAK, blockCopy); + } + + public override int MaxMoveID => Legal.MaxMoveID_8a; + public override int MaxSpeciesID => Legal.MaxSpeciesID_8a; + public override int MaxItemID => Legal.MaxItemID_8a; + public override int MaxBallID => Legal.MaxBallID_8a; + public override int MaxGameID => Legal.MaxGameID_8a; + public override int MaxAbilityID => Legal.MaxAbilityID_8a; + + public Box8 BoxInfo => Blocks.BoxInfo; + public Party8a PartyInfo => Blocks.PartyInfo; + public MyStatus8a MyStatus => Blocks.MyStatus; + public PokedexSave8a PokedexSave => Blocks.PokedexSave; + public BoxLayout8a BoxLayout => Blocks.BoxLayout; + public MyItem8a Items => Blocks.Items; + public AdventureStart8a AdventureStart => Blocks.AdventureStart; + public LastSaved8a LastSaved => Blocks.LastSaved; + public PlayTime8a Played => Blocks.Played; + public override uint SecondsToStart { get => (uint)AdventureStart.Seconds; set => AdventureStart.Seconds = value; } + public override uint Money { get => (uint)Blocks.GetBlockValue(SaveBlockAccessor8LA.KMoney); set => Blocks.SetBlockValue(SaveBlockAccessor8LA.KMoney, value); } + public override int MaxMoney => 9_999_999; + + public override int PlayedHours { get => Played.PlayedHours; set => Played.PlayedHours = (ushort)value; } + public override int PlayedMinutes { get => Played.PlayedMinutes; set => Played.PlayedMinutes = (byte)value; } + public override int PlayedSeconds { get => Played.PlayedSeconds; set => Played.PlayedSeconds = (byte)value; } + + protected override byte[] BoxBuffer => BoxInfo.Data; + protected override byte[] PartyBuffer => PartyInfo.Data; + + private void Initialize() + { + Box = 0; + Party = 0; + PokeDex = 0; + } + + public override int GetPartyOffset(int slot) => Party + (SIZE_PARTY * slot); + public override int PartyCount + { + get => PartyInfo.PartyCount; + protected set => PartyInfo.PartyCount = value; + } + + // Zukan + protected override void SetDex(PKM pkm) + { + // TODO: Seen in wild? + // Accessor.SetPokeSeenInWild(pkm); + + // TODO: Should this update research? What research should it be updating? + // TODO: Should this be passing "caught=true" to set caught flags and not just obtain flags? + // For now, if we have never obtained the poke, treat this pkm as obtained-via-trade. + PokedexSave.OnPokeGet_TradeWithoutEvolution(pkm); + } + + public override bool GetCaught(int species) + { + if (species > Personal.MaxSpeciesID) + return false; + + var formCount = Personal[species].FormCount; + for (var form = 0; form < formCount; form++) + { + if (PokedexSave.HasAnyPokeObtainFlags(species, form)) + return true; + } + return false; + } + + public override bool GetSeen(int species) => PokedexSave.HasPokeEverBeenUpdated(species); + + // Inventory + public override IReadOnlyList Inventory { get => Items.Inventory; set => Items.Inventory = value; } + + #region Boxes + public override bool HasBoxWallpapers => false; + public override bool HasNamableBoxes => true; + public override int CurrentBox { get => BoxLayout.CurrentBox; set => BoxLayout.CurrentBox = value; } + public override int BoxesUnlocked { get => (byte)Blocks.GetBlockValue(SaveBlockAccessor8LA.KBoxesUnlocked); set => Blocks.SetBlockValue(SaveBlockAccessor8LA.KBoxesUnlocked, (byte)value); } + + public override byte[] BoxFlags + { + get => new[] + { + Convert.ToByte(Blocks.GetBlock(SaveBlockAccessor8LA.KUnlockedSecretBox01).Type - 1), + Convert.ToByte(Blocks.GetBlock(SaveBlockAccessor8LA.KUnlockedSecretBox02).Type - 1), + Convert.ToByte(Blocks.GetBlock(SaveBlockAccessor8LA.KUnlockedSecretBox03).Type - 1), + }; + set + { + if (value.Length != 1) + return; + + var blocks = new[] + { + Blocks.GetBlock(SaveBlockAccessor8LA.KUnlockedSecretBox01), + Blocks.GetBlock(SaveBlockAccessor8LA.KUnlockedSecretBox02), + Blocks.GetBlock(SaveBlockAccessor8LA.KUnlockedSecretBox03), + }; + + foreach (var block in blocks) + { + block.ChangeBooleanType((SCTypeCode)(value[0] & 1) + 1); + } + } + } + + public override int GetBoxOffset(int box) => Box + (SIZE_BOXSLOT * box * 30); + public override string GetBoxName(int box) => BoxLayout.GetBoxName(box); + public override void SetBoxName(int box, string value) => BoxLayout.SetBoxName(box, value); + + public override int GetBoxWallpaper(int box) + { + if ((uint)box >= BoxCount) + return box; + var b = Blocks.GetBlock(SaveBlockAccessor8LA.KBoxWallpapersUnused); + return b.Data[box]; + } + + public override void SetBoxWallpaper(int box, int value) + { + if ((uint)box >= BoxCount) + return; + var b = Blocks.GetBlock(SaveBlockAccessor8LA.KBoxWallpapersUnused); + b.Data[box] = (byte)value; + } + #endregion +} diff --git a/PKHeX.Core/Saves/SAV8SWSH.cs b/PKHeX.Core/Saves/SAV8SWSH.cs index 31e02ccc6e8..6a2e58cd830 100644 --- a/PKHeX.Core/Saves/SAV8SWSH.cs +++ b/PKHeX.Core/Saves/SAV8SWSH.cs @@ -6,7 +6,7 @@ namespace PKHeX.Core /// /// Generation 8 object for games. /// - public sealed class SAV8SWSH : SAV8, ISaveBlock8SWSH, ITrainerStatRecord, ISaveFileRevision + public sealed class SAV8SWSH : SAV8, ISaveBlock8SWSH, ITrainerStatRecord, ISaveFileRevision, ISCBlockArray { public SAV8SWSH(byte[] data) : base(data) { @@ -66,6 +66,7 @@ protected override void SetChecksums() { } // None! public override IReadOnlyList HeldItems => Legal.HeldItems_SWSH; #region Blocks + public SCBlockAccessor Accessor => Blocks; public SaveBlockAccessor8SWSH Blocks { get; } public override Box8 BoxInfo => Blocks.BoxInfo; public override Party8 PartyInfo => Blocks.PartyInfo; diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/AdventureStart8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/AdventureStart8a.cs new file mode 100644 index 00000000000..f57be63d044 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/AdventureStart8a.cs @@ -0,0 +1,33 @@ +using System; +using System.Buffers.Binary; +using System.ComponentModel; + +namespace PKHeX.Core; + +/// +/// Stores the when the player created their save data. +/// +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class AdventureStart8a : SaveBlock +{ + public AdventureStart8a(SaveFile sav, SCBlock block) : base(sav, block.Data) { } + + /// + /// time_t (seconds since 1970 Epoch) + /// + public ulong Seconds + { + get => BinaryPrimitives.ReadUInt64LittleEndian(Data.AsSpan(Offset)); + set => BinaryPrimitives.WriteUInt64LittleEndian(Data.AsSpan(Offset), value); + } + + private static DateTime Epoch => new(1970, 1, 1); + + public string AdventureStartTime => $"{Timestamp.Year:0000}-{Timestamp.Month:00}-{Timestamp.Day:00} {Timestamp.Hour:00}ː{Timestamp.Minute:00}ː{Timestamp.Second:00}"; // not : + + public DateTime Timestamp + { + get => Epoch.AddSeconds(Seconds); + set => Seconds = (ulong)value.Subtract(Epoch).TotalSeconds; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/BoxLayout8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/BoxLayout8a.cs new file mode 100644 index 00000000000..d985fb15385 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/BoxLayout8a.cs @@ -0,0 +1,34 @@ +using System; +using System.ComponentModel; + +namespace PKHeX.Core; + +/// +/// Exposes information about Box Names and which box is the first box to show when the UI is opened. +/// +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class BoxLayout8a : SaveBlock, IBoxDetailName +{ + public const int BoxCount = 32; + + private const int StringMaxLength = SAV6.LongStringLength / 2; // 0x22 bytes + + public BoxLayout8a(SAV8LA sav, SCBlock block) : base(sav, block.Data) { } + + private static int GetBoxNameOffset(int box) => SAV6.LongStringLength * box; + private Span GetBoxNameSpan(int box) => Data.AsSpan(GetBoxNameOffset(box), SAV6.LongStringLength); + public string GetBoxName(int box) => SAV.GetString(GetBoxNameSpan(box)); + public void SetBoxName(int box, string value) => SAV.SetString(GetBoxNameSpan(box), value.AsSpan(), StringMaxLength, StringConverterOption.ClearZero); + + public string this[int i] + { + get => GetBoxName(i); + set => SetBoxName(i, value); + } + + public int CurrentBox + { + get => ((SAV8LA)SAV).GetValue(SaveBlockAccessor8LA.KCurrentBox); + set => ((SAV8LA)SAV).SetValue(SaveBlockAccessor8LA.KCurrentBox, (byte)value); + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Coordinates8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Coordinates8a.cs new file mode 100644 index 00000000000..e7df18d37f9 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Coordinates8a.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel; + +namespace PKHeX.Core; + +/// +/// Stores the position of the player. +/// +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class Coordinates8a : SaveBlock +{ + public Coordinates8a(SaveFile sav, SCBlock block) : base(sav, block.Data) { } + public float X { get => ReadSingleLittleEndian(Data.AsSpan(Offset + 0x50)); set => WriteSingleLittleEndian(Data.AsSpan(Offset + 0x50), value); } + public float Z { get => ReadSingleLittleEndian(Data.AsSpan(Offset + 0x54)); set => WriteSingleLittleEndian(Data.AsSpan(Offset + 0x54), value); } + public float Y { get => ReadSingleLittleEndian(Data.AsSpan(Offset + 0x58)); set => WriteSingleLittleEndian(Data.AsSpan(Offset + 0x58), value); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/LastSaved8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/LastSaved8a.cs new file mode 100644 index 00000000000..0512c6dfdc5 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/LastSaved8a.cs @@ -0,0 +1,54 @@ +using System; +using System.ComponentModel; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Stores the of the player. +/// +/// +/// Year value is offset by -1900. +/// Month value is offset by -1. +/// +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class LastSaved8a : SaveBlock +{ + public LastSaved8a(SaveFile sav, SCBlock block) : base(sav, block.Data) { } + private uint LastSaved { get => ReadUInt32LittleEndian(Data.AsSpan(Offset + 0x0)); set => WriteUInt32LittleEndian(Data.AsSpan(Offset + 0x0), value); } + private int LastSavedYear { get => (int)(LastSaved & 0xFFF); set => LastSaved = (LastSaved & 0xFFFFF000) | (uint)value; } + private int LastSavedMonth { get => (int)(LastSaved >> 12 & 0xF); set => LastSaved = (LastSaved & 0xFFFF0FFF) | ((uint)value & 0xF) << 12; } + private int LastSavedDay { get => (int)(LastSaved >> 16 & 0x1F); set => LastSaved = (LastSaved & 0xFFE0FFFF) | ((uint)value & 0x1F) << 16; } + private int LastSavedHour { get => (int)(LastSaved >> 21 & 0x1F); set => LastSaved = (LastSaved & 0xFC1FFFFF) | ((uint)value & 0x1F) << 21; } + private int LastSavedMinute { get => (int)(LastSaved >> 26 & 0x3F); set => LastSaved = (LastSaved & 0x03FFFFFF) | ((uint)value & 0x3F) << 26; } + public string LastSavedTime => $"{LastSavedYear+1900:0000}-{LastSavedMonth+1:00}-{LastSavedDay:00} {LastSavedHour:00}ː{LastSavedMinute:00}"; // not : + + public DateTime? LastSavedDate + { + get => !DateUtil.IsDateValid(LastSavedYear + 1900, LastSavedMonth + 1, LastSavedDay) + ? null + : new DateTime(LastSavedYear + 1900, LastSavedMonth + 1, LastSavedDay, LastSavedHour, LastSavedMinute, 0); + set + { + // Only update the properties if a value is provided. + if (value.HasValue) + { + var dt = value.Value; + LastSavedYear = dt.Year - 1900; + LastSavedMonth = dt.Month - 1; + LastSavedDay = dt.Day; + LastSavedHour = dt.Hour; + LastSavedMinute = dt.Minute; + } + else // Clear the date. + { + // If code tries to access MetDate again, null will be returned. + LastSavedYear = 0; + LastSavedMonth = 0; + LastSavedDay = 0; + LastSavedHour = 0; + LastSavedMinute = 0; + } + } + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/MyItem8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/MyItem8a.cs new file mode 100644 index 00000000000..5b2f7b74a91 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/MyItem8a.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; + +namespace PKHeX.Core; + +/// +/// Stores the inventory of items that the player has acquired. +/// +/// +/// Reads four separate pouch blobs: Items, Key Items, Storage, and Recipes. +/// +public sealed class MyItem8a : MyItem +{ + public MyItem8a(SAV8LA SAV, SCBlock block) : base(SAV, block.Data) { } + + public override IReadOnlyList Inventory + { + get + { + var access = ((SAV8LA)SAV).Accessor; + var regular = new InventoryPouch8a(InventoryType.Items, Legal.Pouch_Items_LA , 999, 675); + var key = new InventoryPouch8a(InventoryType.KeyItems, Legal.Pouch_Key_LA , 1, 100); + var stored = new InventoryPouch8a(InventoryType.PCItems, Legal.Pouch_Items_LA , 999, 180); + var recipe = new InventoryPouch8a(InventoryType.Treasure, Legal.Pouch_Recipe_LA, 1, 70); + regular.GetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemRegular).Data); + key .GetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemKey).Data); + stored.GetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemStored).Data); + recipe.GetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemRecipe).Data); + + var result = new[] { regular, key, stored, recipe }; + LoadFavorites(result, access); + return result; + } + set + { + var access = ((SAV8LA)SAV).Accessor; + foreach (var p in value) + ((InventoryPouch8a)p).SanitizeCounts(); + + value[0].SetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemRegular).Data); + value[1].SetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemKey).Data); + value[2].SetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemStored).Data); + value[3].SetPouch(access.GetBlock(SaveBlockAccessor8LA.KItemRecipe).Data); + SaveFavorites(value, access); + } + } + + private static void LoadFavorites(IEnumerable pouches, SCBlockAccessor access) + { + var favorites = access.GetBlock(SaveBlockAccessor8LA.KItemFavorite).Data.AsSpan(); + foreach (var arr in pouches) + LoadFavorites(arr.Items, favorites); + } + + private static void SaveFavorites(IEnumerable pouches, SCBlockAccessor access) + { + var favorites = access.GetBlock(SaveBlockAccessor8LA.KItemFavorite).Data.AsSpan(); + favorites.Clear(); + foreach (var arr in pouches) + SaveFavorites(arr.Items, favorites); + } + + private static void LoadFavorites(IEnumerable items, Span favorites) + { + foreach (var z in items) + { + var item = (InventoryItem8a)z; + var itemID = item.Index; + var ofs = itemID >> 3; + if ((uint)ofs >= favorites.Length) + continue; + + var bit = itemID & 7; + item.IsFavorite = FlagUtil.GetFlag(favorites, ofs, bit); + } + } + + private static void SaveFavorites(IEnumerable items, Span favorites) + { + foreach (var z in items) + { + var item = (InventoryItem8a)z; + var itemID = item.Index; + var ofs = itemID >> 3; + if ((uint)ofs >= favorites.Length) + continue; + + var bit = itemID & 7; + var value = FlagUtil.GetFlag(favorites, ofs, bit); + value |= item.IsFavorite; + FlagUtil.SetFlag(favorites, ofs, bit, value); + } + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/MyStatus8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/MyStatus8a.cs new file mode 100644 index 00000000000..88ead017686 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/MyStatus8a.cs @@ -0,0 +1,69 @@ +using System; +using System.Buffers.Binary; +using System.ComponentModel; + +namespace PKHeX.Core; + +/// +/// Stores data about the player. +/// +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class MyStatus8a : SaveBlock +{ + public MyStatus8a(SAV8LA sav, SCBlock block) : base(sav, block.Data) { } + + public int TID + { + get => BinaryPrimitives.ReadUInt16LittleEndian(Data.AsSpan(0x10)); + set => BinaryPrimitives.WriteUInt16LittleEndian(Data.AsSpan(0x10), (ushort)value); + } + + public int SID + { + get => BinaryPrimitives.ReadUInt16LittleEndian(Data.AsSpan(0x12)); + set => BinaryPrimitives.WriteUInt16LittleEndian(Data.AsSpan(0x12), (ushort)value); + } + + public int Game + { + get => Data[0x14]; + set => Data[0x14] = (byte)value; + } + + public int Gender + { + get => Data[0x15]; + set => Data[0x15] = (byte)value; + } + + // A6 + public int Language + { + get => Data[Offset + 0x17]; + set + { + if (value == Language) + return; + Data[Offset + 0x17] = (byte)value; + + // For runtime language, the game shifts all languages above Language 6 (unused) down one. + if (value >= 6) + value--; + ((SAV8LA)SAV).SetValue(SaveBlockAccessor8LA.KGameLanguage, (uint)value); + } + } + + private Span OT_Trash => Data.AsSpan(0x20, 0x1A); + + public string OT + { + get => SAV.GetString(OT_Trash); + set => SAV.SetString(OT_Trash, value.AsSpan(), SAV.OTLength, StringConverterOption.ClearZero); + } + + public byte Unk_0x50 + { + get => Data[Offset + 0x50]; + set => Data[Offset + 0x50] = value; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Party8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Party8a.cs new file mode 100644 index 00000000000..d7cbff0711e --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Party8a.cs @@ -0,0 +1,12 @@ +namespace PKHeX.Core; + +public sealed class Party8a : SaveBlock +{ + public Party8a(SAV8LA sav, SCBlock block) : base(sav, block.Data) { } + + public int PartyCount + { + get => Data[6 * PokeCrypto.SIZE_8APARTY]; + set => Data[6 * PokeCrypto.SIZE_8APARTY] = (byte)value; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/PlayTime8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/PlayTime8a.cs new file mode 100644 index 00000000000..ddda43a56f5 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/PlayTime8a.cs @@ -0,0 +1,24 @@ +using System; +using System.ComponentModel; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Stores the amount of time the save file has been played. +/// +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class PlayTime8a : SaveBlock +{ + public PlayTime8a(SAV8LA sav, SCBlock block) : base(sav, block.Data) { } + + public ushort PlayedHours + { + get => ReadUInt16LittleEndian(Data.AsSpan(Offset)); + set => WriteUInt16LittleEndian(Data.AsSpan(Offset), value); + } + + public byte PlayedMinutes { get => Data[Offset + 2]; set => Data[Offset + 2] = value; } + public byte PlayedSeconds { get => Data[Offset + 3]; set => Data[Offset + 3] = value; } + public string LastSavedTime => $"{PlayedHours:0000}ː{PlayedMinutes:00}ː{PlayedSeconds:00}"; // not : +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/PlayerFashion8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/PlayerFashion8a.cs new file mode 100644 index 00000000000..5a025c317f5 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/PlayerFashion8a.cs @@ -0,0 +1,26 @@ +using System; +using System.ComponentModel; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Stores the selected appearance choices of the player. +/// +[TypeConverter(typeof(ExpandableObjectConverter))] +public sealed class PlayerFashion8a : SaveBlock +{ + public PlayerFashion8a(SaveFile sav, SCBlock block) : base(sav, block.Data) { } + public ulong Hair { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x00)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x00), value); } + public ulong Contacts { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x08)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x08), value); } + public ulong Eyebrows { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x10)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x10), value); } + public ulong Glasses { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x18)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x18), value); } + public ulong Hat { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x20)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x20), value); } + public ulong Top { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x28)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x28), value); } + public ulong Bottoms { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x30)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x30), value); } + public ulong _38 { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x38)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x38), value); } + public ulong Shoes { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x40)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x40), value); } + public ulong _48 { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x48)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x48), value); } + public ulong _50 { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x50)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x50), value); } + public ulong Skin { get => ReadUInt64LittleEndian(Data.AsSpan(Offset + 0x58)); set => WriteUInt64LittleEndian(Data.AsSpan(Offset + 0x58), value); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexConstants8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexConstants8a.cs new file mode 100644 index 00000000000..c42454fd6b1 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexConstants8a.cs @@ -0,0 +1,144 @@ +namespace PKHeX.Core; + +/// +/// Thresholds and research tasks used for Pokédex entries. +/// +public static class PokedexConstants8a +{ + public const int MaxPokedexResearchPoints = 60000; + + public static readonly int[] ResearchPointsForRank = + { + 0, 500, 1800, 3500, 6000, 8500, 11000, 15000, 20000, 30000, 60000, + }; + + public static readonly ushort[] PokemonInfoIds = + { + 0, 25, 26, 35, 36, 37, 38, 41, 42, 46, + 47, 54, 55, 63, 64, 65, 66, 67, 68, 72, + 73, 74, 75, 76, 77, 78, 81, 82, 92, 93, + 94, 95, 108, 111, 112, 113, 114, 122, 123, 125, + 126, 129, 130, 133, 134, 135, 136, 137, 143, 155, + 156, 169, 172, 173, 175, 176, 185, 190, 193, 196, + 197, 198, 200, 201, 207, 208, 212, 214, 215, 216, + 217, 220, 221, 223, 224, 226, 233, 234, 239, 240, + 242, 265, 266, 267, 268, 269, 280, 281, 282, 299, + 315, 339, 340, 355, 356, 358, 361, 362, 363, 364, + 365, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 501, 502, + 548, 627, 641, 642, 645, 700, 704, 712, 722, 723, + 899, 900, 901, 902, 903, 904, 905, 2048, 2085, 2086, + 2106, 2107, 2148, 2149, 2205, 2249, 2259, 2263, 2460, 2461, + 2462, 2469, 2470, 2471, 2527, 2531, 2532, 2535, 2540, 2541, + 2551, 2597, 2618, 2619, 2676, 2689, 2690, 2693, 2753, 2754, + 2761, 2772, 2948, 2950, 2953, 4155, 4197, 4297, 4508, 4509, + 4510, 4575, 4589, 4645, 4646, 4809, 6345, 6623, 6637, 8393, + 8671, 8685, 10441, 10719, 10733, 12489, 12781, 14537, 14829, 16585, + 16877, 18633, 18925, 20681, 20973, 22729, 23021, 24777, 25069, 26825, + 27117, 28873, 29165, 30921, 31213, 32969, 33261, 35017, 35309, 37065, + 39113, 41161, 43209, 45257, 47305, 49353, 51401, 53449, 55497, + }; + + public static readonly byte[] PokemonInfoGenders = + { + 0x04, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x03, 0x03, 0x20, 0x08, 0x08, 0x03, 0x08, + 0x08, 0x03, 0x03, 0x03, 0x08, 0x08, 0x08, 0x04, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x08, 0x08, + 0x08, 0x03, 0x08, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08, + 0x03, 0x08, 0x03, 0x08, 0x03, 0x08, 0x04, 0x08, 0x08, 0x08, + 0x20, 0x08, 0x08, 0x03, 0x08, 0x03, 0x08, 0x08, 0x08, 0x08, + 0x03, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x08, 0x03, 0x08, 0x08, 0x08, 0x08, 0x08, 0x20, 0x10, 0x03, + 0x20, 0x03, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, 0x03, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x04, 0x04, 0x08, 0x08, 0x20, 0x08, 0x08, 0x03, 0x03, 0x03, + 0x08, 0x08, 0x08, 0x03, 0x03, 0x08, 0x08, 0x03, 0x03, 0x08, + 0x03, 0x03, 0x08, 0x03, 0x03, 0x03, 0x04, 0x08, 0x03, 0x03, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x03, 0x04, 0x10, + 0x08, 0x08, 0x20, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, + 0x04, 0x04, 0x20, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, + 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x10, 0x08, 0x08, 0x20, 0x04, 0x08, 0x08, + 0x08, 0x08, 0x04, 0x04, 0x08, 0x04, 0x08, 0x03, 0x08, 0x20, + 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x08, 0x20, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x20, 0x20, 0x08, 0x04, 0x04, 0x08, 0x20, + 0x10, 0x04, 0x04, 0x20, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + }; + + public static readonly ushort[] FormStorageIndexIds = + { + 0, 25, 26, 35, 36, 37, 38, 41, 42, 46, 47, 54, 55, 63, 64, 65, + 66, 67, 68, 72, 73, 74, 75, 76, 77, 78, 81, 82, 92, 93, 94, 95, + 108, 111, 112, 113, 114, 122, 123, 125, 126, 129, 130, 133, 134, 135, 136, 137, + 143, 155, 156, 169, 172, 173, 175, 176, 185, 190, 193, 196, 197, 198, 200, 201, + 207, 208, 212, 214, 215, 216, 217, 220, 221, 223, 224, 226, 233, 234, 239, 240, + 242, 265, 266, 267, 268, 269, 280, 281, 282, 299, 315, 339, 340, 355, 356, 358, + 361, 362, 363, 364, 365, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 501, 502, 548, 627, 641, 642, 645, 700, 704, 712, 722, 723, 899, 900, 901, 902, + 903, 904, 905, 2085, 2086, 2106, 2107, 2148, 2149, 2205, 2249, 2259, 2263, 2460, 2461, 2462, + 2469, 2470, 2471, 2527, 2531, 2532, 2535, 2540, 2541, 2551, 2597, 2618, 2619, 2676, 2689, 2690, + 2693, 2753, 2754, 2761, 2772, 2948, 2950, 2953, 4155, 4197, 4297, 4508, 4509, 4510, 4575, 4589, + 4645, 4646, 4809, 6345, 6623, 6637, 8393, 8671, 8685, 10441, 10719, 10733, 12489, 12781, 14537, 14829, + 16585, 16877, 18633, 18925, 20681, 20973, 22729, 23021, 24777, 25069, 26825, 27117, 28873, 29165, 30921, 31213, + 32969, 33261, 35017, 35309, 37065, 39113, 41161, 43209, 45257, 47305, 49353, 51401, 53449, 55497, + }; + + public static readonly ushort[] FormStorageIndexValues = + { + 0, 1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 14, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 100, 101, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 167, + 170, 173, 174, 175, 176, 177, 178, 179, 181, 183, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 246, 247, 248, 249, 251, 253, 254, 255, 257, 258, 259, 260, 261, 263, + 281, 282, 284, 290, 292, 294, 296, 298, 299, 302, 305, 306, 308, 309, 311, 312, + 314, 315, 316, 6, 8, 15, 16, 37, 38, 59, 73, 102, 106, 165, 168, 171, + 180, 182, 184, 241, 250, 252, 256, 262, 264, 283, 285, 288, 289, 291, 293, 295, + 297, 300, 301, 303, 307, 310, 313, 317, 17, 39, 74, 166, 169, 172, 242, 265, + 286, 287, 304, 75, 243, 266, 76, 244, 267, 77, 245, 268, 78, 269, 79, 270, + 80, 271, 81, 272, 82, 273, 83, 274, 84, 275, 85, 276, 86, 277, 87, 278, + 88, 279, 89, 280, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + }; + + public static readonly PokedexResearchTask8a[][] ResearchTasks = DeserializeResearchTasks(BinLinkerAccessor.Get(Util.GetBinaryResource("researchtask_la.pkl"), "la")); + + private static PokedexResearchTask8a[][] DeserializeResearchTasks(BinLinkerAccessor accessor) + { + var result = new PokedexResearchTask8a[accessor.Length][]; + for (var i = 0; i < result.Length; i++) + result[i] = PokedexResearchTask8a.DeserializeFrom(accessor[i]); + return result; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTask8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTask8a.cs new file mode 100644 index 00000000000..1f8e3f2bc0e --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTask8a.cs @@ -0,0 +1,70 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; +using static PKHeX.Core.PokedexResearchTaskType8a; + +namespace PKHeX.Core; + +/// +/// Research Task definition for Pokédex entries. +/// +public sealed class PokedexResearchTask8a +{ + public readonly PokedexResearchTaskType8a Task; + public readonly int Threshold; + public readonly int Move; + public readonly MoveType Type; + public readonly PokedexTimeOfDay8a TimeOfDay; + public readonly ulong Hash_06; + public readonly ulong Hash_07; + public readonly ulong Hash_08; + public readonly byte[] TaskThresholds; + public readonly int PointsSingle; + public readonly int PointsBonus; + public readonly bool RequiredForCompletion; + public readonly int Index; + + private const int SIZE = 0x28; + + public PokedexResearchTask8a() : this(stackalloc byte[SIZE]) { } + + private PokedexResearchTask8a(ReadOnlySpan data) + { + Task = (PokedexResearchTaskType8a)data[0x00]; + PointsSingle = data[0x01]; + PointsBonus = data[0x02]; + Threshold = data[0x03]; + Move = ReadUInt16LittleEndian(data[0x04..]); + Type = (MoveType)data[0x06]; + TimeOfDay = (PokedexTimeOfDay8a)data[0x07]; + Hash_06 = ReadUInt64LittleEndian(data[0x08..]); + Hash_07 = ReadUInt64LittleEndian(data[0x10..]); + Hash_08 = ReadUInt64LittleEndian(data[0x18..]); + TaskThresholds = data.Slice(0x21, data[0x20]).ToArray(); + RequiredForCompletion = data[0x26] != 0; + + Index = Task is UseMove or DefeatWithMoveType ? data[0x27] : -1; + } + + public static PokedexResearchTask8a[] DeserializeFrom(ReadOnlySpan data) + { + // 00: u8 task + // 01: u8 points_single + // 02: u8 points_bonus + // 03: u8 threshold + // 04: u16 move + // 06: u8 type + // 07: u8 time of day + // 08: u64 hash_06 + // 10: u64 hash_07 + // 18: u64 hash_08 + // 20: u8 num_thresholds + // 21: u8 thresholds[5] + // 26: u8 required + // 27: u8 multi_index + + var result = new PokedexResearchTask8a[data.Length / SIZE]; + for (var i = 0; i < result.Length; i++) + result[i] = new PokedexResearchTask8a(data.Slice(SIZE * i, SIZE)); + return result; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTaskType8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTaskType8a.cs new file mode 100644 index 00000000000..b7ca93c8b66 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTaskType8a.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using static PKHeX.Core.PokedexResearchTaskType8a; + +namespace PKHeX.Core; + +/// +/// Research Task types for Pokédex entries. +/// +public enum PokedexResearchTaskType8a : byte +{ + Catch = 0, + UseMove = 1, + DefeatWithMoveType = 2, + Defeat = 3, + Evolve = 4, + CatchAlpha = 5, + CatchLarge = 6, + CatchSmall = 7, + CatchHeavy = 8, + CatchLight = 9, + CatchAtTime = 10, + CatchSleeping = 11, + CatchInAir = 12, + CatchNotSpotted = 13, + GiveFood = 14, + StunWithItems = 15, + ScareWithScatterBang = 16, + LureWithPokeshiDoll = 17, + UseStrongStyleMove = 18, + UseAgileStyleMove = 19, + LeapFromTrees = 20, + LeapFromLeaves = 21, + LeapFromSnow = 22, + LeapFromOre = 23, + LeapFromTussocks = 24, + ObtainForms = 25, + PartOfArceus = 26, + SpeciesQuest = 27, +} + +public static class PokedexResearchTask8aExtensions +{ + public static bool CanSetCurrentValue(this PokedexResearchTaskType8a task) => task switch + { + ObtainForms => false, + PartOfArceus => false, + SpeciesQuest => false, + _ => true, + }; + + public static string GetTaskLabelString(this PokedexResearchTask8a task, IReadOnlyList TaskDescriptions, IReadOnlyList TimeTaskDescriptions, IReadOnlyList SpeciesQuests) => task.Task switch + { + SpeciesQuest => GetSpeciesQuestLabel(task.Hash_06, SpeciesQuests), + UseMove => GetGenericTaskLabelString(task.Task, task.Index, task.Move, TaskDescriptions, TimeTaskDescriptions), + DefeatWithMoveType => GetGenericTaskLabelString(task.Task, task.Index, (int)task.Type, TaskDescriptions, TimeTaskDescriptions), + CatchAtTime => GetGenericTaskLabelString(task.Task, task.Index, (int)task.TimeOfDay, TaskDescriptions, TimeTaskDescriptions), + _ => GetGenericTaskLabelString(task.Task, task.Index, (int)task.TimeOfDay, TaskDescriptions, TimeTaskDescriptions), + }; + + public static string GetGenericTaskLabelString(PokedexResearchTaskType8a task, int idx, int param, IReadOnlyList TaskDescriptions, IReadOnlyList TimeTaskDescriptions) => task switch + { + UseMove => string.Format(TaskDescriptions[(int)task], param >= 0 ? GameInfo.Strings.Move[param] : $"(idx={idx})"), + DefeatWithMoveType => string.Format(TaskDescriptions[(int)task], param >= 0 ? GameInfo.Strings.Types[param] : $"(idx={idx})"), + CatchAtTime => TimeTaskDescriptions[param], + _ => TaskDescriptions[(int)task], + }; + + private static string GetSpeciesQuestLabel(ulong hash, IReadOnlyList labels) => hash switch + { + 0xE68C0D2852AF9068 => labels[0], + 0xE68C0E2852AF921B => labels[1], + 0xE68F7B2852B28129 => labels[2], + 0xE68F7C2852B282DC => labels[3], + 0xE68F7E2852B28642 => labels[4], + 0xE68F812852B28B5B => labels[5], + 0xE68F802852B289A8 => labels[6], + 0xE6850D2852A971BA => labels[7], + 0xE6888B2852AC7DAB => labels[8], + 0xE6888F2852AC8477 => labels[9], + 0xE688842852AC71C6 => labels[10], + 0xE69D122852BE0C1A => labels[12], + 0xE69D092852BDFCCF => labels[13], + 0xE6927D2852B4BA66 => labels[14], + 0xE696022852B7D23C => labels[16], + 0xE67080285297D919 => labels[17], + 0xE6708C285297ED7D => labels[18], + 0xE6740B28529AFB21 => labels[19], + 0xE6740D28529AFE87 => labels[20], + _ => throw new ArgumentOutOfRangeException(nameof(hash)), + }; +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSave8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSave8a.cs new file mode 100644 index 00000000000..e419136f194 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSave8a.cs @@ -0,0 +1,1363 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using static PKHeX.Core.PokedexType8a; +using static PKHeX.Core.PokedexResearchTaskType8a; + +namespace PKHeX.Core; + +/// +/// Pokédex structure used for . +/// > +public sealed class PokedexSave8a +{ + private readonly SAV8LA SaveFile; + + private readonly PokedexSaveData SaveData; + + public const int MAX_SPECIES = 981; + public const int MAX_FORM = 120; + + private static PersonalTable Personal => PersonalTable.LA; + + public PokedexSave8a(SAV8LA sav, SCBlock block) + { + SaveFile = sav; + SaveData = new PokedexSaveData(block.Data); + } + + private const int DexInvalid = 0; + + public static int GetDexIndex(PokedexType8a which, int species) + { + var table = Personal; + + // Check species is valid + if ((uint)species > table.MaxSpeciesID) + return DexInvalid; + + // Check each form + var formCount = table[species].FormCount; + for (var form = 0; form < formCount; form++) + { + var entry = (PersonalInfoLA)table.GetFormEntry(species, form); + if (entry.DexIndexHisui == 0) + continue; + + // If we're getting for Hisui dex, return the index + if (which == Hisui) + return entry.DexIndexHisui; + + // Otherwise, check the local dex index + var localIndex = GetLocalIndex(which, entry); + + // Return the index if non-zero + if (localIndex != 0) + return localIndex; + } + + // No valid index + return DexInvalid; + } + + private static int GetLocalIndex(PokedexType8a which, PersonalInfoLA entry) => which switch + { + Local1 => entry.DexIndexLocal1, + Local2 => entry.DexIndexLocal2, + Local3 => entry.DexIndexLocal3, + Local4 => entry.DexIndexLocal4, + Local5 => entry.DexIndexLocal5, + _ => throw new ArgumentOutOfRangeException(nameof(which)), + }; + + public bool IsPokedexCompleted(PokedexType8a which) => SaveData.IsPokedexCompleted(which); + + public bool IsPokedexPerfect(PokedexType8a which) => SaveData.IsPokedexPerfect(which); + + public int GetDexTotalCount(PokedexType8a which) + { + var count = 0; + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + if (GetDexIndex(which, species) != DexInvalid) + count++; + } + return count; + } + + public int GetDexTotalEverBeenUpdated() + { + var count = 0; + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + if (SaveData.GetResearchEntry(species).HasEverBeenUpdated) + count++; + } + return count; + } + + public int GetDexGetCount(PokedexType8a which, out bool all) + { + all = true; + var count = 0; + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + if (GetDexIndex(which, species) == DexInvalid) + continue; + + if (SaveData.GetPokeGetCount(species) > 0) + count++; + else + all = false; + } + return count; + } + + public int GetDexGetCount(PokedexType8a which) => GetDexGetCount(which, out _); + + public int GetPokeGetCount(int species) => species < MAX_SPECIES ? SaveData.GetPokeGetCount(species) : 0; + + public bool GetPokeHasAnyReport(int species) => species < MAX_SPECIES && SaveData.HasAnyReport(species); + + public int GetCompletePokeAnyDexNum() + { + var complete = 0; + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + if (IsComplete(species)) + complete++; + } + return complete; + } + + public int GetPokeResearchRate(int species) + { + if ((uint)species >= MAX_SPECIES) + return 0; + + var rawRate = SaveData.GetPokeResearchRate(species); + if (rawRate >= 100 && !IsAllRequiredTasksComplete(species)) + rawRate = 99; + + return rawRate; + } + + public bool IsComplete(int species) => GetPokeResearchRate(species) >= 100; + + public bool IsPerfect(int species) => SaveData.IsPerfect(species); + + public int GetUpdateIndex(int species) => SaveData.GetResearchEntry(species).UpdateCounter; + public int GetLastReportedIndex(int species) => SaveData.GetResearchEntry(species).LastUpdatedReportCounter; + + public int GetCompletePokeNum() + { + var complete = 0; + for (var species = 0; species <= Personal.MaxSpeciesID; species++) + { + if (GetDexIndex(Hisui, species) != 0 && IsComplete(species)) + complete++; + } + return complete; + } + + public int GetReportPokeNum() + { + var count = 0; + + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + // Only allow reports of pokemon in hisui dex + if (GetDexIndex(Hisui, species) == 0) + continue; + + // Only allow reports of pokemon which have been caught + if (SaveData.GetPokeGetCount(species) == 0) + continue; + + // Check if the pokemon is unreported or has unreported tasks. + if (!SaveData.HasAnyReport(species) || GetUnreportedTaskCount(species) > 0) + count++; + } + + return count; + } + + public int GetTotalReportNum() + { + var count = 0; + + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + // Only allow reports of pokemon which have been caught + if (SaveData.GetPokeGetCount(species) == 0) + continue; + + count += GetUnreportedTaskCount(species); + } + + return count; + } + + public int GetUnreportedTaskCount(int species) + { + if ((uint)species >= MAX_SPECIES) + return 0; + + if (!TryGetResearchTasks(species, out var tasks)) + return 0; + + var unreported = 0; + for (var i = 0; i < tasks.Length; i++) + { + unreported += GetResearchTaskLevel(species, i, out _, out _, out _); + } + + return unreported; + } + + public void UpdateAllReportPoke() => UpdateAllReportPoke(out _); + + public void UpdateAllReportPoke(out PokedexUpdateInfo8a outInfo) => UpdateSpecificReportPoke(out outInfo, Enumerable.Range(1, Personal.MaxSpeciesID)); + + public void UpdateSpecificReportPoke(int species) => UpdateSpecificReportPoke(species, out _); + public void UpdateSpecificReportPoke(int species, out PokedexUpdateInfo8a outInfo) => UpdateSpecificReportPoke(out outInfo, Enumerable.Range(species, 1)); + + private void UpdateSpecificReportPoke(out PokedexUpdateInfo8a outInfo, IEnumerable speciesToUpdate) + { + // Get the save file's rank. + var urankBlock = SaveFile.Accessor.GetBlock(SaveBlockAccessor8LA.KExpeditionTeamRank); + var uRankBeforeUpdate = (int)(uint)urankBlock.GetValue(); + + // Get the points for the current/next rank. + var pointsForCurRank = GetResearchPoint(uRankBeforeUpdate); + var pointsForNextRank = GetResearchPoint(uRankBeforeUpdate + 1); + + // Get the total research points before update. + var allPokeResearchPoint = GetAllPokeResearchPoint(); + var totalResearchPointBeforeUpdate = GetTotalResearchPoint(); + if (allPokeResearchPoint > totalResearchPointBeforeUpdate) + totalResearchPointBeforeUpdate = allPokeResearchPoint; + + // Determine how many points count towards our next rank. + bool canAchieveNextRank = pointsForNextRank >= totalResearchPointBeforeUpdate; + var pointsNeededForNextRankBeforeUpdate = canAchieveNextRank ? pointsForNextRank - totalResearchPointBeforeUpdate : 0; + + // Declare variables we'll be processing for update + var updatedReportCounter = false; + var newlyCompleteResearchCount = 0; + var tasksReported = 0; + var pointsGainedFromCompletingPokeTasks = 0; + var numPokesWithNewlyCompletedTasks = 0; + + // Iterate, processing all species. + foreach (var species in speciesToUpdate) + { + // Only process species with dex ids + if (GetDexIndex(Hisui, species) == 0) + continue; + + // Get the species research entry + var researchEntry = SaveData.GetResearchEntry(species); + + // Set that the species now has at least one report + var hasNewReportInfo = !researchEntry.HasAnyReport; + researchEntry.HasAnyReport = true; + + // Get research tasks for the species + var hasTasks = TryGetResearchTasks(species, out var tasks); + + // Ensure all tasks have at least progress 1 (no tasks complete). + if (hasTasks) + { + for (var taskId = 0; taskId < tasks!.Length; taskId++) + { + if (researchEntry.GetReportedResearchProgress(taskId) == 0) + researchEntry.SetReportedResearchProgress(taskId, 1); + } + } + + // Get the research rate before report. + var curSpeciesResearchRateBeforeReport = researchEntry.ResearchRate; + if (researchEntry.ResearchRate >= 100 && !IsAllRequiredTasksComplete(species)) + curSpeciesResearchRateBeforeReport = 99; + + // Determine points gained for the current species in this report + var totalPointsGainedForCurPoke = 0; + var totalProgressForCurPoke = 0; + if (hasTasks) + { + for (var taskId = 0; taskId < tasks!.Length; taskId++) + { + // Get the current task + var task = tasks[taskId]; + + // Get the number of unreported tasks for the current task + var unreportedTasks = GetResearchTaskLevel(species, taskId, out _, out _, out _); + + // NOTE: Here, the game sets this->UnreportedProgressInLastReport[species] to include unreportedTasks in 3-bit entries as usual. + + // Set the updated progress. + for (var i = 0; i < unreportedTasks; i++) + { + var oldProgress = researchEntry.GetReportedResearchProgress(taskId); + var newProgress = oldProgress + 1; + if (oldProgress <= 6 && newProgress <= 6) + researchEntry.SetReportedResearchProgress(taskId, newProgress); + } + + // Determine earned points/progress + totalPointsGainedForCurPoke += unreportedTasks * (task.PointsSingle + task.PointsBonus); + totalProgressForCurPoke += unreportedTasks; + hasNewReportInfo |= unreportedTasks > 0; + } + } + + // Update Research Rate + var curSpeciesResearchRateAfterReport = (ushort)Math.Min(researchEntry.ResearchRate + totalPointsGainedForCurPoke, PokedexConstants8a.MaxPokedexResearchPoints); + researchEntry.ResearchRate = curSpeciesResearchRateAfterReport; + + // If we complete a poke this report, add to newly complete research + if (curSpeciesResearchRateBeforeReport < 100 && curSpeciesResearchRateAfterReport >= 100 && IsAllRequiredTasksComplete(species)) + newlyCompleteResearchCount++; + + // If we earned any points, update our global progress + if (totalPointsGainedForCurPoke > 0) + { + tasksReported += totalProgressForCurPoke; + pointsGainedFromCompletingPokeTasks += totalPointsGainedForCurPoke; + } + + // If we have anything updated to report, update our progress + if (hasNewReportInfo) + { + // Update global progress + numPokesWithNewlyCompletedTasks++; + + // Update the global report counter if needed. + if (!updatedReportCounter) + { + SaveData.IncrementReportCounter(); + updatedReportCounter = true; + } + + // Set the last-updated report for the current entry to the current report counter + researchEntry.LastUpdatedReportCounter = SaveData.GetReportCounter(); + } + + // Check if the entry is now perfect + var perfect = hasTasks; + if (hasTasks) + { + for (var taskId = 0; taskId < tasks!.Length; taskId++) + { + var progress = researchEntry.GetReportedResearchProgress(taskId); + if (tasks[taskId].TaskThresholds.Length + 1 <= progress) + continue; + + perfect = false; + break; + } + } + + if (perfect) + researchEntry.IsPerfect = true; + } + + // Make complete flags reflect the newly reported research + UpdateAllCompleteFlags(); + + // For unknown reasons, the game calls GetAllPokeResearchPoint() here, discarding the value. + GetAllPokeResearchPoint(); + + // Determine points after update + var totalResearchPointAfterUpdate = totalResearchPointBeforeUpdate + pointsGainedFromCompletingPokeTasks + (100 * newlyCompleteResearchCount); + + // Determine points needed for next rank after update + var pointsNeededForNextRankAfterUpdate = pointsForNextRank >= totalResearchPointAfterUpdate ? pointsForNextRank - totalResearchPointAfterUpdate : 0; + + // Determine percentage to next rank before/after update + var percentToNextRankBeforeUpdate = 100; + var percentToNextRankAfterUpdate = 100; + if (pointsForNextRank > 0) + { + var pointsBetweenCurrentAndNextRank = pointsForNextRank - pointsForCurRank; + + if (pointsForNextRank > totalResearchPointBeforeUpdate) + { + percentToNextRankBeforeUpdate = 0; + if (pointsBetweenCurrentAndNextRank > 0 && totalResearchPointBeforeUpdate > pointsForCurRank) + percentToNextRankBeforeUpdate = (100 * (totalResearchPointBeforeUpdate - pointsForCurRank)) / pointsBetweenCurrentAndNextRank; + } + + if (pointsForNextRank > totalResearchPointAfterUpdate) + { + percentToNextRankAfterUpdate = 0; + if (pointsBetweenCurrentAndNextRank > 0 && totalResearchPointAfterUpdate > pointsForCurRank) + percentToNextRankAfterUpdate = (100 * (totalResearchPointAfterUpdate - pointsForCurRank)) / pointsBetweenCurrentAndNextRank; + } + } + + // Set output + outInfo = new PokedexUpdateInfo8a + { + ProgressPokeNum = numPokesWithNewlyCompletedTasks, + ProgressNum = tasksReported, + PointsGainedFromProgressPoke = pointsGainedFromCompletingPokeTasks, + NewCompleteResearchNum = newlyCompleteResearchCount, + PointsGainedFromCompleteResearch = 100 * newlyCompleteResearchCount, + TotalResearchPointBeforeUpdate = totalResearchPointBeforeUpdate, + TotalResearchPointAfterUpdate = totalResearchPointAfterUpdate, + RankBeforeUpdate = uRankBeforeUpdate, + PointsNeededForNextRankBeforeUpdate = pointsNeededForNextRankBeforeUpdate, + PointsNeededForNextRankAfterUpdate = pointsNeededForNextRankAfterUpdate, + ProgressPercentToNextRankBeforeUpdate = percentToNextRankBeforeUpdate, + ProgressPercentToNextRankAfterUpdate = percentToNextRankAfterUpdate, + TotalResearchPointAfterUpdate_Duplicate = totalResearchPointAfterUpdate, + }; + + // Update total research point + SaveData.SetTotalResearchPoint(Math.Min(totalResearchPointAfterUpdate, 99999)); + } + + public int GetAllPokeResearchPoint() + { + var allPokeResearchPoint = 0; + + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + // Only return pokemon with all required tasks complete + if (!IsAllRequiredTasksComplete(species)) + continue; + + // On hitting 100 points/rate, 100 bonus points are awarded for completion + var rate = GetPokeResearchRate(species); + if (rate >= 100) + rate = 200; + + allPokeResearchPoint += rate; + } + + return allPokeResearchPoint; + } + + public int GetTotalResearchPoint() => SaveData.GetTotalResearchPoint(); + + public int GetResearchTaskLevel(int species, int taskIndex, out int reportedLevel, out int curValue, out int unreportedLevel) + { + // Default to all zeroes + reportedLevel = 0; + curValue = 0; + unreportedLevel = 0; + + // If no tasks, don't continue. + if (!TryGetResearchTasks(species, out var tasks)) + return unreportedLevel - reportedLevel; + + // Check that task is in bounds + if ((uint)taskIndex >= tasks.Length) + throw new ArgumentOutOfRangeException(nameof(taskIndex)); + + // Get the species research entry + var speciesEntry = SaveData.GetResearchEntry(species); + + // Get the task parameter. + var task = tasks[taskIndex]; + curValue = GetCurrentResearchLevel(species, task, speciesEntry); + + // Get reported level. + reportedLevel = speciesEntry.GetReportedResearchProgress(taskIndex); + if (reportedLevel == 0) + reportedLevel = 1; + + // Get the unreported level + unreportedLevel = 1; + foreach (var levelThreshold in task.TaskThresholds) + { + if (curValue < levelThreshold) + break; + unreportedLevel++; + } + + // NOTE: Game does not do this, but they have monotonic increase of value. + if (unreportedLevel < reportedLevel) + unreportedLevel = reportedLevel; + + return unreportedLevel - reportedLevel; + } + + private int GetCurrentResearchLevel(int species, PokedexResearchTask8a task, PokedexSaveResearchEntry speciesEntry) => task.Task switch + { + ObtainForms => GetObtainedFormCounts(species), + PartOfArceus => GetPartOfArceusValue(task.Hash_08), + SpeciesQuest => (GetSpeciesQuestState(task.Hash_06) == 0xFF) ? 1 : 0, + _ => speciesEntry.GetCurrentResearchLevel(task.Task, task.Index), + }; + + // Find all forms obtained (including gender variants) + public int GetObtainedFormCounts(int species, int overridePack = -1) + { + int count = 0; + var formCount = Personal[species].FormCount; + for (var form = 0; form < formCount; form++) + { + var index = Array.BinarySearch(PokedexConstants8a.PokemonInfoIds, (ushort)(species | (form << 11))); + if (index < 0) + continue; + + if (!SaveData.TryGetStatisticsEntry(species, form, out var statEntry)) + continue; + + var obtainFlags = statEntry.ObtainFlags; + if (overridePack >= 0 && form == (overridePack & 0xFF)) + obtainFlags = (byte)(overridePack >> 16); + + var g0 = (obtainFlags & 0x55) != 0; + var g1 = (obtainFlags & 0xAA) != 0; + + var genderPack = PokedexConstants8a.PokemonInfoGenders[index]; + if ((genderPack & (1 << 0)) != 0 && g0) count++; + if ((genderPack & (1 << 1)) != 0 && g1) count++; + if ((genderPack & (1 << 2)) != 0 && g0) count++; + if ((genderPack & (1 << 3)) != 0 && (g0 || g1)) count++; + if ((genderPack & (1 << 4)) != 0 && g0) count++; + if ((genderPack & (1 << 5)) != 0 && g1) count++; + } + return count; + } + + public static bool HasMultipleGenders(int species) + { + var formCount = Personal[species].FormCount; + for (var form = 0; form < formCount; form++) + { + var index = Array.BinarySearch(PokedexConstants8a.PokemonInfoIds, (ushort)(species | (form << 11))); + if (index < 0) + continue; + + var genderPack = PokedexConstants8a.PokemonInfoGenders[index]; + if ((genderPack & 0x0B) != 0) + return true; + } + + return false; + } + + private void UpdateAllCompleteFlags() + { + var hisuiComplete = true; + var hisuiPerfect = true; + Span localComplete = stackalloc bool[] { true, true, true, true, true }; + Span localPerfect = stackalloc bool[] { true, true, true, true, true }; + + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + var dexHisui = GetDexIndex(Hisui, species); + if (dexHisui == DexInvalid) + continue; + + var dexLocal1 = GetDexIndex(Local1, species); + var dexLocal2 = GetDexIndex(Local2, species); + var dexLocal3 = GetDexIndex(Local3, species); + var dexLocal4 = GetDexIndex(Local4, species); + var dexLocal5 = GetDexIndex(Local5, species); + + if (!IsComplete(species)) + { + hisuiComplete = false; + if (dexLocal1 != DexInvalid) localComplete[0] = false; + if (dexLocal2 != DexInvalid) localComplete[1] = false; + if (dexLocal3 != DexInvalid) localComplete[2] = false; + if (dexLocal4 != DexInvalid) localComplete[3] = false; + if (dexLocal5 != DexInvalid) localComplete[4] = false; + } + + if (!IsPerfect(species)) + { + hisuiPerfect = false; + if (dexLocal1 != DexInvalid) localPerfect[0] = false; + if (dexLocal2 != DexInvalid) localPerfect[1] = false; + if (dexLocal3 != DexInvalid) localPerfect[2] = false; + if (dexLocal4 != DexInvalid) localPerfect[3] = false; + if (dexLocal5 != DexInvalid) localPerfect[4] = false; + } + } + + // Set hisui/local complete/perfect flags. + if (hisuiComplete) SaveData.SetPokedexCompleted(Hisui); + if (localComplete[0]) SaveData.SetPokedexCompleted(Local1); + if (localComplete[1]) SaveData.SetPokedexCompleted(Local2); + if (localComplete[2]) SaveData.SetPokedexCompleted(Local3); + if (localComplete[3]) SaveData.SetPokedexCompleted(Local4); + if (localComplete[4]) SaveData.SetPokedexCompleted(Local5); + + if (hisuiPerfect) SaveData.SetPokedexPerfect(Hisui); + if (localPerfect[0]) SaveData.SetPokedexPerfect(Local1); + if (localPerfect[1]) SaveData.SetPokedexPerfect(Local2); + if (localPerfect[2]) SaveData.SetPokedexPerfect(Local3); + if (localPerfect[3]) SaveData.SetPokedexPerfect(Local4); + if (localPerfect[4]) SaveData.SetPokedexPerfect(Local5); + } + + public static int GetResearchPoint(int rank) + { + if ((uint)rank >= PokedexConstants8a.ResearchPointsForRank.Length) + return 0; + + return PokedexConstants8a.ResearchPointsForRank[rank]; + } + + public int GetCurrentReportCounter() => SaveData.GetReportCounter(); + + public void SetPokeSeenInWild(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + SetPokeHasBeenUpdated(pk.Species); + + SetPokeSeenInWildImpl(pk); + } + + public void SetPokeHasBeenUpdated(int species) + { + if ((uint)species >= MAX_SPECIES) + return; + + var entry = SaveData.GetResearchEntry(species); + entry.HasEverBeenUpdated = true; + + if (entry.UpdateCounter == 0) + entry.UpdateCounter = SaveData.NextUpdateCounter(); + } + + private void SetPokeSeenInWildImpl(PKM pk) + { + if (pk.IsEgg) + return; + + if (!SaveData.TryGetStatisticsEntry(pk, out var statEntry, out var shift)) + return; + + statEntry.SeenInWildFlags |= (byte)(1 << shift); + + if (GetPokeGetCount(pk.Species) == 0) + SetSelectedGenderForm(pk); + } + + private void IncreaseResearchTaskProgress(int species, PokedexResearchTaskType8a task, ushort delta, bool doIncrease = true, int idx = -1) + { + // Only perform research updates for valid species + if ((uint)species >= MAX_SPECIES) + return; + + // All research increases set the update flag whether or not they increment the value + SetPokeHasBeenUpdated(species); + + // If we shouldn't, don't do the update + if (!doIncrease) + return; + + // Get the research entry + var researchEntry = SaveData.GetResearchEntry(species); + + // Increase the research value + researchEntry.IncreaseCurrentResearchLevel(task, idx, delta); + } + + public bool GetResearchTaskProgressByForce(int species, PokedexResearchTaskType8a type, int idx, out int curValue) + { + curValue = 0; + + if ((uint)species >= MAX_SPECIES) + return false; + + // Get the species research value + curValue = SaveData.GetResearchEntry(species).GetCurrentResearchLevel(type, idx); + return true; + } + + public void SetResearchTaskProgressByForce(int species, PokedexResearchTaskType8a task, int value, int idx) + { + // Only perform research updates for valid species + if ((uint)species >= MAX_SPECIES) + return; + + // All research increases set the update flag whether or not they increment the value + SetPokeHasBeenUpdated(species); + + // Get the research entry + var researchEntry = SaveData.GetResearchEntry(species); + + // Set the research value + researchEntry.SetCurrentResearchLevel(task, idx, value); + } + + public void SetResearchTaskProgressByForce(int species, PokedexResearchTask8a task, int value) + => SetResearchTaskProgressByForce(species, task.Task, value, task.Index); + + private void IncrementResearchTaskProgress(int species, PokedexResearchTaskType8a task, bool doIncrease = true, int idx = -1) + => IncreaseResearchTaskProgress(species, task, 1, doIncrease, idx); + + public bool HasPokeEverBeenUpdated(int species) + { + if ((uint)species >= MAX_SPECIES) + return false; + + return SaveData.GetResearchEntry(species).HasEverBeenUpdated; + } + + public byte GetPokeSeenInWildFlags(int species, int form) => SaveData.TryGetStatisticsEntry(species, form, out var statEntry) ? statEntry.SeenInWildFlags : (byte)0; + public byte GetPokeObtainFlags(int species, int form) => SaveData.TryGetStatisticsEntry(species, form, out var statEntry) ? statEntry.ObtainFlags : (byte)0; + public byte GetPokeCaughtInWildFlags(int species, int form) => SaveData.TryGetStatisticsEntry(species, form, out var statEntry) ? statEntry.CaughtInWildFlags : (byte)0; + + public void SetPokeSeenInWildFlags(int species, int form, byte flags) + { + if (SaveData.TryGetStatisticsEntry(species, form, out var statEntry)) + { + statEntry.SeenInWildFlags = flags; + } + } + public void SetPokeObtainFlags(int species, int form, byte flags) + { + if (SaveData.TryGetStatisticsEntry(species, form, out var statEntry)) + { + statEntry.ObtainFlags = flags; + } + } + public void SetPokeCaughtInWildFlags(int species, int form, byte flags) + { + if (SaveData.TryGetStatisticsEntry(species, form, out var statEntry)) + { + statEntry.CaughtInWildFlags = flags; + } + } + + public bool HasAnyPokeSeenInWildFlags(int species, int form) => GetPokeSeenInWildFlags(species, form) != 0; + + public bool HasAnyPokeObtainFlags(int species, int form) => GetPokeObtainFlags(species, form) != 0; + + public bool HasAnyPokeCaughtInWildFlags(int species, int form) => GetPokeCaughtInWildFlags(species, form) != 0; + + public int GetSelectedForm(int species) + { + if ((uint)species >= MAX_SPECIES) + return 0; + + return SaveData.GetResearchEntry(species).SelectedForm; + } + + public bool GetSelectedAlpha(int species) + { + if ((uint)species >= MAX_SPECIES) + return false; + + return SaveData.GetResearchEntry(species).SelectedAlpha; + } + + public bool GetSelectedShiny(int species) + { + if ((uint)species >= MAX_SPECIES) + return false; + + return SaveData.GetResearchEntry(species).SelectedShiny; + } + + public bool GetSelectedGender1(int species) + { + if ((uint)species >= MAX_SPECIES) + return false; + + return SaveData.GetResearchEntry(species).SelectedGender1; + } + + public void OnPokeEvolve(PKM pk, int fromSpecies) + { + OnPokeEvolved(fromSpecies, pk.Species); + OnPokeGet_NoSpecialCatch(pk); + } + public void OnPokeGet_Caller1(PKM pk) + { + // 1.0.1: sub_7101283760 + // Is this on receiving an egg? + + // var metLoc = pk.Met_Location; + // if (!GetCurrentTime()) + // return; + // SetMetOrEggLocation(pk, metLoc, calendarTime); + // if (Unknown(pk) == 3) + // return; + + OnPokeGet_NoSpecialCatch(pk); + } + + public void OnPokeGet_Trade(PKM pk, PKM evoPk) + { + // 1.0.1: sub_71026A34B4 + + // Get the un-evolved trade receive poke + if (pk.Species == 0 || pk.IsEgg) + return; + OnPokeGet_NoSpecialCatch(pk); + + // Get the trade-evolved trade receive poke + if (evoPk.Species == 0 || evoPk.IsEgg) + return; + OnPokeEvolved(pk.Species, evoPk.Species); + OnPokeGet_NoSpecialCatch(pk); + } + + public void OnPokeGet_TradeWithoutEvolution(PKM pk) + { + // This isn't a real caller, but more convenient than making a fake species-0 evo result? + if (pk.Species == 0 || pk.IsEgg) + return; + OnPokeGet_NoSpecialCatch(pk); + } + + public void OnPokeGet_NoSpecialCatch(PKM pk) + => OnPokeGet(pk, sleeping: false, inAir: false, notSpotted: false, skipCaughtAtTime: true, timeOfDay: PokedexTimeOfDay8a.Invalid, caught: false); + + public void OnPokeGet(PKM pk, bool sleeping, bool inAir, bool notSpotted, bool skipCaughtAtTime, PokedexTimeOfDay8a timeOfDay, bool caught) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + var pa8 = (PA8)pk; + + // Normal species obtained + OnPokeObtained(pk.Species); + + // Alpha potentially obtained + OnPokeAlphaCaught(pk.Species, pa8.IsAlpha); + + // Large poke potentially obtained + OnPokeLargeCaught(pk.Species, pa8.HeightAbsolute); + + // Small poke potentially obtained + OnPokeSmallCaught(pk.Species, pa8.HeightAbsolute); + + // Heavy poke potentially obtained + OnPokeHeavyCaught(pk.Species, pa8.WeightAbsolute); + + // Light poke potentially obtained + OnPokeLightCaught(pk.Species, pa8.WeightAbsolute); + + // Handle if pokemon was caught while sleeping + if (sleeping) + OnPokeCaughtSleeping(pk.Species); + + // Handle if pokemon was caught while in the air + if (inAir) + OnPokeCaughtInAir(pk.Species); + + // Handle if pokemon was caught while not spotted + if (notSpotted) + OnPokeCaughtNotSpotted(pk.Species); + + // Handle time of day, if not invalid + if (!skipCaughtAtTime && timeOfDay != PokedexTimeOfDay8a.Invalid) + OnPokeCaughtAtTime(pk.Species, timeOfDay); + + // Process remaining logic for obtaining poke + SetPokeObtained(pk, caught); + } + + private void OnPokeObtained(int species) => IncrementResearchTaskProgress(species, Catch); + + private void OnPokeAlphaCaught(int species, bool alpha) => IncrementResearchTaskProgress(species, CatchAlpha, alpha); + + private void OnPokeLargeCaught(int species, float height) => IncrementResearchTaskProgress(species, CatchLarge, IsPokeLarge(species, height)); + + private void OnPokeSmallCaught(int species, float height) => IncrementResearchTaskProgress(species, CatchSmall, IsPokeSmall(species, height)); + private void OnPokeHeavyCaught(int species, float weight) => IncrementResearchTaskProgress(species, CatchHeavy, IsPokeHeavy(species, weight)); + private void OnPokeLightCaught(int species, float weight) => IncrementResearchTaskProgress(species, CatchLight, IsPokeLight(species, weight)); + + public static bool IsPokeLarge(int species, float height) => TryGetTriggeredTask(species, CatchLarge, out var task) && height >= task.Threshold; + public static bool IsPokeSmall(int species, float height) => TryGetTriggeredTask(species, CatchSmall, out var task) && height <= task.Threshold; + public static bool IsPokeHeavy(int species, float weight) => TryGetTriggeredTask(species, CatchHeavy, out var task) && weight >= (task.Threshold / 10.0); + public static bool IsPokeLight(int species, float weight) => TryGetTriggeredTask(species, CatchLight, out var task) && weight <= (task.Threshold / 10.0); + + private void OnPokeCaughtSleeping(int species) => IncrementResearchTaskProgress(species, CatchSleeping); + + private void OnPokeCaughtInAir(int species) => IncrementResearchTaskProgress(species, CatchInAir); + + private void OnPokeCaughtNotSpotted(int species) => IncrementResearchTaskProgress(species, CatchNotSpotted); + private void OnPokeCaughtAtTime(int species, PokedexTimeOfDay8a timeOfDay) => IncrementResearchTaskProgress(species, CatchAtTime, CanUpdateCatchAtTime(species, timeOfDay)); + + public static bool CanUpdateCatchAtTime(int species, PokedexTimeOfDay8a timeOfDay) => TryGetTriggeredTask(species, timeOfDay, out var task) && task.TimeOfDay != PokedexTimeOfDay8a.Invalid; + + public int GetTotalGetAnyDexCount() + { + var count = 0; + for (var species = 1; species <= Personal.MaxSpeciesID; species++) + { + if (GetPokeGetCount(species) > 0) + count++; + } + return count; + } + + public bool IsNewUnreportedPoke(int species) + { + if ((uint)species >= MAX_SPECIES) + return false; + + var researchEntry = SaveData.GetResearchEntry(species); + return researchEntry.NumObtained != 0 && !researchEntry.HasAnyReport; + } + + public void OnPokeDefeated(PKM pk, MoveType moveType) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeDefeated(pk.Species); + OnPokeDefeatedWithMoveType(pk.Species, moveType); + } + + public void OnPokeDefeated(PKM pk) => OnPokeDefeated(pk, MoveType.Any); + + private void OnPokeDefeated(int species) => IncrementResearchTaskProgress(species, Defeat); + + private void OnPokeDefeatedWithMoveType(int species, MoveType moveType) + => IncrementResearchTaskProgress(species, DefeatWithMoveType, TryGetTriggeredTask(species, moveType, out var task), task.Index); + + public void OnPokeUseMove(PKM pk, int move) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeUseMove(pk.Species, move); + } + + private void OnPokeUseMove(int species, int move) + => IncrementResearchTaskProgress(species, UseMove, TryGetTriggeredTask(species, move, out var task), task.Index); + + public void OnPokeEvolved(int fromSpecies, int toSpecies) + { + OnPokeEvolved(fromSpecies); + OnPokeEvolved(toSpecies); + } + + private void OnPokeEvolved(int species) => IncrementResearchTaskProgress(species, Evolve); + + public void OnPokeGivenFood(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeGivenFood(pk.Species); + } + + private void OnPokeGivenFood(int species) => IncrementResearchTaskProgress(species, GiveFood); + + public void OnPokeStunnedWithItem(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeStunnedWithItem(pk.Species); + } + + private void OnPokeStunnedWithItem(int species) => IncrementResearchTaskProgress(species, StunWithItems); + + public void OnPokeScaredWithScatterBang(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeScaredWithScatterBang(pk.Species); + } + + private void OnPokeScaredWithScatterBang(int species) => IncrementResearchTaskProgress(species, ScareWithScatterBang); + + public void OnPokeLuredWithPokeshiDoll(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeLuredWithPokeshiDoll(pk.Species); + } + + private void OnPokeLuredWithPokeshiDoll(int species) => IncrementResearchTaskProgress(species, LureWithPokeshiDoll); + + public void OnPokeUseStrongStyleMove(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeUseStrongStyleMove(pk.Species); + } + + private void OnPokeUseStrongStyleMove(int species) => IncrementResearchTaskProgress(species, UseStrongStyleMove); + + public void OnPokeUseAgileStyleMove(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeUseAgileStyleMove(pk.Species); + } + + private void OnPokeUseAgileStyleMove(int species) => IncrementResearchTaskProgress(species, UseAgileStyleMove); + + public void OnPokeLeapFromTree(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeLeapFromTree(pk.Species); + } + + private void OnPokeLeapFromTree(int species) => IncrementResearchTaskProgress(species, LeapFromTrees); + public void OnPokeLeapFromLeaves(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeLeapFromLeaves(pk.Species); + } + + private void OnPokeLeapFromLeaves(int species) => IncrementResearchTaskProgress(species, LeapFromLeaves); + public void OnPokeLeapFromSnow(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeLeapFromSnow(pk.Species); + } + + private void OnPokeLeapFromSnow(int species) => IncrementResearchTaskProgress(species, LeapFromSnow); + public void OnPokeLeapFromOre(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeLeapFromOre(pk.Species); + } + + private void OnPokeLeapFromOre(int species) => IncrementResearchTaskProgress(species, LeapFromOre); + public void OnPokeLeapFromTussock(PKM pk) + { + if (pk.IsEgg || IsNoblePokemon(pk.Species, pk.Form)) + return; + + OnPokeLeapFromTussock(pk.Species); + } + + private void OnPokeLeapFromTussock(int species) => IncrementResearchTaskProgress(species, LeapFromTussocks); + + public bool IsAllRequiredTasksComplete(int species) + { + if (!TryGetResearchTasks(species, out var tasks)) + return true; + + for (var i = 0; i < tasks.Length; i++) + { + if (!tasks[i].RequiredForCompletion) + continue; + GetResearchTaskLevel(species, i, out var reportedLevel, out _, out _); + if (reportedLevel < 2) + return false; + } + + return true; + } + + public void SetPokeSeenInWildAndObtained(PKM pk, bool caught) + { + SetPokeSeenInWildImpl(pk); + + if (!pk.IsEgg) + SetPokeObtained(pk, caught); + } + + private int GetPartOfArceusValue(ulong hash) + { + if (hash == 0xCBF29CE484222645) + return 0; + + return (int)(uint)SaveFile.Accessor.GetBlockValue((uint)(hash & 0xFFFFFFFF)); + } + + private int GetSpeciesQuestState(ulong hash) + { + if (hash is 0xC0EA47549AB5F3D9 or 0xCBF29CE484222645) + return 0; + + // These are single-byte blocks, but type is "object"... + return SaveFile.Accessor.GetBlock((uint)(hash & 0xFFFFFFFF)).Data[0]; + } + + public static bool IsAnyTaskTriggered(int species, PokedexResearchTaskType8a which, MoveType moveType, int move, PokedexTimeOfDay8a timeOfDay) + => TryGetTriggeredTask(species, which, moveType, move, timeOfDay, out _); + + public static int GetTriggeredTaskFinalThreshold(int species, PokedexResearchTaskType8a which, MoveType moveType, int move, PokedexTimeOfDay8a timeOfDay) + { + if (!TryGetTriggeredTask(species, which, moveType, move, timeOfDay, out var task)) + return 0; + + return task.TaskThresholds[^1]; + } + + private static bool TryGetTriggeredTask(int species, PokedexResearchTaskType8a which, out PokedexResearchTask8a outTask) + => TryGetTriggeredTask(species, which, MoveType.Any, -1, PokedexTimeOfDay8a.Invalid, out outTask); + private static bool TryGetTriggeredTask(int species, MoveType moveType, out PokedexResearchTask8a outTask) + => TryGetTriggeredTask(species, DefeatWithMoveType, moveType, -1, PokedexTimeOfDay8a.Invalid, out outTask); + private static bool TryGetTriggeredTask(int species, int move, out PokedexResearchTask8a outTask) + => TryGetTriggeredTask(species, UseMove, MoveType.Any, move, PokedexTimeOfDay8a.Invalid, out outTask); + private static bool TryGetTriggeredTask(int species, PokedexTimeOfDay8a timeOfDay, out PokedexResearchTask8a outTask) + => TryGetTriggeredTask(species, CatchAtTime, MoveType.Any, -1, timeOfDay, out outTask); + + private static bool TryGetTriggeredTask(int species, PokedexResearchTaskType8a which, MoveType moveType, int move, PokedexTimeOfDay8a timeOfDay, out PokedexResearchTask8a outTask) + { + outTask = new PokedexResearchTask8a(); + + if (!TryGetResearchTasks(species, out var tasks)) + return false; + + foreach (var task in tasks) + { + if (task.Task != which) + continue; + + var isTriggeredTask = task.Task switch + { + UseMove => task.Move == move, + DefeatWithMoveType => task.Type == moveType, + CatchAtTime => task.TimeOfDay == timeOfDay, + _ => true, + }; + + if (!isTriggeredTask) + continue; + + outTask = task; + return true; + } + + return false; + } + + public void SetSelectedGenderForm(PKM pk) => SetSelectedGenderForm(pk.Species, pk.Form, pk.Gender == 1, pk.IsShiny, ((PA8)pk).IsAlpha); + + public void SetSelectedGenderForm(int species, int form, bool gender1, bool shiny, bool alpha) + { + if ((uint)species >= MAX_SPECIES || (uint)form >= MAX_FORM) + return; + + var speciesEntry = SaveData.GetResearchEntry(species); + + var pokeInfoIndex = Array.BinarySearch(PokedexConstants8a.PokemonInfoIds, (ushort)(species | (form << 11))); + if (pokeInfoIndex >= 0 && (PokedexConstants8a.PokemonInfoGenders[pokeInfoIndex] & (1 << 3)) != 0) + { + var g0 = false; + var g1 = false; + + if (SaveData.TryGetStatisticsEntry(species, form, out var statEntry)) + { + var flags = (speciesEntry.NumObtained > 0) ? statEntry.ObtainFlags : statEntry.SeenInWildFlags; + + var ofs = (shiny ? 4 : 0) + (alpha ? 2 : 0); + + g0 = (flags & (1 << (ofs + 0))) != 0; + g1 = (flags & (1 << (ofs + 1))) != 0; + } + + if (gender1) + gender1 = !g0 || g1; + else + gender1 = !g0 && g1; + } + + speciesEntry.SelectedGender1 = gender1; + speciesEntry.SelectedShiny = shiny; + speciesEntry.SelectedAlpha = alpha; + speciesEntry.SelectedForm = (byte)form; + } + + private void SetPokeObtained(PKM pk, bool caught) + { + if (pk.IsEgg) + return; + + // Get statistics entry + if (!SaveData.TryGetStatisticsEntry(pk, out var statEntry, out var shift)) + return; + + var pa8 = (PA8)pk; + + // Update statistics if not alpha + if (!pa8.IsAlpha) + { + if ((statEntry.ObtainFlags & 0x33) != 0) + { + if (statEntry.HasMaximumStatistics) + { + // We have previous max stats, so update max stats + statEntry.MaxHeight = Math.Max(pa8.HeightAbsolute, statEntry.MaxHeight); + statEntry.MaxWeight = Math.Max(pa8.WeightAbsolute, statEntry.MaxWeight); + } + else + { + // We have no previous max stats, so set initial max stats + statEntry.MaxHeight = Math.Max(pa8.HeightAbsolute, statEntry.MinHeight); + statEntry.MaxWeight = Math.Max(pa8.WeightAbsolute, statEntry.MinWeight); + statEntry.HasMaximumStatistics = true; + } + + // Update min stats + statEntry.MinHeight = Math.Min(pa8.HeightAbsolute, statEntry.MinHeight); + statEntry.MinWeight = Math.Min(pa8.WeightAbsolute, statEntry.MinWeight); + } + else + { + // If nothing previously obtained, just set min height/weight + statEntry.MinHeight = pa8.HeightAbsolute; + statEntry.MinWeight = pa8.WeightAbsolute; + } + } + + // Update obtain flags + statEntry.ObtainFlags |= (byte)(1u << shift); + if (caught) + statEntry.CaughtInWildFlags |= (byte)(1u << shift); + + // If the poke is new to our dex/unreported, update the selected icon + if (IsNewUnreportedPoke(pk.Species)) + SetSelectedGenderForm(pk); + } + + public void SetGlobalField04(byte v) => SaveData.SetGlobalField04(v); + public byte GetGlobalField04() => SaveData.GetGlobalField04(); + + public void SetLocalField03(PokedexType8a which, byte v) + { + if (IsLocalDex(which)) + SaveData.SetLocalField03(GetLocalDexIndex(which), v); + } + + public byte GetLocalField03(PokedexType8a which) + { + if (IsLocalDex(which)) + return SaveData.GetLocalField03(GetLocalDexIndex(which)); + else + return 0; + } + + public void GetLocalParameters(PokedexType8a which, out byte outField02, out ushort outField00, out uint outField04, out uint outField08, out ushort outField0C) + { + // Unclear what these are (they don't ever seem to be set unless code has been missed)? + // This is called by a func with "pane_N_detail_00", "list_panel" strings in code. + if (IsLocalDex(which)) + { + SaveData.GetLocalParameters(GetLocalDexIndex(which), out outField02, out outField00, out outField04, out outField08, out outField0C); + } + else + { + outField02 = 0; + outField00 = 0; + outField04 = 0; + outField08 = 0; + outField0C = 0; + } + } + + public void SetGlobalFormField(int form) + { + if (form < MAX_FORM) + SaveData.SetGlobalFormField(form); + } + + public int GetGlobalFormField() => SaveData.GetGlobalFormField(); + + public bool HasFormStorage(int species, int form) => SaveData.TryGetStatisticsEntry(species, form, out _); + + public bool IsBlacklisted(int species, int form) => IsNoblePokemon(species, form); + + public bool GetSizeStatistics(int species, int form, out bool hasMax, out float minHeight, out float maxHeight, out float minWeight, out float maxWeight) + { + hasMax = false; + minHeight = 0; + maxHeight = 0; + minWeight = 0; + maxWeight = 0; + + if (!SaveData.TryGetStatisticsEntry(species, form, out var entry)) + return false; + + hasMax = entry.HasMaximumStatistics; + minHeight = entry.MinHeight; + maxHeight = entry.HasMaximumStatistics ? entry.MaxHeight : entry.MinHeight; + minWeight = entry.MinWeight; + maxWeight = entry.HasMaximumStatistics ? entry.MaxWeight : entry.MinWeight; + + return true; + } + + public void SetSizeStatistics(int species, int form, bool hasMax, float minHeight, float maxHeight, float minWeight, float maxWeight) + { + if (minHeight < 0) + minHeight = 0; + if (minWeight < 0) + minWeight = 0; + + if (maxHeight < minHeight || !hasMax) + maxHeight = minHeight; + if (maxWeight < minWeight || !hasMax) + maxWeight = minWeight; + + if (!SaveData.TryGetStatisticsEntry(species, form, out var entry)) + return; + + entry.HasMaximumStatistics = hasMax; + entry.MinHeight = minHeight; + entry.MaxHeight = maxHeight; + entry.MinWeight = minWeight; + entry.MaxWeight = maxWeight; + + if (minWeight != 0 || maxWeight != 0 || minHeight != 0 || maxHeight != 0) + SetPokeHasBeenUpdated(species); + } + + public static bool IsNoblePokemon(int species, int form) => form switch + { + 1 => species == 900, + 2 => species is 59 or 101 or 549 or 713, + _ => false, + }; + + private static int GetLocalDexIndex(PokedexType8a which) => which switch + { + Local1 => 0, + Local2 => 1, + Local3 => 2, + Local4 => 3, + Local5 => 4, + _ => throw new ArgumentOutOfRangeException(nameof(which)), + }; + + private static bool IsLocalDex(PokedexType8a which) => which switch + { + Local1 => true, + Local2 => true, + Local3 => true, + Local4 => true, + Local5 => true, + _ => false, + }; + + private static bool TryGetResearchTasks(int species, [NotNullWhen(true)] out PokedexResearchTask8a[]? tasks) + { + var dexIndex = GetDexIndex(Hisui, species); + if (dexIndex == DexInvalid) + { + tasks = null; + return false; + } + + tasks = PokedexConstants8a.ResearchTasks[dexIndex - 1]; + return true; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveData.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveData.cs new file mode 100644 index 00000000000..5d3374193e3 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveData.cs @@ -0,0 +1,135 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Represents direct manipulation and access for Pokédex entries. +/// +public class PokedexSaveData +{ + private readonly PokedexSaveGlobalData GlobalData; + private readonly PokedexSaveLocalData[] LocalData; + private readonly PokedexSaveResearchEntry[] ResearchEntries; + private readonly PokedexSaveStatisticsEntry[] StatisticsEntries; + + public const int POKEDEX_SAVE_DATA_SIZE = 0x1E460; + + public const int STATISTICS_ENTRIES_MAX = 1480; + + public PokedexSaveData(byte[] data) + { + if (data.Length != POKEDEX_SAVE_DATA_SIZE) + throw new ArgumentException($"Unexpected {nameof(PokedexSaveData)} block size!"); + + GlobalData = new PokedexSaveGlobalData(data, 0); + + LocalData = new PokedexSaveLocalData[5]; + for (var i = 0; i < LocalData.Length; i++) + LocalData[i] = new PokedexSaveLocalData(data, 0x10 + (0x10 * i)); + + ResearchEntries = new PokedexSaveResearchEntry[PokedexSave8a.MAX_SPECIES]; + for (var i = 0; i < ResearchEntries.Length; i++) + ResearchEntries[i] = new PokedexSaveResearchEntry(data, 0x70 + (0x58 * i)); + + StatisticsEntries = new PokedexSaveStatisticsEntry[STATISTICS_ENTRIES_MAX]; + for (var i = 0; i < StatisticsEntries.Length; i++) + StatisticsEntries[i] = new PokedexSaveStatisticsEntry(data, 0x151A8 + (0x18 * i)); + } + + public bool IsPokedexCompleted(PokedexType8a which) => (GlobalData.Flags & (which < PokedexType8a.Count ? (1 << (int)which) : 1)) != 0; + public bool IsPokedexPerfect(PokedexType8a which) => (GlobalData.Flags & ((which < PokedexType8a.Count ? (1 << (int)which) : 1) << 6)) != 0; + + public void SetPokedexCompleted(PokedexType8a which) => GlobalData.Flags |= (uint)(which < PokedexType8a.Count ? (1 << (int)which) : 1); + public void SetPokedexPerfect(PokedexType8a which) => GlobalData.Flags |= (uint)((which < PokedexType8a.Count ? (1 << (int)which) : 1) << 6); + + public PokedexSaveResearchEntry GetResearchEntry(int species) => ResearchEntries[species]; + + public bool TryGetStatisticsEntry(int species, int form, out PokedexSaveStatisticsEntry entry) + { + var fstIdIndex = Array.BinarySearch(PokedexConstants8a.FormStorageIndexIds, (ushort)(species | (form << 11))); + if (fstIdIndex >= 0) + { + entry = StatisticsEntries[PokedexConstants8a.FormStorageIndexValues[fstIdIndex]]; + return true; + } + else + { + entry = new PokedexSaveStatisticsEntry(new byte[0x18], 0); + return false; + } + } + + public bool TryGetStatisticsEntry(PKM pk, out PokedexSaveStatisticsEntry entry, out int shift) + { + shift = 0; + if (pk.IsShiny) + shift += 4; + if (((IAlpha)pk).IsAlpha) + shift += 2; + if ((pk.Gender & ~2) != 0) + shift++; + + return TryGetStatisticsEntry(pk.Species, pk.Form, out entry); + } + + public int GetPokeGetCount(int species) => GetResearchEntry(species).NumObtained; + public int GetPokeResearchRate(int species) => GetResearchEntry(species).ResearchRate; + + public ushort NextUpdateCounter() + { + var curCounter = GlobalData.UpdateCounter; + if (curCounter < PokedexConstants8a.MaxPokedexResearchPoints) + GlobalData.UpdateCounter = (ushort)(curCounter + 1); + + return curCounter; + } + + public void IncrementReportCounter() + { + var reportCounter = GlobalData.ReportCounter; + + // If we need to re-set the counter, reset all species counters + if (reportCounter >= PokedexConstants8a.MaxPokedexResearchPoints) + { + foreach (var entry in ResearchEntries) + { + if (entry.LastUpdatedReportCounter != 0) + entry.LastUpdatedReportCounter = 1; + } + + reportCounter = 1; + } + + GlobalData.ReportCounter = (ushort)(reportCounter + 1); + } + + public ushort GetReportCounter() => GlobalData.ReportCounter; + + public int GetTotalResearchPoint() => GlobalData.TotalResearchPoints; + + public void SetTotalResearchPoint(int tp) => GlobalData.TotalResearchPoints = tp; + + public bool HasAnyReport(int species) => GetResearchEntry(species).HasAnyReport; + public bool IsPerfect(int species) => GetResearchEntry(species).IsPerfect; + + public void SetGlobalField04(byte v) => GlobalData.Field_04 = v; + public byte GetGlobalField04() => GlobalData.Field_04; + + public void SetLocalField03(int idx, byte v) => LocalData[idx].Field_03 = v; + + public byte GetLocalField03(int idx) => LocalData[idx].Field_03; + + public void GetLocalParameters(int idx, out byte outField02, out ushort outField00, out uint outField04, out uint outField08, out ushort outField0C) + { + var local = LocalData[idx]; + + outField02 = local.Field_02; + outField00 = local.Field_00; + outField04 = local.Field_04; + outField08 = local.Field_08; + outField0C = local.Field_0C; + } + + public void SetGlobalFormField(int form) => GlobalData.FormField = (byte)form; + public int GetGlobalFormField() => GlobalData.FormField; +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveGlobalData.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveGlobalData.cs new file mode 100644 index 00000000000..69f811c8dc4 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveGlobalData.cs @@ -0,0 +1,24 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Revision details for the Pokédex. +/// +public class PokedexSaveGlobalData +{ + private readonly byte[] _data; + private readonly int Offset; + + public PokedexSaveGlobalData(byte[] data, int offset) => (_data, Offset) = (data, offset); + private Span Data => _data.AsSpan(Offset); + + public uint Flags { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public byte Field_04 { get => Data[4]; set => Data[4] = value; } + public byte FormField { get => Data[5]; set => Data[5] = value; } + public ushort UpdateCounter { get => ReadUInt16LittleEndian(Data[0x06..]); set => WriteUInt16LittleEndian(Data[0x06..], value); } + public ushort ReportCounter { get => ReadUInt16LittleEndian(Data[0x08..]); set => WriteUInt16LittleEndian(Data[0x08..], value); } + public ushort Field_0A { get => ReadUInt16LittleEndian(Data[0x0A..]); set => WriteUInt16LittleEndian(Data[0x0A..], value); } + public int TotalResearchPoints { get => ReadInt32LittleEndian(Data[0x0C..]); set => WriteInt32LittleEndian(Data[0x0C..], value); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveLocalData.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveLocalData.cs new file mode 100644 index 00000000000..b92b068a78d --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveLocalData.cs @@ -0,0 +1,23 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Local region (within Hisui) Pokédex structure. +/// +public class PokedexSaveLocalData +{ + private readonly byte[] _data; + private readonly int Offset; + + public PokedexSaveLocalData(byte[] data, int offset) => (_data, Offset) = (data, offset); + private Span Data => _data.AsSpan(Offset); + + public ushort Field_00 { get => ReadUInt16LittleEndian(Data); set => WriteUInt16LittleEndian(Data, value); } + public byte Field_02 { get => Data[2]; set => Data[2] = value; } + public byte Field_03 { get => Data[3]; set => Data[3] = value; } + public uint Field_04 { get => ReadUInt32LittleEndian(Data[0x04..]); set => WriteUInt32LittleEndian(Data[0x04..], value); } + public uint Field_08 { get => ReadUInt32LittleEndian(Data[0x08..]); set => WriteUInt32LittleEndian(Data[0x08..], value); } + public ushort Field_0C { get => ReadUInt16LittleEndian(Data[0x0C..]); set => WriteUInt16LittleEndian(Data[0x0C..], value); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveResearchEntry.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveResearchEntry.cs new file mode 100644 index 00000000000..cc8d92cc160 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveResearchEntry.cs @@ -0,0 +1,174 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; +using static PKHeX.Core.PokedexResearchTaskType8a; + +namespace PKHeX.Core; + +/// +/// Per-species research logs used for Pokédex entries. +/// +public class PokedexSaveResearchEntry +{ + private readonly byte[] _data; + private readonly int Offset; + + public PokedexSaveResearchEntry(byte[] data, int offset) => (_data, Offset) = (data, offset); + private Span Data => _data.AsSpan(Offset); + + public uint Flags { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public bool HasEverBeenUpdated { get => (Flags & (1u << 0)) != 0; set => Flags = (Flags & ~(1u << 0)) | ((value ? 1u : 0u) << 0); } + public bool HasAnyReport { get => (Flags & (1u << 1)) != 0; set => Flags = (Flags & ~(1u << 1)) | ((value ? 1u : 0u) << 1); } + public bool IsPerfect { get => (Flags & (1u << 2)) != 0; set => Flags = (Flags & ~(1u << 2)) | ((value ? 1u : 0u) << 2); } + public bool SelectedGender1 { get => (Flags & (1u << 3)) != 0; set => Flags = (Flags & ~(1u << 3)) | ((value ? 1u : 0u) << 3); } + public bool SelectedShiny { get => (Flags & (1u << 4)) != 0; set => Flags = (Flags & ~(1u << 4)) | ((value ? 1u : 0u) << 4); } + public bool SelectedAlpha { get => (Flags & (1u << 5)) != 0; set => Flags = (Flags & ~(1u << 5)) | ((value ? 1u : 0u) << 5); } + + private uint ReportedResearchProgress { get => ReadUInt32LittleEndian(Data[0x04..]); set => WriteUInt32LittleEndian(Data[0x04..], value); } + + public int GetReportedResearchProgress(int idx) => (int)((ReportedResearchProgress >> (3 * idx)) & 7); + public void SetReportedResearchProgress(int idx, int level) + { + var prog = ReportedResearchProgress; + prog &= ~(7u << (3 * idx)); + prog |= (uint)((level & 7u) << (3 * idx)); + ReportedResearchProgress = prog; + } + + public ushort ResearchRate { get => ReadUInt16LittleEndian(Data[0x08..]); set => WriteUInt16LittleEndian(Data[0x08..], value); } + public ushort NumObtained { get => ReadUInt16LittleEndian(Data[0x0A..]); set => WriteUInt16LittleEndian(Data[0x0A..], value); } + public ushort UpdateCounter { get => ReadUInt16LittleEndian(Data[0x0C..]); set => WriteUInt16LittleEndian(Data[0x0C..], value); } + public ushort LastUpdatedReportCounter { get => ReadUInt16LittleEndian(Data[0x0E..]); set => WriteUInt16LittleEndian(Data[0x0E..], value); } + + public ushort GetMoveUseCount(int index) + { + if (index >= 4) + return 0; + + return ReadUInt16LittleEndian(Data[(0x10 + (0x2 * index))..]); + } + + public void SetMoveUseCount(int index, ushort newCount) + { + if (index >= 4) + return; + + WriteUInt16LittleEndian(Data[(0x10 + (0x2 * index))..], newCount); + } + + public ushort GetDefeatWithMoveTypeCount(int index) + { + if (index >= 3) + return 0; + + return ReadUInt16LittleEndian(Data[(0x18 + (0x2 * index))..]); + } + + public void SetDefeatWithMoveTypeCount(int index, ushort newCount) + { + if (index >= 3) + return; + + WriteUInt16LittleEndian(Data[(0x18 + (0x2 * index))..], newCount); + } + + public ushort NumDefeated { get => ReadUInt16LittleEndian(Data[0x1E..]); set => WriteUInt16LittleEndian(Data[0x1E..], value); } + public ushort NumEvolved { get => ReadUInt16LittleEndian(Data[0x20..]); set => WriteUInt16LittleEndian(Data[0x20..], value); } + public ushort NumAlphaCaught { get => ReadUInt16LittleEndian(Data[0x22..]); set => WriteUInt16LittleEndian(Data[0x22..], value); } + public ushort NumLargeCaught { get => ReadUInt16LittleEndian(Data[0x24..]); set => WriteUInt16LittleEndian(Data[0x24..], value); } + public ushort NumSmallCaught { get => ReadUInt16LittleEndian(Data[0x26..]); set => WriteUInt16LittleEndian(Data[0x26..], value); } + public ushort NumHeavyCaught { get => ReadUInt16LittleEndian(Data[0x28..]); set => WriteUInt16LittleEndian(Data[0x28..], value); } + public ushort NumLightCaught { get => ReadUInt16LittleEndian(Data[0x2A..]); set => WriteUInt16LittleEndian(Data[0x2A..], value); } + public ushort NumCaughtAtTime { get => ReadUInt16LittleEndian(Data[0x2C..]); set => WriteUInt16LittleEndian(Data[0x2C..], value); } + public ushort NumCaughtSleeping { get => ReadUInt16LittleEndian(Data[0x2E..]); set => WriteUInt16LittleEndian(Data[0x2E..], value); } + public ushort NumCaughtInAir { get => ReadUInt16LittleEndian(Data[0x30..]); set => WriteUInt16LittleEndian(Data[0x30..], value); } + public ushort NumCaughtNotSpotted { get => ReadUInt16LittleEndian(Data[0x32..]); set => WriteUInt16LittleEndian(Data[0x32..], value); } + public ushort NumGivenFood { get => ReadUInt16LittleEndian(Data[0x34..]); set => WriteUInt16LittleEndian(Data[0x34..], value); } + public ushort NumStunnedWithItems { get => ReadUInt16LittleEndian(Data[0x36..]); set => WriteUInt16LittleEndian(Data[0x36..], value); } + public ushort NumScared { get => ReadUInt16LittleEndian(Data[0x38..]); set => WriteUInt16LittleEndian(Data[0x38..], value); } + public ushort NumLured { get => ReadUInt16LittleEndian(Data[0x3A..]); set => WriteUInt16LittleEndian(Data[0x3A..], value); } + public ushort NumStrongStyleMovesUsed { get => ReadUInt16LittleEndian(Data[0x3C..]); set => WriteUInt16LittleEndian(Data[0x3C..], value); } + public ushort NumAgileStyleMovesUsed { get => ReadUInt16LittleEndian(Data[0x3E..]); set => WriteUInt16LittleEndian(Data[0x3E..], value); } + public ushort NumLeapFromTrees { get => ReadUInt16LittleEndian(Data[0x40..]); set => WriteUInt16LittleEndian(Data[0x40..], value); } + public ushort NumLeapFromLeaves { get => ReadUInt16LittleEndian(Data[0x42..]); set => WriteUInt16LittleEndian(Data[0x42..], value); } + public ushort NumLeapFromSnow { get => ReadUInt16LittleEndian(Data[0x44..]); set => WriteUInt16LittleEndian(Data[0x44..], value); } + public ushort NumLeapFromOre { get => ReadUInt16LittleEndian(Data[0x46..]); set => WriteUInt16LittleEndian(Data[0x46..], value); } + public ushort NumLeapFromTussocks { get => ReadUInt16LittleEndian(Data[0x48..]); set => WriteUInt16LittleEndian(Data[0x48..], value); } + public ushort Field_4A { get => ReadUInt16LittleEndian(Data[0x4A..]); set => WriteUInt16LittleEndian(Data[0x4A..], value); } + public uint Field_4C { get => ReadUInt32LittleEndian(Data[0x4C..]); set => WriteUInt32LittleEndian(Data[0x4C..], value); } + public byte SelectedForm { get => Data[0x50]; set => Data[0x50] = value; } + // 51-53 padding + public uint Field_54 { get => ReadUInt32LittleEndian(Data[0x54..]); set => WriteUInt32LittleEndian(Data[0x54..], value); } + + public void IncreaseCurrentResearchLevel(PokedexResearchTaskType8a task, int idx, ushort delta) + { + SetCurrentResearchLevel(task, idx, GetCurrentResearchLevel(task, idx) + delta); + } + + public int GetCurrentResearchLevel(PokedexResearchTaskType8a task, int idx) => task switch + { + Catch => NumObtained, + UseMove => GetMoveUseCount(idx), + DefeatWithMoveType => GetDefeatWithMoveTypeCount(idx), + Defeat => NumDefeated, + Evolve => NumEvolved, + CatchAlpha => NumAlphaCaught, + CatchLarge => NumLargeCaught, + CatchSmall => NumSmallCaught, + CatchHeavy => NumHeavyCaught, + CatchLight => NumLightCaught, + CatchAtTime => NumCaughtAtTime, + CatchSleeping => NumCaughtSleeping, + CatchInAir => NumCaughtInAir, + CatchNotSpotted => NumCaughtNotSpotted, + GiveFood => NumGivenFood, + StunWithItems => NumStunnedWithItems, + ScareWithScatterBang => NumScared, + LureWithPokeshiDoll => NumLured, + UseStrongStyleMove => NumStrongStyleMovesUsed, + UseAgileStyleMove => NumAgileStyleMovesUsed, + LeapFromTrees => NumLeapFromTrees, + LeapFromLeaves => NumLeapFromLeaves, + LeapFromSnow => NumLeapFromSnow, + LeapFromOre => NumLeapFromOre, + LeapFromTussocks => NumLeapFromTussocks, + _ => throw new ArgumentOutOfRangeException(nameof(task)), + }; + + public void SetCurrentResearchLevel(PokedexResearchTaskType8a task, int idx, int value) + { + // Bound values in [0, 60000] + if (value < 0) + throw new ArgumentOutOfRangeException(nameof(value)); + + var cappedValue = (ushort)Math.Min(value, PokedexConstants8a.MaxPokedexResearchPoints); + switch (task) + { + case Catch: NumObtained = cappedValue; break; + case UseMove: SetMoveUseCount(idx, cappedValue); break; + case DefeatWithMoveType: SetDefeatWithMoveTypeCount(idx, cappedValue); break; + case Defeat: NumDefeated = cappedValue; break; + case Evolve: NumEvolved = cappedValue; break; + case CatchAlpha: NumAlphaCaught = cappedValue; break; + case CatchLarge: NumLargeCaught = cappedValue; break; + case CatchSmall: NumSmallCaught = cappedValue; break; + case CatchHeavy: NumHeavyCaught = cappedValue; break; + case CatchLight: NumLightCaught = cappedValue; break; + case CatchAtTime: NumCaughtAtTime = cappedValue; break; + case CatchSleeping: NumCaughtSleeping = cappedValue; break; + case CatchInAir: NumCaughtInAir = cappedValue; break; + case CatchNotSpotted: NumCaughtNotSpotted = cappedValue; break; + case GiveFood: NumGivenFood = cappedValue; break; + case StunWithItems: NumStunnedWithItems = cappedValue; break; + case ScareWithScatterBang: NumScared = cappedValue; break; + case LureWithPokeshiDoll: NumLured = cappedValue; break; + case UseStrongStyleMove: NumStrongStyleMovesUsed = cappedValue; break; + case UseAgileStyleMove: NumAgileStyleMovesUsed = cappedValue; break; + case LeapFromTrees: NumLeapFromTrees = cappedValue; break; + case LeapFromLeaves: NumLeapFromLeaves = cappedValue; break; + case LeapFromSnow: NumLeapFromSnow = cappedValue; break; + case LeapFromOre: NumLeapFromOre = cappedValue; break; + case LeapFromTussocks: NumLeapFromTussocks = cappedValue; break; + default: throw new ArgumentOutOfRangeException(nameof(task)); + } + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveStatisticsEntry.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveStatisticsEntry.cs new file mode 100644 index 00000000000..bc472fc6065 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveStatisticsEntry.cs @@ -0,0 +1,28 @@ +using System; +using static System.Buffers.Binary.BinaryPrimitives; + +namespace PKHeX.Core; + +/// +/// Per-species/form research logs used for Pokédex entries. +/// +public class PokedexSaveStatisticsEntry +{ + private readonly byte[] _data; + private readonly int Offset; + + public PokedexSaveStatisticsEntry(byte[] data, int offset) => (_data, Offset) = (data, offset); + private Span Data => _data.AsSpan(Offset); + + public uint Flags { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); } + public bool HasMaximumStatistics { get => (Flags & (1u << 0)) != 0; set => Flags = (Flags & ~(1u << 0)) | ((value ? 1u : 0u) << 0); } + public byte SeenInWildFlags { get => Data[4]; set => Data[4] = value; } + public byte ObtainFlags { get => Data[5]; set => Data[5] = value; } + public byte CaughtInWildFlags { get => Data[6]; set => Data[6] = value; } + // 7 padding alignment + + public float MinHeight { get => ReadSingleLittleEndian(Data[0x08..]); set => WriteSingleLittleEndian(Data[0x08..], value); } + public float MaxHeight { get => ReadSingleLittleEndian(Data[0x0C..]); set => WriteSingleLittleEndian(Data[0x0C..], value); } + public float MinWeight { get => ReadSingleLittleEndian(Data[0x10..]); set => WriteSingleLittleEndian(Data[0x10..], value); } + public float MaxWeight { get => ReadSingleLittleEndian(Data[0x14..]); set => WriteSingleLittleEndian(Data[0x14..], value); } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexTimeOfDay8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexTimeOfDay8a.cs new file mode 100644 index 00000000000..61194d876cd --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexTimeOfDay8a.cs @@ -0,0 +1,14 @@ +namespace PKHeX.Core; + +/// +/// Time of Day enumeration used for Pokédex entries. +/// +public enum PokedexTimeOfDay8a +{ + Morning = 0, + Midday = 1, + Evening = 2, + Night = 3, + DaylightHours = 4, + Invalid = 5, +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexType8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexType8a.cs new file mode 100644 index 00000000000..0c9fec7c2d2 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexType8a.cs @@ -0,0 +1,16 @@ +namespace PKHeX.Core; + +/// +/// Sub-Area location enumeration used for Pokédex entries. +/// +public enum PokedexType8a +{ + Hisui = 0, + Local1 = 1, + Local2 = 2, + Local3 = 3, + Local4 = 4, + Local5 = 5, + + Count = 6, +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexUpdateInfo8a.cs b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexUpdateInfo8a.cs new file mode 100644 index 00000000000..a548a24c521 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexUpdateInfo8a.cs @@ -0,0 +1,21 @@ +namespace PKHeX.Core; + +/// +/// Program generated report used to summarize the Pokédex state. +/// +public sealed record PokedexUpdateInfo8a +{ + public int ProgressPokeNum { get; init; } + public int ProgressNum { get; init; } + public int PointsGainedFromProgressPoke { get; init; } + public int NewCompleteResearchNum { get; init; } + public int PointsGainedFromCompleteResearch { get; init; } + public int TotalResearchPointBeforeUpdate { get; init; } + public int TotalResearchPointAfterUpdate { get; init; } + public int RankBeforeUpdate { get; init; } + public int PointsNeededForNextRankBeforeUpdate { get; init; } + public int PointsNeededForNextRankAfterUpdate { get; init; } + public int ProgressPercentToNextRankBeforeUpdate { get; init; } + public int ProgressPercentToNextRankAfterUpdate { get; init; } + public int TotalResearchPointAfterUpdate_Duplicate { get; init; } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Meta8.cs b/PKHeX.Core/Saves/Substructures/Gen8/Meta8.cs index 00ee18d7816..c1a65d2d59b 100644 --- a/PKHeX.Core/Saves/Substructures/Gen8/Meta8.cs +++ b/PKHeX.Core/Saves/Substructures/Gen8/Meta8.cs @@ -5,6 +5,7 @@ namespace PKHeX.Core public static class Meta8 { public static SCBlock[] GetBlankDataSWSH() => GetBlankBlockArray(DefaultChunkSizesSWSH); + public static SCBlock[] GetBlankDataLA() => GetBlankBlockArray(DefaultChunkSizesLA); /// /// Create a blank block array using the provided definition. @@ -267,5 +268,118 @@ public static IEnumerable RipSizes(IReadOnlyCollection blocks) 0xFEB13D33, 0x00002, 0xFEB64141, 0x00001, 0xFEE68CE1, 0x00004, 0xFF4498B1, 0x00002, 0xFFA1F3C8, 0x00004, }; + + private static readonly uint[] DefaultChunkSizesLA = + { + 0x00EF4BAE, 0x00140, 0x017C3CBB, 0x00001, 0x02168706, 0x1E460, 0x022A2253, 0x00001, + 0x024C8CF3, 0x00004, 0x0493AF74, 0x00004, 0x04AE4181, 0x00001, 0x04EABECF, 0x00004, + 0x050E9D63, 0x00004, 0x05E7EBEB, 0x02EE0, 0x062AF6C2, 0x00020, 0x069EAD42, 0x00004, + 0x070F34AD, 0x00020, 0x0821C372, 0x00004, 0x0A40A680, 0x00004, 0x0A49F0EF, 0x01F40, + 0x0B3C5217, 0x00004, 0x0BFDEBA1, 0x00004, 0x0E6246BE, 0x00004, 0x0F3AD63C, 0x00004, + 0x10D148DE, 0x00004, 0x111933CD, 0x00004, 0x11B37EC9, 0x000C8, 0x13A0E18B, 0x00004, + 0x17EB7C4D, 0x00004, 0x180A4E9F, 0x00004, 0x19722C89, 0x00440, 0x1B1E3D8B, 0x00004, + 0x1B5E0528, 0x00001, 0x1B65ABFD, 0x00004, 0x1BF70FCB, 0x00004, 0x1D482A63, 0x00004, + 0x1E0F1BA3, 0x00190, 0x203A7F34, 0x00008, 0x2085565F, 0x00001, 0x20855812, 0x00001, + 0x208559C5, 0x00001, 0x208D511F, 0x00004, 0x2123FE4A, 0x00004, 0x2137FAFF, 0x00004, + 0x22540FF0, 0x00004, 0x22DEF108, 0x00004, 0x23AA6AE3, 0x00004, 0x24E0D195, 0x002F2, + 0x250F3C75, 0x00004, 0x267DD9DA, 0x00070, 0x27931A29, 0x00004, 0x27986623, 0x00004, + 0x279EA6CD, 0x00004, 0x27C9C8C2, 0x00100, 0x2846B7DB, 0x00004, 0x2969F5EB, 0x00004, + 0x296C9DB8, 0x00004, 0x2985FE5D, 0x008D4, 0x298D9297, 0x00004, 0x29FB8D78, 0x00004, + 0x2BBF9423, 0x00001, 0x2BBF9789, 0x00001, 0x2BBF9CA2, 0x00001, 0x2BBF9E55, 0x00001, + 0x2C0B9BF3, 0x00004, 0x2C24C5F2, 0x00020, 0x2DBE7204, 0x04B00, 0x2EB1B190, 0x00020, + 0x2F85E20D, 0x00004, 0x305FD79A, 0x00008, 0x30967638, 0x00001, 0x3096799E, 0x00001, + 0x30967B51, 0x00001, 0x3279D927, 0x00004, 0x35BDC76F, 0x00001, 0x35BDC922, 0x00001, + 0x3745DA43, 0x00004, 0x385F9860, 0x00004, 0x388E378D, 0x00004, 0x3AAF5E5E, 0x00004, + 0x3ADB8A98, 0x000C8, 0x3B4D705E, 0x00001, 0x3B956C1A, 0x00004, 0x3BFC2C3C, 0x000D0, + 0x3EBEE1A7, 0x00004, 0x3F7CC8A4, 0x00004, 0x3F8120BA, 0x00002, 0x402FAC1D, 0x00001, + 0x4033C7DB, 0x00001, 0x40892A39, 0x00004, 0x40CC5A21, 0x00002, 0x40E13871, 0x00004, + 0x41309084, 0x00001, 0x416A4820, 0x00004, 0x416A49D3, 0x00004, 0x416A4D39, 0x00004, + 0x416A5252, 0x00004, 0x416A5405, 0x00004, 0x431018F0, 0x00004, 0x43749288, 0x00010, + 0x444D8A2C, 0x00001, 0x451E1BAF, 0x00020, 0x457495AE, 0x00010, 0x45851092, 0x00064, + 0x46749741, 0x00010, 0x477498D4, 0x00010, 0x47E1CEAB, 0x54600, 0x48749A67, 0x00010, + 0x48CE01F7, 0x000FC, 0x48DDB755, 0x00006, 0x4918E303, 0x00001, 0x49749BFA, 0x00010, + 0x4A749D8D, 0x00010, 0x4AA3F543, 0x00004, 0x4AA3F6F6, 0x00004, 0x4AAF7FBE, 0x00004, + 0x4BD70B32, 0x041A0, 0x4C5C85AB, 0x00004, 0x4D7EADDD, 0x00004, 0x4DB28157, 0x00004, + 0x4EB3ECBB, 0x00004, 0x4EE2B115, 0x00008, 0x4FBDB5FF, 0x00008, 0x509A1AC8, 0x00004, + 0x509A1C7B, 0x00004, 0x509A1FE1, 0x00004, 0x50FE632A, 0x00004, 0x511622B3, 0x88040, + 0x5297D400, 0x00001, 0x5297D766, 0x00001, 0x5297D919, 0x00001, 0x5297DACC, 0x00001, + 0x5297DC7F, 0x00001, 0x5297EBCA, 0x00001, 0x5297ED7D, 0x00001, 0x529AE870, 0x00001, + 0x529AEA23, 0x00001, 0x529AF608, 0x00001, 0x529AF7BB, 0x00001, 0x529AF96E, 0x00001, + 0x529AFB21, 0x00001, 0x529AFCD4, 0x00001, 0x529AFE87, 0x00001, 0x529B003A, 0x00001, + 0x529B01ED, 0x00001, 0x52A96788, 0x00001, 0x52A9693B, 0x00001, 0x52A96AEE, 0x00001, + 0x52A96CA1, 0x00001, 0x52A96E54, 0x00001, 0x52A97007, 0x00001, 0x52A971BA, 0x00001, + 0x52A9736D, 0x00001, 0x52AC71C6, 0x00001, 0x52AC7379, 0x00001, 0x52AC7BF8, 0x00001, + 0x52AC7DAB, 0x00001, 0x52AC7F5E, 0x00001, 0x52AC8111, 0x00001, 0x52AC82C4, 0x00001, + 0x52AC8477, 0x00001, 0x52AC862A, 0x00001, 0x52AC87DD, 0x00001, 0x52AF8D02, 0x00001, + 0x52AF8EB5, 0x00001, 0x52AF9068, 0x00001, 0x52AF921B, 0x00001, 0x52AF93CE, 0x00001, + 0x52AF9581, 0x00001, 0x52AF9734, 0x00001, 0x52AF98E7, 0x00001, 0x52AF9C4D, 0x00001, + 0x52B27C10, 0x00001, 0x52B27DC3, 0x00001, 0x52B27F76, 0x00001, 0x52B28129, 0x00001, + 0x52B282DC, 0x00001, 0x52B2848F, 0x00001, 0x52B28642, 0x00001, 0x52B287F5, 0x00001, + 0x52B289A8, 0x00001, 0x52B28B5B, 0x00001, 0x52B4B700, 0x00001, 0x52B4B8B3, 0x00001, + 0x52B4BA66, 0x00001, 0x52B4BDCC, 0x00001, 0x52B4BF7F, 0x00001, 0x52B4C132, 0x00001, + 0x52B4C2E5, 0x00001, 0x52B4CB64, 0x00001, 0x52B4CD17, 0x00001, 0x52B7CB70, 0x00001, + 0x52B7CD23, 0x00001, 0x52B7D089, 0x00001, 0x52B7D23C, 0x00001, 0x52B7D5A2, 0x00001, + 0x52B7D755, 0x00001, 0x52BAE346, 0x00001, 0x52BAE4F9, 0x00001, 0x52BAED78, 0x00001, + 0x52BAEF2B, 0x00001, 0x52BAF291, 0x00001, 0x52BAF444, 0x00001, 0x52BAF5F7, 0x00001, + 0x52BAF7AA, 0x00001, 0x52BAF95D, 0x00001, 0x52BDFB1C, 0x00001, 0x52BDFCCF, 0x00001, + 0x52BE039B, 0x00001, 0x52BE054E, 0x00001, 0x52BE0701, 0x00001, 0x52BE08B4, 0x00001, + 0x52BE0A67, 0x00001, 0x52BE0C1A, 0x00001, 0x53DB799F, 0x00004, 0x5423DAA0, 0x00004, + 0x549B6033, 0x03000, 0x54DAE9C5, 0x00004, 0x567F1330, 0x00001, 0x567F14E3, 0x00001, + 0x567F1696, 0x00001, 0x567F1849, 0x00001, 0x567F19FC, 0x00001, 0x56823385, 0x00001, + 0x56878ECA, 0x00001, 0x5687907D, 0x00001, 0x57A07D08, 0x00004, 0x58AB6233, 0x00064, + 0x590CD38E, 0x00004, 0x5979158E, 0x00004, 0x5988DF78, 0x00004, 0x59A4D0C3, 0x00190, + 0x5B1F53F3, 0x00004, 0x5C283C72, 0x00008, 0x5C283E25, 0x00008, 0x5C283FD8, 0x00008, + 0x5C28418B, 0x00008, 0x5C28433E, 0x00008, 0x5C2844F1, 0x00008, 0x5C2846A4, 0x00008, + 0x5C284857, 0x00008, 0x5C284BBD, 0x00008, 0x62E91A65, 0x00004, 0x62F05895, 0x00004, + 0x636A5ABD, 0x000C8, 0x64A1A5B0, 0x00004, 0x64A1A763, 0x00004, 0x64A1AE2F, 0x00004, + 0x64A1AFE2, 0x00004, 0x64A1B195, 0x00004, 0x6506EE96, 0x06D60, 0x651D61A2, 0x004B0, + 0x67692BB8, 0x00004, 0x67692D6B, 0x00004, 0x67692F1E, 0x00004, 0x676935EA, 0x00004, + 0x6769379D, 0x00004, 0x6960C6EF, 0x00004, 0x6AFB0A16, 0x00004, 0x6B35BADB, 0x00060, + 0x6B734EFD, 0x00004, 0x6C03D4A8, 0x00014, 0x6C99F9A0, 0x00002, 0x6EB3E8A0, 0x00004, + 0x6F36A3AC, 0x00004, 0x717DDAA3, 0x00008, 0x71825204, 0x00001, 0x72391B04, 0x00004, + 0x727AE2EE, 0x00004, 0x727AE4A1, 0x00004, 0x727AE654, 0x00004, 0x727AE807, 0x00004, + 0x727AE9BA, 0x00004, 0x74026290, 0x00004, 0x744447B4, 0x00004, 0x75931048, 0x00004, + 0x75931561, 0x00004, 0x75CE2CF6, 0x00004, 0x7659EC88, 0x00004, 0x76AB1B01, 0x00004, + 0x76ABB5CD, 0x00004, 0x77675FA0, 0x00320, 0x78848293, 0x00001, 0x78848446, 0x00001, + 0x788485F9, 0x00001, 0x78E0935E, 0x00004, 0x79448B5D, 0x00004, 0x79C56A5C, 0x00004, + 0x7B8CCB0B, 0x00180, 0x7CA9D9FA, 0x00004, 0x7D249649, 0x00004, 0x7D87DC83, 0x00004, + 0x7E82513F, 0x00004, 0x8048A7DC, 0x00004, 0x81EC3A78, 0x00004, 0x82AD5F84, 0x00004, + 0x82D57F17, 0x000C8, 0x8507839C, 0x00004, 0x85166DE2, 0x00004, 0x877CB98F, 0x009B0, + 0x885E5F53, 0x00010, 0x89C1C8DE, 0x00004, 0x8A0E9425, 0x004B0, 0x8B18A566, 0x00004, + 0x8B18A719, 0x00004, 0x8B18A8CC, 0x00004, 0x8B18AA7F, 0x00004, 0x8B18AC32, 0x00004, + 0x8B18ADE5, 0x00004, 0x8B8FB439, 0x00004, 0x8BDFF0F3, 0x00040, 0x8BEEF106, 0x00004, + 0x8C46768E, 0x00004, 0x8C5F59E8, 0x00004, 0x8D781241, 0x00008, 0x8E434F0D, 0x002D0, + 0x8F0D8720, 0x00004, 0x8FC0A045, 0x00004, 0x92EB0306, 0x00004, 0x92F697ED, 0x00004, + 0x95013114, 0x00008, 0x96993D83, 0x00008, 0x96F6F453, 0x00004, 0x9751BABE, 0x00400, + 0x98785EE4, 0x00008, 0x98786097, 0x00008, 0x987863FD, 0x00008, 0x99E1625E, 0x07EB0, + 0x9AB5F3D9, 0x00001, 0x9B986D2E, 0x00004, 0x9C41123A, 0x00004, 0x9C808BD3, 0x00004, + 0x9D5D1CA5, 0x00004, 0x9E45BE99, 0x00004, 0x9E4635BB, 0x00004, 0x9EC079DA, 0x00002, + 0x9FE2790A, 0x00A8C, 0xA00A8ABB, 0x00008, 0xA373DA53, 0x01900, 0xA4317061, 0x00004, + 0xA69E079B, 0x00004, 0xA94E1F5F, 0x00004, 0xA9F1368B, 0x00004, 0xAB48C136, 0x00004, + 0xAD319811, 0x00004, 0xAE7B3CA1, 0x00004, 0xAE89206E, 0x00001, 0xAEE903A2, 0x00008, + 0xB027F396, 0x00004, 0xB0B2A5AA, 0x00004, 0xB1EE7CF5, 0x00004, 0xB568265C, 0x00004, + 0xB79EF1FE, 0x00004, 0xB7AAB47E, 0x00004, 0xB8E961AD, 0x000FB, 0xB9075BC9, 0x00008, + 0xB9252862, 0x00110, 0xBA230941, 0x00004, 0xBB0B39CF, 0x00004, 0xBCC66014, 0x00004, + 0xBCC72306, 0x00004, 0xBCE74BFD, 0x00004, 0xC25B0D5A, 0x00004, 0xC2F1C1B9, 0x02580, + 0xC4C6417F, 0x000C0, 0xC4FA7C8C, 0x00004, 0xC5919BF6, 0x00004, 0xC5D7112B, 0x0DCA8, + 0xC69F66B6, 0x00FA0, 0xC74A3FE7, 0x00010, 0xC7652F1C, 0x00004, 0xC7F8E3BC, 0x00008, + 0xC7F8E56F, 0x00008, 0xC7F8EA88, 0x00008, 0xC7F8EC3B, 0x00008, 0xC7F8EDEE, 0x00008, + 0xC7F8EFA1, 0x00008, 0xC7F8F154, 0x00008, 0xC7F8F4BA, 0x00008, 0xC7F8F66D, 0x00008, + 0xC9541EB3, 0x00002, 0xC9A81578, 0x00010, 0xCC022CEC, 0x00008, 0xCC022E9F, 0x00008, + 0xCC023052, 0x00008, 0xCD8ADF1D, 0x00004, 0xCFC9AA03, 0x00004, 0xCFEB27B3, 0x009C4, + 0xCFED4C69, 0x00004, 0xD0068A74, 0x00004, 0xD03A595A, 0x009B0, 0xD06FD1EA, 0x00004, + 0xD11C1F59, 0x00004, 0xD3C06782, 0x00008, 0xD48FDC48, 0x00004, 0xD6546A02, 0x00038, + 0xD6C95683, 0x00960, 0xD6F1B724, 0x00004, 0xD8048E00, 0x00004, 0xD94D71D7, 0x00004, + 0xDD548BB1, 0x00B58, 0xDED70F11, 0x00004, 0xDFA7E2D8, 0x00004, 0xE0FB1EE7, 0x00008, + 0xE1DF0672, 0x005B8, 0xE2798DDE, 0x00001, 0xE36D5700, 0x00064, 0xE450FEF7, 0x0001A, + 0xE4E75089, 0x00040, 0xE5169DA1, 0x00004, 0xE668F1A6, 0x00001, 0xE668F359, 0x00001, + 0xE668F50C, 0x00001, 0xE668F6BF, 0x00001, 0xE668FA25, 0x00001, 0xE72BDCEC, 0x00004, + 0xE733FE4D, 0x00004, 0xE7425CFF, 0x00004, 0xE793EEAE, 0x00004, 0xEA7C87F4, 0x00020, + 0xEC13DFD7, 0x00004, 0xEE10F128, 0x00004, 0xEFB533F7, 0x00001, 0xF25C070E, 0x00080, + 0xF3CF94FF, 0x00004, 0xF41CFF61, 0x00200, 0xF45C3F59, 0x00004, 0xF4954B60, 0x00004, + 0xF5D9F4A5, 0x00118, 0xF626721E, 0x00004, 0xF62D79D3, 0x00004, 0xF8154AC9, 0x00004, + 0xFB58B1A7, 0x00064, 0xFB5AE87D, 0x00004, 0xFC374750, 0x00004, 0xFF400328, 0x00004, + 0xFFCC05C2, 0x00001, + }; } } diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Box8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/Box8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/Box8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/Box8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/BoxLayout8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/BoxLayout8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/BoxLayout8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/BoxLayout8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Daycare8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/Daycare8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/Daycare8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/Daycare8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/FashionUnlock8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/FashionUnlock8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/FashionUnlock8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/FashionUnlock8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/FieldMoveModelSave8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/FieldMoveModelSave8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/FieldMoveModelSave8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/FieldMoveModelSave8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Fused8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/Fused8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/Fused8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/Fused8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/HallOfFameTime8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/HallOfFameTime8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/HallOfFameTime8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/HallOfFameTime8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Misc8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/Misc8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/Misc8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/Misc8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/MyItem8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/MyItem8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/MyItem8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/MyItem8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/MyStatus8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/MyStatus8.cs similarity index 98% rename from PKHeX.Core/Saves/Substructures/Gen8/MyStatus8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/MyStatus8.cs index 53de75541cc..876e650875c 100644 --- a/PKHeX.Core/Saves/Substructures/Gen8/MyStatus8.cs +++ b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/MyStatus8.cs @@ -162,7 +162,7 @@ public int Language } } - private Span OT_Trash =>Data.AsSpan(0xB0, 0x1A); + private Span OT_Trash => Data.AsSpan(0xB0, 0x1A); public string OT { diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Party8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/Party8.cs similarity index 75% rename from PKHeX.Core/Saves/Substructures/Gen8/Party8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/Party8.cs index d15250ca11d..1072edb1f07 100644 --- a/PKHeX.Core/Saves/Substructures/Gen8/Party8.cs +++ b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/Party8.cs @@ -2,7 +2,7 @@ { public sealed class Party8 : SaveBlock { - public Party8(SaveFile sav, SCBlock block) : base(sav, block.Data) { } + public Party8(SAV8 sav, SCBlock block) : base(sav, block.Data) { } public int PartyCount { @@ -10,4 +10,4 @@ public int PartyCount set => Data[6 * PokeCrypto.SIZE_8PARTY] = (byte)value; } } -} \ No newline at end of file +} diff --git a/PKHeX.Core/Saves/Substructures/Gen8/PlayTime8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/PlayTime8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/PlayTime8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/PlayTime8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/PouchSize8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/PouchSize8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/PouchSize8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/PouchSize8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/RaidSpawnList8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/RaidSpawnList8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/RaidSpawnList8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/RaidSpawnList8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Record8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/Record8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/Record8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/Record8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/RentalTeam8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/RentalTeam8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/RentalTeam8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/RentalTeam8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/TeamIndexes8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/TeamIndexes8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/TeamIndexes8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/TeamIndexes8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/TitleScreen8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/TitleScreen8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/TitleScreen8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/TitleScreen8.cs diff --git a/PKHeX.Core/Saves/Substructures/Gen8/TrainerCard8.cs b/PKHeX.Core/Saves/Substructures/Gen8/SWSH/TrainerCard8.cs similarity index 100% rename from PKHeX.Core/Saves/Substructures/Gen8/TrainerCard8.cs rename to PKHeX.Core/Saves/Substructures/Gen8/SWSH/TrainerCard8.cs diff --git a/PKHeX.Core/Saves/Substructures/Inventory/InventoryItem8a.cs b/PKHeX.Core/Saves/Substructures/Inventory/InventoryItem8a.cs new file mode 100644 index 00000000000..407e19d345d --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Inventory/InventoryItem8a.cs @@ -0,0 +1,35 @@ +using System; +using System.Buffers.Binary; + +namespace PKHeX.Core; + +public sealed class InventoryItem8a : InventoryItem, IItemFavorite +{ + public const int SIZE = 0x10; + + public override string ToString() => $"{Index:000} x{Count}"; + public bool IsFavorite { get; set; } + + /// Creates a copy of the object. + public new InventoryItem8a Clone() => (InventoryItem8a)MemberwiseClone(); + + public override void Clear() + { + Index = Count = 0; + } + + public static InventoryItem8a Read(ReadOnlySpan data) => new() + { + Index = BinaryPrimitives.ReadInt16LittleEndian(data), + Count = BinaryPrimitives.ReadInt16LittleEndian(data[2..]), + }; + + public void Write(Span data) + { + // Index is not saved. + BinaryPrimitives.WriteUInt16LittleEndian(data, (ushort)Index); + BinaryPrimitives.WriteUInt16LittleEndian(data[2..], (ushort)Count); + } + + public static void Clear(Span data, int offset) => data.Slice(offset, SIZE).Clear(); +} diff --git a/PKHeX.Core/Saves/Substructures/Inventory/InventoryPouch8a.cs b/PKHeX.Core/Saves/Substructures/Inventory/InventoryPouch8a.cs new file mode 100644 index 00000000000..42683c3b37c --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Inventory/InventoryPouch8a.cs @@ -0,0 +1,46 @@ +using System; + +namespace PKHeX.Core; + +/// +/// Represents the data in a pouch pocket containing items of a similar type group. +/// +/// +/// Used by . +/// +public sealed class InventoryPouch8a : InventoryPouch +{ + private readonly int MaxSize; + + public InventoryPouch8a(InventoryType type, ushort[] legal, int maxCount, int size, int offset = 0, + Func? isLegal = null) + : base(type, legal, maxCount, offset, isLegal: isLegal) => MaxSize = size; + + public override InventoryItem GetEmpty(int itemID = 0, int count = 0) => new InventoryItem8a { Index = itemID, Count = count }; + + public override void GetPouch(ReadOnlySpan data) + { + var items = new InventoryItem8a[MaxSize]; + + for (int i = 0; i < data.Length; i += 4) + items[i/4] = GetItem(data, i); + + Items = items; + } + + public static InventoryItem8a GetItem(ReadOnlySpan data, int ofs) => InventoryItem8a.Read(data[ofs..]); + + public override void SetPouch(Span data) + { + var items = (InventoryItem8a[])Items; + for (var i = 0; i < items.Length; i++) + { + int ofs = i * 4; + items[i].Write(data[ofs..]); + } + } + + public void SanitizeCounts() + { + } +} diff --git a/PKHeX.Core/Saves/Util/SaveUtil.cs b/PKHeX.Core/Saves/Util/SaveUtil.cs index dbccd2373d7..920cf06b256 100644 --- a/PKHeX.Core/Saves/Util/SaveUtil.cs +++ b/PKHeX.Core/Saves/Util/SaveUtil.cs @@ -15,6 +15,8 @@ public static class SaveUtil { public const int BEEF = 0x42454546; + public const int SIZE_G8LA = 0x136DDE; + public const int SIZE_G8BDSP = 0xE9828; public const int SIZE_G8BDSP_1 = 0xEDC20; @@ -97,7 +99,7 @@ public static class SaveUtil private static readonly HashSet Sizes = new(SizesGen2.Concat(SizesSWSH)) { - SIZE_G8BDSP, SIZE_G8BDSP_1, + SIZE_G8LA, SIZE_G8BDSP, SIZE_G8BDSP_1, // SizesSWSH covers gen8 sizes since there's so many SIZE_G7SM, SIZE_G7USUM, SIZE_G7GG, SIZE_G6XY, SIZE_G6ORAS, SIZE_G6ORASDEMO, @@ -161,6 +163,8 @@ private static GameVersion GetSAVType(byte[] data) return ver; if ((ver = GetIsG8SAV_BDSP(data)) != Invalid) return ver; + if ((ver = GetIsG8SAV_LA(data)) != Invalid) + return ver; return Invalid; } @@ -503,6 +507,14 @@ private static GameVersion GetIsG8SAV_BDSP(ReadOnlySpan data) return BDSP; } + private static GameVersion GetIsG8SAV_LA(byte[] data) + { + if (data.Length is not SIZE_G8LA) + return Invalid; + + return SwishCrypto.GetIsHashValidLA(data) ? PLA : Invalid; + } + private static bool GetIsBank7(ReadOnlySpan data) => data.Length == SIZE_G7BANK && data[0] != 0; private static bool GetIsBank4(ReadOnlySpan data) => data.Length == SIZE_G4BANK && ReadUInt32LittleEndian(data[0x3FC00..]) != 0; // box name present private static bool GetIsBank3(ReadOnlySpan data) => data.Length == SIZE_G4BANK && ReadUInt32LittleEndian(data[0x3FC00..]) == 0; // size collision with ^ @@ -601,6 +613,7 @@ private static GameVersion GetIsG8SAV_BDSP(ReadOnlySpan data) SWSH => new SAV8SWSH(data), BDSP => new SAV8BS(data), + PLA => new SAV8LA(data), // Side Games COLO => new SAV3Colosseum(data), @@ -746,6 +759,7 @@ public static SaveFile GetBlankSAV(GameVersion game, string trainerName, Languag SW or SH or SWSH => new SAV8SWSH(), BD or SP or BDSP => new SAV8BS(), + PLA => new SAV8LA(), _ => throw new ArgumentOutOfRangeException(nameof(game)), }; @@ -783,7 +797,7 @@ public static bool GetSavesFromFolder(string folderPath, bool deep, out IEnumera // force evaluation so that an invalid path will throw before we return true/false. // EnumerateFiles throws an exception while iterating, which won't be caught by the try-catch here. var files = Directory.GetFiles(folderPath, "*", searchOption); - result = files.Where(f => IsSizeValid(FileUtil.GetFileSize(f))); + result = files.Where(f => !IsBackup(f) && IsSizeValid(FileUtil.GetFileSize(f))); return true; } catch (Exception ex) @@ -798,6 +812,8 @@ public static bool GetSavesFromFolder(string folderPath, bool deep, out IEnumera } } + public static bool IsBackup(string path) => Path.GetFileName(path) is "backup" || Path.GetExtension(path) is ".bak"; + /// /// Determines whether the save data size is valid for automatically detecting saves. /// diff --git a/PKHeX.Core/Util/ArrayUtil.cs b/PKHeX.Core/Util/ArrayUtil.cs index 4d05f7a7c5c..afdccc28e25 100644 --- a/PKHeX.Core/Util/ArrayUtil.cs +++ b/PKHeX.Core/Util/ArrayUtil.cs @@ -33,7 +33,7 @@ public static int Count(this ReadOnlySpan data, T value) where T : IEquata } return count; } - + public static byte[] Slice(this byte[] src, int offset, int length) => src.AsSpan(offset, length).ToArray(); public static byte[] SliceEnd(this byte[] src, int offset) => src.AsSpan(offset).ToArray(); public static T[] Slice(this T[] src, int offset, int length) => src.AsSpan(offset, length).ToArray(); diff --git a/PKHeX.Core/Util/ResourceUtil.cs b/PKHeX.Core/Util/ResourceUtil.cs index 63902273a9d..69c3078c897 100644 --- a/PKHeX.Core/Util/ResourceUtil.cs +++ b/PKHeX.Core/Util/ResourceUtil.cs @@ -209,7 +209,7 @@ public static byte[] GetBinaryResource(string name) return Array.Empty(); var buffer = new byte[resource.Length]; - resource.Read(buffer, 0, (int)resource.Length); + _ = resource.Read(buffer, 0, (int)resource.Length); return buffer; } diff --git a/PKHeX.Drawing.Misc/Util/WallpaperUtil.cs b/PKHeX.Drawing.Misc/Util/WallpaperUtil.cs index 730a3c8f262..479e42ceda0 100644 --- a/PKHeX.Drawing.Misc/Util/WallpaperUtil.cs +++ b/PKHeX.Drawing.Misc/Util/WallpaperUtil.cs @@ -35,7 +35,8 @@ 4 when HGSS.Contains(version) => "hgss", 5 => B2W2.Contains(version) && index > 16 ? "b2w2" : "bw", 6 => ORAS.Contains(version) && index > 16 ? "ao" : "xy", 7 when !GG.Contains(version) => "xy", - 8 => BDSP.Contains(version) ? "bdsp" : "swsh", + 8 when !SWSH.Contains(version) => "bdsp", + 8 => "swsh", _ => string.Empty, }; } diff --git a/PKHeX.Drawing.PokeSprite/Properties/Resources.Designer.cs b/PKHeX.Drawing.PokeSprite/Properties/Resources.Designer.cs index 74ab1cfabbb..e3d728b2583 100644 --- a/PKHeX.Drawing.PokeSprite/Properties/Resources.Designer.cs +++ b/PKHeX.Drawing.PokeSprite/Properties/Resources.Designer.cs @@ -19,10 +19,10 @@ namespace PKHeX.Drawing.PokeSprite.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public sealed class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; @@ -250,6 +250,36 @@ public static System.Drawing.Bitmap _ball26 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball27 { + get { + object obj = ResourceManager.GetObject("_ball27", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball28 { + get { + object obj = ResourceManager.GetObject("_ball28", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball29 { + get { + object obj = ResourceManager.GetObject("_ball29", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -260,6 +290,86 @@ public static System.Drawing.Bitmap _ball3 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball30 { + get { + object obj = ResourceManager.GetObject("_ball30", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball31 { + get { + object obj = ResourceManager.GetObject("_ball31", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball32 { + get { + object obj = ResourceManager.GetObject("_ball32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball33 { + get { + object obj = ResourceManager.GetObject("_ball33", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball34 { + get { + object obj = ResourceManager.GetObject("_ball34", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball35 { + get { + object obj = ResourceManager.GetObject("_ball35", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball36 { + get { + object obj = ResourceManager.GetObject("_ball36", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap _ball37 { + get { + object obj = ResourceManager.GetObject("_ball37", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -320,6 +430,16 @@ public static System.Drawing.Bitmap _ball9 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap alpha { + get { + object obj = ResourceManager.GetObject("alpha", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -360,6 +480,26 @@ public static System.Drawing.Bitmap b_100 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_100_1 { + get { + object obj = ResourceManager.GetObject("b_100_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_100_1s { + get { + object obj = ResourceManager.GetObject("b_100_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -380,6 +520,36 @@ public static System.Drawing.Bitmap b_101 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_101_1 { + get { + object obj = ResourceManager.GetObject("b_101_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_101_1s { + get { + object obj = ResourceManager.GetObject("b_101_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_101_2 { + get { + object obj = ResourceManager.GetObject("b_101_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1980,6 +2150,26 @@ public static System.Drawing.Bitmap b_157 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_157_1 { + get { + object obj = ResourceManager.GetObject("b_157_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_157_1s { + get { + object obj = ResourceManager.GetObject("b_157_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -3880,6 +4070,26 @@ public static System.Drawing.Bitmap b_211 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_211_1 { + get { + object obj = ResourceManager.GetObject("b_211_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_211_1s { + get { + object obj = ResourceManager.GetObject("b_211_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -4000,6 +4210,26 @@ public static System.Drawing.Bitmap b_215 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_215_1 { + get { + object obj = ResourceManager.GetObject("b_215_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_215_1s { + get { + object obj = ResourceManager.GetObject("b_215_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -11500,6 +11730,26 @@ public static System.Drawing.Bitmap b_483 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_483_1 { + get { + object obj = ResourceManager.GetObject("b_483_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_483_1s { + get { + object obj = ResourceManager.GetObject("b_483_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -11520,6 +11770,26 @@ public static System.Drawing.Bitmap b_484 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_484_1 { + get { + object obj = ResourceManager.GetObject("b_484_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_484_1s { + get { + object obj = ResourceManager.GetObject("b_484_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -11940,6 +12210,26 @@ public static System.Drawing.Bitmap b_493_17s { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_493_18 { + get { + object obj = ResourceManager.GetObject("b_493_18", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_493_18s { + get { + object obj = ResourceManager.GetObject("b_493_18s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -12370,6 +12660,26 @@ public static System.Drawing.Bitmap b_503 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_503_1 { + get { + object obj = ResourceManager.GetObject("b_503_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_503_1s { + get { + object obj = ResourceManager.GetObject("b_503_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -13513,9 +13823,9 @@ public static System.Drawing.Bitmap b_549 { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap b_549s { + public static System.Drawing.Bitmap b_549_1 { get { - object obj = ResourceManager.GetObject("b_549s", resourceCulture); + object obj = ResourceManager.GetObject("b_549_1", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -13523,9 +13833,9 @@ public static System.Drawing.Bitmap b_549s { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap b_54s { + public static System.Drawing.Bitmap b_549_1s { get { - object obj = ResourceManager.GetObject("b_54s", resourceCulture); + object obj = ResourceManager.GetObject("b_549_1s", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -13533,9 +13843,9 @@ public static System.Drawing.Bitmap b_54s { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap b_55 { + public static System.Drawing.Bitmap b_549_2 { get { - object obj = ResourceManager.GetObject("b_55", resourceCulture); + object obj = ResourceManager.GetObject("b_549_2", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -13543,7 +13853,37 @@ public static System.Drawing.Bitmap b_55 { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap b_550 { + public static System.Drawing.Bitmap b_549s { + get { + object obj = ResourceManager.GetObject("b_549s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_54s { + get { + object obj = ResourceManager.GetObject("b_54s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_55 { + get { + object obj = ResourceManager.GetObject("b_55", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_550 { get { object obj = ResourceManager.GetObject("b_550", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -13570,6 +13910,26 @@ public static System.Drawing.Bitmap b_550_1s { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_550_2 { + get { + object obj = ResourceManager.GetObject("b_550_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_550_2s { + get { + object obj = ResourceManager.GetObject("b_550_2s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -14130,6 +14490,26 @@ public static System.Drawing.Bitmap b_570 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_570_1 { + get { + object obj = ResourceManager.GetObject("b_570_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_570_1s { + get { + object obj = ResourceManager.GetObject("b_570_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -14150,6 +14530,26 @@ public static System.Drawing.Bitmap b_571 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_571_1 { + get { + object obj = ResourceManager.GetObject("b_571_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_571_1s { + get { + object obj = ResourceManager.GetObject("b_571_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -14340,6 +14740,26 @@ public static System.Drawing.Bitmap b_58 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_58_1 { + get { + object obj = ResourceManager.GetObject("b_58_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_58_1s { + get { + object obj = ResourceManager.GetObject("b_58_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -14680,6 +15100,36 @@ public static System.Drawing.Bitmap b_59 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_59_1 { + get { + object obj = ResourceManager.GetObject("b_59_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_59_1s { + get { + object obj = ResourceManager.GetObject("b_59_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_59_2 { + get { + object obj = ResourceManager.GetObject("b_59_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -15650,6 +16100,26 @@ public static System.Drawing.Bitmap b_628 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_628_1 { + get { + object obj = ResourceManager.GetObject("b_628_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_628_1s { + get { + object obj = ResourceManager.GetObject("b_628_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -18550,6 +19020,26 @@ public static System.Drawing.Bitmap b_705 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_705_1 { + get { + object obj = ResourceManager.GetObject("b_705_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_705_1s { + get { + object obj = ResourceManager.GetObject("b_705_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -18570,6 +19060,26 @@ public static System.Drawing.Bitmap b_706 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_706_1 { + get { + object obj = ResourceManager.GetObject("b_706_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_706_1s { + get { + object obj = ResourceManager.GetObject("b_706_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -18850,6 +19360,36 @@ public static System.Drawing.Bitmap b_713 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_713_1 { + get { + object obj = ResourceManager.GetObject("b_713_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_713_1s { + get { + object obj = ResourceManager.GetObject("b_713_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_713_2 { + get { + object obj = ResourceManager.GetObject("b_713_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -19230,6 +19770,26 @@ public static System.Drawing.Bitmap b_724 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_724_1 { + get { + object obj = ResourceManager.GetObject("b_724_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_724_1s { + get { + object obj = ResourceManager.GetObject("b_724_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -25960,6 +26520,26 @@ public static System.Drawing.Bitmap b_898s { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_899 { + get { + object obj = ResourceManager.GetObject("b_899", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_899s { + get { + object obj = ResourceManager.GetObject("b_899s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -26040,6 +26620,176 @@ public static System.Drawing.Bitmap b_90 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_900 { + get { + object obj = ResourceManager.GetObject("b_900", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_900_1 { + get { + object obj = ResourceManager.GetObject("b_900_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_900s { + get { + object obj = ResourceManager.GetObject("b_900s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_901 { + get { + object obj = ResourceManager.GetObject("b_901", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_901s { + get { + object obj = ResourceManager.GetObject("b_901s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_902 { + get { + object obj = ResourceManager.GetObject("b_902", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_902_1 { + get { + object obj = ResourceManager.GetObject("b_902_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_902_1s { + get { + object obj = ResourceManager.GetObject("b_902_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_902s { + get { + object obj = ResourceManager.GetObject("b_902s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_903 { + get { + object obj = ResourceManager.GetObject("b_903", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_903s { + get { + object obj = ResourceManager.GetObject("b_903s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_904 { + get { + object obj = ResourceManager.GetObject("b_904", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_904s { + get { + object obj = ResourceManager.GetObject("b_904s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_905 { + get { + object obj = ResourceManager.GetObject("b_905", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_905_1 { + get { + object obj = ResourceManager.GetObject("b_905_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_905_1s { + get { + object obj = ResourceManager.GetObject("b_905_1s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap b_905s { + get { + object obj = ResourceManager.GetObject("b_905s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/PKHeX.Drawing.PokeSprite/Properties/Resources.resx b/PKHeX.Drawing.PokeSprite/Properties/Resources.resx index 9fe8c13666e..bb1f7449938 100644 --- a/PKHeX.Drawing.PokeSprite/Properties/Resources.resx +++ b/PKHeX.Drawing.PokeSprite/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\img\Pokemon Sprite Overlays\alpha.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Items\bitem_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -1951,12 +1954,27 @@ ..\Resources\img\Big Shiny Sprites\b_100s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_100-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_100-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_101.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\img\Big Shiny Sprites\b_101s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_101-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_101-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_101-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_102.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -2431,6 +2449,12 @@ ..\Resources\img\Big Shiny Sprites\b_157s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_157-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_157-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_158.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -3007,6 +3031,12 @@ ..\Resources\img\Big Shiny Sprites\b_211s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_211-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_211-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_212.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -3043,6 +3073,12 @@ ..\Resources\img\Big Shiny Sprites\b_215s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_215-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_215-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_216.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -5293,12 +5329,24 @@ ..\Resources\img\Big Shiny Sprites\b_483s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_483-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_483-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_484.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\img\Big Shiny Sprites\b_484s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_484-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_484-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_485.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -5425,6 +5473,12 @@ ..\Resources\img\Big Shiny Sprites\b_493-17s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_493-18.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_493-18s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Shiny Sprites\b_493-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -5548,6 +5602,12 @@ ..\Resources\img\Big Shiny Sprites\b_503s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_503-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_503-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_504.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -5896,6 +5956,15 @@ ..\Resources\img\Big Shiny Sprites\b_549s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_549-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_549-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_549-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Shiny Sprites\b_54s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -5914,6 +5983,12 @@ ..\Resources\img\Big Shiny Sprites\b_550-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_550-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_550-2s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_551.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -6082,12 +6157,24 @@ ..\Resources\img\Big Shiny Sprites\b_570s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_570-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_570-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_571.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\img\Big Shiny Sprites\b_571s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_571-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_571-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_572.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -6241,6 +6328,12 @@ ..\Resources\img\Big Shiny Sprites\b_58s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_58-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_58-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_59.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -6319,6 +6412,15 @@ ..\Resources\img\Big Shiny Sprites\b_59s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_59-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_59-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_59-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Shiny Sprites\b_5s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -6520,6 +6622,12 @@ ..\Resources\img\Big Shiny Sprites\b_628s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_628-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_628-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_629.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -7408,12 +7516,24 @@ ..\Resources\img\Big Shiny Sprites\b_705s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_705-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_705-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_706.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\img\Big Shiny Sprites\b_706s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_706-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_706-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_707.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -7498,6 +7618,15 @@ ..\Resources\img\Big Shiny Sprites\b_713s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_713-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_713-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_713-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_714.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -7612,6 +7741,12 @@ ..\Resources\img\Big Shiny Sprites\b_724s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_724-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_724-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Pokemon Sprites\b_725.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -9622,6 +9757,12 @@ ..\Resources\img\Big Shiny Sprites\b_898-2s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_899.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_899s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Shiny Sprites\b_89s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -9640,6 +9781,57 @@ ..\Resources\img\Big Pokemon Sprites\b_90.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Legends Arceus Sprites\b_900.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_900s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_900-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_901.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_901s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_902.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_902s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_902-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_902-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_903.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_903s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_904.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_904s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_905.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_905s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Sprites\b_905-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Legends Arceus Shiny Sprites\b_905-1s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\Big Shiny Sprites\b_90s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -9880,9 +10072,42 @@ ..\Resources\img\ball\_ball26.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\ball\_ball27.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball28.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball29.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\ball\_ball3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\ball\_ball30.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball31.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball33.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball34.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball35.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball36.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\ball\_ball37.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\img\ball\_ball4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_100-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_100-1s.png new file mode 100644 index 00000000000..c6a5cf8e348 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_100-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_101-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_101-1s.png new file mode 100644 index 00000000000..cbe90696ca3 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_101-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_157-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_157-1s.png new file mode 100644 index 00000000000..d2055a7e77e Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_157-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_211-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_211-1s.png new file mode 100644 index 00000000000..d22be001192 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_211-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_215-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_215-1s.png new file mode 100644 index 00000000000..9405aaacf64 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_215-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_483-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_483-1s.png new file mode 100644 index 00000000000..afb2cb2b07a Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_483-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_484-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_484-1s.png new file mode 100644 index 00000000000..3fbb502f481 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_484-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_493-18s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_493-18s.png new file mode 100644 index 00000000000..9decad2aa7f Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_493-18s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_503-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_503-1s.png new file mode 100644 index 00000000000..c738b775e18 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_503-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_549-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_549-1s.png new file mode 100644 index 00000000000..00e6c97ccb3 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_549-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_550-2s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_550-2s.png new file mode 100644 index 00000000000..ff1e698a840 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_550-2s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_570-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_570-1s.png new file mode 100644 index 00000000000..88485d171ab Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_570-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_571-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_571-1s.png new file mode 100644 index 00000000000..334b9676a6a Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_571-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_58-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_58-1s.png new file mode 100644 index 00000000000..d72f781b9c4 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_58-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_59-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_59-1s.png new file mode 100644 index 00000000000..7417af7edd0 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_59-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_628-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_628-1s.png new file mode 100644 index 00000000000..4c61fc5d84f Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_628-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_705-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_705-1s.png new file mode 100644 index 00000000000..f03b78e85f9 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_705-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_706-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_706-1s.png new file mode 100644 index 00000000000..2b4d6c6c032 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_706-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_713-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_713-1s.png new file mode 100644 index 00000000000..dfd7992492a Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_713-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_724-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_724-1s.png new file mode 100644 index 00000000000..04a18a397e9 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_724-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_899s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_899s.png new file mode 100644 index 00000000000..7eb01ed8898 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_899s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_900s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_900s.png new file mode 100644 index 00000000000..362664d35f8 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_900s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_901s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_901s.png new file mode 100644 index 00000000000..4ff417a4b58 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_901s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902-1s.png new file mode 100644 index 00000000000..0008c93b7ae Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902s.png new file mode 100644 index 00000000000..159b24bd245 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_903s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_903s.png new file mode 100644 index 00000000000..954e33bac88 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_903s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_904s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_904s.png new file mode 100644 index 00000000000..b040f112e40 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_904s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905-1s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905-1s.png new file mode 100644 index 00000000000..b1f2cef2829 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905-1s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905s.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905s.png new file mode 100644 index 00000000000..a1eda86d159 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905s.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_100-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_100-1.png new file mode 100644 index 00000000000..af97d0c8045 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_100-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-1.png new file mode 100644 index 00000000000..34e650fbf9a Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-2.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-2.png new file mode 100644 index 00000000000..2bab13e77d0 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-2.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_157-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_157-1.png new file mode 100644 index 00000000000..cb4605c8279 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_157-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_211-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_211-1.png new file mode 100644 index 00000000000..5bb7ea1b413 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_211-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_215-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_215-1.png new file mode 100644 index 00000000000..5311afae777 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_215-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_483-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_483-1.png new file mode 100644 index 00000000000..b5ae724199e Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_483-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_484-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_484-1.png new file mode 100644 index 00000000000..b80af5fff36 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_484-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_493-18.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_493-18.png new file mode 100644 index 00000000000..e395837a8e2 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_493-18.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_503-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_503-1.png new file mode 100644 index 00000000000..4ce10db7c32 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_503-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-1.png new file mode 100644 index 00000000000..c283659766c Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-2.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-2.png new file mode 100644 index 00000000000..ca1c2d2d399 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-2.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_550-2.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_550-2.png new file mode 100644 index 00000000000..47a812de05b Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_550-2.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_570-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_570-1.png new file mode 100644 index 00000000000..1e2af952467 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_570-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_571-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_571-1.png new file mode 100644 index 00000000000..42c772aad9c Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_571-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_58-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_58-1.png new file mode 100644 index 00000000000..a0b935d7ccd Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_58-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-1.png new file mode 100644 index 00000000000..9ca1d922b02 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-2.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-2.png new file mode 100644 index 00000000000..fbbfb78d3f4 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-2.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_628-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_628-1.png new file mode 100644 index 00000000000..53c8b4d293c Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_628-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_705-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_705-1.png new file mode 100644 index 00000000000..f06308a34dc Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_705-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_706-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_706-1.png new file mode 100644 index 00000000000..c541d5212d7 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_706-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-1.png new file mode 100644 index 00000000000..3809f0a21a5 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-2.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-2.png new file mode 100644 index 00000000000..e932bfbbabd Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-2.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_724-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_724-1.png new file mode 100644 index 00000000000..899793e684e Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_724-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_899.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_899.png new file mode 100644 index 00000000000..f7cffcb263b Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_899.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900-1.png new file mode 100644 index 00000000000..5e36208ec85 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900.png new file mode 100644 index 00000000000..fe9effbbdb7 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_901.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_901.png new file mode 100644 index 00000000000..841c220630b Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_901.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902-1.png new file mode 100644 index 00000000000..a0a935e363b Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902.png new file mode 100644 index 00000000000..67394698425 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_903.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_903.png new file mode 100644 index 00000000000..1baa5c7974e Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_903.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_904.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_904.png new file mode 100644 index 00000000000..9e763be1f4a Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_904.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905-1.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905-1.png new file mode 100644 index 00000000000..63df5fce3a7 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905-1.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905.png b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905.png new file mode 100644 index 00000000000..dafad695cac Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/Pokemon Sprite Overlays/alpha.png b/PKHeX.Drawing.PokeSprite/Resources/img/Pokemon Sprite Overlays/alpha.png new file mode 100644 index 00000000000..2d657a8c179 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/Pokemon Sprite Overlays/alpha.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball27.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball27.png new file mode 100644 index 00000000000..5d554ffa6ff Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball27.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball28.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball28.png new file mode 100644 index 00000000000..9ab1f187270 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball28.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball29.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball29.png new file mode 100644 index 00000000000..374f4f1ca5d Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball29.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball30.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball30.png new file mode 100644 index 00000000000..9d33919f081 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball30.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball31.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball31.png new file mode 100644 index 00000000000..3f0a015fe0a Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball31.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball32.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball32.png new file mode 100644 index 00000000000..f8fbb05d854 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball32.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball33.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball33.png new file mode 100644 index 00000000000..9c55abba56d Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball33.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball34.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball34.png new file mode 100644 index 00000000000..91f03055889 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball34.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball35.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball35.png new file mode 100644 index 00000000000..41445939ac3 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball35.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball36.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball36.png new file mode 100644 index 00000000000..2e6a75f7179 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball36.png differ diff --git a/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball37.png b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball37.png new file mode 100644 index 00000000000..69702d0df49 Binary files /dev/null and b/PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball37.png differ diff --git a/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs b/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs index c0e8cf3d4c9..167bbc8d4e6 100644 --- a/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs +++ b/PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs @@ -54,6 +54,11 @@ private static Image GetSprite(PKM pk, bool isBoxBGRed = false) var gm = Resources.dyna; return ImageUtil.LayerImage(img, gm, (img.Width - gm.Width) / 2, 0); } + if (pk is IAlpha {IsAlpha: true}) + { + var alpha = Resources.alpha; + return ImageUtil.LayerImage(img, alpha, SlotTeamShiftX, 0); + } return img; } @@ -185,6 +190,11 @@ public static Image Sprite(this IEncounterTemplate enc) var gm = Resources.dyna; img = ImageUtil.LayerImage(img, gm, (img.Width - gm.Width) / 2, 0); } + if (enc is IAlpha { IsAlpha: true }) + { + var alpha = Resources.alpha; + img = ImageUtil.LayerImage(img, alpha, SlotTeamShiftX, 0); + } if (SpriteBuilder.ShowEncounterColor != SpriteBackgroundType.None) img = ApplyEncounterColor(enc, img, SpriteBuilder.ShowEncounterColor); return img; diff --git a/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs b/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs index 0e3dac9c6c8..d9303b3fb3e 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs @@ -84,5 +84,46 @@ private void PopulateFieldsPB8() LoadPartyStats(pk8); UpdateStats(); } + + private PA8 PreparePA8() + { + if (Entity is not PA8 pk8) + throw new FormatException(nameof(Entity)); + + SaveMisc1(pk8); + SaveMisc2(pk8); + SaveMisc3(pk8); + SaveMisc4(pk8); + SaveMisc6(pk8); + SaveMisc8(pk8); + + // Toss in Party Stats + SavePartyStats(pk8); + + pk8.FixMoves(); + pk8.FixRelearn(); + if (ModifyPKM) + pk8.FixMemories(); + pk8.RefreshChecksum(); + return pk8; + } + + private void PopulateFieldsPA8() + { + if (Entity is not PA8 pk8) + throw new FormatException(nameof(Entity)); + + LoadMisc1(pk8); + LoadMisc2(pk8); + LoadMisc3(pk8); + LoadMisc4(pk8); + LoadMisc6(pk8); + LoadGVs(pk8); + SizeCP.LoadPKM(pk8); + LoadMisc8(pk8); + + LoadPartyStats(pk8); + UpdateStats(); + } } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs index e69648acef0..716f26eb683 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/LoadSave.cs @@ -72,6 +72,7 @@ private void SavePKRS(PKM pk) private void LoadIVs(PKM pk) => Stats.LoadIVs(pk.IVs); private void LoadEVs(PKM pk) => Stats.LoadEVs(pk.EVs); private void LoadAVs(IAwakened pk) => Stats.LoadAVs(pk); + private void LoadGVs(IGanbaru pk) => Stats.LoadGVs(pk); private void LoadMoves(PKM pk) { @@ -434,5 +435,30 @@ private void SaveMisc8(PB8 pk8) pk8.HT_Language = WinFormsUtil.GetIndex(CB_HTLanguage); pk8.BattleVersion = WinFormsUtil.GetIndex(CB_BattleVersion); } + + private void LoadMisc8(PA8 pk8) + { + CB_StatNature.SelectedValue = pk8.StatNature; + Stats.CB_DynamaxLevel.SelectedIndex = pk8.DynamaxLevel; + Stats.CHK_Gigantamax.Checked = pk8.CanGigantamax; + CB_HTLanguage.SelectedValue = pk8.HT_Language; + TB_HomeTracker.Text = pk8.Tracker.ToString("X16"); + CB_BattleVersion.SelectedValue = pk8.BattleVersion; + Stats.CHK_IsAlpha.Checked = pk8.IsAlpha; + Stats.CHK_IsNoble.Checked = pk8.IsNoble; + CB_AlphaMastered.SelectedValue = pk8.AlphaMove; + } + + private void SaveMisc8(PA8 pk8) + { + pk8.StatNature = WinFormsUtil.GetIndex(CB_StatNature); + pk8.DynamaxLevel = (byte)Math.Max(0, Stats.CB_DynamaxLevel.SelectedIndex); + pk8.CanGigantamax = Stats.CHK_Gigantamax.Checked; + pk8.HT_Language = WinFormsUtil.GetIndex(CB_HTLanguage); + pk8.BattleVersion = WinFormsUtil.GetIndex(CB_BattleVersion); + pk8.IsAlpha = Stats.CHK_IsAlpha.Checked; + pk8.IsNoble = Stats.CHK_IsNoble.Checked; + pk8.AlphaMove = WinFormsUtil.GetIndex(CB_AlphaMastered); + } } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs index c95d8e792f7..5d491ae89fd 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.Designer.cs @@ -67,7 +67,6 @@ private void InitializeComponent() this.Label_Form = new System.Windows.Forms.Label(); this.FLP_FormRight = new System.Windows.Forms.FlowLayoutPanel(); this.CB_Form = new System.Windows.Forms.ComboBox(); - this.FA_Form = new PKHeX.WinForms.Controls.FormArgument(); this.FLP_HeldItem = new System.Windows.Forms.FlowLayoutPanel(); this.Label_HeldItem = new System.Windows.Forms.Label(); this.CB_HeldItem = new System.Windows.Forms.ComboBox(); @@ -119,12 +118,9 @@ private void InitializeComponent() this.CHK_Shadow = new System.Windows.Forms.CheckBox(); this.FLP_ShinyLeaf = new System.Windows.Forms.FlowLayoutPanel(); this.L_ShinyLeaf = new System.Windows.Forms.Label(); - this.ShinyLeaf = new PKHeX.WinForms.Controls.ShinyLeaf(); this.FLP_CatchRate = new System.Windows.Forms.FlowLayoutPanel(); this.L_CatchRate = new System.Windows.Forms.Label(); - this.CR_PK1 = new PKHeX.WinForms.Controls.CatchRate(); this.FLP_SizeCP = new System.Windows.Forms.FlowLayoutPanel(); - this.SizeCP = new PKHeX.WinForms.Controls.SizeCP(); this.Tab_Met = new System.Windows.Forms.TabPage(); this.TB_HomeTracker = new System.Windows.Forms.TextBox(); this.L_HomeTracker = new System.Windows.Forms.Label(); @@ -165,10 +161,9 @@ private void InitializeComponent() this.L_MetTimeOfDay = new System.Windows.Forms.Label(); this.CB_MetTimeOfDay = new System.Windows.Forms.ComboBox(); this.Tab_Stats = new System.Windows.Forms.TabPage(); - this.Stats = new PKHeX.WinForms.Controls.StatEditor(); - this.Contest = new PKHeX.WinForms.Controls.ContestStat(); this.Tab_Attacks = new System.Windows.Forms.TabPage(); this.B_Records = new System.Windows.Forms.Button(); + this.B_MoveShop = new System.Windows.Forms.Button(); this.PB_WarnMove4 = new System.Windows.Forms.PictureBox(); this.PB_WarnMove3 = new System.Windows.Forms.PictureBox(); this.PB_WarnMove2 = new System.Windows.Forms.PictureBox(); @@ -225,7 +220,6 @@ private void InitializeComponent() this.TB_ExtraByte = new System.Windows.Forms.MaskedTextBox(); this.CB_ExtraBytes = new System.Windows.Forms.ComboBox(); this.GB_OT = new System.Windows.Forms.GroupBox(); - this.TID_Trainer = new PKHeX.WinForms.Controls.TrainerID(); this.Label_OTGender = new System.Windows.Forms.Label(); this.TB_OT = new System.Windows.Forms.TextBox(); this.Label_OT = new System.Windows.Forms.Label(); @@ -233,6 +227,16 @@ private void InitializeComponent() this.SpeciesIDTip = new System.Windows.Forms.ToolTip(this.components); this.NatureTip = new System.Windows.Forms.ToolTip(this.components); this.Tip3 = new System.Windows.Forms.ToolTip(this.components); + this.FLP_MoveFlags = new System.Windows.Forms.FlowLayoutPanel(); + this.FA_Form = new PKHeX.WinForms.Controls.FormArgument(); + this.ShinyLeaf = new PKHeX.WinForms.Controls.ShinyLeaf(); + this.CR_PK1 = new PKHeX.WinForms.Controls.CatchRate(); + this.SizeCP = new PKHeX.WinForms.Controls.SizeCP(); + this.Stats = new PKHeX.WinForms.Controls.StatEditor(); + this.Contest = new PKHeX.WinForms.Controls.ContestStat(); + this.TID_Trainer = new PKHeX.WinForms.Controls.TrainerID(); + this.CB_AlphaMastered = new System.Windows.Forms.ComboBox(); + this.L_AlphaMastered = new System.Windows.Forms.Label(); this.tabMain.SuspendLayout(); this.Tab_Main.SuspendLayout(); this.FLP_Main.SuspendLayout(); @@ -317,6 +321,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.PB_Mark4)).BeginInit(); this.GB_ExtraBytes.SuspendLayout(); this.GB_OT.SuspendLayout(); + this.FLP_MoveFlags.SuspendLayout(); this.SuspendLayout(); // // tabMain @@ -802,15 +807,6 @@ private void InitializeComponent() this.CB_Form.TabIndex = 12; this.CB_Form.SelectedIndexChanged += new System.EventHandler(this.UpdateForm); // - // FA_Form - // - this.FA_Form.Location = new System.Drawing.Point(123, 0); - this.FA_Form.Margin = new System.Windows.Forms.Padding(0); - this.FA_Form.Name = "FA_Form"; - this.FA_Form.Size = new System.Drawing.Size(75, 21); - this.FA_Form.TabIndex = 19; - this.FA_Form.ValueChanged += new System.EventHandler(this.UpdateFormArgument); - // // FLP_HeldItem // this.FLP_HeldItem.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); @@ -1419,14 +1415,6 @@ private void InitializeComponent() this.L_ShinyLeaf.TextAlign = System.Drawing.ContentAlignment.MiddleRight; this.L_ShinyLeaf.Click += new System.EventHandler(this.ClickShinyLeaf); // - // ShinyLeaf - // - this.ShinyLeaf.Location = new System.Drawing.Point(98, 0); - this.ShinyLeaf.Margin = new System.Windows.Forms.Padding(0); - this.ShinyLeaf.Name = "ShinyLeaf"; - this.ShinyLeaf.Size = new System.Drawing.Size(140, 56); - this.ShinyLeaf.TabIndex = 116; - // // FLP_CatchRate // this.FLP_CatchRate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); @@ -1448,14 +1436,6 @@ private void InitializeComponent() this.L_CatchRate.Text = "Catch Rate:"; this.L_CatchRate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // CR_PK1 - // - this.CR_PK1.Location = new System.Drawing.Point(110, 0); - this.CR_PK1.Margin = new System.Windows.Forms.Padding(0); - this.CR_PK1.Name = "CR_PK1"; - this.CR_PK1.Size = new System.Drawing.Size(162, 25); - this.CR_PK1.TabIndex = 10; - // // FLP_SizeCP // this.FLP_SizeCP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); @@ -1466,15 +1446,6 @@ private void InitializeComponent() this.FLP_SizeCP.Size = new System.Drawing.Size(272, 72); this.FLP_SizeCP.TabIndex = 21; // - // SizeCP - // - this.SizeCP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.SizeCP.Location = new System.Drawing.Point(50, 0); - this.SizeCP.Margin = new System.Windows.Forms.Padding(50, 0, 0, 0); - this.SizeCP.Name = "SizeCP"; - this.SizeCP.Size = new System.Drawing.Size(204, 68); - this.SizeCP.TabIndex = 0; - // // Tab_Met // this.Tab_Met.AllowDrop = true; @@ -1486,7 +1457,7 @@ private void InitializeComponent() this.Tab_Met.Location = new System.Drawing.Point(4, 22); this.Tab_Met.Name = "Tab_Met"; this.Tab_Met.Padding = new System.Windows.Forms.Padding(3); - this.Tab_Met.Size = new System.Drawing.Size(192, 74); + this.Tab_Met.Size = new System.Drawing.Size(307, 539); this.Tab_Met.TabIndex = 1; this.Tab_Met.Text = "Met"; this.Tab_Met.UseVisualStyleBackColor = true; @@ -1930,42 +1901,17 @@ private void InitializeComponent() this.Tab_Stats.Location = new System.Drawing.Point(4, 22); this.Tab_Stats.Name = "Tab_Stats"; this.Tab_Stats.Padding = new System.Windows.Forms.Padding(3); - this.Tab_Stats.Size = new System.Drawing.Size(192, 74); + this.Tab_Stats.Size = new System.Drawing.Size(307, 539); this.Tab_Stats.TabIndex = 2; this.Tab_Stats.Text = "Stats"; this.Tab_Stats.UseVisualStyleBackColor = true; // - // Stats - // - this.Stats.EVsFishy = System.Drawing.Color.LightYellow; - this.Stats.EVsInvalid = System.Drawing.Color.Red; - this.Stats.EVsMaxed = System.Drawing.Color.Honeydew; - this.Stats.Location = new System.Drawing.Point(0, 0); - this.Stats.Name = "Stats"; - this.Stats.Size = new System.Drawing.Size(270, 264); - this.Stats.StatDecreased = System.Drawing.Color.Blue; - this.Stats.StatHyperTrained = System.Drawing.Color.LightGreen; - this.Stats.StatIncreased = System.Drawing.Color.Red; - this.Stats.TabIndex = 1; - // - // Contest - // - this.Contest.CNT_Beauty = ((byte)(0)); - this.Contest.CNT_Cool = ((byte)(0)); - this.Contest.CNT_Cute = ((byte)(0)); - this.Contest.CNT_Sheen = ((byte)(0)); - this.Contest.CNT_Smart = ((byte)(0)); - this.Contest.CNT_Tough = ((byte)(0)); - this.Contest.Location = new System.Drawing.Point(21, 265); - this.Contest.Margin = new System.Windows.Forms.Padding(0); - this.Contest.Name = "Contest"; - this.Contest.Size = new System.Drawing.Size(230, 50); - this.Contest.TabIndex = 2; - // // Tab_Attacks // this.Tab_Attacks.AllowDrop = true; - this.Tab_Attacks.Controls.Add(this.B_Records); + this.Tab_Attacks.Controls.Add(this.L_AlphaMastered); + this.Tab_Attacks.Controls.Add(this.CB_AlphaMastered); + this.Tab_Attacks.Controls.Add(this.FLP_MoveFlags); this.Tab_Attacks.Controls.Add(this.PB_WarnMove4); this.Tab_Attacks.Controls.Add(this.PB_WarnMove3); this.Tab_Attacks.Controls.Add(this.PB_WarnMove2); @@ -1975,14 +1921,15 @@ private void InitializeComponent() this.Tab_Attacks.Location = new System.Drawing.Point(4, 22); this.Tab_Attacks.Name = "Tab_Attacks"; this.Tab_Attacks.Padding = new System.Windows.Forms.Padding(3); - this.Tab_Attacks.Size = new System.Drawing.Size(192, 74); + this.Tab_Attacks.Size = new System.Drawing.Size(307, 539); this.Tab_Attacks.TabIndex = 3; this.Tab_Attacks.Text = "Attacks"; this.Tab_Attacks.UseVisualStyleBackColor = true; // // B_Records // - this.B_Records.Location = new System.Drawing.Point(63, 284); + this.B_Records.Location = new System.Drawing.Point(1, 1); + this.B_Records.Margin = new System.Windows.Forms.Padding(1); this.B_Records.Name = "B_Records"; this.B_Records.Size = new System.Drawing.Size(144, 23); this.B_Records.TabIndex = 8; @@ -1990,6 +1937,17 @@ private void InitializeComponent() this.B_Records.UseVisualStyleBackColor = true; this.B_Records.Click += new System.EventHandler(this.B_Records_Click); // + // B_MoveShop + // + this.B_MoveShop.Location = new System.Drawing.Point(147, 1); + this.B_MoveShop.Margin = new System.Windows.Forms.Padding(1); + this.B_MoveShop.Name = "B_MoveShop"; + this.B_MoveShop.Size = new System.Drawing.Size(144, 23); + this.B_MoveShop.TabIndex = 9; + this.B_MoveShop.Text = "Move Shop"; + this.B_MoveShop.UseVisualStyleBackColor = true; + this.B_MoveShop.Click += new System.EventHandler(this.B_MoveShop_Click); + // // PB_WarnMove4 // this.PB_WarnMove4.Image = global::PKHeX.WinForms.Properties.Resources.warn; @@ -2375,7 +2333,7 @@ private void InitializeComponent() this.Tab_OTMisc.Location = new System.Drawing.Point(4, 22); this.Tab_OTMisc.Name = "Tab_OTMisc"; this.Tab_OTMisc.Padding = new System.Windows.Forms.Padding(3); - this.Tab_OTMisc.Size = new System.Drawing.Size(192, 74); + this.Tab_OTMisc.Size = new System.Drawing.Size(307, 539); this.Tab_OTMisc.TabIndex = 4; this.Tab_OTMisc.Text = "OT/Misc"; this.Tab_OTMisc.UseVisualStyleBackColor = true; @@ -2718,13 +2676,6 @@ private void InitializeComponent() this.GB_OT.TabStop = false; this.GB_OT.Text = "Trainer Information"; // - // TID_Trainer - // - this.TID_Trainer.Location = new System.Drawing.Point(13, 18); - this.TID_Trainer.Name = "TID_Trainer"; - this.TID_Trainer.Size = new System.Drawing.Size(178, 27); - this.TID_Trainer.TabIndex = 57; - // // Label_OTGender // this.Label_OTGender.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -2765,6 +2716,108 @@ private void InitializeComponent() this.Label_EncryptionConstant.Text = "Encryption Constant:"; this.Label_EncryptionConstant.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // + // FLP_MoveFlags + // + this.FLP_MoveFlags.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.FLP_MoveFlags.AutoSize = true; + this.FLP_MoveFlags.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.FLP_MoveFlags.Controls.Add(this.B_Records); + this.FLP_MoveFlags.Controls.Add(this.B_MoveShop); + this.FLP_MoveFlags.Location = new System.Drawing.Point(8, 286); + this.FLP_MoveFlags.Name = "FLP_MoveFlags"; + this.FLP_MoveFlags.Size = new System.Drawing.Size(292, 25); + this.FLP_MoveFlags.TabIndex = 11; + this.FLP_MoveFlags.WrapContents = false; + // + // FA_Form + // + this.FA_Form.Location = new System.Drawing.Point(123, 0); + this.FA_Form.Margin = new System.Windows.Forms.Padding(0); + this.FA_Form.Name = "FA_Form"; + this.FA_Form.Size = new System.Drawing.Size(75, 21); + this.FA_Form.TabIndex = 19; + this.FA_Form.ValueChanged += new System.EventHandler(this.UpdateFormArgument); + // + // ShinyLeaf + // + this.ShinyLeaf.Location = new System.Drawing.Point(98, 0); + this.ShinyLeaf.Margin = new System.Windows.Forms.Padding(0); + this.ShinyLeaf.Name = "ShinyLeaf"; + this.ShinyLeaf.Size = new System.Drawing.Size(140, 56); + this.ShinyLeaf.TabIndex = 116; + // + // CR_PK1 + // + this.CR_PK1.Location = new System.Drawing.Point(110, 0); + this.CR_PK1.Margin = new System.Windows.Forms.Padding(0); + this.CR_PK1.Name = "CR_PK1"; + this.CR_PK1.Size = new System.Drawing.Size(162, 25); + this.CR_PK1.TabIndex = 10; + // + // SizeCP + // + this.SizeCP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.SizeCP.Location = new System.Drawing.Point(50, 0); + this.SizeCP.Margin = new System.Windows.Forms.Padding(50, 0, 0, 0); + this.SizeCP.Name = "SizeCP"; + this.SizeCP.Size = new System.Drawing.Size(204, 68); + this.SizeCP.TabIndex = 0; + // + // Stats + // + this.Stats.EVsFishy = System.Drawing.Color.LightYellow; + this.Stats.EVsInvalid = System.Drawing.Color.Red; + this.Stats.EVsMaxed = System.Drawing.Color.Honeydew; + this.Stats.Location = new System.Drawing.Point(0, 0); + this.Stats.Name = "Stats"; + this.Stats.Size = new System.Drawing.Size(270, 264); + this.Stats.StatDecreased = System.Drawing.Color.Blue; + this.Stats.StatHyperTrained = System.Drawing.Color.LightGreen; + this.Stats.StatIncreased = System.Drawing.Color.Red; + this.Stats.TabIndex = 1; + // + // Contest + // + this.Contest.CNT_Beauty = ((byte)(0)); + this.Contest.CNT_Cool = ((byte)(0)); + this.Contest.CNT_Cute = ((byte)(0)); + this.Contest.CNT_Sheen = ((byte)(0)); + this.Contest.CNT_Smart = ((byte)(0)); + this.Contest.CNT_Tough = ((byte)(0)); + this.Contest.Location = new System.Drawing.Point(21, 265); + this.Contest.Margin = new System.Windows.Forms.Padding(0); + this.Contest.Name = "Contest"; + this.Contest.Size = new System.Drawing.Size(230, 50); + this.Contest.TabIndex = 2; + // + // TID_Trainer + // + this.TID_Trainer.Location = new System.Drawing.Point(13, 18); + this.TID_Trainer.Name = "TID_Trainer"; + this.TID_Trainer.Size = new System.Drawing.Size(178, 27); + this.TID_Trainer.TabIndex = 57; + // + // CB_AlphaMastered + // + this.CB_AlphaMastered.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.CB_AlphaMastered.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CB_AlphaMastered.FormattingEnabled = true; + this.CB_AlphaMastered.Location = new System.Drawing.Point(123, 317); + this.CB_AlphaMastered.Name = "CB_AlphaMastered"; + this.CB_AlphaMastered.Size = new System.Drawing.Size(124, 21); + this.CB_AlphaMastered.TabIndex = 20; + // + // L_AlphaMastered + // + this.L_AlphaMastered.Location = new System.Drawing.Point(8, 317); + this.L_AlphaMastered.Margin = new System.Windows.Forms.Padding(0); + this.L_AlphaMastered.Name = "L_AlphaMastered"; + this.L_AlphaMastered.Size = new System.Drawing.Size(112, 21); + this.L_AlphaMastered.TabIndex = 21; + this.L_AlphaMastered.Text = "Alpha Mastered:"; + this.L_AlphaMastered.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // // PKMEditor // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; @@ -2843,6 +2896,7 @@ private void InitializeComponent() this.FLP_TimeOfDay.ResumeLayout(false); this.Tab_Stats.ResumeLayout(false); this.Tab_Attacks.ResumeLayout(false); + this.Tab_Attacks.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.PB_WarnMove4)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.PB_WarnMove3)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.PB_WarnMove2)).EndInit(); @@ -2876,6 +2930,7 @@ private void InitializeComponent() this.GB_ExtraBytes.PerformLayout(); this.GB_OT.ResumeLayout(false); this.GB_OT.PerformLayout(); + this.FLP_MoveFlags.ResumeLayout(false); this.ResumeLayout(false); } @@ -3086,5 +3141,9 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox CB_BattleVersion; private System.Windows.Forms.PictureBox PB_BattleVersion; private FormArgument FA_Form; + private System.Windows.Forms.Button B_MoveShop; + private System.Windows.Forms.FlowLayoutPanel FLP_MoveFlags; + private System.Windows.Forms.Label L_AlphaMastered; + private System.Windows.Forms.ComboBox CB_AlphaMastered; } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index 996de09bd56..08b6d9dc934 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -52,6 +52,7 @@ public PKMEditor() new(new[] {CB_Country, CB_SubRegion}, pk => pk is PK6 or PK7, Criteria), new(Relearn, pk => pk.Format >= 6, Criteria), new(new[] {CB_StatNature}, pk => pk.Format >= 8, Criteria), + new(new[] {CB_AlphaMastered}, pk => pk is PA8, Criteria), }; foreach (var c in WinFormsUtil.GetAllControlsOfType(this)) @@ -94,6 +95,7 @@ public void InitializeBinding() CB_Nature, CB_StatNature, 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, }; foreach (var cb in cbs.Concat(Moves.Concat(Relearn))) cb.InitializeBinding(); @@ -254,6 +256,7 @@ public void SetPKMFormatMode(PKM pk) 7 when pk is PK7 => (PopulateFieldsPK7, PreparePK7), 7 when pk is PB7 => (PopulateFieldsPB7, PreparePB7), 8 when pk is PK8 => (PopulateFieldsPK8, PreparePK8), + 8 when pk is PA8 => (PopulateFieldsPA8, PreparePA8), 8 when pk is PB8 => (PopulateFieldsPB8, PreparePB8), _ => throw new FormatException($"Unrecognized Type: {pk.GetType()}"), }; @@ -554,6 +557,8 @@ private void SetMarkings() return Properties.Resources.gen_8; if (pkm.BDSP) return Properties.Resources.gen_bs; + if (pkm.LA) + return Properties.Resources.gen_la; return null; } @@ -1715,6 +1720,8 @@ private void ValidateMove(object sender, EventArgs e) Entity.RelearnMove3 = WinFormsUtil.GetIndex(CB_RelearnMove3); Entity.RelearnMove4 = WinFormsUtil.GetIndex(CB_RelearnMove4); } + if (Entity is PA8 pa8) + pa8.AlphaMove = WinFormsUtil.GetIndex(CB_AlphaMastered); UpdateLegality(skipMoveRepop: true); } @@ -1802,14 +1809,36 @@ private void OpenHistory(object sender, EventArgs e) private void B_Records_Click(object sender, EventArgs e) { + if (Entity is not ITechRecord8 t) + return; + + if (ModifierKeys == Keys.Shift) + { + t.SetRecordFlags(Entity.Moves); + UpdateLegality(); + return; + } + + using var form = new TechRecordEditor(t, Entity); + form.ShowDialog(); + UpdateLegality(); + } + + private void B_MoveShop_Click(object sender, EventArgs e) + { + if (Entity is not IMoveShop8Mastery m) + return; + if (ModifierKeys == Keys.Shift) { - Entity.SetRecordFlags(Entity.Moves); + m.ClearMoveShopFlags(); + m.SetMoveShopFlags(Entity.Moves); + m.SetMoveShopFlagsMastered(); UpdateLegality(); return; } - using var form = new TechRecordEditor(Entity); + using var form = new MoveShopEditor(m, m, Entity); form.ShowDialog(); UpdateLegality(); } @@ -1842,8 +1871,10 @@ private void ToggleInterface(PKM t) BTN_Medals.Visible = gen is 6 or 7 && !pb7; FLP_Country.Visible = FLP_SubRegion.Visible = FLP_3DSRegion.Visible = t is IRegionOrigin; FLP_OriginalNature.Visible = gen >= 8; - B_Records.Visible = gen >= 8; + B_Records.Visible = t is ITechRecord8; + B_MoveShop.Visible = t is IMoveShop8Mastery; CB_HTLanguage.Visible = gen >= 8; + L_AlphaMastered.Visible = CB_AlphaMastered.Visible = t is PA8; ToggleInterface(Entity.Format); } @@ -1945,6 +1976,7 @@ private void CenterSubEditors() { // Recenter PKM SubEditors FLP_PKMEditors.Location = new Point((tabMain.TabPages[0].Width - FLP_PKMEditors.Width) / 2, FLP_PKMEditors.Location.Y); + FLP_MoveFlags.Location = new Point((tabMain.TabPages[0].Width - FLP_MoveFlags.Width) / 2, FLP_MoveFlags.Location.Y); } public void EnableDragDrop(DragEventHandler enter, DragEventHandler drop) @@ -2072,6 +2104,8 @@ private void PopulateFilteredDataSources(ITrainerInfo sav, bool force = false) LegalMoveSource.ReloadMoves(source.Moves); foreach (var cb in Moves.Concat(Relearn)) SetIfDifferentCount(source.Moves, cb, force); + if (sav is SAV8LA) + SetIfDifferentCount(source.Moves, CB_AlphaMastered, force); } } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/SizeCP.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/SizeCP.Designer.cs index 69e6389ba1b..9ec802ef93a 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/SizeCP.Designer.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/SizeCP.Designer.cs @@ -97,7 +97,7 @@ private void InitializeComponent() this.L_Height.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.L_Height.Location = new System.Drawing.Point(3, 0); this.L_Height.Name = "L_Height"; - this.L_Height.Size = new System.Drawing.Size(57, 13); + this.L_Height.Size = new System.Drawing.Size(57, 20); this.L_Height.TabIndex = 1; this.L_Height.Text = "Height:"; this.L_Height.TextAlign = System.Drawing.ContentAlignment.MiddleRight; diff --git a/PKHeX.WinForms/Controls/PKM Editor/SizeCP.cs b/PKHeX.WinForms/Controls/PKM Editor/SizeCP.cs index 468fe45c859..f86d52bd9c7 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/SizeCP.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/SizeCP.cs @@ -8,7 +8,8 @@ namespace PKHeX.WinForms.Controls public partial class SizeCP : UserControl { private IScaledSize? ss; - private PB7? pkm; + private IScaledSizeValue? sv; + private ICombatPower? pkm; private bool Loading; public SizeCP() @@ -22,8 +23,9 @@ public SizeCP() public void LoadPKM(PKM pk) { - pkm = pk as PB7; + pkm = pk as ICombatPower; ss = pk as IScaledSize; + sv = pk as IScaledSizeValue; if (ss == null) return; TryResetStats(); @@ -34,11 +36,18 @@ public void TryResetStats() if (!Initialized) return; - if (pkm != null && CHK_Auto.Checked) - pkm.ResetCalculatedValues(); + if (CHK_Auto.Checked) + ResetCalculatedStats(); LoadStoredValues(); } + private void ResetCalculatedStats() + { + sv?.ResetHeight(); + sv?.ResetWeight(); + pkm?.ResetCP(); + } + private void LoadStoredValues() { Loading = true; @@ -47,11 +56,14 @@ private void LoadStoredValues() NUD_HeightScalar.Value = ss.HeightScalar; NUD_WeightScalar.Value = ss.WeightScalar; } + if (sv != null) + { + TB_HeightAbs.Text = sv.HeightAbsolute.ToString(CultureInfo.InvariantCulture); + TB_WeightAbs.Text = sv.WeightAbsolute.ToString(CultureInfo.InvariantCulture); + } if (pkm != null) { MT_CP.Text = Math.Min(65535, pkm.Stat_CP).ToString(); - TB_HeightAbs.Text = pkm.HeightAbsolute.ToString(CultureInfo.InvariantCulture); - TB_WeightAbs.Text = pkm.WeightAbsolute.ToString(CultureInfo.InvariantCulture); } Loading = false; } @@ -61,13 +73,13 @@ private void UpdateFlagState(object sender, EventArgs e) if (!CHK_Auto.Checked) return; - pkm?.ResetCalculatedValues(); + ResetCalculatedStats(); LoadStoredValues(); } private void MT_CP_TextChanged(object sender, EventArgs e) { - if (int.TryParse(MT_CP.Text, out var cp) && pkm != null) + if (pkm != null && int.TryParse(MT_CP.Text, out var cp)) pkm.Stat_CP = Math.Min(65535, cp); } @@ -79,10 +91,10 @@ private void NUD_HeightScalar_ValueChanged(object sender, EventArgs e) L_SizeH.Text = SizeClass[(int)PokeSizeUtil.GetSizeRating(ss.HeightScalar)]; } - if (!CHK_Auto.Checked || Loading || pkm == null) + if (!CHK_Auto.Checked || Loading || sv == null) return; - pkm.ResetHeight(); - TB_HeightAbs.Text = pkm.HeightAbsolute.ToString("F8"); + sv.ResetHeight(); + TB_HeightAbs.Text = sv.HeightAbsolute.ToString(CultureInfo.InvariantCulture); } private void NUD_WeightScalar_ValueChanged(object sender, EventArgs e) @@ -93,36 +105,39 @@ private void NUD_WeightScalar_ValueChanged(object sender, EventArgs e) L_SizeW.Text = SizeClass[(int)PokeSizeUtil.GetSizeRating(ss.WeightScalar)]; } - if (!CHK_Auto.Checked || Loading || pkm == null) + if (!CHK_Auto.Checked || Loading || sv == null) return; - pkm.ResetWeight(); - TB_WeightAbs.Text = pkm.WeightAbsolute.ToString("F8"); + sv.ResetWeight(); + TB_WeightAbs.Text = sv.WeightAbsolute.ToString(CultureInfo.InvariantCulture); } private void TB_HeightAbs_TextChanged(object sender, EventArgs e) { - if (pkm == null) + if (sv == null) return; if (CHK_Auto.Checked) - pkm.ResetHeight(); + sv.ResetHeight(); else if (float.TryParse(TB_HeightAbs.Text, out var result)) - pkm.HeightAbsolute = result; + sv.HeightAbsolute = result; } private void TB_WeightAbs_TextChanged(object sender, EventArgs e) { - if (pkm == null) + if (sv == null) return; if (CHK_Auto.Checked) - pkm.ResetWeight(); + sv.ResetWeight(); else if (float.TryParse(TB_WeightAbs.Text, out var result)) - pkm.WeightAbsolute = result; + sv.WeightAbsolute = result; } public void ToggleVisibility(PKM pk) { - var pb7 = pk is PB7; - FLP_CP.Visible = L_CP.Visible = TB_HeightAbs.Visible = TB_WeightAbs.Visible = pb7; + bool isCP = pk is PB7; + bool isAbsolute = pk is IScaledSizeValue; + MT_CP.Visible = L_CP.Visible = isCP; + TB_HeightAbs.Visible = TB_WeightAbs.Visible = isAbsolute; + FLP_CP.Visible = isCP || isAbsolute; // Auto checkbox } private void ClickScalarEntry(object sender, EventArgs e) diff --git a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.Designer.cs b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.Designer.cs index 8254e4a5edc..4a6f118d7cc 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.Designer.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.Designer.cs @@ -38,6 +38,7 @@ private void InitializeComponent() this.Label_IVs = new System.Windows.Forms.Label(); this.Label_EVs = new System.Windows.Forms.Label(); this.Label_AVs = new System.Windows.Forms.Label(); + this.Label_GVs = new System.Windows.Forms.Label(); this.Label_Stats = new System.Windows.Forms.Label(); this.FLP_HP = new System.Windows.Forms.FlowLayoutPanel(); this.Label_HP = new System.Windows.Forms.Label(); @@ -46,6 +47,7 @@ private void InitializeComponent() this.TB_IVHP = new System.Windows.Forms.MaskedTextBox(); this.TB_EVHP = new System.Windows.Forms.MaskedTextBox(); this.TB_AVHP = new System.Windows.Forms.MaskedTextBox(); + this.TB_GVHP = new System.Windows.Forms.MaskedTextBox(); this.Stat_HP = new System.Windows.Forms.MaskedTextBox(); this.FLP_Atk = new System.Windows.Forms.FlowLayoutPanel(); this.Label_ATK = new System.Windows.Forms.Label(); @@ -54,6 +56,7 @@ private void InitializeComponent() this.TB_IVATK = new System.Windows.Forms.MaskedTextBox(); this.TB_EVATK = new System.Windows.Forms.MaskedTextBox(); this.TB_AVATK = new System.Windows.Forms.MaskedTextBox(); + this.TB_GVATK = new System.Windows.Forms.MaskedTextBox(); this.Stat_ATK = new System.Windows.Forms.MaskedTextBox(); this.FLP_Def = new System.Windows.Forms.FlowLayoutPanel(); this.Label_DEF = new System.Windows.Forms.Label(); @@ -62,6 +65,7 @@ private void InitializeComponent() this.TB_IVDEF = new System.Windows.Forms.MaskedTextBox(); this.TB_EVDEF = new System.Windows.Forms.MaskedTextBox(); this.TB_AVDEF = new System.Windows.Forms.MaskedTextBox(); + this.TB_GVDEF = new System.Windows.Forms.MaskedTextBox(); this.Stat_DEF = new System.Windows.Forms.MaskedTextBox(); this.FLP_SpA = new System.Windows.Forms.FlowLayoutPanel(); this.FLP_SpALeft = new System.Windows.Forms.FlowLayoutPanel(); @@ -72,6 +76,7 @@ private void InitializeComponent() this.TB_IVSPA = new System.Windows.Forms.MaskedTextBox(); this.TB_EVSPA = new System.Windows.Forms.MaskedTextBox(); this.TB_AVSPA = new System.Windows.Forms.MaskedTextBox(); + this.TB_GVSPA = new System.Windows.Forms.MaskedTextBox(); this.Stat_SPA = new System.Windows.Forms.MaskedTextBox(); this.FLP_SpD = new System.Windows.Forms.FlowLayoutPanel(); this.Label_SPD = new System.Windows.Forms.Label(); @@ -80,6 +85,7 @@ private void InitializeComponent() this.TB_IVSPD = new System.Windows.Forms.MaskedTextBox(); this.TB_EVSPD = new System.Windows.Forms.MaskedTextBox(); this.TB_AVSPD = new System.Windows.Forms.MaskedTextBox(); + this.TB_GVSPD = new System.Windows.Forms.MaskedTextBox(); this.Stat_SPD = new System.Windows.Forms.MaskedTextBox(); this.FLP_Spe = new System.Windows.Forms.FlowLayoutPanel(); this.Label_SPE = new System.Windows.Forms.Label(); @@ -88,6 +94,7 @@ private void InitializeComponent() this.TB_IVSPE = new System.Windows.Forms.MaskedTextBox(); this.TB_EVSPE = new System.Windows.Forms.MaskedTextBox(); this.TB_AVSPE = new System.Windows.Forms.MaskedTextBox(); + this.TB_GVSPE = new System.Windows.Forms.MaskedTextBox(); this.Stat_SPE = new System.Windows.Forms.MaskedTextBox(); this.FLP_StatsTotal = new System.Windows.Forms.FlowLayoutPanel(); this.Label_Total = new System.Windows.Forms.Label(); @@ -114,6 +121,9 @@ private void InitializeComponent() this.L_DynamaxLevel = new System.Windows.Forms.Label(); this.CB_DynamaxLevel = new System.Windows.Forms.ComboBox(); this.CHK_Gigantamax = new System.Windows.Forms.CheckBox(); + this.FLP_AlphaNoble = new System.Windows.Forms.FlowLayoutPanel(); + this.CHK_IsAlpha = new System.Windows.Forms.CheckBox(); + this.CHK_IsNoble = new System.Windows.Forms.CheckBox(); this.EVTip = new System.Windows.Forms.ToolTip(this.components); this.FLP_Stats.SuspendLayout(); this.FLP_StatHeader.SuspendLayout(); @@ -139,6 +149,7 @@ private void InitializeComponent() this.FLP_Characteristic.SuspendLayout(); this.PAN_BTN.SuspendLayout(); this.FLP_DynamaxLevel.SuspendLayout(); + this.FLP_AlphaNoble.SuspendLayout(); this.SuspendLayout(); // // FLP_Stats @@ -156,10 +167,11 @@ private void InitializeComponent() this.FLP_Stats.Controls.Add(this.FLP_Characteristic); this.FLP_Stats.Controls.Add(this.PAN_BTN); this.FLP_Stats.Controls.Add(this.FLP_DynamaxLevel); + this.FLP_Stats.Controls.Add(this.FLP_AlphaNoble); this.FLP_Stats.Dock = System.Windows.Forms.DockStyle.Fill; this.FLP_Stats.Location = new System.Drawing.Point(0, 0); this.FLP_Stats.Name = "FLP_Stats"; - this.FLP_Stats.Size = new System.Drawing.Size(270, 303); + this.FLP_Stats.Size = new System.Drawing.Size(312, 318); this.FLP_Stats.TabIndex = 106; // // FLP_StatHeader @@ -170,7 +182,7 @@ private void InitializeComponent() this.FLP_StatHeader.Location = new System.Drawing.Point(0, 0); this.FLP_StatHeader.Margin = new System.Windows.Forms.Padding(0); this.FLP_StatHeader.Name = "FLP_StatHeader"; - this.FLP_StatHeader.Size = new System.Drawing.Size(272, 22); + this.FLP_StatHeader.Size = new System.Drawing.Size(312, 22); this.FLP_StatHeader.TabIndex = 122; // // FLP_HackedStats @@ -203,11 +215,12 @@ private void InitializeComponent() this.FLP_StatsHeaderRight.Controls.Add(this.Label_IVs); this.FLP_StatsHeaderRight.Controls.Add(this.Label_EVs); this.FLP_StatsHeaderRight.Controls.Add(this.Label_AVs); + this.FLP_StatsHeaderRight.Controls.Add(this.Label_GVs); this.FLP_StatsHeaderRight.Controls.Add(this.Label_Stats); this.FLP_StatsHeaderRight.Location = new System.Drawing.Point(75, 0); this.FLP_StatsHeaderRight.Margin = new System.Windows.Forms.Padding(0); this.FLP_StatsHeaderRight.Name = "FLP_StatsHeaderRight"; - this.FLP_StatsHeaderRight.Size = new System.Drawing.Size(187, 21); + this.FLP_StatsHeaderRight.Size = new System.Drawing.Size(237, 21); this.FLP_StatsHeaderRight.TabIndex = 123; // // Label_Base @@ -250,9 +263,19 @@ private void InitializeComponent() this.Label_AVs.Text = "AVs"; this.Label_AVs.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // + // Label_GVs + // + this.Label_GVs.Location = new System.Drawing.Point(134, 0); + this.Label_GVs.Margin = new System.Windows.Forms.Padding(0); + this.Label_GVs.Name = "Label_GVs"; + this.Label_GVs.Size = new System.Drawing.Size(35, 21); + this.Label_GVs.TabIndex = 32; + this.Label_GVs.Text = "GVs"; + this.Label_GVs.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // // Label_Stats // - this.Label_Stats.Location = new System.Drawing.Point(134, 0); + this.Label_Stats.Location = new System.Drawing.Point(169, 0); this.Label_Stats.Margin = new System.Windows.Forms.Padding(0); this.Label_Stats.Name = "Label_Stats"; this.Label_Stats.Size = new System.Drawing.Size(35, 21); @@ -268,7 +291,7 @@ private void InitializeComponent() this.FLP_HP.Location = new System.Drawing.Point(0, 22); this.FLP_HP.Margin = new System.Windows.Forms.Padding(0); this.FLP_HP.Name = "FLP_HP"; - this.FLP_HP.Size = new System.Drawing.Size(272, 21); + this.FLP_HP.Size = new System.Drawing.Size(312, 21); this.FLP_HP.TabIndex = 123; // // Label_HP @@ -289,11 +312,12 @@ private void InitializeComponent() this.FLP_HPRight.Controls.Add(this.TB_IVHP); this.FLP_HPRight.Controls.Add(this.TB_EVHP); this.FLP_HPRight.Controls.Add(this.TB_AVHP); + this.FLP_HPRight.Controls.Add(this.TB_GVHP); this.FLP_HPRight.Controls.Add(this.Stat_HP); this.FLP_HPRight.Location = new System.Drawing.Point(77, 0); this.FLP_HPRight.Margin = new System.Windows.Forms.Padding(0); this.FLP_HPRight.Name = "FLP_HPRight"; - this.FLP_HPRight.Size = new System.Drawing.Size(185, 21); + this.FLP_HPRight.Size = new System.Drawing.Size(217, 21); this.FLP_HPRight.TabIndex = 121; // // TB_BaseHP @@ -350,11 +374,24 @@ private void InitializeComponent() this.TB_AVHP.Click += new System.EventHandler(this.ClickAV); this.TB_AVHP.TextChanged += new System.EventHandler(this.UpdateAVs); // + // TB_GVHP + // + this.TB_GVHP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TB_GVHP.Location = new System.Drawing.Point(131, 0); + this.TB_GVHP.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.TB_GVHP.Mask = "000"; + this.TB_GVHP.Name = "TB_GVHP"; + this.TB_GVHP.Size = new System.Drawing.Size(28, 20); + this.TB_GVHP.TabIndex = 48; + this.TB_GVHP.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.TB_GVHP.Click += new System.EventHandler(this.ClickGV); + this.TB_GVHP.TextChanged += new System.EventHandler(this.UpdateGVs); + // // Stat_HP // this.Stat_HP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Stat_HP.Enabled = false; - this.Stat_HP.Location = new System.Drawing.Point(131, 0); + this.Stat_HP.Location = new System.Drawing.Point(165, 0); this.Stat_HP.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); this.Stat_HP.Mask = "00000"; this.Stat_HP.Name = "Stat_HP"; @@ -372,7 +409,7 @@ private void InitializeComponent() this.FLP_Atk.Location = new System.Drawing.Point(0, 43); this.FLP_Atk.Margin = new System.Windows.Forms.Padding(0); this.FLP_Atk.Name = "FLP_Atk"; - this.FLP_Atk.Size = new System.Drawing.Size(272, 21); + this.FLP_Atk.Size = new System.Drawing.Size(312, 21); this.FLP_Atk.TabIndex = 124; // // Label_ATK @@ -393,11 +430,12 @@ private void InitializeComponent() this.FLP_AtkRight.Controls.Add(this.TB_IVATK); this.FLP_AtkRight.Controls.Add(this.TB_EVATK); this.FLP_AtkRight.Controls.Add(this.TB_AVATK); + this.FLP_AtkRight.Controls.Add(this.TB_GVATK); this.FLP_AtkRight.Controls.Add(this.Stat_ATK); this.FLP_AtkRight.Location = new System.Drawing.Point(77, 0); this.FLP_AtkRight.Margin = new System.Windows.Forms.Padding(0); this.FLP_AtkRight.Name = "FLP_AtkRight"; - this.FLP_AtkRight.Size = new System.Drawing.Size(185, 21); + this.FLP_AtkRight.Size = new System.Drawing.Size(217, 21); this.FLP_AtkRight.TabIndex = 123; // // TB_BaseATK @@ -454,11 +492,24 @@ private void InitializeComponent() this.TB_AVATK.Click += new System.EventHandler(this.ClickAV); this.TB_AVATK.TextChanged += new System.EventHandler(this.UpdateAVs); // + // TB_GVATK + // + this.TB_GVATK.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TB_GVATK.Location = new System.Drawing.Point(131, 0); + this.TB_GVATK.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.TB_GVATK.Mask = "000"; + this.TB_GVATK.Name = "TB_GVATK"; + this.TB_GVATK.Size = new System.Drawing.Size(28, 20); + this.TB_GVATK.TabIndex = 49; + this.TB_GVATK.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.TB_GVATK.Click += new System.EventHandler(this.ClickGV); + this.TB_GVATK.TextChanged += new System.EventHandler(this.UpdateGVs); + // // Stat_ATK // this.Stat_ATK.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Stat_ATK.Enabled = false; - this.Stat_ATK.Location = new System.Drawing.Point(131, 0); + this.Stat_ATK.Location = new System.Drawing.Point(165, 0); this.Stat_ATK.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); this.Stat_ATK.Mask = "00000"; this.Stat_ATK.Name = "Stat_ATK"; @@ -476,7 +527,7 @@ private void InitializeComponent() this.FLP_Def.Location = new System.Drawing.Point(0, 64); this.FLP_Def.Margin = new System.Windows.Forms.Padding(0); this.FLP_Def.Name = "FLP_Def"; - this.FLP_Def.Size = new System.Drawing.Size(272, 21); + this.FLP_Def.Size = new System.Drawing.Size(312, 21); this.FLP_Def.TabIndex = 125; // // Label_DEF @@ -497,11 +548,12 @@ private void InitializeComponent() this.FLP_DefRight.Controls.Add(this.TB_IVDEF); this.FLP_DefRight.Controls.Add(this.TB_EVDEF); this.FLP_DefRight.Controls.Add(this.TB_AVDEF); + this.FLP_DefRight.Controls.Add(this.TB_GVDEF); this.FLP_DefRight.Controls.Add(this.Stat_DEF); this.FLP_DefRight.Location = new System.Drawing.Point(77, 0); this.FLP_DefRight.Margin = new System.Windows.Forms.Padding(0); this.FLP_DefRight.Name = "FLP_DefRight"; - this.FLP_DefRight.Size = new System.Drawing.Size(185, 21); + this.FLP_DefRight.Size = new System.Drawing.Size(217, 21); this.FLP_DefRight.TabIndex = 123; // // TB_BaseDEF @@ -558,11 +610,24 @@ private void InitializeComponent() this.TB_AVDEF.Click += new System.EventHandler(this.ClickAV); this.TB_AVDEF.TextChanged += new System.EventHandler(this.UpdateAVs); // + // TB_GVDEF + // + this.TB_GVDEF.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TB_GVDEF.Location = new System.Drawing.Point(131, 0); + this.TB_GVDEF.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.TB_GVDEF.Mask = "000"; + this.TB_GVDEF.Name = "TB_GVDEF"; + this.TB_GVDEF.Size = new System.Drawing.Size(28, 20); + this.TB_GVDEF.TabIndex = 50; + this.TB_GVDEF.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.TB_GVDEF.Click += new System.EventHandler(this.ClickGV); + this.TB_GVDEF.TextChanged += new System.EventHandler(this.UpdateGVs); + // // Stat_DEF // this.Stat_DEF.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Stat_DEF.Enabled = false; - this.Stat_DEF.Location = new System.Drawing.Point(131, 0); + this.Stat_DEF.Location = new System.Drawing.Point(165, 0); this.Stat_DEF.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); this.Stat_DEF.Mask = "00000"; this.Stat_DEF.Name = "Stat_DEF"; @@ -580,7 +645,7 @@ private void InitializeComponent() this.FLP_SpA.Location = new System.Drawing.Point(0, 85); this.FLP_SpA.Margin = new System.Windows.Forms.Padding(0); this.FLP_SpA.Name = "FLP_SpA"; - this.FLP_SpA.Size = new System.Drawing.Size(272, 21); + this.FLP_SpA.Size = new System.Drawing.Size(312, 21); this.FLP_SpA.TabIndex = 126; // // FLP_SpALeft @@ -624,11 +689,12 @@ private void InitializeComponent() this.FLP_SpARight.Controls.Add(this.TB_IVSPA); this.FLP_SpARight.Controls.Add(this.TB_EVSPA); this.FLP_SpARight.Controls.Add(this.TB_AVSPA); + this.FLP_SpARight.Controls.Add(this.TB_GVSPA); this.FLP_SpARight.Controls.Add(this.Stat_SPA); this.FLP_SpARight.Location = new System.Drawing.Point(77, 0); this.FLP_SpARight.Margin = new System.Windows.Forms.Padding(0); this.FLP_SpARight.Name = "FLP_SpARight"; - this.FLP_SpARight.Size = new System.Drawing.Size(185, 21); + this.FLP_SpARight.Size = new System.Drawing.Size(217, 21); this.FLP_SpARight.TabIndex = 123; // // TB_BaseSPA @@ -685,11 +751,24 @@ private void InitializeComponent() this.TB_AVSPA.Click += new System.EventHandler(this.ClickAV); this.TB_AVSPA.TextChanged += new System.EventHandler(this.UpdateAVs); // + // TB_GVSPA + // + this.TB_GVSPA.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TB_GVSPA.Location = new System.Drawing.Point(131, 0); + this.TB_GVSPA.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.TB_GVSPA.Mask = "000"; + this.TB_GVSPA.Name = "TB_GVSPA"; + this.TB_GVSPA.Size = new System.Drawing.Size(28, 20); + this.TB_GVSPA.TabIndex = 51; + this.TB_GVSPA.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.TB_GVSPA.Click += new System.EventHandler(this.ClickGV); + this.TB_GVSPA.TextChanged += new System.EventHandler(this.UpdateGVs); + // // Stat_SPA // this.Stat_SPA.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Stat_SPA.Enabled = false; - this.Stat_SPA.Location = new System.Drawing.Point(131, 0); + this.Stat_SPA.Location = new System.Drawing.Point(165, 0); this.Stat_SPA.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); this.Stat_SPA.Mask = "00000"; this.Stat_SPA.Name = "Stat_SPA"; @@ -707,7 +786,7 @@ private void InitializeComponent() this.FLP_SpD.Location = new System.Drawing.Point(0, 106); this.FLP_SpD.Margin = new System.Windows.Forms.Padding(0); this.FLP_SpD.Name = "FLP_SpD"; - this.FLP_SpD.Size = new System.Drawing.Size(272, 21); + this.FLP_SpD.Size = new System.Drawing.Size(312, 21); this.FLP_SpD.TabIndex = 127; // // Label_SPD @@ -728,11 +807,12 @@ private void InitializeComponent() this.FLP_SpDRight.Controls.Add(this.TB_IVSPD); this.FLP_SpDRight.Controls.Add(this.TB_EVSPD); this.FLP_SpDRight.Controls.Add(this.TB_AVSPD); + this.FLP_SpDRight.Controls.Add(this.TB_GVSPD); this.FLP_SpDRight.Controls.Add(this.Stat_SPD); this.FLP_SpDRight.Location = new System.Drawing.Point(77, 0); this.FLP_SpDRight.Margin = new System.Windows.Forms.Padding(0); this.FLP_SpDRight.Name = "FLP_SpDRight"; - this.FLP_SpDRight.Size = new System.Drawing.Size(185, 21); + this.FLP_SpDRight.Size = new System.Drawing.Size(217, 21); this.FLP_SpDRight.TabIndex = 123; // // TB_BaseSPD @@ -789,11 +869,24 @@ private void InitializeComponent() this.TB_AVSPD.Click += new System.EventHandler(this.ClickAV); this.TB_AVSPD.TextChanged += new System.EventHandler(this.UpdateAVs); // + // TB_GVSPD + // + this.TB_GVSPD.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TB_GVSPD.Location = new System.Drawing.Point(131, 0); + this.TB_GVSPD.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.TB_GVSPD.Mask = "000"; + this.TB_GVSPD.Name = "TB_GVSPD"; + this.TB_GVSPD.Size = new System.Drawing.Size(28, 20); + this.TB_GVSPD.TabIndex = 52; + this.TB_GVSPD.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.TB_GVSPD.Click += new System.EventHandler(this.ClickGV); + this.TB_GVSPD.TextChanged += new System.EventHandler(this.UpdateGVs); + // // Stat_SPD // this.Stat_SPD.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Stat_SPD.Enabled = false; - this.Stat_SPD.Location = new System.Drawing.Point(131, 0); + this.Stat_SPD.Location = new System.Drawing.Point(165, 0); this.Stat_SPD.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); this.Stat_SPD.Mask = "00000"; this.Stat_SPD.Name = "Stat_SPD"; @@ -811,7 +904,7 @@ private void InitializeComponent() this.FLP_Spe.Location = new System.Drawing.Point(0, 127); this.FLP_Spe.Margin = new System.Windows.Forms.Padding(0); this.FLP_Spe.Name = "FLP_Spe"; - this.FLP_Spe.Size = new System.Drawing.Size(272, 21); + this.FLP_Spe.Size = new System.Drawing.Size(312, 21); this.FLP_Spe.TabIndex = 128; // // Label_SPE @@ -832,11 +925,12 @@ private void InitializeComponent() this.FLP_SpeRight.Controls.Add(this.TB_IVSPE); this.FLP_SpeRight.Controls.Add(this.TB_EVSPE); this.FLP_SpeRight.Controls.Add(this.TB_AVSPE); + this.FLP_SpeRight.Controls.Add(this.TB_GVSPE); this.FLP_SpeRight.Controls.Add(this.Stat_SPE); this.FLP_SpeRight.Location = new System.Drawing.Point(77, 0); this.FLP_SpeRight.Margin = new System.Windows.Forms.Padding(0); this.FLP_SpeRight.Name = "FLP_SpeRight"; - this.FLP_SpeRight.Size = new System.Drawing.Size(185, 21); + this.FLP_SpeRight.Size = new System.Drawing.Size(217, 21); this.FLP_SpeRight.TabIndex = 123; // // TB_BaseSPE @@ -893,11 +987,24 @@ private void InitializeComponent() this.TB_AVSPE.Click += new System.EventHandler(this.ClickAV); this.TB_AVSPE.TextChanged += new System.EventHandler(this.UpdateAVs); // + // TB_GVSPE + // + this.TB_GVSPE.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TB_GVSPE.Location = new System.Drawing.Point(131, 0); + this.TB_GVSPE.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.TB_GVSPE.Mask = "000"; + this.TB_GVSPE.Name = "TB_GVSPE"; + this.TB_GVSPE.Size = new System.Drawing.Size(28, 20); + this.TB_GVSPE.TabIndex = 53; + this.TB_GVSPE.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.TB_GVSPE.Click += new System.EventHandler(this.ClickGV); + this.TB_GVSPE.TextChanged += new System.EventHandler(this.UpdateGVs); + // // Stat_SPE // this.Stat_SPE.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Stat_SPE.Enabled = false; - this.Stat_SPE.Location = new System.Drawing.Point(131, 0); + this.Stat_SPE.Location = new System.Drawing.Point(165, 0); this.Stat_SPE.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); this.Stat_SPE.Mask = "00000"; this.Stat_SPE.Name = "Stat_SPE"; @@ -915,7 +1022,7 @@ private void InitializeComponent() this.FLP_StatsTotal.Location = new System.Drawing.Point(0, 148); this.FLP_StatsTotal.Margin = new System.Windows.Forms.Padding(0); this.FLP_StatsTotal.Name = "FLP_StatsTotal"; - this.FLP_StatsTotal.Size = new System.Drawing.Size(272, 21); + this.FLP_StatsTotal.Size = new System.Drawing.Size(312, 21); this.FLP_StatsTotal.TabIndex = 129; // // Label_Total @@ -1200,12 +1307,46 @@ private void InitializeComponent() this.CHK_Gigantamax.UseVisualStyleBackColor = true; this.CHK_Gigantamax.CheckedChanged += new System.EventHandler(this.CHK_Gigantamax_CheckedChanged); // + // FLP_AlphaNoble + // + this.FLP_AlphaNoble.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.FLP_AlphaNoble.Controls.Add(this.CHK_IsAlpha); + this.FLP_AlphaNoble.Controls.Add(this.CHK_IsNoble); + this.FLP_AlphaNoble.Location = new System.Drawing.Point(0, 285); + this.FLP_AlphaNoble.Margin = new System.Windows.Forms.Padding(0); + this.FLP_AlphaNoble.Name = "FLP_AlphaNoble"; + this.FLP_AlphaNoble.Size = new System.Drawing.Size(270, 21); + this.FLP_AlphaNoble.TabIndex = 134; + // + // CHK_IsAlpha + // + this.CHK_IsAlpha.AutoSize = true; + this.CHK_IsAlpha.Location = new System.Drawing.Point(55, 3); + this.CHK_IsAlpha.Margin = new System.Windows.Forms.Padding(95, 2, 3, 3); + this.CHK_IsAlpha.Name = "CHK_IsAlpha"; + this.CHK_IsAlpha.Size = new System.Drawing.Size(64, 17); + this.CHK_IsAlpha.TabIndex = 44; + this.CHK_IsAlpha.Text = "Alpha"; + this.CHK_IsAlpha.UseVisualStyleBackColor = true; + this.CHK_IsAlpha.CheckedChanged += new System.EventHandler(this.CHK_IsAlpha_CheckedChanged); + // + // CHK_IsNoble + // + this.CHK_IsNoble.AutoSize = true; + this.CHK_IsNoble.Location = new System.Drawing.Point(55, 3); + this.CHK_IsNoble.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3); + this.CHK_IsNoble.Name = "CHK_IsNoble"; + this.CHK_IsNoble.Size = new System.Drawing.Size(64, 17); + this.CHK_IsNoble.TabIndex = 44; + this.CHK_IsNoble.Text = "Noble"; + this.CHK_IsNoble.UseVisualStyleBackColor = true; + // // StatEditor // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; this.Controls.Add(this.FLP_Stats); this.Name = "StatEditor"; - this.Size = new System.Drawing.Size(270, 303); + this.Size = new System.Drawing.Size(312, 318); this.FLP_Stats.ResumeLayout(false); this.FLP_StatHeader.ResumeLayout(false); this.FLP_HackedStats.ResumeLayout(false); @@ -1238,6 +1379,8 @@ private void InitializeComponent() this.PAN_BTN.ResumeLayout(false); this.FLP_DynamaxLevel.ResumeLayout(false); this.FLP_DynamaxLevel.PerformLayout(); + this.FLP_AlphaNoble.ResumeLayout(false); + this.FLP_AlphaNoble.PerformLayout(); this.ResumeLayout(false); } @@ -1330,5 +1473,15 @@ private void InitializeComponent() private System.Windows.Forms.Label L_DynamaxLevel; public System.Windows.Forms.ComboBox CB_DynamaxLevel; public System.Windows.Forms.CheckBox CHK_Gigantamax; + private System.Windows.Forms.Label Label_GVs; + private System.Windows.Forms.MaskedTextBox TB_GVHP; + private System.Windows.Forms.MaskedTextBox TB_GVATK; + private System.Windows.Forms.MaskedTextBox TB_GVDEF; + private System.Windows.Forms.MaskedTextBox TB_GVSPA; + private System.Windows.Forms.MaskedTextBox TB_GVSPD; + private System.Windows.Forms.MaskedTextBox TB_GVSPE; + private System.Windows.Forms.FlowLayoutPanel FLP_AlphaNoble; + public System.Windows.Forms.CheckBox CHK_IsAlpha; + public System.Windows.Forms.CheckBox CHK_IsNoble; } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs index bd0ca63b53d..673423b3e00 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/StatEditor.cs @@ -15,6 +15,7 @@ public StatEditor() MT_IVs = new[] {TB_IVHP, TB_IVATK, TB_IVDEF, TB_IVSPE, TB_IVSPA, TB_IVSPD}; MT_EVs = new[] {TB_EVHP, TB_EVATK, TB_EVDEF, TB_EVSPE, TB_EVSPA, TB_EVSPD}; MT_AVs = new[] {TB_AVHP, TB_AVATK, TB_AVDEF, TB_AVSPE, TB_AVSPA, TB_AVSPD}; + MT_GVs = new[] {TB_GVHP, TB_GVATK, TB_GVDEF, TB_GVSPE, TB_GVSPA, TB_GVSPD}; MT_Stats = new[] {Stat_HP, Stat_ATK, Stat_DEF, Stat_SPE, Stat_SPA, Stat_SPD}; L_Stats = new[] {Label_HP, Label_ATK, Label_DEF, Label_SPE, Label_SPA, Label_SPD}; MT_Base = new[] {TB_BaseHP, TB_BaseATK, TB_BaseDEF, TB_BaseSPE, TB_BaseSPA, TB_BaseSPD}; @@ -49,7 +50,7 @@ public bool Valid } private readonly Label[] L_Stats; - private readonly MaskedTextBox[] MT_EVs, MT_IVs, MT_AVs, MT_Stats, MT_Base; + private readonly MaskedTextBox[] MT_EVs, MT_IVs, MT_AVs, MT_GVs, MT_Stats, MT_Base; private PKM Entity => MainEditor.Entity; private bool ChangingFields @@ -119,6 +120,22 @@ private void ClickAV(object sender, EventArgs e) t.Text = 0.ToString(); } } + private void ClickGV(object sender, EventArgs e) + { + if (sender is not MaskedTextBox t || Entity is not IGanbaru g) + return; + + if ((ModifierKeys & Keys.Control) != 0) // Max + { + int index = Array.IndexOf(MT_GVs, t); + var max = g.GetMax(Entity, index).ToString(); + t.Text = t.Text == max ? 0.ToString() : max; + } + else if ((ModifierKeys & Keys.Alt) != 0) // Min + { + t.Text = 0.ToString(); + } + } public void UpdateIVs(object sender, EventArgs e) { @@ -133,6 +150,8 @@ public void UpdateIVs(object sender, EventArgs e) int index = Array.IndexOf(MT_IVs, m); Entity.SetIV(index, value); + if (Entity is IGanbaru g) + RefreshGanbaru(Entity, g, index); } RefreshDerivedValues(e); UpdateStats(); @@ -211,6 +230,27 @@ private void UpdateAVs(object sender, EventArgs e) UpdateStats(); } + private void UpdateGVs(object sender, EventArgs e) + { + if (Entity is not IGanbaru g) + return; + if (sender is MaskedTextBox m) + { + int value = Util.ToInt32(m.Text); + if (value > GanbaruExtensions.TrueMax) + { + m.Text = GanbaruExtensions.TrueMax.ToString(); + return; // recursive on text set + } + + int index = Array.IndexOf(MT_GVs, m); + g.SetGV(index, value); + RefreshGanbaru(Entity, g, index); + } + + UpdateStats(); + } + private void UpdateRandomEVs(object sender, EventArgs e) { var evs = ModifierKeys switch @@ -385,6 +425,15 @@ public void UpdateRandomIVs(object sender, EventArgs e) _ => Entity.SetRandomIVs(), }; LoadIVs(IVs); + if (Entity is IGanbaru g) + { + Entity.SetIVs(IVs); + if (ModifierKeys == Keys.Control) + g.SetSuggestedGanbaruValues(Entity); + else if (ModifierKeys == Keys.Alt) + g.ClearGanbaruValues(); + LoadGVs(g); + } } private void UpdateRandomAVs(object sender, EventArgs e) @@ -499,6 +548,33 @@ public void LoadAVs(IAwakened a) UpdateStats(); } + public void LoadGVs(IGanbaru a) + { + ChangingFields = true; + TB_GVHP.Text = a.GV_HP.ToString(); + TB_GVATK.Text = a.GV_ATK.ToString(); + TB_GVDEF.Text = a.GV_DEF.ToString(); + TB_GVSPE.Text = a.GV_SPE.ToString(); + TB_GVSPA.Text = a.GV_SPA.ToString(); + TB_GVSPD.Text = a.GV_SPD.ToString(); + ChangingFields = false; + for (int i = 0; i < 6; i++) + RefreshGanbaru(Entity, a, i); + UpdateStats(); + } + + private void RefreshGanbaru(PKM entity, IGanbaru ganbaru, int i) + { + int current = ganbaru.GetGV(i); + var max = ganbaru.GetMax(entity, i); + if (current > max) + MT_GVs[i].BackColor = EVsInvalid; + else if (current == max) + MT_GVs[i].BackColor = StatHyperTrained; + else + MT_GVs[i].ResetBackColor(); + } + public void ToggleInterface(PKM pk, int gen) { FLP_StatsTotal.Visible = gen >= 3; @@ -506,6 +582,7 @@ public void ToggleInterface(PKM pk, int gen) FLP_HPType.Visible = gen <= 7; FLP_HPPower.Visible = gen <= 5; FLP_DynamaxLevel.Visible = gen >= 8; + FLP_AlphaNoble.Visible = pk is PA8; switch (gen) { @@ -542,6 +619,11 @@ public void ToggleInterface(PKM pk, int gen) foreach (var mtb in MT_EVs) mtb.Visible = !showAV; + var showGV = pk is IGanbaru; + Label_GVs.Visible = showGV; + foreach (var mtb in MT_GVs) + mtb.Visible = showGV; + void SetEVMaskSize(Size s, string Mask) { foreach (var ctrl in MT_EVs) @@ -565,5 +647,11 @@ private void CHK_Gigantamax_CheckedChanged(object sender, EventArgs e) if (!ChangingFields) ((PKMEditor) MainEditor).UpdateSprite(); } + + private void CHK_IsAlpha_CheckedChanged(object sender, EventArgs e) + { + if (!ChangingFields) + ((PKMEditor) MainEditor).UpdateSprite(); + } } } diff --git a/PKHeX.WinForms/Controls/SAV Editor/BoxMenuStrip.cs b/PKHeX.WinForms/Controls/SAV Editor/BoxMenuStrip.cs index e5ed3dd0626..dd0cca2a683 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/BoxMenuStrip.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/BoxMenuStrip.cs @@ -79,6 +79,7 @@ private void AddItem(ISaveFileProvider sav, ToolStripDropDownItem parent, IBoxMa [BoxManipType.ModifyResetMoves] = Resources.date, [BoxManipType.ModifyRandomMoves] = Resources.wand, [BoxManipType.ModifyHyperTrain] = Resources.vallohi, + [BoxManipType.ModifyGanbaru] = Resources.vallohi, [BoxManipType.ModifyRemoveNicknames] = Resources.alphaAZ, [BoxManipType.ModifyRemoveItem] = Resources.gift, [BoxManipType.ModifyHeal] = Resources.heart, diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index e2ed348088c..4c39b7999a6 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -544,6 +544,7 @@ private void B_OpenBoxLayout_Click(object sender, EventArgs e) SAV7b b7 => new SAV_Trainer7GG(b7), SAV8SWSH swsh => new SAV_Trainer8(swsh), SAV8BS bs => new SAV_Trainer8b(bs), + SAV8LA la => new SAV_Trainer8a(la), _ => new SAV_SimpleTrainer(sav), }; @@ -593,7 +594,7 @@ private void B_Blocks_Click(object sender, EventArgs e) SAV7SM s => new SAV_Accessor(s, s.Blocks), SAV7USUM s => new SAV_Accessor(s, s.Blocks), SAV7b s => new SAV_Accessor(s, s.Blocks), - SAV8SWSH s => new SAV_BlockDump8(s), + ISCBlockArray s => new SAV_BlockDump8(s), _ => GetPropertyForm(sav), }; @@ -638,6 +639,7 @@ private void B_OpenPokedex_Click(object sender, EventArgs e) SAV7b b7 => new SAV_PokedexGG(b7), SAV8SWSH swsh => new SAV_PokedexSWSH(swsh), SAV8BS bs => new SAV_PokedexBDSP(bs), + SAV8LA la => new SAV_PokedexLA(la), _ => (Form?)null, }; form?.ShowDialog(); diff --git a/PKHeX.WinForms/MainWindow/Main.Designer.cs b/PKHeX.WinForms/MainWindow/Main.Designer.cs index 22762122c15..2c314d3e5bc 100644 --- a/PKHeX.WinForms/MainWindow/Main.Designer.cs +++ b/PKHeX.WinForms/MainWindow/Main.Designer.cs @@ -110,7 +110,7 @@ public void InitializeComponent() this.Menu_Open.Name = "Menu_Open"; this.Menu_Open.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); this.Menu_Open.ShowShortcutKeys = false; - this.Menu_Open.Size = new System.Drawing.Size(180, 22); + this.Menu_Open.Size = new System.Drawing.Size(133, 22); this.Menu_Open.Text = "&Open..."; this.Menu_Open.Click += new System.EventHandler(this.MainMenuOpen); // @@ -120,7 +120,7 @@ public void InitializeComponent() this.Menu_Save.Name = "Menu_Save"; this.Menu_Save.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.Menu_Save.ShowShortcutKeys = false; - this.Menu_Save.Size = new System.Drawing.Size(180, 22); + this.Menu_Save.Size = new System.Drawing.Size(133, 22); this.Menu_Save.Text = "&Save PKM..."; this.Menu_Save.Click += new System.EventHandler(this.MainMenuSave); // @@ -130,7 +130,7 @@ public void InitializeComponent() this.Menu_ExportSAV.Name = "Menu_ExportSAV"; this.Menu_ExportSAV.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); this.Menu_ExportSAV.ShowShortcutKeys = false; - this.Menu_ExportSAV.Size = new System.Drawing.Size(180, 22); + this.Menu_ExportSAV.Size = new System.Drawing.Size(133, 22); this.Menu_ExportSAV.Text = "&Export SAV..."; this.Menu_ExportSAV.Click += new System.EventHandler(this.ClickExportSAV); // @@ -140,7 +140,7 @@ public void InitializeComponent() this.Menu_Exit.Name = "Menu_Exit"; this.Menu_Exit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q))); this.Menu_Exit.ShowShortcutKeys = false; - this.Menu_Exit.Size = new System.Drawing.Size(180, 22); + this.Menu_Exit.Size = new System.Drawing.Size(133, 22); this.Menu_Exit.Text = "&Quit"; this.Menu_Exit.Click += new System.EventHandler(this.MainMenuExit); // @@ -400,7 +400,7 @@ public void InitializeComponent() // splitContainer1.Panel2 // this.splitContainer1.Panel2.Controls.Add(this.C_SAV); - this.splitContainer1.Size = new System.Drawing.Size(761, 356); + this.splitContainer1.Size = new System.Drawing.Size(761, 378); this.splitContainer1.SplitterDistance = 310; this.splitContainer1.SplitterWidth = 2; this.splitContainer1.TabIndex = 105; @@ -414,7 +414,7 @@ public void InitializeComponent() this.PKME_Tabs.Location = new System.Drawing.Point(0, 0); this.PKME_Tabs.Margin = new System.Windows.Forms.Padding(5); this.PKME_Tabs.Name = "PKME_Tabs"; - this.PKME_Tabs.Size = new System.Drawing.Size(310, 356); + this.PKME_Tabs.Size = new System.Drawing.Size(310, 378); this.PKME_Tabs.TabIndex = 103; this.PKME_Tabs.Unicode = true; this.PKME_Tabs.LegalityChanged += new System.EventHandler(this.PKME_Tabs_LegalityChanged); @@ -432,7 +432,7 @@ public void InitializeComponent() this.C_SAV.Menu_Redo = null; this.C_SAV.Menu_Undo = null; this.C_SAV.Name = "C_SAV"; - this.C_SAV.Size = new System.Drawing.Size(449, 356); + this.C_SAV.Size = new System.Drawing.Size(449, 378); this.C_SAV.TabIndex = 104; this.C_SAV.ViewIndex = -1; this.C_SAV.RequestCloneData += new System.EventHandler(this.ClickClone); @@ -454,8 +454,8 @@ public void InitializeComponent() // splitContainer2.Panel2 // this.splitContainer2.Panel2.Controls.Add(this.splitContainer1); - this.splitContainer2.Size = new System.Drawing.Size(761, 382); - this.splitContainer2.SplitterDistance = 25; + this.splitContainer2.Size = new System.Drawing.Size(761, 405); + this.splitContainer2.SplitterDistance = 26; this.splitContainer2.SplitterWidth = 1; this.splitContainer2.TabIndex = 106; // @@ -489,7 +489,7 @@ public void InitializeComponent() this.AllowDrop = true; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(761, 382); + this.ClientSize = new System.Drawing.Size(761, 405); this.Controls.Add(this.dragout); this.Controls.Add(this.PB_Legal); this.Controls.Add(this.splitContainer2); diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 1e1af2f8e66..02857d29a94 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -333,6 +333,9 @@ private void Menu_EncDatabase_Click(object sender, EventArgs e) var sav = C_SAV.SAV; Task.Run(() => { + var dir = TrainerPath; + if (!Directory.Exists(dir)) + return; var files = Directory.EnumerateFiles(TrainerPath, "*.*", SearchOption.AllDirectories); var pkm = BoxUtil.GetPKMsFromPaths(files, sav.Generation); foreach (var f in pkm) @@ -1183,7 +1186,9 @@ private void ClickSaveFileName(object sender, EventArgs e) return; var path = sav.Metadata.FilePath!; - if (WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgFileLoadSaveDetectReload, path) == DialogResult.Yes) + var time = new FileInfo(path).CreationTime; + var timeStamp = time.ToString(CultureInfo.CurrentCulture); + if (WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgFileLoadSaveDetectReload, path, timeStamp) == DialogResult.Yes) LoadFile(sav, path); // load save } catch (Exception ex) diff --git a/PKHeX.WinForms/MainWindow/Main.resx b/PKHeX.WinForms/MainWindow/Main.resx index 98a1e281de8..4054bfa9a10 100644 --- a/PKHeX.WinForms/MainWindow/Main.resx +++ b/PKHeX.WinForms/MainWindow/Main.resx @@ -118,9 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 107, 17 + + 17, 17 - - 132, 17 + + 56 \ No newline at end of file diff --git a/PKHeX.WinForms/PKHeX.WinForms.csproj b/PKHeX.WinForms/PKHeX.WinForms.csproj index 1f63bf96623..fe9c902979c 100644 --- a/PKHeX.WinForms/PKHeX.WinForms.csproj +++ b/PKHeX.WinForms/PKHeX.WinForms.csproj @@ -12,7 +12,7 @@ Resources\icon.ico PKHeX.WinForms.Program PKHeX - 22.01.01 + 22.02.04 10 enable diff --git a/PKHeX.WinForms/Properties/PKHeXSettings.cs b/PKHeX.WinForms/Properties/PKHeXSettings.cs index f5321cf347f..d2dcd49528a 100644 --- a/PKHeX.WinForms/Properties/PKHeXSettings.cs +++ b/PKHeX.WinForms/Properties/PKHeXSettings.cs @@ -217,8 +217,8 @@ public sealed class AdvancedSettings [LocalizedDescription("Allow PKM file conversion paths that are not possible via official methods. Individual properties will be copied sequentially.")] public bool AllowIncompatibleConversion { get; set; } - [LocalizedDescription("Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded.")] - public string PathBlockKeyListSWSH { get; set; } = "SCBlocks.txt"; + [LocalizedDescription("Folder path that contains dump(s) of block hash-names. If a specific dump file does not exist, only names defined within the program's code will be loaded.")] + public string PathBlockKeyList { get; set; } = string.Empty; [LocalizedDescription("Hide event variables below this event type value. Removes event values from the GUI that the user doesn't care to view.")] public NamedEventType HideEventTypeBelow { get; set; } diff --git a/PKHeX.WinForms/Properties/Resources.Designer.cs b/PKHeX.WinForms/Properties/Resources.Designer.cs index 22fd4822834..21fc4296a12 100644 --- a/PKHeX.WinForms/Properties/Resources.Designer.cs +++ b/PKHeX.WinForms/Properties/Resources.Designer.cs @@ -19,10 +19,10 @@ namespace PKHeX.WinForms.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public sealed class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; @@ -214,13 +214,14 @@ public static System.Drawing.Bitmap box_wp_default { /// Looks up a localized string similar to PKHeX - By Kaphotics ///http://projectpokemon.org/pkhex/ /// - ///21/10/01 - New Update: + ///22/01/01 - New Update: /// - Legality: - /// - - Added: Gen8 memory checks for unobtainable values. Thanks @Lusamine, @skadiv! - /// - - Changed: Ball legality rules updated for Gen7 starters to account for the new Gen8 raids. - /// - - Changed: Gen1 Tradeback handling reworked for less overhead. - /// - - Fixed more met locations for XD shadow encounters. Thanks @LegoFigure11! - /// - - Fixed: Gen4 Cute Charm PIDs correctly emit RNG frames for encounter matching purposes [rest of string was truncated]";. + /// - - Added: Hatch Counter legality checking. + /// - - Added: Contest Stat Sheen legality checking (roughly compared to amount of other contest stats gained). + /// - - Added: Munchlax encounter slots for DPPt and BDSP are now checked for Trainer ID legality. + /// - - Fixed: BDSP Gigantamax is now flagged illegal correctly. + /// - - Fixed: BDSP Meister Magikarp now recognized correctly. + /// - - Fixed: BDSP bred (egg) ball legali [rest of string was truncated]";. /// public static string changelog { get { @@ -448,6 +449,16 @@ public static System.Drawing.Bitmap gen_go { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap gen_la { + get { + object obj = ResourceManager.GetObject("gen_la", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -595,11 +606,11 @@ public static string lang_en { ///SAV_BlockDump8=Respaldo de bloques ///SAV_BoxLayout=Editor de fondos de Cajas ///SAV_BoxList=Visor de Almacenamiento - ///SAV_Capture7GG=Capture Record Editor + ///SAV_Capture7GG=Editor de Récord de Captura ///SAV_CGearSkin=Editor de la apariencia C-Gear ///SAV_Database=Base de Datos ///SAV_Encounters=Base de Datos - ///SAV_EventFlags [rest of string was truncated]";. + ///SAV_Even [rest of string was truncated]";. ///
public static string lang_es { get { @@ -680,10 +691,10 @@ public static string lang_it { ///SAV_EventFlags=イベントフラグ ///SAV_EventReset1=イベントリセット ///SAV_EventWork=Event Flag Editor + ///SAV_FlagWork8b=Event Flag Editor ///SAV_FolderList=フォルダリスト ///SAV_GameSelect=ゲームバーション - ///SAV_HallOfFame=殿堂入りデータ - ///SAV_HallOfFa [rest of string was truncated]";. + ///SA [rest of string was truncated]";. ///
public static string lang_ja { get { @@ -711,9 +722,9 @@ public static string lang_ja { ///SAV_EventFlags=이벤트 플래그 편집 도구 ///SAV_EventReset1=이벤트 초기화 도구 ///SAV_EventWork=이벤트 플래그 편집 도구 + ///SAV_FlagWork8b=Event Flag Editor ///SAV_FolderList=폴더 목록 - ///SAV_GameSelect=게임 선택 - ///SAV_HallOfFame=전당등록 편 [rest of string was truncated]";. + ///SAV_GameS [rest of string was truncated]";. ///
public static string lang_ko { get { @@ -741,14 +752,13 @@ public static string lang_ko { ///SAV_EventFlags=事件旗标编辑 ///SAV_EventReset1=事件重置 ///SAV_EventWork=事件标志编辑器 + ///SAV_FlagWork8b=Event Flag Editor ///SAV_FolderList=文件夹列表 ///SAV_GameSelect=游戏选择 ///SAV_HallOfFame=名人堂 ///SAV_HallOfFame7=名人堂 ///SAV_HoneyTree=甜甜蜜树编辑 - ///SAV_Inventory=物品栏 - ///SAV_Link6=宝可梦连接工具 - ///SAV_MailBox= [rest of string was truncated]";. + ///SAV_Inventory=物品 [rest of string was truncated]";. /// public static string lang_zh { get { @@ -926,6 +936,16 @@ public static System.Drawing.Bitmap report { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap research_bonus_points { + get { + object obj = ResourceManager.GetObject("research_bonus_points", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/PKHeX.WinForms/Properties/Resources.resx b/PKHeX.WinForms/Properties/Resources.resx index 60a2b303860..3baa3cec628 100644 --- a/PKHeX.WinForms/Properties/Resources.resx +++ b/PKHeX.WinForms/Properties/Resources.resx @@ -373,4 +373,10 @@ ..\Resources\img\Markings\gen_bs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\img\Markings\gen_la.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\img\Pokedex\research_bonus_points.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/PKHeX.WinForms/Resources/img/Markings/gen_la.png b/PKHeX.WinForms/Resources/img/Markings/gen_la.png new file mode 100644 index 00000000000..756a39631b0 Binary files /dev/null and b/PKHeX.WinForms/Resources/img/Markings/gen_la.png differ diff --git a/PKHeX.WinForms/Resources/img/Pokedex/research_bonus_points.png b/PKHeX.WinForms/Resources/img/Pokedex/research_bonus_points.png new file mode 100644 index 00000000000..4e8d6da9b4d Binary files /dev/null and b/PKHeX.WinForms/Resources/img/Pokedex/research_bonus_points.png differ diff --git a/PKHeX.WinForms/Resources/text/changelog.txt b/PKHeX.WinForms/Resources/text/changelog.txt index c25eb44d39d..c86153c6330 100644 --- a/PKHeX.WinForms/Resources/text/changelog.txt +++ b/PKHeX.WinForms/Resources/text/changelog.txt @@ -1,7 +1,32 @@ PKHeX - By Kaphotics http://projectpokemon.org/pkhex/ -22/01/01 - New Update: +22/02/04 - New Update: + - Introducing Pokémon Legends: Arceus support! Thanks @SciresM, @sora10pls, @Lusamine, @architdate, @ReignOfComputer for troubleshooting! + - - Initial Legality Checking is provided. Please refer to the forums when reporting legality issues for PLA parsing. + - - Save Data is similar to SW/SH; a pokedex, trainer, inventory, and block data editor are provided. + - - Encounter legality has been reverse engineered & modeled to pre-compute possible met locations for overworld interactables. + - Added: + - - Gen8 BDSP wild encounters are now generated with RNG patterns matching the game. Thanks @Lusamine ! + - - Gen8 BDSP xorshift RNG implemented, now available for PKHeX.Core referencing. + - - Gen8 BDSP zone unlock cheat to fly to all locations. Thanks @sora10pls ! + - - Gen8 BDSP named constant for BDSP swarms for the event editor. Thanks @MewTracker ! + - Changed: + - - Internal asset loading speed has been improved (more friendly to the runtime's garbage collector). + - - Internal value read/writes now work correctly for Big Endian runtimes. + - - Internal value read/writes are now allocation-free; memory allocation for strings has been reduced drastically too. + - - Clicking stat labels now changes nature amplification. Refer to the shortcut list for more info. + - Fixed: + - - Gen8 BDSP in-game trades are now checked for EC/PID legality. + - - Gen4 DPPt Swarm & Safari seeds now read/write correctly. Thanks @edo9300 ! + - - Gen4 feeding a single low-quality poffin no longer indicates invalid sheen. Thanks Jollygator ! + - - Gen3 Item quantity reads now behave correctly. Thanks @MichiS97 (dev build bug)! + - - Gen3 Shadow Monitor now reads all species correctly. Thanks @Mutty99 ! + - - Gen2 Odd Eggs and E-Speed Dratini now recognize correctly prior to transfer. Thanks @N-Harmonik ! + - - Gen1/2 Evolution chains now return a more accurate min/max level for each stage. Thanks @Ninjistix ! + - - Handled more oddball encounters. Thanks @Skadiv & @Ninjistix ! + +22/01/01 - New Update: (114030) [4461382] - Legality: - - Added: Hatch Counter legality checking. - - Added: Contest Stat Sheen legality checking (roughly compared to amount of other contest stats gained). diff --git a/PKHeX.WinForms/Resources/text/lang_de.txt b/PKHeX.WinForms/Resources/text/lang_de.txt index 52fe09add68..65a2be182db 100644 --- a/PKHeX.WinForms/Resources/text/lang_de.txt +++ b/PKHeX.WinForms/Resources/text/lang_de.txt @@ -4,6 +4,7 @@ ErrorWindow=Fehler KChart=KTabelle Main=PKHeX MemoryAmie=Erinnerung / Ami Editor +MoveShopEditor=Move Shop Editor RibbonEditor=Band Editor SAV_Apricorn=Aprikoko Editor SAV_BerryField=Beerenfeld Ansicht @@ -39,7 +40,9 @@ SAV_Pokedex4=Pokédex Editor SAV_Pokedex5=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_PokedexSM=Pokédex Editor SAV_PokedexSWSH=Pokédex Editor SAV_PokedexXY=Pokédex Editor (XY) @@ -56,6 +59,7 @@ SAV_Trainer=Trainer Editor SAV_Trainer7=Trainer Editor SAV_Trainer7GG=Trainer Editor SAV_Trainer8=Trainer Editor +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=Untergrund Editor SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=Kennzeichnet in der Legalitäts Analys 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. LocalizedDescription.OtherBackupPaths=Liste aller weiteren Verzeichnisse, in denen nach Spielständen gesucht wird. LocalizedDescription.OtherSaveFileExtensions=Spielstand Dateiendung (ohne Punkt), welche von PKHeX auch erkannt werden sollen. -LocalizedDescription.PathBlockKeyListSWSH=Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded. +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.PlaySoundLegalityCheck=Ton beim Pop-Up des Legalitäts Berichts abspielen. LocalizedDescription.PlaySoundSAVLoad=Ton beim Öffnen eines SPielstands abspielen. LocalizedDescription.PluginLoadMethod=Loads plugins from the plugins folder, assuming the folder exists. Try LoadFile to mitigate intermittent load failures. @@ -143,6 +147,7 @@ Main.B_Clear=Löschen Main.B_FestivalPlaza=Festival-Plaza Main.B_JPEG=Speichere PGL .JPEG Main.B_MailBox=Briefbox +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=Aprikokos Main.B_OpenBerryField=Beerenfeld Main.B_OpenBoxLayout=Boxlayout @@ -191,7 +196,9 @@ Main.CHK_Fateful=Schicksalshafte Begegnung Main.CHK_Gigantamax=Gigantamax Main.CHK_HackedStats=Gehackte Werte Main.CHK_Infected=Infiziert +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=Ist Ei +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=Spitzname: Main.CHK_NSparkle=Aktiv Main.CHK_Shadow=Crypto @@ -204,6 +211,7 @@ Main.GB_Markings=Markierungen Main.GB_nOT=Letzter (Nicht-OT) Besitzer Main.GB_OT=Trainer Informationen Main.GB_RelearnMoves=Wiedererlernbare Attacken +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=Kampfbox: Main.L_BattleVersion=Kampf Version: Main.L_Box=Box @@ -259,6 +267,7 @@ Main.Label_EXP=EP: Main.Label_Form=Form: Main.Label_Friendship=Freundschaft: Main.Label_GroundTile=Begegnung: +Main.Label_GVs=GVs Main.Label_HatchCounter=Ei Schritte: Main.Label_HeldItem=Item: Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=Ohne Item Main.mnu_DeletePastGen=Vergangene Generation Main.mnu_DeleteUntrained=Nicht trainiert Main.mnu_Modify=Bearbeiten +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=Geschlüpfte Eier Main.mnu_ModifyHeal=Heilung (Werte/AP) Main.mnu_ModifyHyperTrain=Spezialtraining @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=Erinnerungen mit: Nicht-OT MemoryAmie.Tab_Other=Sonstiges MemoryAmie.Tab_OTMemory=Erinnerungen mit: OT MemoryAmie.Tab_Residence=Herkunft +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=Alle RibbonEditor.B_Cancel=Abbrechen RibbonEditor.B_None=Alle entfernen @@ -619,6 +633,7 @@ SAV_HallOfFame7.L_C3=PKM 3: SAV_HallOfFame7.L_C4=PKM 4: SAV_HallOfFame7.L_C5=PKM 5: SAV_HallOfFame7.L_C6=PKM 6: +SAV_HallOfFame7.L_Current=Aktuelle SAV_HallOfFame7.L_EC=Starter EC: SAV_HallOfFame7.L_F1=PKM 1: SAV_HallOfFame7.L_F2=PKM 2: @@ -626,8 +641,7 @@ SAV_HallOfFame7.L_F3=PKM 3: SAV_HallOfFame7.L_F4=PKM 4: SAV_HallOfFame7.L_F5=PKM 5: SAV_HallOfFame7.L_F6=PKM 6: -SAV_HallOfFame7.label1=Erste -SAV_HallOfFame7.label2=Aktuelle +SAV_HallOfFame7.L_First=Erste SAV_HoneyTree.B_Cancel=Abbrechen SAV_HoneyTree.B_Catchable=Fangbar SAV_HoneyTree.B_Save=Speichern @@ -857,7 +871,6 @@ SAV_Misc5.TAB_Entralink=Kontaktebene SAV_Misc5.TAB_Forest=Wald SAV_Misc5.TAB_Main=Haupt SAV_Misc5.TAB_Subway=Metro -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -867,6 +880,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=Filter zurücksetzen SAV_MysteryGiftDB.B_Search=Suchen! @@ -1037,6 +1051,59 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=Gewicht SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=Abbrechen SAV_PokedexORAS.B_GiveAll=Alle SAV_PokedexORAS.B_Modify=Ändern... @@ -1067,6 +1134,12 @@ SAV_PokedexORAS.L_FormDisplayed=Angezeigte Form: SAV_PokedexORAS.L_FormsSeen=Gesehene Formen: SAV_PokedexORAS.L_goto=gehe zu: SAV_PokedexORAS.L_Spinda=Pandir: +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=Abbrechen SAV_PokedexSM.B_GiveAll=Alle SAV_PokedexSM.B_Modify=Bearbeiten... @@ -1115,12 +1188,12 @@ SAV_PokedexSWSH.CHK_S=Schillernd SAV_PokedexSWSH.GB_Displayed=Angezeigt SAV_PokedexSWSH.GB_Language=Sprachen SAV_PokedexSWSH.L_Battled=Bekämpft: +SAV_PokedexSWSH.L_DisplayedForm=Angezeigte Form: +SAV_PokedexSWSH.L_Female=Weiblich +SAV_PokedexSWSH.L_FemaleShiny=*Weiblich* SAV_PokedexSWSH.L_goto=gehe zu: SAV_PokedexSWSH.L_Male=Männlich -SAV_PokedexSWSH.label1=Angezeigte Form: -SAV_PokedexSWSH.label3=Weiblich -SAV_PokedexSWSH.label4=*Männlich* -SAV_PokedexSWSH.label5=*Weiblich* +SAV_PokedexSWSH.L_MaleShiny=*Männlich* SAV_PokedexXY.B_Cancel=Abbrechen SAV_PokedexXY.B_GiveAll=Alle SAV_PokedexXY.B_Modify=Ändern... @@ -1224,8 +1297,8 @@ SAV_SimplePokedex.B_CaughtNone=Keins gefangen SAV_SimplePokedex.B_Save=Speichern SAV_SimplePokedex.B_SeenAll=Alle gesehen SAV_SimplePokedex.B_SeenNone=Keins gesehen +SAV_SimplePokedex.Label_Caught=Gefangen: SAV_SimplePokedex.Label_Seen=Gesehen: -SAV_SimplePokedex.label2=Gefangen: SAV_SimpleTrainer.B_Cancel=Abbrechen SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1260,12 +1333,7 @@ SAV_SuperTrain.B_Save=OK SAV_SuperTrain.L_Bags=Sandsäcke SAV_SuperTrain.L_Records=Missionen SAV_SuperTrain.L_Species=Spezies: -SAV_SuperTrain.L_Species2=Spezies SAV_SuperTrain.L_Time0=Zeit: -SAV_SuperTrain.L_Time1=Zeit1 -SAV_SuperTrain.L_Time2=Zeit2 -SAV_SuperTrain.L_Unk=Unb. -SAV_SuperTrain.L_UNKNOWN=Unbekannt SAV_Trainer.B_Cancel=Abbrechen SAV_Trainer.B_GiveAccessories=Alle Accessoires SAV_Trainer.B_MaxCash=+ @@ -1481,6 +1549,26 @@ SAV_Trainer8.Tab_BadgeMap=Karte SAV_Trainer8.Tab_MiscValues=Sonstiges SAV_Trainer8.Tab_Overview=Übersicht SAV_Trainer8.Tab_Team=Team +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Resources/text/lang_en.txt b/PKHeX.WinForms/Resources/text/lang_en.txt index a7ffbe659ca..e0961dce264 100644 --- a/PKHeX.WinForms/Resources/text/lang_en.txt +++ b/PKHeX.WinForms/Resources/text/lang_en.txt @@ -4,6 +4,7 @@ ErrorWindow=Error KChart=KChart Main=PKHeX MemoryAmie=Memory / Amie Editor +MoveShopEditor=Move Shop Editor RibbonEditor=Ribbon Editor SAV_Apricorn=Apricorn Editor SAV_BerryField=Berry Field Viewer @@ -39,7 +40,9 @@ SAV_Pokedex4=Pokédex Editor SAV_Pokedex5=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_PokedexSM=Pokédex Editor SAV_PokedexSWSH=Pokédex Editor SAV_PokedexXY=Pokédex Editor (XY) @@ -56,6 +59,7 @@ SAV_Trainer=Trainer Data Editor SAV_Trainer7=Trainer Data Editor SAV_Trainer7GG=Trainer Data Editor SAV_Trainer8=Trainer Data Editor +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=Underground Editor SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if i LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname. LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files. LocalizedDescription.OtherSaveFileExtensions=Save File file-extensions (no period) that the program should also recognize. -LocalizedDescription.PathBlockKeyListSWSH=Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded. +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.PlaySoundLegalityCheck=Play Sound when popping up Legality Report LocalizedDescription.PlaySoundSAVLoad=Play Sound when loading a new Save File LocalizedDescription.PluginLoadMethod=Loads plugins from the plugins folder, assuming the folder exists. Try LoadFile to mitigate intermittent load failures. @@ -143,6 +147,7 @@ Main.B_Clear=Clear Main.B_FestivalPlaza=Festival Plaza Main.B_JPEG=Save PGL .JPEG Main.B_MailBox=Mail Box +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=Apricorns Main.B_OpenBerryField=Berry Field Main.B_OpenBoxLayout=Box Layout @@ -191,7 +196,9 @@ Main.CHK_Fateful=Fateful Encounter Main.CHK_Gigantamax=Gigantamax Main.CHK_HackedStats=Hacked Stats Main.CHK_Infected=Infected +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=Is Egg +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=Nickname: Main.CHK_NSparkle=Active Main.CHK_Shadow=Shadow @@ -204,6 +211,7 @@ Main.GB_Markings=Markings Main.GB_nOT=Latest (not OT) Handler Main.GB_OT=Trainer Information Main.GB_RelearnMoves=Relearn Moves +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=Battle Box: Main.L_BattleVersion=Battle Version: Main.L_Box=Box @@ -259,6 +267,7 @@ Main.Label_EXP=EXP: Main.Label_Form=Form: Main.Label_Friendship=Friendship: Main.Label_GroundTile=Encountered On: +Main.Label_GVs=GVs Main.Label_HatchCounter=Hatch Counter: Main.Label_HeldItem=Held Item: Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=No Held Item Main.mnu_DeletePastGen=Past Generation Main.mnu_DeleteUntrained=Untrained Main.mnu_Modify=Modify +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=Hatch Eggs Main.mnu_ModifyHeal=Heal (Stats/PP) Main.mnu_ModifyHyperTrain=Hyper Train @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=Memories with: notOT MemoryAmie.Tab_Other=Other MemoryAmie.Tab_OTMemory=Memories with: OT MemoryAmie.Tab_Residence=Residence +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=Give All RibbonEditor.B_Cancel=Cancel RibbonEditor.B_None=Remove All @@ -615,6 +629,7 @@ SAV_HallOfFame7.L_C3=PKM 3: SAV_HallOfFame7.L_C4=PKM 4: SAV_HallOfFame7.L_C5=PKM 5: SAV_HallOfFame7.L_C6=PKM 6: +SAV_HallOfFame7.L_Current=Current SAV_HallOfFame7.L_EC=Starter EC: SAV_HallOfFame7.L_F1=PKM 1: SAV_HallOfFame7.L_F2=PKM 2: @@ -622,8 +637,7 @@ SAV_HallOfFame7.L_F3=PKM 3: SAV_HallOfFame7.L_F4=PKM 4: SAV_HallOfFame7.L_F5=PKM 5: SAV_HallOfFame7.L_F6=PKM 6: -SAV_HallOfFame7.label1=First -SAV_HallOfFame7.label2=Current +SAV_HallOfFame7.L_First=First SAV_HoneyTree.B_Cancel=Cancel SAV_HoneyTree.B_Catchable=Make catchable SAV_HoneyTree.B_Save=Save @@ -853,7 +867,6 @@ SAV_Misc5.TAB_Entralink=Entralink SAV_Misc5.TAB_Forest=Forest SAV_Misc5.TAB_Main=Main SAV_Misc5.TAB_Subway=Subway -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -863,6 +876,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=Reset Filters SAV_MysteryGiftDB.B_Search=Search! @@ -1033,6 +1047,59 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=Weight SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=Cancel SAV_PokedexORAS.B_GiveAll=Check All SAV_PokedexORAS.B_Modify=Modify... @@ -1063,6 +1130,12 @@ SAV_PokedexORAS.L_FormDisplayed=Displayed Form: SAV_PokedexORAS.L_FormsSeen=Seen Forms: SAV_PokedexORAS.L_goto=goto: SAV_PokedexORAS.L_Spinda=Spinda: +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=Cancel SAV_PokedexSM.B_GiveAll=Check All SAV_PokedexSM.B_Modify=Modify... @@ -1111,12 +1184,12 @@ SAV_PokedexSWSH.CHK_S=Shiny SAV_PokedexSWSH.GB_Displayed=Displayed SAV_PokedexSWSH.GB_Language=Languages SAV_PokedexSWSH.L_Battled=Battled: +SAV_PokedexSWSH.L_DisplayedForm=Displayed Form: +SAV_PokedexSWSH.L_Female=Female +SAV_PokedexSWSH.L_FemaleShiny=*Female* SAV_PokedexSWSH.L_goto=goto: SAV_PokedexSWSH.L_Male=Male -SAV_PokedexSWSH.label1=Displayed Form: -SAV_PokedexSWSH.label3=Female -SAV_PokedexSWSH.label4=*Male* -SAV_PokedexSWSH.label5=*Female* +SAV_PokedexSWSH.L_MaleShiny=*Male* SAV_PokedexXY.B_Cancel=Cancel SAV_PokedexXY.B_GiveAll=Check All SAV_PokedexXY.B_Modify=Modify... @@ -1220,8 +1293,8 @@ SAV_SimplePokedex.B_CaughtNone=Caught None SAV_SimplePokedex.B_Save=Save SAV_SimplePokedex.B_SeenAll=Seen All SAV_SimplePokedex.B_SeenNone=Seen None +SAV_SimplePokedex.Label_Caught=Caught: SAV_SimplePokedex.Label_Seen=Seen: -SAV_SimplePokedex.label2=Caught: SAV_SimpleTrainer.B_Cancel=Cancel SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1256,12 +1329,7 @@ SAV_SuperTrain.B_Save=Save SAV_SuperTrain.L_Bags=Training Bags SAV_SuperTrain.L_Records=Records SAV_SuperTrain.L_Species=Species: -SAV_SuperTrain.L_Species2=Species SAV_SuperTrain.L_Time0=Time: -SAV_SuperTrain.L_Time1=Time1 -SAV_SuperTrain.L_Time2=Time2 -SAV_SuperTrain.L_Unk=L_Unk -SAV_SuperTrain.L_UNKNOWN=UNKNOWN SAV_Trainer.B_Cancel=Cancel SAV_Trainer.B_GiveAccessories=Give All Accessories SAV_Trainer.B_MaxCash=+ @@ -1477,6 +1545,26 @@ SAV_Trainer8.Tab_BadgeMap=Map SAV_Trainer8.Tab_MiscValues=Misc SAV_Trainer8.Tab_Overview=Overview SAV_Trainer8.Tab_Team=Team +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Resources/text/lang_es.txt b/PKHeX.WinForms/Resources/text/lang_es.txt index 2caafe6a0fb..7af30816a58 100644 --- a/PKHeX.WinForms/Resources/text/lang_es.txt +++ b/PKHeX.WinForms/Resources/text/lang_es.txt @@ -4,6 +4,7 @@ ErrorWindow=Error KChart=KChart Main=PKHeX MemoryAmie=Editor de Memorias / Poké Recreo +MoveShopEditor=Move Shop Editor RibbonEditor=Editor de Cintas SAV_Apricorn=Editor de Bonguri SAV_BerryField=Visor de Campos de Bayas @@ -39,7 +40,9 @@ SAV_Pokedex4=Editor de Pokédex SAV_Pokedex5=Editor de Pokédex SAV_PokedexBDSP=Editor de Pokédex SAV_PokedexGG=Editor de Pokédex +SAV_PokedexLA=Pokédex Editor SAV_PokedexORAS=Editor de Pokédex +SAV_PokedexResearchEditorLA=Pokédex Research Editor SAV_PokedexSM=Editor de Pokédex SAV_PokedexSWSH=Editor de Pokédex SAV_PokedexXY=Editor de Pokédex @@ -56,6 +59,7 @@ SAV_Trainer=Editor de datos del Entrenador SAV_Trainer7=Editor de datos del Entrenador SAV_Trainer7GG=Editor de datos del Entrenador SAV_Trainer8=Editor de datos del Entrenador +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=Editor del Subsuelo SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=Severidad para marcar un Chequeo de Le LocalizedDescription.NicknamedTrade=Severidad para marcar un Chequeo de Legalidad si se trata de un intercambio dentro del juego que el jugador normalmente no puede apodar. LocalizedDescription.OtherBackupPaths=Lista de ubicaciones adicionales para buscar archivos guardados. LocalizedDescription.OtherSaveFileExtensions=Archivos de guardado,extenciones (sin punto) que el programa también debería reconocer. -LocalizedDescription.PathBlockKeyListSWSH=Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded. +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.PlaySoundLegalityCheck=Reproducir sonido en el Chequeo de Legalidad LocalizedDescription.PlaySoundSAVLoad=Reproducir sonido al cargar archivo de guardado LocalizedDescription.PluginLoadMethod=Carga plugins desde la carpeta de plugins, asumiendo que esa carpeta existe. Intentar LoadFile para mitigar los fallos de carga intermitentes. @@ -143,6 +147,7 @@ Main.B_Clear=Limpiar Main.B_FestivalPlaza=Festi Plaza Main.B_JPEG=Guardar PGL .JPEG Main.B_MailBox=Correo +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=Bonguri Main.B_OpenBerryField=C. de Bayas Main.B_OpenBoxLayout=Fondo de Cajas @@ -191,7 +196,9 @@ Main.CHK_Fateful=Encuentro fatídico Main.CHK_Gigantamax=Gigamax Main.CHK_HackedStats=Estad. hackeadas Main.CHK_Infected=Infectado +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=Huevo +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=Mote: Main.CHK_NSparkle=Activo Main.CHK_Shadow=Oscuro @@ -204,6 +211,7 @@ Main.GB_Markings=Marcas Main.GB_nOT=Último dueño (no EO) Main.GB_OT=Info. del entrenador Main.GB_RelearnMoves=Recordar movimientos +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=Caja de combate: Main.L_BattleVersion=Versión de Batalla: Main.L_Box=Caja @@ -259,6 +267,7 @@ Main.Label_EXP=EXP: Main.Label_Form=Forma: Main.Label_Friendship=Felicidad: Main.Label_GroundTile=Encuentro: +Main.Label_GVs=GVs Main.Label_HatchCounter=Contador de Eclosión: Main.Label_HeldItem=Objeto Equipado: Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=Sin objeto equipado Main.mnu_DeletePastGen=Generación pasada Main.mnu_DeleteUntrained=Sin entrenamiento Main.mnu_Modify=Modificar +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=Eclosionar huevos Main.mnu_ModifyHeal=Curar (Estads./PP) Main.mnu_ModifyHyperTrain=Entrenamiento Extremo @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=Memorias con: no el EO MemoryAmie.Tab_Other=Other MemoryAmie.Tab_OTMemory=Memorias con: EO MemoryAmie.Tab_Residence=Residencia +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=Dar todos RibbonEditor.B_Cancel=Cancelar RibbonEditor.B_None=Ninguno @@ -615,6 +629,7 @@ SAV_HallOfFame7.L_C3=PKM 3: SAV_HallOfFame7.L_C4=PKM 4: SAV_HallOfFame7.L_C5=PKM 5: SAV_HallOfFame7.L_C6=PKM 6: +SAV_HallOfFame7.L_Current=Actual SAV_HallOfFame7.L_EC=CE Inicial: SAV_HallOfFame7.L_F1=PKM 1: SAV_HallOfFame7.L_F2=PKM 2: @@ -622,8 +637,7 @@ SAV_HallOfFame7.L_F3=PKM 3: SAV_HallOfFame7.L_F4=PKM 4: SAV_HallOfFame7.L_F5=PKM 5: SAV_HallOfFame7.L_F6=PKM 6: -SAV_HallOfFame7.label1=Primer -SAV_HallOfFame7.label2=Actual +SAV_HallOfFame7.L_First=Primer SAV_HoneyTree.B_Cancel=Cancelar SAV_HoneyTree.B_Catchable=Hacer capturable SAV_HoneyTree.B_Save=Guardar @@ -853,7 +867,6 @@ SAV_Misc5.TAB_Entralink=Zona Nexo SAV_Misc5.TAB_Forest=Bosque SAV_Misc5.TAB_Main=General SAV_Misc5.TAB_Subway=Metro -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -863,6 +876,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=Borrar filtros SAV_MysteryGiftDB.B_Search=¡Buscar! @@ -1033,6 +1047,59 @@ SAV_PokedexGG.L_RHeightMin=Min. SAV_PokedexGG.L_RWeight=Peso SAV_PokedexGG.L_RWeightMax=Máx. SAV_PokedexGG.L_RWeightMin=Min. +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=Cancelar SAV_PokedexORAS.B_GiveAll=Registrar SAV_PokedexORAS.B_Modify=Modificar... @@ -1063,6 +1130,12 @@ SAV_PokedexORAS.L_FormDisplayed=Forma mostrada SAV_PokedexORAS.L_FormsSeen=Formas vistas SAV_PokedexORAS.L_goto=Ir a: SAV_PokedexORAS.L_Spinda=Spinda: +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=Cancelar SAV_PokedexSM.B_GiveAll=Registrar SAV_PokedexSM.B_Modify=Modificar... @@ -1111,12 +1184,12 @@ SAV_PokedexSWSH.CHK_S=Variocolor SAV_PokedexSWSH.GB_Displayed=Mostrado SAV_PokedexSWSH.GB_Language=Idiomas SAV_PokedexSWSH.L_Battled=Encuentros: +SAV_PokedexSWSH.L_DisplayedForm=Forma Mostrada: +SAV_PokedexSWSH.L_Female=Hembra +SAV_PokedexSWSH.L_FemaleShiny=*Hembra* SAV_PokedexSWSH.L_goto=Ir a: SAV_PokedexSWSH.L_Male=Macho -SAV_PokedexSWSH.label1=Forma Mostrada: -SAV_PokedexSWSH.label3=Hembra -SAV_PokedexSWSH.label4=*Macho* -SAV_PokedexSWSH.label5=*Hembra* +SAV_PokedexSWSH.L_MaleShiny=*Macho* SAV_PokedexXY.B_Cancel=Cancelar SAV_PokedexXY.B_GiveAll=Registrar SAV_PokedexXY.B_Modify=Modificar... @@ -1220,8 +1293,8 @@ SAV_SimplePokedex.B_CaughtNone=Ninguno atrapado SAV_SimplePokedex.B_Save=Guardar SAV_SimplePokedex.B_SeenAll=Todos vistos SAV_SimplePokedex.B_SeenNone=Ninguno visto +SAV_SimplePokedex.Label_Caught=Atrapados: SAV_SimplePokedex.Label_Seen=Vistos: -SAV_SimplePokedex.label2=Atrapados: SAV_SimpleTrainer.B_Cancel=Cancelar SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1256,12 +1329,7 @@ SAV_SuperTrain.B_Save=Guardar SAV_SuperTrain.L_Bags=Sacos de entrenamiento SAV_SuperTrain.L_Records=Récords SAV_SuperTrain.L_Species=Especie: -SAV_SuperTrain.L_Species2=Especie SAV_SuperTrain.L_Time0=Tiempo: -SAV_SuperTrain.L_Time1=Tiempo1 -SAV_SuperTrain.L_Time2=Tiempo2 -SAV_SuperTrain.L_Unk=L_Unk -SAV_SuperTrain.L_UNKNOWN=DESCONOCIDO SAV_Trainer.B_Cancel=Cancelar SAV_Trainer.B_GiveAccessories=Marcar accesorios SAV_Trainer.B_MaxCash=+ @@ -1477,6 +1545,26 @@ SAV_Trainer8.Tab_BadgeMap=Mapa SAV_Trainer8.Tab_MiscValues=Misc. SAV_Trainer8.Tab_Overview=General SAV_Trainer8.Tab_Team=Equipo +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Resources/text/lang_fr.txt b/PKHeX.WinForms/Resources/text/lang_fr.txt index c35813c88f9..6977112a9b7 100644 --- a/PKHeX.WinForms/Resources/text/lang_fr.txt +++ b/PKHeX.WinForms/Resources/text/lang_fr.txt @@ -4,6 +4,7 @@ ErrorWindow=Erreur KChart=KChart Main=PKHeX MemoryAmie=Memory / Amie Editor +MoveShopEditor=Move Shop Editor RibbonEditor=Rubans SAV_Apricorn=Noigrumes SAV_BerryField=Champs de Baies @@ -39,7 +40,9 @@ SAV_Pokedex4=Éditeur Pokédex SAV_Pokedex5=Éditeur Pokédex SAV_PokedexBDSP=Pokédex Editor SAV_PokedexGG=Éditeur Pokédex +SAV_PokedexLA=Pokédex Editor SAV_PokedexORAS=Éditeur Pokédex (ROSA) +SAV_PokedexResearchEditorLA=Pokédex Research Editor SAV_PokedexSM=Éditeur Pokédex SAV_PokedexSWSH=Éditeur Pokédex SAV_PokedexXY=Éditeur Pokédex (XY) @@ -56,6 +59,7 @@ SAV_Trainer=Éditeur de données de l'entraîneur SAV_Trainer7=Éditeur de données de l'entraîneur SAV_Trainer7GG=Éditeur de données de l'entraîneur SAV_Trainer8=Éditeur de données de l'entraîneur +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=Éditeur souterrain SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if i LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname. LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files. LocalizedDescription.OtherSaveFileExtensions=Save File file-extensions (no period) that the program should also recognize. -LocalizedDescription.PathBlockKeyListSWSH=Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded. +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.PlaySoundLegalityCheck=PlaySoundLegalityCheck LocalizedDescription.PlaySoundSAVLoad=PlaySoundSAVLoad LocalizedDescription.PluginLoadMethod=Loads plugins from the plugins folder, assuming the folder exists. Try LoadFile to mitigate intermittent load failures. @@ -143,6 +147,7 @@ Main.B_Clear=Effacer Main.B_FestivalPlaza=Place Festival Main.B_JPEG=Sauver image PGL Main.B_MailBox=Mail Box +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=Noigrmes Main.B_OpenBerryField=Baies Main.B_OpenBoxLayout=Fonds Boîte @@ -191,7 +196,9 @@ Main.CHK_Fateful=Rencontre Fatidique Main.CHK_Gigantamax=Gigantamax Main.CHK_HackedStats=Hacked Stats Main.CHK_Infected=Infecté +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=Œuf +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=Surnom : Main.CHK_NSparkle=Active Main.CHK_Shadow=Shadow @@ -204,6 +211,7 @@ Main.GB_Markings=Marquages Main.GB_nOT=Dernier Dresseur connu Main.GB_OT=Infos Dresseur Main.GB_RelearnMoves=Capacités réapprises +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=Boîte de Combat : Main.L_BattleVersion=Battle Version: Main.L_Box=Box @@ -259,6 +267,7 @@ Main.Label_EXP=Expérience : Main.Label_Form=Forme : Main.Label_Friendship=Bonheur : Main.Label_GroundTile=Zone : +Main.Label_GVs=GVs Main.Label_HatchCounter=Hatch Counter: Main.Label_HeldItem=Objet : Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=Pas d'Objet Main.mnu_DeletePastGen=Génération passée Main.mnu_DeleteUntrained=Non formé Main.mnu_Modify=Modifier +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=Oeufs à éclore Main.mnu_ModifyHeal=Heal (Stats/PP) Main.mnu_ModifyHyperTrain=Hyper Train @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=Autres souvenirs MemoryAmie.Tab_Other=Other MemoryAmie.Tab_OTMemory=Souvenirs avec : DO MemoryAmie.Tab_Residence=Résidence +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=Give All RibbonEditor.B_Cancel=Cancel RibbonEditor.B_None=Remove All @@ -619,6 +633,7 @@ SAV_HallOfFame7.L_C3=PKM 3: SAV_HallOfFame7.L_C4=PKM 4: SAV_HallOfFame7.L_C5=PKM 5: SAV_HallOfFame7.L_C6=PKM 6: +SAV_HallOfFame7.L_Current=Current SAV_HallOfFame7.L_EC=Starter EC: SAV_HallOfFame7.L_F1=PKM 1: SAV_HallOfFame7.L_F2=PKM 2: @@ -626,8 +641,7 @@ SAV_HallOfFame7.L_F3=PKM 3: SAV_HallOfFame7.L_F4=PKM 4: SAV_HallOfFame7.L_F5=PKM 5: SAV_HallOfFame7.L_F6=PKM 6: -SAV_HallOfFame7.label1=First -SAV_HallOfFame7.label2=Current +SAV_HallOfFame7.L_First=First SAV_HoneyTree.B_Cancel=Cancel SAV_HoneyTree.B_Catchable=Make catchable SAV_HoneyTree.B_Save=Save @@ -857,7 +871,6 @@ SAV_Misc5.TAB_Entralink=Entralink SAV_Misc5.TAB_Forest=Forest SAV_Misc5.TAB_Main=Main SAV_Misc5.TAB_Subway=Subway -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -867,6 +880,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=Reset Filters SAV_MysteryGiftDB.B_Search=Search! @@ -1037,6 +1051,59 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=Weight SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=Annuler SAV_PokedexORAS.B_GiveAll=Tout cocher SAV_PokedexORAS.B_Modify=Modifier @@ -1067,6 +1134,12 @@ SAV_PokedexORAS.L_FormDisplayed=Forme montrée : SAV_PokedexORAS.L_FormsSeen=Formes vues : SAV_PokedexORAS.L_goto=goto: SAV_PokedexORAS.L_Spinda=Spinda : +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=Annuler SAV_PokedexSM.B_GiveAll=Tout cocher SAV_PokedexSM.B_Modify=Modifier @@ -1115,12 +1188,12 @@ SAV_PokedexSWSH.CHK_S=Shiny SAV_PokedexSWSH.GB_Displayed=Displayed SAV_PokedexSWSH.GB_Language=Languages SAV_PokedexSWSH.L_Battled=Battled: +SAV_PokedexSWSH.L_DisplayedForm=Displayed Form: +SAV_PokedexSWSH.L_Female=Female +SAV_PokedexSWSH.L_FemaleShiny=*Female* SAV_PokedexSWSH.L_goto=goto: SAV_PokedexSWSH.L_Male=Male -SAV_PokedexSWSH.label1=Displayed Form: -SAV_PokedexSWSH.label3=Female -SAV_PokedexSWSH.label4=*Male* -SAV_PokedexSWSH.label5=*Female* +SAV_PokedexSWSH.L_MaleShiny=*Male* SAV_PokedexXY.B_Cancel=Annuler SAV_PokedexXY.B_GiveAll=Tout cocher SAV_PokedexXY.B_Modify=Modifier @@ -1224,8 +1297,8 @@ SAV_SimplePokedex.B_CaughtNone=Rien attrapé SAV_SimplePokedex.B_Save=Save SAV_SimplePokedex.B_SeenAll=Tous vus SAV_SimplePokedex.B_SeenNone=Aucun Pokémon vu +SAV_SimplePokedex.Label_Caught=Attrapés : SAV_SimplePokedex.Label_Seen=Vus : -SAV_SimplePokedex.label2=Attrapés : SAV_SimpleTrainer.B_Cancel=Annuler SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1260,12 +1333,7 @@ SAV_SuperTrain.B_Save=Save SAV_SuperTrain.L_Bags=Training Bags SAV_SuperTrain.L_Records=Records SAV_SuperTrain.L_Species=Species: -SAV_SuperTrain.L_Species2=Species SAV_SuperTrain.L_Time0=Time: -SAV_SuperTrain.L_Time1=Time1 -SAV_SuperTrain.L_Time2=Time2 -SAV_SuperTrain.L_Unk=L_Unk -SAV_SuperTrain.L_UNKNOWN=UNKNOWN SAV_Trainer.B_Cancel=Cancel SAV_Trainer.B_GiveAccessories=Give All Accessories SAV_Trainer.B_MaxCash=+ @@ -1481,6 +1549,26 @@ SAV_Trainer8.Tab_BadgeMap=Map SAV_Trainer8.Tab_MiscValues=Misc SAV_Trainer8.Tab_Overview=Overview SAV_Trainer8.Tab_Team=Team +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Resources/text/lang_it.txt b/PKHeX.WinForms/Resources/text/lang_it.txt index 3d0a1e4d933..bedb840180b 100644 --- a/PKHeX.WinForms/Resources/text/lang_it.txt +++ b/PKHeX.WinForms/Resources/text/lang_it.txt @@ -4,6 +4,7 @@ ErrorWindow=Error KChart=KChart Main=PKHeX MemoryAmie=Memory / Amie Editor +MoveShopEditor=Move Shop Editor RibbonEditor=Ribbon Editor SAV_Apricorn=Apricorn Editor SAV_BerryField=Berry Field Viewer @@ -39,7 +40,9 @@ SAV_Pokedex4=Pokédex Editor SAV_Pokedex5=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_PokedexSM=Pokédex Editor SAV_PokedexSWSH=Pokédex Editor SAV_PokedexXY=Pokédex Editor (XY) @@ -56,6 +59,7 @@ SAV_Trainer=Trainer Data Editor SAV_Trainer7=Trainer Data Editor SAV_Trainer7GG=Trainer Data Editor SAV_Trainer8=Trainer Data Editor +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=Underground Editor SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if i LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname. LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files. LocalizedDescription.OtherSaveFileExtensions=Save File file-extensions (no period) that the program should also recognize. -LocalizedDescription.PathBlockKeyListSWSH=Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded. +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.PlaySoundLegalityCheck=PlaySoundLegalityCheck LocalizedDescription.PlaySoundSAVLoad=PlaySoundSAVLoad LocalizedDescription.PluginLoadMethod=Loads plugins from the plugins folder, assuming the folder exists. Try LoadFile to mitigate intermittent load failures. @@ -143,6 +147,7 @@ Main.B_Clear=Clear Main.B_FestivalPlaza=Festival Plaza Main.B_JPEG=Save PGL .JPEG Main.B_MailBox=Mail Box +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=Apricorns Main.B_OpenBerryField=Berry Field Main.B_OpenBoxLayout=Box Layout @@ -191,7 +196,9 @@ Main.CHK_Fateful=Fateful Encounter Main.CHK_Gigantamax=Gigantamax Main.CHK_HackedStats=Hacked Stats Main.CHK_Infected=Infected +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=Is Egg +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=Nickname: Main.CHK_NSparkle=Active Main.CHK_Shadow=Shadow @@ -204,6 +211,7 @@ Main.GB_Markings=Markings Main.GB_nOT=Latest (not OT) Handler Main.GB_OT=Trainer Information Main.GB_RelearnMoves=Relearn Moves +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=Battle Box: Main.L_BattleVersion=Battle Version: Main.L_Box=Box @@ -259,6 +267,7 @@ Main.Label_EXP=EXP: Main.Label_Form=Form: Main.Label_Friendship=Friendship: Main.Label_GroundTile=Encounter: +Main.Label_GVs=GVs Main.Label_HatchCounter=Hatch Counter: Main.Label_HeldItem=Held Item: Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=No Held Item Main.mnu_DeletePastGen=Past Generation Main.mnu_DeleteUntrained=Untrained Main.mnu_Modify=Modify +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=Hatch Eggs Main.mnu_ModifyHeal=Heal (Stats/PP) Main.mnu_ModifyHyperTrain=Hyper Train @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=Memories with: notOT MemoryAmie.Tab_Other=Other MemoryAmie.Tab_OTMemory=Memories with: OT MemoryAmie.Tab_Residence=Residence +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=Give All RibbonEditor.B_Cancel=Cancel RibbonEditor.B_None=Remove All @@ -619,6 +633,7 @@ SAV_HallOfFame7.L_C3=PKM 3: SAV_HallOfFame7.L_C4=PKM 4: SAV_HallOfFame7.L_C5=PKM 5: SAV_HallOfFame7.L_C6=PKM 6: +SAV_HallOfFame7.L_Current=Current SAV_HallOfFame7.L_EC=Starter EC: SAV_HallOfFame7.L_F1=PKM 1: SAV_HallOfFame7.L_F2=PKM 2: @@ -626,8 +641,7 @@ SAV_HallOfFame7.L_F3=PKM 3: SAV_HallOfFame7.L_F4=PKM 4: SAV_HallOfFame7.L_F5=PKM 5: SAV_HallOfFame7.L_F6=PKM 6: -SAV_HallOfFame7.label1=First -SAV_HallOfFame7.label2=Current +SAV_HallOfFame7.L_First=First SAV_HoneyTree.B_Cancel=Cancel SAV_HoneyTree.B_Catchable=Make catchable SAV_HoneyTree.B_Save=Save @@ -863,7 +877,6 @@ SAV_Misc5.TAB_Entralink=Entralink SAV_Misc5.TAB_Forest=Forest SAV_Misc5.TAB_Main=Main SAV_Misc5.TAB_Subway=Subway -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -873,6 +886,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=Reset Filters SAV_MysteryGiftDB.B_Search=Search! @@ -1043,6 +1057,59 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=Weight SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=Cancel SAV_PokedexORAS.B_GiveAll=Check All SAV_PokedexORAS.B_Modify=Modify... @@ -1073,6 +1140,12 @@ SAV_PokedexORAS.L_FormDisplayed=Displayed Form: SAV_PokedexORAS.L_FormsSeen=Seen Forms: SAV_PokedexORAS.L_goto=goto: SAV_PokedexORAS.L_Spinda=Spinda: +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=Cancel SAV_PokedexSM.B_GiveAll=Check All SAV_PokedexSM.B_Modify=Modify... @@ -1121,12 +1194,12 @@ SAV_PokedexSWSH.CHK_S=Shiny SAV_PokedexSWSH.GB_Displayed=Displayed SAV_PokedexSWSH.GB_Language=Languages SAV_PokedexSWSH.L_Battled=Battled: +SAV_PokedexSWSH.L_DisplayedForm=Displayed Form: +SAV_PokedexSWSH.L_Female=Female +SAV_PokedexSWSH.L_FemaleShiny=*Female* SAV_PokedexSWSH.L_goto=goto: SAV_PokedexSWSH.L_Male=Male -SAV_PokedexSWSH.label1=Displayed Form: -SAV_PokedexSWSH.label3=Female -SAV_PokedexSWSH.label4=*Male* -SAV_PokedexSWSH.label5=*Female* +SAV_PokedexSWSH.L_MaleShiny=*Male* SAV_PokedexXY.B_Cancel=Cancel SAV_PokedexXY.B_GiveAll=Check All SAV_PokedexXY.B_Modify=Modify... @@ -1230,8 +1303,8 @@ SAV_SimplePokedex.B_CaughtNone=Caught None SAV_SimplePokedex.B_Save=Save SAV_SimplePokedex.B_SeenAll=Seen All SAV_SimplePokedex.B_SeenNone=Seen None +SAV_SimplePokedex.Label_Caught=Caught: SAV_SimplePokedex.Label_Seen=Seen: -SAV_SimplePokedex.label2=Caught: SAV_SimpleTrainer.B_Cancel=Cancel SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1266,12 +1339,7 @@ SAV_SuperTrain.B_Save=Save SAV_SuperTrain.L_Bags=Training Bags SAV_SuperTrain.L_Records=Records SAV_SuperTrain.L_Species=Species: -SAV_SuperTrain.L_Species2=Species SAV_SuperTrain.L_Time0=Time: -SAV_SuperTrain.L_Time1=Time1 -SAV_SuperTrain.L_Time2=Time2 -SAV_SuperTrain.L_Unk=L_Unk -SAV_SuperTrain.L_UNKNOWN=UNKNOWN SAV_Trainer.B_Cancel=Cancel SAV_Trainer.B_GiveAccessories=Give All Accessories SAV_Trainer.B_MaxCash=+ @@ -1487,6 +1555,26 @@ SAV_Trainer8.Tab_BadgeMap=Map SAV_Trainer8.Tab_MiscValues=Misc SAV_Trainer8.Tab_Overview=Overview SAV_Trainer8.Tab_Team=Team +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Resources/text/lang_ja.txt b/PKHeX.WinForms/Resources/text/lang_ja.txt index 0a9e10a9af5..138fa258d11 100644 --- a/PKHeX.WinForms/Resources/text/lang_ja.txt +++ b/PKHeX.WinForms/Resources/text/lang_ja.txt @@ -4,6 +4,7 @@ ErrorWindow=エラー KChart=KChart Main=PKHeX MemoryAmie=おもいで +MoveShopEditor=Move Shop Editor RibbonEditor=取得リボン SAV_Apricorn=ぼんぐり SAV_BerryField=きのみ畑 @@ -39,7 +40,9 @@ SAV_Pokedex4=ポケモン図鑑 SAV_Pokedex5=ポケモン図鑑 SAV_PokedexBDSP=Pokédex Editor SAV_PokedexGG=Pokédex Editor +SAV_PokedexLA=Pokédex Editor SAV_PokedexORAS=ポケモン図鑑 +SAV_PokedexResearchEditorLA=Pokédex Research Editor SAV_PokedexSM=ポケモン図鑑 SAV_PokedexSWSH=Pokédex Editor SAV_PokedexXY=ポケモン図鑑 @@ -56,6 +59,7 @@ SAV_Trainer=トレーナー情報 SAV_Trainer7=トレーナー情報 SAV_Trainer7GG=Trainer Data Editor SAV_Trainer8=Trainer Data Editor +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=ちかつうろ SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if i LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname. LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files. LocalizedDescription.OtherSaveFileExtensions=Save File file-extensions (no period) that the program should also recognize. -LocalizedDescription.PathBlockKeyListSWSH=Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded. +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.PlaySoundLegalityCheck=PlaySoundLegalityCheck LocalizedDescription.PlaySoundSAVLoad=PlaySoundSAVLoad LocalizedDescription.PluginLoadMethod=Loads plugins from the plugins folder, assuming the folder exists. Try LoadFile to mitigate intermittent load failures. @@ -143,6 +147,7 @@ Main.B_Clear=Clear Main.B_FestivalPlaza=フェスサークル Main.B_JPEG=PGL 画像保存 Main.B_MailBox=メールボックス +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=ぼんぐりのみ Main.B_OpenBerryField=きのみ畑 Main.B_OpenBoxLayout=ボックス @@ -191,7 +196,9 @@ Main.CHK_Fateful=うんめいてきなであい Main.CHK_Gigantamax=Gigantamax Main.CHK_HackedStats=ステータスハック Main.CHK_Infected=感染状態 +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=タマゴ +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=ニックネーム Main.CHK_NSparkle=有効 Main.CHK_Shadow=ダークポケモン @@ -204,6 +211,7 @@ Main.GB_Markings=マーキング Main.GB_nOT=現在のトレーナー Main.GB_OT=トレーナー情報 Main.GB_RelearnMoves=遺伝わざ +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=バトルボックス Main.L_BattleVersion=Battle Version: Main.L_Box=ボックス @@ -259,6 +267,7 @@ Main.Label_EXP=経験値 Main.Label_Form=フォルム Main.Label_Friendship=なつき度 Main.Label_GroundTile=出会いの種類 +Main.Label_GVs=GVs Main.Label_HatchCounter=孵化サイクル Main.Label_HeldItem=持ち物 Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=No Held Item Main.mnu_DeletePastGen=Past Generation Main.mnu_DeleteUntrained=Untrained Main.mnu_Modify=Modify +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=Hatch Eggs Main.mnu_ModifyHeal=Heal (Stats/PP) Main.mnu_ModifyHyperTrain=Hyper Train @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=おもいで (CT) MemoryAmie.Tab_Other=Other MemoryAmie.Tab_OTMemory=おもいで (OT) MemoryAmie.Tab_Residence=ロケーション +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=全て RibbonEditor.B_Cancel=キャンセル RibbonEditor.B_None=全て消去 @@ -619,6 +633,7 @@ SAV_HallOfFame7.L_C3=3: SAV_HallOfFame7.L_C4=4: SAV_HallOfFame7.L_C5=5: SAV_HallOfFame7.L_C6=6: +SAV_HallOfFame7.L_Current=最新 SAV_HallOfFame7.L_EC=暗号化定数: SAV_HallOfFame7.L_F1=1: SAV_HallOfFame7.L_F2=2: @@ -626,8 +641,7 @@ SAV_HallOfFame7.L_F3=3: SAV_HallOfFame7.L_F4=4: SAV_HallOfFame7.L_F5=5: SAV_HallOfFame7.L_F6=6: -SAV_HallOfFame7.label1=1回目 -SAV_HallOfFame7.label2=最新 +SAV_HallOfFame7.L_First=1回目 SAV_HoneyTree.B_Cancel=キャンセル SAV_HoneyTree.B_Catchable=捕獲可能にする SAV_HoneyTree.B_Save=保存 @@ -857,7 +871,6 @@ SAV_Misc5.TAB_Entralink=ハイリンク SAV_Misc5.TAB_Forest=Forest SAV_Misc5.TAB_Main=メイン SAV_Misc5.TAB_Subway=Subway -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -867,6 +880,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=Reset Filters SAV_MysteryGiftDB.B_Search=検索 @@ -1037,6 +1051,59 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=Weight SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=キャンセル SAV_PokedexORAS.B_GiveAll=全て選択 SAV_PokedexORAS.B_Modify=変更 @@ -1067,6 +1134,12 @@ SAV_PokedexORAS.L_FormDisplayed=図鑑表示フォルム SAV_PokedexORAS.L_FormsSeen=出会ったフォルム SAV_PokedexORAS.L_goto=ポケモン SAV_PokedexORAS.L_Spinda=パッチール +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=キャンセル SAV_PokedexSM.B_GiveAll=全てチェック SAV_PokedexSM.B_Modify=変更 @@ -1115,12 +1188,12 @@ SAV_PokedexSWSH.CHK_S=Shiny SAV_PokedexSWSH.GB_Displayed=Displayed SAV_PokedexSWSH.GB_Language=Languages SAV_PokedexSWSH.L_Battled=Battled: +SAV_PokedexSWSH.L_DisplayedForm=Displayed Form: +SAV_PokedexSWSH.L_Female=Female +SAV_PokedexSWSH.L_FemaleShiny=*Female* SAV_PokedexSWSH.L_goto=goto: SAV_PokedexSWSH.L_Male=Male -SAV_PokedexSWSH.label1=Displayed Form: -SAV_PokedexSWSH.label3=Female -SAV_PokedexSWSH.label4=*Male* -SAV_PokedexSWSH.label5=*Female* +SAV_PokedexSWSH.L_MaleShiny=*Male* SAV_PokedexXY.B_Cancel=キャンセル SAV_PokedexXY.B_GiveAll=全て選択 SAV_PokedexXY.B_Modify=変更 @@ -1224,8 +1297,8 @@ SAV_SimplePokedex.B_CaughtNone=全て未捕獲 SAV_SimplePokedex.B_Save=保存 SAV_SimplePokedex.B_SeenAll=全て出会った SAV_SimplePokedex.B_SeenNone=全て消去 +SAV_SimplePokedex.Label_Caught=捕獲した SAV_SimplePokedex.Label_Seen=出会った -SAV_SimplePokedex.label2=捕獲した SAV_SimpleTrainer.B_Cancel=キャンセル SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1260,12 +1333,7 @@ SAV_SuperTrain.B_Save=保存 SAV_SuperTrain.L_Bags=サンドバッグ SAV_SuperTrain.L_Records=スパトレメニュー SAV_SuperTrain.L_Species=ポケモン -SAV_SuperTrain.L_Species2=ポケモン SAV_SuperTrain.L_Time0=Time: -SAV_SuperTrain.L_Time1=Time1 -SAV_SuperTrain.L_Time2=Time2 -SAV_SuperTrain.L_Unk=L_Unk -SAV_SuperTrain.L_UNKNOWN=UNKNOWN SAV_Trainer.B_Cancel=キャンセル SAV_Trainer.B_GiveAccessories=全て取得 SAV_Trainer.B_MaxCash=+ @@ -1481,6 +1549,26 @@ SAV_Trainer8.Tab_BadgeMap=Map SAV_Trainer8.Tab_MiscValues=Misc SAV_Trainer8.Tab_Overview=Overview SAV_Trainer8.Tab_Team=Team +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Resources/text/lang_ko.txt b/PKHeX.WinForms/Resources/text/lang_ko.txt index 12b3a1411fd..a635c9efc42 100644 --- a/PKHeX.WinForms/Resources/text/lang_ko.txt +++ b/PKHeX.WinForms/Resources/text/lang_ko.txt @@ -4,6 +4,7 @@ ErrorWindow=오류 KChart=KChart Main=PKHeX MemoryAmie=기억 / 파를레 편집 도구 +MoveShopEditor=Move Shop Editor RibbonEditor=리본 편집 도구 SAV_Apricorn=규토리 편집 도구 SAV_BerryField=나무열매 밭 뷰어 @@ -39,7 +40,9 @@ SAV_Pokedex4=포켓몬 도감 편집 도구 SAV_Pokedex5=포켓몬 도감 편집 도구 SAV_PokedexBDSP=Pokédex Editor SAV_PokedexGG=포켓몬 도감 편집 도구 +SAV_PokedexLA=Pokédex Editor SAV_PokedexORAS=포켓몬 도감 편집 도구 (ORAS) +SAV_PokedexResearchEditorLA=Pokédex Research Editor SAV_PokedexSM=포켓몬 도감 편집 도구 SAV_PokedexSWSH=포켓몬 도감 편집 도구 SAV_PokedexXY=포켓몬 도감 편집 도구 (XY) @@ -56,6 +59,7 @@ SAV_Trainer=트레이너 데이터 편집 도구 SAV_Trainer7=트레이너 데이터 편집 도구 SAV_Trainer7GG=트레이너 데이터 편집 도구 SAV_Trainer8=트레이너 데이터 편집 도구 +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=지하통로 점수 편집 도구 SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=Severity to flag a Legality Check if i LocalizedDescription.NicknamedTrade=Severity to flag a Legality Check if it is a nicknamed In-Game Trade the player cannot normally nickname. LocalizedDescription.OtherBackupPaths=List of extra locations to look for Save Files. LocalizedDescription.OtherSaveFileExtensions=Save File file-extensions (no period) that the program should also recognize. -LocalizedDescription.PathBlockKeyListSWSH=Path to a dump of block hash-names. If file does not exist, only names defined within the program's code will be loaded. +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.PlaySoundLegalityCheck=적법성 검사 창을 띄울 때 소리로 알림 LocalizedDescription.PlaySoundSAVLoad=새 세이브 파일을 불러올 때 소리로 알림 LocalizedDescription.PluginLoadMethod=Loads plugins from the plugins folder, assuming the folder exists. Try LoadFile to mitigate intermittent load failures. @@ -143,6 +147,7 @@ Main.B_Clear=지우기 Main.B_FestivalPlaza=페스서클 Main.B_JPEG=PGL .JPEG 저장 Main.B_MailBox=메일박스 +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=규토리 Main.B_OpenBerryField=나무열매 농장 Main.B_OpenBoxLayout=박스 배열 @@ -191,7 +196,9 @@ Main.CHK_Fateful=운명적인 만남 Main.CHK_Gigantamax=거다이맥스 Main.CHK_HackedStats=조작된 능력치 Main.CHK_Infected=감염 +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=알 여부 +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=이름: Main.CHK_NSparkle=켜짐 Main.CHK_Shadow=다크 @@ -204,6 +211,7 @@ Main.GB_Markings=마킹 Main.GB_nOT=최근 (주인이 아닌) 소유자 Main.GB_OT=트레이너 정보 Main.GB_RelearnMoves=떠올리기 기술 +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=배틀박스: Main.L_BattleVersion=Battle Version: Main.L_Box=박스 @@ -259,6 +267,7 @@ Main.Label_EXP=경험치: Main.Label_Form=폼: Main.Label_Friendship=친밀도: Main.Label_GroundTile=인카운터: +Main.Label_GVs=GVs Main.Label_HatchCounter=부화 카운터: Main.Label_HeldItem=지닌 물건: Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=지닌 물건 없음 Main.mnu_DeletePastGen=이전 세대 Main.mnu_DeleteUntrained=Untrained Main.mnu_Modify=수정 +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=알 부화 Main.mnu_ModifyHeal=Heal (Stats/PP) Main.mnu_ModifyHyperTrain=대단한특훈 @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=현재 트레이너와의 기억 MemoryAmie.Tab_Other=Other MemoryAmie.Tab_OTMemory=어버이와의 기억 MemoryAmie.Tab_Residence=거주지 +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=모두 주기 RibbonEditor.B_Cancel=취소 RibbonEditor.B_None=모두 제거 @@ -615,6 +629,7 @@ SAV_HallOfFame7.L_C3=포켓몬 3: SAV_HallOfFame7.L_C4=포켓몬 4: SAV_HallOfFame7.L_C5=포켓몬 5: SAV_HallOfFame7.L_C6=포켓몬 6: +SAV_HallOfFame7.L_Current=현재 SAV_HallOfFame7.L_EC=스타팅 EC: SAV_HallOfFame7.L_F1=포켓몬 1: SAV_HallOfFame7.L_F2=포켓몬 2: @@ -622,8 +637,7 @@ SAV_HallOfFame7.L_F3=포켓몬 3: SAV_HallOfFame7.L_F4=포켓몬 4: SAV_HallOfFame7.L_F5=포켓몬 5: SAV_HallOfFame7.L_F6=포켓몬 6: -SAV_HallOfFame7.label1=최초 -SAV_HallOfFame7.label2=현재 +SAV_HallOfFame7.L_First=최초 SAV_HoneyTree.B_Cancel=취소 SAV_HoneyTree.B_Catchable=Make catchable SAV_HoneyTree.B_Save=저장 @@ -853,7 +867,6 @@ SAV_Misc5.TAB_Entralink=하일링크 SAV_Misc5.TAB_Forest=숲 SAV_Misc5.TAB_Main=Main SAV_Misc5.TAB_Subway=Subway -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -863,6 +876,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=필터 초기화 SAV_MysteryGiftDB.B_Search=검색! @@ -1033,6 +1047,59 @@ SAV_PokedexGG.L_RHeightMin=최소 SAV_PokedexGG.L_RWeight=몸무게 SAV_PokedexGG.L_RWeightMax=최대 SAV_PokedexGG.L_RWeightMin=최소 +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=취소 SAV_PokedexORAS.B_GiveAll=모두 선택 SAV_PokedexORAS.B_Modify=수정... @@ -1063,6 +1130,12 @@ SAV_PokedexORAS.L_FormDisplayed=도감에 보일 폼: SAV_PokedexORAS.L_FormsSeen=만난 폼: SAV_PokedexORAS.L_goto=이동: SAV_PokedexORAS.L_Spinda=얼루기: +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=취소 SAV_PokedexSM.B_GiveAll=모두 선택 SAV_PokedexSM.B_Modify=수정... @@ -1111,12 +1184,12 @@ SAV_PokedexSWSH.CHK_S=이로치 SAV_PokedexSWSH.GB_Displayed=도감에 보일 상태 SAV_PokedexSWSH.GB_Language=언어 SAV_PokedexSWSH.L_Battled=배틀함: +SAV_PokedexSWSH.L_DisplayedForm=도감에 보일 폼: +SAV_PokedexSWSH.L_Female=암컷 +SAV_PokedexSWSH.L_FemaleShiny=*암컷* SAV_PokedexSWSH.L_goto=이동: SAV_PokedexSWSH.L_Male=수컷 -SAV_PokedexSWSH.label1=도감에 보일 폼: -SAV_PokedexSWSH.label3=암컷 -SAV_PokedexSWSH.label4=*수컷* -SAV_PokedexSWSH.label5=*암컷* +SAV_PokedexSWSH.L_MaleShiny=*수컷* SAV_PokedexXY.B_Cancel=취소 SAV_PokedexXY.B_GiveAll=모두 선택 SAV_PokedexXY.B_Modify=수정... @@ -1220,8 +1293,8 @@ SAV_SimplePokedex.B_CaughtNone=모두 잡지 못함 SAV_SimplePokedex.B_Save=저장 SAV_SimplePokedex.B_SeenAll=모두 만남 SAV_SimplePokedex.B_SeenNone=모두 만나지 못함 +SAV_SimplePokedex.Label_Caught=잡음: SAV_SimplePokedex.Label_Seen=만남: -SAV_SimplePokedex.label2=잡음: SAV_SimpleTrainer.B_Cancel=취소 SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1256,12 +1329,7 @@ SAV_SuperTrain.B_Save=저장 SAV_SuperTrain.L_Bags=Training Bags SAV_SuperTrain.L_Records=Records SAV_SuperTrain.L_Species=종류: -SAV_SuperTrain.L_Species2=종류 SAV_SuperTrain.L_Time0=시간: -SAV_SuperTrain.L_Time1=시간1 -SAV_SuperTrain.L_Time2=시간2 -SAV_SuperTrain.L_Unk=L_Unk -SAV_SuperTrain.L_UNKNOWN=UNKNOWN SAV_Trainer.B_Cancel=취소 SAV_Trainer.B_GiveAccessories=모든 액세서리 주기 SAV_Trainer.B_MaxCash=+ @@ -1477,6 +1545,26 @@ SAV_Trainer8.Tab_BadgeMap=맵 SAV_Trainer8.Tab_MiscValues=기타 SAV_Trainer8.Tab_Overview=개요 SAV_Trainer8.Tab_Team=팀 +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Resources/text/lang_zh.txt b/PKHeX.WinForms/Resources/text/lang_zh.txt index 95d63d77a93..30901b93490 100644 --- a/PKHeX.WinForms/Resources/text/lang_zh.txt +++ b/PKHeX.WinForms/Resources/text/lang_zh.txt @@ -4,6 +4,7 @@ ErrorWindow=错误 KChart=信息列表 Main=PKHeX MemoryAmie=回忆编辑器 +MoveShopEditor=Move Shop Editor RibbonEditor=奖章 SAV_Apricorn=球果编辑 SAV_BerryField=树果田查看器 @@ -39,7 +40,9 @@ SAV_Pokedex4=图鉴编辑 SAV_Pokedex5=图鉴编辑 SAV_PokedexBDSP=Pokédex Editor SAV_PokedexGG=图鉴编辑 +SAV_PokedexLA=Pokédex Editor SAV_PokedexORAS=图鉴编辑 +SAV_PokedexResearchEditorLA=Pokédex Research Editor SAV_PokedexSM=图鉴编辑 SAV_PokedexSWSH=图鉴编辑 SAV_PokedexXY=图鉴编辑 @@ -56,6 +59,7 @@ SAV_Trainer=训练家资料 SAV_Trainer7=训练家资料 SAV_Trainer7GG=训练家资料 SAV_Trainer8=训练家资料 +SAV_Trainer8a=Trainer Data Editor SAV_Trainer8b=Trainer Data Editor SAV_Underground=地下世界编辑 SAV_Underground8b=Underground Items Editor @@ -109,7 +113,7 @@ LocalizedDescription.NicknamedMysteryGift=玩家无法取昵称的神秘礼物 LocalizedDescription.NicknamedTrade=游戏内交换宝可梦昵称合法性检查等级。 LocalizedDescription.OtherBackupPaths=查找存档文件的位置列表。 LocalizedDescription.OtherSaveFileExtensions=程序可识别的其他存档文件扩展名(不包含扩展名前的点) -LocalizedDescription.PathBlockKeyListSWSH=转储的数据块的hash-名称映射关系的文件地址。如果文件不存在,只有软件代码中已定义的名称会被加载。 +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.PlaySoundLegalityCheck=弹窗合法性报告时播放声音 LocalizedDescription.PlaySoundSAVLoad=读取新档时播放声音 LocalizedDescription.PluginLoadMethod=Loads plugins from the plugins folder, assuming the folder exists. Try LoadFile to mitigate intermittent load failures. @@ -143,6 +147,7 @@ Main.B_Clear=清理 Main.B_FestivalPlaza=圆庆广场 Main.B_JPEG=保存PGL.JPEG Main.B_MailBox=邮箱 +Main.B_MoveShop=Move Shop Main.B_OpenApricorn=果球 Main.B_OpenBerryField=树果农场 Main.B_OpenBoxLayout=盒子布局 @@ -191,7 +196,9 @@ Main.CHK_Fateful=命中注定般地遇见了 Main.CHK_Gigantamax=超级极巨 Main.CHK_HackedStats=修改过 Main.CHK_Infected=感染病毒 +Main.CHK_IsAlpha=Alpha Main.CHK_IsEgg=蛋 +Main.CHK_IsNoble=Noble Main.CHK_Nicknamed=昵称: Main.CHK_NSparkle=激活 Main.CHK_Shadow=黑暗 @@ -204,6 +211,7 @@ Main.GB_Markings=标记 Main.GB_nOT=最近持有人(非初训家) Main.GB_OT=初训家信息 Main.GB_RelearnMoves=回忆招式 +Main.L_AlphaMastered=Alpha Mastered: Main.L_BattleBox=战斗箱: Main.L_BattleVersion=对战版本: Main.L_Box=盒子 @@ -259,6 +267,7 @@ Main.Label_EXP=经验值: Main.Label_Form=形态: Main.Label_Friendship=亲密度: Main.Label_GroundTile=相遇类型: +Main.Label_GVs=GVs Main.Label_HatchCounter=孵化圈数: Main.Label_HeldItem=持有物: Main.Label_HiddenPowerPower=60 @@ -329,6 +338,7 @@ Main.mnu_DeleteItemless=清理无持有物宝可梦 Main.mnu_DeletePastGen=清理前代宝可梦 Main.mnu_DeleteUntrained=清理无努力值宝可梦 Main.mnu_Modify=编辑 +Main.mnu_ModifyGanbaru=ModifyGanbaru Main.mnu_ModifyHatchEggs=使蛋孵化 Main.mnu_ModifyHeal=修复(能力/PP) Main.mnu_ModifyHyperTrain=进行极限训练 @@ -410,6 +420,10 @@ MemoryAmie.Tab_CTMemory=与持有人的回忆 MemoryAmie.Tab_Other=Other MemoryAmie.Tab_OTMemory=与初训家的回忆 MemoryAmie.Tab_Residence=居住地 +MoveShopEditor.B_All=Give All +MoveShopEditor.B_Cancel=Cancel +MoveShopEditor.B_None=Remove All +MoveShopEditor.B_Save=Save RibbonEditor.B_All=获得全部 RibbonEditor.B_Cancel=取消 RibbonEditor.B_None=全部清除 @@ -615,6 +629,7 @@ SAV_HallOfFame7.L_C3=精灵3: SAV_HallOfFame7.L_C4=精灵4: SAV_HallOfFame7.L_C5=精灵5: SAV_HallOfFame7.L_C6=精灵6: +SAV_HallOfFame7.L_Current=当前 SAV_HallOfFame7.L_EC=御三家加密常数: SAV_HallOfFame7.L_F1=精灵1: SAV_HallOfFame7.L_F2=精灵2: @@ -622,8 +637,7 @@ SAV_HallOfFame7.L_F3=精灵3: SAV_HallOfFame7.L_F4=精灵4: SAV_HallOfFame7.L_F5=精灵5: SAV_HallOfFame7.L_F6=精灵6: -SAV_HallOfFame7.label1=首次 -SAV_HallOfFame7.label2=当前 +SAV_HallOfFame7.L_First=首次 SAV_HoneyTree.B_Cancel=取消 SAV_HoneyTree.B_Catchable=设为可捕获 SAV_HoneyTree.B_Save=保存 @@ -853,7 +867,6 @@ SAV_Misc5.TAB_Entralink=连入 SAV_Misc5.TAB_Forest=森林 SAV_Misc5.TAB_Main=主界面 SAV_Misc5.TAB_Subway=地铁 -SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.B_Cancel=Cancel SAV_Misc8b.B_Darkrai=Unlock Darkrai Event SAV_Misc8b.B_DefeatEyecatch=Defeat all Eyecatch Trainers @@ -863,6 +876,7 @@ SAV_Misc8b.B_Roamer=Reset Roamers SAV_Misc8b.B_Save=Save SAV_Misc8b.B_Shaymin=Unlock Shaymin Event SAV_Misc8b.B_Spiritomb=Greet all Underground NPCs (Spiritomb) +SAV_Misc8b.B_Zones=Unlock All Zones SAV_Misc8b.TAB_Main=Main SAV_MysteryGiftDB.B_Reset=重置筛选 SAV_MysteryGiftDB.B_Search=检索! @@ -1033,6 +1047,59 @@ SAV_PokedexGG.L_RHeightMin=Min SAV_PokedexGG.L_RWeight=重量 SAV_PokedexGG.L_RWeightMax=Max SAV_PokedexGG.L_RWeightMin=Min +SAV_PokedexLA.B_AdvancedResearch=Edit All Tasks... +SAV_PokedexLA.B_Cancel=Cancel +SAV_PokedexLA.B_Report=Report Data +SAV_PokedexLA.B_Save=Save +SAV_PokedexLA.CHK_A=Alpha +SAV_PokedexLA.CHK_C0=Male +SAV_PokedexLA.CHK_C1=Female +SAV_PokedexLA.CHK_C2=Alpha Male +SAV_PokedexLA.CHK_C3=Alpha Female +SAV_PokedexLA.CHK_C4=Shiny Male +SAV_PokedexLA.CHK_C5=Shiny Female +SAV_PokedexLA.CHK_C6=Shiny Alpha Male +SAV_PokedexLA.CHK_C7=Shiny Alpha Female +SAV_PokedexLA.CHK_Complete=Complete +SAV_PokedexLA.CHK_G=Female +SAV_PokedexLA.CHK_MinAndMax=Has Both Min && Max +SAV_PokedexLA.CHK_O0=Male +SAV_PokedexLA.CHK_O1=Female +SAV_PokedexLA.CHK_O2=Alpha Male +SAV_PokedexLA.CHK_O3=Alpha Female +SAV_PokedexLA.CHK_O4=Shiny Male +SAV_PokedexLA.CHK_O5=Shiny Female +SAV_PokedexLA.CHK_O6=Shiny Alpha Male +SAV_PokedexLA.CHK_O7=Shiny Alpha Female +SAV_PokedexLA.CHK_Perfect=Perfect +SAV_PokedexLA.CHK_S=Shiny +SAV_PokedexLA.CHK_S0=Male +SAV_PokedexLA.CHK_S1=Female +SAV_PokedexLA.CHK_S2=Alpha Male +SAV_PokedexLA.CHK_S3=Alpha Female +SAV_PokedexLA.CHK_S4=Shiny Male +SAV_PokedexLA.CHK_S5=Shiny Female +SAV_PokedexLA.CHK_S6=Shiny Alpha Male +SAV_PokedexLA.CHK_S7=Shiny Alpha Female +SAV_PokedexLA.CHK_Seen=Seen +SAV_PokedexLA.GB_CaughtInWild=Caught in the Wild +SAV_PokedexLA.GB_Displayed=Displayed +SAV_PokedexLA.GB_Height=Height +SAV_PokedexLA.GB_Obtained=Obtained +SAV_PokedexLA.GB_ResearchTasks=Research Tasks +SAV_PokedexLA.GB_SeenInWild=Seen in the Wild +SAV_PokedexLA.GB_Statistics=Statistics +SAV_PokedexLA.GB_Weight=Weight +SAV_PokedexLA.L_ConnectHeight=- +SAV_PokedexLA.L_ConnectWeight=- +SAV_PokedexLA.L_DisplayedForm=Displayed Form: +SAV_PokedexLA.L_goto=goto: +SAV_PokedexLA.L_ResearchLevelReported=Reported: +SAV_PokedexLA.L_ResearchLevelUnreported=Unreported: +SAV_PokedexLA.L_TheoryHeight=- +SAV_PokedexLA.L_TheoryWeight=- +SAV_PokedexLA.L_UpdateIndex=Index: +SAV_PokedexLA.Label_Task=Task Description: SAV_PokedexORAS.B_Cancel=取消 SAV_PokedexORAS.B_GiveAll=全勾选 SAV_PokedexORAS.B_Modify=修改... @@ -1063,6 +1130,12 @@ SAV_PokedexORAS.L_FormDisplayed=显示形态: SAV_PokedexORAS.L_FormsSeen=见过形态: SAV_PokedexORAS.L_goto=转到: SAV_PokedexORAS.L_Spinda=晃晃斑: +SAV_PokedexResearchEditorLA.B_Cancel=Cancel +SAV_PokedexResearchEditorLA.B_Save=Save +SAV_PokedexResearchEditorLA.GB_Battle=Battle +SAV_PokedexResearchEditorLA.GB_Catch=Catch +SAV_PokedexResearchEditorLA.GB_Interact=Interact +SAV_PokedexResearchEditorLA.GB_Observe=Observe SAV_PokedexSM.B_Cancel=取消 SAV_PokedexSM.B_GiveAll=全勾选 SAV_PokedexSM.B_Modify=修改... @@ -1111,12 +1184,12 @@ SAV_PokedexSWSH.CHK_S=异色 SAV_PokedexSWSH.GB_Displayed=显示 SAV_PokedexSWSH.GB_Language=语言: SAV_PokedexSWSH.L_Battled=战斗: +SAV_PokedexSWSH.L_DisplayedForm=显示形态: +SAV_PokedexSWSH.L_Female=♀ +SAV_PokedexSWSH.L_FemaleShiny=*♀* SAV_PokedexSWSH.L_goto=转到: SAV_PokedexSWSH.L_Male=♂ -SAV_PokedexSWSH.label1=显示形态: -SAV_PokedexSWSH.label3=♀ -SAV_PokedexSWSH.label4=*♂* -SAV_PokedexSWSH.label5=*♀* +SAV_PokedexSWSH.L_MaleShiny=*♂* SAV_PokedexXY.B_Cancel=取消 SAV_PokedexXY.B_GiveAll=全勾选 SAV_PokedexXY.B_Modify=修改... @@ -1220,8 +1293,8 @@ SAV_SimplePokedex.B_CaughtNone=都没捕获 SAV_SimplePokedex.B_Save=保存 SAV_SimplePokedex.B_SeenAll=见过所有 SAV_SimplePokedex.B_SeenNone=都没见过 +SAV_SimplePokedex.Label_Caught=捕获: SAV_SimplePokedex.Label_Seen=见过: -SAV_SimplePokedex.label2=捕获: SAV_SimpleTrainer.B_Cancel=取消 SAV_SimpleTrainer.B_MaxCash=+ SAV_SimpleTrainer.B_MaxCoins=+ @@ -1256,12 +1329,7 @@ SAV_SuperTrain.B_Save=保存 SAV_SuperTrain.L_Bags=训练背包 SAV_SuperTrain.L_Records=记录 SAV_SuperTrain.L_Species=种类: -SAV_SuperTrain.L_Species2=种类 SAV_SuperTrain.L_Time0=时间: -SAV_SuperTrain.L_Time1=时间1 -SAV_SuperTrain.L_Time2=时间2 -SAV_SuperTrain.L_Unk=未知 -SAV_SuperTrain.L_UNKNOWN=未知 SAV_Trainer.B_Cancel=取消 SAV_Trainer.B_GiveAccessories=获得所有服装 SAV_Trainer.B_MaxCash=+ @@ -1477,6 +1545,26 @@ SAV_Trainer8.Tab_BadgeMap=地图 SAV_Trainer8.Tab_MiscValues=杂项 SAV_Trainer8.Tab_Overview=概览 SAV_Trainer8.Tab_Team=队伍 +SAV_Trainer8a.B_Cancel=Cancel +SAV_Trainer8a.B_MaxCash=+ +SAV_Trainer8a.B_Save=Save +SAV_Trainer8a.GB_Adventure=Adventure Info +SAV_Trainer8a.GB_Stats=Stats +SAV_Trainer8a.L_GalaxyRank=Galaxy Rank: +SAV_Trainer8a.L_Hours=Hrs: +SAV_Trainer8a.L_Language=Language: +SAV_Trainer8a.L_LastSaved=Last Saved: +SAV_Trainer8a.L_MeritCurrent=Current Merit Points: +SAV_Trainer8a.L_MeritEarned=Earned Merit Points: +SAV_Trainer8a.L_Minutes=Min: +SAV_Trainer8a.L_Money=$: +SAV_Trainer8a.L_SatchelUpgrades=Satchel Upgrades: +SAV_Trainer8a.L_Seconds=Sec: +SAV_Trainer8a.L_Started=Game Started: +SAV_Trainer8a.L_TrainerName=Trainer Name: +SAV_Trainer8a.Label_SID=SID: +SAV_Trainer8a.Label_TID=TID: +SAV_Trainer8a.Tab_Overview=Overview SAV_Trainer8b.B_Cancel=Cancel SAV_Trainer8b.B_MaxCash=+ SAV_Trainer8b.B_Save=Save diff --git a/PKHeX.WinForms/Subforms/KChart.cs b/PKHeX.WinForms/Subforms/KChart.cs index 4f108abba76..991abff932e 100644 --- a/PKHeX.WinForms/Subforms/KChart.cs +++ b/PKHeX.WinForms/Subforms/KChart.cs @@ -51,7 +51,7 @@ private void PopEntry(int index) row.CreateCells(DGV); int r = 0; - row.Cells[r++].Value = s.ToString("000") + (f > 0 ? "-"+f.ToString("00") :""); + row.Cells[r++].Value = s.ToString("000") + (f > 0 ? $"-{f:00}" : ""); row.Cells[r++].Value = SpriteUtil.GetSprite(s, f, 0, 0, 0, false, false, SAV.Generation); row.Cells[r++].Value = species[index]; row.Cells[r++].Value = GetIsNative(p, s); @@ -91,6 +91,7 @@ private string GetAbility(IReadOnlyList abilityIDs, int index) { PersonalInfoSM => s > 721 || Legal.PastGenAlolanNatives.Contains(s), PersonalInfoSWSH ss => ss.IsInDex, + PersonalInfoBDSP bs => bs.IsInDex, _ => true, }; } diff --git a/PKHeX.WinForms/Subforms/PKM Editors/MemoryAmie.cs b/PKHeX.WinForms/Subforms/PKM Editors/MemoryAmie.cs index fa6e919edbc..a6af2b94059 100644 --- a/PKHeX.WinForms/Subforms/PKM Editors/MemoryAmie.cs +++ b/PKHeX.WinForms/Subforms/PKM Editors/MemoryAmie.cs @@ -70,8 +70,8 @@ private void LoadFields() M_CT_Affection.Text = a.HT_Affection.ToString(); } - if (pkm is G8PKM pk8) - MT_Sociability.Text = Math.Min(byte.MaxValue, pk8.Sociability).ToString(); + if (pkm is ISociability s) + MT_Sociability.Text = Math.Min(byte.MaxValue, s.Sociability).ToString(); if (pkm is ITrainerMemories m) { diff --git a/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.Designer.cs b/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.Designer.cs new file mode 100644 index 00000000000..ff39fd08d30 --- /dev/null +++ b/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.Designer.cs @@ -0,0 +1,137 @@ +namespace PKHeX.WinForms +{ + partial class MoveShopEditor + { + /// + /// 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() + { + this.components = new System.ComponentModel.Container(); + this.B_Save = new System.Windows.Forms.Button(); + this.B_Cancel = new System.Windows.Forms.Button(); + this.B_None = new System.Windows.Forms.Button(); + this.B_All = new System.Windows.Forms.Button(); + this.tipName = new System.Windows.Forms.ToolTip(this.components); + this.dgv = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dgv)).BeginInit(); + this.SuspendLayout(); + // + // B_Save + // + this.B_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.B_Save.Location = new System.Drawing.Point(300, 300); + this.B_Save.Name = "B_Save"; + this.B_Save.Size = new System.Drawing.Size(90, 23); + this.B_Save.TabIndex = 1; + this.B_Save.Text = "Save"; + this.B_Save.UseVisualStyleBackColor = true; + this.B_Save.Click += new System.EventHandler(this.B_Save_Click); + // + // B_Cancel + // + this.B_Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.B_Cancel.Location = new System.Drawing.Point(204, 300); + this.B_Cancel.Name = "B_Cancel"; + this.B_Cancel.Size = new System.Drawing.Size(90, 23); + this.B_Cancel.TabIndex = 2; + this.B_Cancel.Text = "Cancel"; + this.B_Cancel.UseVisualStyleBackColor = true; + this.B_Cancel.Click += new System.EventHandler(this.B_Cancel_Click); + // + // B_None + // + this.B_None.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.B_None.Location = new System.Drawing.Point(108, 300); + this.B_None.Name = "B_None"; + this.B_None.Size = new System.Drawing.Size(90, 23); + this.B_None.TabIndex = 5; + this.B_None.Text = "Remove All"; + this.B_None.UseVisualStyleBackColor = true; + this.B_None.Click += new System.EventHandler(this.B_None_Click); + // + // B_All + // + this.B_All.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.B_All.Location = new System.Drawing.Point(12, 300); + this.B_All.Name = "B_All"; + this.B_All.Size = new System.Drawing.Size(90, 23); + this.B_All.TabIndex = 4; + this.B_All.Text = "Give All"; + this.B_All.UseVisualStyleBackColor = true; + this.B_All.Click += new System.EventHandler(this.B_All_Click); + // + // dgv + // + this.dgv.AllowUserToAddRows = false; + this.dgv.AllowUserToDeleteRows = false; + this.dgv.AllowUserToResizeColumns = false; + this.dgv.AllowUserToResizeRows = false; + this.dgv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dgv.BackgroundColor = System.Drawing.SystemColors.ControlLightLight; + this.dgv.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + this.dgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgv.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; + this.dgv.Location = new System.Drawing.Point(12, 12); + this.dgv.MultiSelect = false; + this.dgv.Name = "dgv"; + this.dgv.RowHeadersVisible = false; + this.dgv.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect; + this.dgv.ShowEditingIcon = false; + this.dgv.Size = new System.Drawing.Size(378, 282); + this.dgv.TabIndex = 12; + this.dgv.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.ColumnHeaderMouseClick); + // + // MoveShopEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(402, 335); + this.Controls.Add(this.dgv); + this.Controls.Add(this.B_None); + this.Controls.Add(this.B_All); + this.Controls.Add(this.B_Cancel); + this.Controls.Add(this.B_Save); + this.Icon = global::PKHeX.WinForms.Properties.Resources.Icon; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "MoveShopEditor"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Move Shop Editor"; + ((System.ComponentModel.ISupportInitialize)(this.dgv)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.Button B_None; + private System.Windows.Forms.Button B_All; + private System.Windows.Forms.ToolTip tipName; + private System.Windows.Forms.DataGridView dgv; + } +} \ No newline at end of file diff --git a/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs b/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs new file mode 100644 index 00000000000..cd55cf20a89 --- /dev/null +++ b/PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs @@ -0,0 +1,177 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms; + +public partial class MoveShopEditor : Form +{ + private readonly IMoveShop8 Entity; + private readonly IMoveShop8Mastery Master; + private readonly PKM pkm; + + public MoveShopEditor(IMoveShop8 s, IMoveShop8Mastery m, PKM pk) + { + Entity = s; + Master = m; + pkm = pk; + InitializeComponent(); + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + + Setup(); + PopulateRecords(); + LoadRecords(); + } + + private void Setup() + { + dgv.Rows.Clear(); + dgv.Columns.Clear(); + + var cIndex = new DataGridViewTextBoxColumn + { + HeaderText = "Index", + DisplayIndex = 0, + Width = 40, + ReadOnly = true, + SortMode = DataGridViewColumnSortMode.Automatic, + }; + + var cMove = new DataGridViewTextBoxColumn + { + HeaderText = "Move", + DisplayIndex = 1, + Width = 100, + ReadOnly = true, + SortMode = DataGridViewColumnSortMode.Automatic, + }; + + var cPurchased = new DataGridViewCheckBoxColumn + { + HeaderText = "Purchased", + DisplayIndex = 2, + Width = 70, + SortMode = DataGridViewColumnSortMode.Automatic, + }; + + var cMastered = new DataGridViewCheckBoxColumn + { + HeaderText = "Mastered", + DisplayIndex = 3, + Width = 70, + SortMode = DataGridViewColumnSortMode.Automatic, + }; + + cIndex.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + cPurchased.SortMode = DataGridViewColumnSortMode.Programmatic; + cMastered.SortMode = DataGridViewColumnSortMode.Programmatic; + cPurchased.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + cMastered.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + + dgv.Columns.Add(cIndex); + dgv.Columns.Add(cMove); + dgv.Columns.Add(cPurchased); + dgv.Columns.Add(cMastered); + } + + // Inverted sort order for checkboxes, so that the first sort click has all True at top. + private void ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + var column = dgv.Columns[e.ColumnIndex]; + if (column.SortMode != DataGridViewColumnSortMode.Programmatic) + return; + + var header = column.HeaderCell; + switch (header.SortGlyphDirection) + { + case SortOrder.None: + case SortOrder.Ascending: + dgv.Sort(column, ListSortDirection.Descending); + header.SortGlyphDirection = SortOrder.Descending; + break; + case SortOrder.Descending: + dgv.Sort(column, ListSortDirection.Ascending); + header.SortGlyphDirection = SortOrder.Ascending; + break; + } + } + + private const int Bias = 1; + + private void PopulateRecords() + { + var names = GameInfo.Strings.Move; + var indexes = Entity.MoveShopPermitIndexes; + dgv.Rows.Add(indexes.Length); + for (int i = 0; i < indexes.Length; i++) + { + var row = dgv.Rows[i]; + row.Cells[0].Value = $"{i + Bias:00}"; + row.Cells[1].Value = names[indexes[i]]; + } + } + + private void B_Cancel_Click(object sender, EventArgs e) => Close(); + + private void B_Save_Click(object sender, EventArgs e) + { + Save(); + Close(); + } + + private void LoadRecords() + { + for (int i = 0; i < dgv.Rows.Count; i++) + { + var row = dgv.Rows[i]; + var index = int.Parse((string)row.Cells[0].Value) - Bias; + var purchased = row.Cells[2]; + var mastered = row.Cells[3]; + purchased.Value = Entity.GetPurchasedRecordFlag(index); + mastered.Value = Master.GetMasteredRecordFlag(index); + } + } + + private void Save() + { + for (int i = 0; i < dgv.Rows.Count; i++) + { + var row = dgv.Rows[i]; + var index = int.Parse((string)row.Cells[0].Value) - Bias; + var purchased = row.Cells[2]; + var mastered = row.Cells[3]; + Entity.SetPurchasedRecordFlag(index, (bool)purchased.Value); + Master.SetMasteredRecordFlag(index, (bool)mastered.Value); + } + } + + private void B_All_Click(object sender, EventArgs e) + { + Save(); + switch (ModifierKeys) + { + case Keys.Shift: + Entity.SetMoveShopFlags(true, Entity.MoveShopPermitIndexes.Length); + break; + case Keys.Control: + Entity.ClearMoveShopFlags(); + Entity.SetMoveShopFlags(pkm.Moves); + break; + default: + Entity.ClearMoveShopFlags(); + Entity.SetMoveShopFlags(); + break; + } + Master.SetMoveShopFlagsMastered(); + Close(); + } + + private void B_None_Click(object sender, EventArgs e) + { + Save(); + Entity.ClearMoveShopFlags(); + LoadRecords(); + Close(); + } +} diff --git a/PKHeX.WinForms/Subforms/PKM Editors/RibbonEditor.cs b/PKHeX.WinForms/Subforms/PKM Editors/RibbonEditor.cs index b93453cc464..4006494117c 100644 --- a/PKHeX.WinForms/Subforms/PKM Editors/RibbonEditor.cs +++ b/PKHeX.WinForms/Subforms/PKM Editors/RibbonEditor.cs @@ -26,7 +26,7 @@ public RibbonEditor(PKM pk) PopulateRibbons(); TLP_Ribbons.ResumeLayout(); - if (pk is G8PKM pk8) + if (pk is IRibbonSetAffixed affixed) { var names = Enum.GetNames(typeof(RibbonIndex)); var values = (RibbonIndex[])Enum.GetValues(typeof(RibbonIndex)); @@ -35,7 +35,7 @@ public RibbonEditor(PKM pk) ds.AddRange(items.ToArray()); CB_Affixed.InitializeBinding(); CB_Affixed.DataSource = ds; - CB_Affixed.SelectedValue = (int)pk8.AffixedRibbon; + CB_Affixed.SelectedValue = (int)affixed.AffixedRibbon; } else { @@ -161,8 +161,8 @@ private void Save() foreach (var rib in riblist) ReflectUtil.SetValue(pkm, rib.Name, rib.RibbonCount < 0 ? rib.HasRibbon : rib.RibbonCount); - if (pkm is G8PKM pk8) - pk8.AffixedRibbon = (sbyte)WinFormsUtil.GetIndex(CB_Affixed); + if (pkm is IRibbonSetAffixed affixed) + affixed.AffixedRibbon = (sbyte)WinFormsUtil.GetIndex(CB_Affixed); } private void B_All_Click(object sender, EventArgs e) @@ -186,8 +186,8 @@ private void B_None_Click(object sender, EventArgs e) if (ModifierKeys == Keys.Shift) { RibbonApplicator.RemoveAllValidRibbons(pkm); - if (pkm is G8PKM pk8) - pk8.AffixedRibbon = -1; + if (pkm is IRibbonSetAffixed affixed) + affixed.AffixedRibbon = -1; Close(); return; } diff --git a/PKHeX.WinForms/Subforms/PKM Editors/TechRecordEditor.cs b/PKHeX.WinForms/Subforms/PKM Editors/TechRecordEditor.cs index 1f546f7c719..7866ed6961e 100644 --- a/PKHeX.WinForms/Subforms/PKM Editors/TechRecordEditor.cs +++ b/PKHeX.WinForms/Subforms/PKM Editors/TechRecordEditor.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Windows.Forms; using PKHeX.Core; @@ -7,11 +6,13 @@ namespace PKHeX.WinForms { public partial class TechRecordEditor : Form { - private readonly G8PKM pkm; + private readonly ITechRecord8 Entity; + private readonly PKM pkm; - public TechRecordEditor(PKM pk) + public TechRecordEditor(ITechRecord8 techRecord8, PKM pk) { - pkm = (G8PKM)pk; + Entity = techRecord8; + pkm = pk; InitializeComponent(); WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); @@ -21,9 +22,11 @@ public TechRecordEditor(PKM pk) private void PopulateRecords() { - var trs = Legal.TMHM_SWSH; var names = GameInfo.Strings.Move; - var lines = trs.Skip(100).Select((z, i) => $"{i:00} - {names[z]}").ToArray(); + var indexes = Entity.TechRecordPermitIndexes; + var lines = new string[indexes.Length]; + for (int i = 0; i < lines.Length; i++) + lines[i] = $"{i:00} - {names[i]}"; CLB_Flags.Items.AddRange(lines); } @@ -38,24 +41,24 @@ private void B_Save_Click(object sender, EventArgs e) private void LoadRecords() { for (int i = 0; i < PersonalInfoSWSH.CountTR; i++) - CLB_Flags.SetItemChecked(i, pkm.GetMoveRecordFlag(i)); + CLB_Flags.SetItemChecked(i, Entity.GetMoveRecordFlag(i)); } private void Save() { for (int i = 0; i < PersonalInfoSWSH.CountTR; i++) - pkm.SetMoveRecordFlag(i, CLB_Flags.GetItemChecked(i)); + Entity.SetMoveRecordFlag(i, CLB_Flags.GetItemChecked(i)); } private void B_All_Click(object sender, EventArgs e) { Save(); if (ModifierKeys == Keys.Shift) - pkm.SetRecordFlags(true); + Entity.SetRecordFlags(true); else if (ModifierKeys == Keys.Control) - pkm.SetRecordFlags(pkm.Moves); + Entity.SetRecordFlags(pkm.Moves); else - pkm.SetRecordFlags(); + Entity.SetRecordFlags(); LoadRecords(); Close(); } @@ -63,7 +66,7 @@ private void B_All_Click(object sender, EventArgs e) private void B_None_Click(object sender, EventArgs e) { Save(); - pkm.ClearRecordFlags(); + Entity.ClearRecordFlags(); LoadRecords(); Close(); } diff --git a/PKHeX.WinForms/Subforms/SAV_Database.cs b/PKHeX.WinForms/Subforms/SAV_Database.cs index b6fb59a1f92..fc330d1afe5 100644 --- a/PKHeX.WinForms/Subforms/SAV_Database.cs +++ b/PKHeX.WinForms/Subforms/SAV_Database.cs @@ -363,10 +363,13 @@ private static List LoadPKMSaves(string pkmdb, SaveFile SAV, IEnumera { static bool IsPresentInGameSWSH(ISpeciesForm pk) => pk is PK8 || ((PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; static bool IsPresentInGameBDSP(ISpeciesForm pk) => pk is PB8;//|| ((PersonalInfoBDSP)PersonalTable.BDSP.GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; + static bool IsPresentInGamePLA (ISpeciesForm pk) => pk is PA8;//|| ((PersonalInfoLA)PersonalTable.LA.GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; if (SAV is SAV8SWSH) result.RemoveAll(z => !IsPresentInGameSWSH(z.Entity)); else if (SAV is SAV8BS) result.RemoveAll(z => !IsPresentInGameBDSP(z.Entity)); + else if (SAV is SAV8LA) + result.RemoveAll(z => !IsPresentInGamePLA(z.Entity)); } var sort = Main.Settings.EntityDb.InitialSortMode; diff --git a/PKHeX.WinForms/Subforms/SAV_Encounters.cs b/PKHeX.WinForms/Subforms/SAV_Encounters.cs index d1f12371f7d..530ed7702c2 100644 --- a/PKHeX.WinForms/Subforms/SAV_Encounters.cs +++ b/PKHeX.WinForms/Subforms/SAV_Encounters.cs @@ -234,12 +234,14 @@ private IEnumerable SearchDatabase() if (Main.Settings.EncounterDb.FilterUnavailableSpecies) { - static bool IsPresentInGameSWSH(ISpeciesForm pk) => pk is PK8 || ((PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; - static bool IsPresentInGameBDSP(ISpeciesForm pk) => pk is PB8 || ((PersonalInfoBDSP)PersonalTable.BDSP.GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; + static bool IsPresentInGameSWSH(ISpeciesForm pk) => ((PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; + static bool IsPresentInGameBDSP(ISpeciesForm pk) => ((PersonalInfoBDSP)PersonalTable.BDSP.GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; + static bool IsPresentInGameLA (ISpeciesForm pk) => ((PersonalInfoLA) PersonalTable.LA .GetFormEntry(pk.Species, pk.Form)).IsPresentInGame; results = SAV switch { SAV8SWSH => results.Where(IsPresentInGameSWSH), SAV8BS => results.Where(IsPresentInGameBDSP), + SAV8LA => results.Where(IsPresentInGameLA), _ => results.Where(z => z.Generation <= 7), }; } diff --git a/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs b/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs index 804180e2199..38e0b8c492d 100644 --- a/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs +++ b/PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs @@ -216,6 +216,8 @@ private void LoadDatabase() { db = SAV switch { + SAV8LA => db.Where(z => z is WA8), + SAV8BS => db.Where(z => z is WB8), SAV8SWSH => db.Where(z => ((PersonalInfoSWSH)PersonalTable.SWSH.GetFormEntry(z.Species, z.Form)).IsPresentInGame), SAV7b => db.Where(z => z is WB7), SAV7 => db.Where(z => z.Generation < 7 || z is WC7), diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.Designer.cs index 65635e8075a..94273d8e48f 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_BoxLayout.Designer.cs @@ -83,7 +83,7 @@ private void InitializeComponent() // B_Save // this.B_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.B_Save.Location = new System.Drawing.Point(328, 255); + this.B_Save.Location = new System.Drawing.Point(367, 255); this.B_Save.Name = "B_Save"; this.B_Save.Size = new System.Drawing.Size(67, 23); this.B_Save.TabIndex = 9; @@ -94,7 +94,7 @@ private void InitializeComponent() // B_Cancel // this.B_Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.B_Cancel.Location = new System.Drawing.Point(328, 284); + this.B_Cancel.Location = new System.Drawing.Point(367, 284); this.B_Cancel.Name = "B_Cancel"; this.B_Cancel.Size = new System.Drawing.Size(67, 23); this.B_Cancel.TabIndex = 10; @@ -109,7 +109,7 @@ private void InitializeComponent() this.CB_BG.FormattingEnabled = true; this.CB_BG.Location = new System.Drawing.Point(300, 34); this.CB_BG.Name = "CB_BG"; - this.CB_BG.Size = new System.Drawing.Size(98, 21); + this.CB_BG.Size = new System.Drawing.Size(137, 21); this.CB_BG.TabIndex = 13; this.CB_BG.SelectedIndexChanged += new System.EventHandler(this.ChangeBoxBackground); // @@ -121,7 +121,7 @@ private void InitializeComponent() this.PAN_BG.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.PAN_BG.Location = new System.Drawing.Point(126, 61); this.PAN_BG.Name = "PAN_BG"; - this.PAN_BG.Size = new System.Drawing.Size(272, 160); + this.PAN_BG.Size = new System.Drawing.Size(311, 160); this.PAN_BG.TabIndex = 14; // // FLP_Misc @@ -132,7 +132,7 @@ private void InitializeComponent() this.FLP_Misc.Controls.Add(this.FLP_Flags); this.FLP_Misc.Location = new System.Drawing.Point(129, 234); this.FLP_Misc.Name = "FLP_Misc"; - this.FLP_Misc.Size = new System.Drawing.Size(193, 73); + this.FLP_Misc.Size = new System.Drawing.Size(232, 73); this.FLP_Misc.TabIndex = 15; // // FLP_Unlocked @@ -141,7 +141,7 @@ private void InitializeComponent() this.FLP_Unlocked.Controls.Add(this.CB_Unlocked); this.FLP_Unlocked.Location = new System.Drawing.Point(3, 3); this.FLP_Unlocked.Name = "FLP_Unlocked"; - this.FLP_Unlocked.Size = new System.Drawing.Size(185, 25); + this.FLP_Unlocked.Size = new System.Drawing.Size(215, 25); this.FLP_Unlocked.TabIndex = 16; // // L_Unlocked @@ -168,7 +168,7 @@ private void InitializeComponent() this.FLP_Flags.Controls.Add(this.L_Flag); this.FLP_Flags.Location = new System.Drawing.Point(3, 34); this.FLP_Flags.Name = "FLP_Flags"; - this.FLP_Flags.Size = new System.Drawing.Size(185, 25); + this.FLP_Flags.Size = new System.Drawing.Size(215, 25); this.FLP_Flags.TabIndex = 17; // // L_Flag @@ -204,7 +204,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(409, 321); + this.ClientSize = new System.Drawing.Size(448, 321); this.Controls.Add(this.B_Down); this.Controls.Add(this.B_Up); this.Controls.Add(this.FLP_Misc); diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_HallOfFame7.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_HallOfFame7.Designer.cs index fbd8c120ad6..0985474080b 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_HallOfFame7.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen7/SAV_HallOfFame7.Designer.cs @@ -54,8 +54,8 @@ private void InitializeComponent() this.L_C2 = new System.Windows.Forms.Label(); this.CB_C1 = new System.Windows.Forms.ComboBox(); this.L_C1 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); + this.L_First = new System.Windows.Forms.Label(); + this.L_Current = new System.Windows.Forms.Label(); this.TB_EC = new System.Windows.Forms.TextBox(); this.L_EC = new System.Windows.Forms.Label(); this.SuspendLayout(); @@ -310,23 +310,23 @@ private void InitializeComponent() this.L_C1.Text = "PKM 1:"; this.L_C1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // label1 + // L_First // - this.label1.Location = new System.Drawing.Point(65, 1); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(124, 23); - this.label1.TabIndex = 0; - this.label1.Text = "First"; - this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.L_First.Location = new System.Drawing.Point(65, 1); + this.L_First.Name = "L_First"; + this.L_First.Size = new System.Drawing.Size(124, 23); + this.L_First.TabIndex = 0; + this.L_First.Text = "First"; + this.L_First.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // - // label2 + // L_Current // - this.label2.Location = new System.Drawing.Point(258, 1); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(124, 23); - this.label2.TabIndex = 0; - this.label2.Text = "Current"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.L_Current.Location = new System.Drawing.Point(258, 1); + this.L_Current.Name = "L_Current"; + this.L_Current.Size = new System.Drawing.Size(124, 23); + this.L_Current.TabIndex = 0; + this.L_Current.Text = "Current"; + this.L_Current.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // TB_EC // @@ -355,8 +355,8 @@ private void InitializeComponent() this.ClientSize = new System.Drawing.Size(394, 201); this.Controls.Add(this.TB_EC); this.Controls.Add(this.L_EC); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); + this.Controls.Add(this.L_Current); + this.Controls.Add(this.L_First); this.Controls.Add(this.CB_C6); this.Controls.Add(this.L_C6); this.Controls.Add(this.CB_C5); @@ -422,8 +422,8 @@ private void InitializeComponent() private System.Windows.Forms.Label L_C2; private System.Windows.Forms.ComboBox CB_C1; private System.Windows.Forms.Label L_C1; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label L_First; + private System.Windows.Forms.Label L_Current; private System.Windows.Forms.TextBox TB_EC; private System.Windows.Forms.Label L_EC; } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.Designer.cs new file mode 100644 index 00000000000..16bac85a6b0 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.Designer.cs @@ -0,0 +1,223 @@ +namespace PKHeX.WinForms.Controls +{ + partial class PokedexResearchTask8aPanel + { + /// + /// 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() + { + this.LB_Species = new System.Windows.Forms.ListBox(); + this.FLP_T1 = new System.Windows.Forms.FlowLayoutPanel(); + this.PB_Bonus = new System.Windows.Forms.PictureBox(); + this.Label_Task = new System.Windows.Forms.Label(); + this.NUP_CurrentValue = new System.Windows.Forms.NumericUpDown(); + this.FLP_T1Right = new System.Windows.Forms.FlowLayoutPanel(); + this.MTB_Threshold5 = new System.Windows.Forms.MaskedTextBox(); + this.MTB_Threshold4 = new System.Windows.Forms.MaskedTextBox(); + this.MTB_Threshold3 = new System.Windows.Forms.MaskedTextBox(); + this.MTB_Threshold2 = new System.Windows.Forms.MaskedTextBox(); + this.MTB_Threshold1 = new System.Windows.Forms.MaskedTextBox(); + this.FLP_T1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.PB_Bonus)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CurrentValue)).BeginInit(); + this.FLP_T1Right.SuspendLayout(); + this.SuspendLayout(); + // + // LB_Species + // + this.LB_Species.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.LB_Species.FormattingEnabled = true; + this.LB_Species.Location = new System.Drawing.Point(-265, -101); + this.LB_Species.Name = "LB_Species"; + this.LB_Species.Size = new System.Drawing.Size(125, 238); + this.LB_Species.TabIndex = 125; + // + // FLP_T1 + // + this.FLP_T1.Controls.Add(this.PB_Bonus); + this.FLP_T1.Controls.Add(this.Label_Task); + this.FLP_T1.Controls.Add(this.NUP_CurrentValue); + this.FLP_T1.Controls.Add(this.FLP_T1Right); + this.FLP_T1.Location = new System.Drawing.Point(0, 0); + this.FLP_T1.Margin = new System.Windows.Forms.Padding(0); + this.FLP_T1.Name = "FLP_T1"; + this.FLP_T1.Size = new System.Drawing.Size(646, 22); + this.FLP_T1.TabIndex = 127; + // + // PB_Bonus + // + this.PB_Bonus.Image = global::PKHeX.WinForms.Properties.Resources.research_bonus_points; + this.PB_Bonus.InitialImage = null; + this.PB_Bonus.Location = new System.Drawing.Point(3, 0); + this.PB_Bonus.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.PB_Bonus.Name = "PB_Bonus"; + this.PB_Bonus.Size = new System.Drawing.Size(20, 20); + this.PB_Bonus.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.PB_Bonus.TabIndex = 43; + this.PB_Bonus.TabStop = false; + // + // Label_Task + // + this.Label_Task.Location = new System.Drawing.Point(26, 0); + this.Label_Task.Margin = new System.Windows.Forms.Padding(0); + this.Label_Task.Name = "Label_Task"; + this.Label_Task.Size = new System.Drawing.Size(316, 20); + this.Label_Task.TabIndex = 19; + this.Label_Task.Text = "Task Description:"; + this.Label_Task.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CurrentValue + // + this.NUP_CurrentValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CurrentValue.Location = new System.Drawing.Point(345, 0); + this.NUP_CurrentValue.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CurrentValue.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CurrentValue.Name = "NUP_CurrentValue"; + this.NUP_CurrentValue.Size = new System.Drawing.Size(72, 20); + this.NUP_CurrentValue.TabIndex = 51; + this.NUP_CurrentValue.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.NUP_CurrentValue.ValueChanged += new System.EventHandler(this.NUP_CurrentValue_Changed); + // + // FLP_T1Right + // + this.FLP_T1Right.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.FLP_T1Right.Controls.Add(this.MTB_Threshold5); + this.FLP_T1Right.Controls.Add(this.MTB_Threshold4); + this.FLP_T1Right.Controls.Add(this.MTB_Threshold3); + this.FLP_T1Right.Controls.Add(this.MTB_Threshold2); + this.FLP_T1Right.Controls.Add(this.MTB_Threshold1); + this.FLP_T1Right.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + this.FLP_T1Right.Location = new System.Drawing.Point(420, 0); + this.FLP_T1Right.Margin = new System.Windows.Forms.Padding(0); + this.FLP_T1Right.Name = "FLP_T1Right"; + this.FLP_T1Right.Size = new System.Drawing.Size(226, 21); + this.FLP_T1Right.TabIndex = 121; + // + // MTB_Threshold5 + // + this.MTB_Threshold5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_Threshold5.Enabled = false; + this.MTB_Threshold5.Location = new System.Drawing.Point(183, 0); + this.MTB_Threshold5.Margin = new System.Windows.Forms.Padding(2, 0, 3, 0); + this.MTB_Threshold5.Mask = "999"; + this.MTB_Threshold5.Name = "MTB_Threshold5"; + this.MTB_Threshold5.PromptChar = ' '; + this.MTB_Threshold5.Size = new System.Drawing.Size(40, 20); + this.MTB_Threshold5.TabIndex = 45; + this.MTB_Threshold5.Text = "100"; + this.MTB_Threshold5.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // MTB_Threshold4 + // + this.MTB_Threshold4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_Threshold4.Enabled = false; + this.MTB_Threshold4.Location = new System.Drawing.Point(138, 0); + this.MTB_Threshold4.Margin = new System.Windows.Forms.Padding(2, 0, 3, 0); + this.MTB_Threshold4.Mask = "999"; + this.MTB_Threshold4.Name = "MTB_Threshold4"; + this.MTB_Threshold4.PromptChar = ' '; + this.MTB_Threshold4.Size = new System.Drawing.Size(40, 20); + this.MTB_Threshold4.TabIndex = 47; + this.MTB_Threshold4.Text = "50"; + this.MTB_Threshold4.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // MTB_Threshold3 + // + this.MTB_Threshold3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_Threshold3.Enabled = false; + this.MTB_Threshold3.Location = new System.Drawing.Point(93, 0); + this.MTB_Threshold3.Margin = new System.Windows.Forms.Padding(2, 0, 3, 0); + this.MTB_Threshold3.Mask = "999"; + this.MTB_Threshold3.Name = "MTB_Threshold3"; + this.MTB_Threshold3.PromptChar = ' '; + this.MTB_Threshold3.Size = new System.Drawing.Size(40, 20); + this.MTB_Threshold3.TabIndex = 48; + this.MTB_Threshold3.Text = "10"; + this.MTB_Threshold3.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // MTB_Threshold2 + // + this.MTB_Threshold2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_Threshold2.Enabled = false; + this.MTB_Threshold2.Location = new System.Drawing.Point(48, 0); + this.MTB_Threshold2.Margin = new System.Windows.Forms.Padding(2, 0, 3, 0); + this.MTB_Threshold2.Mask = "999"; + this.MTB_Threshold2.Name = "MTB_Threshold2"; + this.MTB_Threshold2.PromptChar = ' '; + this.MTB_Threshold2.Size = new System.Drawing.Size(40, 20); + this.MTB_Threshold2.TabIndex = 49; + this.MTB_Threshold2.Text = "5"; + this.MTB_Threshold2.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // MTB_Threshold1 + // + this.MTB_Threshold1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_Threshold1.Enabled = false; + this.MTB_Threshold1.Location = new System.Drawing.Point(3, 0); + this.MTB_Threshold1.Margin = new System.Windows.Forms.Padding(2, 0, 3, 0); + this.MTB_Threshold1.Mask = "999"; + this.MTB_Threshold1.Name = "MTB_Threshold1"; + this.MTB_Threshold1.PromptChar = ' '; + this.MTB_Threshold1.Size = new System.Drawing.Size(40, 20); + this.MTB_Threshold1.TabIndex = 50; + this.MTB_Threshold1.Text = "1"; + this.MTB_Threshold1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // PokedexResearchTask8aPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.FLP_T1); + this.Controls.Add(this.LB_Species); + this.Name = "PokedexResearchTask8aPanel"; + this.Size = new System.Drawing.Size(646, 22); + this.FLP_T1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.PB_Bonus)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CurrentValue)).EndInit(); + this.FLP_T1Right.ResumeLayout(false); + this.FLP_T1Right.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.ListBox LB_Species; + private System.Windows.Forms.FlowLayoutPanel FLP_T1; + private System.Windows.Forms.PictureBox PB_Bonus; + private System.Windows.Forms.Label Label_Task; + private System.Windows.Forms.NumericUpDown NUP_CurrentValue; + private System.Windows.Forms.FlowLayoutPanel FLP_T1Right; + private System.Windows.Forms.MaskedTextBox MTB_Threshold5; + private System.Windows.Forms.MaskedTextBox MTB_Threshold4; + private System.Windows.Forms.MaskedTextBox MTB_Threshold3; + private System.Windows.Forms.MaskedTextBox MTB_Threshold2; + private System.Windows.Forms.MaskedTextBox MTB_Threshold1; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.cs new file mode 100644 index 00000000000..81cc6edd677 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.cs @@ -0,0 +1,105 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using PKHeX.Drawing; +using PKHeX.WinForms.Properties; +using PKHeX.Core; + +namespace PKHeX.WinForms.Controls +{ + public partial class PokedexResearchTask8aPanel : UserControl + { + public int Species { get; private set; } + public int ReportedCount { get; private set; } + public PokedexResearchTask8a Task { get; private set; } = new(); + + private string[] TaskDescriptions = Array.Empty(); + private string[] SpeciesQuests = Array.Empty(); + private string[] TimeTaskDescriptions = Array.Empty(); + + private readonly MaskedTextBox[] ThresholdBoxes; + private readonly bool Loaded; + + public PokedexResearchTask8aPanel() + { + InitializeComponent(); + + ThresholdBoxes = new[] { MTB_Threshold1, MTB_Threshold2, MTB_Threshold3, MTB_Threshold4, MTB_Threshold5 }; + Loaded = true; + } + + public int CurrentValue + { + get => (int)NUP_CurrentValue.Value; + set => NUP_CurrentValue.Value = value; + } + + public int PointsPerLevel => Task.PointsSingle + Task.PointsBonus; + + public void SetStrings(string[] tasks, string[] speciesQuests, string[] timeTasks) + { + TaskDescriptions = tasks; + SpeciesQuests = speciesQuests; + TimeTaskDescriptions = timeTasks; + } + + public void SetTask(int species, PokedexResearchTask8a task, int reportedLevel) + { + Species = species; + Task = task; + ReportedCount = reportedLevel - 1; + + SuspendLayout(); + + PB_Bonus.Image = Task.PointsBonus != 0 ? Resources.research_bonus_points : null; + Label_Task.Text = $"{TaskLabelString}:"; + NUP_CurrentValue.Enabled = CanSetCurrentValue; + + FLP_T1Right.Controls.Clear(); + + ShadeBoxes(); + + for (var t = 0; t < task.TaskThresholds.Length; t++) + ThresholdBoxes[t].Text = $"{task.TaskThresholds[t]}"; + + for (var t = 0; t < task.TaskThresholds.Length; t++) + FLP_T1Right.Controls.Add(ThresholdBoxes[task.TaskThresholds.Length - 1 - t]); + + ResumeLayout(); + } + + public void ShadeBoxes() + { + if (!Loaded) + return; + + var currentValue = CurrentValue; + for (var i = 0; i < Task.TaskThresholds.Length; i++) + ThresholdBoxes[i].BackColor = GetTaskColor(currentValue, i); + } + + private Color GetTaskColor(int currentValue, int thresholdIndex) + { + bool belowReported = thresholdIndex < ReportedCount; + if (currentValue >= Task.TaskThresholds[thresholdIndex]) + { + if (belowReported) + return ColorUtil.Blend(Color.Green, SystemColors.Window, 0.4); + return ColorUtil.Blend(Color.YellowGreen, SystemColors.Window, 0.4); + } + + if (belowReported) + return ColorUtil.Blend(Color.Red, SystemColors.Window, 0.4); + return SystemColors.Window; + } + + private void NUP_CurrentValue_Changed(object sender, EventArgs e) + { + ShadeBoxes(); + } + + public bool CanSetCurrentValue => Task.Task.CanSetCurrentValue(); + + private string TaskLabelString => Task.GetTaskLabelString(TaskDescriptions, TimeTaskDescriptions, SpeciesQuests); + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_BlockDump8.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_BlockDump8.cs index 7d62b193eb6..3dd13345bb8 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_BlockDump8.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_BlockDump8.cs @@ -11,22 +11,22 @@ namespace PKHeX.WinForms { public partial class SAV_BlockDump8 : Form { - private readonly SAV8SWSH SAV; + private readonly ISCBlockArray SAV; private readonly SCBlockMetadata Metadata; private SCBlock CurrentBlock = null!; - public SAV_BlockDump8(SaveFile sav) + public SAV_BlockDump8(ISCBlockArray sav) { InitializeComponent(); WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); - SAV = (SAV8SWSH)sav; + SAV = sav; PG_BlockView.Size = RTB_Hex.Size; // Get an external source of names if available. - var extra = GetExtraKeyNames(); - Metadata = new SCBlockMetadata(SAV.Blocks, extra, Main.Settings.Advanced.GetExclusionList8()); + var extra = GetExtraKeyNames(sav); + Metadata = new SCBlockMetadata(SAV.Accessor, extra, Main.Settings.Advanced.GetExclusionList8()); CB_Key.InitializeBinding(); CB_Key.DataSource = Metadata.GetSortedBlockKeyList().ToArray(); @@ -42,16 +42,24 @@ public SAV_BlockDump8(SaveFile sav) CB_Key.SelectedIndex = 0; } - private static IEnumerable GetExtraKeyNames() + private static IEnumerable GetExtraKeyNames(ISCBlockArray obj) { - var extra = Main.Settings.Advanced.PathBlockKeyListSWSH; - return File.Exists(extra) ? File.ReadLines(extra) : Array.Empty(); + var extra = Main.Settings.Advanced.PathBlockKeyList; + if (extra.Length != 0 && !Directory.Exists(extra)) + return Array.Empty(); + + var file = Path.Combine(extra, obj.GetType().Name); + file = $"{file}.txt"; + if (!File.Exists(file)) + return Array.Empty(); + + return File.ReadLines(file); } private void CB_Key_SelectedIndexChanged(object sender, EventArgs e) { var key = (uint)WinFormsUtil.GetIndex(CB_Key); - CurrentBlock = SAV.Blocks.GetBlock(key); + CurrentBlock = SAV.Accessor.GetBlock(key); UpdateBlockSummaryControls(); if (CurrentBlock.Type.IsBoolean()) { @@ -158,7 +166,7 @@ private void B_ExportAllSingle_Click(object sender, EventArgs e) var path = sfd.FileName; - var blocks = SAV.Blocks.BlockInfo; + var blocks = SAV.Accessor.BlockInfo; var option = SCBlockExportOption.None; if (CHK_DataOnly.Checked) option |= SCBlockExportOption.DataOnly; @@ -205,15 +213,15 @@ private void CompareSaves() return; var s1 = SaveUtil.GetVariantSAV(p1); - if (s1 is not SAV8SWSH w1) + if (s1 is not ISCBlockArray w1) return; var s2 = SaveUtil.GetVariantSAV(p2); - if (s2 is not SAV8SWSH w2) + if (s2 is not ISCBlockArray w2) return; // Get an external source of names if available. - var extra = GetExtraKeyNames(); - var compare = new SCBlockCompare(w1.Blocks, w2.Blocks, extra); + var extra = GetExtraKeyNames(w1); + var compare = new SCBlockCompare(w1.Accessor, w2.Accessor, extra); richTextBox1.Lines = compare.Summary().ToArray(); } diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.Designer.cs new file mode 100644 index 00000000000..9967ee4a436 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.Designer.cs @@ -0,0 +1,1027 @@ +namespace PKHeX.WinForms +{ + partial class SAV_PokedexLA + { + /// + /// 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() + { + this.B_Cancel = new System.Windows.Forms.Button(); + this.L_goto = new System.Windows.Forms.Label(); + this.CB_Species = new System.Windows.Forms.ComboBox(); + this.B_Save = new System.Windows.Forms.Button(); + this.L_DisplayedForm = new System.Windows.Forms.Label(); + this.GB_Displayed = new System.Windows.Forms.GroupBox(); + this.CHK_G = new System.Windows.Forms.CheckBox(); + this.CHK_S = new System.Windows.Forms.CheckBox(); + this.CHK_A = new System.Windows.Forms.CheckBox(); + this.LB_Forms = new System.Windows.Forms.ListBox(); + this.GB_SeenInWild = new System.Windows.Forms.GroupBox(); + this.CHK_S7 = new System.Windows.Forms.CheckBox(); + this.CHK_S6 = new System.Windows.Forms.CheckBox(); + this.CHK_S5 = new System.Windows.Forms.CheckBox(); + this.CHK_S4 = new System.Windows.Forms.CheckBox(); + this.CHK_S3 = new System.Windows.Forms.CheckBox(); + this.CHK_S2 = new System.Windows.Forms.CheckBox(); + this.CHK_S1 = new System.Windows.Forms.CheckBox(); + this.CHK_S0 = new System.Windows.Forms.CheckBox(); + this.GB_Obtained = new System.Windows.Forms.GroupBox(); + this.CHK_O7 = new System.Windows.Forms.CheckBox(); + this.CHK_O6 = new System.Windows.Forms.CheckBox(); + this.CHK_O5 = new System.Windows.Forms.CheckBox(); + this.CHK_O4 = new System.Windows.Forms.CheckBox(); + this.CHK_O3 = new System.Windows.Forms.CheckBox(); + this.CHK_O2 = new System.Windows.Forms.CheckBox(); + this.CHK_O1 = new System.Windows.Forms.CheckBox(); + this.CHK_O0 = new System.Windows.Forms.CheckBox(); + this.GB_CaughtInWild = new System.Windows.Forms.GroupBox(); + this.CHK_C7 = new System.Windows.Forms.CheckBox(); + this.CHK_C6 = new System.Windows.Forms.CheckBox(); + this.CHK_C5 = new System.Windows.Forms.CheckBox(); + this.CHK_C4 = new System.Windows.Forms.CheckBox(); + this.CHK_C3 = new System.Windows.Forms.CheckBox(); + this.CHK_C2 = new System.Windows.Forms.CheckBox(); + this.CHK_C1 = new System.Windows.Forms.CheckBox(); + this.CHK_C0 = new System.Windows.Forms.CheckBox(); + this.GB_Statistics = new System.Windows.Forms.GroupBox(); + this.CHK_MinAndMax = new System.Windows.Forms.CheckBox(); + this.GB_Weight = new System.Windows.Forms.GroupBox(); + this.L_TheoryWeight = new System.Windows.Forms.Label(); + this.TB_MaxWeight = new System.Windows.Forms.TextBox(); + this.TB_MinWeight = new System.Windows.Forms.TextBox(); + this.L_ConnectWeight = new System.Windows.Forms.Label(); + this.GB_Height = new System.Windows.Forms.GroupBox(); + this.TB_MaxHeight = new System.Windows.Forms.TextBox(); + this.TB_MinHeight = new System.Windows.Forms.TextBox(); + this.L_ConnectHeight = new System.Windows.Forms.Label(); + this.L_TheoryHeight = new System.Windows.Forms.Label(); + this.CB_DisplayForm = new System.Windows.Forms.ComboBox(); + this.GB_ResearchTasks = new System.Windows.Forms.GroupBox(); + this.MTB_UpdateIndex = new System.Windows.Forms.MaskedTextBox(); + this.L_UpdateIndex = new System.Windows.Forms.Label(); + this.PRT_10 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_9 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_8 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_7 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_6 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_5 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_4 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_3 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_2 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.PRT_1 = new PKHeX.WinForms.Controls.PokedexResearchTask8aPanel(); + this.CHK_Seen = new System.Windows.Forms.CheckBox(); + this.B_Report = new System.Windows.Forms.Button(); + this.CHK_Perfect = new System.Windows.Forms.CheckBox(); + this.CHK_Complete = new System.Windows.Forms.CheckBox(); + this.MTB_ResearchLevelUnreported = new System.Windows.Forms.MaskedTextBox(); + this.L_ResearchLevelUnreported = new System.Windows.Forms.Label(); + this.MTB_ResearchLevelReported = new System.Windows.Forms.MaskedTextBox(); + this.L_ResearchLevelReported = new System.Windows.Forms.Label(); + this.B_AdvancedResearch = new System.Windows.Forms.Button(); + this.LB_Species = new System.Windows.Forms.ListBox(); + this.GB_Displayed.SuspendLayout(); + this.GB_SeenInWild.SuspendLayout(); + this.GB_Obtained.SuspendLayout(); + this.GB_CaughtInWild.SuspendLayout(); + this.GB_Statistics.SuspendLayout(); + this.GB_Weight.SuspendLayout(); + this.GB_Height.SuspendLayout(); + this.GB_ResearchTasks.SuspendLayout(); + this.SuspendLayout(); + // + // B_Cancel + // + this.B_Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Cancel.Location = new System.Drawing.Point(706, 442); + this.B_Cancel.Name = "B_Cancel"; + this.B_Cancel.Size = new System.Drawing.Size(93, 23); + this.B_Cancel.TabIndex = 0; + this.B_Cancel.Text = "Cancel"; + this.B_Cancel.UseVisualStyleBackColor = true; + this.B_Cancel.Click += new System.EventHandler(this.B_Cancel_Click); + // + // L_goto + // + this.L_goto.AutoSize = true; + this.L_goto.Location = new System.Drawing.Point(12, 10); + this.L_goto.Name = "L_goto"; + this.L_goto.Size = new System.Drawing.Size(31, 13); + this.L_goto.TabIndex = 20; + this.L_goto.Text = "goto:"; + // + // CB_Species + // + this.CB_Species.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; + this.CB_Species.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CB_Species.DropDownWidth = 95; + this.CB_Species.FormattingEnabled = true; + this.CB_Species.Items.AddRange(new object[] { + "0"}); + this.CB_Species.Location = new System.Drawing.Point(42, 7); + this.CB_Species.Name = "CB_Species"; + this.CB_Species.Size = new System.Drawing.Size(95, 21); + this.CB_Species.TabIndex = 21; + this.CB_Species.SelectedIndexChanged += new System.EventHandler(this.ChangeCBSpecies); + this.CB_Species.SelectedValueChanged += new System.EventHandler(this.ChangeCBSpecies); + // + // B_Save + // + this.B_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Save.Location = new System.Drawing.Point(706, 418); + this.B_Save.Name = "B_Save"; + this.B_Save.Size = new System.Drawing.Size(93, 23); + this.B_Save.TabIndex = 24; + this.B_Save.Text = "Save"; + this.B_Save.UseVisualStyleBackColor = true; + this.B_Save.Click += new System.EventHandler(this.B_Save_Click); + // + // L_DisplayedForm + // + this.L_DisplayedForm.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.L_DisplayedForm.AutoSize = true; + this.L_DisplayedForm.Location = new System.Drawing.Point(704, 302); + this.L_DisplayedForm.Name = "L_DisplayedForm"; + this.L_DisplayedForm.Size = new System.Drawing.Size(82, 13); + this.L_DisplayedForm.TabIndex = 32; + this.L_DisplayedForm.Text = "Displayed Form:"; + // + // GB_Displayed + // + this.GB_Displayed.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.GB_Displayed.Controls.Add(this.CHK_G); + this.GB_Displayed.Controls.Add(this.CHK_S); + this.GB_Displayed.Controls.Add(this.CHK_A); + this.GB_Displayed.Location = new System.Drawing.Point(706, 344); + this.GB_Displayed.Name = "GB_Displayed"; + this.GB_Displayed.Size = new System.Drawing.Size(93, 67); + this.GB_Displayed.TabIndex = 33; + this.GB_Displayed.TabStop = false; + this.GB_Displayed.Text = "Displayed"; + // + // CHK_G + // + this.CHK_G.AutoSize = true; + this.CHK_G.Location = new System.Drawing.Point(5, 47); + this.CHK_G.Name = "CHK_G"; + this.CHK_G.Size = new System.Drawing.Size(60, 17); + this.CHK_G.TabIndex = 10; + this.CHK_G.Text = "Female"; + this.CHK_G.UseVisualStyleBackColor = true; + // + // CHK_S + // + this.CHK_S.AutoSize = true; + this.CHK_S.Location = new System.Drawing.Point(5, 30); + this.CHK_S.Name = "CHK_S"; + this.CHK_S.Size = new System.Drawing.Size(52, 17); + this.CHK_S.TabIndex = 9; + this.CHK_S.Text = "Shiny"; + this.CHK_S.UseVisualStyleBackColor = true; + // + // CHK_A + // + this.CHK_A.AutoSize = true; + this.CHK_A.Location = new System.Drawing.Point(5, 13); + this.CHK_A.Name = "CHK_A"; + this.CHK_A.Size = new System.Drawing.Size(53, 17); + this.CHK_A.TabIndex = 8; + this.CHK_A.Text = "Alpha"; + this.CHK_A.UseVisualStyleBackColor = true; + // + // LB_Forms + // + this.LB_Forms.FormattingEnabled = true; + this.LB_Forms.Location = new System.Drawing.Point(12, 317); + this.LB_Forms.Name = "LB_Forms"; + this.LB_Forms.Size = new System.Drawing.Size(125, 147); + this.LB_Forms.TabIndex = 37; + this.LB_Forms.SelectedIndexChanged += new System.EventHandler(this.ChangeLBForms); + // + // GB_SeenInWild + // + this.GB_SeenInWild.Controls.Add(this.CHK_S7); + this.GB_SeenInWild.Controls.Add(this.CHK_S6); + this.GB_SeenInWild.Controls.Add(this.CHK_S5); + this.GB_SeenInWild.Controls.Add(this.CHK_S4); + this.GB_SeenInWild.Controls.Add(this.CHK_S3); + this.GB_SeenInWild.Controls.Add(this.CHK_S2); + this.GB_SeenInWild.Controls.Add(this.CHK_S1); + this.GB_SeenInWild.Controls.Add(this.CHK_S0); + this.GB_SeenInWild.Location = new System.Drawing.Point(144, 301); + this.GB_SeenInWild.Name = "GB_SeenInWild"; + this.GB_SeenInWild.Size = new System.Drawing.Size(129, 165); + this.GB_SeenInWild.TabIndex = 38; + this.GB_SeenInWild.TabStop = false; + this.GB_SeenInWild.Text = "Seen in the Wild"; + // + // CHK_S7 + // + this.CHK_S7.AutoSize = true; + this.CHK_S7.Location = new System.Drawing.Point(6, 139); + this.CHK_S7.Name = "CHK_S7"; + this.CHK_S7.Size = new System.Drawing.Size(119, 17); + this.CHK_S7.TabIndex = 11; + this.CHK_S7.Text = "Shiny Alpha Female"; + this.CHK_S7.UseVisualStyleBackColor = true; + // + // CHK_S6 + // + this.CHK_S6.AutoSize = true; + this.CHK_S6.Location = new System.Drawing.Point(6, 122); + this.CHK_S6.Name = "CHK_S6"; + this.CHK_S6.Size = new System.Drawing.Size(108, 17); + this.CHK_S6.TabIndex = 10; + this.CHK_S6.Text = "Shiny Alpha Male"; + this.CHK_S6.UseVisualStyleBackColor = true; + // + // CHK_S5 + // + this.CHK_S5.AutoSize = true; + this.CHK_S5.Location = new System.Drawing.Point(6, 104); + this.CHK_S5.Name = "CHK_S5"; + this.CHK_S5.Size = new System.Drawing.Size(89, 17); + this.CHK_S5.TabIndex = 9; + this.CHK_S5.Text = "Shiny Female"; + this.CHK_S5.UseVisualStyleBackColor = true; + // + // CHK_S4 + // + this.CHK_S4.AutoSize = true; + this.CHK_S4.Location = new System.Drawing.Point(6, 87); + this.CHK_S4.Name = "CHK_S4"; + this.CHK_S4.Size = new System.Drawing.Size(78, 17); + this.CHK_S4.TabIndex = 8; + this.CHK_S4.Text = "Shiny Male"; + this.CHK_S4.UseVisualStyleBackColor = true; + // + // CHK_S3 + // + this.CHK_S3.AutoSize = true; + this.CHK_S3.Location = new System.Drawing.Point(6, 70); + this.CHK_S3.Name = "CHK_S3"; + this.CHK_S3.Size = new System.Drawing.Size(90, 17); + this.CHK_S3.TabIndex = 7; + this.CHK_S3.Text = "Alpha Female"; + this.CHK_S3.UseVisualStyleBackColor = true; + // + // CHK_S2 + // + this.CHK_S2.AutoSize = true; + this.CHK_S2.Location = new System.Drawing.Point(6, 53); + this.CHK_S2.Name = "CHK_S2"; + this.CHK_S2.Size = new System.Drawing.Size(79, 17); + this.CHK_S2.TabIndex = 6; + this.CHK_S2.Text = "Alpha Male"; + this.CHK_S2.UseVisualStyleBackColor = true; + // + // CHK_S1 + // + this.CHK_S1.AutoSize = true; + this.CHK_S1.Location = new System.Drawing.Point(6, 35); + this.CHK_S1.Name = "CHK_S1"; + this.CHK_S1.Size = new System.Drawing.Size(60, 17); + this.CHK_S1.TabIndex = 5; + this.CHK_S1.Text = "Female"; + this.CHK_S1.UseVisualStyleBackColor = true; + // + // CHK_S0 + // + this.CHK_S0.AutoSize = true; + this.CHK_S0.Location = new System.Drawing.Point(6, 18); + this.CHK_S0.Name = "CHK_S0"; + this.CHK_S0.Size = new System.Drawing.Size(49, 17); + this.CHK_S0.TabIndex = 4; + this.CHK_S0.Text = "Male"; + this.CHK_S0.UseVisualStyleBackColor = true; + // + // GB_Obtained + // + this.GB_Obtained.Controls.Add(this.CHK_O7); + this.GB_Obtained.Controls.Add(this.CHK_O6); + this.GB_Obtained.Controls.Add(this.CHK_O5); + this.GB_Obtained.Controls.Add(this.CHK_O4); + this.GB_Obtained.Controls.Add(this.CHK_O3); + this.GB_Obtained.Controls.Add(this.CHK_O2); + this.GB_Obtained.Controls.Add(this.CHK_O1); + this.GB_Obtained.Controls.Add(this.CHK_O0); + this.GB_Obtained.Location = new System.Drawing.Point(275, 301); + this.GB_Obtained.Name = "GB_Obtained"; + this.GB_Obtained.Size = new System.Drawing.Size(129, 165); + this.GB_Obtained.TabIndex = 39; + this.GB_Obtained.TabStop = false; + this.GB_Obtained.Text = "Obtained"; + // + // CHK_O7 + // + this.CHK_O7.AutoSize = true; + this.CHK_O7.Location = new System.Drawing.Point(6, 139); + this.CHK_O7.Name = "CHK_O7"; + this.CHK_O7.Size = new System.Drawing.Size(119, 17); + this.CHK_O7.TabIndex = 11; + this.CHK_O7.Text = "Shiny Alpha Female"; + this.CHK_O7.UseVisualStyleBackColor = true; + this.CHK_O7.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // CHK_O6 + // + this.CHK_O6.AutoSize = true; + this.CHK_O6.Location = new System.Drawing.Point(6, 122); + this.CHK_O6.Name = "CHK_O6"; + this.CHK_O6.Size = new System.Drawing.Size(108, 17); + this.CHK_O6.TabIndex = 10; + this.CHK_O6.Text = "Shiny Alpha Male"; + this.CHK_O6.UseVisualStyleBackColor = true; + this.CHK_O6.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // CHK_O5 + // + this.CHK_O5.AutoSize = true; + this.CHK_O5.Location = new System.Drawing.Point(6, 104); + this.CHK_O5.Name = "CHK_O5"; + this.CHK_O5.Size = new System.Drawing.Size(89, 17); + this.CHK_O5.TabIndex = 9; + this.CHK_O5.Text = "Shiny Female"; + this.CHK_O5.UseVisualStyleBackColor = true; + this.CHK_O5.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // CHK_O4 + // + this.CHK_O4.AutoSize = true; + this.CHK_O4.Location = new System.Drawing.Point(6, 87); + this.CHK_O4.Name = "CHK_O4"; + this.CHK_O4.Size = new System.Drawing.Size(78, 17); + this.CHK_O4.TabIndex = 8; + this.CHK_O4.Text = "Shiny Male"; + this.CHK_O4.UseVisualStyleBackColor = true; + this.CHK_O4.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // CHK_O3 + // + this.CHK_O3.AutoSize = true; + this.CHK_O3.Location = new System.Drawing.Point(6, 70); + this.CHK_O3.Name = "CHK_O3"; + this.CHK_O3.Size = new System.Drawing.Size(90, 17); + this.CHK_O3.TabIndex = 7; + this.CHK_O3.Text = "Alpha Female"; + this.CHK_O3.UseVisualStyleBackColor = true; + this.CHK_O3.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // CHK_O2 + // + this.CHK_O2.AutoSize = true; + this.CHK_O2.Location = new System.Drawing.Point(6, 53); + this.CHK_O2.Name = "CHK_O2"; + this.CHK_O2.Size = new System.Drawing.Size(79, 17); + this.CHK_O2.TabIndex = 6; + this.CHK_O2.Text = "Alpha Male"; + this.CHK_O2.UseVisualStyleBackColor = true; + this.CHK_O2.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // CHK_O1 + // + this.CHK_O1.AutoSize = true; + this.CHK_O1.Location = new System.Drawing.Point(6, 35); + this.CHK_O1.Name = "CHK_O1"; + this.CHK_O1.Size = new System.Drawing.Size(60, 17); + this.CHK_O1.TabIndex = 5; + this.CHK_O1.Text = "Female"; + this.CHK_O1.UseVisualStyleBackColor = true; + this.CHK_O1.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // CHK_O0 + // + this.CHK_O0.AutoSize = true; + this.CHK_O0.Location = new System.Drawing.Point(6, 18); + this.CHK_O0.Name = "CHK_O0"; + this.CHK_O0.Size = new System.Drawing.Size(49, 17); + this.CHK_O0.TabIndex = 4; + this.CHK_O0.Text = "Male"; + this.CHK_O0.UseVisualStyleBackColor = true; + this.CHK_O0.CheckedChanged += new System.EventHandler(this.CHK_ObtainFlag_Changed); + // + // GB_CaughtInWild + // + this.GB_CaughtInWild.Controls.Add(this.CHK_C7); + this.GB_CaughtInWild.Controls.Add(this.CHK_C6); + this.GB_CaughtInWild.Controls.Add(this.CHK_C5); + this.GB_CaughtInWild.Controls.Add(this.CHK_C4); + this.GB_CaughtInWild.Controls.Add(this.CHK_C3); + this.GB_CaughtInWild.Controls.Add(this.CHK_C2); + this.GB_CaughtInWild.Controls.Add(this.CHK_C1); + this.GB_CaughtInWild.Controls.Add(this.CHK_C0); + this.GB_CaughtInWild.Location = new System.Drawing.Point(406, 301); + this.GB_CaughtInWild.Name = "GB_CaughtInWild"; + this.GB_CaughtInWild.Size = new System.Drawing.Size(127, 165); + this.GB_CaughtInWild.TabIndex = 40; + this.GB_CaughtInWild.TabStop = false; + this.GB_CaughtInWild.Text = "Caught in the Wild"; + // + // CHK_C7 + // + this.CHK_C7.AutoSize = true; + this.CHK_C7.Location = new System.Drawing.Point(6, 139); + this.CHK_C7.Name = "CHK_C7"; + this.CHK_C7.Size = new System.Drawing.Size(119, 17); + this.CHK_C7.TabIndex = 11; + this.CHK_C7.Text = "Shiny Alpha Female"; + this.CHK_C7.UseVisualStyleBackColor = true; + // + // CHK_C6 + // + this.CHK_C6.AutoSize = true; + this.CHK_C6.Location = new System.Drawing.Point(6, 122); + this.CHK_C6.Name = "CHK_C6"; + this.CHK_C6.Size = new System.Drawing.Size(108, 17); + this.CHK_C6.TabIndex = 10; + this.CHK_C6.Text = "Shiny Alpha Male"; + this.CHK_C6.UseVisualStyleBackColor = true; + // + // CHK_C5 + // + this.CHK_C5.AutoSize = true; + this.CHK_C5.Location = new System.Drawing.Point(6, 104); + this.CHK_C5.Name = "CHK_C5"; + this.CHK_C5.Size = new System.Drawing.Size(89, 17); + this.CHK_C5.TabIndex = 9; + this.CHK_C5.Text = "Shiny Female"; + this.CHK_C5.UseVisualStyleBackColor = true; + // + // CHK_C4 + // + this.CHK_C4.AutoSize = true; + this.CHK_C4.Location = new System.Drawing.Point(6, 87); + this.CHK_C4.Name = "CHK_C4"; + this.CHK_C4.Size = new System.Drawing.Size(78, 17); + this.CHK_C4.TabIndex = 8; + this.CHK_C4.Text = "Shiny Male"; + this.CHK_C4.UseVisualStyleBackColor = true; + // + // CHK_C3 + // + this.CHK_C3.AutoSize = true; + this.CHK_C3.Location = new System.Drawing.Point(6, 70); + this.CHK_C3.Name = "CHK_C3"; + this.CHK_C3.Size = new System.Drawing.Size(90, 17); + this.CHK_C3.TabIndex = 7; + this.CHK_C3.Text = "Alpha Female"; + this.CHK_C3.UseVisualStyleBackColor = true; + // + // CHK_C2 + // + this.CHK_C2.AutoSize = true; + this.CHK_C2.Location = new System.Drawing.Point(6, 53); + this.CHK_C2.Name = "CHK_C2"; + this.CHK_C2.Size = new System.Drawing.Size(79, 17); + this.CHK_C2.TabIndex = 6; + this.CHK_C2.Text = "Alpha Male"; + this.CHK_C2.UseVisualStyleBackColor = true; + // + // CHK_C1 + // + this.CHK_C1.AutoSize = true; + this.CHK_C1.Location = new System.Drawing.Point(6, 35); + this.CHK_C1.Name = "CHK_C1"; + this.CHK_C1.Size = new System.Drawing.Size(60, 17); + this.CHK_C1.TabIndex = 5; + this.CHK_C1.Text = "Female"; + this.CHK_C1.UseVisualStyleBackColor = true; + // + // CHK_C0 + // + this.CHK_C0.AutoSize = true; + this.CHK_C0.Location = new System.Drawing.Point(6, 18); + this.CHK_C0.Name = "CHK_C0"; + this.CHK_C0.Size = new System.Drawing.Size(49, 17); + this.CHK_C0.TabIndex = 4; + this.CHK_C0.Text = "Male"; + this.CHK_C0.UseVisualStyleBackColor = true; + // + // GB_Statistics + // + this.GB_Statistics.Controls.Add(this.CHK_MinAndMax); + this.GB_Statistics.Controls.Add(this.GB_Weight); + this.GB_Statistics.Controls.Add(this.GB_Height); + this.GB_Statistics.Location = new System.Drawing.Point(536, 301); + this.GB_Statistics.Name = "GB_Statistics"; + this.GB_Statistics.Size = new System.Drawing.Size(165, 165); + this.GB_Statistics.TabIndex = 41; + this.GB_Statistics.TabStop = false; + this.GB_Statistics.Text = "Statistics"; + // + // CHK_MinAndMax + // + this.CHK_MinAndMax.AutoSize = true; + this.CHK_MinAndMax.Location = new System.Drawing.Point(6, 16); + this.CHK_MinAndMax.Name = "CHK_MinAndMax"; + this.CHK_MinAndMax.Size = new System.Drawing.Size(122, 17); + this.CHK_MinAndMax.TabIndex = 12; + this.CHK_MinAndMax.Text = "Has Both Min && Max"; + this.CHK_MinAndMax.UseVisualStyleBackColor = true; + // + // GB_Weight + // + this.GB_Weight.Controls.Add(this.L_TheoryWeight); + this.GB_Weight.Controls.Add(this.TB_MaxWeight); + this.GB_Weight.Controls.Add(this.TB_MinWeight); + this.GB_Weight.Controls.Add(this.L_ConnectWeight); + this.GB_Weight.Location = new System.Drawing.Point(5, 95); + this.GB_Weight.Name = "GB_Weight"; + this.GB_Weight.Size = new System.Drawing.Size(155, 65); + this.GB_Weight.TabIndex = 139; + this.GB_Weight.TabStop = false; + this.GB_Weight.Text = "Weight"; + // + // L_TheoryWeight + // + this.L_TheoryWeight.Location = new System.Drawing.Point(4, 39); + this.L_TheoryWeight.Margin = new System.Windows.Forms.Padding(0); + this.L_TheoryWeight.Name = "L_TheoryWeight"; + this.L_TheoryWeight.Size = new System.Drawing.Size(147, 21); + this.L_TheoryWeight.TabIndex = 152; + this.L_TheoryWeight.Text = "-"; + this.L_TheoryWeight.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // TB_MaxWeight + // + this.TB_MaxWeight.Location = new System.Drawing.Point(84, 16); + this.TB_MaxWeight.Margin = new System.Windows.Forms.Padding(0); + this.TB_MaxWeight.Name = "TB_MaxWeight"; + this.TB_MaxWeight.Size = new System.Drawing.Size(67, 20); + this.TB_MaxWeight.TabIndex = 145; + this.TB_MaxWeight.Text = "123.456789"; + // + // TB_MinWeight + // + this.TB_MinWeight.Location = new System.Drawing.Point(4, 16); + this.TB_MinWeight.Margin = new System.Windows.Forms.Padding(0); + this.TB_MinWeight.Name = "TB_MinWeight"; + this.TB_MinWeight.Size = new System.Drawing.Size(67, 20); + this.TB_MinWeight.TabIndex = 143; + this.TB_MinWeight.Text = "123.456789"; + // + // L_ConnectWeight + // + this.L_ConnectWeight.Location = new System.Drawing.Point(73, 15); + this.L_ConnectWeight.Margin = new System.Windows.Forms.Padding(0); + this.L_ConnectWeight.Name = "L_ConnectWeight"; + this.L_ConnectWeight.Size = new System.Drawing.Size(10, 21); + this.L_ConnectWeight.TabIndex = 144; + this.L_ConnectWeight.Text = "-"; + this.L_ConnectWeight.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // GB_Height + // + this.GB_Height.Controls.Add(this.TB_MaxHeight); + this.GB_Height.Controls.Add(this.TB_MinHeight); + this.GB_Height.Controls.Add(this.L_ConnectHeight); + this.GB_Height.Controls.Add(this.L_TheoryHeight); + this.GB_Height.Location = new System.Drawing.Point(5, 31); + this.GB_Height.Name = "GB_Height"; + this.GB_Height.Size = new System.Drawing.Size(155, 65); + this.GB_Height.TabIndex = 136; + this.GB_Height.TabStop = false; + this.GB_Height.Text = "Height"; + // + // TB_MaxHeight + // + this.TB_MaxHeight.Location = new System.Drawing.Point(84, 16); + this.TB_MaxHeight.Margin = new System.Windows.Forms.Padding(0); + this.TB_MaxHeight.Name = "TB_MaxHeight"; + this.TB_MaxHeight.Size = new System.Drawing.Size(67, 20); + this.TB_MaxHeight.TabIndex = 151; + this.TB_MaxHeight.Text = "123.456789"; + // + // TB_MinHeight + // + this.TB_MinHeight.Location = new System.Drawing.Point(4, 16); + this.TB_MinHeight.Margin = new System.Windows.Forms.Padding(0); + this.TB_MinHeight.Name = "TB_MinHeight"; + this.TB_MinHeight.Size = new System.Drawing.Size(67, 20); + this.TB_MinHeight.TabIndex = 149; + this.TB_MinHeight.Text = "123.456789"; + // + // L_ConnectHeight + // + this.L_ConnectHeight.Location = new System.Drawing.Point(73, 15); + this.L_ConnectHeight.Margin = new System.Windows.Forms.Padding(0); + this.L_ConnectHeight.Name = "L_ConnectHeight"; + this.L_ConnectHeight.Size = new System.Drawing.Size(10, 21); + this.L_ConnectHeight.TabIndex = 150; + this.L_ConnectHeight.Text = "-"; + this.L_ConnectHeight.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // L_TheoryHeight + // + this.L_TheoryHeight.Location = new System.Drawing.Point(4, 39); + this.L_TheoryHeight.Margin = new System.Windows.Forms.Padding(0); + this.L_TheoryHeight.Name = "L_TheoryHeight"; + this.L_TheoryHeight.Size = new System.Drawing.Size(147, 21); + this.L_TheoryHeight.TabIndex = 147; + this.L_TheoryHeight.Text = "-"; + this.L_TheoryHeight.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // CB_DisplayForm + // + this.CB_DisplayForm.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.CB_DisplayForm.FormattingEnabled = true; + this.CB_DisplayForm.Items.AddRange(new object[] { + "♂", + "♀", + "-"}); + this.CB_DisplayForm.Location = new System.Drawing.Point(706, 317); + this.CB_DisplayForm.Name = "CB_DisplayForm"; + this.CB_DisplayForm.Size = new System.Drawing.Size(93, 21); + this.CB_DisplayForm.TabIndex = 42; + // + // GB_ResearchTasks + // + this.GB_ResearchTasks.Controls.Add(this.MTB_UpdateIndex); + this.GB_ResearchTasks.Controls.Add(this.L_UpdateIndex); + this.GB_ResearchTasks.Controls.Add(this.PRT_10); + this.GB_ResearchTasks.Controls.Add(this.PRT_9); + this.GB_ResearchTasks.Controls.Add(this.PRT_8); + this.GB_ResearchTasks.Controls.Add(this.PRT_7); + this.GB_ResearchTasks.Controls.Add(this.PRT_6); + this.GB_ResearchTasks.Controls.Add(this.PRT_5); + this.GB_ResearchTasks.Controls.Add(this.PRT_4); + this.GB_ResearchTasks.Controls.Add(this.PRT_3); + this.GB_ResearchTasks.Controls.Add(this.PRT_2); + this.GB_ResearchTasks.Controls.Add(this.PRT_1); + this.GB_ResearchTasks.Controls.Add(this.CHK_Seen); + this.GB_ResearchTasks.Controls.Add(this.B_Report); + this.GB_ResearchTasks.Controls.Add(this.CHK_Perfect); + this.GB_ResearchTasks.Controls.Add(this.CHK_Complete); + this.GB_ResearchTasks.Controls.Add(this.MTB_ResearchLevelUnreported); + this.GB_ResearchTasks.Controls.Add(this.L_ResearchLevelUnreported); + this.GB_ResearchTasks.Controls.Add(this.MTB_ResearchLevelReported); + this.GB_ResearchTasks.Controls.Add(this.L_ResearchLevelReported); + this.GB_ResearchTasks.Controls.Add(this.B_AdvancedResearch); + this.GB_ResearchTasks.Location = new System.Drawing.Point(144, 28); + this.GB_ResearchTasks.Name = "GB_ResearchTasks"; + this.GB_ResearchTasks.Size = new System.Drawing.Size(655, 267); + this.GB_ResearchTasks.TabIndex = 39; + this.GB_ResearchTasks.TabStop = false; + this.GB_ResearchTasks.Text = "Research Tasks"; + // + // MTB_UpdateIndex + // + this.MTB_UpdateIndex.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_UpdateIndex.Enabled = false; + this.MTB_UpdateIndex.Location = new System.Drawing.Point(43, 239); + this.MTB_UpdateIndex.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.MTB_UpdateIndex.Mask = "999"; + this.MTB_UpdateIndex.Name = "MTB_UpdateIndex"; + this.MTB_UpdateIndex.PromptChar = ' '; + this.MTB_UpdateIndex.Size = new System.Drawing.Size(40, 20); + this.MTB_UpdateIndex.TabIndex = 150; + this.MTB_UpdateIndex.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_UpdateIndex + // + this.L_UpdateIndex.Location = new System.Drawing.Point(4, 237); + this.L_UpdateIndex.Margin = new System.Windows.Forms.Padding(0); + this.L_UpdateIndex.Name = "L_UpdateIndex"; + this.L_UpdateIndex.Size = new System.Drawing.Size(40, 21); + this.L_UpdateIndex.TabIndex = 149; + this.L_UpdateIndex.Text = "Index:"; + this.L_UpdateIndex.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // PRT_10 + // + this.PRT_10.CurrentValue = 0; + this.PRT_10.Location = new System.Drawing.Point(3, 213); + this.PRT_10.Name = "PRT_10"; + this.PRT_10.Size = new System.Drawing.Size(646, 22); + this.PRT_10.TabIndex = 148; + // + // PRT_9 + // + this.PRT_9.CurrentValue = 0; + this.PRT_9.Location = new System.Drawing.Point(3, 191); + this.PRT_9.Name = "PRT_9"; + this.PRT_9.Size = new System.Drawing.Size(646, 22); + this.PRT_9.TabIndex = 147; + // + // PRT_8 + // + this.PRT_8.CurrentValue = 0; + this.PRT_8.Location = new System.Drawing.Point(3, 169); + this.PRT_8.Name = "PRT_8"; + this.PRT_8.Size = new System.Drawing.Size(646, 22); + this.PRT_8.TabIndex = 146; + // + // PRT_7 + // + this.PRT_7.CurrentValue = 0; + this.PRT_7.Location = new System.Drawing.Point(3, 147); + this.PRT_7.Name = "PRT_7"; + this.PRT_7.Size = new System.Drawing.Size(646, 22); + this.PRT_7.TabIndex = 145; + // + // PRT_6 + // + this.PRT_6.CurrentValue = 0; + this.PRT_6.Location = new System.Drawing.Point(3, 125); + this.PRT_6.Name = "PRT_6"; + this.PRT_6.Size = new System.Drawing.Size(646, 22); + this.PRT_6.TabIndex = 144; + // + // PRT_5 + // + this.PRT_5.CurrentValue = 0; + this.PRT_5.Location = new System.Drawing.Point(3, 103); + this.PRT_5.Name = "PRT_5"; + this.PRT_5.Size = new System.Drawing.Size(646, 22); + this.PRT_5.TabIndex = 143; + // + // PRT_4 + // + this.PRT_4.CurrentValue = 0; + this.PRT_4.Location = new System.Drawing.Point(3, 81); + this.PRT_4.Name = "PRT_4"; + this.PRT_4.Size = new System.Drawing.Size(646, 22); + this.PRT_4.TabIndex = 142; + // + // PRT_3 + // + this.PRT_3.CurrentValue = 0; + this.PRT_3.Location = new System.Drawing.Point(3, 59); + this.PRT_3.Name = "PRT_3"; + this.PRT_3.Size = new System.Drawing.Size(646, 22); + this.PRT_3.TabIndex = 141; + // + // PRT_2 + // + this.PRT_2.CurrentValue = 0; + this.PRT_2.Location = new System.Drawing.Point(3, 37); + this.PRT_2.Name = "PRT_2"; + this.PRT_2.Size = new System.Drawing.Size(646, 22); + this.PRT_2.TabIndex = 140; + // + // PRT_1 + // + this.PRT_1.CurrentValue = 0; + this.PRT_1.Location = new System.Drawing.Point(3, 15); + this.PRT_1.Name = "PRT_1"; + this.PRT_1.Size = new System.Drawing.Size(646, 22); + this.PRT_1.TabIndex = 139; + // + // CHK_Seen + // + this.CHK_Seen.AutoSize = true; + this.CHK_Seen.Enabled = false; + this.CHK_Seen.Location = new System.Drawing.Point(268, 240); + this.CHK_Seen.Name = "CHK_Seen"; + this.CHK_Seen.Size = new System.Drawing.Size(51, 17); + this.CHK_Seen.TabIndex = 138; + this.CHK_Seen.Text = "Seen"; + this.CHK_Seen.UseVisualStyleBackColor = true; + // + // B_Report + // + this.B_Report.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Report.Location = new System.Drawing.Point(460, 239); + this.B_Report.Name = "B_Report"; + this.B_Report.Size = new System.Drawing.Size(84, 23); + this.B_Report.TabIndex = 137; + this.B_Report.Text = "Report Data"; + this.B_Report.UseVisualStyleBackColor = true; + this.B_Report.Click += new System.EventHandler(this.B_Report_Click); + // + // CHK_Perfect + // + this.CHK_Perfect.AutoSize = true; + this.CHK_Perfect.Enabled = false; + this.CHK_Perfect.Location = new System.Drawing.Point(396, 240); + this.CHK_Perfect.Name = "CHK_Perfect"; + this.CHK_Perfect.Size = new System.Drawing.Size(60, 17); + this.CHK_Perfect.TabIndex = 136; + this.CHK_Perfect.Text = "Perfect"; + this.CHK_Perfect.UseVisualStyleBackColor = true; + // + // CHK_Complete + // + this.CHK_Complete.AutoSize = true; + this.CHK_Complete.Enabled = false; + this.CHK_Complete.Location = new System.Drawing.Point(321, 240); + this.CHK_Complete.Name = "CHK_Complete"; + this.CHK_Complete.Size = new System.Drawing.Size(70, 17); + this.CHK_Complete.TabIndex = 135; + this.CHK_Complete.Text = "Complete"; + this.CHK_Complete.UseVisualStyleBackColor = true; + // + // MTB_ResearchLevelUnreported + // + this.MTB_ResearchLevelUnreported.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_ResearchLevelUnreported.Enabled = false; + this.MTB_ResearchLevelUnreported.Location = new System.Drawing.Point(233, 239); + this.MTB_ResearchLevelUnreported.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.MTB_ResearchLevelUnreported.Mask = "999"; + this.MTB_ResearchLevelUnreported.Name = "MTB_ResearchLevelUnreported"; + this.MTB_ResearchLevelUnreported.PromptChar = ' '; + this.MTB_ResearchLevelUnreported.Size = new System.Drawing.Size(25, 20); + this.MTB_ResearchLevelUnreported.TabIndex = 134; + this.MTB_ResearchLevelUnreported.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // L_ResearchLevelUnreported + // + this.L_ResearchLevelUnreported.Location = new System.Drawing.Point(170, 237); + this.L_ResearchLevelUnreported.Margin = new System.Windows.Forms.Padding(0); + this.L_ResearchLevelUnreported.Name = "L_ResearchLevelUnreported"; + this.L_ResearchLevelUnreported.Size = new System.Drawing.Size(63, 21); + this.L_ResearchLevelUnreported.TabIndex = 133; + this.L_ResearchLevelUnreported.Text = "Unreported:"; + this.L_ResearchLevelUnreported.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // MTB_ResearchLevelReported + // + this.MTB_ResearchLevelReported.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.MTB_ResearchLevelReported.Enabled = false; + this.MTB_ResearchLevelReported.Location = new System.Drawing.Point(143, 239); + this.MTB_ResearchLevelReported.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.MTB_ResearchLevelReported.Mask = "999"; + this.MTB_ResearchLevelReported.Name = "MTB_ResearchLevelReported"; + this.MTB_ResearchLevelReported.PromptChar = ' '; + this.MTB_ResearchLevelReported.Size = new System.Drawing.Size(25, 20); + this.MTB_ResearchLevelReported.TabIndex = 132; + this.MTB_ResearchLevelReported.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // L_ResearchLevelReported + // + this.L_ResearchLevelReported.Location = new System.Drawing.Point(86, 237); + this.L_ResearchLevelReported.Margin = new System.Windows.Forms.Padding(0); + this.L_ResearchLevelReported.Name = "L_ResearchLevelReported"; + this.L_ResearchLevelReported.Size = new System.Drawing.Size(55, 21); + this.L_ResearchLevelReported.TabIndex = 131; + this.L_ResearchLevelReported.Text = "Reported:"; + this.L_ResearchLevelReported.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // B_AdvancedResearch + // + this.B_AdvancedResearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_AdvancedResearch.Location = new System.Drawing.Point(546, 239); + this.B_AdvancedResearch.Name = "B_AdvancedResearch"; + this.B_AdvancedResearch.Size = new System.Drawing.Size(103, 23); + this.B_AdvancedResearch.TabIndex = 43; + this.B_AdvancedResearch.Text = "Edit All Tasks..."; + this.B_AdvancedResearch.UseVisualStyleBackColor = true; + this.B_AdvancedResearch.Click += new System.EventHandler(this.B_AdvancedResearch_Click); + // + // LB_Species + // + this.LB_Species.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.LB_Species.FormattingEnabled = true; + this.LB_Species.Location = new System.Drawing.Point(12, 33); + this.LB_Species.Name = "LB_Species"; + this.LB_Species.Size = new System.Drawing.Size(125, 277); + this.LB_Species.TabIndex = 2; + this.LB_Species.SelectedIndexChanged += new System.EventHandler(this.ChangeLBSpecies); + // + // SAV_PokedexLA + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(809, 471); + this.Controls.Add(this.GB_Statistics); + this.Controls.Add(this.GB_ResearchTasks); + this.Controls.Add(this.CB_DisplayForm); + this.Controls.Add(this.GB_CaughtInWild); + this.Controls.Add(this.GB_Obtained); + this.Controls.Add(this.GB_SeenInWild); + this.Controls.Add(this.LB_Forms); + this.Controls.Add(this.GB_Displayed); + this.Controls.Add(this.L_DisplayedForm); + this.Controls.Add(this.B_Save); + this.Controls.Add(this.CB_Species); + this.Controls.Add(this.L_goto); + this.Controls.Add(this.LB_Species); + this.Controls.Add(this.B_Cancel); + this.Icon = global::PKHeX.WinForms.Properties.Resources.Icon; + this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(825, 510); + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(825, 510); + this.Name = "SAV_PokedexLA"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Pokédex Editor"; + this.GB_Displayed.ResumeLayout(false); + this.GB_Displayed.PerformLayout(); + this.GB_SeenInWild.ResumeLayout(false); + this.GB_SeenInWild.PerformLayout(); + this.GB_Obtained.ResumeLayout(false); + this.GB_Obtained.PerformLayout(); + this.GB_CaughtInWild.ResumeLayout(false); + this.GB_CaughtInWild.PerformLayout(); + this.GB_Statistics.ResumeLayout(false); + this.GB_Statistics.PerformLayout(); + this.GB_Weight.ResumeLayout(false); + this.GB_Weight.PerformLayout(); + this.GB_Height.ResumeLayout(false); + this.GB_Height.PerformLayout(); + this.GB_ResearchTasks.ResumeLayout(false); + this.GB_ResearchTasks.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.Label L_goto; + private System.Windows.Forms.ComboBox CB_Species; + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.Label L_DisplayedForm; + private System.Windows.Forms.GroupBox GB_Displayed; + private System.Windows.Forms.CheckBox CHK_S; + private System.Windows.Forms.CheckBox CHK_A; + private System.Windows.Forms.ListBox LB_Forms; + private System.Windows.Forms.GroupBox GB_SeenInWild; + private System.Windows.Forms.CheckBox CHK_S7; + private System.Windows.Forms.CheckBox CHK_S6; + private System.Windows.Forms.CheckBox CHK_S5; + private System.Windows.Forms.CheckBox CHK_S4; + private System.Windows.Forms.CheckBox CHK_S3; + private System.Windows.Forms.CheckBox CHK_S2; + private System.Windows.Forms.CheckBox CHK_S1; + private System.Windows.Forms.CheckBox CHK_S0; + private System.Windows.Forms.GroupBox GB_Obtained; + private System.Windows.Forms.CheckBox CHK_O7; + private System.Windows.Forms.CheckBox CHK_O6; + private System.Windows.Forms.CheckBox CHK_O5; + private System.Windows.Forms.CheckBox CHK_O4; + private System.Windows.Forms.CheckBox CHK_O3; + private System.Windows.Forms.CheckBox CHK_O2; + private System.Windows.Forms.CheckBox CHK_O1; + private System.Windows.Forms.CheckBox CHK_O0; + private System.Windows.Forms.GroupBox GB_CaughtInWild; + private System.Windows.Forms.CheckBox CHK_C7; + private System.Windows.Forms.CheckBox CHK_C6; + private System.Windows.Forms.CheckBox CHK_C5; + private System.Windows.Forms.CheckBox CHK_C4; + private System.Windows.Forms.CheckBox CHK_C3; + private System.Windows.Forms.CheckBox CHK_C2; + private System.Windows.Forms.CheckBox CHK_C1; + private System.Windows.Forms.CheckBox CHK_C0; + private System.Windows.Forms.CheckBox CHK_G; + private System.Windows.Forms.ComboBox CB_DisplayForm; + private System.Windows.Forms.GroupBox GB_ResearchTasks; + private System.Windows.Forms.MaskedTextBox MTB_ResearchLevelUnreported; + private System.Windows.Forms.Label L_ResearchLevelUnreported; + private System.Windows.Forms.MaskedTextBox MTB_ResearchLevelReported; + private System.Windows.Forms.Label L_ResearchLevelReported; + private System.Windows.Forms.Button B_AdvancedResearch; + private System.Windows.Forms.Button B_Report; + private System.Windows.Forms.CheckBox CHK_Perfect; + private System.Windows.Forms.CheckBox CHK_Complete; + private System.Windows.Forms.CheckBox CHK_Seen; + private System.Windows.Forms.GroupBox GB_Statistics; + private System.Windows.Forms.GroupBox GB_Weight; + private System.Windows.Forms.GroupBox GB_Height; + private System.Windows.Forms.CheckBox CHK_MinAndMax; + private System.Windows.Forms.TextBox TB_MaxWeight; + private System.Windows.Forms.TextBox TB_MinWeight; + private System.Windows.Forms.Label L_ConnectWeight; + private System.Windows.Forms.Label L_TheoryHeight; + private System.Windows.Forms.ListBox LB_Species; + private Controls.PokedexResearchTask8aPanel PRT_1; + private Controls.PokedexResearchTask8aPanel PRT_10; + private Controls.PokedexResearchTask8aPanel PRT_9; + private Controls.PokedexResearchTask8aPanel PRT_8; + private Controls.PokedexResearchTask8aPanel PRT_7; + private Controls.PokedexResearchTask8aPanel PRT_6; + private Controls.PokedexResearchTask8aPanel PRT_5; + private Controls.PokedexResearchTask8aPanel PRT_4; + private Controls.PokedexResearchTask8aPanel PRT_3; + private Controls.PokedexResearchTask8aPanel PRT_2; + private System.Windows.Forms.TextBox TB_MaxHeight; + private System.Windows.Forms.TextBox TB_MinHeight; + private System.Windows.Forms.Label L_ConnectHeight; + private System.Windows.Forms.Label L_TheoryWeight; + private System.Windows.Forms.MaskedTextBox MTB_UpdateIndex; + private System.Windows.Forms.Label L_UpdateIndex; + } +} \ No newline at end of file diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.cs new file mode 100644 index 00000000000..1df334cc8da --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.cs @@ -0,0 +1,492 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms +{ + public partial class SAV_PokedexLA : Form + { + private readonly SAV8LA Origin; + private readonly SAV8LA SAV; + private readonly PokedexSave8a Dex; + private readonly CheckBox[] CHK_SeenWild; + private readonly CheckBox[] CHK_Obtained; + private readonly CheckBox[] CHK_CaughtWild; + + private readonly Controls.PokedexResearchTask8aPanel[] TaskControls; + + private readonly int[] SpeciesToDex; + private readonly int[] DexToSpecies; + + private int lastIndex = -1; + private int lastForm = -1; + private bool Editing; + private readonly bool CanSave; + + private readonly IList DisplayedForms; + + private readonly string[] TaskDescriptions = Util.GetStringList("tasks8a", Main.CurrentLanguage); + private readonly string[] SpeciesQuests = Util.GetStringList("species_tasks8a", Main.CurrentLanguage); + private readonly string[] TimeTaskDescriptions = Util.GetStringList("time_tasks8a", Main.CurrentLanguage); + + public SAV_PokedexLA(SAV8LA sav) + { + InitializeComponent(); + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + SAV = (SAV8LA)(Origin = sav).Clone(); + Dex = SAV.Blocks.PokedexSave; + var speciesNames = GameInfo.Strings.Species; + CHK_SeenWild = new[] { CHK_S0, CHK_S1, CHK_S2, CHK_S3, CHK_S4, CHK_S5, CHK_S6, CHK_S7 }; + CHK_Obtained = new[] { CHK_O0, CHK_O1, CHK_O2, CHK_O3, CHK_O4, CHK_O5, CHK_O6, CHK_O7 }; + CHK_CaughtWild = new[] { CHK_C0, CHK_C1, CHK_C2, CHK_C3, CHK_C4, CHK_C5, CHK_C6, CHK_C7 }; + + TaskControls = new [] + { + PRT_1, + PRT_2, + PRT_3, + PRT_4, + PRT_5, + PRT_6, + PRT_7, + PRT_8, + PRT_9, + PRT_10, + }; + + foreach (var tc in TaskControls) + { + tc.Visible = false; + tc.SetStrings(TaskDescriptions, SpeciesQuests, TimeTaskDescriptions); + } + + SpeciesToDex = new int[SAV.Personal.MaxSpeciesID + 1]; + + var maxDex = 0; + for (var s = 1; s <= SAV.Personal.MaxSpeciesID; s++) + { + var hisuiDex = PokedexSave8a.GetDexIndex(PokedexType8a.Hisui, s); + if (hisuiDex == 0) + continue; + + SpeciesToDex[s] = hisuiDex; + if (hisuiDex > maxDex) + maxDex = hisuiDex; + } + + DexToSpecies = new int[maxDex + 1]; + for (var s = 1; s <= SAV.Personal.MaxSpeciesID; s++) + { + if (SpeciesToDex[s] != 0) + DexToSpecies[SpeciesToDex[s]] = s; + } + + Editing = true; + // Clear Listbox and ComboBox + LB_Species.Items.Clear(); + CB_Species.Items.Clear(); + + // Fill List + CB_Species.InitializeBinding(); + var species = GameInfo.FilteredSources.Species.Where(z => PokedexSave8a.GetDexIndex(PokedexType8a.Hisui, z.Value) != 0).ToArray(); + CB_Species.DataSource = new BindingSource(species, null); + + CB_DisplayForm.InitializeBinding(); + DisplayedForms = new List { new(GameInfo.Strings.types[0], 0) }; + CB_DisplayForm.DataSource = new BindingSource(DisplayedForms, null); + + for (var d = 1; d < DexToSpecies.Length; d++) + LB_Species.Items.Add($"{d:000} - {speciesNames[DexToSpecies[d]]}"); + + Editing = false; + LB_Species.SelectedIndex = 0; + CB_Species.KeyDown += WinFormsUtil.RemoveDropCB; + CanSave = true; + } + + private void ChangeCBSpecies(object sender, EventArgs e) + { + if (Editing) + return; + + var species = WinFormsUtil.GetIndex(CB_Species); + var index = SpeciesToDex[species] - 1; + if (LB_Species.SelectedIndex != index) + LB_Species.SelectedIndex = index; // trigger event + } + + private void ChangeLBSpecies(object sender, EventArgs e) + { + if (Editing || LB_Species.SelectedIndex < 0) + return; + + SetEntry(lastIndex, lastForm); + Editing = true; + SuspendLayout(); + + lastIndex = LB_Species.SelectedIndex; + FillLBForms(lastIndex); + FillResearchTasks(lastIndex); + GetEntry(lastIndex, lastForm); + ResumeLayout(); + Editing = false; + } + + private void ChangeLBForms(object sender, EventArgs e) + { + if (Editing) + return; + + SetEntry(lastIndex, lastForm); + lastForm = LB_Forms.SelectedIndex; + + Editing = true; + SuspendLayout(); + GetEntry(lastIndex, lastForm); + ResumeLayout(); + Editing = false; + } + + private bool FillLBForms(int index) + { + LB_Forms.DataSource = null; + LB_Forms.Items.Clear(); + + DisplayedForms.Clear(); + DisplayedForms.Add(new ComboItem(GameInfo.Strings.types[0], 0)); + CB_DisplayForm.DataSource = new BindingSource(DisplayedForms, null); + + lastForm = 0; + + int species = DexToSpecies[index + 1]; + bool hasForms = FormInfo.HasFormSelection(SAV.Personal[species], species, 8); + LB_Forms.Enabled = CB_DisplayForm.Enabled = hasForms; + if (!hasForms) + return false; + + var ds = FormConverter.GetFormList(species, GameInfo.Strings.types, GameInfo.Strings.forms, Main.GenderSymbols, SAV.Generation).ToList(); + if (ds.Count == 1 && string.IsNullOrEmpty(ds[0])) + { + // empty + LB_Forms.Enabled = CB_DisplayForm.Enabled = false; + return false; + } + + // Sanitize forms to only show entries with form storage + var formCount = SAV.Personal[species].FormCount; + var sanitized = new List(); + DisplayedForms.Clear(); + for (var form = 0; form < formCount; form++) + { + if (!Dex.HasFormStorage(species, form) || Dex.IsBlacklisted(species, form)) + continue; + + sanitized.Add(ds[form]); + DisplayedForms.Add(new ComboItem(ds[form], form)); + } + + CB_DisplayForm.DataSource = new BindingSource(DisplayedForms, null); + LB_Forms.DataSource = sanitized; + LB_Forms.SelectedIndex = 0; + + return true; + } + + private void FillResearchTasks(int index) + { + var species = DexToSpecies[index + 1]; + var tasks = PokedexConstants8a.ResearchTasks[index]; + + for (var i = 0; i < tasks.Length; i++) + { + var tc = TaskControls[i]; + tc.Visible = false; + Dex.GetResearchTaskLevel(species, i, out var repLevel, out _, out _); + tc.SetTask(species, tasks[i], repLevel); + tc.Visible = true; + } + + for (var i = tasks.Length; i < TaskControls.Length; i++) + TaskControls[i].Visible = false; + } + + private void GetEntry(int index, int formIndex) + { + var species = DexToSpecies[index + 1]; + var form = DisplayedForms[formIndex].Value; + + // Flags + var seenWild = Dex.GetPokeSeenInWildFlags(species, form); + var obtain = Dex.GetPokeObtainFlags(species, form); + var caughtWild = Dex.GetPokeCaughtInWildFlags(species, form); + for (var i = 0; i < CHK_SeenWild.Length; ++i) + { + CHK_SeenWild[i].Checked = (seenWild & (1 << i)) != 0; + CHK_Obtained[i].Checked = (obtain & (1 << i)) != 0; + CHK_CaughtWild[i].Checked = (caughtWild & (1 << i)) != 0; + } + + // Display + if (CB_DisplayForm.Enabled) + { + var selectedForm = Dex.GetSelectedForm(species); + CB_DisplayForm.SelectedIndex = 0; + for (var i = 0; i < CB_DisplayForm.Items.Count; ++i) + { + if (((ComboItem)CB_DisplayForm.Items[i]).Value != selectedForm) + continue; + + CB_DisplayForm.SelectedIndex = i; + break; + } + } + + CHK_A.Checked = Dex.GetSelectedAlpha(species); + CHK_S.Checked = Dex.GetSelectedShiny(species); + + CHK_G.Enabled = PokedexSave8a.HasMultipleGenders(species); + CHK_G.Checked = Dex.GetSelectedGender1(species); + + // Research + var reportedRate = Dex.GetPokeResearchRate(species); + var unreportedRate = reportedRate; + for (var i = 0; i < PokedexConstants8a.ResearchTasks[index].Length; i++) + { + var unreportedLevels = Dex.GetResearchTaskLevel(species, i, out _, out var taskValue, out _); + TaskControls[i].CurrentValue = taskValue; + unreportedRate += unreportedLevels * TaskControls[i].PointsPerLevel; + } + + MTB_UpdateIndex.Text = Dex.GetUpdateIndex(species).ToString(); + MTB_ResearchLevelReported.Text = reportedRate.ToString(); + MTB_ResearchLevelUnreported.Text = unreportedRate.ToString(); + + CHK_Seen.Checked = Dex.HasPokeEverBeenUpdated(species); + CHK_Complete.Checked = Dex.IsComplete(species); + CHK_Perfect.Checked = Dex.IsPerfect(species); + + // Statistics + Dex.GetSizeStatistics(species, form, out var hasMax, out var minHeight, out var maxHeight, out var minWeight, out var maxWeight); + CHK_MinAndMax.Checked = hasMax; + TB_MinHeight.Text = minHeight.ToString(CultureInfo.InvariantCulture); + TB_MaxHeight.Text = maxHeight.ToString(CultureInfo.InvariantCulture); + TB_MinWeight.Text = minWeight.ToString(CultureInfo.InvariantCulture); + TB_MaxWeight.Text = maxWeight.ToString(CultureInfo.InvariantCulture); + + var pt = SAV.Personal; + var pi = pt.GetFormEntry(species, form); + var minTheoryHeight = PA8.GetHeightAbsolute(pi, 0x00).ToString(CultureInfo.InvariantCulture); + var maxTheoryHeight = PA8.GetHeightAbsolute(pi, 0xFF).ToString(CultureInfo.InvariantCulture); + var minTheoryWeight = PA8.GetWeightAbsolute(pi, 0x00, 0x00).ToString(CultureInfo.InvariantCulture); + var maxTheoryWeight = PA8.GetWeightAbsolute(pi, 0xFF, 0xFF).ToString(CultureInfo.InvariantCulture); + + L_TheoryHeight.Text = $"Min: {minTheoryHeight}, Max: {maxTheoryHeight}"; + L_TheoryWeight.Text = $"Min: {minTheoryWeight}, Max: {maxTheoryWeight}"; + } + + private bool IsEntryEmpty(int index, int formIndex) + { + var species = DexToSpecies[index + 1]; + var form = DisplayedForms[formIndex].Value; + + // Any seen/obtain flags + for (var i = 0; i < CHK_SeenWild.Length; i++) + { + if (CHK_SeenWild[i].Checked) + return false; + if (CHK_Obtained[i].Checked) + return false; + if (CHK_CaughtWild[i].Checked) + return false; + } + + // Any display flags + if ((CHK_G.Enabled && CHK_G.Checked) || CHK_S.Checked || CHK_A.Checked) + return false; + + // Any research + for (var i = 0; i < PokedexConstants8a.ResearchTasks[index].Length; i++) + { + Dex.GetResearchTaskLevel(species, i, out var reportedLevels, out _, out _); + if (reportedLevels > 1) + return false; + if (TaskControls[i].CurrentValue != 0) + return false; + } + + if (CHK_Complete.Checked || CHK_Perfect.Checked) + return false; + + // Any statistics + Dex.GetSizeStatistics(species, form, out _, out var oldMinHeight, out var oldMaxHeight, out var oldMinWeight, out var oldMaxWeight); + + if (!float.TryParse(TB_MinHeight.Text, out var minHeight)) + minHeight = oldMinHeight; + + if (!float.TryParse(TB_MaxHeight.Text, out var maxHeight)) + maxHeight = oldMaxHeight; + + if (!float.TryParse(TB_MinWeight.Text, out var minWeight)) + minWeight = oldMinWeight; + + if (!float.TryParse(TB_MaxWeight.Text, out var maxWeight)) + maxWeight = oldMaxWeight; + + if (CHK_MinAndMax.Checked) + return false; + + return minHeight == 0 && maxHeight == 0 && minWeight == 0 && maxWeight == 0; + } + + private void SetEntry(int index, int formIndex) + { + if (!CanSave || Editing || index < 0 || formIndex < 0) + return; + + var empty = IsEntryEmpty(index, formIndex); + + if (!CHK_Seen.Checked && empty) + return; + + var species = DexToSpecies[index + 1]; + var form = DisplayedForms[formIndex].Value; + + if (!empty) + Dex.SetPokeHasBeenUpdated(species); + + // Flags + var seenWild = 0; + var obtain = 0; + var caughtWild = 0; + for (var i = 0; i < CHK_SeenWild.Length; i++) + { + seenWild |= CHK_SeenWild[i].Checked ? (1 << i) : 0; + obtain |= CHK_Obtained[i].Checked ? (1 << i) : 0; + caughtWild |= CHK_CaughtWild[i].Checked ? (1 << i) : 0; + } + + Dex.SetPokeSeenInWildFlags(species, form, (byte)seenWild); + Dex.SetPokeObtainFlags(species, form, (byte)obtain); + Dex.SetPokeCaughtInWildFlags(species, form, (byte)caughtWild); + + // Display + var dispForm = form; + if (CB_DisplayForm.Enabled) + dispForm = WinFormsUtil.GetIndex(CB_DisplayForm); + + Dex.SetSelectedGenderForm(species, dispForm, CHK_G.Checked, CHK_S.Checked, CHK_A.Checked); + + // Set research + for (var i = 0; i < PokedexConstants8a.ResearchTasks[index].Length; i++) + { + if (TaskControls[i].CanSetCurrentValue) + Dex.SetResearchTaskProgressByForce(species, TaskControls[i].Task, TaskControls[i].CurrentValue); + } + + // Statistics + Dex.GetSizeStatistics(species, form, out _, out var oldMinHeight, out var oldMaxHeight, out var oldMinWeight, out var oldMaxWeight); + + if (!float.TryParse(TB_MinHeight.Text, out var minHeight)) + minHeight = oldMinHeight; + + if (!float.TryParse(TB_MaxHeight.Text, out var maxHeight)) + maxHeight = oldMaxHeight; + + if (!float.TryParse(TB_MinWeight.Text, out var minWeight)) + minWeight = oldMinWeight; + + if (!float.TryParse(TB_MaxWeight.Text, out var maxWeight)) + maxWeight = oldMaxWeight; + + Dex.SetSizeStatistics(species, form, CHK_MinAndMax.Checked, minHeight, maxHeight, minWeight, maxWeight); + } + + private void B_Cancel_Click(object sender, EventArgs e) + { + Close(); + } + + private void B_Save_Click(object sender, EventArgs e) + { + SetEntry(lastIndex, LB_Forms.SelectedIndex); + Origin.CopyChangesFrom(SAV); + Close(); + } + + private void CHK_ObtainFlag_Changed(object sender, EventArgs e) + { + if (Editing) + return; + + var overrideObtainFlags = 0; + for (var i = 0; i < CHK_Obtained.Length; i++) + { + if (CHK_Obtained[i].Checked) + overrideObtainFlags |= (1 << i); + } + + var tasks = PokedexConstants8a.ResearchTasks[lastIndex]; + var species = DexToSpecies[lastIndex + 1]; + var form = DisplayedForms[lastForm].Value; + + SuspendLayout(); + for (var i = 0; i < tasks.Length; i++) + { + if (tasks[i].Task != PokedexResearchTaskType8a.ObtainForms) + continue; + + var formCount = Dex.GetObtainedFormCounts(species, form | (overrideObtainFlags << 16)); + var tc = TaskControls[i]; + if (tc.CurrentValue != formCount) + tc.CurrentValue = formCount; + } + ResumeLayout(); + } + + private void B_Report_Click(object sender, EventArgs e) + { + // Set the entry + SetEntry(lastIndex, lastForm); + + Editing = true; + SuspendLayout(); + + // Perform a report on the specific species + var species = DexToSpecies[lastIndex + 1]; + Dex.UpdateSpecificReportPoke(species, out _); + + // Refresh all tasks + FillResearchTasks(lastIndex); + + // Refresh all values + GetEntry(lastIndex, lastForm); + ResumeLayout(); + Editing = false; + System.Media.SystemSounds.Asterisk.Play(); + } + + private void B_AdvancedResearch_Click(object sender, EventArgs e) + { + // Set the entry + SetEntry(lastIndex, lastForm); + + // Show detailed editor form + using var form = new SAV_PokedexResearchEditorLA(SAV, DexToSpecies[lastIndex + 1], lastIndex, TaskDescriptions, TimeTaskDescriptions); + form.ShowDialog(); + + Editing = true; + SuspendLayout(); + + // Refresh all tasks + FillResearchTasks(lastIndex); + + // Refresh all values + GetEntry(lastIndex, lastForm); + ResumeLayout(); + Editing = false; + } + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.Designer.cs new file mode 100644 index 00000000000..bce2c5c0c32 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.Designer.cs @@ -0,0 +1,1222 @@ +namespace PKHeX.WinForms +{ + partial class SAV_PokedexResearchEditorLA + { + /// + /// 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() + { + this.B_Cancel = new System.Windows.Forms.Button(); + this.TC_Research = new System.Windows.Forms.TabControl(); + this.GB_Catch = new System.Windows.Forms.TabPage(); + this.L_CatchNotSpotted = new System.Windows.Forms.Label(); + this.NUP_CatchNotSpotted = new System.Windows.Forms.NumericUpDown(); + this.L_CatchInAir = new System.Windows.Forms.Label(); + this.NUP_CatchInAir = new System.Windows.Forms.NumericUpDown(); + this.L_CatchSleeping = new System.Windows.Forms.Label(); + this.NUP_CatchSleeping = new System.Windows.Forms.NumericUpDown(); + this.L_CatchAtTime = new System.Windows.Forms.Label(); + this.NUP_CatchAtTime = new System.Windows.Forms.NumericUpDown(); + this.L_CatchLight = new System.Windows.Forms.Label(); + this.NUP_CatchLight = new System.Windows.Forms.NumericUpDown(); + this.L_CatchHeavy = new System.Windows.Forms.Label(); + this.NUP_CatchHeavy = new System.Windows.Forms.NumericUpDown(); + this.L_CatchSmall = new System.Windows.Forms.Label(); + this.NUP_CatchSmall = new System.Windows.Forms.NumericUpDown(); + this.L_CatchLarge = new System.Windows.Forms.Label(); + this.NUP_CatchLarge = new System.Windows.Forms.NumericUpDown(); + this.L_CatchAlpha = new System.Windows.Forms.Label(); + this.NUP_CatchAlpha = new System.Windows.Forms.NumericUpDown(); + this.L_Catch = new System.Windows.Forms.Label(); + this.NUP_Catch = new System.Windows.Forms.NumericUpDown(); + this.GB_Battle = new System.Windows.Forms.TabPage(); + this.L_AgileStyle = new System.Windows.Forms.Label(); + this.NUP_AgileStyle = new System.Windows.Forms.NumericUpDown(); + this.L_StrongStyle = new System.Windows.Forms.Label(); + this.NUP_StrongStyle = new System.Windows.Forms.NumericUpDown(); + this.L_Defeat = new System.Windows.Forms.Label(); + this.NUP_Defeat = new System.Windows.Forms.NumericUpDown(); + this.L_DefeatWithMove2 = new System.Windows.Forms.Label(); + this.NUP_DefeatWithMove2 = new System.Windows.Forms.NumericUpDown(); + this.L_DefeatWithMove1 = new System.Windows.Forms.Label(); + this.NUP_DefeatWithMove1 = new System.Windows.Forms.NumericUpDown(); + this.L_DefeatWithMove0 = new System.Windows.Forms.Label(); + this.NUP_DefeatWithMove0 = new System.Windows.Forms.NumericUpDown(); + this.L_UseMove3 = new System.Windows.Forms.Label(); + this.NUP_UseMove3 = new System.Windows.Forms.NumericUpDown(); + this.L_UseMove2 = new System.Windows.Forms.Label(); + this.NUP_UseMove2 = new System.Windows.Forms.NumericUpDown(); + this.L_UseMove1 = new System.Windows.Forms.Label(); + this.NUP_UseMove1 = new System.Windows.Forms.NumericUpDown(); + this.L_UseMove0 = new System.Windows.Forms.Label(); + this.NUP_UseMove0 = new System.Windows.Forms.NumericUpDown(); + this.GB_Interact = new System.Windows.Forms.TabPage(); + this.L_Lure = new System.Windows.Forms.Label(); + this.NUP_Lure = new System.Windows.Forms.NumericUpDown(); + this.L_Scare = new System.Windows.Forms.Label(); + this.NUP_Scare = new System.Windows.Forms.NumericUpDown(); + this.L_Stun = new System.Windows.Forms.Label(); + this.NUP_Stun = new System.Windows.Forms.NumericUpDown(); + this.L_GiveFood = new System.Windows.Forms.Label(); + this.NUP_GiveFood = new System.Windows.Forms.NumericUpDown(); + this.L_Evolve = new System.Windows.Forms.Label(); + this.NUP_Evolve = new System.Windows.Forms.NumericUpDown(); + this.GB_Observe = new System.Windows.Forms.TabPage(); + this.L_LeapTussocks = new System.Windows.Forms.Label(); + this.NUP_LeapTussocks = new System.Windows.Forms.NumericUpDown(); + this.L_LeapOre = new System.Windows.Forms.Label(); + this.NUP_LeapOre = new System.Windows.Forms.NumericUpDown(); + this.L_LeapSnow = new System.Windows.Forms.Label(); + this.NUP_LeapSnow = new System.Windows.Forms.NumericUpDown(); + this.L_LeapLeaves = new System.Windows.Forms.Label(); + this.NUP_LeapLeaves = new System.Windows.Forms.NumericUpDown(); + this.L_LeapTrees = new System.Windows.Forms.Label(); + this.NUP_LeapTrees = new System.Windows.Forms.NumericUpDown(); + this.L_Species = new System.Windows.Forms.Label(); + this.B_Save = new System.Windows.Forms.Button(); + this.TC_Research.SuspendLayout(); + this.GB_Catch.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchNotSpotted)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchInAir)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchSleeping)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchAtTime)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchLight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchHeavy)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchSmall)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchLarge)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchAlpha)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Catch)).BeginInit(); + this.GB_Battle.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_AgileStyle)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_StrongStyle)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Defeat)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_DefeatWithMove2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_DefeatWithMove1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_DefeatWithMove0)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove0)).BeginInit(); + this.GB_Interact.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Lure)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Scare)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Stun)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_GiveFood)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Evolve)).BeginInit(); + this.GB_Observe.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapTussocks)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapOre)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapSnow)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapLeaves)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapTrees)).BeginInit(); + this.SuspendLayout(); + // + // B_Cancel + // + this.B_Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Cancel.Location = new System.Drawing.Point(417, 249); + this.B_Cancel.Name = "B_Cancel"; + this.B_Cancel.Size = new System.Drawing.Size(90, 23); + this.B_Cancel.TabIndex = 0; + this.B_Cancel.Text = "Cancel"; + this.B_Cancel.UseVisualStyleBackColor = true; + this.B_Cancel.Click += new System.EventHandler(this.B_Cancel_Click); + // + // TC_Research + // + this.TC_Research.AllowDrop = true; + this.TC_Research.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TC_Research.Controls.Add(this.GB_Catch); + this.TC_Research.Controls.Add(this.GB_Battle); + this.TC_Research.Controls.Add(this.GB_Interact); + this.TC_Research.Controls.Add(this.GB_Observe); + this.TC_Research.Location = new System.Drawing.Point(7, 6); + this.TC_Research.Name = "TC_Research"; + this.TC_Research.SelectedIndex = 0; + this.TC_Research.Size = new System.Drawing.Size(408, 268); + this.TC_Research.TabIndex = 65; + // + // GB_Catch + // + this.GB_Catch.Controls.Add(this.L_CatchNotSpotted); + this.GB_Catch.Controls.Add(this.NUP_CatchNotSpotted); + this.GB_Catch.Controls.Add(this.L_CatchInAir); + this.GB_Catch.Controls.Add(this.NUP_CatchInAir); + this.GB_Catch.Controls.Add(this.L_CatchSleeping); + this.GB_Catch.Controls.Add(this.NUP_CatchSleeping); + this.GB_Catch.Controls.Add(this.L_CatchAtTime); + this.GB_Catch.Controls.Add(this.NUP_CatchAtTime); + this.GB_Catch.Controls.Add(this.L_CatchLight); + this.GB_Catch.Controls.Add(this.NUP_CatchLight); + this.GB_Catch.Controls.Add(this.L_CatchHeavy); + this.GB_Catch.Controls.Add(this.NUP_CatchHeavy); + this.GB_Catch.Controls.Add(this.L_CatchSmall); + this.GB_Catch.Controls.Add(this.NUP_CatchSmall); + this.GB_Catch.Controls.Add(this.L_CatchLarge); + this.GB_Catch.Controls.Add(this.NUP_CatchLarge); + this.GB_Catch.Controls.Add(this.L_CatchAlpha); + this.GB_Catch.Controls.Add(this.NUP_CatchAlpha); + this.GB_Catch.Controls.Add(this.L_Catch); + this.GB_Catch.Controls.Add(this.NUP_Catch); + this.GB_Catch.Location = new System.Drawing.Point(4, 22); + this.GB_Catch.Name = "GB_Catch"; + this.GB_Catch.Padding = new System.Windows.Forms.Padding(3); + this.GB_Catch.Size = new System.Drawing.Size(400, 242); + this.GB_Catch.TabIndex = 0; + this.GB_Catch.Text = "Catch"; + this.GB_Catch.UseVisualStyleBackColor = true; + // + // L_CatchNotSpotted + // + this.L_CatchNotSpotted.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchNotSpotted.Location = new System.Drawing.Point(3, 213); + this.L_CatchNotSpotted.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchNotSpotted.Name = "L_CatchNotSpotted"; + this.L_CatchNotSpotted.Size = new System.Drawing.Size(316, 20); + this.L_CatchNotSpotted.TabIndex = 70; + this.L_CatchNotSpotted.Text = "Task Description:"; + this.L_CatchNotSpotted.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchNotSpotted + // + this.NUP_CatchNotSpotted.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchNotSpotted.Location = new System.Drawing.Point(322, 213); + this.NUP_CatchNotSpotted.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchNotSpotted.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchNotSpotted.Name = "NUP_CatchNotSpotted"; + this.NUP_CatchNotSpotted.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchNotSpotted.TabIndex = 71; + this.NUP_CatchNotSpotted.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchInAir + // + this.L_CatchInAir.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchInAir.Location = new System.Drawing.Point(3, 190); + this.L_CatchInAir.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchInAir.Name = "L_CatchInAir"; + this.L_CatchInAir.Size = new System.Drawing.Size(316, 20); + this.L_CatchInAir.TabIndex = 68; + this.L_CatchInAir.Text = "Task Description:"; + this.L_CatchInAir.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchInAir + // + this.NUP_CatchInAir.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchInAir.Location = new System.Drawing.Point(322, 190); + this.NUP_CatchInAir.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchInAir.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchInAir.Name = "NUP_CatchInAir"; + this.NUP_CatchInAir.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchInAir.TabIndex = 69; + this.NUP_CatchInAir.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchSleeping + // + this.L_CatchSleeping.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchSleeping.Location = new System.Drawing.Point(3, 167); + this.L_CatchSleeping.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchSleeping.Name = "L_CatchSleeping"; + this.L_CatchSleeping.Size = new System.Drawing.Size(316, 20); + this.L_CatchSleeping.TabIndex = 66; + this.L_CatchSleeping.Text = "Task Description:"; + this.L_CatchSleeping.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchSleeping + // + this.NUP_CatchSleeping.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchSleeping.Location = new System.Drawing.Point(322, 167); + this.NUP_CatchSleeping.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchSleeping.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchSleeping.Name = "NUP_CatchSleeping"; + this.NUP_CatchSleeping.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchSleeping.TabIndex = 67; + this.NUP_CatchSleeping.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchAtTime + // + this.L_CatchAtTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchAtTime.Location = new System.Drawing.Point(3, 144); + this.L_CatchAtTime.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchAtTime.Name = "L_CatchAtTime"; + this.L_CatchAtTime.Size = new System.Drawing.Size(316, 20); + this.L_CatchAtTime.TabIndex = 64; + this.L_CatchAtTime.Text = "Task Description:"; + this.L_CatchAtTime.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchAtTime + // + this.NUP_CatchAtTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchAtTime.Location = new System.Drawing.Point(322, 144); + this.NUP_CatchAtTime.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchAtTime.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchAtTime.Name = "NUP_CatchAtTime"; + this.NUP_CatchAtTime.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchAtTime.TabIndex = 65; + this.NUP_CatchAtTime.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchLight + // + this.L_CatchLight.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchLight.Location = new System.Drawing.Point(3, 121); + this.L_CatchLight.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchLight.Name = "L_CatchLight"; + this.L_CatchLight.Size = new System.Drawing.Size(316, 20); + this.L_CatchLight.TabIndex = 62; + this.L_CatchLight.Text = "Task Description:"; + this.L_CatchLight.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchLight + // + this.NUP_CatchLight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchLight.Location = new System.Drawing.Point(322, 121); + this.NUP_CatchLight.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchLight.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchLight.Name = "NUP_CatchLight"; + this.NUP_CatchLight.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchLight.TabIndex = 63; + this.NUP_CatchLight.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchHeavy + // + this.L_CatchHeavy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchHeavy.Location = new System.Drawing.Point(3, 98); + this.L_CatchHeavy.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchHeavy.Name = "L_CatchHeavy"; + this.L_CatchHeavy.Size = new System.Drawing.Size(316, 20); + this.L_CatchHeavy.TabIndex = 60; + this.L_CatchHeavy.Text = "Task Description:"; + this.L_CatchHeavy.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchHeavy + // + this.NUP_CatchHeavy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchHeavy.Location = new System.Drawing.Point(322, 98); + this.NUP_CatchHeavy.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchHeavy.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchHeavy.Name = "NUP_CatchHeavy"; + this.NUP_CatchHeavy.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchHeavy.TabIndex = 61; + this.NUP_CatchHeavy.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchSmall + // + this.L_CatchSmall.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchSmall.Location = new System.Drawing.Point(3, 75); + this.L_CatchSmall.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchSmall.Name = "L_CatchSmall"; + this.L_CatchSmall.Size = new System.Drawing.Size(316, 20); + this.L_CatchSmall.TabIndex = 58; + this.L_CatchSmall.Text = "Task Description:"; + this.L_CatchSmall.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchSmall + // + this.NUP_CatchSmall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchSmall.Location = new System.Drawing.Point(322, 75); + this.NUP_CatchSmall.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchSmall.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchSmall.Name = "NUP_CatchSmall"; + this.NUP_CatchSmall.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchSmall.TabIndex = 59; + this.NUP_CatchSmall.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchLarge + // + this.L_CatchLarge.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchLarge.Location = new System.Drawing.Point(3, 52); + this.L_CatchLarge.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchLarge.Name = "L_CatchLarge"; + this.L_CatchLarge.Size = new System.Drawing.Size(316, 20); + this.L_CatchLarge.TabIndex = 56; + this.L_CatchLarge.Text = "Task Description:"; + this.L_CatchLarge.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchLarge + // + this.NUP_CatchLarge.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchLarge.Location = new System.Drawing.Point(322, 52); + this.NUP_CatchLarge.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchLarge.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchLarge.Name = "NUP_CatchLarge"; + this.NUP_CatchLarge.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchLarge.TabIndex = 57; + this.NUP_CatchLarge.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_CatchAlpha + // + this.L_CatchAlpha.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_CatchAlpha.Location = new System.Drawing.Point(3, 29); + this.L_CatchAlpha.Margin = new System.Windows.Forms.Padding(0); + this.L_CatchAlpha.Name = "L_CatchAlpha"; + this.L_CatchAlpha.Size = new System.Drawing.Size(316, 20); + this.L_CatchAlpha.TabIndex = 54; + this.L_CatchAlpha.Text = "Task Description:"; + this.L_CatchAlpha.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_CatchAlpha + // + this.NUP_CatchAlpha.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_CatchAlpha.Location = new System.Drawing.Point(322, 29); + this.NUP_CatchAlpha.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_CatchAlpha.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_CatchAlpha.Name = "NUP_CatchAlpha"; + this.NUP_CatchAlpha.Size = new System.Drawing.Size(72, 20); + this.NUP_CatchAlpha.TabIndex = 55; + this.NUP_CatchAlpha.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_Catch + // + this.L_Catch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_Catch.Location = new System.Drawing.Point(3, 6); + this.L_Catch.Margin = new System.Windows.Forms.Padding(0); + this.L_Catch.Name = "L_Catch"; + this.L_Catch.Size = new System.Drawing.Size(316, 20); + this.L_Catch.TabIndex = 52; + this.L_Catch.Text = "Task Description:"; + this.L_Catch.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_Catch + // + this.NUP_Catch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_Catch.Location = new System.Drawing.Point(322, 6); + this.NUP_Catch.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_Catch.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_Catch.Name = "NUP_Catch"; + this.NUP_Catch.Size = new System.Drawing.Size(72, 20); + this.NUP_Catch.TabIndex = 53; + this.NUP_Catch.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // GB_Battle + // + this.GB_Battle.Controls.Add(this.L_AgileStyle); + this.GB_Battle.Controls.Add(this.NUP_AgileStyle); + this.GB_Battle.Controls.Add(this.L_StrongStyle); + this.GB_Battle.Controls.Add(this.NUP_StrongStyle); + this.GB_Battle.Controls.Add(this.L_Defeat); + this.GB_Battle.Controls.Add(this.NUP_Defeat); + this.GB_Battle.Controls.Add(this.L_DefeatWithMove2); + this.GB_Battle.Controls.Add(this.NUP_DefeatWithMove2); + this.GB_Battle.Controls.Add(this.L_DefeatWithMove1); + this.GB_Battle.Controls.Add(this.NUP_DefeatWithMove1); + this.GB_Battle.Controls.Add(this.L_DefeatWithMove0); + this.GB_Battle.Controls.Add(this.NUP_DefeatWithMove0); + this.GB_Battle.Controls.Add(this.L_UseMove3); + this.GB_Battle.Controls.Add(this.NUP_UseMove3); + this.GB_Battle.Controls.Add(this.L_UseMove2); + this.GB_Battle.Controls.Add(this.NUP_UseMove2); + this.GB_Battle.Controls.Add(this.L_UseMove1); + this.GB_Battle.Controls.Add(this.NUP_UseMove1); + this.GB_Battle.Controls.Add(this.L_UseMove0); + this.GB_Battle.Controls.Add(this.NUP_UseMove0); + this.GB_Battle.Location = new System.Drawing.Point(4, 22); + this.GB_Battle.Name = "GB_Battle"; + this.GB_Battle.Padding = new System.Windows.Forms.Padding(3); + this.GB_Battle.Size = new System.Drawing.Size(400, 242); + this.GB_Battle.TabIndex = 1; + this.GB_Battle.Text = "Battle"; + this.GB_Battle.UseVisualStyleBackColor = true; + // + // L_AgileStyle + // + this.L_AgileStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_AgileStyle.Location = new System.Drawing.Point(3, 213); + this.L_AgileStyle.Margin = new System.Windows.Forms.Padding(0); + this.L_AgileStyle.Name = "L_AgileStyle"; + this.L_AgileStyle.Size = new System.Drawing.Size(316, 20); + this.L_AgileStyle.TabIndex = 70; + this.L_AgileStyle.Text = "Task Description:"; + this.L_AgileStyle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_AgileStyle + // + this.NUP_AgileStyle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_AgileStyle.Location = new System.Drawing.Point(322, 213); + this.NUP_AgileStyle.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_AgileStyle.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_AgileStyle.Name = "NUP_AgileStyle"; + this.NUP_AgileStyle.Size = new System.Drawing.Size(72, 20); + this.NUP_AgileStyle.TabIndex = 71; + this.NUP_AgileStyle.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_StrongStyle + // + this.L_StrongStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_StrongStyle.Location = new System.Drawing.Point(3, 190); + this.L_StrongStyle.Margin = new System.Windows.Forms.Padding(0); + this.L_StrongStyle.Name = "L_StrongStyle"; + this.L_StrongStyle.Size = new System.Drawing.Size(316, 20); + this.L_StrongStyle.TabIndex = 68; + this.L_StrongStyle.Text = "Task Description:"; + this.L_StrongStyle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_StrongStyle + // + this.NUP_StrongStyle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_StrongStyle.Location = new System.Drawing.Point(322, 190); + this.NUP_StrongStyle.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_StrongStyle.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_StrongStyle.Name = "NUP_StrongStyle"; + this.NUP_StrongStyle.Size = new System.Drawing.Size(72, 20); + this.NUP_StrongStyle.TabIndex = 69; + this.NUP_StrongStyle.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_Defeat + // + this.L_Defeat.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_Defeat.Location = new System.Drawing.Point(3, 167); + this.L_Defeat.Margin = new System.Windows.Forms.Padding(0); + this.L_Defeat.Name = "L_Defeat"; + this.L_Defeat.Size = new System.Drawing.Size(316, 20); + this.L_Defeat.TabIndex = 66; + this.L_Defeat.Text = "Task Description:"; + this.L_Defeat.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_Defeat + // + this.NUP_Defeat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_Defeat.Location = new System.Drawing.Point(322, 167); + this.NUP_Defeat.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_Defeat.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_Defeat.Name = "NUP_Defeat"; + this.NUP_Defeat.Size = new System.Drawing.Size(72, 20); + this.NUP_Defeat.TabIndex = 67; + this.NUP_Defeat.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_DefeatWithMove2 + // + this.L_DefeatWithMove2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_DefeatWithMove2.Location = new System.Drawing.Point(3, 144); + this.L_DefeatWithMove2.Margin = new System.Windows.Forms.Padding(0); + this.L_DefeatWithMove2.Name = "L_DefeatWithMove2"; + this.L_DefeatWithMove2.Size = new System.Drawing.Size(316, 20); + this.L_DefeatWithMove2.TabIndex = 64; + this.L_DefeatWithMove2.Text = "Task Description:"; + this.L_DefeatWithMove2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_DefeatWithMove2 + // + this.NUP_DefeatWithMove2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_DefeatWithMove2.Location = new System.Drawing.Point(322, 144); + this.NUP_DefeatWithMove2.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_DefeatWithMove2.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_DefeatWithMove2.Name = "NUP_DefeatWithMove2"; + this.NUP_DefeatWithMove2.Size = new System.Drawing.Size(72, 20); + this.NUP_DefeatWithMove2.TabIndex = 65; + this.NUP_DefeatWithMove2.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_DefeatWithMove1 + // + this.L_DefeatWithMove1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_DefeatWithMove1.Location = new System.Drawing.Point(3, 121); + this.L_DefeatWithMove1.Margin = new System.Windows.Forms.Padding(0); + this.L_DefeatWithMove1.Name = "L_DefeatWithMove1"; + this.L_DefeatWithMove1.Size = new System.Drawing.Size(316, 20); + this.L_DefeatWithMove1.TabIndex = 62; + this.L_DefeatWithMove1.Text = "Task Description:"; + this.L_DefeatWithMove1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_DefeatWithMove1 + // + this.NUP_DefeatWithMove1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_DefeatWithMove1.Location = new System.Drawing.Point(322, 121); + this.NUP_DefeatWithMove1.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_DefeatWithMove1.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_DefeatWithMove1.Name = "NUP_DefeatWithMove1"; + this.NUP_DefeatWithMove1.Size = new System.Drawing.Size(72, 20); + this.NUP_DefeatWithMove1.TabIndex = 63; + this.NUP_DefeatWithMove1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_DefeatWithMove0 + // + this.L_DefeatWithMove0.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_DefeatWithMove0.Location = new System.Drawing.Point(3, 98); + this.L_DefeatWithMove0.Margin = new System.Windows.Forms.Padding(0); + this.L_DefeatWithMove0.Name = "L_DefeatWithMove0"; + this.L_DefeatWithMove0.Size = new System.Drawing.Size(316, 20); + this.L_DefeatWithMove0.TabIndex = 60; + this.L_DefeatWithMove0.Text = "Task Description:"; + this.L_DefeatWithMove0.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_DefeatWithMove0 + // + this.NUP_DefeatWithMove0.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_DefeatWithMove0.Location = new System.Drawing.Point(322, 98); + this.NUP_DefeatWithMove0.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_DefeatWithMove0.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_DefeatWithMove0.Name = "NUP_DefeatWithMove0"; + this.NUP_DefeatWithMove0.Size = new System.Drawing.Size(72, 20); + this.NUP_DefeatWithMove0.TabIndex = 61; + this.NUP_DefeatWithMove0.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_UseMove3 + // + this.L_UseMove3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_UseMove3.Location = new System.Drawing.Point(3, 75); + this.L_UseMove3.Margin = new System.Windows.Forms.Padding(0); + this.L_UseMove3.Name = "L_UseMove3"; + this.L_UseMove3.Size = new System.Drawing.Size(316, 20); + this.L_UseMove3.TabIndex = 58; + this.L_UseMove3.Text = "Task Description:"; + this.L_UseMove3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_UseMove3 + // + this.NUP_UseMove3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_UseMove3.Location = new System.Drawing.Point(322, 75); + this.NUP_UseMove3.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_UseMove3.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_UseMove3.Name = "NUP_UseMove3"; + this.NUP_UseMove3.Size = new System.Drawing.Size(72, 20); + this.NUP_UseMove3.TabIndex = 59; + this.NUP_UseMove3.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_UseMove2 + // + this.L_UseMove2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_UseMove2.Location = new System.Drawing.Point(3, 52); + this.L_UseMove2.Margin = new System.Windows.Forms.Padding(0); + this.L_UseMove2.Name = "L_UseMove2"; + this.L_UseMove2.Size = new System.Drawing.Size(316, 20); + this.L_UseMove2.TabIndex = 56; + this.L_UseMove2.Text = "Task Description:"; + this.L_UseMove2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_UseMove2 + // + this.NUP_UseMove2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_UseMove2.Location = new System.Drawing.Point(322, 52); + this.NUP_UseMove2.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_UseMove2.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_UseMove2.Name = "NUP_UseMove2"; + this.NUP_UseMove2.Size = new System.Drawing.Size(72, 20); + this.NUP_UseMove2.TabIndex = 57; + this.NUP_UseMove2.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_UseMove1 + // + this.L_UseMove1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_UseMove1.Location = new System.Drawing.Point(3, 29); + this.L_UseMove1.Margin = new System.Windows.Forms.Padding(0); + this.L_UseMove1.Name = "L_UseMove1"; + this.L_UseMove1.Size = new System.Drawing.Size(316, 20); + this.L_UseMove1.TabIndex = 54; + this.L_UseMove1.Text = "Task Description:"; + this.L_UseMove1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_UseMove1 + // + this.NUP_UseMove1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_UseMove1.Location = new System.Drawing.Point(322, 29); + this.NUP_UseMove1.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_UseMove1.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_UseMove1.Name = "NUP_UseMove1"; + this.NUP_UseMove1.Size = new System.Drawing.Size(72, 20); + this.NUP_UseMove1.TabIndex = 55; + this.NUP_UseMove1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_UseMove0 + // + this.L_UseMove0.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_UseMove0.Location = new System.Drawing.Point(3, 6); + this.L_UseMove0.Margin = new System.Windows.Forms.Padding(0); + this.L_UseMove0.Name = "L_UseMove0"; + this.L_UseMove0.Size = new System.Drawing.Size(316, 20); + this.L_UseMove0.TabIndex = 52; + this.L_UseMove0.Text = "Task Description:"; + this.L_UseMove0.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_UseMove0 + // + this.NUP_UseMove0.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_UseMove0.Location = new System.Drawing.Point(322, 6); + this.NUP_UseMove0.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_UseMove0.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_UseMove0.Name = "NUP_UseMove0"; + this.NUP_UseMove0.Size = new System.Drawing.Size(72, 20); + this.NUP_UseMove0.TabIndex = 53; + this.NUP_UseMove0.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // GB_Interact + // + this.GB_Interact.Controls.Add(this.L_Lure); + this.GB_Interact.Controls.Add(this.NUP_Lure); + this.GB_Interact.Controls.Add(this.L_Scare); + this.GB_Interact.Controls.Add(this.NUP_Scare); + this.GB_Interact.Controls.Add(this.L_Stun); + this.GB_Interact.Controls.Add(this.NUP_Stun); + this.GB_Interact.Controls.Add(this.L_GiveFood); + this.GB_Interact.Controls.Add(this.NUP_GiveFood); + this.GB_Interact.Controls.Add(this.L_Evolve); + this.GB_Interact.Controls.Add(this.NUP_Evolve); + this.GB_Interact.Location = new System.Drawing.Point(4, 22); + this.GB_Interact.Name = "GB_Interact"; + this.GB_Interact.Padding = new System.Windows.Forms.Padding(3); + this.GB_Interact.Size = new System.Drawing.Size(400, 242); + this.GB_Interact.TabIndex = 2; + this.GB_Interact.Text = "Interact"; + this.GB_Interact.UseVisualStyleBackColor = true; + // + // L_Lure + // + this.L_Lure.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_Lure.Location = new System.Drawing.Point(3, 98); + this.L_Lure.Margin = new System.Windows.Forms.Padding(0); + this.L_Lure.Name = "L_Lure"; + this.L_Lure.Size = new System.Drawing.Size(316, 20); + this.L_Lure.TabIndex = 60; + this.L_Lure.Text = "Task Description:"; + this.L_Lure.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_Lure + // + this.NUP_Lure.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_Lure.Location = new System.Drawing.Point(322, 98); + this.NUP_Lure.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_Lure.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_Lure.Name = "NUP_Lure"; + this.NUP_Lure.Size = new System.Drawing.Size(72, 20); + this.NUP_Lure.TabIndex = 61; + this.NUP_Lure.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_Scare + // + this.L_Scare.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_Scare.Location = new System.Drawing.Point(3, 75); + this.L_Scare.Margin = new System.Windows.Forms.Padding(0); + this.L_Scare.Name = "L_Scare"; + this.L_Scare.Size = new System.Drawing.Size(316, 20); + this.L_Scare.TabIndex = 58; + this.L_Scare.Text = "Task Description:"; + this.L_Scare.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_Scare + // + this.NUP_Scare.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_Scare.Location = new System.Drawing.Point(322, 75); + this.NUP_Scare.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_Scare.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_Scare.Name = "NUP_Scare"; + this.NUP_Scare.Size = new System.Drawing.Size(72, 20); + this.NUP_Scare.TabIndex = 59; + this.NUP_Scare.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_Stun + // + this.L_Stun.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_Stun.Location = new System.Drawing.Point(3, 52); + this.L_Stun.Margin = new System.Windows.Forms.Padding(0); + this.L_Stun.Name = "L_Stun"; + this.L_Stun.Size = new System.Drawing.Size(316, 20); + this.L_Stun.TabIndex = 56; + this.L_Stun.Text = "Task Description:"; + this.L_Stun.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_Stun + // + this.NUP_Stun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_Stun.Location = new System.Drawing.Point(322, 52); + this.NUP_Stun.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_Stun.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_Stun.Name = "NUP_Stun"; + this.NUP_Stun.Size = new System.Drawing.Size(72, 20); + this.NUP_Stun.TabIndex = 57; + this.NUP_Stun.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_GiveFood + // + this.L_GiveFood.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_GiveFood.Location = new System.Drawing.Point(3, 29); + this.L_GiveFood.Margin = new System.Windows.Forms.Padding(0); + this.L_GiveFood.Name = "L_GiveFood"; + this.L_GiveFood.Size = new System.Drawing.Size(316, 20); + this.L_GiveFood.TabIndex = 54; + this.L_GiveFood.Text = "Task Description:"; + this.L_GiveFood.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_GiveFood + // + this.NUP_GiveFood.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_GiveFood.Location = new System.Drawing.Point(322, 29); + this.NUP_GiveFood.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_GiveFood.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_GiveFood.Name = "NUP_GiveFood"; + this.NUP_GiveFood.Size = new System.Drawing.Size(72, 20); + this.NUP_GiveFood.TabIndex = 55; + this.NUP_GiveFood.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_Evolve + // + this.L_Evolve.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_Evolve.Location = new System.Drawing.Point(3, 6); + this.L_Evolve.Margin = new System.Windows.Forms.Padding(0); + this.L_Evolve.Name = "L_Evolve"; + this.L_Evolve.Size = new System.Drawing.Size(316, 20); + this.L_Evolve.TabIndex = 52; + this.L_Evolve.Text = "Task Description:"; + this.L_Evolve.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_Evolve + // + this.NUP_Evolve.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_Evolve.Location = new System.Drawing.Point(322, 6); + this.NUP_Evolve.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_Evolve.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_Evolve.Name = "NUP_Evolve"; + this.NUP_Evolve.Size = new System.Drawing.Size(72, 20); + this.NUP_Evolve.TabIndex = 53; + this.NUP_Evolve.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // GB_Observe + // + this.GB_Observe.Controls.Add(this.L_LeapTussocks); + this.GB_Observe.Controls.Add(this.NUP_LeapTussocks); + this.GB_Observe.Controls.Add(this.L_LeapOre); + this.GB_Observe.Controls.Add(this.NUP_LeapOre); + this.GB_Observe.Controls.Add(this.L_LeapSnow); + this.GB_Observe.Controls.Add(this.NUP_LeapSnow); + this.GB_Observe.Controls.Add(this.L_LeapLeaves); + this.GB_Observe.Controls.Add(this.NUP_LeapLeaves); + this.GB_Observe.Controls.Add(this.L_LeapTrees); + this.GB_Observe.Controls.Add(this.NUP_LeapTrees); + this.GB_Observe.Location = new System.Drawing.Point(4, 22); + this.GB_Observe.Name = "GB_Observe"; + this.GB_Observe.Padding = new System.Windows.Forms.Padding(3); + this.GB_Observe.Size = new System.Drawing.Size(400, 242); + this.GB_Observe.TabIndex = 3; + this.GB_Observe.Text = "Observe"; + this.GB_Observe.UseVisualStyleBackColor = true; + // + // L_LeapTussocks + // + this.L_LeapTussocks.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_LeapTussocks.Location = new System.Drawing.Point(3, 98); + this.L_LeapTussocks.Margin = new System.Windows.Forms.Padding(0); + this.L_LeapTussocks.Name = "L_LeapTussocks"; + this.L_LeapTussocks.Size = new System.Drawing.Size(316, 20); + this.L_LeapTussocks.TabIndex = 60; + this.L_LeapTussocks.Text = "Task Description:"; + this.L_LeapTussocks.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_LeapTussocks + // + this.NUP_LeapTussocks.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_LeapTussocks.Location = new System.Drawing.Point(322, 98); + this.NUP_LeapTussocks.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_LeapTussocks.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_LeapTussocks.Name = "NUP_LeapTussocks"; + this.NUP_LeapTussocks.Size = new System.Drawing.Size(72, 20); + this.NUP_LeapTussocks.TabIndex = 61; + this.NUP_LeapTussocks.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_LeapOre + // + this.L_LeapOre.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_LeapOre.Location = new System.Drawing.Point(3, 75); + this.L_LeapOre.Margin = new System.Windows.Forms.Padding(0); + this.L_LeapOre.Name = "L_LeapOre"; + this.L_LeapOre.Size = new System.Drawing.Size(316, 20); + this.L_LeapOre.TabIndex = 58; + this.L_LeapOre.Text = "Task Description:"; + this.L_LeapOre.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_LeapOre + // + this.NUP_LeapOre.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_LeapOre.Location = new System.Drawing.Point(322, 75); + this.NUP_LeapOre.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_LeapOre.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_LeapOre.Name = "NUP_LeapOre"; + this.NUP_LeapOre.Size = new System.Drawing.Size(72, 20); + this.NUP_LeapOre.TabIndex = 59; + this.NUP_LeapOre.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_LeapSnow + // + this.L_LeapSnow.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_LeapSnow.Location = new System.Drawing.Point(3, 52); + this.L_LeapSnow.Margin = new System.Windows.Forms.Padding(0); + this.L_LeapSnow.Name = "L_LeapSnow"; + this.L_LeapSnow.Size = new System.Drawing.Size(316, 20); + this.L_LeapSnow.TabIndex = 56; + this.L_LeapSnow.Text = "Task Description:"; + this.L_LeapSnow.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_LeapSnow + // + this.NUP_LeapSnow.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_LeapSnow.Location = new System.Drawing.Point(322, 52); + this.NUP_LeapSnow.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_LeapSnow.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_LeapSnow.Name = "NUP_LeapSnow"; + this.NUP_LeapSnow.Size = new System.Drawing.Size(72, 20); + this.NUP_LeapSnow.TabIndex = 57; + this.NUP_LeapSnow.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_LeapLeaves + // + this.L_LeapLeaves.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_LeapLeaves.Location = new System.Drawing.Point(3, 29); + this.L_LeapLeaves.Margin = new System.Windows.Forms.Padding(0); + this.L_LeapLeaves.Name = "L_LeapLeaves"; + this.L_LeapLeaves.Size = new System.Drawing.Size(316, 20); + this.L_LeapLeaves.TabIndex = 54; + this.L_LeapLeaves.Text = "Task Description:"; + this.L_LeapLeaves.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_LeapLeaves + // + this.NUP_LeapLeaves.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_LeapLeaves.Location = new System.Drawing.Point(322, 29); + this.NUP_LeapLeaves.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_LeapLeaves.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_LeapLeaves.Name = "NUP_LeapLeaves"; + this.NUP_LeapLeaves.Size = new System.Drawing.Size(72, 20); + this.NUP_LeapLeaves.TabIndex = 55; + this.NUP_LeapLeaves.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_LeapTrees + // + this.L_LeapTrees.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.L_LeapTrees.Location = new System.Drawing.Point(3, 6); + this.L_LeapTrees.Margin = new System.Windows.Forms.Padding(0); + this.L_LeapTrees.Name = "L_LeapTrees"; + this.L_LeapTrees.Size = new System.Drawing.Size(316, 20); + this.L_LeapTrees.TabIndex = 52; + this.L_LeapTrees.Text = "Task Description:"; + this.L_LeapTrees.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // NUP_LeapTrees + // + this.NUP_LeapTrees.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.NUP_LeapTrees.Location = new System.Drawing.Point(322, 6); + this.NUP_LeapTrees.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.NUP_LeapTrees.Maximum = new decimal(new int[] { + 60000, + 0, + 0, + 0}); + this.NUP_LeapTrees.Name = "NUP_LeapTrees"; + this.NUP_LeapTrees.Size = new System.Drawing.Size(72, 20); + this.NUP_LeapTrees.TabIndex = 53; + this.NUP_LeapTrees.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // L_Species + // + this.L_Species.Location = new System.Drawing.Point(421, 28); + this.L_Species.Margin = new System.Windows.Forms.Padding(0); + this.L_Species.Name = "L_Species"; + this.L_Species.Size = new System.Drawing.Size(87, 21); + this.L_Species.TabIndex = 150; + this.L_Species.Text = "{Species}"; + this.L_Species.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // B_Save + // + this.B_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Save.Location = new System.Drawing.Point(418, 222); + this.B_Save.Name = "B_Save"; + this.B_Save.Size = new System.Drawing.Size(90, 23); + this.B_Save.TabIndex = 152; + this.B_Save.Text = "Save"; + this.B_Save.UseVisualStyleBackColor = true; + this.B_Save.Click += new System.EventHandler(this.B_Save_Click); + // + // SAV_PokedexResearchEditorLA + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(514, 286); + this.Controls.Add(this.B_Save); + this.Controls.Add(this.L_Species); + this.Controls.Add(this.TC_Research); + this.Controls.Add(this.B_Cancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = global::PKHeX.WinForms.Properties.Resources.Icon; + this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(530, 325); + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(530, 325); + this.Name = "SAV_PokedexResearchEditorLA"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Pokédex Research Editor"; + this.TC_Research.ResumeLayout(false); + this.GB_Catch.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchNotSpotted)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchInAir)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchSleeping)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchAtTime)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchLight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchHeavy)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchSmall)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchLarge)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_CatchAlpha)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Catch)).EndInit(); + this.GB_Battle.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.NUP_AgileStyle)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_StrongStyle)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Defeat)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_DefeatWithMove2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_DefeatWithMove1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_DefeatWithMove0)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_UseMove0)).EndInit(); + this.GB_Interact.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Lure)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Scare)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Stun)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_GiveFood)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_Evolve)).EndInit(); + this.GB_Observe.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapTussocks)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapOre)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapSnow)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapLeaves)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUP_LeapTrees)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.TabControl TC_Research; + private System.Windows.Forms.TabPage GB_Catch; + private System.Windows.Forms.Label L_Species; + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.Label L_CatchNotSpotted; + private System.Windows.Forms.NumericUpDown NUP_CatchNotSpotted; + private System.Windows.Forms.Label L_CatchInAir; + private System.Windows.Forms.NumericUpDown NUP_CatchInAir; + private System.Windows.Forms.Label L_CatchSleeping; + private System.Windows.Forms.NumericUpDown NUP_CatchSleeping; + private System.Windows.Forms.Label L_CatchAtTime; + private System.Windows.Forms.NumericUpDown NUP_CatchAtTime; + private System.Windows.Forms.Label L_CatchLight; + private System.Windows.Forms.NumericUpDown NUP_CatchLight; + private System.Windows.Forms.Label L_CatchHeavy; + private System.Windows.Forms.NumericUpDown NUP_CatchHeavy; + private System.Windows.Forms.Label L_CatchSmall; + private System.Windows.Forms.NumericUpDown NUP_CatchSmall; + private System.Windows.Forms.Label L_CatchLarge; + private System.Windows.Forms.NumericUpDown NUP_CatchLarge; + private System.Windows.Forms.Label L_CatchAlpha; + private System.Windows.Forms.NumericUpDown NUP_CatchAlpha; + private System.Windows.Forms.NumericUpDown NUP_Catch; + private System.Windows.Forms.Label L_Catch; + private System.Windows.Forms.TabPage GB_Battle; + private System.Windows.Forms.Label L_AgileStyle; + private System.Windows.Forms.NumericUpDown NUP_AgileStyle; + private System.Windows.Forms.Label L_StrongStyle; + private System.Windows.Forms.NumericUpDown NUP_StrongStyle; + private System.Windows.Forms.Label L_Defeat; + private System.Windows.Forms.NumericUpDown NUP_Defeat; + private System.Windows.Forms.Label L_DefeatWithMove2; + private System.Windows.Forms.NumericUpDown NUP_DefeatWithMove2; + private System.Windows.Forms.Label L_DefeatWithMove1; + private System.Windows.Forms.NumericUpDown NUP_DefeatWithMove1; + private System.Windows.Forms.Label L_DefeatWithMove0; + private System.Windows.Forms.NumericUpDown NUP_DefeatWithMove0; + private System.Windows.Forms.Label L_UseMove3; + private System.Windows.Forms.NumericUpDown NUP_UseMove3; + private System.Windows.Forms.Label L_UseMove2; + private System.Windows.Forms.NumericUpDown NUP_UseMove2; + private System.Windows.Forms.Label L_UseMove1; + private System.Windows.Forms.NumericUpDown NUP_UseMove1; + private System.Windows.Forms.Label L_UseMove0; + private System.Windows.Forms.NumericUpDown NUP_UseMove0; + private System.Windows.Forms.TabPage GB_Interact; + private System.Windows.Forms.Label L_Lure; + private System.Windows.Forms.NumericUpDown NUP_Lure; + private System.Windows.Forms.Label L_Scare; + private System.Windows.Forms.NumericUpDown NUP_Scare; + private System.Windows.Forms.Label L_Stun; + private System.Windows.Forms.NumericUpDown NUP_Stun; + private System.Windows.Forms.Label L_GiveFood; + private System.Windows.Forms.NumericUpDown NUP_GiveFood; + private System.Windows.Forms.Label L_Evolve; + private System.Windows.Forms.NumericUpDown NUP_Evolve; + private System.Windows.Forms.TabPage GB_Observe; + private System.Windows.Forms.Label L_LeapTussocks; + private System.Windows.Forms.NumericUpDown NUP_LeapTussocks; + private System.Windows.Forms.Label L_LeapOre; + private System.Windows.Forms.NumericUpDown NUP_LeapOre; + private System.Windows.Forms.Label L_LeapSnow; + private System.Windows.Forms.NumericUpDown NUP_LeapSnow; + private System.Windows.Forms.Label L_LeapLeaves; + private System.Windows.Forms.NumericUpDown NUP_LeapLeaves; + private System.Windows.Forms.Label L_LeapTrees; + private System.Windows.Forms.NumericUpDown NUP_LeapTrees; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.cs new file mode 100644 index 00000000000..5c5db87099c --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.cs @@ -0,0 +1,278 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using PKHeX.Core; +using static PKHeX.Core.PokedexResearchTaskType8a; + +namespace PKHeX.WinForms +{ + public partial class SAV_PokedexResearchEditorLA : Form + { + private readonly SAV8LA Origin; + private readonly SAV8LA SAV; + private readonly PokedexSave8a Dex; + + private readonly int Species; + + private readonly bool WasEmpty; + + private readonly NumericUpDown[] TaskNUPs; + private readonly PokedexResearchTaskType8a[] TaskTypes; + private readonly int[] TaskIndexes; + private readonly int[] TaskParameters; + + public SAV_PokedexResearchEditorLA(SAV8LA sav, int species, int dexIdx, IReadOnlyList tasks, IReadOnlyList timeTasks) + { + InitializeComponent(); + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + SAV = (SAV8LA)(Origin = sav).Clone(); + Dex = SAV.Blocks.PokedexSave; + + Species = species; + + L_Species.Text = GameInfo.Strings.Species[species]; + + #region Declare Arrays + Label[] taskLabels = + { + L_Catch, + L_CatchAlpha, + L_CatchLarge, + L_CatchSmall, + L_CatchHeavy, + L_CatchLight, + L_CatchAtTime, + L_CatchSleeping, + L_CatchInAir, + L_CatchNotSpotted, + + L_UseMove0, + L_UseMove1, + L_UseMove2, + L_UseMove3, + L_DefeatWithMove0, + L_DefeatWithMove1, + L_DefeatWithMove2, + L_Defeat, + L_StrongStyle, + L_AgileStyle, + + L_Evolve, + L_GiveFood, + L_Stun, + L_Scare, + L_Lure, + + L_LeapTrees, + L_LeapLeaves, + L_LeapSnow, + L_LeapOre, + L_LeapTussocks, + }; + + TaskNUPs = new[] + { + NUP_Catch, + NUP_CatchAlpha, + NUP_CatchLarge, + NUP_CatchSmall, + NUP_CatchHeavy, + NUP_CatchLight, + NUP_CatchAtTime, + NUP_CatchSleeping, + NUP_CatchInAir, + NUP_CatchNotSpotted, + + NUP_UseMove0, + NUP_UseMove1, + NUP_UseMove2, + NUP_UseMove3, + NUP_DefeatWithMove0, + NUP_DefeatWithMove1, + NUP_DefeatWithMove2, + NUP_Defeat, + NUP_StrongStyle, + NUP_AgileStyle, + + NUP_Evolve, + NUP_GiveFood, + NUP_Stun, + NUP_Scare, + NUP_Lure, + + NUP_LeapTrees, + NUP_LeapLeaves, + NUP_LeapSnow, + NUP_LeapOre, + NUP_LeapTussocks, + }; + + TaskTypes = new[] + { + Catch, + CatchAlpha, + CatchLarge, + CatchSmall, + CatchHeavy, + CatchLight, + CatchAtTime, + CatchSleeping, + CatchInAir, + CatchNotSpotted, + + UseMove, + UseMove, + UseMove, + UseMove, + DefeatWithMoveType, + DefeatWithMoveType, + DefeatWithMoveType, + Defeat, + UseStrongStyleMove, + UseAgileStyleMove, + + Evolve, + GiveFood, + StunWithItems, + ScareWithScatterBang, + LureWithPokeshiDoll, + + LeapFromTrees, + LeapFromLeaves, + LeapFromSnow, + LeapFromOre, + LeapFromTussocks, + }; + + TaskIndexes = new[] + { + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + + 0, + 1, + 2, + 3, + 0, + 1, + 2, + -1, + -1, + -1, + + -1, + -1, + -1, + -1, + -1, + + -1, + -1, + -1, + -1, + -1, + }; + + TaskParameters = new int[TaskIndexes.Length]; + InitializeTaskParameters(dexIdx); + #endregion + + // Initialize labels/values + for (int i = 0; i < taskLabels.Length; i++) + { + taskLabels[i].Text = PokedexResearchTask8aExtensions.GetGenericTaskLabelString(TaskTypes[i], TaskIndexes[i], TaskParameters[i], tasks, timeTasks); + + Dex.GetResearchTaskProgressByForce(Species, TaskTypes[i], TaskIndexes[i], out var curValue); + TaskNUPs[i].Value = curValue; + } + + // Detect empty + WasEmpty = IsEmpty(); + } + + private void InitializeTaskParameters(int idx) + { + if (idx < 0) + { + for (int i = 0; i < TaskParameters.Length; i++) + TaskParameters[i] = TaskTypes[i] == CatchAtTime ? 0 : -1; + return; + } + + var tasks = PokedexConstants8a.ResearchTasks[idx]; + for (int i = 0; i < TaskParameters.Length; i++) + { + TaskParameters[i] = -1; + + switch (TaskTypes[i]) + { + case UseMove: + foreach (var task in tasks) + { + if (task.Task != UseMove || task.Index != TaskIndexes[i]) + continue; + TaskParameters[i] = task.Move; + break; + } + break; + case DefeatWithMoveType: + foreach (var task in tasks) + { + if (task.Task != DefeatWithMoveType || task.Index != TaskIndexes[i]) + continue; + TaskParameters[i] = (int)task.Type; + break; + } + break; + case CatchAtTime: + TaskParameters[i] = 0; + foreach (var task in tasks) + { + if (task.Task != CatchAtTime) + continue; + TaskParameters[i] = (int)task.TimeOfDay; + break; + } + break; + } + } + } + + private bool IsEmpty() + { + foreach (var nup in TaskNUPs) + { + if (nup.Value != 0) + return false; + } + + return true; + } + + private void B_Cancel_Click(object sender, EventArgs e) + { + Close(); + } + + private void B_Save_Click(object sender, EventArgs e) + { + // If we should, set values. + if (!WasEmpty || !IsEmpty()) + { + for (int i = 0; i < TaskNUPs.Length; i++) + Dex.SetResearchTaskProgressByForce(Species, TaskTypes[i], (int)TaskNUPs[i].Value, TaskIndexes[i]); + } + + Origin.CopyChangesFrom(SAV); + Close(); + } + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexSWSH.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexSWSH.Designer.cs index 0b149fd828b..3dd19a7fc0b 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexSWSH.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexSWSH.Designer.cs @@ -59,7 +59,7 @@ private void InitializeComponent() this.mnuFormAll = new System.Windows.Forms.ToolStripMenuItem(); this.NUD_Battled = new System.Windows.Forms.NumericUpDown(); this.L_Battled = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); + this.L_DisplayedForm = new System.Windows.Forms.Label(); this.GB_Displayed = new System.Windows.Forms.GroupBox(); this.CB_Gender = new System.Windows.Forms.ComboBox(); this.CHK_S = new System.Windows.Forms.CheckBox(); @@ -68,9 +68,9 @@ private void InitializeComponent() this.NUD_Form = new System.Windows.Forms.NumericUpDown(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.L_Male = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); + this.L_Female = new System.Windows.Forms.Label(); + this.L_MaleShiny = new System.Windows.Forms.Label(); + this.L_FemaleShiny = new System.Windows.Forms.Label(); this.CLB_3 = new System.Windows.Forms.CheckedListBox(); this.CLB_4 = new System.Windows.Forms.CheckedListBox(); this.CLB_1 = new System.Windows.Forms.CheckedListBox(); @@ -87,10 +87,9 @@ private void InitializeComponent() // B_Cancel // this.B_Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.B_Cancel.Location = new System.Drawing.Point(856, 518); - this.B_Cancel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.B_Cancel.Location = new System.Drawing.Point(642, 421); this.B_Cancel.Name = "B_Cancel"; - this.B_Cancel.Size = new System.Drawing.Size(107, 28); + this.B_Cancel.Size = new System.Drawing.Size(80, 23); this.B_Cancel.TabIndex = 0; this.B_Cancel.Text = "Cancel"; this.B_Cancel.UseVisualStyleBackColor = true; @@ -101,21 +100,18 @@ private void InitializeComponent() this.LB_Species.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.LB_Species.FormattingEnabled = true; - this.LB_Species.ItemHeight = 16; - this.LB_Species.Location = new System.Drawing.Point(16, 49); - this.LB_Species.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.LB_Species.Location = new System.Drawing.Point(12, 40); this.LB_Species.Name = "LB_Species"; - this.LB_Species.Size = new System.Drawing.Size(212, 484); + this.LB_Species.Size = new System.Drawing.Size(160, 394); this.LB_Species.TabIndex = 2; this.LB_Species.SelectedIndexChanged += new System.EventHandler(this.ChangeLBSpecies); // // CHK_Caught // this.CHK_Caught.AutoSize = true; - this.CHK_Caught.Location = new System.Drawing.Point(379, 18); - this.CHK_Caught.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_Caught.Location = new System.Drawing.Point(284, 15); this.CHK_Caught.Name = "CHK_Caught"; - this.CHK_Caught.Size = new System.Drawing.Size(74, 21); + this.CHK_Caught.Size = new System.Drawing.Size(60, 17); this.CHK_Caught.TabIndex = 3; this.CHK_Caught.Text = "Owned"; this.CHK_Caught.UseVisualStyleBackColor = true; @@ -123,10 +119,9 @@ private void InitializeComponent() // CHK_L7 // this.CHK_L7.AutoSize = true; - this.CHK_L7.Location = new System.Drawing.Point(24, 144); - this.CHK_L7.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L7.Location = new System.Drawing.Point(18, 117); this.CHK_L7.Name = "CHK_L7"; - this.CHK_L7.Size = new System.Drawing.Size(76, 21); + this.CHK_L7.Size = new System.Drawing.Size(60, 17); this.CHK_L7.TabIndex = 19; this.CHK_L7.Text = "Korean"; this.CHK_L7.UseVisualStyleBackColor = true; @@ -134,10 +129,9 @@ private void InitializeComponent() // CHK_L6 // this.CHK_L6.AutoSize = true; - this.CHK_L6.Location = new System.Drawing.Point(24, 124); - this.CHK_L6.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L6.Location = new System.Drawing.Point(18, 101); this.CHK_L6.Name = "CHK_L6"; - this.CHK_L6.Size = new System.Drawing.Size(81, 21); + this.CHK_L6.Size = new System.Drawing.Size(64, 17); this.CHK_L6.TabIndex = 18; this.CHK_L6.Text = "Spanish"; this.CHK_L6.UseVisualStyleBackColor = true; @@ -145,10 +139,9 @@ private void InitializeComponent() // CHK_L5 // this.CHK_L5.AutoSize = true; - this.CHK_L5.Location = new System.Drawing.Point(24, 102); - this.CHK_L5.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L5.Location = new System.Drawing.Point(18, 83); this.CHK_L5.Name = "CHK_L5"; - this.CHK_L5.Size = new System.Drawing.Size(81, 21); + this.CHK_L5.Size = new System.Drawing.Size(63, 17); this.CHK_L5.TabIndex = 17; this.CHK_L5.Text = "German"; this.CHK_L5.UseVisualStyleBackColor = true; @@ -156,10 +149,9 @@ private void InitializeComponent() // CHK_L4 // this.CHK_L4.AutoSize = true; - this.CHK_L4.Location = new System.Drawing.Point(24, 81); - this.CHK_L4.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L4.Location = new System.Drawing.Point(18, 66); this.CHK_L4.Name = "CHK_L4"; - this.CHK_L4.Size = new System.Drawing.Size(67, 21); + this.CHK_L4.Size = new System.Drawing.Size(54, 17); this.CHK_L4.TabIndex = 16; this.CHK_L4.Text = "Italian"; this.CHK_L4.UseVisualStyleBackColor = true; @@ -167,10 +159,9 @@ private void InitializeComponent() // CHK_L3 // this.CHK_L3.AutoSize = true; - this.CHK_L3.Location = new System.Drawing.Point(24, 60); - this.CHK_L3.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L3.Location = new System.Drawing.Point(18, 49); this.CHK_L3.Name = "CHK_L3"; - this.CHK_L3.Size = new System.Drawing.Size(74, 21); + this.CHK_L3.Size = new System.Drawing.Size(59, 17); this.CHK_L3.TabIndex = 15; this.CHK_L3.Text = "French"; this.CHK_L3.UseVisualStyleBackColor = true; @@ -178,10 +169,9 @@ private void InitializeComponent() // CHK_L2 // this.CHK_L2.AutoSize = true; - this.CHK_L2.Location = new System.Drawing.Point(24, 41); - this.CHK_L2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L2.Location = new System.Drawing.Point(18, 33); this.CHK_L2.Name = "CHK_L2"; - this.CHK_L2.Size = new System.Drawing.Size(76, 21); + this.CHK_L2.Size = new System.Drawing.Size(60, 17); this.CHK_L2.TabIndex = 14; this.CHK_L2.Text = "English"; this.CHK_L2.UseVisualStyleBackColor = true; @@ -189,10 +179,9 @@ private void InitializeComponent() // CHK_L1 // this.CHK_L1.AutoSize = true; - this.CHK_L1.Location = new System.Drawing.Point(24, 18); - this.CHK_L1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L1.Location = new System.Drawing.Point(18, 15); this.CHK_L1.Name = "CHK_L1"; - this.CHK_L1.Size = new System.Drawing.Size(92, 21); + this.CHK_L1.Size = new System.Drawing.Size(72, 17); this.CHK_L1.TabIndex = 13; this.CHK_L1.Text = "Japanese"; this.CHK_L1.UseVisualStyleBackColor = true; @@ -200,10 +189,9 @@ private void InitializeComponent() // L_goto // this.L_goto.AutoSize = true; - this.L_goto.Location = new System.Drawing.Point(16, 20); - this.L_goto.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.L_goto.Location = new System.Drawing.Point(12, 16); this.L_goto.Name = "L_goto"; - this.L_goto.Size = new System.Drawing.Size(40, 17); + this.L_goto.Size = new System.Drawing.Size(31, 13); this.L_goto.TabIndex = 20; this.L_goto.Text = "goto:"; // @@ -215,20 +203,18 @@ private void InitializeComponent() this.CB_Species.FormattingEnabled = true; this.CB_Species.Items.AddRange(new object[] { "0"}); - this.CB_Species.Location = new System.Drawing.Point(67, 16); - this.CB_Species.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CB_Species.Location = new System.Drawing.Point(50, 13); this.CB_Species.Name = "CB_Species"; - this.CB_Species.Size = new System.Drawing.Size(161, 24); + this.CB_Species.Size = new System.Drawing.Size(122, 21); this.CB_Species.TabIndex = 21; this.CB_Species.SelectedIndexChanged += new System.EventHandler(this.ChangeCBSpecies); this.CB_Species.SelectedValueChanged += new System.EventHandler(this.ChangeCBSpecies); // // B_GiveAll // - this.B_GiveAll.Location = new System.Drawing.Point(237, 14); - this.B_GiveAll.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.B_GiveAll.Location = new System.Drawing.Point(178, 11); this.B_GiveAll.Name = "B_GiveAll"; - this.B_GiveAll.Size = new System.Drawing.Size(80, 28); + this.B_GiveAll.Size = new System.Drawing.Size(60, 23); this.B_GiveAll.TabIndex = 23; this.B_GiveAll.Text = "Check All"; this.B_GiveAll.UseVisualStyleBackColor = true; @@ -237,10 +223,9 @@ private void InitializeComponent() // B_Save // this.B_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.B_Save.Location = new System.Drawing.Point(856, 482); - this.B_Save.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.B_Save.Location = new System.Drawing.Point(642, 392); this.B_Save.Name = "B_Save"; - this.B_Save.Size = new System.Drawing.Size(107, 28); + this.B_Save.Size = new System.Drawing.Size(80, 23); this.B_Save.TabIndex = 24; this.B_Save.Text = "Save"; this.B_Save.UseVisualStyleBackColor = true; @@ -249,10 +234,9 @@ private void InitializeComponent() // B_Modify // this.B_Modify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.B_Modify.Location = new System.Drawing.Point(800, 11); - this.B_Modify.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.B_Modify.Location = new System.Drawing.Point(600, 9); this.B_Modify.Name = "B_Modify"; - this.B_Modify.Size = new System.Drawing.Size(80, 28); + this.B_Modify.Size = new System.Drawing.Size(60, 23); this.B_Modify.TabIndex = 25; this.B_Modify.Text = "Modify..."; this.B_Modify.UseVisualStyleBackColor = true; @@ -270,11 +254,9 @@ private void InitializeComponent() this.GB_Language.Controls.Add(this.CHK_L3); this.GB_Language.Controls.Add(this.CHK_L2); this.GB_Language.Controls.Add(this.CHK_L1); - this.GB_Language.Location = new System.Drawing.Point(800, 49); - this.GB_Language.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.GB_Language.Location = new System.Drawing.Point(600, 40); this.GB_Language.Name = "GB_Language"; - this.GB_Language.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); - this.GB_Language.Size = new System.Drawing.Size(163, 212); + this.GB_Language.Size = new System.Drawing.Size(122, 172); this.GB_Language.TabIndex = 26; this.GB_Language.TabStop = false; this.GB_Language.Text = "Languages"; @@ -282,10 +264,9 @@ private void InitializeComponent() // CHK_L9 // this.CHK_L9.AutoSize = true; - this.CHK_L9.Location = new System.Drawing.Point(24, 187); - this.CHK_L9.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L9.Location = new System.Drawing.Point(18, 152); this.CHK_L9.Name = "CHK_L9"; - this.CHK_L9.Size = new System.Drawing.Size(89, 21); + this.CHK_L9.Size = new System.Drawing.Size(70, 17); this.CHK_L9.TabIndex = 21; this.CHK_L9.Text = "Chinese2"; this.CHK_L9.UseVisualStyleBackColor = true; @@ -293,10 +274,9 @@ private void InitializeComponent() // CHK_L8 // this.CHK_L8.AutoSize = true; - this.CHK_L8.Location = new System.Drawing.Point(24, 165); - this.CHK_L8.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_L8.Location = new System.Drawing.Point(18, 134); this.CHK_L8.Name = "CHK_L8"; - this.CHK_L8.Size = new System.Drawing.Size(81, 21); + this.CHK_L8.Size = new System.Drawing.Size(64, 17); this.CHK_L8.TabIndex = 20; this.CHK_L8.Text = "Chinese"; this.CHK_L8.UseVisualStyleBackColor = true; @@ -312,47 +292,47 @@ private void InitializeComponent() this.mnuComplete, this.mnuBattleCount}); this.modifyMenu.Name = "modifyMenu"; - this.modifyMenu.Size = new System.Drawing.Size(237, 148); + this.modifyMenu.Size = new System.Drawing.Size(202, 136); // // mnuSeenNone // this.mnuSeenNone.Name = "mnuSeenNone"; - this.mnuSeenNone.Size = new System.Drawing.Size(236, 24); + this.mnuSeenNone.Size = new System.Drawing.Size(201, 22); this.mnuSeenNone.Text = "Seen none"; this.mnuSeenNone.Click += new System.EventHandler(this.SeenNone); // // mnuSeenAll // this.mnuSeenAll.Name = "mnuSeenAll"; - this.mnuSeenAll.Size = new System.Drawing.Size(236, 24); + this.mnuSeenAll.Size = new System.Drawing.Size(201, 22); this.mnuSeenAll.Text = "Seen all"; this.mnuSeenAll.Click += new System.EventHandler(this.SeenAll); // // mnuCaughtNone // this.mnuCaughtNone.Name = "mnuCaughtNone"; - this.mnuCaughtNone.Size = new System.Drawing.Size(236, 24); + this.mnuCaughtNone.Size = new System.Drawing.Size(201, 22); this.mnuCaughtNone.Text = "Caught none"; this.mnuCaughtNone.Click += new System.EventHandler(this.CaughtNone); // // mnuCaughtAll // this.mnuCaughtAll.Name = "mnuCaughtAll"; - this.mnuCaughtAll.Size = new System.Drawing.Size(236, 24); + this.mnuCaughtAll.Size = new System.Drawing.Size(201, 22); this.mnuCaughtAll.Text = "Caught all"; this.mnuCaughtAll.Click += new System.EventHandler(this.CaughtAll); // // mnuComplete // this.mnuComplete.Name = "mnuComplete"; - this.mnuComplete.Size = new System.Drawing.Size(236, 24); + this.mnuComplete.Size = new System.Drawing.Size(201, 22); this.mnuComplete.Text = "Complete Dex"; this.mnuComplete.Click += new System.EventHandler(this.CompleteDex); // // mnuBattleCount // this.mnuBattleCount.Name = "mnuBattleCount"; - this.mnuBattleCount.Size = new System.Drawing.Size(236, 24); + this.mnuBattleCount.Size = new System.Drawing.Size(201, 22); this.mnuBattleCount.Text = "Change All Battle Count"; this.mnuBattleCount.Click += new System.EventHandler(this.ChangeAllCounts); // @@ -374,38 +354,35 @@ private void InitializeComponent() // NUD_Battled // this.NUD_Battled.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.NUD_Battled.Location = new System.Drawing.Point(804, 441); - this.NUD_Battled.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.NUD_Battled.Location = new System.Drawing.Point(603, 358); this.NUD_Battled.Maximum = new decimal(new int[] { 2147483647, 0, 0, 0}); this.NUD_Battled.Name = "NUD_Battled"; - this.NUD_Battled.Size = new System.Drawing.Size(151, 22); + this.NUD_Battled.Size = new System.Drawing.Size(113, 20); this.NUD_Battled.TabIndex = 28; // // L_Battled // this.L_Battled.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.L_Battled.AutoSize = true; - this.L_Battled.Location = new System.Drawing.Point(800, 421); - this.L_Battled.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.L_Battled.Location = new System.Drawing.Point(600, 342); this.L_Battled.Name = "L_Battled"; - this.L_Battled.Size = new System.Drawing.Size(56, 17); + this.L_Battled.Size = new System.Drawing.Size(43, 13); this.L_Battled.TabIndex = 29; this.L_Battled.Text = "Battled:"; // - // label1 + // L_DisplayedForm // - this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(800, 270); - this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(110, 17); - this.label1.TabIndex = 32; - this.label1.Text = "Displayed Form:"; + this.L_DisplayedForm.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.L_DisplayedForm.AutoSize = true; + this.L_DisplayedForm.Location = new System.Drawing.Point(600, 219); + this.L_DisplayedForm.Name = "L_DisplayedForm"; + this.L_DisplayedForm.Size = new System.Drawing.Size(82, 13); + this.L_DisplayedForm.TabIndex = 32; + this.L_DisplayedForm.Text = "Displayed Form:"; // // GB_Displayed // @@ -413,11 +390,9 @@ private void InitializeComponent() this.GB_Displayed.Controls.Add(this.CB_Gender); this.GB_Displayed.Controls.Add(this.CHK_S); this.GB_Displayed.Controls.Add(this.CHK_G); - this.GB_Displayed.Location = new System.Drawing.Point(800, 322); - this.GB_Displayed.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.GB_Displayed.Location = new System.Drawing.Point(600, 262); this.GB_Displayed.Name = "GB_Displayed"; - this.GB_Displayed.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); - this.GB_Displayed.Size = new System.Drawing.Size(163, 94); + this.GB_Displayed.Size = new System.Drawing.Size(122, 76); this.GB_Displayed.TabIndex = 33; this.GB_Displayed.TabStop = false; this.GB_Displayed.Text = "Displayed"; @@ -430,19 +405,17 @@ private void InitializeComponent() "♂", "♀", "-"}); - this.CB_Gender.Location = new System.Drawing.Point(8, 60); - this.CB_Gender.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CB_Gender.Location = new System.Drawing.Point(6, 49); this.CB_Gender.Name = "CB_Gender"; - this.CB_Gender.Size = new System.Drawing.Size(52, 24); + this.CB_Gender.Size = new System.Drawing.Size(40, 21); this.CB_Gender.TabIndex = 23; // // CHK_S // this.CHK_S.AutoSize = true; - this.CHK_S.Location = new System.Drawing.Point(7, 33); - this.CHK_S.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_S.Location = new System.Drawing.Point(5, 27); this.CHK_S.Name = "CHK_S"; - this.CHK_S.Size = new System.Drawing.Size(65, 21); + this.CHK_S.Size = new System.Drawing.Size(52, 17); this.CHK_S.TabIndex = 9; this.CHK_S.Text = "Shiny"; this.CHK_S.UseVisualStyleBackColor = true; @@ -450,10 +423,9 @@ private void InitializeComponent() // CHK_G // this.CHK_G.AutoSize = true; - this.CHK_G.Location = new System.Drawing.Point(7, 16); - this.CHK_G.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_G.Location = new System.Drawing.Point(5, 13); this.CHK_G.Name = "CHK_G"; - this.CHK_G.Size = new System.Drawing.Size(105, 21); + this.CHK_G.Size = new System.Drawing.Size(82, 17); this.CHK_G.TabIndex = 8; this.CHK_G.Text = "Gigantamax"; this.CHK_G.UseVisualStyleBackColor = true; @@ -461,10 +433,9 @@ private void InitializeComponent() // CHK_Gigantamaxed // this.CHK_Gigantamaxed.AutoSize = true; - this.CHK_Gigantamaxed.Location = new System.Drawing.Point(517, 18); - this.CHK_Gigantamaxed.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.CHK_Gigantamaxed.Location = new System.Drawing.Point(388, 15); this.CHK_Gigantamaxed.Name = "CHK_Gigantamaxed"; - this.CHK_Gigantamaxed.Size = new System.Drawing.Size(121, 21); + this.CHK_Gigantamaxed.Size = new System.Drawing.Size(94, 17); this.CHK_Gigantamaxed.TabIndex = 34; this.CHK_Gigantamaxed.Text = "Gigantamaxed"; this.CHK_Gigantamaxed.UseVisualStyleBackColor = true; @@ -472,10 +443,9 @@ private void InitializeComponent() // NUD_Form // this.NUD_Form.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.NUD_Form.Location = new System.Drawing.Point(804, 290); - this.NUD_Form.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.NUD_Form.Location = new System.Drawing.Point(603, 236); this.NUD_Form.Name = "NUD_Form"; - this.NUD_Form.Size = new System.Drawing.Size(151, 22); + this.NUD_Form.Size = new System.Drawing.Size(113, 20); this.NUD_Form.TabIndex = 35; // // tableLayoutPanel1 @@ -488,135 +458,129 @@ private void InitializeComponent() this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tableLayoutPanel1.Controls.Add(this.L_Male, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.label3, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.label4, 2, 0); - this.tableLayoutPanel1.Controls.Add(this.label5, 3, 0); + this.tableLayoutPanel1.Controls.Add(this.L_Female, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.L_MaleShiny, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.L_FemaleShiny, 3, 0); this.tableLayoutPanel1.Controls.Add(this.CLB_3, 0, 1); this.tableLayoutPanel1.Controls.Add(this.CLB_4, 0, 1); this.tableLayoutPanel1.Controls.Add(this.CLB_1, 0, 1); this.tableLayoutPanel1.Controls.Add(this.CLB_2, 0, 1); - this.tableLayoutPanel1.Location = new System.Drawing.Point(237, 49); - this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.tableLayoutPanel1.Location = new System.Drawing.Point(178, 40); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.RowCount = 2; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(555, 487); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(416, 396); this.tableLayoutPanel1.TabIndex = 36; // // L_Male // this.L_Male.AutoSize = true; this.L_Male.Dock = System.Windows.Forms.DockStyle.Fill; - this.L_Male.Location = new System.Drawing.Point(4, 0); - this.L_Male.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.L_Male.Location = new System.Drawing.Point(3, 0); this.L_Male.Name = "L_Male"; - this.L_Male.Size = new System.Drawing.Size(130, 25); + this.L_Male.Size = new System.Drawing.Size(98, 20); this.L_Male.TabIndex = 37; this.L_Male.Text = "Male"; this.L_Male.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // - // label3 - // - this.label3.AutoSize = true; - this.label3.Dock = System.Windows.Forms.DockStyle.Fill; - this.label3.Location = new System.Drawing.Point(142, 0); - this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(130, 25); - this.label3.TabIndex = 38; - this.label3.Text = "Female"; - this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Dock = System.Windows.Forms.DockStyle.Fill; - this.label4.Location = new System.Drawing.Point(280, 0); - this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(130, 25); - this.label4.TabIndex = 39; - this.label4.Text = "*Male*"; - this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Dock = System.Windows.Forms.DockStyle.Fill; - this.label5.Location = new System.Drawing.Point(418, 0); - this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(133, 25); - this.label5.TabIndex = 40; - this.label5.Text = "*Female*"; - this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // L_Female + // + this.L_Female.AutoSize = true; + this.L_Female.Dock = System.Windows.Forms.DockStyle.Fill; + this.L_Female.Location = new System.Drawing.Point(107, 0); + this.L_Female.Name = "L_Female"; + this.L_Female.Size = new System.Drawing.Size(98, 20); + this.L_Female.TabIndex = 38; + this.L_Female.Text = "Female"; + this.L_Female.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // L_MaleShiny + // + this.L_MaleShiny.AutoSize = true; + this.L_MaleShiny.Dock = System.Windows.Forms.DockStyle.Fill; + this.L_MaleShiny.Location = new System.Drawing.Point(211, 0); + this.L_MaleShiny.Name = "L_MaleShiny"; + this.L_MaleShiny.Size = new System.Drawing.Size(98, 20); + this.L_MaleShiny.TabIndex = 39; + this.L_MaleShiny.Text = "*Male*"; + this.L_MaleShiny.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // L_FemaleShiny + // + this.L_FemaleShiny.AutoSize = true; + this.L_FemaleShiny.Dock = System.Windows.Forms.DockStyle.Fill; + this.L_FemaleShiny.Location = new System.Drawing.Point(315, 0); + this.L_FemaleShiny.Name = "L_FemaleShiny"; + this.L_FemaleShiny.Size = new System.Drawing.Size(98, 20); + this.L_FemaleShiny.TabIndex = 40; + this.L_FemaleShiny.Text = "*Female*"; + this.L_FemaleShiny.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // CLB_3 // this.CLB_3.Dock = System.Windows.Forms.DockStyle.Fill; this.CLB_3.FormattingEnabled = true; - this.CLB_3.Location = new System.Drawing.Point(277, 26); + this.CLB_3.Location = new System.Drawing.Point(209, 21); this.CLB_3.Margin = new System.Windows.Forms.Padding(1); this.CLB_3.Name = "CLB_3"; - this.CLB_3.Size = new System.Drawing.Size(136, 460); + this.CLB_3.Size = new System.Drawing.Size(102, 374); this.CLB_3.TabIndex = 34; // // CLB_4 // this.CLB_4.Dock = System.Windows.Forms.DockStyle.Fill; this.CLB_4.FormattingEnabled = true; - this.CLB_4.Location = new System.Drawing.Point(415, 26); + this.CLB_4.Location = new System.Drawing.Point(313, 21); this.CLB_4.Margin = new System.Windows.Forms.Padding(1); this.CLB_4.Name = "CLB_4"; - this.CLB_4.Size = new System.Drawing.Size(139, 460); + this.CLB_4.Size = new System.Drawing.Size(102, 374); this.CLB_4.TabIndex = 33; // // CLB_1 // this.CLB_1.Dock = System.Windows.Forms.DockStyle.Fill; this.CLB_1.FormattingEnabled = true; - this.CLB_1.Location = new System.Drawing.Point(1, 26); + this.CLB_1.Location = new System.Drawing.Point(1, 21); this.CLB_1.Margin = new System.Windows.Forms.Padding(1); this.CLB_1.Name = "CLB_1"; - this.CLB_1.Size = new System.Drawing.Size(136, 460); + this.CLB_1.Size = new System.Drawing.Size(102, 374); this.CLB_1.TabIndex = 32; // // CLB_2 // this.CLB_2.Dock = System.Windows.Forms.DockStyle.Fill; this.CLB_2.FormattingEnabled = true; - this.CLB_2.Location = new System.Drawing.Point(139, 26); + this.CLB_2.Location = new System.Drawing.Point(105, 21); this.CLB_2.Margin = new System.Windows.Forms.Padding(1); this.CLB_2.Name = "CLB_2"; - this.CLB_2.Size = new System.Drawing.Size(136, 460); + this.CLB_2.Size = new System.Drawing.Size(102, 374); this.CLB_2.TabIndex = 30; // // CHK_Gigantamaxed1 // this.CHK_Gigantamaxed1.AutoSize = true; - this.CHK_Gigantamaxed1.Location = new System.Drawing.Point(655, 19); - this.CHK_Gigantamaxed1.Margin = new System.Windows.Forms.Padding(4); + this.CHK_Gigantamaxed1.Location = new System.Drawing.Point(491, 15); this.CHK_Gigantamaxed1.Name = "CHK_Gigantamaxed1"; - this.CHK_Gigantamaxed1.Size = new System.Drawing.Size(133, 21); + this.CHK_Gigantamaxed1.Size = new System.Drawing.Size(103, 17); this.CHK_Gigantamaxed1.TabIndex = 37; this.CHK_Gigantamaxed1.Text = "Gigantamaxed 1"; this.CHK_Gigantamaxed1.UseVisualStyleBackColor = true; // // SAV_PokedexSWSH // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(979, 559); + this.ClientSize = new System.Drawing.Size(734, 454); this.Controls.Add(this.CHK_Gigantamaxed1); this.Controls.Add(this.tableLayoutPanel1); this.Controls.Add(this.NUD_Form); this.Controls.Add(this.CHK_Gigantamaxed); this.Controls.Add(this.GB_Displayed); - this.Controls.Add(this.label1); + this.Controls.Add(this.L_DisplayedForm); this.Controls.Add(this.L_Battled); this.Controls.Add(this.NUD_Battled); this.Controls.Add(this.CHK_Caught); @@ -629,10 +593,9 @@ private void InitializeComponent() this.Controls.Add(this.LB_Species); this.Controls.Add(this.B_Cancel); this.Icon = global::PKHeX.WinForms.Properties.Resources.Icon; - this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); this.MaximizeBox = false; this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(994, 596); + this.MinimumSize = new System.Drawing.Size(750, 492); this.Name = "SAV_PokedexSWSH"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Pokédex Editor"; @@ -681,7 +644,7 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox CHK_L9; private System.Windows.Forms.NumericUpDown NUD_Battled; private System.Windows.Forms.Label L_Battled; - private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label L_DisplayedForm; private System.Windows.Forms.GroupBox GB_Displayed; private System.Windows.Forms.CheckBox CHK_S; private System.Windows.Forms.CheckBox CHK_G; @@ -689,9 +652,9 @@ private void InitializeComponent() private System.Windows.Forms.NumericUpDown NUD_Form; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.Label L_Male; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label L_Female; + private System.Windows.Forms.Label L_MaleShiny; + private System.Windows.Forms.Label L_FemaleShiny; private System.Windows.Forms.CheckedListBox CLB_3; private System.Windows.Forms.CheckedListBox CLB_4; private System.Windows.Forms.CheckedListBox CLB_1; diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.Designer.cs new file mode 100644 index 00000000000..0f07d927ecd --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.Designer.cs @@ -0,0 +1,942 @@ +namespace PKHeX.WinForms +{ + partial class SAV_Trainer8a + { + /// + /// 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() + { + this.B_Cancel = new System.Windows.Forms.Button(); + this.B_Save = new System.Windows.Forms.Button(); + this.TB_OTName = new System.Windows.Forms.TextBox(); + this.L_TrainerName = new System.Windows.Forms.Label(); + this.MT_Money = new System.Windows.Forms.MaskedTextBox(); + this.L_Money = new System.Windows.Forms.Label(); + this.L_Saying5 = new System.Windows.Forms.Label(); + this.L_Saying4 = new System.Windows.Forms.Label(); + this.L_Saying3 = new System.Windows.Forms.Label(); + this.L_Saying2 = new System.Windows.Forms.Label(); + this.L_Saying1 = new System.Windows.Forms.Label(); + this.TB_Saying5 = new System.Windows.Forms.TextBox(); + this.TB_Saying4 = new System.Windows.Forms.TextBox(); + this.TB_Saying3 = new System.Windows.Forms.TextBox(); + this.TB_Saying2 = new System.Windows.Forms.TextBox(); + this.TB_Saying1 = new System.Windows.Forms.TextBox(); + this.L_LastSaved = new System.Windows.Forms.Label(); + this.CAL_LastSavedDate = new System.Windows.Forms.DateTimePicker(); + this.L_Seconds = new System.Windows.Forms.Label(); + this.L_Minutes = new System.Windows.Forms.Label(); + this.MT_Seconds = new System.Windows.Forms.MaskedTextBox(); + this.MT_Minutes = new System.Windows.Forms.MaskedTextBox(); + this.L_Hours = new System.Windows.Forms.Label(); + this.MT_Hours = new System.Windows.Forms.MaskedTextBox(); + this.L_Language = new System.Windows.Forms.Label(); + this.B_MaxCash = new System.Windows.Forms.Button(); + this.CB_Language = new System.Windows.Forms.ComboBox(); + this.CB_Gender = new System.Windows.Forms.ComboBox(); + this.TB_MBMS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBMN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBRS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBRN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBTS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBTN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBDS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBDN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBSS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MBSN = new System.Windows.Forms.MaskedTextBox(); + this.L_SuperB = new System.Windows.Forms.Label(); + this.L_NormalB = new System.Windows.Forms.Label(); + this.L_MultiB = new System.Windows.Forms.Label(); + this.L_RotationB = new System.Windows.Forms.Label(); + this.L_TriplesB = new System.Windows.Forms.Label(); + this.L_DoublesB = new System.Windows.Forms.Label(); + this.L_SinglesB = new System.Windows.Forms.Label(); + this.TB_MCMS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCMN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCRS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCRN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCTS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCTN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCDS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCDN = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCSS = new System.Windows.Forms.MaskedTextBox(); + this.TB_MCSN = new System.Windows.Forms.MaskedTextBox(); + this.L_SuperC = new System.Windows.Forms.Label(); + this.L_NormalC = new System.Windows.Forms.Label(); + this.L_MultiC = new System.Windows.Forms.Label(); + this.L_RotationC = new System.Windows.Forms.Label(); + this.L_TriplesC = new System.Windows.Forms.Label(); + this.L_DoublesC = new System.Windows.Forms.Label(); + this.L_SinglesC = new System.Windows.Forms.Label(); + this.TC_Editor = new System.Windows.Forms.TabControl(); + this.Tab_Overview = new System.Windows.Forms.TabPage(); + this.GB_Stats = new System.Windows.Forms.GroupBox(); + this.NUD_MeritEarned = new System.Windows.Forms.NumericUpDown(); + this.L_MeritEarned = new System.Windows.Forms.Label(); + this.NUD_MeritCurrent = new System.Windows.Forms.NumericUpDown(); + this.L_MeritCurrent = new System.Windows.Forms.Label(); + this.trainerID1 = new PKHeX.WinForms.Controls.TrainerID(); + this.GB_Adventure = new System.Windows.Forms.GroupBox(); + this.L_Started = new System.Windows.Forms.Label(); + this.CAL_AdventureStartDate = new System.Windows.Forms.DateTimePicker(); + this.CAL_AdventureStartTime = new System.Windows.Forms.DateTimePicker(); + this.CAL_LastSavedTime = new System.Windows.Forms.DateTimePicker(); + this.NUD_Rank = new System.Windows.Forms.NumericUpDown(); + this.L_GalaxyRank = new System.Windows.Forms.Label(); + this.NUD_Satchel = new System.Windows.Forms.NumericUpDown(); + this.L_SatchelUpgrades = new System.Windows.Forms.Label(); + this.TC_Editor.SuspendLayout(); + this.Tab_Overview.SuspendLayout(); + this.GB_Stats.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_MeritEarned)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_MeritCurrent)).BeginInit(); + this.GB_Adventure.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Rank)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Satchel)).BeginInit(); + this.SuspendLayout(); + // + // B_Cancel + // + this.B_Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Cancel.Location = new System.Drawing.Point(294, 331); + this.B_Cancel.Name = "B_Cancel"; + this.B_Cancel.Size = new System.Drawing.Size(75, 23); + this.B_Cancel.TabIndex = 0; + this.B_Cancel.Text = "Cancel"; + this.B_Cancel.UseVisualStyleBackColor = true; + this.B_Cancel.Click += new System.EventHandler(this.B_Cancel_Click); + // + // B_Save + // + this.B_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.B_Save.Location = new System.Drawing.Point(375, 331); + this.B_Save.Name = "B_Save"; + this.B_Save.Size = new System.Drawing.Size(75, 23); + this.B_Save.TabIndex = 1; + this.B_Save.Text = "Save"; + this.B_Save.UseVisualStyleBackColor = true; + this.B_Save.Click += new System.EventHandler(this.B_Save_Click); + // + // TB_OTName + // + this.TB_OTName.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.TB_OTName.Location = new System.Drawing.Point(99, 7); + this.TB_OTName.MaxLength = 12; + this.TB_OTName.Name = "TB_OTName"; + this.TB_OTName.Size = new System.Drawing.Size(93, 20); + this.TB_OTName.TabIndex = 2; + this.TB_OTName.Text = "WWWWWWWWWWWW"; + this.TB_OTName.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.TB_OTName.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ClickOT); + // + // L_TrainerName + // + this.L_TrainerName.Location = new System.Drawing.Point(7, 9); + this.L_TrainerName.Name = "L_TrainerName"; + this.L_TrainerName.Size = new System.Drawing.Size(87, 16); + this.L_TrainerName.TabIndex = 3; + this.L_TrainerName.Text = "Trainer Name:"; + this.L_TrainerName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // MT_Money + // + this.MT_Money.Location = new System.Drawing.Point(119, 29); + this.MT_Money.Mask = "0000000"; + this.MT_Money.Name = "MT_Money"; + this.MT_Money.RightToLeft = System.Windows.Forms.RightToLeft.Yes; + this.MT_Money.Size = new System.Drawing.Size(52, 20); + this.MT_Money.TabIndex = 4; + this.MT_Money.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // L_Money + // + this.L_Money.AutoSize = true; + this.L_Money.Location = new System.Drawing.Point(102, 32); + this.L_Money.Name = "L_Money"; + this.L_Money.Size = new System.Drawing.Size(16, 13); + this.L_Money.TabIndex = 5; + this.L_Money.Text = "$:"; + // + // L_Saying5 + // + this.L_Saying5.Location = new System.Drawing.Point(0, 0); + this.L_Saying5.Name = "L_Saying5"; + this.L_Saying5.Size = new System.Drawing.Size(100, 23); + this.L_Saying5.TabIndex = 0; + // + // L_Saying4 + // + this.L_Saying4.Location = new System.Drawing.Point(0, 0); + this.L_Saying4.Name = "L_Saying4"; + this.L_Saying4.Size = new System.Drawing.Size(100, 23); + this.L_Saying4.TabIndex = 0; + // + // L_Saying3 + // + this.L_Saying3.Location = new System.Drawing.Point(0, 0); + this.L_Saying3.Name = "L_Saying3"; + this.L_Saying3.Size = new System.Drawing.Size(100, 23); + this.L_Saying3.TabIndex = 0; + // + // L_Saying2 + // + this.L_Saying2.Location = new System.Drawing.Point(0, 0); + this.L_Saying2.Name = "L_Saying2"; + this.L_Saying2.Size = new System.Drawing.Size(100, 23); + this.L_Saying2.TabIndex = 0; + // + // L_Saying1 + // + this.L_Saying1.Location = new System.Drawing.Point(0, 0); + this.L_Saying1.Name = "L_Saying1"; + this.L_Saying1.Size = new System.Drawing.Size(100, 23); + this.L_Saying1.TabIndex = 0; + // + // TB_Saying5 + // + this.TB_Saying5.Location = new System.Drawing.Point(0, 0); + this.TB_Saying5.Name = "TB_Saying5"; + this.TB_Saying5.Size = new System.Drawing.Size(100, 20); + this.TB_Saying5.TabIndex = 0; + // + // TB_Saying4 + // + this.TB_Saying4.Location = new System.Drawing.Point(0, 0); + this.TB_Saying4.Name = "TB_Saying4"; + this.TB_Saying4.Size = new System.Drawing.Size(100, 20); + this.TB_Saying4.TabIndex = 0; + // + // TB_Saying3 + // + this.TB_Saying3.Location = new System.Drawing.Point(0, 0); + this.TB_Saying3.Name = "TB_Saying3"; + this.TB_Saying3.Size = new System.Drawing.Size(100, 20); + this.TB_Saying3.TabIndex = 0; + // + // TB_Saying2 + // + this.TB_Saying2.Location = new System.Drawing.Point(0, 0); + this.TB_Saying2.Name = "TB_Saying2"; + this.TB_Saying2.Size = new System.Drawing.Size(100, 20); + this.TB_Saying2.TabIndex = 0; + // + // TB_Saying1 + // + this.TB_Saying1.Location = new System.Drawing.Point(0, 0); + this.TB_Saying1.Name = "TB_Saying1"; + this.TB_Saying1.Size = new System.Drawing.Size(100, 20); + this.TB_Saying1.TabIndex = 0; + // + // L_LastSaved + // + this.L_LastSaved.Location = new System.Drawing.Point(3, 110); + this.L_LastSaved.Name = "L_LastSaved"; + this.L_LastSaved.Size = new System.Drawing.Size(80, 20); + this.L_LastSaved.TabIndex = 32; + this.L_LastSaved.Text = "Last Saved:"; + this.L_LastSaved.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // CAL_LastSavedDate + // + this.CAL_LastSavedDate.Format = System.Windows.Forms.DateTimePickerFormat.Short; + this.CAL_LastSavedDate.Location = new System.Drawing.Point(89, 110); + this.CAL_LastSavedDate.MaxDate = new System.DateTime(4095, 12, 31, 0, 0, 0, 0); + this.CAL_LastSavedDate.Name = "CAL_LastSavedDate"; + this.CAL_LastSavedDate.Size = new System.Drawing.Size(99, 20); + this.CAL_LastSavedDate.TabIndex = 31; + this.CAL_LastSavedDate.Value = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); + // + // L_Seconds + // + this.L_Seconds.AutoSize = true; + this.L_Seconds.Location = new System.Drawing.Point(136, 17); + this.L_Seconds.Name = "L_Seconds"; + this.L_Seconds.Size = new System.Drawing.Size(29, 13); + this.L_Seconds.TabIndex = 30; + this.L_Seconds.Text = "Sec:"; + // + // L_Minutes + // + this.L_Minutes.AutoSize = true; + this.L_Minutes.Location = new System.Drawing.Point(84, 17); + this.L_Minutes.Name = "L_Minutes"; + this.L_Minutes.Size = new System.Drawing.Size(27, 13); + this.L_Minutes.TabIndex = 29; + this.L_Minutes.Text = "Min:"; + // + // MT_Seconds + // + this.MT_Seconds.Location = new System.Drawing.Point(166, 14); + this.MT_Seconds.Mask = "00"; + this.MT_Seconds.Name = "MT_Seconds"; + this.MT_Seconds.Size = new System.Drawing.Size(22, 20); + this.MT_Seconds.TabIndex = 28; + this.MT_Seconds.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.MT_Seconds.TextChanged += new System.EventHandler(this.Change255); + // + // MT_Minutes + // + this.MT_Minutes.Location = new System.Drawing.Point(111, 14); + this.MT_Minutes.Mask = "00"; + this.MT_Minutes.Name = "MT_Minutes"; + this.MT_Minutes.Size = new System.Drawing.Size(22, 20); + this.MT_Minutes.TabIndex = 27; + this.MT_Minutes.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.MT_Minutes.TextChanged += new System.EventHandler(this.Change255); + // + // L_Hours + // + this.L_Hours.AutoSize = true; + this.L_Hours.Location = new System.Drawing.Point(12, 17); + this.L_Hours.Name = "L_Hours"; + this.L_Hours.Size = new System.Drawing.Size(26, 13); + this.L_Hours.TabIndex = 26; + this.L_Hours.Text = "Hrs:"; + // + // MT_Hours + // + this.MT_Hours.Location = new System.Drawing.Point(44, 14); + this.MT_Hours.Mask = "00000"; + this.MT_Hours.Name = "MT_Hours"; + this.MT_Hours.Size = new System.Drawing.Size(38, 20); + this.MT_Hours.TabIndex = 25; + this.MT_Hours.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // L_Language + // + this.L_Language.Location = new System.Drawing.Point(-7, 107); + this.L_Language.Name = "L_Language"; + this.L_Language.Size = new System.Drawing.Size(100, 13); + this.L_Language.TabIndex = 21; + this.L_Language.Text = "Language:"; + this.L_Language.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // B_MaxCash + // + this.B_MaxCash.Location = new System.Drawing.Point(172, 29); + this.B_MaxCash.Name = "B_MaxCash"; + this.B_MaxCash.Size = new System.Drawing.Size(20, 20); + this.B_MaxCash.TabIndex = 16; + this.B_MaxCash.Text = "+"; + this.B_MaxCash.UseVisualStyleBackColor = true; + // + // CB_Language + // + this.CB_Language.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.CB_Language.FormattingEnabled = true; + this.CB_Language.Location = new System.Drawing.Point(99, 104); + this.CB_Language.Name = "CB_Language"; + this.CB_Language.Size = new System.Drawing.Size(93, 21); + this.CB_Language.TabIndex = 15; + // + // CB_Gender + // + this.CB_Gender.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.CB_Gender.FormattingEnabled = true; + this.CB_Gender.Items.AddRange(new object[] { + "♂", + "♀"}); + this.CB_Gender.Location = new System.Drawing.Point(99, 77); + this.CB_Gender.Name = "CB_Gender"; + this.CB_Gender.Size = new System.Drawing.Size(40, 21); + this.CB_Gender.TabIndex = 22; + // + // TB_MBMS + // + this.TB_MBMS.Location = new System.Drawing.Point(0, 0); + this.TB_MBMS.Name = "TB_MBMS"; + this.TB_MBMS.Size = new System.Drawing.Size(100, 20); + this.TB_MBMS.TabIndex = 0; + // + // TB_MBMN + // + this.TB_MBMN.Location = new System.Drawing.Point(0, 0); + this.TB_MBMN.Name = "TB_MBMN"; + this.TB_MBMN.Size = new System.Drawing.Size(100, 20); + this.TB_MBMN.TabIndex = 0; + // + // TB_MBRS + // + this.TB_MBRS.Location = new System.Drawing.Point(0, 0); + this.TB_MBRS.Name = "TB_MBRS"; + this.TB_MBRS.Size = new System.Drawing.Size(100, 20); + this.TB_MBRS.TabIndex = 0; + // + // TB_MBRN + // + this.TB_MBRN.Location = new System.Drawing.Point(0, 0); + this.TB_MBRN.Name = "TB_MBRN"; + this.TB_MBRN.Size = new System.Drawing.Size(100, 20); + this.TB_MBRN.TabIndex = 0; + // + // TB_MBTS + // + this.TB_MBTS.Location = new System.Drawing.Point(0, 0); + this.TB_MBTS.Name = "TB_MBTS"; + this.TB_MBTS.Size = new System.Drawing.Size(100, 20); + this.TB_MBTS.TabIndex = 0; + // + // TB_MBTN + // + this.TB_MBTN.Location = new System.Drawing.Point(0, 0); + this.TB_MBTN.Name = "TB_MBTN"; + this.TB_MBTN.Size = new System.Drawing.Size(100, 20); + this.TB_MBTN.TabIndex = 0; + // + // TB_MBDS + // + this.TB_MBDS.Location = new System.Drawing.Point(0, 0); + this.TB_MBDS.Name = "TB_MBDS"; + this.TB_MBDS.Size = new System.Drawing.Size(100, 20); + this.TB_MBDS.TabIndex = 0; + // + // TB_MBDN + // + this.TB_MBDN.Location = new System.Drawing.Point(0, 0); + this.TB_MBDN.Name = "TB_MBDN"; + this.TB_MBDN.Size = new System.Drawing.Size(100, 20); + this.TB_MBDN.TabIndex = 0; + // + // TB_MBSS + // + this.TB_MBSS.Location = new System.Drawing.Point(0, 0); + this.TB_MBSS.Name = "TB_MBSS"; + this.TB_MBSS.Size = new System.Drawing.Size(100, 20); + this.TB_MBSS.TabIndex = 0; + // + // TB_MBSN + // + this.TB_MBSN.Location = new System.Drawing.Point(0, 0); + this.TB_MBSN.Name = "TB_MBSN"; + this.TB_MBSN.Size = new System.Drawing.Size(100, 20); + this.TB_MBSN.TabIndex = 0; + // + // L_SuperB + // + this.L_SuperB.Location = new System.Drawing.Point(0, 0); + this.L_SuperB.Name = "L_SuperB"; + this.L_SuperB.Size = new System.Drawing.Size(100, 23); + this.L_SuperB.TabIndex = 0; + // + // L_NormalB + // + this.L_NormalB.Location = new System.Drawing.Point(0, 0); + this.L_NormalB.Name = "L_NormalB"; + this.L_NormalB.Size = new System.Drawing.Size(100, 23); + this.L_NormalB.TabIndex = 0; + // + // L_MultiB + // + this.L_MultiB.Location = new System.Drawing.Point(0, 0); + this.L_MultiB.Name = "L_MultiB"; + this.L_MultiB.Size = new System.Drawing.Size(100, 23); + this.L_MultiB.TabIndex = 0; + // + // L_RotationB + // + this.L_RotationB.Location = new System.Drawing.Point(0, 0); + this.L_RotationB.Name = "L_RotationB"; + this.L_RotationB.Size = new System.Drawing.Size(100, 23); + this.L_RotationB.TabIndex = 0; + // + // L_TriplesB + // + this.L_TriplesB.Location = new System.Drawing.Point(0, 0); + this.L_TriplesB.Name = "L_TriplesB"; + this.L_TriplesB.Size = new System.Drawing.Size(100, 23); + this.L_TriplesB.TabIndex = 0; + // + // L_DoublesB + // + this.L_DoublesB.Location = new System.Drawing.Point(0, 0); + this.L_DoublesB.Name = "L_DoublesB"; + this.L_DoublesB.Size = new System.Drawing.Size(100, 23); + this.L_DoublesB.TabIndex = 0; + // + // L_SinglesB + // + this.L_SinglesB.Location = new System.Drawing.Point(0, 0); + this.L_SinglesB.Name = "L_SinglesB"; + this.L_SinglesB.Size = new System.Drawing.Size(100, 23); + this.L_SinglesB.TabIndex = 0; + // + // TB_MCMS + // + this.TB_MCMS.Location = new System.Drawing.Point(0, 0); + this.TB_MCMS.Name = "TB_MCMS"; + this.TB_MCMS.Size = new System.Drawing.Size(100, 20); + this.TB_MCMS.TabIndex = 0; + // + // TB_MCMN + // + this.TB_MCMN.Location = new System.Drawing.Point(0, 0); + this.TB_MCMN.Name = "TB_MCMN"; + this.TB_MCMN.Size = new System.Drawing.Size(100, 20); + this.TB_MCMN.TabIndex = 0; + // + // TB_MCRS + // + this.TB_MCRS.Location = new System.Drawing.Point(0, 0); + this.TB_MCRS.Name = "TB_MCRS"; + this.TB_MCRS.Size = new System.Drawing.Size(100, 20); + this.TB_MCRS.TabIndex = 0; + // + // TB_MCRN + // + this.TB_MCRN.Location = new System.Drawing.Point(0, 0); + this.TB_MCRN.Name = "TB_MCRN"; + this.TB_MCRN.Size = new System.Drawing.Size(100, 20); + this.TB_MCRN.TabIndex = 0; + // + // TB_MCTS + // + this.TB_MCTS.Location = new System.Drawing.Point(0, 0); + this.TB_MCTS.Name = "TB_MCTS"; + this.TB_MCTS.Size = new System.Drawing.Size(100, 20); + this.TB_MCTS.TabIndex = 0; + // + // TB_MCTN + // + this.TB_MCTN.Location = new System.Drawing.Point(0, 0); + this.TB_MCTN.Name = "TB_MCTN"; + this.TB_MCTN.Size = new System.Drawing.Size(100, 20); + this.TB_MCTN.TabIndex = 0; + // + // TB_MCDS + // + this.TB_MCDS.Location = new System.Drawing.Point(0, 0); + this.TB_MCDS.Name = "TB_MCDS"; + this.TB_MCDS.Size = new System.Drawing.Size(100, 20); + this.TB_MCDS.TabIndex = 0; + // + // TB_MCDN + // + this.TB_MCDN.Location = new System.Drawing.Point(0, 0); + this.TB_MCDN.Name = "TB_MCDN"; + this.TB_MCDN.Size = new System.Drawing.Size(100, 20); + this.TB_MCDN.TabIndex = 0; + // + // TB_MCSS + // + this.TB_MCSS.Location = new System.Drawing.Point(0, 0); + this.TB_MCSS.Name = "TB_MCSS"; + this.TB_MCSS.Size = new System.Drawing.Size(100, 20); + this.TB_MCSS.TabIndex = 0; + // + // TB_MCSN + // + this.TB_MCSN.Location = new System.Drawing.Point(0, 0); + this.TB_MCSN.Name = "TB_MCSN"; + this.TB_MCSN.Size = new System.Drawing.Size(100, 20); + this.TB_MCSN.TabIndex = 0; + // + // L_SuperC + // + this.L_SuperC.Location = new System.Drawing.Point(0, 0); + this.L_SuperC.Name = "L_SuperC"; + this.L_SuperC.Size = new System.Drawing.Size(100, 23); + this.L_SuperC.TabIndex = 0; + // + // L_NormalC + // + this.L_NormalC.Location = new System.Drawing.Point(0, 0); + this.L_NormalC.Name = "L_NormalC"; + this.L_NormalC.Size = new System.Drawing.Size(100, 23); + this.L_NormalC.TabIndex = 0; + // + // L_MultiC + // + this.L_MultiC.Location = new System.Drawing.Point(0, 0); + this.L_MultiC.Name = "L_MultiC"; + this.L_MultiC.Size = new System.Drawing.Size(100, 23); + this.L_MultiC.TabIndex = 0; + // + // L_RotationC + // + this.L_RotationC.Location = new System.Drawing.Point(0, 0); + this.L_RotationC.Name = "L_RotationC"; + this.L_RotationC.Size = new System.Drawing.Size(100, 23); + this.L_RotationC.TabIndex = 0; + // + // L_TriplesC + // + this.L_TriplesC.Location = new System.Drawing.Point(0, 0); + this.L_TriplesC.Name = "L_TriplesC"; + this.L_TriplesC.Size = new System.Drawing.Size(100, 23); + this.L_TriplesC.TabIndex = 0; + // + // L_DoublesC + // + this.L_DoublesC.Location = new System.Drawing.Point(0, 0); + this.L_DoublesC.Name = "L_DoublesC"; + this.L_DoublesC.Size = new System.Drawing.Size(100, 23); + this.L_DoublesC.TabIndex = 0; + // + // L_SinglesC + // + this.L_SinglesC.Location = new System.Drawing.Point(0, 0); + this.L_SinglesC.Name = "L_SinglesC"; + this.L_SinglesC.Size = new System.Drawing.Size(100, 23); + this.L_SinglesC.TabIndex = 0; + // + // TC_Editor + // + this.TC_Editor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TC_Editor.Controls.Add(this.Tab_Overview); + this.TC_Editor.Location = new System.Drawing.Point(12, 12); + this.TC_Editor.Name = "TC_Editor"; + this.TC_Editor.SelectedIndex = 0; + this.TC_Editor.Size = new System.Drawing.Size(438, 313); + this.TC_Editor.TabIndex = 54; + // + // Tab_Overview + // + this.Tab_Overview.Controls.Add(this.GB_Stats); + this.Tab_Overview.Controls.Add(this.trainerID1); + this.Tab_Overview.Controls.Add(this.GB_Adventure); + this.Tab_Overview.Controls.Add(this.TB_OTName); + this.Tab_Overview.Controls.Add(this.CB_Gender); + this.Tab_Overview.Controls.Add(this.L_TrainerName); + this.Tab_Overview.Controls.Add(this.MT_Money); + this.Tab_Overview.Controls.Add(this.L_Money); + this.Tab_Overview.Controls.Add(this.L_Language); + this.Tab_Overview.Controls.Add(this.CB_Language); + this.Tab_Overview.Controls.Add(this.B_MaxCash); + this.Tab_Overview.Location = new System.Drawing.Point(4, 22); + this.Tab_Overview.Name = "Tab_Overview"; + this.Tab_Overview.Padding = new System.Windows.Forms.Padding(3); + this.Tab_Overview.Size = new System.Drawing.Size(430, 287); + this.Tab_Overview.TabIndex = 0; + this.Tab_Overview.Text = "Overview"; + this.Tab_Overview.UseVisualStyleBackColor = true; + // + // GB_Stats + // + this.GB_Stats.Controls.Add(this.NUD_Satchel); + this.GB_Stats.Controls.Add(this.L_SatchelUpgrades); + this.GB_Stats.Controls.Add(this.NUD_Rank); + this.GB_Stats.Controls.Add(this.L_GalaxyRank); + this.GB_Stats.Controls.Add(this.NUD_MeritEarned); + this.GB_Stats.Controls.Add(this.L_MeritEarned); + this.GB_Stats.Controls.Add(this.NUD_MeritCurrent); + this.GB_Stats.Controls.Add(this.L_MeritCurrent); + this.GB_Stats.Location = new System.Drawing.Point(209, 130); + this.GB_Stats.Name = "GB_Stats"; + this.GB_Stats.Size = new System.Drawing.Size(215, 137); + this.GB_Stats.TabIndex = 67; + this.GB_Stats.TabStop = false; + this.GB_Stats.Text = "Stats"; + // + // NUD_MeritEarned + // + this.NUD_MeritEarned.Location = new System.Drawing.Point(134, 45); + this.NUD_MeritEarned.Maximum = new decimal(new int[] { + 999999999, + 0, + 0, + 0}); + this.NUD_MeritEarned.Name = "NUD_MeritEarned"; + this.NUD_MeritEarned.Size = new System.Drawing.Size(75, 20); + this.NUD_MeritEarned.TabIndex = 71; + this.NUD_MeritEarned.Value = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + // + // L_MeritEarned + // + this.L_MeritEarned.Location = new System.Drawing.Point(6, 43); + this.L_MeritEarned.Name = "L_MeritEarned"; + this.L_MeritEarned.Size = new System.Drawing.Size(122, 20); + this.L_MeritEarned.TabIndex = 70; + this.L_MeritEarned.Text = "Earned Merit Points:"; + this.L_MeritEarned.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // NUD_MeritCurrent + // + this.NUD_MeritCurrent.Location = new System.Drawing.Point(134, 19); + this.NUD_MeritCurrent.Maximum = new decimal(new int[] { + 999999999, + 0, + 0, + 0}); + this.NUD_MeritCurrent.Name = "NUD_MeritCurrent"; + this.NUD_MeritCurrent.Size = new System.Drawing.Size(75, 20); + this.NUD_MeritCurrent.TabIndex = 69; + this.NUD_MeritCurrent.Value = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + // + // L_MeritCurrent + // + this.L_MeritCurrent.Location = new System.Drawing.Point(6, 17); + this.L_MeritCurrent.Name = "L_MeritCurrent"; + this.L_MeritCurrent.Size = new System.Drawing.Size(122, 20); + this.L_MeritCurrent.TabIndex = 68; + this.L_MeritCurrent.Text = "Current Merit Points:"; + this.L_MeritCurrent.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // trainerID1 + // + this.trainerID1.Location = new System.Drawing.Point(6, 26); + this.trainerID1.Name = "trainerID1"; + this.trainerID1.Size = new System.Drawing.Size(90, 74); + this.trainerID1.TabIndex = 66; + // + // GB_Adventure + // + this.GB_Adventure.Controls.Add(this.L_Started); + this.GB_Adventure.Controls.Add(this.CAL_AdventureStartDate); + this.GB_Adventure.Controls.Add(this.CAL_LastSavedDate); + this.GB_Adventure.Controls.Add(this.L_LastSaved); + this.GB_Adventure.Controls.Add(this.MT_Seconds); + this.GB_Adventure.Controls.Add(this.MT_Hours); + this.GB_Adventure.Controls.Add(this.L_Seconds); + this.GB_Adventure.Controls.Add(this.L_Hours); + this.GB_Adventure.Controls.Add(this.MT_Minutes); + this.GB_Adventure.Controls.Add(this.L_Minutes); + this.GB_Adventure.Controls.Add(this.CAL_AdventureStartTime); + this.GB_Adventure.Controls.Add(this.CAL_LastSavedTime); + this.GB_Adventure.Location = new System.Drawing.Point(3, 130); + this.GB_Adventure.Name = "GB_Adventure"; + this.GB_Adventure.Size = new System.Drawing.Size(200, 151); + this.GB_Adventure.TabIndex = 56; + this.GB_Adventure.TabStop = false; + this.GB_Adventure.Text = "Adventure Info"; + // + // L_Started + // + this.L_Started.Location = new System.Drawing.Point(3, 35); + this.L_Started.Name = "L_Started"; + this.L_Started.Size = new System.Drawing.Size(80, 20); + this.L_Started.TabIndex = 36; + this.L_Started.Text = "Game Started:"; + this.L_Started.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // CAL_AdventureStartDate + // + this.CAL_AdventureStartDate.Format = System.Windows.Forms.DateTimePickerFormat.Short; + this.CAL_AdventureStartDate.Location = new System.Drawing.Point(89, 35); + this.CAL_AdventureStartDate.MaxDate = new System.DateTime(2050, 12, 31, 0, 0, 0, 0); + this.CAL_AdventureStartDate.MinDate = new System.DateTime(1932, 1, 1, 0, 0, 0, 0); + this.CAL_AdventureStartDate.Name = "CAL_AdventureStartDate"; + this.CAL_AdventureStartDate.Size = new System.Drawing.Size(99, 20); + this.CAL_AdventureStartDate.TabIndex = 35; + this.CAL_AdventureStartDate.Value = new System.DateTime(2000, 1, 1, 0, 0, 0, 0); + // + // CAL_AdventureStartTime + // + this.CAL_AdventureStartTime.CustomFormat = "HH:mm:ss"; + this.CAL_AdventureStartTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.CAL_AdventureStartTime.Location = new System.Drawing.Point(115, 54); + this.CAL_AdventureStartTime.MaxDate = new System.DateTime(2100, 12, 31, 0, 0, 0, 0); + this.CAL_AdventureStartTime.MinDate = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); + this.CAL_AdventureStartTime.Name = "CAL_AdventureStartTime"; + this.CAL_AdventureStartTime.ShowUpDown = true; + this.CAL_AdventureStartTime.Size = new System.Drawing.Size(73, 20); + this.CAL_AdventureStartTime.TabIndex = 34; + this.CAL_AdventureStartTime.Value = new System.DateTime(2001, 1, 1, 0, 0, 0, 0); + // + // CAL_LastSavedTime + // + this.CAL_LastSavedTime.CustomFormat = "HH:mm"; + this.CAL_LastSavedTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.CAL_LastSavedTime.Location = new System.Drawing.Point(115, 129); + this.CAL_LastSavedTime.MaxDate = new System.DateTime(4095, 12, 31, 0, 0, 0, 0); + this.CAL_LastSavedTime.Name = "CAL_LastSavedTime"; + this.CAL_LastSavedTime.ShowUpDown = true; + this.CAL_LastSavedTime.Size = new System.Drawing.Size(73, 20); + this.CAL_LastSavedTime.TabIndex = 37; + this.CAL_LastSavedTime.Value = new System.DateTime(2001, 1, 1, 0, 0, 0, 0); + // + // NUD_Rank + // + this.NUD_Rank.Location = new System.Drawing.Point(134, 71); + this.NUD_Rank.Maximum = new decimal(new int[] { + 999999999, + 0, + 0, + 0}); + this.NUD_Rank.Name = "NUD_Rank"; + this.NUD_Rank.Size = new System.Drawing.Size(75, 20); + this.NUD_Rank.TabIndex = 73; + this.NUD_Rank.Value = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + // + // L_GalaxyRank + // + this.L_GalaxyRank.Location = new System.Drawing.Point(6, 69); + this.L_GalaxyRank.Name = "L_GalaxyRank"; + this.L_GalaxyRank.Size = new System.Drawing.Size(122, 20); + this.L_GalaxyRank.TabIndex = 72; + this.L_GalaxyRank.Text = "Galaxy Rank:"; + this.L_GalaxyRank.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // NUD_Satchel + // + this.NUD_Satchel.Location = new System.Drawing.Point(134, 97); + this.NUD_Satchel.Maximum = new decimal(new int[] { + 999999999, + 0, + 0, + 0}); + this.NUD_Satchel.Name = "NUD_Satchel"; + this.NUD_Satchel.Size = new System.Drawing.Size(75, 20); + this.NUD_Satchel.TabIndex = 75; + this.NUD_Satchel.Value = new decimal(new int[] { + 9999999, + 0, + 0, + 0}); + // + // L_SatchelUpgrades + // + this.L_SatchelUpgrades.Location = new System.Drawing.Point(6, 95); + this.L_SatchelUpgrades.Name = "L_SatchelUpgrades"; + this.L_SatchelUpgrades.Size = new System.Drawing.Size(122, 20); + this.L_SatchelUpgrades.TabIndex = 74; + this.L_SatchelUpgrades.Text = "Satchel Upgrades:"; + this.L_SatchelUpgrades.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // SAV_Trainer8a + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(458, 363); + this.Controls.Add(this.TC_Editor); + this.Controls.Add(this.B_Save); + this.Controls.Add(this.B_Cancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = global::PKHeX.WinForms.Properties.Resources.Icon; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SAV_Trainer8a"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Trainer Data Editor"; + this.TC_Editor.ResumeLayout(false); + this.Tab_Overview.ResumeLayout(false); + this.Tab_Overview.PerformLayout(); + this.GB_Stats.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.NUD_MeritEarned)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_MeritCurrent)).EndInit(); + this.GB_Adventure.ResumeLayout(false); + this.GB_Adventure.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Rank)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_Satchel)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button B_Cancel; + private System.Windows.Forms.Button B_Save; + private System.Windows.Forms.TextBox TB_OTName; + private System.Windows.Forms.Label L_TrainerName; + private System.Windows.Forms.MaskedTextBox MT_Money; + private System.Windows.Forms.Label L_Money; + private System.Windows.Forms.Label L_Saying5; + private System.Windows.Forms.Label L_Saying4; + private System.Windows.Forms.Label L_Saying3; + private System.Windows.Forms.Label L_Saying2; + private System.Windows.Forms.Label L_Saying1; + private System.Windows.Forms.TextBox TB_Saying5; + private System.Windows.Forms.TextBox TB_Saying4; + private System.Windows.Forms.TextBox TB_Saying3; + private System.Windows.Forms.TextBox TB_Saying2; + private System.Windows.Forms.TextBox TB_Saying1; + private System.Windows.Forms.ComboBox CB_Language; + private System.Windows.Forms.Button B_MaxCash; + private System.Windows.Forms.Label L_SuperB; + private System.Windows.Forms.Label L_NormalB; + private System.Windows.Forms.Label L_MultiB; + private System.Windows.Forms.Label L_RotationB; + private System.Windows.Forms.Label L_TriplesB; + private System.Windows.Forms.Label L_DoublesB; + private System.Windows.Forms.Label L_SinglesB; + private System.Windows.Forms.Label L_SuperC; + private System.Windows.Forms.Label L_NormalC; + private System.Windows.Forms.Label L_MultiC; + private System.Windows.Forms.Label L_RotationC; + private System.Windows.Forms.Label L_TriplesC; + 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; + private System.Windows.Forms.MaskedTextBox TB_MBRN; + private System.Windows.Forms.MaskedTextBox TB_MBTS; + private System.Windows.Forms.MaskedTextBox TB_MBTN; + private System.Windows.Forms.MaskedTextBox TB_MBDS; + private System.Windows.Forms.MaskedTextBox TB_MBDN; + private System.Windows.Forms.MaskedTextBox TB_MBSS; + private System.Windows.Forms.MaskedTextBox TB_MBSN; + private System.Windows.Forms.MaskedTextBox TB_MCMS; + private System.Windows.Forms.MaskedTextBox TB_MCMN; + private System.Windows.Forms.MaskedTextBox TB_MCRS; + private System.Windows.Forms.MaskedTextBox TB_MCRN; + private System.Windows.Forms.MaskedTextBox TB_MCTS; + private System.Windows.Forms.MaskedTextBox TB_MCTN; + private System.Windows.Forms.MaskedTextBox TB_MCDS; + private System.Windows.Forms.MaskedTextBox TB_MCDN; + private System.Windows.Forms.MaskedTextBox TB_MCSS; + private System.Windows.Forms.MaskedTextBox TB_MCSN; + private System.Windows.Forms.Label L_Seconds; + private System.Windows.Forms.Label L_Minutes; + private System.Windows.Forms.MaskedTextBox MT_Seconds; + private System.Windows.Forms.MaskedTextBox MT_Minutes; + private System.Windows.Forms.Label L_Hours; + private System.Windows.Forms.MaskedTextBox MT_Hours; + private System.Windows.Forms.Label L_LastSaved; + private System.Windows.Forms.DateTimePicker CAL_LastSavedDate; + private System.Windows.Forms.TabControl TC_Editor; + private System.Windows.Forms.TabPage Tab_Overview; + private System.Windows.Forms.GroupBox GB_Adventure; + private System.Windows.Forms.DateTimePicker CAL_AdventureStartDate; + private System.Windows.Forms.DateTimePicker CAL_AdventureStartTime; + private System.Windows.Forms.Label L_Started; + private System.Windows.Forms.DateTimePicker CAL_LastSavedTime; + private Controls.TrainerID trainerID1; + private System.Windows.Forms.GroupBox GB_Stats; + private System.Windows.Forms.NumericUpDown NUD_MeritCurrent; + private System.Windows.Forms.Label L_MeritCurrent; + private System.Windows.Forms.NumericUpDown NUD_MeritEarned; + private System.Windows.Forms.Label L_MeritEarned; + private System.Windows.Forms.NumericUpDown NUD_Satchel; + private System.Windows.Forms.Label L_SatchelUpgrades; + private System.Windows.Forms.NumericUpDown NUD_Rank; + private System.Windows.Forms.Label L_GalaxyRank; + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs new file mode 100644 index 00000000000..6f69eeac050 --- /dev/null +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs @@ -0,0 +1,125 @@ +using System; +using System.Linq; +using System.Windows.Forms; +using PKHeX.Core; + +namespace PKHeX.WinForms +{ + public partial class SAV_Trainer8a : Form + { + private readonly SaveFile Origin; + private readonly SAV8LA SAV; + + public SAV_Trainer8a(SAV8LA sav) + { + InitializeComponent(); + WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); + SAV = (SAV8LA)(Origin = sav).Clone(); + if (Main.Unicode) + TB_OTName.Font = FontUtil.GetPKXFont(); + + B_MaxCash.Click += (_, _) => MT_Money.Text = SAV.MaxMoney.ToString(); + + CB_Gender.Items.Clear(); + CB_Gender.Items.AddRange(Main.GenderSymbols.Take(2).ToArray()); // m/f depending on unicode selection + + GetComboBoxes(); + GetTextBoxes(); + } + + private void GetComboBoxes() + { + CB_Language.InitializeBinding(); + CB_Language.DataSource = GameInfo.LanguageDataSource(SAV.Generation); + } + + private void GetTextBoxes() + { + // Get Data + CB_Gender.SelectedIndex = SAV.Gender; + + // Display Data + TB_OTName.Text = SAV.OT; + trainerID1.LoadIDValues(SAV); + MT_Money.Text = SAV.Money.ToString(); + CB_Language.SelectedValue = SAV.Language; + + // Load Play Time + MT_Hours.Text = SAV.PlayedHours.ToString(); + MT_Minutes.Text = SAV.PlayedMinutes.ToString(); + MT_Seconds.Text = SAV.PlayedSeconds.ToString(); + + if (SAV.LastSaved.LastSavedDate is { } d) + CAL_LastSavedDate.Value = CAL_LastSavedTime.Value = d; + else + CAL_LastSavedDate.Enabled = CAL_LastSavedTime.Enabled = false; + + CAL_AdventureStartDate.Value = CAL_AdventureStartTime.Value = SAV.AdventureStart.Timestamp; + + NUD_MeritCurrent.Value = (uint)SAV.Blocks.GetBlockValue(SaveBlockAccessor8LA.KMeritCurrent); + NUD_MeritEarned.Value = (uint)SAV.Blocks.GetBlockValue(SaveBlockAccessor8LA.KMeritEarnedTotal); + NUD_Rank.Value = (uint)SAV.Blocks.GetBlockValue(SaveBlockAccessor8LA.KExpeditionTeamRank); + NUD_Satchel.Value = (uint)SAV.Blocks.GetBlockValue(SaveBlockAccessor8LA.KSatchelUpgrades); + } + + private void Save() + { + SaveTrainerInfo(); + } + + private void SaveTrainerInfo() + { + SAV.Gender = (byte)CB_Gender.SelectedIndex; + + SAV.Money = Util.ToUInt32(MT_Money.Text); + SAV.Language = WinFormsUtil.GetIndex(CB_Language); + SAV.OT = TB_OTName.Text; + + // Save PlayTime + SAV.PlayedHours = ushort.Parse(MT_Hours.Text); + SAV.PlayedMinutes = ushort.Parse(MT_Minutes.Text)%60; + SAV.PlayedSeconds = ushort.Parse(MT_Seconds.Text)%60; + + var advDay = CAL_AdventureStartDate.Value.Date; + SAV.AdventureStart.Timestamp = advDay.AddSeconds(CAL_AdventureStartTime.Value.TimeOfDay.TotalSeconds); + if (CAL_LastSavedDate.Enabled) + SAV.LastSaved.LastSavedDate = CAL_LastSavedDate.Value.Date.AddSeconds(CAL_LastSavedTime.Value.TimeOfDay.TotalSeconds); + + SAV.Blocks.SetBlockValue(SaveBlockAccessor8LA.KMeritCurrent, (uint)NUD_MeritCurrent.Value); + SAV.Blocks.SetBlockValue(SaveBlockAccessor8LA.KMeritEarnedTotal, (uint)NUD_MeritEarned.Value); + SAV.Blocks.SetBlockValue(SaveBlockAccessor8LA.KExpeditionTeamRank, (uint)NUD_Rank.Value); + SAV.Blocks.SetBlockValue(SaveBlockAccessor8LA.KSatchelUpgrades, (uint)NUD_Satchel.Value); + } + + private void ClickOT(object sender, MouseEventArgs e) + { + TextBox tb = sender as TextBox ?? TB_OTName; + // Special Character Form + if (ModifierKeys != Keys.Control) + return; + + var d = new TrashEditor(tb, SAV); + d.ShowDialog(); + tb.Text = d.FinalString; + } + + private void B_Cancel_Click(object sender, EventArgs e) + { + Close(); + } + + private void B_Save_Click(object sender, EventArgs e) + { + Save(); + Origin.CopyChangesFrom(SAV); + Close(); + } + + private void Change255(object sender, EventArgs e) + { + MaskedTextBox box = (MaskedTextBox)sender; + if (box.Text.Length == 0) box.Text = "0"; + if (Util.ToInt32(box.Text) > 255) box.Text = "255"; + } + } +} diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs index 43fcdc80bd5..8d50fcb11e8 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_Inventory.cs @@ -99,7 +99,9 @@ private DataGridView GetDGV(InventoryPouch pouch) var itemarr = Main.HaX ? itemlist : GetStringsForPouch(pouch.LegalItems); item.Items.AddRange(itemarr); - dgv.Rows.Add(pouch.Items.Length); + var items = pouch.Items; + if (items.Length != 0) + dgv.Rows.Add(items.Length); dgv.CancelEdit(); return dgv; diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_SimplePokedex.Designer.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_SimplePokedex.Designer.cs index 31cc5ac4e28..3003bc33d7e 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_SimplePokedex.Designer.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_SimplePokedex.Designer.cs @@ -34,7 +34,7 @@ private void InitializeComponent() this.B_CaughtAll = new System.Windows.Forms.Button(); this.B_SeenNone = new System.Windows.Forms.Button(); this.B_SeenAll = new System.Windows.Forms.Button(); - this.label2 = new System.Windows.Forms.Label(); + this.Label_Caught = new System.Windows.Forms.Label(); this.CLB_Caught = new System.Windows.Forms.CheckedListBox(); this.Label_Seen = new System.Windows.Forms.Label(); this.CLB_Seen = new System.Windows.Forms.CheckedListBox(); @@ -100,14 +100,14 @@ private void InitializeComponent() this.B_SeenAll.UseVisualStyleBackColor = true; this.B_SeenAll.Click += new System.EventHandler(this.B_SeenAll_Click); // - // label2 + // Label_Caught // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(151, 13); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(44, 13); - this.label2.TabIndex = 13; - this.label2.Text = "Caught:"; + this.Label_Caught.AutoSize = true; + this.Label_Caught.Location = new System.Drawing.Point(151, 13); + this.Label_Caught.Name = "Label_Caught"; + this.Label_Caught.Size = new System.Drawing.Size(44, 13); + this.Label_Caught.TabIndex = 13; + this.Label_Caught.Text = "Caught:"; // // CLB_Caught // @@ -147,7 +147,7 @@ private void InitializeComponent() this.Controls.Add(this.B_CaughtAll); this.Controls.Add(this.B_SeenNone); this.Controls.Add(this.B_SeenAll); - this.Controls.Add(this.label2); + this.Controls.Add(this.Label_Caught); this.Controls.Add(this.CLB_Caught); this.Controls.Add(this.Label_Seen); this.Controls.Add(this.CLB_Seen); @@ -170,7 +170,7 @@ private void InitializeComponent() private System.Windows.Forms.Button B_CaughtAll; private System.Windows.Forms.Button B_SeenNone; private System.Windows.Forms.Button B_SeenAll; - private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label Label_Caught; private System.Windows.Forms.CheckedListBox CLB_Caught; private System.Windows.Forms.Label Label_Seen; private System.Windows.Forms.CheckedListBox CLB_Seen; diff --git a/PKHeX.WinForms/Util/DevUtil.cs b/PKHeX.WinForms/Util/DevUtil.cs index 6cab0f106b9..cfed19aec79 100644 --- a/PKHeX.WinForms/Util/DevUtil.cs +++ b/PKHeX.WinForms/Util/DevUtil.cs @@ -91,15 +91,16 @@ private static void UpdateTranslations() nameof(SplashScreen), "Gender=", // editor gender labels "BTN_Shinytize", // ☆ - "Main.L_SizeH", // height rating - "Main.L_SizeW", // weight rating - "Main.B_Box", // << and >> arrows - "Main.L_Characteristic=", // Characterstic (dynamic) - "Main.L_Potential", // ★☆☆☆ IV judge evaluation - "SAV_HoneyTree.L_Tree0", // dynamic, don't bother - "SAV_Misc3.BTN_Symbol", // symbols should stay as their current character - "SAV_GameSelect.L_Prompt", // prompt text (dynamic) - "SAV_BlockDump8.L_BlockName", // Block name (dynamic) + $"{nameof(Main)}.L_SizeH", // height rating + $"{nameof(Main)}.L_SizeW", // weight rating + $"{nameof(Main)}.B_Box", // << and >> arrows + $"{nameof(Main)}.L_Characteristic=", // Characterstic (dynamic) + $"{nameof(Main)}.L_Potential", // ★☆☆☆ IV judge evaluation + $"{nameof(SAV_HoneyTree)}.L_Tree0", // dynamic, don't bother + $"{nameof(SAV_Misc3)}.BTN_Symbol", // symbols should stay as their current character + $"{nameof(SAV_GameSelect)}.L_Prompt", // prompt text (dynamic) + $"{nameof(SAV_BlockDump8)}.L_BlockName", // Block name (dynamic) + $"{nameof(SAV_PokedexResearchEditorLA)}.L_", // Dynamic label }; private static readonly string[] PurgeBanlist = @@ -142,12 +143,15 @@ private static string GetFileLocationInText(string fileType, string dir, string private static string GetResourcePath(params string[] subdir) { var path = Application.StartupPath; - const string projname = "PKHeX\\"; - var pos = path.LastIndexOf(projname, StringComparison.Ordinal); - var str = path[..(pos + projname.Length)]; - var coreFolder = Path.Combine(str, Path.Combine(subdir)); - - return coreFolder; + while (true) + { + var parent = Directory.GetParent(path); + if (parent is null) + throw new DirectoryNotFoundException(); + path = parent.FullName; + if (path.EndsWith("HeX")) + return Path.Combine(path, Path.Combine(subdir)); + } } } } diff --git a/PKHeX.WinForms/Util/WinFormsUtil.cs b/PKHeX.WinForms/Util/WinFormsUtil.cs index 5823971e88e..eb99a50f5c0 100644 --- a/PKHeX.WinForms/Util/WinFormsUtil.cs +++ b/PKHeX.WinForms/Util/WinFormsUtil.cs @@ -440,9 +440,9 @@ public static bool ExportMGDialog(DataMysteryGift gift, GameVersion origin) 7 => GameVersion.GG.Contains(origin) ? "Beluga Gift Record|*.wr7" + all : "Gen7 Mystery Gift|*.wc7;*.wc7full" + all, - 8 => GameVersion.BDSP.Contains(origin) - ? "BD/SP Gift|*.wb8" + all - : "Gen8 Mystery Gift|*.wc8" + all, + 8 when GameVersion.BDSP.Contains(origin) => "BD/SP Gift|*.wb8" + all, + 8 when GameVersion.PLA.Contains(origin) => "Legends: Arceus Gift|*.wa8" + all, + 8 => "Gen8 Mystery Gift|*.wc8" + all, _ => string.Empty, }; diff --git a/README.md b/README.md index ae90570da80..c5cf83c20c5 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ PKHeX expects save files that are not encrypted with console-specific keys. Use ## Screenshots -![Main Window](https://i.imgur.com/WDm7lwt.png) +![Main Window](https://i.imgur.com/RBcUanJ.png) ## Building -PKHeX is a Windows Forms application which requires [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137), with experimental support for [.NET 5.0](https://dotnet.microsoft.com/download/dotnet/5.0). +PKHeX is a Windows Forms application which requires [.NET Framework v4.6](https://www.microsoft.com/en-us/download/details.aspx?id=48137), with experimental support for [.NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0). The executable can be built with any compiler that supports C# 10.