From 4c280c4c6d6e09f6bb42dec770e56bf7f8834d94 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:20:56 -0800 Subject: [PATCH 01/17] Add BinLinkerAccessor for better startup perf Read without splitting the arrays by using span instead. --- PKHeX.Core/Legality/Areas/EncounterArea1.cs | 4 +- PKHeX.Core/Legality/Areas/EncounterArea2.cs | 4 +- PKHeX.Core/Legality/Areas/EncounterArea3.cs | 8 +- PKHeX.Core/Legality/Areas/EncounterArea4.cs | 4 +- PKHeX.Core/Legality/Areas/EncounterArea5.cs | 4 +- PKHeX.Core/Legality/Areas/EncounterArea6AO.cs | 4 +- PKHeX.Core/Legality/Areas/EncounterArea6XY.cs | 7 +- PKHeX.Core/Legality/Areas/EncounterArea7.cs | 4 +- PKHeX.Core/Legality/Areas/EncounterArea7b.cs | 4 +- PKHeX.Core/Legality/Areas/EncounterArea7g.cs | 2 +- PKHeX.Core/Legality/Areas/EncounterArea8.cs | 6 +- PKHeX.Core/Legality/Areas/EncounterArea8a.cs | 93 ++++++++++++++++++ PKHeX.Core/Legality/Areas/EncounterArea8b.cs | 46 ++++----- PKHeX.Core/Legality/Areas/EncounterArea8g.cs | 2 +- PKHeX.Core/Legality/BinLinkerAccessor.cs | 50 ++++++++++ .../Legality/Encounters/Data/EncounterUtil.cs | 2 + .../Legality/Encounters/Data/Encounters1.cs | 14 ++- .../Legality/Encounters/Data/Encounters2.cs | 8 +- .../Legality/Encounters/Data/Encounters3.cs | 17 ++-- .../Legality/Encounters/Data/Encounters4.cs | 1 - .../Legality/Encounters/Data/Encounters5.cs | 1 - .../Legality/Encounters/Data/Encounters6.cs | 1 - .../Legality/Encounters/Data/Encounters7.cs | 1 - .../Legality/Encounters/Data/Encounters7b.cs | 1 - .../Legality/Encounters/Data/Encounters8.cs | 1 - .../Legality/Encounters/Data/Encounters8b.cs | 10 +- .../Legality/Encounters/Data/EncountersGO.cs | 15 +-- .../Evolutions/EvolutionSets/EvolutionSet6.cs | 4 +- .../Evolutions/EvolutionSets/EvolutionSet7.cs | 4 +- ...nd_bd.pkl => encounter_bd_underground.pkl} | Bin ...nd_sp.pkl => encounter_sp_underground.pkl} | Bin 31 files changed, 224 insertions(+), 98 deletions(-) create mode 100644 PKHeX.Core/Legality/Areas/EncounterArea8a.cs create mode 100644 PKHeX.Core/Legality/BinLinkerAccessor.cs rename PKHeX.Core/Resources/legality/wild/Gen8/{underground_bd.pkl => encounter_bd_underground.pkl} (100%) rename PKHeX.Core/Resources/legality/wild/Gen8/{underground_sp.pkl => encounter_sp_underground.pkl} (100%) 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/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/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/Encounters8b.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters8b.cs index 3fc57a692ca..ada6fbe20ef 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/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/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/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 From 752ddc1a88cdae903c3bc2c9ddbf8f6397d2eb90 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:22:33 -0800 Subject: [PATCH 02/17] Move SWSH save abstractions to subfolder --- PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Box8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/BoxLayout8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Daycare8.cs | 0 .../Saves/Substructures/Gen8/{ => SWSH}/FashionUnlock8.cs | 0 .../Substructures/Gen8/{ => SWSH}/FieldMoveModelSave8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Fused8.cs | 0 .../Saves/Substructures/Gen8/{ => SWSH}/HallOfFameTime8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Misc8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/MyItem8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/MyStatus8.cs | 2 +- PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Party8.cs | 4 ++-- PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/PlayTime8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/PouchSize8.cs | 0 .../Saves/Substructures/Gen8/{ => SWSH}/RaidSpawnList8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Record8.cs | 0 PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/RentalTeam8.cs | 0 .../Saves/Substructures/Gen8/{ => SWSH}/TeamIndexes8.cs | 0 .../Saves/Substructures/Gen8/{ => SWSH}/TitleScreen8.cs | 0 .../Saves/Substructures/Gen8/{ => SWSH}/TrainerCard8.cs | 0 19 files changed, 3 insertions(+), 3 deletions(-) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Box8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/BoxLayout8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Daycare8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/FashionUnlock8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/FieldMoveModelSave8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Fused8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/HallOfFameTime8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Misc8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/MyItem8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/MyStatus8.cs (98%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Party8.cs (75%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/PlayTime8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/PouchSize8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/RaidSpawnList8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/Record8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/RentalTeam8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/TeamIndexes8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/TitleScreen8.cs (100%) rename PKHeX.Core/Saves/Substructures/Gen8/{ => SWSH}/TrainerCard8.cs (100%) 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 From e577f180138ee151b22dcee3544c91f21e296311 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:23:35 -0800 Subject: [PATCH 03/17] Add new sprite pictures Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> --- .../Properties/Resources.Designer.cs | 768 +++++++++++++++++- .../Properties/Resources.resx | 225 +++++ .../Legends Arceus Shiny Sprites/b_100-1s.png | Bin 0 -> 4597 bytes .../Legends Arceus Shiny Sprites/b_101-1s.png | Bin 0 -> 4503 bytes .../Legends Arceus Shiny Sprites/b_157-1s.png | Bin 0 -> 4482 bytes .../Legends Arceus Shiny Sprites/b_211-1s.png | Bin 0 -> 4596 bytes .../Legends Arceus Shiny Sprites/b_215-1s.png | Bin 0 -> 4707 bytes .../Legends Arceus Shiny Sprites/b_483-1s.png | Bin 0 -> 4655 bytes .../Legends Arceus Shiny Sprites/b_484-1s.png | Bin 0 -> 4714 bytes .../b_493-18s.png | Bin 0 -> 4783 bytes .../Legends Arceus Shiny Sprites/b_503-1s.png | Bin 0 -> 5209 bytes .../Legends Arceus Shiny Sprites/b_549-1s.png | Bin 0 -> 5243 bytes .../Legends Arceus Shiny Sprites/b_550-2s.png | Bin 0 -> 4924 bytes .../Legends Arceus Shiny Sprites/b_570-1s.png | Bin 0 -> 5288 bytes .../Legends Arceus Shiny Sprites/b_571-1s.png | Bin 0 -> 5667 bytes .../Legends Arceus Shiny Sprites/b_58-1s.png | Bin 0 -> 4647 bytes .../Legends Arceus Shiny Sprites/b_59-1s.png | Bin 0 -> 5214 bytes .../Legends Arceus Shiny Sprites/b_628-1s.png | Bin 0 -> 5447 bytes .../Legends Arceus Shiny Sprites/b_705-1s.png | Bin 0 -> 4473 bytes .../Legends Arceus Shiny Sprites/b_706-1s.png | Bin 0 -> 5148 bytes .../Legends Arceus Shiny Sprites/b_713-1s.png | Bin 0 -> 4871 bytes .../Legends Arceus Shiny Sprites/b_724-1s.png | Bin 0 -> 5411 bytes .../Legends Arceus Shiny Sprites/b_899s.png | Bin 0 -> 4959 bytes .../Legends Arceus Shiny Sprites/b_900s.png | Bin 0 -> 4975 bytes .../Legends Arceus Shiny Sprites/b_901s.png | Bin 0 -> 4844 bytes .../Legends Arceus Shiny Sprites/b_902-1s.png | Bin 0 -> 5039 bytes .../Legends Arceus Shiny Sprites/b_902s.png | Bin 0 -> 5261 bytes .../Legends Arceus Shiny Sprites/b_903s.png | Bin 0 -> 4714 bytes .../Legends Arceus Shiny Sprites/b_904s.png | Bin 0 -> 4880 bytes .../Legends Arceus Shiny Sprites/b_905-1s.png | Bin 0 -> 4910 bytes .../Legends Arceus Shiny Sprites/b_905s.png | Bin 0 -> 5586 bytes .../img/Legends Arceus Sprites/b_100-1.png | Bin 0 -> 4630 bytes .../img/Legends Arceus Sprites/b_101-1.png | Bin 0 -> 4542 bytes .../img/Legends Arceus Sprites/b_101-2.png | Bin 0 -> 4023 bytes .../img/Legends Arceus Sprites/b_157-1.png | Bin 0 -> 4496 bytes .../img/Legends Arceus Sprites/b_211-1.png | Bin 0 -> 4739 bytes .../img/Legends Arceus Sprites/b_215-1.png | Bin 0 -> 4757 bytes .../img/Legends Arceus Sprites/b_483-1.png | Bin 0 -> 4680 bytes .../img/Legends Arceus Sprites/b_484-1.png | Bin 0 -> 4772 bytes .../img/Legends Arceus Sprites/b_493-18.png | Bin 0 -> 4549 bytes .../img/Legends Arceus Sprites/b_503-1.png | Bin 0 -> 5198 bytes .../img/Legends Arceus Sprites/b_549-1.png | Bin 0 -> 5208 bytes .../img/Legends Arceus Sprites/b_549-2.png | Bin 0 -> 4540 bytes .../img/Legends Arceus Sprites/b_550-2.png | Bin 0 -> 4939 bytes .../img/Legends Arceus Sprites/b_570-1.png | Bin 0 -> 5314 bytes .../img/Legends Arceus Sprites/b_571-1.png | Bin 0 -> 5830 bytes .../img/Legends Arceus Sprites/b_58-1.png | Bin 0 -> 4637 bytes .../img/Legends Arceus Sprites/b_59-1.png | Bin 0 -> 5243 bytes .../img/Legends Arceus Sprites/b_59-2.png | Bin 0 -> 4694 bytes .../img/Legends Arceus Sprites/b_628-1.png | Bin 0 -> 5436 bytes .../img/Legends Arceus Sprites/b_705-1.png | Bin 0 -> 4501 bytes .../img/Legends Arceus Sprites/b_706-1.png | Bin 0 -> 5159 bytes .../img/Legends Arceus Sprites/b_713-1.png | Bin 0 -> 4789 bytes .../img/Legends Arceus Sprites/b_713-2.png | Bin 0 -> 4073 bytes .../img/Legends Arceus Sprites/b_724-1.png | Bin 0 -> 5511 bytes .../img/Legends Arceus Sprites/b_899.png | Bin 0 -> 4855 bytes .../img/Legends Arceus Sprites/b_900-1.png | Bin 0 -> 4635 bytes .../img/Legends Arceus Sprites/b_900.png | Bin 0 -> 5084 bytes .../img/Legends Arceus Sprites/b_901.png | Bin 0 -> 4840 bytes .../img/Legends Arceus Sprites/b_902-1.png | Bin 0 -> 5107 bytes .../img/Legends Arceus Sprites/b_902.png | Bin 0 -> 5196 bytes .../img/Legends Arceus Sprites/b_903.png | Bin 0 -> 4727 bytes .../img/Legends Arceus Sprites/b_904.png | Bin 0 -> 5018 bytes .../img/Legends Arceus Sprites/b_905-1.png | Bin 0 -> 4918 bytes .../img/Legends Arceus Sprites/b_905.png | Bin 0 -> 5548 bytes .../img/Pokemon Sprite Overlays/alpha.png | Bin 0 -> 1044 bytes .../Resources/img/ball/_ball27.png | Bin 0 -> 1329 bytes .../Resources/img/ball/_ball28.png | Bin 0 -> 1291 bytes .../Resources/img/ball/_ball29.png | Bin 0 -> 1346 bytes .../Resources/img/ball/_ball30.png | Bin 0 -> 1360 bytes .../Resources/img/ball/_ball31.png | Bin 0 -> 1345 bytes .../Resources/img/ball/_ball32.png | Bin 0 -> 1374 bytes .../Resources/img/ball/_ball33.png | Bin 0 -> 1419 bytes .../Resources/img/ball/_ball34.png | Bin 0 -> 1188 bytes .../Resources/img/ball/_ball35.png | Bin 0 -> 1203 bytes .../Resources/img/ball/_ball36.png | Bin 0 -> 1449 bytes .../Resources/img/ball/_ball37.png | Bin 0 -> 1259 bytes 77 files changed, 984 insertions(+), 9 deletions(-) create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_100-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_101-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_157-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_211-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_215-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_483-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_484-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_493-18s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_503-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_549-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_550-2s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_570-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_571-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_58-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_59-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_628-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_705-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_706-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_713-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_724-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_899s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_900s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_901s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_902s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_903s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_904s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905-1s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Shiny Sprites/b_905s.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_100-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_101-2.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_157-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_211-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_215-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_483-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_484-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_493-18.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_503-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_549-2.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_550-2.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_570-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_571-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_58-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_59-2.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_628-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_705-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_706-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_713-2.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_724-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_899.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_900.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_901.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_902.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_903.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_904.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905-1.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Legends Arceus Sprites/b_905.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/Pokemon Sprite Overlays/alpha.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball27.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball28.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball29.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball30.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball31.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball32.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball33.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball34.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball35.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball36.png create mode 100644 PKHeX.Drawing.PokeSprite/Resources/img/ball/_ball37.png 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 0000000000000000000000000000000000000000..c6a5cf8e348bd65b1d0787381e6c3a8895f4a485 GIT binary patch literal 4597 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY4#NNd4#NS*Z>VGd000McNliru<^dBH0VmhL z*cJc)5adZjK~!ko?V5XxT~~F+e|zt9&VA3FS3Khx+cSQ|F}6vZ#32rDnt(`RaB))d zBq1UJDu`4SXoH|Yqk^a^RYy z?(3YhAN}K;duJR~jh##!px!e_=gd9x$6nuEYkl8ZYr}}k)~jFQjo!fjvgD07 zZtPrr@v^@D-rgRiyowCufsZ}-H>dw!0dn&#n|fBQ99)~tdN+E$f3-7qnThER!?;$h zM=!*&empkOk3HW#|L|A8qknG!x&Pi<2l^NH+$>e_UV(U1RIit7^@xTx80~P@AuTu@ zR@oEQiXR&-zF~E=^O5g<&-~s1a_?PRdX_I;a)%cL@2`i^r86^izut&3+G3rl}bM>EN5zxi3HZ=%Yiw(|~wh$^YmBcf6y$T>SGeir;p+QdhNlh|yr3!@9W} z69_T;Ja;(+&benDe12?l@+bfK*kkUTHuBp5$W5EB?OuQR+K>3c|I^8-O3zHSfz}pd z6ORx=q#y{S6bJ-}CMaT#hos(MT`&8!z zj1S$lVqss;KUAuXTSrDut0**RJD^u#37Gt=aYC9;_uL6AXtO+aL8JB31lTsAw)EQx>2GEDRCTq4$N z@@%c8R;^O4RuG97{(Y?ECm#9Mx6dh`$aDGU|7+cI$GiI$^sf}zdn}Q%< zHd)SIO?;5E;55N=2_JjDPkVbixm>Q>Sa<)XcWus`cR=pH@7BRg#=m27az+`GNN*t% z1Dtb6De?Ubg<=~zj+4YHXaQ4hYa^S@BnC>EfYB6XbAMXkaHhv_X6#ETC>HW`barkY zSiI=U^A5<$WsBcFdg}C=YAwVy16?FiT*-t^1K*>wvlHhWaTK?_sIA;aCYwo^rx^y& z(i=jG#91UwCOPwx$>nI$kW2E56G$n$l~OmKi!HA?sowg>?<%wvbKlEJkY%9oUZrdU_Yqzo?&Lp_sCVOMeBX z@fewcApqt12*6r{H5QW=h``>yzP`<${p@Fl&&HnDtV1gG`kH+&9K8C-u@g8Phkt#9 zEq`Hp#+Z~x5=zy^v1jjIcJ1DSF&gI_ zVpgmtHBSmmLgA8pF2^OSRx&s^NU>N-Ky%=n#X7q>ilQrk$Ic5NLq|`%eRO23R|tW# zj%7;+*t~f&OP5{D?%jLYvwJVT?-K+8`9gukOO~LNq*krc2t#lJ<1`?!#({^z_o%-a!!fI6x@{2*M~#6swfzIHq2&GczFF;j_SvpjYweu#3xzy)-gzs_mM^DNDzoyEOE|Fq0G{&jeV=SLOD>niS&Nbi zPkNvX;E3axpZ)CTJhOcp#u%=>_F6vt;g8U_un*7oaE?U00Z|;MJ8;Bt#Q69)TeoiI zXFuJ+p@RpRnwp}2(Gs$m3^+%%T3z$s&poHsU3S?kHk4jdE%VDmhg^H9w9iv&zs0S% zbnTmZZomCKl-s+==JFH@C5Db4r_rcW$QLM=+h}iZM+iY2CyBMGHh1jU!S-ji;`b$==T19(%J8f+x+S*Fw^Lg_5JjG&>LZLuDpQlhL(An9^>eXvlv}g$#samt5*N;ZP#71X8l#`$>vIA zG8uBY93VJ({5bhyk?yW8y1P4Z&Juy>~YP#n8{&)BN;uq7eWY4_N z?&#>L&RjOTblI{&JmsU*Y$ZB4FhIFnCYuRp?h9Jo(g<_@2*( z4c9O;GtJPkV`MVfIbeu0j87_I(Ylff*&_%7dV71gj1jE;=3WBYaqp6u^&SlMuhd68U zp06^#@25=H+`OS!ETDDF`1m-!@3V8~PBKBj(xpq;xN#%>eG9q!?zm?R0f@0dUPV*PxV#*7{{e^Rl~bfnZGY z?*znpt;VU*(Pm9psn_e3^9INzD;A6CN?nYOO(4~A4(xxNd_G5Ce;@4~-E4a2J1Lb) zJiB8Dl}fb*igQU{)mleqXD9Ew=N^_04zgv-7NRI>(Q>P;?4TJcO}RhoK}iG27=zY^ z@rg;Mrl+yi;`_l!e}DfgGR(XIvT)%=F(YI8sVBD)M~36aPms;#DHQYgL56kf*0E{R zO^l3;Qms_5*5LU80QE*4twSKgJ8rmvtFL|wMr%e#M^l*&Qb__ozz;Gc-S$}!X7h`~ zT7%Y_I5rFqj}V3-)>^dINAJG-?wN-kdg%NBQf%DAow6FjiA*G&QtyXD-4Ybx6ZP2ksTa$P|YV3yt3NTpfh@yykz0SnM7$;7gWa!v2ToPK1d_MpD+1fHMfP`^8oz0gfy+A>oB$l7|!A@|z>{ zF6`yvl^3&M!2)KcXBa*?%;@L{lM@qEYBl0GMjMR~_Qg`E_}qB~WZ&~ArvBi{zWwz| zVZ*`cdfGNLXrqx@f^2rTn3MQ4vG3t~eoKbWeP@h0Lw7VU0Btl!j~->{_z=ZHk+2aG zH5wRev1v{*N$$W}^W>*L{owJ3AO6Sl2gu2hUqz+tWd}BGSjh5=Jbu1^oYBdUFp87J z2dy?>(d&oO&hr`1Twlsd zE?rUL@>QLLMo|eB<5MxGCL>NwhD^>F>Y*jlj#wMwIB7OJXt}(#F8#Kdb5>*)5J=yp ztw+%uZ76{f0*N|3Q;YxUiKm{fy&-`7@JEl2zjf_h|5fake>h{c6jBfb;QNw=U0M1U z6p&J3oj@BwY@iVt>J7{I_zW|Z5S7hgoFs}gS{q{Rh+;#eEm8G z2|UPV6oDu31sG%h_17nBPe1Y0x!EzVv)x}0P5ehsspC(=dNin{Lll!jPe?BjV#2h_ z_pC3;XFOb+pts9sW?~9!9i?&}KM2xr5D7)6ZXysZ4{A1)o5iqo2|M8&(y>2~;!C%G z^y`gtwP9YT|GW21k8QkS$-;cbduwg#G&qOnDMVVvi#fGOQ%E_ReC7o{VHh(tF^$#+ zsk~N#b=F~;g$0s+w_sdVb8XM+$`hO}ubY$w0^6K)Itmm(s zoUCH4r9(*kjKe91^gM*L2%(Z;i?OYNRH2kZDZ$KCm0GP%sa!&NX-`BX4CQRI1D{Yh z=`k#03>LJI>Ptq-@4s3L=KXxg-u*9)Uisz~URz$h%@0soC;31riE9n2NtwW;=gMaF zhVlfS?-4d4s+AhbOU{K@GfSz)%ra0*vj~i}_A61Szp&}PhhMRGdfos5To82rroXqa zHt_9AB^}0S8jTnsTsmc&o#0zLw>WE7w}K#(49RCsCsn&t65|ZUnlr-2STNRThyDt9 z4{iS7*UqY{J)eMZ_~=k&>9YRej$-y5R>y6gO5CDasbO@ISX&|BXyt~v4It|r%1;`4 z(~}jVMuhMrG{eKB1szN}#1|d<3-9{CKffk0UN=Ah_Pj7Xw0`Z9IPkenM-AUo0zXiM zjfi?ZM5?5HZs(}cW^csK5m!=4JYNwuLaI|$;xI%=hqexF+ACB&6sBN9@8A1EA_S~Y16kPfPwbULdt6B@PFCa3B$3aKPf0?cWo zd_;KOU)=J*x1N0DhkNXNZTodSboZNMC!=Cp&#rPuzEdi>E)E+43_=Q&ghsVNb*7d` zazqOVYZK`{7Zhs^PMS#-ct5h*eP-;)sjuAkxyMe<_nyzoIo0d0yK2F;moE6LJmI~{ z)ysj>WHKI^z{5IA6vn6^px9O<@Pp)RiA+uc;HU{94-3K5Nc(Tjx}V?nXFoV6IsRJ* z2*7)8*pPek@{X%~8rKq^UYp6N#o4Ui>-nxArSQVoAW^!I%~xbbO?r9%7>*Z!p9+E( zoKq+6`NY4>TWGxDfXrQA_}~@3*7Z`Mm@gIE%f)=56nLJGjzT>#G&JpGT+1!UO+WD0 zyI%8A?F;L|y0Bi?^*>VH$K7zhQuF`-03~!qSaf7zbY(hYa%Ew3WdJfTGBPbNF)cAU zR5CI;FflqaHY+eNIxsLST*9^h001R)MObuXVRU6WZEs|0W_bWIFfuYNFflDLIaD$+ fIx#UiH8v|SFgh?W=PJO100000NkvXXu0mjfEL6}z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cbe90696ca32465a33e6672c4b74954574c68be4 GIT binary patch literal 4503 zcmV;I5oqp-P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d2055a7e77e4a588d8d80da77abeb15f00e83de9 GIT binary patch literal 4482 zcmV-|5q<87P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY4#NNd4#NS*Z>VGd000McNliru<^dBH0VmhL z*cJc)5OGOFK~!ko?V5Y6XH|8_KYQ=`p)G7i+n2TC-c zwontBHpbRii%nxetxdGHvDF%+Ce;{CW79uSW5rq(iAJG{RHMMaJa`Svd*fR=r;@5%3(v%bHzzU#Zz+VIkPX}z?b$1*SU4Vg547(f+c6latKvk&EKh~z@j981sohm z9A7Y&JHGWVx9DryuIj4_}F z3>YI-$e>kfSQNn$jYEw=F{m+MEEtP124iaept>4sFxJBSYgI5AqY&e`#&TOACe!C!{-eFS z?(;8JK+JpI`;P6ci47ln?8wNaB7!rDViB9v7Mr2P7-O&otTh-ETR91~2EiI|wtA1T z22fBze2K&|HP*a*;*2Tt+8f_;{}1o^>M3WTUkM=Ru9|KxKku^NIcwdfkM5b9+SDHe z5)0S_1RdN%9dlGCsbw)ibl} zE_>?(yB_$`DT%sdp}|J=H`VxtrP!@zlM_OdTaM{1!pA4jq+x0~%3PqAD>4q$r>)Fd<-Kpg(sQ2?HAAQzZEq zE=g{7qF({N`+RIzNK!Rtt~lq0fw-GiuUh7k#p~!53f5t40(E#)*~C<0%TyYpLPY1m zP?dSkKq|hFC|Dy*HI#|elWD<-i;QLwXCnPUn?d^s(w`$1J+v&E;#;iQaQQc$-0{Pc zmiPB9q_e0GMS-A2m>(j0xQb=hwLKRE3k5_^4}JZqVp zJ-uSn^0gbzdS(`kbGRhIB@Sy(&>F+^TBlEAgdu0BO63(QXjGO@8s2(!#x2`(E?(o9 zY(z3UppkmU8Zer}WD`~|HEcX5W7S!feyJRti>Ss?BgK)udv<*Lv;z`A5AT2GiR<5T zOS4rb+mH0DbuOs@ajq6sLqIBBG0zj!8Kfpp6CDr*S~1GV%*^cO7X*-VHf)?OO@5w_S`(=y zaTZf+jjAXcimf_Ch72oJY5#_;Ik#*dVRS?YAu^PzO4TzFsQ?nGGEvRZH4iIMBBIsn zlg$eI!N6}kG*_GyJuE07HXXgJH89Im!CH%R7VB!y06>oG4~ZD0uF)c>@VlE5Zn`QZ zO(G%2y4G_XHmVwb}G1KJkf(ld)kTg;_E_ zIkkCqUmTg|4p(W9iZKKul^j=%=&(c+MMQYn`HtWF?TkE$lpz2H>l|rf@jkNe@PMcG z7qmJh<0FwXMuqWQFeVaXs5vGgu>$w-tnlEjh>y@4gtK=%x_cb>KO5Bx2FUfVSeA7Q zUD7M1mgRQ7sWBwaDxaJXE>VavvSHeC%l3@129!l0N+i!ST#~T!nZVcXZ*$+nvmBV| z(d!o^QnGAxz(s2u+b&62u>@j>s6;xwz>gj&_@AADXOAe>Dupk`vot@w9RGdrPN!hw!faF<9zck@Q zLLD}F&??TQCPPs{Vqj4d-nK1e?b#OZ10i@~EHTLxpTDQizkcTsy~F!h5{~k^tG9CP z%eJuY+!c(CHt4q=rG0QW{XY0IA~6tyCvzpQyu{P)!m&1>%2ZR_;!%H6e7RtN*d#Mi zjjign`maJ`p7pB?QN?+lC^x=5W79c~5F#-IR02ub;LG1{^Od`wVEW)LUU9)PwvVQ) zy75(vuUt*=o?f@jpuGq02bDmJfe-@GS2|_&l9HQV;d$gqOS@+{cZr4-%jU|{3W&)X zHW-^KI$yxKI?d`l^H&-oF~SX(Cv3aK5k-(FRZl|#k3QAn=%L8FwpbQF;W5plG{+|i z(q``1`U9a1XunG=DVwmArk7<9KFp~Q>f*wJqw zN2*4U#1a*u7!;IcLG&ddL?i@a2$jSy1Ya1+QX$C?p0#R2`?Lb$Lz1pLJI}^<2y=a4 zKATivgeYWAxqeH+^;;dOqf(r)PMa~HG1AB!F$5xkm?^=6#6USXhQvDbqTtJtvaC2q z>adBS>Yn*B;!DK`OId;u*?;-9Z|=a~oIXGXV(hug7}>Zw=f1~0Dq8CTAqHXTq~V6G zDOX)+t5HN<+7CS>#(;z%5J9-0U3PR*NJ}aL#~KgdBs%4+6zNh`}Oa@E&|HMbnM^ z=w$6!I1lOd3SWlq1uI6l{mo5w?~9D)!m>$ae8g8_6SUSKCp3#=?d~xWf+zU0Qk$YR z7K)FNVo=bTYte1DuntrL-XG_UK@EmPM~vXTQu>HX^IeUp6%U-O9Sc^=%(i+(QG{L; zW!WOj)f*j`tg%duN*xMu-V2Ub`RO{_<_(bq$MIi%@47v zFRDy41VHAiRqsoDQBd@I3y|2E;PFL4S(cPVpy&%l zp_IW;=0B`4Cq1-UFhCxD=&>Src``hsTEyl8Yw2xV2Uc~6XyEYGmk(&@B#`iY%9v1=Ezhi6EVj7GBw zRw&CZopy_(M_cUMA2@V4rPCk5xF(H}Q5wxABaH@Go|9%7d7hJ}DOsA3rj8_WB+g(g zk3hWjQ(t^=|MRtBK__=V+p)9r&2Rqn&SsvhTe5g$n-9M7k{B8E`|RJhm#25_rrT+g zH*@l4O26pFPH&EGM_sS)=#?3z&xsL?)#IlD>UP3#$aTEeQXiQZzSl}iqy6y5KmXvv zr((l`ABXtf4<0()$dVtAjgBM|{K|dL9?TwlXy?rCM|Sofe{5H1x7!0Db~~NcGyC?> zeecO<^`5M;emQ1psw}A|e3ryk=Ruq^IBQ5;)qzXuPF$Kevec0!2}x32oihQWe{WO! z>H8ksE2nb*zp^7$n=d?X>bk4eY&mjtcE#g65A0uh_E{QDCzBXN27b^gvLlZ@qx-gB zbLq8f*PQj~LASfu`a=X?5bNH_{8@-$qiHw>9d28JWsJqDiE8vyrHi-!?H%`?R3Ud- z0eQ|^|6#+U9|Xd4^uWazZyvw#`pfPxm_OKmIM8%+VhAb`GxDz+kTNSvR7Vu?$$-4a&5coDSb+RkTE@xk~@Ql zMW}~Yb&uu5LAe>8M-w*#d=kt*+A0IR1wc_!5msyfIzKi{#&%vxjavetb3FF*P9Q_3bUHbC6e*yxq1^~)`R zEVTp+d2l2)<;i1kq?53AiD&s_z$I1W7{d(8J)oae)q8LK*ngf>kK;uT$i}ssv&G|j zNosxKjA0}LO@uO0QnjSU&@L=L-#5asUg)h~TJCA2d^d`G$yoElTR-;o=OxEq^njeZ z@{BAs{Xu4uC%`runIz4ox~JPQq(R$G^nkVTX(4@h?`;0##FYbM zdO(aZZD02PN@;#{q&YU0WO=q~x?zs>W7%)Dy6sMPF3(N-J9q!P2YB8E$xG{{_0l?B z>wf`{M?^qQB06jU001R)MObuXVRU6WV{&C-bY%cCFfuYNFflDLIaD$-IxsOhGd3$Q zFgh?WEL_620000bbVXQnWMOn=I&E)cX=Zrk07*qoM6N<$f*Koa=Kufz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d22be001192dc33b1adaee3de22b033b7ab64765 GIT binary patch literal 4596 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3fbb502f4819bf44e9bf35f85471296292998d9e GIT binary patch literal 4714 zcmV-w5|!004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9decad2aa7fbb9bd685dfdb4f1f8f05357f07b46 GIT binary patch literal 4783 zcmV;g5>V}lP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 JPDHLkV1j$)K?(o> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c738b775e1866a2348885c7560499d065de33436 GIT binary patch literal 5209 zcmY*dcTm$!wEcw=LN$brlz@Pt8hVF>1c6AGu1JR%J3D9g+_{PRx*D`p>{I{%&}wO74X+S;6><>pf3t%J zkSic_LhGObpzaCvnGN~X8g8d)r~?3x1OOl+1_1tDr6Se=zz+!ko7MoJkPQGVo-bPr zl&&_wws$oCJMe0pU|PekfYMXb+y?;Yy8jDMug4qvt0aZ5mX12bFAxJW=;rjt8D;=r z(A2`Bjqpp`xj|`*#+khzkCv7Xr^0HR{w(E{ykk&EB0wK z_+^FZ?qu-p#ZLRH;2n8FesDy<8fTEkMfy*tYZnPhfBW>dzfP(uE&@vkCy@sWbK~QG zs;R}~2%mC&H&<#Fm1k9*F28Jm_ilR?jq5rpaMve1t
2Nq}n!mFk)a+ht=8^*#} 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 BF?0X` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ff1e698a840e572c24fd793ebe06c23fb5ba0a2d GIT binary patch literal 4924 zcmV-C6T|F@P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 JPDHLkV1f$`_ksWb literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d72f781b9c45cd8dd3fb9ec9d9f95524556e6357 GIT binary patch literal 4647 zcmV+?64>pDP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7417af7edd02472f91ba85f961de8dcf95fa2885 GIT binary patch literal 5214 zcmV-k6rt;hP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4c61fc5d84fb14b8a087160b1c677491fe66d3fe GIT binary patch literal 5447 zcmV-N6}ak&P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f03b78e85f9b55437065b8bf928ba0f119dabb2b GIT binary patch literal 4473 zcmV-<5r*!GP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..04a18a397e9e0c56e560c265b718c8afe57fb701 GIT binary patch literal 5411 zcmV+;72N8HP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 N002ovPDHLkV1gZ|b29({ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7eb01ed889890a1af5cd32bc2bbf5fdab4748e05 GIT binary patch literal 4959 zcmV-l6QJygP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..362664d35f8e1605c50db3606825b945abf84a1b GIT binary patch literal 4975 zcmV-#6OinQP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4ff417a4b58fc907f369a7b786e90c0eb44504b9 GIT binary patch literal 4844 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 FV1jHof06(I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..159b24bd24594193c507e18b7746064bc4e5413d GIT binary patch literal 5261 zcmV;86msi{P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b040f112e40c8daf57e0b84c310f9612fe000ad9 GIT binary patch literal 4880 zcmV+r6YuPaP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY4#NNd4#NS*Z>VGd000McNliru<^dBH0VmhL z*cJc)5&ua^S(gUVHC5vpaLn zc`yBN&Y2y9s;=!NgetFfJTu2fbLRP<|8x64ui=^X%z9>Bz!JZ!8$bBqPfNy7vep)a z5DLIKXQY%duyW&#H?;o010w$ApT4wn=gzD5#);Y;YrEMwhJiW|WY@$%3z!9t#W4>X z!y`)BL;LqXd;a$xkoWz?2h^iK`?#TFk3&BC>+_#O<-vamOOI~tQ@_Pr!CqDA&-LZ-9YPFh|Z`jZ``K&!Ryvp-R zL)L&p_5dL=G`cT6D?Q^JIOi}%PlEUs@I|flk8ZtnpLyB?a_<-Zakvx5cePjIKTV=& zQ>7HJZO3K`r7{8uLL#z1uKNqbc|XNDmoX)K@A6j%&S9OM5<+|l$KTz2^NlB;wt#%@ zv-jTQ`~C-o5Vyp!mT|0U)XEGF4^S+XP|`yPfsiQx&Iu48a<({!5IGP6n*rmT1Dir* zt;ITv6cG680cY)p_rK_-|9Dyf@|DkgS+b^#yvl)PL?i35zbc%IM5h7rn@GD<3( zl`OXcq_UJNmJE^f$y?~O70yAiWI&`~IBRjvVV%nWao{wyN|9!(eMW2Zu_$VP;nlBx zd333^s7w8VkAD0keluQvyAtYe1&lglvBr`l3C0+Tr6To49nbfOBad^ZYs^nqaX2dV zWR)Gj+_{jM$r?+GAxUB>mXZvV++|WQwAMsX2W<>-lvF#Nc>m(!viH)L-u9#W?)$e( z3b>a9$lZ5;LiwKkGlct?HKvYr*$+0vNrI4qq2Xal@W>{Jn*1b`&!cqlKTP%t<_1_oH?Fviksw$MpJ5^Gjg+J3v;zOmD3i|0P~`41d8 z@E!e>19I10ZxYV6UvG^4gtek!OzPW-F(g{!oTIP5pP}Jla6Z$Mbvi3Wgmm-`E>jZF?M+u3&_%9YpBuZz0O+K--!~!ASCbugp??$=xa0>92~^=J(lJQbe4+<0mX8M zzQG77(x92ARv|#jG?;<~AkhM2K}y$k8D}j*2nvM)t>zNWS)w?i-EI@dana%aYEBi7 z0ssD#GGu75&se9Agr4s^C9jBM9mcW7IjB@BTsAR5qpuIC6w9rE_Hq#~&XIF3k?m{`Z<`DT0Dz{tk` zJa**Z;!_65@#81;p+iSb4cBWAgr0X+DYe-+J6NsM*t%^Cg9C$jegIM;g+<4LzM&44 zx=!hkVbQHuWtx>%S_&Zzm3oW*;Wm(EmpuJuC9RYK<#{YEF0#0|KqrdOT9YIRlV@kf z7nfEj_ig^}%+yi)lmL>iCyt+3)*?Dst2bt^+PP!@)~(x$g9C&3L4Xhfgv9e5wT7lx zacM~=R?Bvm)nv{&{LoM+MpPSZs*N;*=B|>~_37bU>SjtQKrlbQz}&(DQ4}+`*y7lU zSz60_i@-fFJ$3Z>h1er66%c^O9z7a8?|FM`*Ic{1G%zrTQeI|EY6n6f)$02cCxMU- znX|;Duf?(20k|xzjb)rS4&~MhS7-Q0I*jkJ=7-KL-XRIQ9^7)ZJ`8>nq zFr;)$KZy(m>$=%04NYmM-08HhU0Ry)Yqi1uv+-LKAWuI2lj7&U_>~=2;8`a;5o?Ue z3=@Jv7+|bH8-sNs1;S>SNP*T8NrV!grlKm6e@s=(a30CMW|@$$YKuOCvLzz+hnHdqJR7>ss|jt(KELK}&5 zG6RLo*wi?ymsprNNf;IZf%Gc0+97^e$2o}O2&FuvkjSh!aW=~)84xxr>FLQj-B`0K z%69)fy~bjU9i5t*UOzzo^}hSVX0zF7R6|CFYV`LNsMV^J$|cI>0y>(<4@1JhM@bJU zB~s;eh#-kIt(IeIxy}5{6s2lEo%V4&uSB75lxn4fs)Esu*@ch}RXoo_V$!F~Dns(L z+s!)NH0|i7GhB`)4oec-YONO5)?(|L09jaCHj|TQe|2~zs(DIPs%5WGtrq-7EfoEI zWd;Wt1ffS51{8}W3dJHp7~pvxN(dZ+BuVhYGIMj&ctH$!EVrh3;^6&M$~8)r3Z+sJ z%>aqqN4wczV#^E&^P51>QdNisn`0db2DdHYAxXGS(J1Hfga=)VbcwvYO&?dG*>`=3A^a-Jl)EW=;CY zngF@?-Y;q3NOrL6+MS|OtQ0!YO0cwK#y4%c>@&q;|BJP)rOKA=5Vcz@oa+z-=a9{5 zv`%Bh$k=8E28O`F+)NYUdFXh7f~pf#pN&@>BnUJ{+isS?i7pUbFLAxVBjp!QPcPAIIglm%QUxbQm^$gB{8=V8 z|B`C0$%gSU3dKrRy2tbljx#%>2#R;G>)P!Ee$1&Sp;(Ub1KrcptPXEh-)B0j?dgWI z#B80xT7%UVX++B=@tQ`Xm)y%7ojezvnLK-B>*mYNWgBbiu_H4W14256$EVn~b%MUW z5eA1##8JdA50yAGsgNpWY=hvY=iiRjWsV-&!Qr24tknpLOl+S8bXPXavxtMd0m36B!>fQhkj z|N3WLb!$)vMr-AOdM%{C5wc;disvb;(LDJ?g@+y-BnUhT1&~5wjpEcv$^6_r;~NwD z2NZ+D;AqoqB^YZnFtQk7EmByjRgZ}cHAaRj6bgP;^JFs{YcN`qBoRp*V|0w~sej&i z_08XTsu;p!zc@TQH@9%8TCeQ3&QYs|nOc?#$=blNBLS1Ar)f4%BZQ?~YEY>(kjmrW zFX~k5XL$ZTgqEDiv6ZH3`Nf zXq{km92LXx;kDYbE`a>tr$1RdefrG(8^=dq38J8lNmVi-5jeCltgL7{?Kv8a8l`fD z`S}?pr;bst4&VnRjvR*Tb}v)+Lxhy{HHy?K0Xj+B1StecrQNY}E@My1io5}ISgbK< ztuvOyBw8N{ZSc@j3J9PN-2dPYwr{=S@kXO|y~*S~Cv7GVIx6Lm@v&`e7_Xr`n5hgh zb?yY#3c@gCVa{i1F{V<}NTs^X!JbwJs)Y>OlHhJTca^LK_@Xfb(!y7x$Bx! zYc*tDG*y7_9QgjPPEVfwo-tXvGdk^JtwG@E>rdaGK0U|e={e#!p0dW0C}&BpA%Mh2{GfV#m5<8Ay}B$&;t%cJAC-8XX&Y zp4G;)CJT1f5rmqFO%e6Jh<0b5W^<0#$~2Z~21n<)<+c)Awp0;Prc#Srl?QWUZMQec z*<-tz#W|a?BO-}AByndUvGHI2@tyBKbRl-E8$$q&pE%Px@ZAT#edX4PJ1gbdHe*tw zgcJxN2}8?{U5?FL6s@LD6hpBnsZ@M|&;uma*i@D77Gmd1h^Y=_yIUmEZa6K~^Hdv0 zD`=a1-C29!LTy-AKmz3#_wLzsU9D0WHCAJ7HiWRLbeL`z z7kzrbNOu9)RnaJ`+Vc9t=mcZUV-9=IYv1tKo!=QC1J!c)-n-v&+jE|C^}CA&zuIa= zSYxqHfpExdnl17ME#E66Qubsrb6S=6G;Li4Ki5;woAItnjMgMrYXH%dQhoGQuY3Q& zi?L(90P)`Qp0~bu|NcE6?eD8>SDsJ3QDXA+DI7jhNh~fid{sC~r+5M|DPZ}&vmSTp zDr0t4PRzB{RIp83eWPQv)`_+HQ&F`1wTm`n9l#JD`oKGG+V_GR{-(dLwo`dN2uWgM zoNz48ougXo1F2Fa9?qNXrZ|XSJI}9)KRF|MH4oP<>y6PkYmBw#bDd7}p4;E};fvly zv>t%C7uuvt0f`jJ)R0a^|DvJ?UJ{H zuiLiFndl)ocXZ}uOUp|iiaOD=n{$h_T1{roo#o8rBqL*^jBmUQoWxTBNYxd|MNe?; zLF7Ew=w(P6STzV9^St0=VZHLTTW@_+ydHL}`^Me>KJX7$BvJCN`RVD~XQs~$9ed&^ z?Ujg^+a1CC!hKx`?s@g=@4l#P z^1rQh>t*t_?}cwXHhpsH-R<_`YmT2d_V-7hJU(4-46td_76t}~sMYIOG^bBJ$;#4F z+MIPYjF=?R=d{wqQug57Vv^Uhc7 zf6S#Gavf8xk5>qiei#^FN;u};kHzW%1^fx)4TI9ExBQQ3Ugc9r!N;Fu5`@O-}R zoPF>$cf4;+>etf_klr;r{m9VagNLp=didbpLy!Dy*YT5+-t@xCH^R!uV|$-<-R`mB zzT2wR(k?GhVUoDBI&mj}gTPOKN3CJ<&bQuuLHos?)`0Y`u|`=05UK#GA%GMEipM%GBP?aF*-9iD=;uRFfe>$x$6J`03~!qSaf7z zbY(hiZ)9m^c>ppnGBPbNF)cAUR5CF-F)=zdI4dwPIxsM|6}#R50000004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY4#NNd4#NS*Z>VGd000McNliru<^dBH0VmhL z*cJc)5*TdOij&*t=I1~4 z&HL_q5YYeId;I|a^{@N=(=IsgtT&8}4ZosPuAFGC_471~+N-MzN9Gp3HZwQ(g@ZX3%0H~WN2u}0SBG6-*wi+O63zu=L5=U;e@~s{fT<5_Oj8z zq4TzF-5QRLPb|*N%*24b{tvD?dEc35e0p?j^c+77g%A>>G)gH{o|7aAN@?;`PpDL% zHX`M#w{D(#$IiWbu6ppm_tLTH$p`QM!H@O-bq&WXhnzG$T^$)6-W3GFuLnVJNf-pX ztL4gQtx^fE6k7bDEarLBg=Qa^kwH=x#P4`|EyH5Nze1J){>`b@u(b?=XBd$ zdfhI~l@&(oH3r5;Xtg^u7nV}J+`4%v6Cb_lp07qPNFdKLZ~OLBhQlz}UJk?kr7%1z z48t9jYItI$RvHOhAe`m!-ZOVKwr!mr7t%){u-2mT9BT|x3WN}3X-bmBEG;e4S#A<7 zEF+Vgvh?wVrv!YoWaUja-hD^)&?_T_j~9e^zKZ%H+(hf71(u&U%-qi&BTtfwl;VAXY&{Nq`T6*F+!X?d8{T>So(s-B z{~epBr!TLT2S+^-5{Llb1$fRwSP(|wET9EW1J;2upd5Lek+fstW|w%SO|sJF==>8r zp&q6iL`e976ukDvuiWv}3m(V~fA~jxuDb9QpPURfT`bd(z?ASzp$Oq5(#oP3JFw0m zoQJa(=N#5raQ#vor=-19PCNJJlhTcsR@!ySYJkv`@P&^j0z5oCAwfvAS){r2W!lYIYC~HQo`-;AYR`z5O`m$_H=lgetl81yLF0qh{qY%B?78fdCsn2| zi&y4pbq_N?|7}*54&aQzJ>6qkfiaHm>JxOkN9lGG;Wf$7kkR5+g+p^ zXEa96Vf(JPQz{Q39AGKH2uFSRd`gu|NOcWMjmE$ZJg<($A%vh_9Uu%sj4^1X$W%r* z?a*T$Tb3|TVMK1kBN)p)b@_Ag_n0Qt%0Q|7)j$3GjXN7V-{t90Q1VzIfucZRf;hXr%NamQ7w-Xh7E)-@V%lZv94&`I_(xKOGnAd4={AnEXl(! zAzF0wjx2I8yPt)|k^3jk+4{QR2p{7N2FYr>O}m#+X`F^1 z)Sl@%j5R1#W?^BOBS#lmYR+)9`7@kwq?+0jO&_>Z(ZPMz^GIquSwMmP%0wFwt zYK#m)1RgRhGch>H#tq|VtTda!T6{j1Arp*kDDRP>DWeMXmHJi)$2np0BBr-rjqinh zbrfZ0cm@5@GexI5ycU;TD?$*GxU00=8w)XwCgA%TQw?oSZy%I;RFaz zfB-M_2_qkzKlS||-ZKEK{K|lAAKp1QR_~rJs~udYfyGcA*v9^s-a@sqfk2iJ!r>e^ zYXOHJl-aQHB8JD##u$UMjwFsr)09Si0A&e6P%QyR0pjTI#(#Ia7KWT zI4pP)Kl90BGj{aQ;rd#D9J7!)cgrcGGDxR;r5I~1RvNsLPhk~qoa-l5Ysu1#G)_s=lq}20 zGlj}@f3C3{J$i)5e}JjIDugWe|cEXO&E!+~~))JYizYwF66 z36Ncn6zC-Qg#|X-XwDlB8mJz2JN!q0sN66j|vgQEVWJMCU8e=UwF+v-;rk-ovb4Y!# zR@t`Yq&HS;!`IprKaCF23nrKtox-nrxUN9BzHbhM0A~zYlA^W7ScBI6$7mcDX(dZb z^N5ngq&0e7MV`&jRD%Sa4)~ICdJe3dLa*D!7>%{2*idp7n;GMBv!zLsha*i4(gh5QbFnii zS=c79VMonc6l*xmLyX9K!zmWXd^5mZW5H zf-*U|Q7EnZO3^5-u+9`pvJxR3m7R4Ami(YXX9YZKE!G&E>xY?EXr<9gk*WkmP9qq7 za6>S#rX$dG0Wvx|S{WM~yQWkspKSa2A-4uGR$^du1lw{r1K2_x)>*P7Bk9KEDks-D zxmLw@RXoOMECz5`Cve7++Z=ZI7!2wGh10qKVhbQzD@>-)S&qswdU=<~McH^|^8;&L z%es`^@$vCm;DOn&NGzC z`gy=Sqn2DLoVIvUqDD2kROAU`71nCB*638DbA`@x(mY~0Uu4x=d^8`E2aYR{M;>`( zwbgEYK`E7Jm9u~MK3==;x2VP?T;{+O`yDvQ)10^ylcgzXA3~ZXBw0e5CFFTh9AE0Z zNUkc!XiYE?P&u_mSPn7LplceVi$`mX&I%AF&rv#KC0}7q&k?8bf4%c9Z=PN2TGlIv zIAhGRbvoN~+V0Bloqq+@sEkc4SW&d*wopc|-6KsCQk{@wDM^|Trx9tIpjBQZL}Rel zB5-(v0rgXd7}z_Et%GMBX`Enmj?}Km9ok@Wg~>Ct%2`dDESV-YEVq^BKg7<>Yd#2H z7a*5ha`7osQybsCb@SGtYtDNeL+yc|!{~1fs!Y*q_eheMOr<1wN|HuINko!FWNBIe z$&2dZjrx?g)~KI6NH|s{G7*6bX*HWfoeq8%JWY{9ltyP6D$D3*ZRWBCQeQI=4%{_T zt>61x*0L@@;v_ED{QCHnzjh^?svEJ38j*vof*Eqy%%Kh|(l{o~i|~lzh;FY#lEkEG zLe@(#N+U)j!S)K_bOnE~g!L`GPM0w7X*Zk9%{+-&RfrXV&B1D2gh`$e=MnSSJYA9C ziAu{l`MFQt`^EUU137$ne(6ouoUyoh?+KfGeu5n`&~lhbhiy2Vw&*Y?Sxo39J)$_G z*Xt6;5lN>@+KRDt@OPJy(;>QSF(x8e?(uY?cE+O94A;>FkAiOXdlIGkFnTQNqjdd@ zN>HQZg7NVr!ySUn{Credc?gR z@nV;(7b8vykh?>&Qcm7!qo2y5V{xek?eLVu(-Pl!$kc(BCVCHh{l18)zo|Z@{ky7A<#7c<@1kwj99NOhXx<^NJkTs9-!3lz( zgoBPJ#D{M9%4Z&WK5JPQAa~#Ut={3;*?a1PgTEm{&xhiC!#Ri1PXkHlcH2a)F7ZN> zd`gpTS2Sm5$-k50wIqJ#;TaEvLrYzp{3B5P{SuRFtTGsB$YhEs8On_sgSBCNPvV@_ z4*7}9xqp4WYgwM>Iy40q!ur72qiE^VYEU>f$#*P?BO?jN{uo>r9`RcQ z;GLg&-WT%L?QHkJfdgjTE1g+Um2*msvOw5kE>Ssg9C2iRfmUyk)k>3An2_ZTD?);L zh#V>5kC*W`R1q6O+_;AxfvlkslOg3T1Jt&SFnsbP!&@e(Zy3Ta1*j+^bqXV__7Jx^ zCqMXsJ8xan5ckV$-A?YVdd17P49oELfmV6{<{kT)x^SBEM3p?xSeTvX$if_P9HWfD zTG0IqbwW4r@DQ&!<+cQVM(!MF{2XjASuhjl1!uDyDSHNACJu z_y4+%byLXYmt7w94m~nQlx`0?Y-%3rGSfTE;rXXnm|q~vO@DkZ4y?5*W{{_MM}z=b z>?%I<00;+CN@~?I=gLrP%)POc*OvXs2f^SJF@AG&E_z5PF?r~mJN&uNbmssOYwbs;}H8?;BiQiwe@C2Upk)o&X38YVB&b3F001R)MObuXVRU6WV{&C-bY%cCFfuYNFflDL zIaD$-IxsOhGdL?SFgh?Wd}F!m0000bbVXQnWMOn=I&E)cX=ZreFfckWFt-)E-T(jq07*qoM6N<$f_H;lcmMzZ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a1eda86d159b382a2259c5d6ca38daf0a4dc9ab1 GIT binary patch literal 5586 zcmV;@6)ozCP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY4#NNd4#NS*Z>VGd000McNliru<^dBH0VmhL z*cJc)6v0VEK~!ko?VDMUT-SZxf9IUL^fo(YFarz*8v$?uL4qI%lAmMl_H0+9Z6Bej;m}vC<|q~5~b)o*i}kwOHo3W64Rojhzup}00;sgFa$7| zeWtso``*6WS@LiPh$=4uH6R(M_^-Ov{V>ygzVCeh^_+(H?R|US-iC?y>WgP*XKPZ* z8c=c0sU%6zTI)1Pa$l+B`WtVI{=X*V*z}M3>NIvar*09#ztQ)DYdp^z0|uRQewJl8 zYf`k1eW9A3ucmXyYX*)g$;s_IcD3G(b$ai@cZlEr^?&uj+Ns*FyKBTj<*Q9nDy5V} zNP%+>Aq1Z9BNBzb;NvYy%%nq3TI-x`>B1g=@ww-ouK50w5^?I`^7NCRq`T7Qu3H~t)8xH?Ksc~{j{FuwI;<(O94VkEG@j=zv{qK1NPEfS zAG-hkxvRN!bu~Zii4SbM>%OVcPwbP~U>4TR&;QIP?z(^SBahXK#(;DRl`B+RqFM^k zw8*w2>$Es|<{O;7_y+B@*BGgfP;2bQArLvprhq{Z{Q?j;>rhfQy4~&vwbpn1!e4vj z;vaqE8)vT;hO6Q-|7J(vSH_1Pbx!~Gh$pshs7oEyxN z^8&1^0bfX~;REj(AuF_dK@bdW^C$no$=>KvG&t}lqN0j!Vd!R>UJm1%Zl+%AM|x#I zbOLY=a3~r$YFG!t2^4}fH*`}?R`>{^)`_ZI!FK

?>dz#0SAfYD>p@ufE& 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..af97d0c80456e33657142b5ab024ab53f7301c82 GIT binary patch literal 4630 zcmV+x66x)UP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb4605c827911685914aa0c7d1dd96572fd02f2c GIT binary patch literal 4496 zcmV;B5pV8^P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 Rr6>RZ002ovPDHLkV1kN0A4>oL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5311afae777f3d35dad7045f9e78c7d97998cbe3 GIT binary patch literal 4757 zcmV;G5^C*004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY4#NNd4#NS*Z>VGd000McNliru<^dBGEGZIe z5vKqE5rj!ZK~!ko?VDMUTvvI=f9KqLdzTL zxpBWYwsUUkObqxd4d7=@tmcP5{NSO0h@G)9?@&g+Er~nV&(GB=b5rLZI{xBwU;OGf zzWgH~z0wd~ZmZ@Y-}=^fw-@_Le<%>2b3)wX@!O+N_DdN=q0DWs4vyWvefyrG?ItH? z7iL;l8pMi)tMs|WcB}cRH6v?(2PB~}cmxJXe}4g``cYntZ{4!%-fG{#4dWZP|J8qd z?`w|&?B2Drv|)TaKe1_3|IkP^pCpNyIzQJ{N}0*ir_<+;KHmm3AV2V)-ru2UcdLB_usT5s#L1i z7IOK~d=w4IC@cvnl}S~{TC3tDnQAOAADKKkdF0rU^U0kz{_Y(gee+-b=Q}^0|IVda z`>JTjhd=b;Yd-SfkNtb4I=I7ofio6uEyftEF(_?lEXOP_w^7OxMFAsYRl8-&TA2$% zfdKr9;%0Az$gUDWl5|?N$uP0=TSkS;&3f;?pkwo;yYH*~(t0FU1IR$7+Ao|a3NMgS zAOndMz1LC@g#pDFKKvT*PHpM0u#)d8st zRw^^ed4ME5(GhnAn?7|UkMe_^NuWhvagP!h;q41KA$I$ z5`=)vA;4!s;+#VpgX%y!KY-B=f|uSQJ8h_Dg?s{GC@75buTb z!h!GzLGMXtFoX~YnO(yuqEaqXEEbSK079(r;DV5Pk8uudG|7Ak6-VTTW7gl)V*Cb8 ztm>S8VTpX$hm;XQL}P;RzJIuPa^k81vXT+Jhb(1e|5rR?1x%?}q_3|?5C%vALVAQG z^ANy0kFgG83~9^b;xfb6v{`p!o4ygla$}hzhfm{M1B5|@6cXVj0uBU{-}}lRPrl-^ zVwFNBTbA%XgV75c(E}o-BnShFr95F2_C%A6L@&*H=dsqIjYV}+BstdZ)eLOu;)Nk@ z#TIr`+NjtGYpe(FeNP)QQI$BNC`X~N0z}?b(ORRG#^Whh`Z6z4Df6>6 zPMw&eqV^Kz^H{5?wP#R;>CwWNdH0nD5==~N+E^$Q`nBo_tH^vf%1KmeIDT}NxtS); zIx5v78zzPsT~qG)NG8Bx5D*m$NFgy=p_D>tg;pur7>qU;qiHtUoINv3l&m8s257|7 zB+L_ywkh`s!Z3KpH@^1mzx|DS-ZgtgfUMuJp>N&jnm2_aEa{g8gOn1LTAq01G-prM za9LKyv&4(X<~VTcRwlNNWö3BfCv?5h0s`sarMk(D3oi6jUi^Mfa(Lg+Kl(4KQ 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b5ae724199e4a5dc4712cae0f4bfb15c39c21ec8 GIT binary patch literal 4680 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 Hc8>lZ&$AAJ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b80af5fff36fbcfd74dc86b85dc93d37b47e1a95 GIT binary patch literal 4772 zcmV;V5?k$wP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4ce10db7c32253dd3b6d4eb5b7bb89aa4e8969f3 GIT binary patch literal 5198 zcmV-U6tU}xP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 Lf1y?fe*N)(w&@dP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ca1c2d2d3997d9e7e32f91e054ae49c4c7add610 GIT binary patch literal 4540 zcmV;t5ku~YP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 JPDHLkV1iRyP^tg` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1e2af952467a17649c8b7b59646e3cbef5ff57f6 GIT binary patch literal 5314 zcmV;z6g}&SP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 Msp+a#DqDyD4~p9(g8%>k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a0b935d7ccde081d5a9343ea39850e2d85bb0e5d GIT binary patch literal 4637 zcmV+&65{QNP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fbbfb78d3f4cf3f9856256ba974a50735f0a857e GIT binary patch literal 4694 zcmV-c5~=NpP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY4#NNd4#NS*Z>VGd000McNliru<^dBGEGZIe z5vKqE5k*NvK~!ko?VD+kT}O4tf2aE{Z<~EI9!b_>*^(^Do4jBf<182(OfXc6go=X$ ze4tFiRuqAlr2;02LqTvzLF{q@7!pFLN^A-!7XcCjHZB=sKp4CVBq1--NF&Ymw)^hA z-6tRJeKT^tAZv3{aaX;1%e!L1?-K!&J8U53jP8Kn;C09My+;Jb;EJ_A1DP4k7xJR*mViXj_3O2Uj4M3=Y{HeI)VE2i$ zK3(1TuzwzaoG&+ipfNt#$k!Oj8||Ju@Whnab=z$ZCSwEnX#%DY?t#TAV-X`_v``6T~(be(LMuPeZ zOi%|rd3Opw{YY(Mw0V7G=ml||+W06&_MqxOJ*rBc!NROz_JARGf(>Bqki`U!fngciKmADZ{Iu;BsC#-Zpa>Q7~2)&LlwZ||sWpGXq5kw5$85U+j zl1>N`AjX2&@^t_ri_z5AYfxyFq+{5(M{rI7&-@|7(>v{Wua&>)jt@-?onRm^+qC!h zT64e5n@_P6=nAUX+A6|<<;*1(tu`<+2jpeA7%B~6^b}7RX$eCJBV}ThVfDs

bQl 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..53c8b4d293c658129392511682520bd7cf7278a0 GIT binary patch literal 5436 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f06308a34dc3f52109bc3011609b7e8ba222f7ba GIT binary patch literal 4501 zcmV;G5o+#004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c541d5212d74b6956ded7d0b6955569f42dedccc GIT binary patch literal 5159 zcmV+?6xi#DP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 P00000NkvXXu0mjfc*8kg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e932bfbbabddfd5eea7ae7af42fb873968c05290 GIT binary patch literal 4073 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 JPDHLkV1l6B$twT= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f7cffcb263be67862de2e87d91bd12d714b35f19 GIT binary patch literal 4855 zcmVyP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5e36208ec85f8ae8391f63fdd052111aa3fc52f9 GIT binary patch literal 4635 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 P0YLecI<#8eG~|B()eYa# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fe9effbbdb73f703f7b2aa427b22b671b2209003 GIT binary patch literal 5084 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..63df5fce3a7a4e336fde286fa9c0be07efb18da4 GIT binary patch literal 4918 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dafad695cace52b9cbbdf866f13ba58b3f12e3e0 GIT binary patch literal 5548 zcmV;d6;tYoP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3f0a015fe0a71035b807142b25a26b1fac38affd GIT binary patch literal 1345 zcmah{drZ?;6u!JvXwW}&(V$EbrIfbtYbk|Rofe@Fp%2=oNU;j-uPyXJOCLZ7ZpcF( z%A;sOdFhxkQ$Yl@yd1(NgGCr14r>e=mtcHhVis9s%8q8|C56pKd*g`G4z={CyIt>8&1pu}hn+KEj1K`ONB#Pr28l6T zTS?SZka;RH^Ee_lkdm`W{0#CT3Bt`lphA8|kVqeqZi`5@1@W?QA{~yeqa>mg0 zV)3&>^k(uc-P!hN&7tfyw7DA1=P? zn_FOI&WcTb8*&>+FEFqs2JZWuA6foy`XLg^sy!MhHrakSBup zzsnuUe*WRZa~TF36NAO{j`@BEr+CN{SaG1-Cy)&jUn4uk48X=8*UV$wa1DjU^%f2{ ze*FuNEn9psy-N?mAjiasV~DrSDbj!!lNqur4Mh)mP7=bL8jUlIFlh{uNT@khe=gUb zxREN6lyAde8(h^{8mV-!b(p#pi(#LwXc`}x2@Q_Kh{y?yjcPOaw6>+JynZ#3G*w}B;vML$$e5j*uu zfh{evC4J|@0p9LI40XfP;ZMGsvE0`EnZK2M!ii)Hg+=c^pKG7KK+`Ta(|XlY&7|Dc zvVDS?Iqjz+AIw(b@gDSjTPdbK{P$&VzseQDiEjC#^H=SBhwQd#ta9;-wq3a^E1jv` z^1n`3HBr0Zam%HM&FqU!$hJWJLC!+q=aKtJm!e2~4C_@fpy-J+x`OiBoVjF8DhghV7GVlqNU xqUjVW9)STeMo<0tAA;V1W~yxe5=gW)0)<2;{X>}kW@s1^04JUocOy2f=x-wE6RQ9K literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8fbb05d854891417cd6bed6522f2733c4664ae7 GIT binary patch literal 1374 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 ZD=;uRFfh-dyS@Mb002ovPDHLkV1nDhcq9M- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..91f030558892a2345ff26cdf903a046044462c66 GIT binary patch literal 1188 zcmZ8eeN0I(Dl&|c<;7CTWI?p?Q2U{!Kr)}n1B_s@u3V1 zU%DXze>f1>1Q8{KDP}P&z;u7O4RBD9F`<*hC=y(@4E2u@H`(+yF(!I)@A=*HyZ3j_ zxjC&ii!mfFQ41k6f z03IQ#;SK;*6aaVg0DwIJgjbxO%1{F!n6;T5dh|dHd4fsDpe0JliJ>J%WhWU9XG}O_ z#%MDR&4h{NwjRPwPHwLMmC$Dx(WEGjwqCYM!& ztF0&r${a@i)3}_{n#FIIJRVPW zX-ypD;-OIjji|S(hPKt!)s>YMT&g69IEd7{Kfs7B+`^|X*(XJASViTe5kLbrq@FN~Iz-n&~`HhN){jGu38>dt%+64K7Q zC6dqh_K*-)X17M0b8ow&V_|Hozkh3Np`)X^Ea$_>fp%B9(U|*JOW@=Bh={K)CDui1 zRe!d=2O(BdZP~ihqgeW3PyFn!KhnaHU4D;-Y4}^SU$1cDgY((LmUD`d?;YXC#jgn} zJb?j0lT(wYUazg4xI7sY7^F$<9T-@fTbr3#YdbeE@XVnew064uRZA_Qf^f!-OgJ%E$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..41445939ac36f54e93c4773379ed8ec16ab784ed GIT binary patch literal 1203 zcmY*WZA?>F7(SH}KM2k^P$$k=ZEx?r{kpyV@ZQr>Xl?1eZSO4>1d&boXse<`BW2SC z9o88}RJLS-h7ppD={8h!A#B5K#t6FTTHGuYG{_Ieh+|;3EMswFW`|{2wv%(t^Stl- zJn#GCZOj+l=}T5G0RW`)oHKwhWBx5lLI2g_nH&Vtop!+vz{hW<&6TI3cwHqI5CC`; z1EBtO0DecQ`bPlNQUFYq0RYbeuyTLf)y-A_BoFd^g)SseLV;jC7!+kDUI|6HB|x$~ z&U$gyheJ_m@drqo68do{;L!U5o}2wqIc_kl9L* z7d2EdZWY66tb!(6P_dkf$s<@V$+*xst;vQ#0nO5wa@3|=G#YV2&*HRoo?HA#gEI5P zf=YheB4W_5WIXz851sA7%p3`Q1oX*aK4}#(RwOK9N0W&B4Ph zEiKK>%{2#)=#0={Fw+LJTB|pj%pR|hlk1=jCY6>p&;}!Iq;wQP5FU>&6s{_-2=Tm+ zzzND^)l+&EsUmRPY-R*;b8&Gg%RoYjQ(7HKk~pEl^$PFKhRDc%J8Yj^nK^|AE5|S9*G(1BrRdCU359D=OMuNa8_j zb@eto5cnbiu>j$Jk3_~wq^p*5$ysi>RN0z{kB`R_tFOH{SGQwsZb$Xgr`2mNU#|T* z^I|47Ihk_uWY%XJI-flAQqTCWX*d%Y_|1))Nh-WU}mC{C*;{uI|sd%;wXf5Hn&Yw-lxD%-3oxPxdz^ruSZtUYuQ;zy#?r zKCx!H#2$@}#+t-|Zp&oshqE)&6N@IIH=5pQ7`{0af7sXeFg|qrOheY{JENm@?c2x3 zwzt=fE~{O3U7EUVE%?b@R=KgU;BB-AMZ~o=5-g8|VC8`j0zgwVt)cW9nku9zNNt2h uvx-85x(Q34{LfImFSt8==wE}Loi`ZuQ2&qN?z^8~Lk7URL}!I#Ds1!@HF5|WFM zoS5Xsq(oHmpt1)Co-qu;{U8yQlQ58o0S~2kFwq^x*p}<8VM=DCoDwN}F;kK=qiDTv z7p5dZCS1vcJ_K;lz(L6_+T@{QJe2Ij0W^10QUcta16B^$U;wx~E7>?X?jOt;Ei8!j zV>tW202!?C&whDa*|EY3yNY=6oq409K#H}LA1EH)a-BXxUi+B zj+Ns{iV{VMU`3MB;slLr`J9r<-kZ0EhK90Bd?>9aAWzb$U`Kfy#@nL!xXSANgM)(u z0|S-Sb6p(I1n(3Zq>f>tmyItIsZR?q8A z37dD+ww>)fb+)6Ts+N=O1VI>$q9BNr!OU_zj$$0k>I^YPt6PqTZ_{Eh8Vv?Plw&Af zAqi5er74P{X?XWEd@8hH;Y16^>2*3rl7L>%1EA<78==)3MM;(wSvGNcf#M|ip+0%* z;6_+h`BKzWSpR=$R!9Mh=Q{@eaLf-t8~eM*#=0AqT+ErC-m!XmdUffmSEX;BJX!hc zg4WgrrKQZo#LNQ+mY$1fdH%d5A|$tcY-(z(JvSs66Gb6*r3mdcYupKO$UA|{9I%;P z?#QY@kT-ttFU{4mFAE_V8re1D|1t` zGg4N!1bwqF``*!GZOt8@w|{k^sqOUjo3p5r4Sgg1cL&Y+-(PmVf8uaMV@*Ie{e}8b zOuC?t4fs)aK-s28Nz#%k5Y{)!6>az{z{3 zHuX=?*^^JL&wN8?tFHFsp8xad$hUu8`YyJ1nN@RXe0<0FRv%v|;Bq-x*mzU3)ybZSqCUQe#=}&pThfcOodlaj2no@cP|H&n~&O)qjFc;38l z&8P-xF>hDb&CB-xDx-Y%OkZKXuLu-uE`kN&7>=VEmgbl=jsc7j@B+y|!2AfZpZ`Zt jT2{EOc-y}MR`LsY7O<}cy~oa9gaX8ASL436*QEGwK-rLK)ZEs5v0V(v}mX~Qqi%J#8 z)Gd`xL75vUakyo3YBf5XQOtIgx*gxu{*gDOEkT?MD zYyi4;1MnN$>Y4|j9RlDdGXTkN?j8OuuO+?rvWJ|HhF2w28C{;u@uaudD`euRFD$q3) z;k1yj0(Fofzbx15-r56N~ESsD3W6hxp<4A%n0F) zE~%nG*CZw=F&@51!U}?B*9&W$f^^M0ie#{^DaYijLyT#aTNSv4T~d#3;F0!H!s03} z$~wy6qagtyr-g!y7B=a`hHbISmoETwTkFgZ;zWGQVlvB%E?J>$yPj>R?k9 zqnG!YOjGil8Cf=CCKy6GQ<^s_&!448h9ak>87FzE9agxeiC?kz;4<_Rhl)_do$}97^`rU>BfNd#!c!v+K9!=5DM>KEUVE3Zz4Y?9h_* zTD7Co8=4K<%bi~9TJ=^HLMhN5LH-p%+Smrn2WQ$F+rF5XoSU2T!5L%K*cIWb{et`u zmorC~VX)b4)8$V@KjG$unKcx7)Yy>(NNf^T7 ze{IoA?vECgU;i_H`@OW|zwb?$C|%(6_BtOvbY}R-CuG{K$e|*C=DSbgw#+~N_3?Zp zPb$4^|I*B!7tw&JmB15~g0Mxj1F3QX5dUe|Bd*y$q}b*X7mBNv+=*DeJUVvxelUk+ zC{$TuOq#KnFGnX0^jA@IRsTTJ(gt7ay|#szn1!}`tv+44HJ(sq(FeOg0-dEI;;p?& ziK3nphumhJ!=W1*Ih6CPC=uzcEHmV03i4#KJb@B3>`KhLek^5aaze_o6)TpdBqSf5 zSn>ihz1OQn$~6S4!4d3cC?a~{?vFOgO8@ZPojc##XzTplhmld7xY!tPH>SBUuEDy! zqVL-@o8Rz-=^`_}CFU-kt~pAPJMaO4|#taE6n>-~zS zyZ7{EYX{(tAk#E+$`|$O&Qjs|0&Cza z%zw$Y74;6C@$C9GNT0n?>06(CsrC4KyFAcpk8*5qu-0^H(R?e4gAQR69#>>1Dpuic!yeS7kz`oR9=)Nzsw!hSy-BuR5V=sQ{av)}ewH~R!x zF4cM$RqvvumNuGA0ES?g2l06@WP~9pB$5h*xezO$F=_Ra{{WlpRFk#iUw|(O0|LI3 V{|_*E^wKB`08~XNPnVi^{tdvw&1L`q literal 0 HcmV?d00001 From 429c80e9f526c27a6d79df5e8308b6d2c85277ca Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:26:15 -0800 Subject: [PATCH 04/17] Add new abstractions for pkm/personal/mysterygift Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> --- PKHeX.Core/MysteryGifts/WA8.cs | 773 +++++++++++++++++++ PKHeX.Core/PKM/PA8.cs | 866 ++++++++++++++++++++++ PKHeX.Core/PKM/Shared/IAlpha.cs | 9 + PKHeX.Core/PKM/Shared/IGanbaru.cs | 109 +++ PKHeX.Core/PKM/Shared/IMoveShop8.cs | 19 + PKHeX.Core/PKM/Shared/INoble.cs | 9 + PKHeX.Core/PKM/Shared/ITechRecord8.cs | 12 + PKHeX.Core/PKM/Util/PKX.cs | 6 +- PKHeX.Core/PKM/Util/PokeCrypto.cs | 46 +- PKHeX.Core/PersonalInfo/PersonalInfoLA.cs | 113 +++ 10 files changed, 1960 insertions(+), 2 deletions(-) create mode 100644 PKHeX.Core/MysteryGifts/WA8.cs create mode 100644 PKHeX.Core/PKM/PA8.cs create mode 100644 PKHeX.Core/PKM/Shared/IAlpha.cs create mode 100644 PKHeX.Core/PKM/Shared/IGanbaru.cs create mode 100644 PKHeX.Core/PKM/Shared/IMoveShop8.cs create mode 100644 PKHeX.Core/PKM/Shared/INoble.cs create mode 100644 PKHeX.Core/PKM/Shared/ITechRecord8.cs create mode 100644 PKHeX.Core/PersonalInfo/PersonalInfoLA.cs 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/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/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/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/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/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/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, }; /// /// 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 385db4bfc83..9f6b45dd6ab 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); @@ -446,6 +446,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; @@ -475,6 +477,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 e60acc8bd45..0f69a0aa4ae 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/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/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/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/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/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/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/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/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/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/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/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/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/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; } From cb6e2020a4305be32f0d658105045e8642bf2d64 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:35:54 -0800 Subject: [PATCH 13/17] Update default box display, alpha sprites Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> --- PKHeX.Drawing.Misc/Util/WallpaperUtil.cs | 3 ++- PKHeX.Drawing.PokeSprite/Util/SpriteUtil.cs | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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/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; From 18ecad9743c71be17f71fe0d481d0e392bf1f30f Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:36:51 -0800 Subject: [PATCH 14/17] Update program GUI abstractions Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> --- PKHeX.WinForms/Controls/PKM Editor/EditPK8.cs | 41 ++++ .../Controls/PKM Editor/LoadSave.cs | 26 +++ .../Controls/PKM Editor/PKMEditor.Designer.cs | 221 +++++++++++------- .../Controls/PKM Editor/PKMEditor.cs | 40 +++- .../Controls/PKM Editor/SizeCP.Designer.cs | 2 +- PKHeX.WinForms/Controls/PKM Editor/SizeCP.cs | 59 +++-- .../PKM Editor/StatEditor.Designer.cs | 201 ++++++++++++++-- .../Controls/PKM Editor/StatEditor.cs | 90 ++++++- .../Controls/SAV Editor/BoxMenuStrip.cs | 1 + .../Controls/SAV Editor/SAVEditor.cs | 4 +- PKHeX.WinForms/MainWindow/Main.Designer.cs | 20 +- PKHeX.WinForms/MainWindow/Main.cs | 7 +- PKHeX.WinForms/MainWindow/Main.resx | 7 +- PKHeX.WinForms/PKHeX.WinForms.csproj | 9 + PKHeX.WinForms/Properties/PKHeXSettings.cs | 4 +- .../Properties/Resources.Designer.cs | 54 +++-- PKHeX.WinForms/Properties/Resources.resx | 6 + .../Resources/img/Markings/gen_la.png | Bin 0 -> 1203 bytes .../img/Pokedex/research_bonus_points.png | Bin 0 -> 679 bytes PKHeX.WinForms/Subforms/KChart.cs | 3 +- .../Subforms/PKM Editors/MemoryAmie.cs | 4 +- .../Subforms/PKM Editors/RibbonEditor.cs | 12 +- .../Subforms/PKM Editors/TechRecordEditor.cs | 27 ++- PKHeX.WinForms/Subforms/SAV_Database.cs | 3 + PKHeX.WinForms/Subforms/SAV_Encounters.cs | 6 +- PKHeX.WinForms/Subforms/SAV_MysteryGiftDB.cs | 2 + .../Gen6/SAV_BoxLayout.Designer.cs | 16 +- .../Gen7/SAV_HallOfFame7.Designer.cs | 40 ++-- .../Save Editors/Gen8/SAV_BlockDump8.cs | 36 +-- .../Subforms/Save Editors/SAV_Inventory.cs | 4 +- .../SAV_SimplePokedex.Designer.cs | 20 +- PKHeX.WinForms/Util/WinFormsUtil.cs | 6 +- 32 files changed, 727 insertions(+), 244 deletions(-) create mode 100644 PKHeX.WinForms/Resources/img/Markings/gen_la.png create mode 100644 PKHeX.WinForms/Resources/img/Pokedex/research_bonus_points.png 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 b0a2aeea0e6..f8d229928cc 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; } @@ -1706,6 +1711,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); } @@ -1793,14 +1800,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(); } @@ -1833,8 +1862,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); } @@ -1936,6 +1967,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) @@ -2063,6 +2095,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 432af171f93..0cedb23f9a4 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 @@ -384,6 +424,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) @@ -498,6 +547,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; @@ -505,6 +581,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) { @@ -541,6 +618,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) @@ -564,5 +646,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..ed71b2721ee 100644 --- a/PKHeX.WinForms/PKHeX.WinForms.csproj +++ b/PKHeX.WinForms/PKHeX.WinForms.csproj @@ -42,6 +42,15 @@ True Resources.resx + + Form + + + Form + + + UserControl + 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 0000000000000000000000000000000000000000..756a39631b023f1e6171c80b35091be7c49e43c2 GIT binary patch literal 1203 zcmV;k1WfyhP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T<|I|#onQ8ZnW*TTHWe!q_q6S3~UYi*a;=mddD29b7)kr9#VWb9TH7SY)1*LdSII;*vh>p+Bq|AmLM&N_R2d+)Ws+dh2*8qg`K5iqDV z{9kk$jBE{0t|9O{d;*Wa)u4e~Ltz5k2zP+Tg|33zVLDs`9$V4{@Br+96L2L|X%o2M zC~Sj8a29x?aquv_4WGfc@G0B_p*i3U`rGH=v99qZv~dR92k*mS@LXSmn^UF5a0FZ! zY=CEAe=>In*2A@s?y}=auoezN9PipS@GKl_&&hFk9IACGya!=G{)E5UV?X!7-Ebx} zX*k>o?oO=Lju({LcDHqfo-_+`L&09S4Qh2WdM390?%bWG*9*`zd*~;f!44?Mruhq_S0Zrn9DhTYuf!tIjJmr9qyE0pm*?L zYuKU5kou;+>IqCCYBoFvuH6F9gH5Y9d@tyWHXk8vnVNF#0=xOHx&iX=muRmpho`_E z&Uu?#rB9s;=e5VmR{XnJYd14d}A zY`a`jvL!aiwN>pO+0*5(onCBQu;uN0m=E28#NXzDk1<|5Q#*mZWlyi2MwE?aYQ*IG z1lU@|$&5yOKXYfg1CFPHE)o&z8h6n&V;;4_gl#X_`D*zR<3f#m1owkJY1+6LtPZ{c znB#okwF0DneYmqGaxcigPS(K!aIH3MSZ#KF<&2FmnRj$DO|r)`FS+e2!2e=OGO7A* zY@#*_{Wl_H>+fr;C9>3ChIAz(+?#M0$3T^AT&uJCe<080IR`YLQ%rq*e*??WsT;?( R3yc5&002ovPDHLkV1m{6HnIQ! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4e8d6da9b4d9ae227a405657c26d9aa0edcf6f30 GIT binary patch literal 679 zcmZ`!ZAg=06n(ZSv+1Vdz#&RwE+w;gee;VqORbGLKZcsNEWs_e%1WpCiXTXR6q0|G zRWlip5R!&km`b2nfu=u%R0P9JGR+i238Bd{I6eOKN0)Q&;hf8Xdz&*2I;kW`LI{!S zQ#9F><@@a=qI1}|l}O3sT5?7*A^ol1f6bm$D+^PyGYF{(Bc%QwA%Cba-pjW3!UU!1E9YAQal?#^2HVJ@{>TFT2p#W za*krIc=nU5F-h(*%U*W-lo2*iD z?wRSuiFjvE% 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/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/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/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/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, }; From 2cef0c23a6ebab582183b984326713c19630e9fe Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:37:13 -0800 Subject: [PATCH 15/17] Update localization dumping util --- PKHeX.WinForms/Util/DevUtil.cs | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) 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)); + } } } } From cdf41c03760a7c21233a2b580dbc19db010ad536 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:42:00 -0800 Subject: [PATCH 16/17] Update program translations --- .../Formatting/LegalityCheckStrings.cs | 6 +- .../checks/LegalityCheckStrings_de.txt | 15 +++ .../checks/LegalityCheckStrings_en.txt | 15 +++ .../checks/LegalityCheckStrings_es.txt | 15 +++ .../checks/LegalityCheckStrings_fr.txt | 15 +++ .../checks/LegalityCheckStrings_it.txt | 15 +++ .../checks/LegalityCheckStrings_ja.txt | 15 +++ .../checks/LegalityCheckStrings_ko.txt | 15 +++ .../checks/LegalityCheckStrings_zh.txt | 15 +++ PKHeX.WinForms/Resources/text/lang_de.txt | 116 +++++++++++++++--- PKHeX.WinForms/Resources/text/lang_en.txt | 116 +++++++++++++++--- PKHeX.WinForms/Resources/text/lang_es.txt | 116 +++++++++++++++--- PKHeX.WinForms/Resources/text/lang_fr.txt | 116 +++++++++++++++--- PKHeX.WinForms/Resources/text/lang_it.txt | 116 +++++++++++++++--- PKHeX.WinForms/Resources/text/lang_ja.txt | 116 +++++++++++++++--- PKHeX.WinForms/Resources/text/lang_ko.txt | 116 +++++++++++++++--- PKHeX.WinForms/Resources/text/lang_zh.txt | 116 +++++++++++++++--- 17 files changed, 939 insertions(+), 115 deletions(-) diff --git a/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs b/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs index ecbe1321946..59d18f65682 100644 --- a/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs +++ b/PKHeX.Core/Legality/Formatting/LegalityCheckStrings.cs @@ -368,11 +368,11 @@ public static class LegalityCheckStrings 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 can not be found with this Alpha Move."; + 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; } = "Can not purchase {0} from the move shop."; + 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."; @@ -424,7 +424,7 @@ public static class LegalityCheckStrings 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} can not be obtained."; + 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."; 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.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 From d4a6392b4401b36b4cfeae7b36e694a85147730f Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 18:21:10 -0800 Subject: [PATCH 17/17] Update 22.02.04 Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com> Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> --- .github/README-de.md | 6 ++--- .github/README-es.md | 6 ++--- .github/README-fr.md | 6 ++--- PKHeX.Core/Resources/legality/mgdb/wb8.pkl | Bin 1464 -> 5856 bytes PKHeX.Core/Resources/legality/mgdb/wc4.pkl | Bin 500760 -> 500760 bytes PKHeX.WinForms/PKHeX.WinForms.csproj | 11 +------- PKHeX.WinForms/Resources/text/changelog.txt | 27 +++++++++++++++++++- README.md | 4 +-- 8 files changed, 38 insertions(+), 22 deletions(-) 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/Resources/legality/mgdb/wb8.pkl b/PKHeX.Core/Resources/legality/mgdb/wb8.pkl index 15855533a40c5858c4fd760e6d0c011ce9b66bbe..07ae003c5212f9a68fd686a51940cda7bd677faa 100644 GIT binary patch literal 5856 zcmZQzfPgMA#mvCSC<7INP_plBIFJRd7<@LkZm`|}Sq#Ev1XCUii3|lmn8}dGP>G_5 z3Cts;f2hmfHP~pd8yH3?UI%j^;S<1+&ydaVl0kvNnIRPzMkPS92rLf?A42+vy8QqD zK63E z>9$dk(GVau1fD?}ASlY0vVpjuHi;#Q_$X&I1gIMVj&oRm2C6Ya+6OTD6(a)^BjbNy z(TBAOf+YA4%x1>nsBl$GiDj^~&7y)LiOUR-qI49MqnyzY82AvlUXSU9<*>BPB#t7< z&%lGiALWdOz+esmMRrWrt$?R(2^2{dh7=V3C}%VT26G534#ITZN_g6qM3H>M2pOA# l3BE<+zeD4{N8^7$<9|fse?sHK>=~s;Lx7wRI5!8O3jjiSxlI57 delta 12 UcmaE$yMuef6Q<2`IIb`O04Ik9lmGw# diff --git a/PKHeX.Core/Resources/legality/mgdb/wc4.pkl b/PKHeX.Core/Resources/legality/mgdb/wc4.pkl index efdb442bdc889f30e55f41f9d648c6f9f79c00b0..a63e32b0aec2a76dd6b21cd2c990700a771dfcc4 100644 GIT binary patch delta 114 zcmbPnLT<(hxeW_WY_G^+3`p6&poD2f`gVl|<^{3sGa6a8&uC=5z_Q&zi;d;_beRN3 yxy^@8Zd)`t;5^IXB_|lSpSj3*1;O*V%LL(VKXRA(%3`>xoOV`-_*NJ8D~kaXtv3Du delta 106 zcmbPnLT<(hxeW_WZ09)3d}HzE1t$VhKui|K={BV-THE=GSXM3C{y~RvMLI-y`yNr& zD~qResources\icon.ico PKHeX.WinForms.Program PKHeX - 22.01.01 + 22.02.04 10 enable @@ -42,15 +42,6 @@ True Resources.resx - - Form - - - Form - - - UserControl - 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/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.
@@ -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/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); } +} From c1a2b55191d9dddc5e9e4772a28e40fa6afa19bf Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:26:55 -0800 Subject: [PATCH 05/17] Add new legality binaries from pkNX Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> --- PKHeX.Core/Resources/byte/evolve/evos_la.pkl | Bin 0 -> 6280 bytes .../Resources/byte/levelup/lvlmove_la.pkl | Bin 0 -> 15612 bytes PKHeX.Core/Resources/byte/personal/personal_la | Bin 0 -> 224576 bytes .../byte/zukan_research/researchtask_la.pkl | Bin 0 -> 65416 bytes PKHeX.Core/Resources/legality/mgdb/wa8.pkl | Bin 0 -> 712 bytes .../legality/wild/Gen8/encounter_la.pkl | Bin 0 -> 100456 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 PKHeX.Core/Resources/byte/evolve/evos_la.pkl create mode 100644 PKHeX.Core/Resources/byte/levelup/lvlmove_la.pkl create mode 100644 PKHeX.Core/Resources/byte/personal/personal_la create mode 100644 PKHeX.Core/Resources/byte/zukan_research/researchtask_la.pkl create mode 100644 PKHeX.Core/Resources/legality/mgdb/wa8.pkl create mode 100644 PKHeX.Core/Resources/legality/wild/Gen8/encounter_la.pkl 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 0000000000000000000000000000000000000000..b7744d77712113a61002312980514e32dc86ba14 GIT binary patch literal 6280 zcmeI0Uuau(6vw~kcGk<>G@Z+A>+Is}N*RK2>MZo7b8}WUM%Qhy7bSv@;5v!mLlKms z+Zq%#h+<`{1Vk1^B_Kiv8^kfC8&0FEnyJ&^Q}UjS0FMO02`G|Kc+jx(P(MM!ONE zXF~_;yXT3$oM$e?IQ~Ww=lpXa!SVgmkYr9tk)az%nsaB2EInf6=usn27mOmUj2jbl z$-rH_Ux{yoXeClXJKJTVY%3i`7hR^CZKY=ldl@S+5;qdG(oY6RvVs)bLq?j;7+G2w zF>-X7QMQ#lDJ&9-+~@crWrF*zaeZe{;@Q=h-5H>fpHnm7v#%OLtZS@MJA>LiP}MyU z;W=H4cJ|GMD90~mI=KHbU2HD|dbp3+HHb66Q0eF1relEl8VmOflDs}O=Kl_RiY z^7z<^R_9){(M!mB{>vcrrxriJuQZx}6u4L2#h-Au(3^;lZS`u+Zw6Ltev9SRntu{# zQEvm9w0}F%aca%);K#hWmvv3_4_sXLr`G&aHtuP*bzI;}$TJS(9DcOA1h?*EljIrm zh0Csg5%F z?{RfJzdEhE2Msvk0es;!;S%`P)m`Pv!Td*o23=)*#ElK zy<*qrReBloO9i(sr&uxOG>gDDp!Agyr1uYFYfInz`FMo1gy>5Z`;{#iFH~Y2z zS;0CVkIO~NKQCCng5&?9wZBggQ6CW8uRbVPp+02!LBZ`BCk3tQHv}Q|n-;%i{cj7_ zYCa{nL;bGp`#p=_=YI4$b=p2YwEZ2S`Ei3`zCZqi!bh~mX+c=$`B>1b{zTBEK4#-S z6RhS`_}u2p3flDg@3Z(T+t1gc*JB@!vrqjp9mNZHk=FT6NbsDU6hw8tcZlvYXY-u0 zc}`34ynM&=)NyA7YgXZJ{KK}!-&_Br1ozt&kyal)Sm%lBf60@LTKA17?zubTiJRxV z7u1h=TEDZdjd!Qdr?S&|51ykR=C~x^TohYnkPgmE?7YOC*RXgNd+t6tCerc<#~o(< SM(1E3ou0I;VSLJy4gUgwdqxxh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..871f7d030a8f0bcf6d34e08b0c00ed0051b6890a GIT binary patch literal 15612 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..217037c06a3c7d737995c5d4f12b707bfd08a6e4 GIT binary patch literal 100456 zcmeIbahzUPdEfcocLsSZk6~=fMzRISwrtDx*cKpcVGBGq0%RkDfB_UTfB=OkFu;(g zjhcv57?CK6fN2;&ZA7XjlVl7^QIbh28kNe)gbt}1ltdvzD-t!U-BnrbM%z_e?XGsa z-|v}wW?#;GXYPCT4s<4;{_*=f?|JTXp7WgNJm=hV&pr3NgYW+FuCuq+YF)S0YQ10! z*bBzM32*@{yS-Lh4|ap&pmTMtwgzkl+rUmR22O(uVA&nWg8?uMCcq`odnfW>6ikBi zpy#eyZ5`MOc7sD;0-OWgYihN%pdai42f<0uc{k;QL2v|I1k3NK)i!`_U@sU0C%^@; z>|X2v17H|TfJ>ma7kMxO&Vdd0)oOdd1n9b-`hj6E0WN{w2Wqt;Fb*z(m1}FYKCm6^ z1INGxu=>T+2kZyO!9}pyp!Oi;gH2!%41;kn1ulav4zk_ycSM zd%+~=ewg+E{a_b32#$l*k5GSb5F7!=z!}iF0li=|7zU@n@>h@sd%y(fdL{J)Tfk0m z02~7s!0Jb7H?SFO13SS!a1fjUtNW-Y7zD#$987}K-~#A;jPgJ)7y{$q64>xK<%0>( z^(yp(VQ>m8-$*-wL*Oh}^J=bxAus~Qz%g(VoCTLa_iJcJunuej17HW(3HE^f-~bo} zN5C;K2~L4C;5@hlI$ukF04u>7unzQr&0s6o4u-&Pun&xYL*Ovjwuv}@0=;1OleE+8 zun!#AO#Y{8wc6{cKiKgG^l!m_u=kDl_f3=!4!xOn?Z+Q)!9FnbR{Z-m;s)&BiXA^d z`CuP73{HZJVENneC)ft|f-!IcTmZ{{5dB~P>;a=-5}XG;1Jn;}1-ro^Fagei?ss56 z=m)#NesBnkgGq22TmYT#q6W|QE2)f=y{lQwW5o`s6U=J7p zW8fG#3C@B`pnDtb3)X>6U;qq(z2E>i432|S;2gLNdftuyzJNHBALs`=z-}-MM!`{V0-OOCLDzQb z57vT>U@I5|d%y@71INHga1nI<5c)wM=m$H%ZZHf+!BKDmoB*Za^9)`E>-D;NaB zU>r<=%b@3n@ef!JHiNBTI~W4H!9FkoCc$N}b_f0gN5N@O`w{YkO<+Gb36{MdJ>VcX z1D1V&>tHuH0xp8}gQUT6a29lZkotikFb<}`Ww7=`*aHrL6W{_^_F?jaL2wA10$oG2 z7Z?JgU0OU=noyDD4SGz!X^dW5fd(1?NETPSRimOoGdx@9&Tw90ljWs=tf> z!9H*Ttom`TgGtc63;kdOOo5eu4}D-1oC6zvg7yXD;2c=_lgNX;;3QbNn|1}`p!QMx z3O0d3Fbu}QIk57l$Orac{7Z?TSK=0G| z4UB_xVCBcr5B7pd(7l&57y(mY(YuxCDBCj_Y6qOo5d@Pkyiy8~}&G1+Z>E^#jMis!tL(pQ4`(2iOmefK%WcxD0wm@Gn>oHiKJAXU^mzYM!+F(7#sx? z;3PN=&Vh@dc7XbWf#Fb2lKac}}mfwSNOxD2}fA^i@l z0=-~8*a)_O0k8vf|0Dbc`hSsnfrAIB&lk`G_Wct1{xSA~orkdRpWp|u?U#wuU!i=k zd6e?N$giUR*QgiR^Xt@OjJN`q!P;l=3pfByfZ7-F8`uF3f|H>0OXLTG;1D;pT&80h||TnDGX`Y&S-*amijec&KC0w%x|I1g$^@C#T2Hh?W)JJ<#G zgF|2(OoG$k0_glr>JNHBALs`=z-}-MM!`{V0-OOCLDz2)Ctxku2)2Sjum_BQF>nl= z1ZTk|(EZ!A7gz^2fdMcC_JRZ8FgOlQfpg$8=o!b~U_ICjwt<~sA2mu&~=P_U=`>E+rS8z1eZb2zrc@RJ=hGkfxTc1oB*}2(k@^JI0#OH&VPwK z7zD?`vg4$|05}3VpQYWwAlL&&!6Y~jdVU`}!7gwZoB_-Jfc#(p41)=94s=ftN1z|< z0tdlya1pHeL*&68FbXEYX>b8_eht5Z&0r502j{@be}z7<5o`s6U>J;pNpKp}Ch-SY z4+g*6W|QE2-bg{egKYx&Oagz2EidP0nUN$e@%H{J2(JNfHUAC*m{C?0>{A# za0XliUH=9;(J3 zL2wdu{t4H?AUFh0fv!KLe}Ew{3MRpM(DP@+0oV$5gCpQ9SbhrqU=J7v=fKK8r+)PJ+|m9JmN-XV3$dgVkUy*Z?+xey|M;f?Z%Q7zPKy z7#Ih~!3i)0&VmczGU)pE)Ele<6JW<*Q_lZ@KSBRl`~?pFkJRsfA|KfIKU3dx*avq0 z2kiL{<1^Uyzu>R)lm|BdujmIO{~Pi0H`D{{xq#jOJM9Su|0D77e_$8bdJ#Loq5niY zfv*2dy}%F{1yi8=zfeBd3C6%_&~u6Q2fM&wa0V>zOQ8Gzrv6|Z*aQZ^5ZDV2fWzQ8I0epu%b@2n^#SX_X0Q$H1pB~2a0E<%DR3Ut z{vYfEYrqDu1#Abqz#!AWotEbrht*aEhLec&)S2`+-=om>ao zz+Ny0PJjzw*>kW541hgg1RMpYL2U{4f=yr$41;kn1ulbCS7o)0U!4TixeI0{aHGvFfVx&eDZ zAJ`7|fy3Y==v;<9U=SP!%Wgy;I0kxdLLTe`hrvm35v+MW_JLtA0WN{w<-`XV0h8c7 z=vhI1z$P#N_JC0^3C@F_o4F3Qg5BT{m;h7YJgD7*Jzx#k0EWR?uzn@&4o-q)FCafS z2+n}jFT{Ru7+e7BUX;~#fn(qd=v;+9umNlV+rchy7@PsiZbd&B07GCeH~>zARktAz z#=v>7_IBbB>;nhE5ikL!zmNivI1V}=qI|F)oCM3(<4 z*JIQZtOXmvRxk+mfDteTj)9ZlEVu-^AJ1y5z&fxA41gi97aRbG!Eta3oCB9Z&#Ul1 zSPwRXZD1$Z2M&TGU;<2m^Psko`hzuK1K0w#gI!=hI0VMQBsdK&fX-J_f6xp1KtI?4 zc7tIs3XXyk;0(A3x?V&5!CJ5pYz2d04;TSs-~>1WE`qMtq91GlJHY{P44eU-o3Iyb z218&390jLA?Fs4w)_@IQ3)l{Jf&JhR7zdN!G`IjdpQJvZ7xaOCumkJ{!(bE~1*bvn zb@&%-0{vhc7zDe(UT_qg2dg%79qa(R!Eta3oCB9Z&r|3D>%nHQ4eSK_z(H^UYsYz9MM1RMpYLG7*B4>o~8um_BQF>o66ybb%oE^ru}0n4@`4+g*x z*b5GT!{9hL1;a?T9O!)y`oK821U9@Ee}kRi05}a+ZKr*~7&s4leu(nGE^ru}1Q)^b_mLlL1AD<3 zI0jCFv)~fw{b8b8_4q`9p1%03&>;U`05pW8e1D8S12hj)Cg8{GyjDkyG z^M}w6E`m)TroF%g&^d&D&l9;!wjesBPcf+OG3oe1~k7u=2U>(>52Ei~G2UFlO zShW{@U zfIVOYjDgdjXCM9s>%m5_1q^^4;M%Kdou9_V_0D!fd8U9Um2wJ!~2mC6`vWpPefOTLPY%WtW> z?4I3q&$M5c-#qQtyY8O0*|M!?UUua?FT8?sh`l9GVOz(NdJURge`CGF`j~c%Fl`)} zHU>=N&&qj>@v7xGK3J~fgXP+1{{gnxj?mDKcO!Gv(s~V=-L#_K;rLJ{W1E%9;LB1O z%W^ETe8(%xPwiRNf=o{fGI30st1M-n%>4l^w8yf_WUPCc%nMqOxuFFa$DFdVkXiCL z^>RFchVkSmem4ybY5i{6IB>jSoT{A1dONmU-90_F&|gFBn>O}MQ>U&KxePS$4(DlT zNEgMHI9b<(|_qj4!;;LBoA6jbCDae}r)#04V*!4Ng*e!Y{WOpNcjWQgx@|5awTXQ!fPnlwJ1!QSWO&+W^2Zr2xOGQ?S_jCDxc z&he`8oy3LZMH0BoOdYW{J&uw4(a$DHkXWR z8)bUp^ON>GImg_RYr*E(WVEMDM*oz_M0=cjSeA1S>uwqv(y^?$WQ+~VnoEY~{ve|d zEo(MEt7k45+pA2*wkVT{^L%ao&MbBJIhAXnUbD$C2cGviAv(jo**T#1=$y{X1x?#d zISu@KNH@+^nP-G`G-X`3a(xWFO+4mGVVz1j*RqszEz7x*Ygx{f;(FIyGV%UA*BCe3 z9Md*%o>~-tX}##vh4aHII%b=vR?*?u@?;(x&_dheI){2^lZpLwE*Zznva);zaGirO zF06C7PWUR)tWDOS+4@K79j<$rcHP7DNAl~?koH-mT^+`gb8X9Uu5CH4shW0u(zN%R zG8yk%WirNG*?OZgMfX4BlzU~E8!&!#^J*kKFG0ie($A27?sfGVG<(6SddL3!Iy7AW zWPTkQuBYSXJ@_{7kJ%k->K%+X-}5r;^FK+sj-Svl#=3T%^6*LadZz7bu*<$(RQFZ4 zPuKl{m()8P->tv%LF-?%R_SAGdz&_U|5L`aGNyltG;`@1G`s!I@SdP@9-b5G`qyV= zW5H)-`e73fo11t%hcxjT^*QHPZ==4*qkk91vG?~+Vu$y4Wxa1W9(vz!yiVRH&4-Ro z$_swAT>WY}jqm3ii^^oY@0Q7Ue<_n;oC!X4Otbz{#;_({^l76UV?&c1b~W+n|4lr~ zXuF?zuWz@nIu~nKM;s%ojBn|E zT-(#9?dWjs->#0>w(Z!#bKm#P4(+sUz1Lr9+s>t<)wZ2WM~w9{pU$Pjx$&on59h+r zS?9*B$b5`G;l2fE*thUB>6fjq*Pz+P*M|KE^*^g+fd>sd`dSmuXTnsD@ujYQ`-}SR zbHqavkLQIZUd-EQTa;_$MSYDt$IG-{+z&I>^21z}aed}DeJ$htSG}hvyc3=I%~+6q zn%m)h_l4(-ncvQNe+Bs$Q5VMGncvtk^IQIR$a@d>K=m;G)K@Y7$bSI-3)wG%jWfUT zXLcAF=h523JUirN{xb6$e`K%A^D@`SzR7QGBNnp9_`P96*gKO^@A^Xzg?G<0zpXFr z8DuPrZCLfk9-Fp}=jC7zv7N==mc?gR^;f=fT2JF|`c?h*+nsY{H@%Ctbv^?P^BF$- ztI_vr&@dl(N1ldeYwoRgyfaTj!}Y;DKQ!e3MmC)v8sxvlb>|n*ApbS4^9)pjX6vY< z>zJ1B-VEnc-^}wvL;hp+X?@U;KiaHLZFbJ0&EyR>KlE_DLz_)&^GjYfZL?`@_PREk zUz^RZ&0g1L<+Yi*2Ah@FW}bb5&9B7g+H8JpHorETUz^RZ&8D^4{LyB4+N_K=TZVq# z@aVM7rnT8T`q{KLdtIB&ug&JyX0L0r^4g3o!Di*P8UF^GU-g=4o6WDy=GSKPYqR;a z*|avBKiaHLZI-9a6UG8>ekHt<7H7X7g*a`L)^W+N``bQ+BXfd2PnO z!RDv7OxtXJZ8pC)n_rvFug#{l+5FLF>#fb!Tbp0LVcKSO8XKmydDH8rZ8ojVUe{*x zYqR;a+3VV@yf$kiG{|f7t2a&C-2b*|o6WDy=GSKPYqR-}VY6vy$p6Ac*axG{i>VJr zn-^0bj5aT(J{WCYOnvZ%Mc4;dEJB;3pBK}(5&gWFY>s|jOk-X2^J20&`gt*p&(Y6| z$>!+i#dJ@JeqKyAFJFZBlxXu}8lR)hi)pNjHZP`eBig)}`XJA+oqxeIrfVY5uqN_v zc!qRM1{&5xqKq-G3~kb(jPaxl&%{0p2R-tXk*AE$_{#XqA7yM)Wqig~#%F3}e8!G4 z`cN64X_fIARvDjZne&(0d{qlFQO{iUihAafiF)R$d(<Hl2 zCBuEN)X&^^N@b#+xqKM)%q0``%;m$VXD*qjXD%N`J#)!KJ#+am>X}Q1aii3SQD!dx zM47qj9%bgLSCpB{X4l$RFm7DK`x9t(Gw)AaLr;0WQ$CDb7wMyeZGTDNkGcUgUYaLxg58WDQ^5L-43m4VtZGUkhvJO+4S@ zK8oD6`8T2~S@UPDzTO9q-!*7XX zeOJo)?jz-y*Zo+0TU&EK*6r*~P%hJ8Bf`EPdF}<0 z7xw}+@+_Bi%V3}Dm)fWAc@GlW9GcnY`ab1pU&?b|!qwQ)xn%mgn;UKndyorxOOb2* z9*6fMb@yWM-E-KBVGJ3&-MJhzd;_iAwYeNL#G1CGy!eja_~V^wh(CSxN%B6oCx5^E zqVPVYiD&;v<;?55x!YDxzrTAi-}x$+@_f(s)5uvaG?XjPJ!Qs$d&*)=ej1*A3mW`v zOr|{F(WN}&IeZ6(zVICw?PlJTXWo=&o4a>f-$R2>^;OEVZ}D!aM*D~TnfLIWv;8CG zS#HWR4%|C$-Q0t33|Vfv>>WF6CKn*qcqC z4tu=m)AD#9SfgLmpxMiKFQrdM;TeC>5LebM<=K|MmfHsn_G$C4=lY;QpK>YBGQNbI zaR3c*U>l`8^ZH))Vdh-EzkPx^mofe^`lVwNG;?gyFHggJW#9C>->2T-e!Y7AAZ55` z1seA2-B7^mDd4@JfcL_j=RObhxsNUCYvipckXu#2yRLv2ZE4gOdG3w1T=xgZyp6o; zbA64xW$@B-1hg;ZU6u3P?-ln+!|Sxol~#wDWOjn2*PNz9ToE@5pZ=pME!= z_L}btq@CA8!@T~Myu9o3do24b8NciGRPOl&Jlpk2+S+!7hIZ9QDbF@cdA6ZE{cGOX zhAB@UrMy^1V_w^JHo3;V%(jYx+!vX`V48k7qLaZZnT@Bs)dS z+;d;OM&F+K%~+g;`^+8n8e_=JZ}%qH|J}dGJ$mN%>aODNd2e8T;r-$^<`)CxGYt*t z`>r6*ZC8+oa=N^q857?3?AP9-^s~0v7TRW7+f4foSKs*#SKm>;wsl~8r}ISnqVq)i zqUD;lT+QGT2*MmUYq|_Phmqdbyv4IV*7#=B&&&iu_`n=@;Wn-?ppcPINq* zw+A%%|My7~Gc{=T;&sJ#G`7!O^Pq$FY1kKWdGjUQXL!FnX$FW*HEsoul^VkQgmSZ0F1O?mN8`O$zw&CY! z5AOlcS?>vDGWxd#nI+2D2A1VL`H?&govlrle3&{tpLG#vb|>p1uEp?;bJ#;mTy@-& zUx$Y4jzv}T+?(fdOt&2GxkYi=IOdOBK_1I-|CM^&f7NO^Rr44N=FxAK)2iR9=5Y@7 zPiRB?1GJ@>yPq+^JdO$GaZLC!wwi{9bdm499`F0_p9dX|$G?jmwgoh_#aHsSfrfNZ ztSN7-*>=o@+SYN;Jm?@6+qT28+UF135*pgldA;?GbNHfm@p_!6-Z2k4oYS>y2l3yw z4(D{*;aHXROLLhUFAHE5mjxo&lKfx zOt(Ic=|w(i{5I4$YgY$j$P$KwFlIno9WyHD(MMCn0MBeSXgK?@s1Ijy~teca*vIy78gk*A@B@r%xG zb-E6uPTmc5pew93sMECub-MPTPSff%txnTLKK8ofjMvvt_o6Zy?JkPL#=d#?Jm}zl z-nJc%-R;)JSSZqAEa-FZu|+;j@2TzTaLjC1hvUO?#z@B$Xc$wf&Ktdl%!7`l>hPN# z?eM%*?eP8x4fjXqucn>9wld!~UQ(Sa(BVB4+R}W``-AJc_F30rUAHNU^~QOMbJePO zn3q(}^Yd4b$9rT|+vvMjH{|&)UzEl9A$(`tLqoryP3BD(@jq|6=+pD2>ofDH3*UG8 zoN0XdoasE6`A$eX?=j7NvooD5DbqOq;;WWqd=9oOpSO$3(w;II=SR-FyoWeX@g8EI z@!bV9yt~jouUiMN`)pG+kL9>l;h5lhM=N83X1hA* zr)}$Se%P)Z&KW*Tds}~KOZDfzSUHdLjH>0}=gN6pcPa9TmAWwIwrz(#bxcT~+q8r6q-CGBt3#i*t3#i*tAla1Z5_5tyLPaqR{5QmbE2a8 zmu=ZFM+@@-=fXbE_>Abi-L&`iR-PGs-g8dTj*j=wgASj6+qHu^a$#FpH{-t*e`rV1 zyMA@}uD=x>+R?6#+3awgN;_Pqa!%kp)wzfBRMu8%jq6ym*-=HuZ0o`5a80>YJD$vK zg$7%V?J7E)`?jmYxf#tEVjbF2TROL|n#cZLHP38gmCrNAZYyhQ%)J%)bCz>y`>yj!$DyM6HhwIXVH^qj-5S?LjK8As*Vxf7t;C;wsa+kjjV)E|a9%tQ zb`-A7HjZ&0r!72>3YvKy)n3w`TLumPD^xUYm_NRoV;71slZ-sP6 zPCIk@oSZJn=~X%H%IVcPU7FKta@w8KYjgVCoIWq7JvqHDr`PB7hMX?T>5VzPDW}iR z>GGVe$mz{Fy(Op2huC9I{c>8*X-7^wbNZZ|F3IUtIqk~n)j3_7(`$0tozrV``rMp8 zFQ+{@y)LKM=k$i0F3ahSIlU>T&(G=doUX{}%{jd#Q07nny$x%NyA8P~{P#9o0y*uP{uBnW3P420s`K)`HZl80C zWIP+r@;w`l^@UOy>-(>;+qnZY%v-pRHSw4uHSw6gH1R02iN~1Q#AAL^f0njz9smvV z5$^L%Jbcl_V{NI4$MaYd4_`O&oTpi?ZDP5tu2Wad6a8u&>DPRXGx(vAXI=DvBQN^U zH7oOmHM?A{kw^T8yp6o*>qcH|PoII+7uK%xyp6n=w~-giXyoy1AIfdy#aPght;0d2Y(HkJ&bjaTIN7%&T0Q*BDHB##_omU+32-!?`;& zJX0uR8XD5nEBh19>hsJ$xj(yv-+stqIpNDT={F?nazaQosaq2qrn>NT8H|l+T ztRM25de!e`Em1q4t!E*xcE;b@@L}w+zLph#6GJn<)&DJI?q)xbdD;J3e}KL2`hop# z;XFn8@wYy_8F}qzyqWn;yJx(!tiR$F(|JF^Z_h_GZ~U!J%hC`2ewOyRk$o7!{`_~a zKmVpNijxn)cgJ(|<_X{tXTC`|>n2=#Mti&%<|hFMW{z1Vx6iCD`bB z1KP;g75)!^`%;HCqPwPzo>`!c)=3-rM!G{A&99A~VSsJnx;A=U83k2qmA}c{pebNHu^obe)J3kZR9^=gN+XpU)rb*+Ne%#RHrtoQya~%jp5wFyi9HM zx;84Wji$9xecGtJHk#H(^+y}=U$F7wP54xUO#Q4_jPOy_jPSVcd*eqXrnf1 zqh)BL`L)rr6ZNClwbAR^Xj&UhYoq$KQF(1Nt&QrBHsYUP;}e^wZS<@}{rIN0OxuXA zV52r`qvuHIN6(SaM!#{_M$ehhM)PZ+GtuEO>3k2v{89&G_8&5zc24I z3ppO6jSD#*qm2tW9;1y5IUYZ=2*&Ve<3jE;(Z+?`XQGV@xz9u!7jmEJS_FM2+PIMW zOtf(!_nBzpLhdus#)aHxRxg4+6K!0`eJ0wtko!!uaUu7aXyZceGd#~M`B|PHeBOnI z=iUE6+UH$pc((kvJfHZi360N^A&)%s@ch(a9-sBh&sDJ;Wz6IApm~%r zk22=*Scd!FxlNf9Rn8O3sS*dVoGN)@IaPce%c+tlmQ$sDVmVdv z#B!>%X)LEo9>$-_Z5s1bX`h&2VYA$n$J%|J_a8ORR1E*= z@{;NIAWb~WNaZZ!!<50~w1r3_;i8qV>Q_Z9NmZqU$f#@e&+j16dr4c>z^@s#`X z+-7L7S-F&F8NR!*4ByRphM;kk@@(^zXBob8F)uXaHSSZMa=cp#{(}ZvluLQ~+5LQ; ztLlC}&s8;V%JY4!@0f0+E!}TyTUw8lr_Cvk_eXX2MO?#~lhAPHq`bX(xzJFqG5HVR zUDa^*qwkedp5^+jm+zzee!%lcf4+dHT)Mwexs+!c@jfra0W`#cKKQMi2Ms)9E#>+C zKjrCD-iLc}X zaw*SvNqLsRyWMc6Ei{~IYu=P+-jt_L-%Q<%XK3)1K23Sb_2<5V&iFp%t?sH9p4sQ~ zS-8hAM&8zf%pEPr+}VQ6T`kDWriXnW!Di1=n@vxn%t#AmArr=0+yD2~1^BdaZ{#o+52g5d--oH`Yu8lIYmER~cTf4dk#IoGm{FzzoX_UEd7MaGf zX0yk2BFplfGO@@xtXcS89vZ%vCx(l7oE!Sxa*UB-On`=VG_K2Jh_xo&*xAHeQ@|qz zo8)dU;2C479mH4@kC z0iFJqtH9>>qbI$WvF9Z0KZ1t%wGPIHbugZZ`O0~Wry}1p>NUQLWQ<+Qj`3Y4V|*9M zG?u0RQkgGgS=ieI4e@Qgjd#m7-Wl7oBhKNN+qy@_-<-t|_Q=HFFS)w5eSX9=w7)pTDv^oCTc)`=P=9&t6@tf0a6Tjwdwp z9M8`c@bE>G+`0nZi?6PAei>hTKY)hw8IRdjD2mZnunOEoQL`>_4(1VeSWlTp9xL-oM`$A?3j0*#_S(p zr*Q-gaiY&m>$5y=N@c9C&y@BhpEK=C`_b$FY(v9;hI>xG*P-G1Go&3~pke%QFPGQd zCzbcbdDlt%&$~{?0_*PBXx$wf9Y<2$OY!x4^EyI99k-LVUqC~@_*e@vjDMwiD8E$Z zLE`#h)&=!BG}z<#5ZW-e&sZ>REQE88uOQDOSCHq?E6C%0p=y1MfBT{F?igacr*X-+ zSt_%hvVSU%0cePU3#9$N02=myI_EY!AmvDWF>>Nw)q>NsK>C1YHvjPX&X z$9n%VzHy!a&4|;EU&-SG8sfowRhf)smB|>>Wik)ruXKF>AodWKHE8w-|EHe%V#5{W zv0qdz$2fA`&Ny;?&p6VSbQ~>{c|~h_n$~S-hbA8W3Twc|hUbzSEBK>{XMKyl&$Qn^ zKtB7ub!i+2u(NU=%ef=h18r%%aZXt^k7GyGJo;*wSkhO};468q1BJeo^Qd>SMx$=?Wbk&pbfM^&|_QJhT4$w9-=(ww~jZ?Zz;Fq*Gcw~d z4;sodw$piIQEZpV#JR710@=boLX3p+jWx?R_VlkdHS&myCSJ6?Q4aqVetWD;jO`V< zZs=^W-nI_xZCeMvX^mc#cn-D8q3U8pc`Xw@p0trE(7y@W|Vh$~}>{4>b6<%>U?ZTL<&kwsl~~ zl1bX#u>@K;mri5Hdv(=3v_a)OK7&*($2on~Jhnxe=j-^yehLl!w5UD3Zhx{Lf1Yyh ztk>ydSq(}IWKGW`sUPi6XNVj1KwB!uduZBUjPI1knAXHI=2JPJgHxVzPv`Lr4e@NB zOnKO{#Q#xqT=9R@99N3`)Hv?wr>c33gQ|JF517YsUfW!+DzeS%wxQP46$A+F%B5N(3a!7Y98aEY98lzRrA`NMQh8>JDkH7 zt>Jx2W(p%0YGU~lIy z<+`DT&&!U7Wis@gQW@v?>M@QjD?a0-JmflkW>L;(7Ug^{GwpMuY2vI@#^-{sa|)b|^G+RF25 zqmQZEyz8W{^RAOvn0KAT#=PtFo>taIMRA|Z?c3JD7!&r4s<&bNsENn@GmJCN-yLV1 zzjH5Z;xPwq;!#HDHTjqU4P(Z&c^Vqh=r5IVo>`{HakWgwHMBAr$M7;4^n|+FPxMKC z4{72NlTAFI10ACq^U`li%S2bH4Dnhj3i9o?&(rAftR!uVzik)RZ-Z^NMg0AetFvW&%o|(_g@(1z z$MQ5ZeE&B@ni!b=b^u?Wq|Hr3GrrI3a9^|gf1qLQ)IG!MbAPaFt3Q$JgNC$g;$C;{ z-RnP{r=cOeFHb{5I@;(Smp*uYw}@?F&kHnsZ>WuaZv+kB{%E6VZS<@aZKOX38+~W0 zjq1}z^=YGNZ8WWornS+uHk#H()7ofS8%;+W{Z6V6p5H)XTlh{A8ora%M!#>=Ms3nY z)7t3wj@rnc+hAkgtEO#KpEjyb8%=AYX>ByEji$BHv^JX7M$_78I@*Z6!A8H!)JD_V z=y#dg$hVlmM!&h#M$_8(wzp5)i2s6(Pd+tmqxrQ_ecEVR8%=AYX>ByEji$BHv^JX7 zM$<1|1o0ScwEg?A8~YbrJVqOBe{Hn=ZEMrEwcqXjw~ohXqwTMaw!b!-*2aYpk1t&W z@%Xt#U}N;-Lhdusj|zZR$F${mHk#$Q4in3%k|&m9+ggrmCzfN{a!gwe z<%M!wONr%F$-^2=<@Skrs`xGDsp5l}r%HWzrm9?@n5Rm8VxB7XiFvBjhk07%`Y>;* zoF|r3#RsvRDtTf#Rs0sqsgfs_Q^nV@oGN+x`fBwv^h@8fLc@Dj-Z9nhfajSf&~WAn z?}eIpydP@fnb-a9x86Rz2YxN@*?2G1#N$0s6VJSlQ|^lV`*zQ+vW%3coZr1`pWnTE zCW~?@&-cZfkn=1eXgG^VTina-SyS%A@~kQ4QXcQn!nsnn;TOLZe)06Xv?iW%AIWWj z23vTq)x`6i<&WmJK!Yv5&rNy0vrKvBP0x@rZ^|=o%Cl}4DA)75pqb})`OZA$DaSXG z;fx$;I7ddgl;?Y7zg@6>{dU3j{agW$cdOz1eEuIQd=vQqdxz!m?zP76@Xh%v`@%Qo zb@!ucA2is<``55%*>i{3yBy9Pvdzy>F6V58INiWIGTS`meSQ|+A5pG0Lxat>(O;vF zbE0a{?4_I|YTlHmE$_|qLPK8LJms-prHN-5shs-4_Y%Y|G{lSgQl9!!p88Ur?ePKZ zdqMuaeeeC#eolF|QOYx~-&7jo&=BLcQOYxK$}=zTzian1Z-8d6VBTQflxNMP=X3Vp^JG{l;I`DJ*XWd{vs*_k)xDfcV6EznF`luLQ~%5M!F z>-^TxGus|2;5m+`a_05BM8`zGOLR;$Z^|=o%Cp_vH{@A+&~VnCyf4DDzd=Kvu?)XG z^FMw3&d~GnEFWq56&Xvz9Y+W&(cd~k!iH&v#rU5 zdyFx~ck`ir$k+7E^=!HtZTj3ST9DZ@i;R2X^pW4$e7*&lM_Q11s0EqX z{NtQZd)#~XvRU*r%FI@lXKAR1{Vtp-Qyh!#`BKJx!L!9;qs)dD^gP^x%qxf&$_@LH zWBJDClgthLW)T{`S@fI;wWTqydj*|qSTFb8#oyecW_~kw^ZyNl z40E=b-=Ayvy?H6$OrqQWaf4xy=y=1@TIX+4KmRih8vZlxeR&!h(%4!mgI`N!@LQ?O>yY`4ynUd-|F`F9Xh>UD znaq}@oZC!3&Wfu+vj<;Z?|7nsNB!&fQeWkuLGFzOJbch3*N+{4LmB!G8hrK9JPi$L z+Ne}U|CZ_5L|Y%PGuLLG1kLzgkB(>SS%_0;@Qdfo+E<~WuX;|1aSRRDseju#UONvu zY=^(#*;w14!8U!q9iHs~4eg-MQyxBV;^E^a-fNcDmVAe{@XUQ^SiioT^z}D#Pb7_> zI_}A@L&J6IRyhytQaR7lSCGfHdlGxod$;~_%r(9}Gu`W+qwcwxo{jExXt++FXj=z% zbUHRSmRnFxsSLiZzY9Ia05rq^zHH(dE2$j*YvS48Q#oz@FlBg7AvBy*=-x}qgoZNF zRVssBr816Np53i(&-3=a;(6SrJ-6Gm<5ro>Ti;p>XCXKKS2(fUIf5>E&~OgKXGt5| z&=9+?Zb1g0m+CRjJXhQILY}|P+HTk%Z9Uv)Zas?nk=N}<~pE3$M2I?1{!1> zcfXRy5p-tUO?i$1DbKb}dDN||=v)(hADHu2Q=ja&{IoARG8xCEG8xCWG8uebDnosjl#M~3!ROaJw_by0j8z@@qjDbFq;ek0S(@7B zoZWkrb9TQwDZ4lNOrX5a1l~)rW8QV*!+F=qoO<4MGRK;Coy^hZU8nQ!wB5Zg+Mm5I zI<~y21sUh)WqOE*QW^Se;W>qk<7L{<>7SMJ&|fR(ah_T>mZ!EcPF2pM57Kd<$hVI5 zwvl5!<7?$S`mJg?`mJgn$La?e8(bfNhV=pF6X9Ovyh8iAf0fEO#+K>9clB}Nw{b1P zIdRIvU!5uMcgUwtp}{8ZJEbz-8_M)pw=$X8%5pr_9>-JX0Y!QmWoE0F{aHQsXU5P% zJ&iK<)uOT*WoEM{kqP&1ZS=lxJ>q@8kwKD(xJ-Y1?U#@cz- zOYdjiBj;Nu^_h2_#L~R$d>!-HqPjaj^x3(UXPQm(po92s+Yb6{+d3F$+Sb85xl~8d zoJ*g(9-+@&M=fiYG9AQV+d5i_k1{)E^M`%i7_+Yz>F~P#@cL~2sG?&we^k+dKf?M= zWB+iCr?Kr^%WxfNE*aN*%Vg*iVO>@GTz}OMj+3s*Hu4;IQyybl6A!zVxMt{HG1n2@ zkJ*CXE9b$+%6arz+1iS}FOxw}SU=T2uAfGqxu)94)3+(l82d2omad7J&o!}D;?x*x zR|jp^whm&VZ5{ZsZ5@suMQa@P4c9mv>xyD9=}&Fzpl!n%hi&P)M~n;CJsNqgG4{jr zxda;4ALRWWJpbn!8vf_nwTqNzpG$epThsX`_sb?8_pT-$c{}|NMb|d{Uq#;eb$pAo zb6IG7J}8xOE?cGtn@VM#Seh+!Z=k+$zo6@ee}-S&OA8JA$irSW?1KjTI8!C;GlzzK zL>lkb7=4*XNCkn`u%}^-16pWKbl`ZnqNPf zUq9*x{b*W0n%0lX>qq7Fqu2GL*Y%@m{b>2oj|m`!JVqNAa$CP)5w!Ii z7lDn@j|({-qaPQtjnR(_xz9vDE@T@&z6knEv~eNFW3+K0xAo>l(AG~a0vn?r7jisC zKQ3e&qaPP?pNW24$Tspk({+I74WF-};d%ETlJ@x)8lHFmQGOj7uK!|w9U87j9mb0~ zeAZKk^;U<^Eb8#OI=rq9udBoBQHMNr$Ww>UHR|v=M;%^Qhu78Nb#-`s={(dW>S(7f zQAay<;r`!tyF?xB)FtX@r!L&z+OA8~(N0~Wj&|z8xYKrB7#G^s5$$NlAJL9>bVNJa z@oBW99UY7x&vhJYN5`M$>rv1!zWiCft^y6?%PIDEyN&}5>p1lD?|Yf_$M1WY^qcQ{ znZ(uiy-ecp`(EagOKTZx_2DdQ*7s+A^A00h%{kStWUn0Wce0bnJo#kUvz%>)?^)lx zE6IKXzGr3gu3_f4@{!Lwr|dK`PjG+a{mjg7-W$yPRzAwGPa^wMO2S<<~fv6InM{K zAdl}{JU`yDp`q-1a$BGw?YojP8TUq&$;7gJ*JWA03$rZKmSsAYHJ6OdAv~@B~f2#YvviADDvi0=6Z4vKdkyxU88=Jnesz6Y=Q{nVqpS21tOQ_kQ{fcU6xwzf~^f;nTWx zz2U~`y56?B-a(r-@s!gCcQcRI2kSZ4Nx76~8BZeT85q!T28KNM33%p$dnG(`!FShw z&%wDK;ro!sIG3IN6~6PaZob>MZuIpgo_T#geOLb7$AgR~^8EHgeZJ>b-%@x-i3iW# zfM%Y(Ak8Vj1oe=XcmA{(8=gcYoL4zJ8I*Q=WNKp1v|RuFKX{l*d?A|6S_KSsFEHhV71D;advN zF5#Ps3>_V|<+JGXdwyv6o?o8*z!2#h5ypXgCyWF2`R@3Z{2jDsOc*aIPkkxR zyuPp2_r9;z_vTG`=1qCZxu-?nyZ1%k$9*o1Jo~EO4H=WrnLeHJlzRj@`!sZ>Pp3S~ z^_x$9;5VQ8z;aWb?UC}#`#$p0N5dY2&Ak6JZ^|=o%F|b$A#e9{r@s-v-@#WYPhX|H z4;1j!H-bLf4I0h{(Y}%$GA^pZt1 z%g+$W@-sv@w~4vY7dSJ9=R3xSdKgFKIo`;7I_J4hMV|Y>KTyEivb0#g`-j!m~l=M<0$35^{w@S z{Z#d)J^#j=MATwwZ}r(&M>DCN9IDTlAa zeJkZzH+^7z^#L*4WXluql+&Ne8B4@%6OTU8#M1|9UfQdPM>{w1XtTg;v@gmv^6Y2U zSDy8?9u0mE{x`1YkO|+27}x2y>yAv;kGmgq+7<;onCZGE?8Lwx4M?Poj)VQYv zzQ4KW%=~`$HMJ%GlDzJ*f`gpxDE~1J=e?sfbv`~{{zah zPU9Q<8#J`(4;1h|RKUX@O?l-_azE1d(BOOZrM$Pn`)b}lprL=5H|3c(5{oA^mw(h2l z4Zl}5Ht4V6|82c)YG^C6CrM&)f%%ct3)wIK5j#ulF$?aw|l+MkQsw6VWahst?=_zLpa?mpw%cc7uK z6~#(p-+Guit78{5j9u8;whm*bT|3@`4%bioUpm)M{9iiPPE5OYV%olD+P-GmzGm9K zX4<;6s{=c_)A^0hHU96Q&pMRX!5IEsWBIppyP(r{An(}xUgSOJYI|-cG+gJt_&qP< zUGJJ+2h%^!jr0$^!fzQl|0g^HKF+%NJBdTrG>m80G+K%G?N^Y8@wjq1#Czv=@U^x< zgKg=(*72iE#_^*}2K!27=(D9V+WcwS-?I#$;Vgq;()LN{bf0ZOhI>t^9?N<^y1l||CH%5-pXXullp`ETJVqeH|G!Z$z1avtKK zavq-(w5@TRE~<~$<9JB>R?g$IMb&bg5B~_h_4x-H&Tw)*obqUsCZ2QORL*&G$}?{| z56AaSJbc^4GtSby_UV-Ob?)JgAJA}ru@9BWFdu5tZGTAfg*9{9#`%Qz4EtW0jD4?6 z1{;^8_swT$i*#;my}tPWkBePt9`CjGFYmRj+?()yp$_|wI$G>+ZR^0-ZR>EXNaIZ( zy8Z?Y>u>lj_(vb+V^`%ojulnQaokMv*soJw(OA$pwiT6KmdCzX5VuV{;`2(dQ3Bi3wq{~v0q!3Hmb+I zt{&6sF>SvtlcBvzWqcMZ)8klFCS&}kYfNRaVLVmM<9)Ac9`DIj^H}G>{9XwSKL1AE z2GE)Dw@k)%DwDx?UFmw)i9BwgA#R=_osP%G&=>RT__A#s__l2w^pm!AI9E&kQC5GS zjjHDP$Q9(V|2|4wbU&|NgJztm-O-od_n@Jz7;j5ujIY$*w9Op{%4F>0Wipf%*1{U+ zq&}aU_W8V(`z*G!t-}~i=f+j-h;{KDCAz{pN_CjFF21vL+%XLeX`k^;JE!$}tV=sO z=+~hx?dYJd)YIoH??vf4&?EVr5;}7)DwAn{#``jC09UO1VWEgwG{vyXb*NPqUh|MOR&tk4AH_Cmg zfQP;%zGG`V@3d^be-tY95~(tLD*fRrAF49N()r z=I8HK>OODE^I1`z&-^KmdNuJ}S4ic^+mc<$yPe8;D7$hVW1#99zHM_QdGw3VJ^Iw= zo@eOS>AbUX9l$=6t}ocvEZaT`4Sh7oB|PLhzl{Fd`0q4mhJ447d>nzse5EqfwN!>@ zfX?(C`Ekm!pF=ax({N5!CS&}jYg^7gd^U6b;j@|VR84!XM!rr{Igih=S5Qv-Wbu9otQ^OR?tr@T)U@U%6RbDn3P zah~UW4PB)&=q{C^tfimM+X5P5J&pbJ`PgSx+t_Dc+xT$aSD^9UIqy2T_s+Xc{4?)5 z_2*Y}e?Wsj(s3ibXWN(cr}r=Y`K3HRG^DNjeCxFC^R3f<@MHDqu^k%X)cbSFbImd3 zMLG7!)y(U+wo$H;$DFSzFLTZ&UX=4&UG@2`u5?n9Dcuv?I-{9VyScro1TUyvuT(cSU`TytiMIEqC1VJ_`-^VZNOT-ylLmJy+z{ zq2c*_;nC@^Fzb+59axy;ri=yd1y%gNq!v~(tZbFe$UG<+9&iExjZz;PvrWb z!M=gN1$Bt+V0_sQ#+U7YKWesvXKvXJUbh{*ZaaA0cJRzB+rjI$gV${buiFk@w;fE| z4yJ7f)3$?Y+rj*{gZZ6Xn09Vq+ICRhc2M4SFl{?%Uu*~SEY>=__isTg#X2nJcKD&c z1?>>)u$bH7J%0<@A=Y6rw*zBq{S@P^_g!chkGW?w@uHmLvT}~gQLd49O+ntsYm{Rw zX(}V~8s&)fCb`IKl%p-0E{_c`%8Xr+7zDYXMXccJ@Z@n6Uc02 z{>@zYyMBKw=QEGa{vE&lo}RgEc60t){X9DcKF{tmzttc4JRfBn`BvV%Jj2fX<{4+^ zw|V~sdfxJu@Gg7ixAw5E9nKzLZk(|$U4M+{CFagEznQDg{I;xbQkN|9VlZS6y&W-{H;Clw{?lX(Np(XZUy_qp&8%BcF6O2*>^wC@J`7!1J_vn-WeLc zcb4}Kcz#a|&0f#<#IAw(Y|VFS;o16CJdd~rlJZ;wNqNe-ht_Wj-G}=)?I+K@xP1E@ z_Ts*pX9~-8o@g1)6D>oY&!F1pGbrE7g}km^Dd*aia@yzGojlj>qJ1e(`%<3IGT+E; zfo9sGuTq}RRVmMBGT&!d4`|5i^HR!ljhA)}-%CO>|A*bWrM$Qnyq0fezKz_Yd~>TD zziW*={YT7)`a(l}ty{{oZthFvd+4yg^)>V_>z4AYTgr1yDCJo<-zE8dH#GD6Zl8ry zo^mUYyCwgo#c!6COL@xCM{9kL^X!4XH@tCLF6G(2zNheePT!CEJ*PfMdHNvbnb&uz zwvq2rZC~@IJoBbJ{r8)>eb8W^Hm5x0d?!WRg?CbK>JNRtiKh>IkKnie&~GM}-z+2L8Ed}R^!sFJhHpb&-^CjDz8^L2wZ-*s`#v=Eef6b0<-UlVeu2)!ZV}J- zRE^*Is*m?rA+CI%WnAfJ_tZ9i>#Ltro_CT`%HHhZ;0{Ezg(6 zZp!l=S;}Lrsfou}TX$Vdzd(auv@hl9Kld>B4KFmK4IJ;Ac*=3#3i_ZkeolFD?Zr57 zoyBq2zVCXg{RkSqA(!Wxt8MO@t8H$%u3I_Ax~Ak9D{m)q_I+q*BYow25Bm``^dtR} z@+`wWq3Ux_sQQe*l(+So;{TQRebX1R>2pQi-h#|Ev&guXqaNmN+|P^4at%ru*QI9D zW=u9>}K7CntJ?`%Qly|c);UTRscm%h6NnfJ^h*1T=~ zPUHs)c(w;)&v)%vcC4|@p!s{sVi|p{jJ`%sQ+c!LwjIr9I}Q}&vu%rPYAkR2EHbv6 zx@}wAtw>L!j4@IsGgM%saZ{G>BQ3~aW7BuX=x*W>Urqk~WC71OEV9cu)Gx;2wiaYQ z)PjuhY*~%>FUkmOdzR(ep7Gp*OjF(7S5P-}HNAJXJmcQ->>J)o8owP!PvtzeN%}sR ewrt`tre=<*#uNAQncvROpJARQpL@m3@Ba_iy#P@F literal 0 HcmV?d00001 From b63e4016524c57f9f5abf00a3ae8dd885a0de81e Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:27:38 -0800 Subject: [PATCH 06/17] Add research task localizations --- .../research_la/text_species_tasks8a_de.txt | 21 +++++++++++++++ .../research_la/text_species_tasks8a_en.txt | 21 +++++++++++++++ .../research_la/text_species_tasks8a_es.txt | 21 +++++++++++++++ .../research_la/text_species_tasks8a_fr.txt | 21 +++++++++++++++ .../research_la/text_species_tasks8a_it.txt | 21 +++++++++++++++ .../research_la/text_species_tasks8a_ja.txt | 21 +++++++++++++++ .../research_la/text_species_tasks8a_ko.txt | 21 +++++++++++++++ .../research_la/text_species_tasks8a_zh.txt | 21 +++++++++++++++ .../text/game/research_la/text_tasks8a_de.txt | 27 +++++++++++++++++++ .../text/game/research_la/text_tasks8a_en.txt | 27 +++++++++++++++++++ .../text/game/research_la/text_tasks8a_es.txt | 27 +++++++++++++++++++ .../text/game/research_la/text_tasks8a_fr.txt | 27 +++++++++++++++++++ .../text/game/research_la/text_tasks8a_it.txt | 27 +++++++++++++++++++ .../text/game/research_la/text_tasks8a_ja.txt | 27 +++++++++++++++++++ .../text/game/research_la/text_tasks8a_ko.txt | 27 +++++++++++++++++++ .../text/game/research_la/text_tasks8a_zh.txt | 27 +++++++++++++++++++ .../game/research_la/text_time_tasks8a_de.txt | 5 ++++ .../game/research_la/text_time_tasks8a_en.txt | 5 ++++ .../game/research_la/text_time_tasks8a_es.txt | 5 ++++ .../game/research_la/text_time_tasks8a_fr.txt | 5 ++++ .../game/research_la/text_time_tasks8a_it.txt | 5 ++++ .../game/research_la/text_time_tasks8a_ja.txt | 5 ++++ .../game/research_la/text_time_tasks8a_ko.txt | 5 ++++ .../game/research_la/text_time_tasks8a_zh.txt | 5 ++++ 24 files changed, 424 insertions(+) create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_de.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_en.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_es.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_fr.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_it.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ja.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_ko.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_species_tasks8a_zh.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_de.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_en.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_es.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_fr.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_it.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ja.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_ko.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_tasks8a_zh.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_de.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_en.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_es.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_fr.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_it.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ja.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_ko.txt create mode 100644 PKHeX.Core/Resources/text/game/research_la/text_time_tasks8a_zh.txt 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 From 9d2d7a6cd1829d5c27c0b2c44cd966a354acf403 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:28:06 -0800 Subject: [PATCH 07/17] Add met location localizations --- .../text/locations/gen8a/text_la_00000_de.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_00000_en.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_00000_es.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_00000_fr.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_00000_it.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_00000_ja.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_00000_ko.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_00000_zh.txt | 156 ++++++++++++++++++ .../text/locations/gen8a/text_la_30000_de.txt | 23 +++ .../text/locations/gen8a/text_la_30000_en.txt | 23 +++ .../text/locations/gen8a/text_la_30000_es.txt | 23 +++ .../text/locations/gen8a/text_la_30000_fr.txt | 23 +++ .../text/locations/gen8a/text_la_30000_it.txt | 23 +++ .../text/locations/gen8a/text_la_30000_ja.txt | 23 +++ .../text/locations/gen8a/text_la_30000_ko.txt | 23 +++ .../text/locations/gen8a/text_la_30000_zh.txt | 23 +++ .../text/locations/gen8a/text_la_40000_de.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_40000_en.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_40000_es.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_40000_fr.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_40000_it.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_40000_ja.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_40000_ko.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_40000_zh.txt | 87 ++++++++++ .../text/locations/gen8a/text_la_60000_de.txt | 5 + .../text/locations/gen8a/text_la_60000_en.txt | 5 + .../text/locations/gen8a/text_la_60000_es.txt | 5 + .../text/locations/gen8a/text_la_60000_fr.txt | 5 + .../text/locations/gen8a/text_la_60000_it.txt | 5 + .../text/locations/gen8a/text_la_60000_ja.txt | 5 + .../text/locations/gen8a/text_la_60000_ko.txt | 5 + .../text/locations/gen8a/text_la_60000_zh.txt | 5 + 32 files changed, 2168 insertions(+) create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_de.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_en.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_es.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_fr.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_it.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ja.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_ko.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_00000_zh.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_de.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_en.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_es.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_fr.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_it.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ja.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_ko.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_30000_zh.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_de.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_en.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_es.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_fr.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_it.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ja.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_ko.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_40000_zh.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_de.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_en.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_es.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_fr.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_it.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ja.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_ko.txt create mode 100644 PKHeX.Core/Resources/text/locations/gen8a/text_la_60000_zh.txt 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 From b3eae15a0c29fa84f1e7d41d85679f3b08ff0a4c Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:28:19 -0800 Subject: [PATCH 08/17] Add item localizations --- .../Resources/text/items/text_Items_de.txt | 408 ++++++++--------- .../Resources/text/items/text_Items_en.txt | 410 ++++++++--------- .../Resources/text/items/text_Items_es.txt | 416 +++++++++--------- .../Resources/text/items/text_Items_fr.txt | 408 ++++++++--------- .../Resources/text/items/text_Items_it.txt | 408 ++++++++--------- .../Resources/text/items/text_Items_ja.txt | 408 ++++++++--------- .../Resources/text/items/text_Items_ko.txt | 408 ++++++++--------- .../Resources/text/items/text_Items_zh.txt | 408 ++++++++--------- 8 files changed, 1661 insertions(+), 1613 deletions(-) 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 From b2a65363ffc857d824caa8ff0062844698477a21 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:30:06 -0800 Subject: [PATCH 09/17] Add forms, games, species, moves localization Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> --- .../Resources/text/other/de/text_Forms_de.txt | 6 +- .../Resources/text/other/de/text_Games_de.txt | 2 +- .../Resources/text/other/de/text_Moves_de.txt | 26 ++++++- .../text/other/de/text_Species_de.txt | 9 ++- .../Resources/text/other/en/text_Forms_en.txt | Bin 7666 -> 7720 bytes .../Resources/text/other/en/text_Games_en.txt | 2 +- .../Resources/text/other/en/text_Moves_en.txt | 26 ++++++- .../text/other/en/text_Species_en.txt | 9 ++- .../Resources/text/other/es/text_Forms_es.txt | Bin 7924 -> 7992 bytes .../Resources/text/other/es/text_Games_es.txt | 2 +- .../Resources/text/other/es/text_Moves_es.txt | 26 ++++++- .../text/other/es/text_Species_es.txt | 9 ++- .../Resources/text/other/fr/text_Forms_fr.txt | Bin 7860 -> 7916 bytes .../Resources/text/other/fr/text_Games_fr.txt | 2 +- .../Resources/text/other/fr/text_Moves_fr.txt | 26 ++++++- .../text/other/fr/text_Species_fr.txt | 9 ++- .../Resources/text/other/it/text_Forms_it.txt | Bin 8148 -> 8206 bytes .../Resources/text/other/it/text_Games_it.txt | 2 +- .../Resources/text/other/it/text_Moves_it.txt | 26 ++++++- .../text/other/it/text_Species_it.txt | 9 ++- .../Resources/text/other/ja/text_Forms_ja.txt | 6 +- .../Resources/text/other/ja/text_Games_ja.txt | 2 +- .../Resources/text/other/ja/text_Moves_ja.txt | 26 ++++++- .../text/other/ja/text_Species_ja.txt | 9 ++- .../Resources/text/other/ko/text_Forms_ko.txt | Bin 7422 -> 7462 bytes .../Resources/text/other/ko/text_Games_ko.txt | 2 +- .../Resources/text/other/ko/text_Moves_ko.txt | 26 ++++++- .../text/other/ko/text_Species_ko.txt | 9 ++- .../Resources/text/other/zh/text_Forms_zh.txt | 6 +- .../Resources/text/other/zh/text_Games_zh.txt | 4 +- .../Resources/text/other/zh/text_Moves_zh.txt | 70 ++++++++++++------ .../text/other/zh/text_Species_zh.txt | 9 ++- .../text/other/zh/text_Species_zh2.txt | 9 ++- 33 files changed, 318 insertions(+), 51 deletions(-) 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 704702fcaa31b0367ee6ceca06ff55636405b687..a829f1df5fe85b06e572870240168c1c897f23d8 100644 GIT binary patch delta 62 zcmexly~1Y0Cs{LI1}+8# delta 7 OcmaE3yTx|H7C8V9_XC{( 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 478493f54df38129c1109d463fced637c25e60f9..873de5494931f9eeaf1c23ee34071ecf92e08a2b 100644 GIT binary patch delta 66 zcmca&-{-L5io6vs0~dn_LncEpLn)91@q!pq;dDAsERP`(%=ZC`rvqUsP$UH?1_0Ae B3_$<@ delta 7 OcmeBkxMIKIiaY=gU;~8! 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 6376c7ffbdf1003a0d680acf08ea80b9b3c6ad14..158cc321bf6449e226646ffb0a61189f7c5a860b 100644 GIT binary patch delta 48 scmexoxy)+AKN$^P1}=t<>q`!m9FI5-Vuv1s&~J{ySR6Z8PTbi70M&F7#sB~S delta 7 OcmZ2x_0Mv{KN$cI?*rlh 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 From 691f941bb68531ad652d15c46fc53aad110ac10d Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:31:20 -0800 Subject: [PATCH 10/17] Add savedata models Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com> --- PKHeX.Core/Ribbons/ISociability.cs | 9 + PKHeX.Core/Saves/Access/ISCBlockArray.cs | 19 + PKHeX.Core/Saves/Access/ISaveBlock8LA.cs | 17 + .../Saves/Access/SaveBlockAccessor8LA.cs | 175 +++ PKHeX.Core/Saves/SAV8LA.cs | 243 +++ .../Substructures/Gen8/LA/AdventureStart8a.cs | 33 + .../Substructures/Gen8/LA/BoxLayout8a.cs | 34 + .../Substructures/Gen8/LA/Coordinates8a.cs | 16 + .../Substructures/Gen8/LA/LastSaved8a.cs | 54 + .../Saves/Substructures/Gen8/LA/MyItem8a.cs | 94 ++ .../Saves/Substructures/Gen8/LA/MyStatus8a.cs | 69 + .../Saves/Substructures/Gen8/LA/Party8a.cs | 12 + .../Saves/Substructures/Gen8/LA/PlayTime8a.cs | 24 + .../Substructures/Gen8/LA/PlayerFashion8a.cs | 26 + .../Gen8/LA/Pokedex/PokedexConstants8a.cs | 144 ++ .../Gen8/LA/Pokedex/PokedexResearchTask8a.cs | 70 + .../LA/Pokedex/PokedexResearchTaskType8a.cs | 92 ++ .../Gen8/LA/Pokedex/PokedexSave8a.cs | 1363 +++++++++++++++++ .../Gen8/LA/Pokedex/PokedexSaveData.cs | 135 ++ .../Gen8/LA/Pokedex/PokedexSaveGlobalData.cs | 24 + .../Gen8/LA/Pokedex/PokedexSaveLocalData.cs | 23 + .../LA/Pokedex/PokedexSaveResearchEntry.cs | 174 +++ .../LA/Pokedex/PokedexSaveStatisticsEntry.cs | 28 + .../Gen8/LA/Pokedex/PokedexTimeOfDay8a.cs | 14 + .../Gen8/LA/Pokedex/PokedexType8a.cs | 16 + .../Gen8/LA/Pokedex/PokedexUpdateInfo8a.cs | 21 + PKHeX.Core/Saves/Substructures/Gen8/Meta8.cs | 114 ++ PKHeX.Core/Saves/Util/SaveUtil.cs | 20 +- 28 files changed, 3061 insertions(+), 2 deletions(-) create mode 100644 PKHeX.Core/Ribbons/ISociability.cs create mode 100644 PKHeX.Core/Saves/Access/ISCBlockArray.cs create mode 100644 PKHeX.Core/Saves/Access/ISaveBlock8LA.cs create mode 100644 PKHeX.Core/Saves/Access/SaveBlockAccessor8LA.cs create mode 100644 PKHeX.Core/Saves/SAV8LA.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/AdventureStart8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/BoxLayout8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Coordinates8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/LastSaved8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/MyItem8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/MyStatus8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Party8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/PlayTime8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/PlayerFashion8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexConstants8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTask8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexResearchTaskType8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSave8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveData.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveGlobalData.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveLocalData.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveResearchEntry.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexSaveStatisticsEntry.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexTimeOfDay8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexType8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen8/LA/Pokedex/PokedexUpdateInfo8a.cs 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/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/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/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. /// From b0e7e86c686624e8d7933298b1129323117d7767 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:32:16 -0800 Subject: [PATCH 11/17] Add savedata sub-menu editors Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com> --- .../PKM Editors/MoveShopEditor.Designer.cs | 137 ++ .../Subforms/PKM Editors/MoveShopEditor.cs | 177 +++ .../PokedexResearchTask8aPanel.Designer.cs | 223 +++ .../Gen8/PokedexResearchTask8aPanel.cs | 105 ++ .../Gen8/SAV_PokedexLA.Designer.cs | 1027 ++++++++++++++ .../Save Editors/Gen8/SAV_PokedexLA.cs | 492 +++++++ .../SAV_PokedexResearchEditorLA.Designer.cs | 1222 +++++++++++++++++ .../Gen8/SAV_PokedexResearchEditorLA.cs | 278 ++++ .../Gen8/SAV_PokedexSWSH.Designer.cs | 299 ++-- .../Gen8/SAV_Trainer8a.Designer.cs | 942 +++++++++++++ .../Save Editors/Gen8/SAV_Trainer8a.cs | 125 ++ 11 files changed, 4859 insertions(+), 168 deletions(-) create mode 100644 PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/PKM Editors/MoveShopEditor.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/PokedexResearchTask8aPanel.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexLA.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_PokedexResearchEditorLA.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.Designer.cs create mode 100644 PKHeX.WinForms/Subforms/Save Editors/Gen8/SAV_Trainer8a.cs 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/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_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"; + } + } +} From 0b32cbf132702d1d602f4c0acf4b881592b23195 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 4 Feb 2022 17:35:15 -0800 Subject: [PATCH 12/17] Update PKHeX.Core abstractions with latest logic Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com> Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com> Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com> --- .../Applicators/MoveShopRecordApplicator.cs | 71 ++++ .../Applicators/TechnicalRecordApplicator.cs | 27 +- PKHeX.Core/Editing/Bulk/BatchEditing.cs | 2 +- .../Bulk/Suggestion/BatchModifications.cs | 8 +- PKHeX.Core/Editing/CommonEdits.cs | 9 +- .../Editing/Saves/BoxManip/BoxManipBase.cs | 12 +- .../Editing/Saves/BoxManip/BoxManipType.cs | 1 + PKHeX.Core/Editing/Saves/Slots/Extensions.cs | 6 + PKHeX.Core/Game/Enums/Ball.cs | 13 + PKHeX.Core/Game/Enums/GameVersion.cs | 3 +- PKHeX.Core/Game/Enums/Move.cs | 24 ++ PKHeX.Core/Game/Enums/Species.cs | 7 + PKHeX.Core/Game/GameStrings/GameDataSource.cs | 5 +- PKHeX.Core/Game/GameStrings/GameStrings.cs | 159 ++++++++- PKHeX.Core/Game/GameStrings/MetDataSource.cs | 14 + PKHeX.Core/Game/GameUtil.cs | 4 +- PKHeX.Core/Legality/BinLinker.cs | 35 -- PKHeX.Core/Legality/Breeding.cs | 4 + PKHeX.Core/Legality/Core.cs | 86 +++-- .../Encounters/Data/EncounterEvent.cs | 8 + .../Legality/Encounters/Data/Encounters8a.cs | 128 ++++++++ .../Encounters/EncounterSlot/EncounterSlot.cs | 9 +- .../EncounterSlot/EncounterSlot7b.cs | 10 + .../EncounterSlot/EncounterSlot8a.cs | 101 ++++++ .../EncounterStatic/EncounterStatic.cs | 4 +- .../EncounterStatic/EncounterStatic7b.cs | 5 + .../EncounterStatic/EncounterStatic8a.cs | 131 ++++++++ .../EncounterTrade/EncounterTrade7b.cs | 10 + .../ByGeneration/EncounterGenerator8.cs | 1 + .../ByGeneration/EncounterGenerator8a.cs | 61 ++++ .../Moveset/EncounterMovesetGenerator.cs | 2 +- .../Specific/EncounterSlotGenerator.cs | 2 + .../Specific/EncounterStaticGenerator.cs | 2 + .../Specific/MysteryGiftGenerator.cs | 2 +- .../Verifiers/VerifyCurrentMoves.cs | 3 +- PKHeX.Core/Legality/Enums/SlotType.cs | 4 + .../Legality/Evolutions/EvolutionMethod.cs | 17 +- .../Legality/Evolutions/EvolutionTree.cs | 73 +++-- .../Legality/Evolutions/EvolutionType.cs | 5 + .../Formatting/LegalityCheckStrings.cs | 17 + PKHeX.Core/Legality/Learnset/Learnset.cs | 45 ++- .../Legality/Learnset/LearnsetReader.cs | 4 +- PKHeX.Core/Legality/LegalityAnalysis.cs | 3 +- PKHeX.Core/Legality/LegalityAnalyzers.cs | 1 + PKHeX.Core/Legality/MoveList.cs | 10 +- PKHeX.Core/Legality/Moves/GameData.cs | 2 + PKHeX.Core/Legality/Moves/MoveEgg.cs | 2 + PKHeX.Core/Legality/Moves/MoveLevelUp.cs | 17 +- .../Legality/Moves/MoveTechnicalMachine.cs | 6 +- PKHeX.Core/Legality/Moves/MoveTutor.cs | 18 + .../Restrictions/EvolutionRestrictions.cs | 17 + .../Legality/Restrictions/ItemRestrictions.cs | 1 + PKHeX.Core/Legality/Structures/EggMoves.cs | 4 +- PKHeX.Core/Legality/Tables/FormInfo.cs | 59 ++-- PKHeX.Core/Legality/Tables/Tables.cs | 13 +- PKHeX.Core/Legality/Tables/Tables8a.cs | 309 ++++++++++++++++++ .../Verifiers/Ability/AbilityVerifier.cs | 5 +- .../Verifiers/Ball/BallUseLegality.cs | 16 + PKHeX.Core/Legality/Verifiers/FormVerifier.cs | 59 +++- .../Legality/Verifiers/HistoryVerifier.cs | 1 + .../Verifiers/HyperTrainingVerifier.cs | 6 + .../Verifiers/LegendsArceusVerifier.cs | 238 ++++++++++++++ .../Legality/Verifiers/MemoryVerifier.cs | 6 +- PKHeX.Core/Legality/Verifiers/MiscVerifier.cs | 100 +++++- .../Verifiers/Ribbons/RibbonVerifier.cs | 4 +- .../Legality/Verifiers/TransferVerifier.cs | 22 +- PKHeX.Core/MysteryGifts/MysteryGift.cs | 4 +- PKHeX.Core/PKM/G8PKM.cs | 6 +- PKHeX.Core/PKM/PB7.cs | 2 +- PKHeX.Core/PKM/PB8.cs | 183 ++++++----- PKHeX.Core/PKM/PKM.cs | 1 + PKHeX.Core/PKM/Shared/IDynamaxLevel.cs | 2 +- PKHeX.Core/PKM/Shared/IFormArgument.cs | 7 + PKHeX.Core/PKM/Shared/IHyperTrain.cs | 29 +- PKHeX.Core/PKM/Shared/IScaledSize.cs | 35 +- PKHeX.Core/PKM/Util/FormConverter.cs | 90 ++++- PKHeX.Core/PKM/Util/PKMConverter.cs | 12 +- PKHeX.Core/PersonalInfo/PersonalInfoBDSP.cs | 2 +- PKHeX.Core/PersonalInfo/PersonalTable.cs | 40 ++- PKHeX.Core/Ribbons/IRibbonSetAffixed.cs | 15 +- .../Saves/Access/SaveBlockAccessor8SWSH.cs | 2 - .../Saves/Encryption/SwishCrypto/SCBlock.cs | 2 +- .../Encryption/SwishCrypto/SCBlockUtil.cs | 4 +- .../Encryption/SwishCrypto/SwishCrypto.cs | 17 +- PKHeX.Core/Saves/SAV8SWSH.cs | 3 +- .../Inventory/InventoryItem8a.cs | 35 ++ .../Inventory/InventoryPouch8a.cs | 46 +++ PKHeX.Core/Util/ArrayUtil.cs | 2 +- PKHeX.Core/Util/ResourceUtil.cs | 2 +- 89 files changed, 2261 insertions(+), 333 deletions(-) create mode 100644 PKHeX.Core/Editing/Applicators/MoveShopRecordApplicator.cs delete mode 100644 PKHeX.Core/Legality/BinLinker.cs create mode 100644 PKHeX.Core/Legality/Encounters/Data/Encounters8a.cs create mode 100644 PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8a.cs create mode 100644 PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8a.cs create mode 100644 PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8a.cs create mode 100644 PKHeX.Core/Legality/Tables/Tables8a.cs create mode 100644 PKHeX.Core/Legality/Verifiers/LegendsArceusVerifier.cs create mode 100644 PKHeX.Core/Saves/Substructures/Inventory/InventoryItem8a.cs create mode 100644 PKHeX.Core/Saves/Substructures/Inventory/InventoryPouch8a.cs 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/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/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/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/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/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..ecbe1321946 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 can not 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; } = "Can not 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} can not 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. ///