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.