From 29b3b695bdde3a4d7220e14907736bc079f60aee Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 4 Mar 2023 20:00:27 -0800 Subject: [PATCH] Pre-allocate some dictionary sizes Skips the bucket array resizing steps a 256 key dict will garbage 5KB; StringConverter2KOR wastes 100KB of garbage. Zukan7b: save 144 bytes and eliminate cctor --- .../Encounters/Data/Gen8/Encounters8Nest.cs | 2 +- .../Restrictions/EvolutionRestrictions.cs | 6 +- .../Verifiers/Ribbons/RibbonStrings.cs | 5 +- PKHeX.Core/PKM/Strings/StringConverter12.cs | 8 +- PKHeX.Core/PKM/Strings/StringConverter2KOR.cs | 58 +++++------ .../Saves/Substructures/PokeDex/Zukan7b.cs | 97 +++++++++++-------- 6 files changed, 92 insertions(+), 84 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8Nest.cs b/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8Nest.cs index 65777d74e..af4169b8a 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8Nest.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Gen8/Encounters8Nest.cs @@ -211,7 +211,7 @@ internal static class Encounters8Nest /// /// Location IDs containing Dens that cannot be accessed without Rotom Bike's Water Mode. /// - internal static readonly HashSet InaccessibleRank12DistributionLocations = new() {154,178,186,188,190,192,194,226,228,230,234}; // Areas that are entirely restricted to water + internal static ReadOnlySpan InaccessibleRank12DistributionLocations => new byte[] {154,178,186,188,190,192,194,226,228,230,234}; // Areas that are entirely restricted to water /// /// Location IDs containing Dens that cannot be accessed without Rotom Bike's Water Mode. diff --git a/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs b/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs index 6e81eaa68..bec5e7bff 100644 --- a/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs +++ b/PKHeX.Core/Legality/Restrictions/EvolutionRestrictions.cs @@ -16,9 +16,9 @@ internal static class EvolutionRestrictions /// /// List of species that evolve from a previous species having a move while leveling up /// - private static readonly Dictionary SpeciesEvolutionWithMove = new() + private static readonly Dictionary SpeciesEvolutionWithMove = new() { - {(int)Eevee, new(00, 0)}, // FairyMoves + {(int)Eevee, new()}, // FairyMoves {(int)MimeJr, new(01, (int)Mimic)}, {(int)Bonsly, new(02, (int)Mimic)}, {(int)Aipom, new(03, (int)Mimic)}, @@ -35,7 +35,7 @@ internal static class EvolutionRestrictions {(int)Dunsparce, new(14, (int)HyperDrill)}, }; - private readonly record struct MoveEvolution(int ReferenceIndex, ushort Move); + private readonly record struct MoveEvolution(byte ReferenceIndex, ushort Move); private static readonly ushort[] FairyMoves = { diff --git a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs index 34882888d..8eb1b543f 100644 --- a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs +++ b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonStrings.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace PKHeX.Core; @@ -13,8 +14,10 @@ public static class RibbonStrings /// Resets the Ribbon Dictionary to use the supplied set of Ribbon (Property) Names. /// /// Array of strings that are tab separated with Property Name, \t, and Display Name. - public static void ResetDictionary(IEnumerable lines) + public static void ResetDictionary(ReadOnlySpan lines) { + RibbonNames.EnsureCapacity(lines.Length); + // Don't clear existing keys on reset; only update. // A language will have the same keys (hopefully), only with differing values. foreach (var line in lines) diff --git a/PKHeX.Core/PKM/Strings/StringConverter12.cs b/PKHeX.Core/PKM/Strings/StringConverter12.cs index 05cdf22e5..6b301787b 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter12.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter12.cs @@ -193,7 +193,7 @@ public static char GetG1Char(byte key, bool jp) #region Gen 1/2 Character Tables - internal static readonly Dictionary RBY2U_U = new() + internal static readonly Dictionary RBY2U_U = new(120) { {0x50, G1Terminator}, {0x5D, G1TradeOT}, @@ -315,7 +315,7 @@ public static char GetG1Char(byte key, bool jp) {0xFF, '9'}, }; - private static readonly Dictionary RBY2U_J = new() + private static readonly Dictionary RBY2U_J = new(180) { {0x05, 'ガ'}, {0x06, 'ギ'}, @@ -488,7 +488,7 @@ public static char GetG1Char(byte key, bool jp) {0xFF, '9'}, }; - internal static readonly Dictionary U2RBY_U = new() + internal static readonly Dictionary U2RBY_U = new(120) { {G1Terminator, 0x50}, {G1TradeOT, 0x5D}, // TRAINER (Localized per ROM) @@ -610,7 +610,7 @@ public static char GetG1Char(byte key, bool jp) {'9', 0xFF}, }; - private static readonly Dictionary U2RBY_J = new() + private static readonly Dictionary U2RBY_J = new(180) { {'ガ', 0x05}, {'ギ', 0x06}, diff --git a/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs b/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs index acf399032..b2bc31ce4 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs @@ -138,21 +138,15 @@ public static int LoadString(ReadOnlySpan data, Span result) /// /// Generation 4 Species Name /// Localized Name for Generation 2 - public static string LocalizeKOR2(string nick) + public static string LocalizeKOR2(string nick) => nick switch { - if (KorG2Localized.TryGetValue(nick, out var localized)) - return localized; - return nick; - } - - private static readonly Dictionary KorG2Localized = new() - { - { "덩쿠리", "덩구리" }, // Tangela - { "슈륙챙이", "수륙챙이" }, // Poliwhirl + "덩쿠리" => "덩구리", // Tangela + "슈륙챙이" => "수륙챙이", // Poliwhirl + _ => nick, }; #region Gen 2 Korean Character Tables - private static readonly Dictionary U2GSC_KOR_0 = new() + private static readonly Dictionary U2GSC_KOR_0 = new(256) { {'ㄱ', 0x00}, {'ㄴ', 0x01}, {'ㄷ', 0x02}, {'ㄹ', 0x03}, {'ㅁ', 0x04}, {'ㅂ', 0x05}, {'ㅅ', 0x06}, {'ㅇ', 0x07}, {'ㅈ', 0x08}, {'ㅊ', 0x09}, {'ㅋ', 0x0A}, {'ㅌ', 0x0B}, {'ㅍ', 0x0C}, {'ㅎ', 0x0D}, {'ㄲ', 0x0E}, {'ㄸ', 0x0F}, {'ㅃ', 0x10}, {'ㅆ', 0x11}, {'ㅉ', 0x12}, @@ -163,7 +157,7 @@ public static string LocalizeKOR2(string nick) {'\u3000', 0xFF}, }; - private static readonly Dictionary U2GSC_KOR_1 = new() + private static readonly Dictionary U2GSC_KOR_1 = new(256) { {'가', 0x01}, {'각', 0x02}, {'간', 0x03}, {'갇', 0x04}, {'갈', 0x05}, {'갉', 0x06}, {'갊', 0x07}, {'감', 0x08}, {'갑', 0x09}, {'값', 0x0A}, {'갓', 0x0B}, {'갔', 0x0C}, {'강', 0x0D}, {'갖', 0x0E}, {'갗', 0x0F}, {'같', 0x10}, {'갚', 0x11}, {'갛', 0x12}, {'개', 0x13}, {'객', 0x14}, {'갠', 0x15}, {'갤', 0x16}, {'갬', 0x17}, {'갭', 0x18}, {'갯', 0x19}, {'갰', 0x1A}, {'갱', 0x1B}, {'갸', 0x1C}, {'갹', 0x1D}, {'갼', 0x1E}, {'걀', 0x1F}, @@ -182,7 +176,7 @@ public static string LocalizeKOR2(string nick) {'꼭', 0xF0}, {'꼰', 0xF1}, {'꼲', 0xF2}, {'꼴', 0xF3}, {'꼼', 0xF4}, {'꼽', 0xF5}, {'꼿', 0xF6}, {'꽁', 0xF7}, {'꽂', 0xF8}, {'꽃', 0xF9}, {'꽈', 0xFA}, {'꽉', 0xFB}, {'꽐', 0xFC}, {'꽜', 0xFD}, {'꽝', 0xFE}, {'꽤', 0xFF}, }; - private static readonly Dictionary U2GSC_KOR_2 = new() + private static readonly Dictionary U2GSC_KOR_2 = new(256) { {'꽥', 0x00}, {'꽹', 0x01}, {'꾀', 0x02}, {'꾄', 0x03}, {'꾈', 0x04}, {'꾐', 0x05}, {'꾑', 0x06}, {'꾕', 0x07}, {'꾜', 0x08}, {'꾸', 0x09}, {'꾹', 0x0A}, {'꾼', 0x0B}, {'꿀', 0x0C}, {'꿇', 0x0D}, {'꿈', 0x0E}, {'꿉', 0x0F}, {'꿋', 0x10}, {'꿍', 0x11}, {'꿎', 0x12}, {'꿔', 0x13}, {'꿜', 0x14}, {'꿨', 0x15}, {'꿩', 0x16}, {'꿰', 0x17}, {'꿱', 0x18}, {'꿴', 0x19}, {'꿸', 0x1A}, {'뀀', 0x1B}, {'뀁', 0x1C}, {'뀄', 0x1D}, {'뀌', 0x1E}, {'뀐', 0x1F}, @@ -201,7 +195,7 @@ public static string LocalizeKOR2(string nick) {'댑', 0xF0}, {'댓', 0xF1}, {'댔', 0xF2}, {'댕', 0xF3}, {'더', 0xF5}, {'덕', 0xF6}, {'덖', 0xF7}, {'던', 0xF8}, {'덛', 0xF9}, {'덜', 0xFA}, {'덞', 0xFB}, {'덟', 0xFC}, {'덤', 0xFD}, {'덥', 0xFE}, }; - private static readonly Dictionary U2GSC_KOR_3 = new() + private static readonly Dictionary U2GSC_KOR_3 = new(256) { {'덧', 0x01}, {'덩', 0x02}, {'덫', 0x03}, {'덮', 0x04}, {'데', 0x05}, {'덱', 0x06}, {'덴', 0x07}, {'델', 0x08}, {'뎀', 0x09}, {'뎁', 0x0A}, {'뎃', 0x0B}, {'뎄', 0x0C}, {'뎅', 0x0D}, {'뎌', 0x0E}, {'뎐', 0x0F}, {'뎔', 0x10}, {'뎠', 0x11}, {'뎡', 0x12}, {'뎨', 0x13}, {'뎬', 0x14}, {'도', 0x15}, {'독', 0x16}, {'돈', 0x17}, {'돋', 0x18}, {'돌', 0x19}, {'돎', 0x1A}, {'돔', 0x1C}, {'돕', 0x1D}, {'돗', 0x1E}, {'동', 0x1F}, @@ -220,7 +214,7 @@ public static string LocalizeKOR2(string nick) {'렝', 0xF0}, {'려', 0xF1}, {'력', 0xF2}, {'련', 0xF3}, {'렬', 0xF4}, {'렴', 0xF5}, {'렵', 0xF6}, {'렷', 0xF7}, {'렸', 0xF8}, {'령', 0xF9}, {'례', 0xFA}, {'롄', 0xFB}, {'롑', 0xFC}, {'롓', 0xFD}, {'로', 0xFE}, {'록', 0xFF}, }; - private static readonly Dictionary U2GSC_KOR_4 = new() + private static readonly Dictionary U2GSC_KOR_4 = new(256) { {'론', 0x00}, {'롤', 0x01}, {'롬', 0x02}, {'롭', 0x03}, {'롯', 0x04}, {'롱', 0x05}, {'롸', 0x06}, {'롼', 0x07}, {'뢍', 0x08}, {'뢨', 0x09}, {'뢰', 0x0A}, {'뢴', 0x0B}, {'뢸', 0x0C}, {'룀', 0x0D}, {'룁', 0x0E}, {'룃', 0x0F}, {'룅', 0x10}, {'료', 0x11}, {'룐', 0x12}, {'룔', 0x13}, {'룝', 0x14}, {'룟', 0x15}, {'룡', 0x16}, {'루', 0x17}, {'룩', 0x18}, {'룬', 0x19}, {'룰', 0x1A}, {'룸', 0x1B}, {'룹', 0x1C}, {'룻', 0x1D}, {'룽', 0x1E}, {'뤄', 0x1F}, @@ -239,7 +233,7 @@ public static string LocalizeKOR2(string nick) {'뱅', 0xF0}, {'뱉', 0xF1}, {'뱌', 0xF2}, {'뱍', 0xF3}, {'뱐', 0xF4}, {'뱝', 0xF5}, {'버', 0xF6}, {'벅', 0xF7}, {'번', 0xF8}, {'벋', 0xF9}, {'벌', 0xFA}, {'벎', 0xFB}, {'범', 0xFC}, {'법', 0xFD}, {'벗', 0xFE}, }; - private static readonly Dictionary U2GSC_KOR_5 = new() + private static readonly Dictionary U2GSC_KOR_5 = new(256) { {'벙', 0x01}, {'벚', 0x02}, {'베', 0x03}, {'벡', 0x04}, {'벤', 0x05}, {'벧', 0x06}, {'벨', 0x07}, {'벰', 0x08}, {'벱', 0x09}, {'벳', 0x0A}, {'벴', 0x0B}, {'벵', 0x0C}, {'벼', 0x0D}, {'벽', 0x0E}, {'변', 0x0F}, {'별', 0x10}, {'볍', 0x11}, {'볏', 0x12}, {'볐', 0x13}, {'병', 0x14}, {'볕', 0x15}, {'볘', 0x16}, {'볜', 0x17}, {'보', 0x18}, {'복', 0x19}, {'볶', 0x1A}, {'본', 0x1B}, {'볼', 0x1C}, {'봄', 0x1D}, {'봅', 0x1E}, {'봇', 0x1F}, @@ -258,7 +252,7 @@ public static string LocalizeKOR2(string nick) {'셈', 0xF0}, {'셉', 0xF1}, {'셋', 0xF2}, {'셌', 0xF3}, {'셍', 0xF4}, {'셔', 0xF5}, {'셕', 0xF6}, {'션', 0xF7}, {'셜', 0xF8}, {'셤', 0xF9}, {'셥', 0xFA}, {'셧', 0xFB}, {'셨', 0xFC}, {'셩', 0xFD}, {'셰', 0xFE}, {'셴', 0xFF}, }; - private static readonly Dictionary U2GSC_KOR_6 = new() + private static readonly Dictionary U2GSC_KOR_6 = new(256) { {'셸', 0x00}, {'솅', 0x01}, {'소', 0x02}, {'속', 0x03}, {'솎', 0x04}, {'손', 0x05}, {'솔', 0x06}, {'솖', 0x07}, {'솜', 0x08}, {'솝', 0x09}, {'솟', 0x0A}, {'송', 0x0B}, {'솥', 0x0C}, {'솨', 0x0D}, {'솩', 0x0E}, {'솬', 0x0F}, {'솰', 0x10}, {'솽', 0x11}, {'쇄', 0x12}, {'쇈', 0x13}, {'쇌', 0x14}, {'쇔', 0x15}, {'쇗', 0x16}, {'쇘', 0x17}, {'쇠', 0x18}, {'쇤', 0x19}, {'쇨', 0x1A}, {'쇰', 0x1B}, {'쇱', 0x1C}, {'쇳', 0x1D}, {'쇼', 0x1E}, {'쇽', 0x1F}, @@ -277,7 +271,7 @@ public static string LocalizeKOR2(string nick) {'언', 0xF0}, {'얹', 0xF1}, {'얻', 0xF2}, {'얼', 0xF3}, {'얽', 0xF4}, {'얾', 0xF5}, {'엄', 0xF6}, {'업', 0xF7}, {'없', 0xF8}, {'엇', 0xF9}, {'었', 0xFA}, {'엉', 0xFB}, {'엊', 0xFC}, {'엌', 0xFD}, {'엎', 0xFE}, }; - private static readonly Dictionary U2GSC_KOR_7 = new() + private static readonly Dictionary U2GSC_KOR_7 = new(256) { {'에', 0x01}, {'엑', 0x02}, {'엔', 0x03}, {'엘', 0x04}, {'엠', 0x05}, {'엡', 0x06}, {'엣', 0x07}, {'엥', 0x08}, {'여', 0x09}, {'역', 0x0A}, {'엮', 0x0B}, {'연', 0x0C}, {'열', 0x0D}, {'엶', 0x0E}, {'엷', 0x0F}, {'염', 0x10}, {'엽', 0x11}, {'엾', 0x12}, {'엿', 0x13}, {'였', 0x14}, {'영', 0x15}, {'옅', 0x16}, {'옆', 0x17}, {'옇', 0x18}, {'예', 0x19}, {'옌', 0x1A}, {'옐', 0x1B}, {'옘', 0x1C}, {'옙', 0x1D}, {'옛', 0x1E}, {'옜', 0x1F}, @@ -296,7 +290,7 @@ public static string LocalizeKOR2(string nick) {'좇', 0xF0}, {'좋', 0xF1}, {'좌', 0xF2}, {'좍', 0xF3}, {'좔', 0xF4}, {'좝', 0xF5}, {'좟', 0xF6}, {'좡', 0xF7}, {'좨', 0xF8}, {'좼', 0xF9}, {'좽', 0xFA}, {'죄', 0xFB}, {'죈', 0xFC}, {'죌', 0xFD}, {'죔', 0xFE}, {'죕', 0xFF}, }; - private static readonly Dictionary U2GSC_KOR_8 = new() + private static readonly Dictionary U2GSC_KOR_8 = new(256) { {'죗', 0x00}, {'죙', 0x01}, {'죠', 0x02}, {'죡', 0x03}, {'죤', 0x04}, {'죵', 0x05}, {'주', 0x06}, {'죽', 0x07}, {'준', 0x08}, {'줄', 0x09}, {'줅', 0x0A}, {'줆', 0x0B}, {'줌', 0x0C}, {'줍', 0x0D}, {'줏', 0x0E}, {'중', 0x0F}, {'줘', 0x10}, {'줬', 0x11}, {'줴', 0x12}, {'쥐', 0x13}, {'쥑', 0x14}, {'쥔', 0x15}, {'쥘', 0x16}, {'쥠', 0x17}, {'쥡', 0x18}, {'쥣', 0x19}, {'쥬', 0x1A}, {'쥰', 0x1B}, {'쥴', 0x1C}, {'쥼', 0x1D}, {'즈', 0x1E}, {'즉', 0x1F}, @@ -315,7 +309,7 @@ public static string LocalizeKOR2(string nick) {'췻', 0xF0}, {'췽', 0xF1}, {'츄', 0xF2}, {'츈', 0xF3}, {'츌', 0xF4}, {'츔', 0xF5}, {'츙', 0xF6}, {'츠', 0xF7}, {'측', 0xF8}, {'츤', 0xF9}, {'츨', 0xFA}, {'츰', 0xFB}, {'츱', 0xFC}, {'츳', 0xFD}, {'층', 0xFE}, }; - private static readonly Dictionary U2GSC_KOR_9 = new() + private static readonly Dictionary U2GSC_KOR_9 = new(256) { {'치', 0x01}, {'칙', 0x02}, {'친', 0x03}, {'칟', 0x04}, {'칠', 0x05}, {'칡', 0x06}, {'침', 0x07}, {'칩', 0x08}, {'칫', 0x09}, {'칭', 0x0A}, {'카', 0x0B}, {'칵', 0x0C}, {'칸', 0x0D}, {'칼', 0x0E}, {'캄', 0x0F}, {'캅', 0x10}, {'캇', 0x11}, {'캉', 0x12}, {'캐', 0x13}, {'캑', 0x14}, {'캔', 0x15}, {'캘', 0x16}, {'캠', 0x17}, {'캡', 0x18}, {'캣', 0x19}, {'캤', 0x1A}, {'캥', 0x1B}, {'캬', 0x1C}, {'캭', 0x1D}, {'컁', 0x1E}, {'커', 0x1F}, @@ -334,7 +328,7 @@ public static string LocalizeKOR2(string nick) {'팀', 0xF0}, {'팁', 0xF1}, {'팃', 0xF2}, {'팅', 0xF3}, {'파', 0xF4}, {'팍', 0xF5}, {'팎', 0xF6}, {'판', 0xF7}, {'팔', 0xF8}, {'팖', 0xF9}, {'팜', 0xFA}, {'팝', 0xFB}, {'팟', 0xFC}, {'팠', 0xFD}, {'팡', 0xFE}, {'팥', 0xFF}, }; - private static readonly Dictionary U2GSC_KOR_A = new() + private static readonly Dictionary U2GSC_KOR_A = new(256) { {'패', 0x00}, {'팩', 0x01}, {'팬', 0x02}, {'팰', 0x03}, {'팸', 0x04}, {'팹', 0x05}, {'팻', 0x06}, {'팼', 0x07}, {'팽', 0x08}, {'퍄', 0x09}, {'퍅', 0x0A}, {'퍼', 0x0B}, {'퍽', 0x0C}, {'펀', 0x0D}, {'펄', 0x0E}, {'펌', 0x0F}, {'펍', 0x10}, {'펏', 0x11}, {'펐', 0x12}, {'펑', 0x13}, {'페', 0x14}, {'펙', 0x15}, {'펜', 0x16}, {'펠', 0x17}, {'펨', 0x18}, {'펩', 0x19}, {'펫', 0x1A}, {'펭', 0x1B}, {'펴', 0x1C}, {'편', 0x1D}, {'펼', 0x1E}, {'폄', 0x1F}, @@ -355,7 +349,7 @@ public static string LocalizeKOR2(string nick) private static readonly Dictionary U2GSC_KOR_B = U2GSC_KOR_0; - private static readonly Dictionary GSC2U_KOR_0 = new() + private static readonly Dictionary GSC2U_KOR_0 = new(80) { {0x00, 'ㄱ'}, {0x01, 'ㄴ'}, {0x02, 'ㄷ'}, {0x03, 'ㄹ'}, {0x04, 'ㅁ'}, {0x05, 'ㅂ'}, {0x06, 'ㅅ'}, {0x07, 'ㅇ'}, {0x08, 'ㅈ'}, {0x09, 'ㅊ'}, {0x0A, 'ㅋ'}, {0x0B, 'ㅌ'}, {0x0C, 'ㅍ'}, {0x0D, 'ㅎ'}, {0x0E, 'ㄲ'}, {0x0F, 'ㄸ'}, {0x10, 'ㅃ'}, {0x11, 'ㅆ'}, {0x12, 'ㅉ'}, @@ -366,7 +360,7 @@ public static string LocalizeKOR2(string nick) {0xFF, '\u3000'}, }; - private static readonly Dictionary GSC2U_KOR_1 = new() + private static readonly Dictionary GSC2U_KOR_1 = new(256) { {0x01, '가'}, {0x02, '각'}, {0x03, '간'}, {0x04, '갇'}, {0x05, '갈'}, {0x06, '갉'}, {0x07, '갊'}, {0x08, '감'}, {0x09, '갑'}, {0x0A, '값'}, {0x0B, '갓'}, {0x0C, '갔'}, {0x0D, '강'}, {0x0E, '갖'}, {0x0F, '갗'}, {0x10, '같'}, {0x11, '갚'}, {0x12, '갛'}, {0x13, '개'}, {0x14, '객'}, {0x15, '갠'}, {0x16, '갤'}, {0x17, '갬'}, {0x18, '갭'}, {0x19, '갯'}, {0x1A, '갰'}, {0x1B, '갱'}, {0x1C, '갸'}, {0x1D, '갹'}, {0x1E, '갼'}, {0x1F, '걀'}, @@ -385,7 +379,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '꼭'}, {0xF1, '꼰'}, {0xF2, '꼲'}, {0xF3, '꼴'}, {0xF4, '꼼'}, {0xF5, '꼽'}, {0xF6, '꼿'}, {0xF7, '꽁'}, {0xF8, '꽂'}, {0xF9, '꽃'}, {0xFA, '꽈'}, {0xFB, '꽉'}, {0xFC, '꽐'}, {0xFD, '꽜'}, {0xFE, '꽝'}, {0xFF, '꽤'}, }; - private static readonly Dictionary GSC2U_KOR_2 = new() + private static readonly Dictionary GSC2U_KOR_2 = new(256) { {0x00, '꽥'}, {0x01, '꽹'}, {0x02, '꾀'}, {0x03, '꾄'}, {0x04, '꾈'}, {0x05, '꾐'}, {0x06, '꾑'}, {0x07, '꾕'}, {0x08, '꾜'}, {0x09, '꾸'}, {0x0A, '꾹'}, {0x0B, '꾼'}, {0x0C, '꿀'}, {0x0D, '꿇'}, {0x0E, '꿈'}, {0x0F, '꿉'}, {0x10, '꿋'}, {0x11, '꿍'}, {0x12, '꿎'}, {0x13, '꿔'}, {0x14, '꿜'}, {0x15, '꿨'}, {0x16, '꿩'}, {0x17, '꿰'}, {0x18, '꿱'}, {0x19, '꿴'}, {0x1A, '꿸'}, {0x1B, '뀀'}, {0x1C, '뀁'}, {0x1D, '뀄'}, {0x1E, '뀌'}, {0x1F, '뀐'}, @@ -404,7 +398,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '댑'}, {0xF1, '댓'}, {0xF2, '댔'}, {0xF3, '댕'}, {0xF5, '더'}, {0xF6, '덕'}, {0xF7, '덖'}, {0xF8, '던'}, {0xF9, '덛'}, {0xFA, '덜'}, {0xFB, '덞'}, {0xFC, '덟'}, {0xFD, '덤'}, {0xFE, '덥'}, }; - private static readonly Dictionary GSC2U_KOR_3 = new() + private static readonly Dictionary GSC2U_KOR_3 = new(256) { {0x01, '덧'}, {0x02, '덩'}, {0x03, '덫'}, {0x04, '덮'}, {0x05, '데'}, {0x06, '덱'}, {0x07, '덴'}, {0x08, '델'}, {0x09, '뎀'}, {0x0A, '뎁'}, {0x0B, '뎃'}, {0x0C, '뎄'}, {0x0D, '뎅'}, {0x0E, '뎌'}, {0x0F, '뎐'}, {0x10, '뎔'}, {0x11, '뎠'}, {0x12, '뎡'}, {0x13, '뎨'}, {0x14, '뎬'}, {0x15, '도'}, {0x16, '독'}, {0x17, '돈'}, {0x18, '돋'}, {0x19, '돌'}, {0x1A, '돎'}, {0x1C, '돔'}, {0x1D, '돕'}, {0x1E, '돗'}, {0x1F, '동'}, @@ -423,7 +417,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '렝'}, {0xF1, '려'}, {0xF2, '력'}, {0xF3, '련'}, {0xF4, '렬'}, {0xF5, '렴'}, {0xF6, '렵'}, {0xF7, '렷'}, {0xF8, '렸'}, {0xF9, '령'}, {0xFA, '례'}, {0xFB, '롄'}, {0xFC, '롑'}, {0xFD, '롓'}, {0xFE, '로'}, {0xFF, '록'}, }; - private static readonly Dictionary GSC2U_KOR_4 = new() + private static readonly Dictionary GSC2U_KOR_4 = new(256) { {0x00, '론'}, {0x01, '롤'}, {0x02, '롬'}, {0x03, '롭'}, {0x04, '롯'}, {0x05, '롱'}, {0x06, '롸'}, {0x07, '롼'}, {0x08, '뢍'}, {0x09, '뢨'}, {0x0A, '뢰'}, {0x0B, '뢴'}, {0x0C, '뢸'}, {0x0D, '룀'}, {0x0E, '룁'}, {0x0F, '룃'}, {0x10, '룅'}, {0x11, '료'}, {0x12, '룐'}, {0x13, '룔'}, {0x14, '룝'}, {0x15, '룟'}, {0x16, '룡'}, {0x17, '루'}, {0x18, '룩'}, {0x19, '룬'}, {0x1A, '룰'}, {0x1B, '룸'}, {0x1C, '룹'}, {0x1D, '룻'}, {0x1E, '룽'}, {0x1F, '뤄'}, @@ -442,7 +436,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '뱅'}, {0xF1, '뱉'}, {0xF2, '뱌'}, {0xF3, '뱍'}, {0xF4, '뱐'}, {0xF5, '뱝'}, {0xF6, '버'}, {0xF7, '벅'}, {0xF8, '번'}, {0xF9, '벋'}, {0xFA, '벌'}, {0xFB, '벎'}, {0xFC, '범'}, {0xFD, '법'}, {0xFE, '벗'}, }; - private static readonly Dictionary GSC2U_KOR_5 = new() + private static readonly Dictionary GSC2U_KOR_5 = new(256) { {0x01, '벙'}, {0x02, '벚'}, {0x03, '베'}, {0x04, '벡'}, {0x05, '벤'}, {0x06, '벧'}, {0x07, '벨'}, {0x08, '벰'}, {0x09, '벱'}, {0x0A, '벳'}, {0x0B, '벴'}, {0x0C, '벵'}, {0x0D, '벼'}, {0x0E, '벽'}, {0x0F, '변'}, {0x10, '별'}, {0x11, '볍'}, {0x12, '볏'}, {0x13, '볐'}, {0x14, '병'}, {0x15, '볕'}, {0x16, '볘'}, {0x17, '볜'}, {0x18, '보'}, {0x19, '복'}, {0x1A, '볶'}, {0x1B, '본'}, {0x1C, '볼'}, {0x1D, '봄'}, {0x1E, '봅'}, {0x1F, '봇'}, @@ -461,7 +455,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '셈'}, {0xF1, '셉'}, {0xF2, '셋'}, {0xF3, '셌'}, {0xF4, '셍'}, {0xF5, '셔'}, {0xF6, '셕'}, {0xF7, '션'}, {0xF8, '셜'}, {0xF9, '셤'}, {0xFA, '셥'}, {0xFB, '셧'}, {0xFC, '셨'}, {0xFD, '셩'}, {0xFE, '셰'}, {0xFF, '셴'}, }; - private static readonly Dictionary GSC2U_KOR_6 = new() + private static readonly Dictionary GSC2U_KOR_6 = new(256) { {0x00, '셸'}, {0x01, '솅'}, {0x02, '소'}, {0x03, '속'}, {0x04, '솎'}, {0x05, '손'}, {0x06, '솔'}, {0x07, '솖'}, {0x08, '솜'}, {0x09, '솝'}, {0x0A, '솟'}, {0x0B, '송'}, {0x0C, '솥'}, {0x0D, '솨'}, {0x0E, '솩'}, {0x0F, '솬'}, {0x10, '솰'}, {0x11, '솽'}, {0x12, '쇄'}, {0x13, '쇈'}, {0x14, '쇌'}, {0x15, '쇔'}, {0x16, '쇗'}, {0x17, '쇘'}, {0x18, '쇠'}, {0x19, '쇤'}, {0x1A, '쇨'}, {0x1B, '쇰'}, {0x1C, '쇱'}, {0x1D, '쇳'}, {0x1E, '쇼'}, {0x1F, '쇽'}, @@ -480,7 +474,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '언'}, {0xF1, '얹'}, {0xF2, '얻'}, {0xF3, '얼'}, {0xF4, '얽'}, {0xF5, '얾'}, {0xF6, '엄'}, {0xF7, '업'}, {0xF8, '없'}, {0xF9, '엇'}, {0xFA, '었'}, {0xFB, '엉'}, {0xFC, '엊'}, {0xFD, '엌'}, {0xFE, '엎'}, }; - private static readonly Dictionary GSC2U_KOR_7 = new() + private static readonly Dictionary GSC2U_KOR_7 = new(256) { {0x01, '에'}, {0x02, '엑'}, {0x03, '엔'}, {0x04, '엘'}, {0x05, '엠'}, {0x06, '엡'}, {0x07, '엣'}, {0x08, '엥'}, {0x09, '여'}, {0x0A, '역'}, {0x0B, '엮'}, {0x0C, '연'}, {0x0D, '열'}, {0x0E, '엶'}, {0x0F, '엷'}, {0x10, '염'}, {0x11, '엽'}, {0x12, '엾'}, {0x13, '엿'}, {0x14, '였'}, {0x15, '영'}, {0x16, '옅'}, {0x17, '옆'}, {0x18, '옇'}, {0x19, '예'}, {0x1A, '옌'}, {0x1B, '옐'}, {0x1C, '옘'}, {0x1D, '옙'}, {0x1E, '옛'}, {0x1F, '옜'}, @@ -499,7 +493,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '좇'}, {0xF1, '좋'}, {0xF2, '좌'}, {0xF3, '좍'}, {0xF4, '좔'}, {0xF5, '좝'}, {0xF6, '좟'}, {0xF7, '좡'}, {0xF8, '좨'}, {0xF9, '좼'}, {0xFA, '좽'}, {0xFB, '죄'}, {0xFC, '죈'}, {0xFD, '죌'}, {0xFE, '죔'}, {0xFF, '죕'}, }; - private static readonly Dictionary GSC2U_KOR_8 = new() + private static readonly Dictionary GSC2U_KOR_8 = new(256) { {0x00, '죗'}, {0x01, '죙'}, {0x02, '죠'}, {0x03, '죡'}, {0x04, '죤'}, {0x05, '죵'}, {0x06, '주'}, {0x07, '죽'}, {0x08, '준'}, {0x09, '줄'}, {0x0A, '줅'}, {0x0B, '줆'}, {0x0C, '줌'}, {0x0D, '줍'}, {0x0E, '줏'}, {0x0F, '중'}, {0x10, '줘'}, {0x11, '줬'}, {0x12, '줴'}, {0x13, '쥐'}, {0x14, '쥑'}, {0x15, '쥔'}, {0x16, '쥘'}, {0x17, '쥠'}, {0x18, '쥡'}, {0x19, '쥣'}, {0x1A, '쥬'}, {0x1B, '쥰'}, {0x1C, '쥴'}, {0x1D, '쥼'}, {0x1E, '즈'}, {0x1F, '즉'}, @@ -518,7 +512,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '췻'}, {0xF1, '췽'}, {0xF2, '츄'}, {0xF3, '츈'}, {0xF4, '츌'}, {0xF5, '츔'}, {0xF6, '츙'}, {0xF7, '츠'}, {0xF8, '측'}, {0xF9, '츤'}, {0xFA, '츨'}, {0xFB, '츰'}, {0xFC, '츱'}, {0xFD, '츳'}, {0xFE, '층'}, }; - private static readonly Dictionary GSC2U_KOR_9 = new() + private static readonly Dictionary GSC2U_KOR_9 = new(256) { {0x01, '치'}, {0x02, '칙'}, {0x03, '친'}, {0x04, '칟'}, {0x05, '칠'}, {0x06, '칡'}, {0x07, '침'}, {0x08, '칩'}, {0x09, '칫'}, {0x0A, '칭'}, {0x0B, '카'}, {0x0C, '칵'}, {0x0D, '칸'}, {0x0E, '칼'}, {0x0F, '캄'}, {0x10, '캅'}, {0x11, '캇'}, {0x12, '캉'}, {0x13, '캐'}, {0x14, '캑'}, {0x15, '캔'}, {0x16, '캘'}, {0x17, '캠'}, {0x18, '캡'}, {0x19, '캣'}, {0x1A, '캤'}, {0x1B, '캥'}, {0x1C, '캬'}, {0x1D, '캭'}, {0x1E, '컁'}, {0x1F, '커'}, @@ -537,7 +531,7 @@ public static string LocalizeKOR2(string nick) {0xF0, '팀'}, {0xF1, '팁'}, {0xF2, '팃'}, {0xF3, '팅'}, {0xF4, '파'}, {0xF5, '팍'}, {0xF6, '팎'}, {0xF7, '판'}, {0xF8, '팔'}, {0xF9, '팖'}, {0xFA, '팜'}, {0xFB, '팝'}, {0xFC, '팟'}, {0xFD, '팠'}, {0xFE, '팡'}, {0xFF, '팥'}, }; - private static readonly Dictionary GSC2U_KOR_A = new() + private static readonly Dictionary GSC2U_KOR_A = new(256) { {0x00, '패'}, {0x01, '팩'}, {0x02, '팬'}, {0x03, '팰'}, {0x04, '팸'}, {0x05, '팹'}, {0x06, '팻'}, {0x07, '팼'}, {0x08, '팽'}, {0x09, '퍄'}, {0x0A, '퍅'}, {0x0B, '퍼'}, {0x0C, '퍽'}, {0x0D, '펀'}, {0x0E, '펄'}, {0x0F, '펌'}, {0x10, '펍'}, {0x11, '펏'}, {0x12, '펐'}, {0x13, '펑'}, {0x14, '페'}, {0x15, '펙'}, {0x16, '펜'}, {0x17, '펠'}, {0x18, '펨'}, {0x19, '펩'}, {0x1A, '펫'}, {0x1B, '펭'}, {0x1C, '펴'}, {0x1D, '편'}, {0x1E, '펼'}, {0x1F, '폄'}, diff --git a/PKHeX.Core/Saves/Substructures/PokeDex/Zukan7b.cs b/PKHeX.Core/Saves/Substructures/PokeDex/Zukan7b.cs index 69a7a0947..e205a7f35 100644 --- a/PKHeX.Core/Saves/Substructures/PokeDex/Zukan7b.cs +++ b/PKHeX.Core/Saves/Substructures/PokeDex/Zukan7b.cs @@ -131,65 +131,76 @@ public void SetSizeData(DexSizeType group, int index, byte height, byte weight) span[3] = 0; } + private const int EntryMeltan = 151; // Melmetal 152 + private const int EntryForms = 153; + public static bool TryGetSizeEntryIndex(ushort species, byte form, out int index) { index = -1; - if (form == 0 && species <= 151) + if (form == 0) { - index = species - 1; - return true; + if (species <= 151) // Mew + { + index = species - 1; + return true; + } + if (species is 808 or 809) // Meltan & Melmetal + { + index = EntryMeltan + (species - 808); + return true; + } + return false; } - for (int i = 0; i < SizeDexInfoTable.Length; i += 3) + + // Forms + for (int i = 0; i < SizeDexInfoTable.Length; i += 2) { if (SizeDexInfoTable[i] != species) continue; if (SizeDexInfoTable[i + 1] != form) continue; - index = SizeDexInfoTable[i + 2]; + index = EntryForms + (i >> 1); return true; } return false; } - private static readonly ushort[] SizeDexInfoTable = + private static ReadOnlySpan SizeDexInfoTable => new byte[] { - // species, form, index - 808, 0, 151, - 809, 0, 152, - - 003, 1, 153, - 006, 1, 154, - 006, 2, 155, - 009, 1, 156, - 015, 1, 157, - 018, 1, 158, - 019, 1, 159, - 020, 1, 160, - 026, 1, 161, - 027, 1, 162, - 028, 1, 163, - 037, 1, 164, - 038, 1, 165, - 050, 1, 166, - 051, 1, 167, - 052, 1, 168, - 053, 1, 169, - 065, 1, 170, - 074, 1, 171, - 075, 1, 172, - 076, 1, 173, - 080, 1, 174, - 088, 1, 175, - 089, 1, 176, - 094, 1, 177, - 103, 1, 178, - 105, 1, 179, - 115, 1, 180, - 127, 1, 181, - 130, 1, 182, - 142, 1, 183, - 150, 1, 184, - 150, 2, 185, + // species, form + 003, 1, + 006, 1, + 006, 2, + 009, 1, + 015, 1, + 018, 1, + 019, 1, + 020, 1, + 026, 1, + 027, 1, + 028, 1, + 037, 1, + 038, 1, + 050, 1, + 051, 1, + 052, 1, + 053, 1, + 065, 1, + 074, 1, + 075, 1, + 076, 1, + 080, 1, + 088, 1, + 089, 1, + 094, 1, + 103, 1, + 105, 1, + 115, 1, + 127, 1, + 130, 1, + 142, 1, + 150, 1, + 150, 2, }; protected override bool GetSaneFormsToIterate(ushort species, out int formStart, out int formEnd, int formIn)