Update 23.09.16 - Teal Mask

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>
This commit is contained in:
Kurt 2023-09-15 23:36:21 -07:00
parent c09a4646a1
commit 7703576088
657 changed files with 4874 additions and 2530 deletions

View file

@ -24,7 +24,7 @@ PKHeX erwartet entschlüsselte Spielstände. Da diese konsolenspezifisch verschl
## Screenshots
![Main Window](https://i.imgur.com/f2oF00t.png)
![Main Window](https://i.imgur.com/37SMQSr.png)
## Erstellen

View file

@ -24,7 +24,7 @@ PKHeX espera archivos de guardado que no estén cifrados con las claves específ
## Capturas de Pantalla
![Pantalla principal](https://i.imgur.com/vQrE25t.png)
![Pantalla principal](https://i.imgur.com/gREbXFH.png)
## Building

View file

@ -23,7 +23,7 @@ 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/H3GKLtk.png)
![Main Window](https://i.imgur.com/fk6IX2a.png)
## Construction

View file

@ -24,7 +24,7 @@ PKHeX si aspetta file di salvataggio non criptati con le chiavi specifiche della
## Screenshots
![Main Window](https://i.imgur.com/18b86pC.png)
![Main Window](https://i.imgur.com/epXOQ5M.png)
## Building

View file

@ -24,7 +24,7 @@ PKHeX 所读取存档文件必须是未经主机唯一密钥加密,因此请
## 截图
![主介面](https://i.imgur.com/KjYhgj9.png)
![主介面](https://i.imgur.com/hM8GJ4U.png)
## 构建

View file

@ -24,7 +24,7 @@ PKHeX 所讀取檔案須未經主機唯一密鑰加密,因而請使用儲存
## 螢幕擷取截圖
![主介面](https://i.imgur.com/KNwURaM.png)
![主介面](https://i.imgur.com/U5FKBIF.png)
## 構建

View file

@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>23.08.23</Version>
<Version>23.09.16</Version>
<LangVersion>11</LangVersion>
<Nullable>enable</Nullable>
<NeutralLanguage>en</NeutralLanguage>

View file

@ -102,6 +102,7 @@ public static class ShowdownParsing
(int)Necrozma when form is "Dusk" => $"{form}-Mane",
(int)Necrozma when form is "Dawn" => $"{form}-Wings",
(int)Polteageist or (int)Sinistea => form == "Antique" ? form : string.Empty,
(int)Sinistcha or (int)Poltchageist => form == "Antique" ? form : string.Empty,
(int)Maushold when form is "Family of Four" => "Four",
(int)Greninja or (int)Rockruff or (int)Koraidon or (int)Miraidon => string.Empty,

View file

@ -304,5 +304,13 @@ public enum Ability : ushort
ArmorTail,
EarthEater,
MyceliumMight,
Hospitality,
MindsEye,
EmbodyAspect0,
EmbodyAspect1,
EmbodyAspect2,
EmbodyAspect3,
ToxicChain,
SupersweetSyrup,
MAX_COUNT,
}

View file

@ -906,5 +906,9 @@ public enum Move : ushort
NoxiousTorque,
CombatTorque,
MagicalTorque,
BloodMoon,
MatchaGotcha,
SyrupBomb,
IvyCudgel,
MAX_COUNT,
}

View file

@ -1016,5 +1016,12 @@ public enum Species : ushort
Miraidon,
WalkingWake,
IronLeaves,
Dipplin,
Poltchageist,
Sinistcha,
Okidogi,
Munkidori,
Fezandipiti,
Ogerpon,
MAX_COUNT,
}

View file

@ -188,6 +188,11 @@ public sealed class GameStrings : IBasicStrings
// De-duplicate the Calyrex ability names
abilitylist[(int)Core.Ability.AsOneI] += $" ({specieslist[(int)Core.Species.Glastrier]})";
abilitylist[(int)Core.Ability.AsOneG] += $" ({specieslist[(int)Core.Species.Spectrier]})";
// De-duplicate the Ogerpon ability names
abilitylist[(int)Core.Ability.EmbodyAspect0] += $" ({forms[FormConverter.MaskTeal]})";
abilitylist[(int)Core.Ability.EmbodyAspect1] += $" ({forms[FormConverter.MaskWellspring]})";
abilitylist[(int)Core.Ability.EmbodyAspect2] += $" ({forms[FormConverter.MaskHearthflame]})";
abilitylist[(int)Core.Ability.EmbodyAspect3] += $" ({forms[FormConverter.MaskCornerstone]})";
// Replace the Egg Name with ---; egg name already stored to eggname
specieslist[0] = EmptyIndex;
@ -290,6 +295,9 @@ public sealed class GameStrings : IBasicStrings
items[2329] += " (1)"; // Academy Ball
items[2330] += " (2)"; // Academy Ball
items[0694] += " (G6-8)"; // TM100, not held.
items[2418] += " (SL)"; // Academy Chairs
items[2419] += " (VL)"; // Academy Chairs
}
private static void SanitizeItemsLA(string[] items)
@ -592,6 +600,19 @@ public sealed class GameStrings : IBasicStrings
m[120] += " (2)"; // Zero Lab
m[122] += " (3)"; // Zero Lab
m[144] += " (1)"; // Oni Mountain
m[147] += " (2)"; // Oni Mountain
m[149] += " (3)"; // Oni Mountain
m[150] += " (4)"; // Oni Mountain
m[169] += " (5)"; // Oni Mountain
m[152] += " (1)"; // Crystal Pool
m[154] += " (2)"; // Crystal Pool
m[153] += " (1)"; // Oni Mountain Summit
m[155] += " (2)"; // Oni Mountain Summit
m[164] += " (1)"; // Kitakami Wilds
m[167] += " (2)"; // Kitakami Wilds
set.Met3[1] += $" ({NPC})"; // Anything from an NPC
set.Met3[2] += $" ({EggName})"; // Egg From Link Trade
for (int i = 3; i <= 6; i++) // distinguish first set of regions (unused) from second (used)

View file

@ -4,6 +4,16 @@ namespace PKHeX.Core;
internal static class Locations9
{
/// <summary>
/// Checks if the location is accessible in Paldea (without DLC).
/// </summary>
public static bool IsAccessiblePreDLC(ushort location) => !IsKitakami(location);
/// <summary>
/// Checks if the location is accessible in Kitakami.
/// </summary>
public static bool IsKitakami(ushort location) => location is (>= 132 and <= 170);
public static ReadOnlySpan<byte> Met0 => new byte[]
{
002, 004, 006, 008,
@ -23,7 +33,10 @@ internal static class Locations9
067, 069,
099, 101, 103, 105, 107, 109,
111, 113, 115, 117,
130, 131,
130, 131, 132, 134, 136, 138,
140, 142, 144, 146, 148, 150,
152, 154, 156, 158, 160, 162,
164, 166, 168, 170,
};
public static ReadOnlySpan<ushort> Met3 => new ushort[]
@ -45,5 +58,5 @@ internal static class Locations9
40070, 40071, 40072, 40073, 40074, 40075, 40076, 40077, 40078,
};
public static ReadOnlySpan<ushort> Met6 => new ushort[] {/* XY */ 60001, 60003, /* ORAS */ 60004 };
public static ReadOnlySpan<ushort> Met6 => new ushort[] {/* XY */ 60001, 60003, /* ORAS */ 60004, /* SV */ 60005 };
}

View file

@ -45,9 +45,9 @@ public static class HeldItemLumpUtil
8 when item is (>= 0328 and <= 0427) => HeldItemLumpImage.TechnicalMachine, // BDSP TMs
8 when item is (>= 1130 and <= 1229) => HeldItemLumpImage.TechnicalRecord, // Gen8 TR
9 when item is (>= 0328 and <= 0419) // TM01-TM92
or (>= 0618 and <= 0620) // TM93-TM95
or (>= 0690 and <= 0693) // TM96-TM99
or (>= 2160 and <= 2231) /* TM100-TM171 */ => HeldItemLumpImage.TechnicalMachine,
or (>= 0618 and <= 0620) // TM093-TM095
or (>= 0690 and <= 0693) // TM096-TM099
or (>= 2160 and <= 2261) /* TM100-TM201 */ => HeldItemLumpImage.TechnicalMachine,
_ => HeldItemLumpImage.NotLump,
};
}

View file

@ -47,19 +47,20 @@ public sealed class ItemStorage9SV : IItemStorage
0279, 0280, 0281, 0282, 0283, 0284, 0285, 0286, 0287, 0288,
0289, 0290, 0291, 0292, 0293, 0294, 0295, 0296, 0297, 0298,
0299, 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 0308,
0309, 0310, 0311, 0312, 0313, 0326, 0485, 0486, 0487, 0488,
0489, 0490, 0491, 0538, 0539, 0540, 0541, 0542, 0543, 0544,
0545, 0546, 0547, 0564, 0565, 0566, 0567, 0568, 0569, 0570,
0639, 0640, 0644, 0645, 0648, 0649, 0650, 0795, 0796, 0846,
0849, 0853, 0854, 0855, 0856, 0879, 0880, 0881, 0882, 0883,
0884, 1103, 1104, 1116, 1117, 1118, 1119, 1120, 1121, 1122,
1123, 1124, 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, 1253, 1254, 1582,
1592, 1606, 1777, 1778, 1779, 1861, 1862, 1863, 1864, 1865,
1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875,
1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885,
1886, 2344, 2345,
0309, 0310, 0311, 0312, 0313, 0325, 0326, 0327, 0485, 0486,
0487, 0488, 0489, 0490, 0491, 0537, 0538, 0539, 0540, 0541,
0542, 0543, 0544, 0545, 0546, 0547, 0564, 0565, 0566, 0567,
0568, 0569, 0570, 0639, 0640, 0644, 0645, 0648, 0649, 0650,
0795, 0796, 0846, 0849, 0853, 0854, 0855, 0856, 0879, 0880,
0881, 0882, 0883, 0884, 1103, 1104, 1116, 1117, 1118, 1119,
1120, 1121, 1122, 1123, 1124, 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,
1253, 1254, 1582, 1592, 1606, 1777, 1778, 1779, 1861, 1862,
1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872,
1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882,
1883, 1884, 1885, 1886, 2344, 2345, 2401, 2402, 2403, 2404,
2406, 2407, 2408, 2411, 2412, 2413, 2414, 2415, 2416, 2479,
};
private static ReadOnlySpan<ushort> Pouch_TM_SV => new ushort[]
@ -81,12 +82,10 @@ public sealed class ItemStorage9SV : IItemStorage
2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209,
2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219,
2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229,
2230, 2231,
// DLC additions
// 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241,
// 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251,
// 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261,
2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239,
2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249,
2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259,
2260, 2261,
};
private static ReadOnlySpan<ushort> Pouch_Treasure_SV => new ushort[]
@ -102,29 +101,25 @@ public sealed class ItemStorage9SV : IItemStorage
1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917,
1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927,
1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937,
1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946,
2311, 2313,
2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323,
2324, 2325, 2326, 2327, 2329, 2330, 2331, 2332, 2333, 2334,
2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2348, 2349,
2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359,
2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369,
2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379,
2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389,
2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399,
2400,
// Item data is present, but the items have no associated text or sprites, so they do not appear in the bag.
// 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955,
1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 2311,
2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322,
2323, 2324, 2325, 2326, 2327, 2329, 2330, 2331, 2332, 2333,
2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2348,
2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358,
2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368,
2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378,
2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388,
2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398,
2399, 2400, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424,
2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434,
2435, 2436, 2437,
};
private static ReadOnlySpan<ushort> Pouch_Event_SV => new ushort[]
{
0632, 0638, 0703, 0765, 1278, 1590, 1591, 1829, 1830, 1831,
1832, 1833, 1834, 1835, 1836, 1857, 1858,
// Item data is present, but the items have no associated text or sprites, so they do not appear in the bag.
// 0078, 0466, 0631, 1267, 1587, 1589, 1837, 1838, 1839, 1840, 1841,
0078, 0466, 0631, 0632, 0638, 0703, 0765, 1267, 1278, 1587,
1589, 1590, 1591, 1829, 1830, 1831, 1832, 1833, 1834, 1835,
1836, 1857, 1858, 2405, 2409, 2410, 2480, 2481,
};
private static ReadOnlySpan<ushort> Pouch_Material_SV => new ushort[]
@ -143,18 +138,15 @@ public sealed class ItemStorage9SV : IItemStorage
2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075,
2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085,
2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095,
2096, 2097, 2098, 2099, 2103, 2104, 2105,
2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115,
2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2126, 2127,
2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137,
2156, 2157,
2158, 2159,
// Item data is present, but the items have no associated text or sprites, so they do not appear in the bag.
// 2100, 2101, 2102,
// 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147,
// 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155,
2096, 2097, 2098, 2099, 2103, 2104, 2105, 2106, 2107, 2108,
2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118,
2119, 2120, 2121, 2122, 2123, 2126, 2127, 2128, 2129, 2130,
2131, 2132, 2133, 2134, 2135, 2136, 2137, 2156, 2157, 2158,
2159, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446,
2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456,
2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466,
2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476,
2477, 2478,
};
internal static ReadOnlySpan<InventoryType> ValidTypes => new[]
@ -182,12 +174,6 @@ public sealed class ItemStorage9SV : IItemStorage
0111, // Odd Keystone
0208, // Enigma Berry
0209, // Micle Berry
0210, // Custap Berry
0211, // Jaboca Berry
0212, // Rowap Berry
0485, // Red Apricorn
0486, // Blue Apricorn
0487, // Yellow Apricorn

View file

@ -136,6 +136,7 @@ public static class Breeding
(int)Floette when form == 5 => false, // can't get Eternal Flower from egg
(int)Greninja when form == 1 => false, // can't get Battle Bond Greninja from egg
(int)Sinistea or (int)Polteageist => false, // can't get Antique eggs
(int)Poltchageist or (int)Sinistcha => false, // can't get Antique eggs
_ => true,
};
@ -204,6 +205,7 @@ public static class Breeding
(int)RoaringMoon or (int)IronValiant => false,
(int)Koraidon or (int)Miraidon => false,
(int)WalkingWake or (int)IronLeaves => false,
(int)Okidogi or (int)Munkidori or (int)Fezandipiti or (int)Ogerpon => false,
_ => true,
};

View file

@ -114,10 +114,20 @@ public static class Legal
//internal const int MaxGameID_8b = (int)GameVersion.SP;
internal const int MaxAbilityID_8b = MaxAbilityID_8_R2;
internal const int MaxSpeciesID_9 = (int)Species.IronLeaves;
internal const int MaxMoveID_9 = (int)Move.MagicalTorque;
internal const int MaxItemID_9 = 2400; // Yellow Dish
internal const int MaxAbilityID_9 = (int)Ability.MyceliumMight;
internal const int MaxSpeciesID_9 = MaxSpeciesID_9_T1;
internal const int MaxMoveID_9 = MaxMoveID_9_T1;
internal const int MaxItemID_9 = MaxItemID_9_T1;
internal const int MaxAbilityID_9 = MaxAbilityID_9_T1;
internal const int MaxSpeciesID_9_T0 = (int)Species.IronLeaves;
internal const int MaxMoveID_9_T0 = (int)Move.MagicalTorque;
internal const int MaxItemID_9_T0 = 2400; // Yellow Dish
internal const int MaxAbilityID_9_T0 = (int)Ability.MyceliumMight;
internal const int MaxSpeciesID_9_T1 = (int)Species.Ogerpon;
internal const int MaxMoveID_9_T1 = (int)Move.IvyCudgel;
internal const int MaxItemID_9_T1 = 2481; // Glimmering Charm
internal const int MaxAbilityID_9_T1 = (int)Ability.SupersweetSyrup;
internal const int MaxBallID_9 = (int)Ball.LAOrigin;
internal const int MaxGameID_9 = (int)GameVersion.VL;

View file

@ -58,6 +58,22 @@ internal static class Encounters9
new(SV) { Species = 0999, Shiny = Never, Level = 50, Location = 048 }, // Gimmighoul - North Province (Area Two)
new(SV) { Species = 0999, Shiny = Never, Level = 50, Location = 109 }, // Gimmighoul - Socarrat Trail
#endregion
#region Sudachi 1
new(SV) { Species = 0168, Shiny = Never, Level = 65, Location = 166, Ability = OnlyFirst, Gender = 0, Nature = Nature.Hardy, TeraType = GemType.Bug, Size = 128, IVs = new(20,20,20,20,20,20) }, // Ariados
new(SV) { Species = 0901, Shiny = Never, Level = 70, Location = 166, Ability = OnlyFirst, Gender = 0, Nature = Nature.Hardy, TeraType = GemType.Normal, Size = 128, FlawlessIVCount = 3, Moves = new(901,414,163,347), Form = 1 }, // Ursaluna-1
new(SV) { Species = 1014, Shiny = Never, Level = 70, Location = 162, Ability = OnlyFirst, Gender = 0, TeraType = GemType.Poison, Size = 128, FlawlessIVCount = 3 }, // Okidogi
new(SV) { Species = 1015, Shiny = Never, Level = 70, Location = 156, Ability = OnlyFirst, Gender = 0, TeraType = GemType.Poison, Size = 128, FlawlessIVCount = 3 }, // Munkidori
new(SV) { Species = 1016, Shiny = Never, Level = 70, Location = 144, Ability = OnlyFirst, Gender = 0, TeraType = GemType.Poison, Size = 128, FlawlessIVCount = 3 }, // Fezandipiti
new(SV) { Species = 1017, Shiny = Never, Level = 20, Location = 146, Ability = OnlyFirst, Gender = 1, Nature = Nature.Lonely, TeraType = GemType.Grass, Size = 128, IVs = new(31,31,20,31,20,20), Moves = new(904,021,074,022) }, // Ogerpon
new(SV) { Species = 1017, Shiny = Never, Level = 70, Location = 146, Ability = OnlyFirst, Gender = 1, Nature = Nature.Lonely, TeraType = GemType.Grass, Size = 128, IVs = new(31,31,20,31,20,20), Moves = new(904,067,021,580) }, // Ogerpon
new(SV) { FixedBall = Ball.Poke, Species = 0446, Shiny = Always, Level = 01, Location = 142, Ability = OnlyHidden, Gender = 0, Nature = Nature.Impish, Size = 255 }, // Munchlax
new(SV) { FixedBall = Ball.Poke, Species = 0058, Shiny = Never, Level = 15, Location = 134, Ability = OnlyHidden, Gender = 0, Nature = Nature.Jolly, TeraType = GemType.Rock, Size = 254, IVs = new(31,31,20,31,20,20), Form = 1 }, // Growlithe-1
new(SV) { FixedBall = Ball.Poke, Species = 0387, Shiny = Never, Level = 01, Location = 000, Ability = OnlyFirst, Size = 128, EggLocation = 60005 }, // Turtwig
new(SV) { FixedBall = Ball.Poke, Species = 0390, Shiny = Never, Level = 01, Location = 000, Ability = OnlyFirst, Size = 128, EggLocation = 60005 }, // Chimchar
new(SV) { FixedBall = Ball.Poke, Species = 0393, Shiny = Never, Level = 01, Location = 000, Ability = OnlyFirst, Size = 128, EggLocation = 60005 }, // Piplup
#endregion
};
internal static readonly EncounterStatic9[] StaticSL =
@ -101,7 +117,8 @@ internal static class Encounters9
new(TradeNames, 02, SV, 0872,10) { ID32 = 050724, Ability = Any12, OTGender = 0, Gender = 1, Nature = Nature.Bashful, IVs = new(31,18,13,20,28,26) }, // Snom
};
internal static readonly EncounterTera9[] Tera = EncounterTera9.GetArray(Get("gem_paldea"));
internal static readonly EncounterTera9[] TeraBase = EncounterTera9.GetArray(Get("gem_paldea"), TeraRaidMapParent.Paldea);
internal static readonly EncounterTera9[] TeraDLC1 = EncounterTera9.GetArray(Get("gem_kitakami"), TeraRaidMapParent.Kitakami);
internal static readonly EncounterDist9[] Dist = EncounterDist9.GetArray(Get("dist_paldea"));
internal static readonly EncounterMight9[] Might = EncounterMight9.GetArray(Get("might_paldea"));
internal static readonly EncounterFixed9[] Fixed = EncounterFixed9.GetArray(Get("fixed_paldea"));

View file

@ -41,7 +41,8 @@ public record struct EncounterPossible9(EvoCriteria[] Chain, EncounterTypeGroup
StaticVersionVL,
StaticShared,
StaticFixed,
StaticTera,
StaticTeraBase,
StaticTeraDLC1,
StaticDist,
StaticMight,
StaticEnd,
@ -107,9 +108,13 @@ public record struct EncounterPossible9(EvoCriteria[] Chain, EncounterTypeGroup
case YieldState.StaticFixed:
if (TryGetNext(Encounters9.Fixed))
return true;
Index = 0; State = YieldState.StaticTera; goto case YieldState.StaticTera;
case YieldState.StaticTera:
if (TryGetNext(Encounters9.Tera))
Index = 0; State = YieldState.StaticTeraBase; goto case YieldState.StaticTeraBase;
case YieldState.StaticTeraBase:
if (TryGetNext(Encounters9.TeraBase))
return true;
Index = 0; State = YieldState.StaticTeraDLC1; goto case YieldState.StaticTeraDLC1;
case YieldState.StaticTeraDLC1:
if (TryGetNext(Encounters9.TeraDLC1))
return true;
Index = 0; State = YieldState.StaticDist; goto case YieldState.StaticDist;
case YieldState.StaticDist:

View file

@ -43,7 +43,8 @@ public record struct EncounterEnumerator9SWSH(PKM Entity, EvoCriteria[] Chain, G
StaticVersionVL,
StaticShared,
StaticFixed,
StaticTera,
StaticTeraBase,
StaticTeraDLC1,
StaticDist,
StaticMight,
@ -130,9 +131,13 @@ public record struct EncounterEnumerator9SWSH(PKM Entity, EvoCriteria[] Chain, G
case YieldState.StaticFixed:
if (TryGetNext(Encounters9.Fixed))
return true;
Index = 0; State = YieldState.StaticTera; goto case YieldState.StaticTera;
case YieldState.StaticTera:
if (TryGetNext(Encounters9.Tera))
Index = 0; State = YieldState.StaticTeraBase; goto case YieldState.StaticTeraBase;
case YieldState.StaticTeraBase:
if (TryGetNext(Encounters9.TeraBase))
return true;
Index = 0; State = YieldState.StaticTeraDLC1; goto case YieldState.StaticTeraDLC1;
case YieldState.StaticTeraDLC1:
if (TryGetNext(Encounters9.TeraDLC1))
return true;
Index = 0; State = YieldState.StaticDist; goto case YieldState.StaticDist;
case YieldState.StaticDist:

View file

@ -44,7 +44,8 @@ public record struct EncounterEnumerator9(PKM Entity, EvoCriteria[] Chain, GameV
StaticVersionVL,
StaticShared,
StaticFixed,
StaticTera,
StaticTeraBase,
StaticTeraDLC1,
StaticDist,
StaticMight,
@ -76,9 +77,11 @@ public record struct EncounterEnumerator9(PKM Entity, EvoCriteria[] Chain, GameV
Index = 0; goto case YieldState.Bred;
case YieldState.Bred:
State = YieldState.TradeStart;
State = Entity.IsEgg ? YieldState.StaticShared : YieldState.TradeStart;
if (Locations.IsEggLocationBred9(Entity.Egg_Location) && EncounterGenerator9.TryGetEgg(Entity, Chain, Version, out var egg))
return SetCurrent(egg);
if (Entity.IsEgg)
goto case YieldState.StaticShared;
goto case YieldState.TradeStart;
case YieldState.TradeStart:
@ -135,9 +138,13 @@ public record struct EncounterEnumerator9(PKM Entity, EvoCriteria[] Chain, GameV
case YieldState.StaticFixed:
if (TryGetNext(Encounters9.Fixed))
return true;
Index = 0; State = YieldState.StaticTera; goto case YieldState.StaticTera;
case YieldState.StaticTera:
if (TryGetNext(Encounters9.Tera))
Index = 0; State = YieldState.StaticTeraBase; goto case YieldState.StaticTeraBase;
case YieldState.StaticTeraBase:
if (TryGetNext(Encounters9.TeraBase))
return true;
Index = 0; State = YieldState.StaticTeraDLC1; goto case YieldState.StaticTeraDLC1;
case YieldState.StaticTeraDLC1:
if (TryGetNext(Encounters9.TeraDLC1))
return true;
Index = 0; State = YieldState.StaticDist; goto case YieldState.StaticDist;
case YieldState.StaticDist:

View file

@ -10,13 +10,14 @@ public sealed record EncounterStatic9(GameVersion Version)
{
public int Generation => 9;
public EntityContext Context => EntityContext.Gen9;
public int EggLocation => 0;
public bool IsShiny => Shiny == Shiny.Always;
public bool EggEncounter => false;
public bool EggEncounter => EggLocation != 0;
int ILocation.Location => Location;
int ILocation.EggLocation => EggLocation;
public Ball FixedBall { get; init; }
public required ushort Location { get; init; }
public ushort EggLocation { get; init; }
public required ushort Species { get; init; }
public required byte Level { get; init; }
public byte Form { get; init; }
@ -30,6 +31,7 @@ public sealed record EncounterStatic9(GameVersion Version)
public GemType TeraType { get; init; }
public byte Size { get; init; }
public bool IsTitan { get; init; }
public bool RibbonMarkCrafty => Species == (int)Core.Species.Munchlax; // Shiny etc
private bool Gift => FixedBall != Ball.None;
@ -73,12 +75,23 @@ public sealed record EncounterStatic9(GameVersion Version)
ID32 = tr.ID32,
};
if (EggEncounter)
{
// Fake as hatched.
pk.Met_Location = Locations.HatchLocation9;
pk.Met_Level = EggStateLegality.EggMetLevel;
pk.Egg_Location = EggLocation;
pk.EggMetDate = pk.MetDate;
}
if (Gift && !ScriptedYungoos)
pk.HT_Language = (byte)pk.Language;
if (StarterBoxLegend)
pk.FormArgument = 1; // Not Ride Form.
if (IsTitan)
pk.RibbonMarkTitan = true;
else if (RibbonMarkCrafty)
pk.RibbonMarkCrafty = true;
SetPINGA(pk, criteria, pi);
if (Moves.HasMoves)
@ -174,7 +187,12 @@ public sealed record EncounterStatic9(GameVersion Version)
return IsMatchDeferred(pk);
}
private bool IsMatchLocationExact(PKM pk) => pk.Met_Location == Location;
private bool IsMatchLocationExact(PKM pk)
{
if (EggEncounter && !pk.IsEgg)
return true;
return pk.Met_Location == Location;
}
private bool IsMatchLocationRemapped(PKM pk)
{

View file

@ -37,19 +37,36 @@ public sealed record EncounterTera9
public required short RandRateMinViolet { get; init; } // weight chance total of all lower index encounters, for Violet
public bool IsAvailableHostScarlet => RandRateMinScarlet != -1;
public bool IsAvailableHostViolet => RandRateMinViolet != -1;
public required TeraRaidMapParent Map { get; init; }
public string Name => $"Tera Raid Encounter [{(Index == 0 ? "Base" : Index)}] {Stars}★";
public string LongName => Name;
public byte LevelMin => Level;
public byte LevelMax => Level;
public bool CanBeEncountered(uint seed) => Tera9RNG.IsMatchStarChoice(seed, Stars, RandRate, RandRateMinScarlet, RandRateMinViolet);
public bool CanBeEncountered(uint seed) => Tera9RNG.IsMatchStarChoice(seed, Stars, RandRate, RandRateMinScarlet, RandRateMinViolet, Map);
/// <summary>
/// Fetches the rate sum for the base ROM raid, depending on star count.
/// </summary>
/// <param name="star">Raid Difficulty</param>
/// <param name="map">Map the encounter originates on.</param>
/// <returns>Total rate value the game uses to call rand(x) with.</returns>
public static short GetRateTotalSL(int star, TeraRaidMapParent map) => map switch
{
TeraRaidMapParent.Paldea => GetRateTotalBaseSL(star),
TeraRaidMapParent.Kitakami => GetRateTotalKitakamiSL(star),
_ => 0,
};
/// <inheritdoc cref="GetRateTotalSL(int, TeraRaidMapParent)"/>"/>
public static short GetRateTotalVL(int star, TeraRaidMapParent map) => map switch
{
TeraRaidMapParent.Paldea => GetRateTotalBaseVL(star),
TeraRaidMapParent.Kitakami => GetRateTotalKitakamiVL(star),
_ => 0,
};
public static short GetRateTotalBaseSL(int star) => star switch
{
1 => 5800,
@ -72,17 +89,39 @@ public sealed record EncounterTera9
_ => 0,
};
public static EncounterTera9[] GetArray(ReadOnlySpan<byte> data)
public static short GetRateTotalKitakamiSL(int star) => star switch
{
1 => 1500,
2 => 1500,
3 => 2500,
4 => 2100,
5 => 2250,
6 => 2475, // -99
_ => 0,
};
public static short GetRateTotalKitakamiVL(int star) => star switch
{
1 => 1500,
2 => 1500,
3 => 2500,
4 => 2100,
5 => 2250,
6 => 2574, // +99
_ => 0,
};
public static EncounterTera9[] GetArray(ReadOnlySpan<byte> data, TeraRaidMapParent map)
{
const int size = 0x18;
var count = data.Length / size;
var result = new EncounterTera9[count];
for (int i = 0; i < result.Length; i++)
result[i] = ReadEncounter(data.Slice(i * size, size));
result[i] = ReadEncounter(data.Slice(i * size, size), map);
return result;
}
private static EncounterTera9 ReadEncounter(ReadOnlySpan<byte> data) => new()
private static EncounterTera9 ReadEncounter(ReadOnlySpan<byte> data, TeraRaidMapParent map) => new()
{
Species = ReadUInt16LittleEndian(data),
Form = data[0x02],
@ -102,6 +141,8 @@ public sealed record EncounterTera9
RandRate = data[0x13],
RandRateMinScarlet = ReadInt16LittleEndian(data[0x14..]),
RandRateMinViolet = ReadInt16LittleEndian(data[0x16..]),
Map = map,
};
private static AbilityPermission GetAbility(byte b) => b switch
@ -251,7 +292,7 @@ public sealed record EncounterTera9
var seed = Tera9RNG.GetOriginalSeed(pk);
if (pk is ITeraType t && !Tera9RNG.IsMatchTeraType(seed, TeraType, Species, Form, (byte)t.TeraTypeOriginal))
return true;
if (!Tera9RNG.IsMatchStarChoice(seed, Stars, RandRate, RandRateMinScarlet, RandRateMinViolet))
if (!Tera9RNG.IsMatchStarChoice(seed, Stars, RandRate, RandRateMinScarlet, RandRateMinViolet, Map))
return true;
var pi = PersonalTable.SV.GetFormEntry(Species, Form);
@ -266,3 +307,9 @@ public sealed record EncounterTera9
#endregion
}
public enum TeraRaidMapParent : byte
{
Paldea,
Kitakami,
}

View file

@ -34,6 +34,10 @@ public static class EggHatchLocation9
0, 3, 0, 3, 0, 3, 0, 3, 0, 3,
0, 3, 0, 3, 0, 3, 0, 3, 3, 0,
0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
1, 2,
1, 2, 3, 0, 3, 0, 3, 0, 3, 0,
3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
0, 0, 3, 0, 0, 0, 3, 0, 3, 0,
3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
3, 0,
};
}

View file

@ -85,6 +85,17 @@ public sealed class LearnSource9SV : ILearnSource<PersonalInfo9SV>, IEggSource,
if (types.HasFlag(MoveSourceType.EnhancedTutor) && GetIsEnhancedTutor(evo, pk, move))
return new(Tutor, Game);
// In 2.0.1, the following moves are no longer learned via Level Up.
// Since they could have been learned via Level Up prior to 2.0.1, we need to check for them.
// This is double-checked outside of this method -- this is a silly workaround.
if (types.HasFlag(MoveSourceType.LevelUp))
{
if (move == (int)Move.BugBite && evo is { Species: (int)Species.Larvesta, Form: 0, LevelMax: >= 28 })
return new(LevelUp, Game, 28);
if (move == (int)Move.Spite && evo is { Species: (int)Species.Zorua , Form: 1, LevelMax: >= 24 })
return new(LevelUp, Game, 28);
}
return default;
}

View file

@ -27,7 +27,7 @@ public static class Encounter9RNG
var type = Tera9RNG.GetTeraType(seed, enc.TeraType, enc.Species, enc.Form);
pk.TeraTypeOriginal = (MoveType)type;
if (criteria.TeraType != -1 && type != criteria.TeraType)
if (criteria.TeraType != -1 && type != criteria.TeraType && TeraTypeUtil.CanChangeTeraType(enc.Species))
pk.SetTeraType((MoveType)criteria.TeraType); // sets the override type
return true; // done.
}
@ -47,7 +47,7 @@ public static class Encounter9RNG
var type = Tera9RNG.GetTeraType(seed, enc.TeraType, enc.Species, enc.Form);
pk.TeraTypeOriginal = (MoveType)type;
if (criteria.TeraType != -1 && type != criteria.TeraType)
if (criteria.TeraType != -1 && type != criteria.TeraType && TeraTypeUtil.CanChangeTeraType(enc.Species))
pk.SetTeraType((MoveType)criteria.TeraType); // sets the override type
return true; // done.
}

View file

@ -174,8 +174,9 @@ public static class Tera9RNG
/// <param name="raidRate">Random weight of the raid to be used in the comparison with the game specific min rates.</param>
/// <param name="randRateMinScarlet">Total weight of all Scarlet raids prior to this encounter.</param>
/// <param name="randRateMinViolet">Total weight of all Violet raids prior to this encounter.</param>
/// <param name="map">Parent map the Raid can be obtained on.</param>
/// <returns>True if the raid seed can generate the encounter.</returns>
public static bool IsMatchStarChoice(in uint seed, in byte stars, in byte raidRate, in short randRateMinScarlet, in short randRateMinViolet)
public static bool IsMatchStarChoice(in uint seed, in byte stars, in byte raidRate, in short randRateMinScarlet, in short randRateMinViolet, TeraRaidMapParent map)
{
// When determining a raid, the game takes the u32 seed and does two rand calls.
// Rand 1: Star count of the raid (depends on game progress).
@ -201,7 +202,7 @@ public static class Tera9RNG
// The inputs to this function have pre-computed the total rate when the encounter is checked.
// If Scarlet...
var maxScarlet = EncounterTera9.GetRateTotalBaseSL(stars);
var maxScarlet = EncounterTera9.GetRateTotalSL(stars, map);
{
var xoro = rand; // copy
var rateRand = (int)xoro.NextInt((uint)maxScarlet);
@ -209,7 +210,7 @@ public static class Tera9RNG
return true; // Seed can yield this encounter for Scarlet.
}
// If Violet..
var maxViolet = EncounterTera9.GetRateTotalBaseVL(stars);
var maxViolet = EncounterTera9.GetRateTotalVL(stars, map);
{
var xoro = rand; // copy
var rateRand = (int)xoro.NextInt((uint)maxViolet);

View file

@ -31,6 +31,7 @@ public static class FormInfo
case (int)Necrozma when form < 3: // Only mark Ultra Necrozma as Battle Only
return false;
case (int)Minior: return form < 7; // Minior Shields-Down
case (int)Ogerpon: return form >= 4; // Embody Aspect
default:
return form != 0;
@ -50,6 +51,7 @@ public static class FormInfo
(int)Darmanitan => (byte)(form & 2),
(int)Zygarde when format > 6 => 3,
(int)Minior => (byte)(form + 7),
(int)Ogerpon => (byte)(form & 3),
_ => 0,
};
@ -157,6 +159,7 @@ public static class FormInfo
(int)Necrozma,
(int)Calyrex,
(int)Enamorus,
(int)Ogerpon,
};
/// <summary>
@ -185,6 +188,7 @@ public static class FormInfo
(int)Eternatus,
(int)Palafin,
(int)Ogerpon,
};
/// <summary>

View file

@ -60,6 +60,7 @@ public static class SpeciesCategory
(int)TypeNull, (int)Silvally, (int)TapuKoko, (int)TapuLele, (int)TapuBulu, (int)TapuFini,
(int)Kubfu, (int)Urshifu, (int)Regieleki, (int)Regidrago, (int)Glastrier, (int)Spectrier, (int)Enamorus,
(int)WoChien, (int)ChienPao, (int)TingLu, (int)ChiYu,
(int)Okidogi, (int)Munkidori, (int)Fezandipiti, (int)Ogerpon,
};
/// <summary>

View file

@ -307,17 +307,9 @@ public sealed class BallVerifier : Verifier
return GetInvalid(LBallSpecies);
}
if (ball is >= Dusk and <= Quick) // Dusk Heal Quick
{
if (!BallBreedLegality.Ban_Gen4Ball_7.Contains(species))
return GetValid(LBallSpeciesPass);
return GetInvalid(LBallSpecies);
}
return GetValid(LBallSpeciesPass);
if (ball is >= Ultra and <= Premier) // Don't worry, Safari was already checked.
{
if (!BallBreedLegality.Ban_Gen3Ball_7.Contains(species))
return GetValid(LBallSpeciesPass);
return GetInvalid(LBallSpecies);
}
return GetValid(LBallSpeciesPass);
if (ball == Beast)
{
@ -477,7 +469,9 @@ public sealed class BallVerifier : Verifier
private static bool IsPaldeaCatchAndBreed(ushort species)
{
if (species is >= (int)Species.Sprigatito and <= (int)Species.Quaquaval) // starter
if (species is >= (int)Species.Sprigatito and <= (int)Species.Quaquaval) // paldea starter
return false;
if (species is >= (int)Species.Turtwig and <= (int)Species.Empoleon) // sinnoh starter
return false;
var pt = PersonalTable.SV;
var pi = pt.GetFormEntry(species, 0);

View file

@ -114,6 +114,7 @@ public static class EggStateLegality
{
EncounterStatic7 => false,
WB8 or EncounterStatic8b when pk.IsUntraded => false,
EncounterStatic9 { EggLocation: 60005 } => false, // Jacq Egg does not have flag set!
{ Generation: 4 } => false,
_ => true,
};

View file

@ -161,6 +161,10 @@ public sealed class FormVerifier : Verifier
break;
}
// Ogerpon's form changes depending on its held mask
case Ogerpon when (form & 3) != GetOgerponFormFromHeldItem(pk.HeldItem):
return GetInvalid(LFormItemInvalid);
// Impossible Egg forms
case Rotom when pk.IsEgg && form != 0:
case Furfrou when pk.IsEgg && form != 0:
@ -220,4 +224,12 @@ public sealed class FormVerifier : Verifier
return (byte)(item - 115);
return 0;
}
private static byte GetOgerponFormFromHeldItem(int item) => item switch
{
2407 => 1, // Wellspring Mask
2408 => 2, // Hearthflame Mask
2406 => 3, // Cornerstone Mask
_ => 0, // Teal Mask
};
}

View file

@ -24,8 +24,10 @@ public sealed class MarkVerifier : Verifier
VerifyAffixedRibbonMark(data, m);
// temp logic to catch this case; in the future we will need more robust checks for encounters
if (data.EncounterMatch is WC9 { RibbonMarkCharismatic: true} && pk is IRibbonSetMark8 { RibbonMarkCharismatic: false})
if (data.EncounterMatch is WC9 { RibbonMarkCharismatic: true } && pk is IRibbonSetMark8 { RibbonMarkCharismatic: false })
data.AddLine(GetInvalid(string.Format(LRibbonMarkingFInvalid_0, GetRibbonNameSafe(MarkCharismatic))));
else if (data.EncounterMatch is EncounterStatic9 { RibbonMarkCrafty: true } && pk is IRibbonSetMark8 { RibbonMarkCrafty: false })
data.AddLine(GetInvalid(string.Format(LRibbonMarkingFInvalid_0, GetRibbonNameSafe(MarkCrafty))));
}
private void VerifyNoMarksPresent(LegalityAnalysis data, IRibbonIndex m)

View file

@ -171,8 +171,21 @@ public sealed class MiscVerifier : Verifier
data.AddLine(GetInvalid(LStatBattleVersionInvalid));
if (!IsObedienceLevelValid(pk9, pk9.Obedience_Level, pk9.Met_Level))
data.AddLine(GetInvalid(LTransferObedienceLevel));
if (pk9.IsEgg && pk9.TeraTypeOverride != (MoveType)TeraTypeUtil.OverrideNone)
data.AddLine(GetInvalid(LTeraTypeIncorrect));
if (pk9.IsEgg)
{
if (pk9.TeraTypeOverride != (MoveType)TeraTypeUtil.OverrideNone)
data.AddLine(GetInvalid(LTeraTypeIncorrect));
}
else if (pk9.Species == (int)Species.Ogerpon)
{
if (!TeraTypeUtil.IsValidOgerpon((byte)pk9.TeraTypeOverride, pk9.Form))
data.AddLine(GetInvalid(LTeraTypeIncorrect));
}
else
{
if (!TeraTypeUtil.IsValid((byte)pk9.TeraTypeOriginal))
data.AddLine(GetInvalid(LTeraTypeIncorrect));
}
var enc = data.EncounterOriginal;
if (pk9 is { HeightScalar: 0, WeightScalar: 0 })
@ -206,6 +219,33 @@ public sealed class MiscVerifier : Verifier
if (pk9.CurrentHandler != 0 || pk9.Tracker != 0)
data.AddLine(GetInvalid(LTransferBad));
}
if (!Locations9.IsAccessiblePreDLC((ushort)pk9.Met_Location))
{
if (enc is { Species: (int)Species.Larvesta, Form: 0 } and not EncounterEgg)
DisallowLevelUpMove(24, (ushort)Move.BugBite, pk9, data);
if (enc is { Species: (int)Species.Zorua, Form: 1 } and not EncounterEgg)
DisallowLevelUpMove(28, (ushort)Move.Spite, pk9, data);
}
}
private static void DisallowLevelUpMove(byte level, ushort move, PK9 pk, LegalityAnalysis data)
{
if (pk.Tracker != 0)
return;
int index = pk.GetMoveIndex(move);
if (index == -1)
return;
ref var m = ref data.Info.Moves[index];
if (m.Info.Method != LearnMethod.LevelUp || m.Info.Argument != level)
return;
var flagIndex = pk.Permit.RecordPermitIndexes.IndexOf(move);
if (flagIndex == -1)
throw new ArgumentOutOfRangeException(nameof(move), move, "Expected a valid TM index.");
if (pk.GetMoveRecordFlag(flagIndex))
return;
m = new MoveResult(LearnMethod.None);
}
public static int GetTeraImportMatch(ReadOnlySpan<EvoCriteria> evos, MoveType actual, IEncounterTemplate enc)

View file

@ -34,6 +34,7 @@ public static class MarkRules
{
EncounterSlot8 or EncounterStatic8 { Gift: false, ScriptedNoMarks: false } => IsMarkAllowedSpecific8(mark, pk, enc),
EncounterSlot9 s => IsMarkAllowedSpecific9(mark, s),
EncounterStatic9 s => IsMarkAllowedSpecific9(mark, s),
WC9 wc9 => wc9.GetRibbonIndex(mark),
_ => false,
};
@ -66,6 +67,16 @@ public static class MarkRules
_ => true,
};
/// <summary>
/// Checks if a specific encounter mark is disallowed.
/// </summary>
/// <returns>False if mark is disallowed based on specific conditions.</returns>
public static bool IsMarkAllowedSpecific9(RibbonIndex mark, EncounterStatic9 s) => mark switch
{
MarkCrafty => s.RibbonMarkCrafty,
_ => false,
};
// Encounter slots check location weather, while static encounters check weather per encounter.
private static bool IsWeatherPermitted8(RibbonIndex mark, IEncounterTemplate enc) => enc switch
{
@ -209,7 +220,7 @@ public static class MarkRules
/// <summary>
/// Checks if the input should have the <see cref="IRibbonSetMark9.RibbonMarkItemfinder"/> mark.
/// </summary>
public static bool IsMarkValidItemFinder(EvolutionHistory evos) => false; // evos.HasVisitedGen9;
public static bool IsMarkValidItemFinder(EvolutionHistory evos) => evos.HasVisitedGen9; // Obtainable starting in DLC1.
/// <summary>
/// Checks if the input should have the <see cref="IRibbonSetMark9.RibbonMarkPartner"/> mark.

View file

@ -128,10 +128,19 @@ public static class RibbonRules
var species = pk.Species;
if (species is (int)WalkingWake or (int)IronLeaves)
return false;
if (species is (int)Greninja)
return pk.Form == 0; // Disallow Ash-Greninja
if (SpeciesCategory.IsLegendary(species))
return false;
if (SpeciesCategory.IsMythical(species))
return false;
// DLC 1: Teal Mask Additions
if (species is (>= (int)Turtwig and <= (int)Empoleon))
return false;
var pi = PersonalTable.SV.GetFormEntry(species, pk.Form);
if (pi.DexPaldea == 0 && pi.DexKitakami != 0)
return false;
return true;
}

View file

@ -55,7 +55,7 @@ internal static class MoveInfo9
10, 10, 10, 10, 15, 15, 10, 10, 10, 05, 15, 10, 10, 10, 10, 10, 10, 15, 15, 05,
10, 15, 05, 01, 15, 10, 15, 10, 10, 10, 10, 10, 10, 10, 05, 15, 15, 10, 05, 05,
10, 10, 10, 10, 20, 20, 20, 05, 10, 10, 05, 10, 05, 05, 10, 20, 10, 10, 10, 10,
10,
10, 05, 15, 10, 10,
};
public static ReadOnlySpan<byte> MoveType_SV => new byte[]
@ -105,7 +105,7 @@ internal static class MoveInfo9
13, 07, 08, 01, 07, 16, 02, 12, 04, 13, 13, 00, 06, 01, 07, 13, 15, 10, 11, 08,
00, 14, 15, 00, 05, 10, 03, 00, 00, 16, 11, 09, 10, 00, 08, 13, 10, 16, 01, 12,
00, 14, 00, 14, 06, 11, 10, 00, 13, 07, 09, 09, 12, 08, 16, 10, 09, 16, 03, 01,
17,
17, 00, 11, 11, 11,
};
/// <summary>
@ -118,24 +118,24 @@ internal static class MoveInfo9
140, 142, 145, 146, 148, 149, 155, 158, 159, 160, 166,
167, 169, 170, 171, 176, 177, 185, 190, 193, 216, 218,
221, 222, 228, 233, 237, 258, 265, 267, 274, 277, 279,
287, 288, 289, 290, 293, 294, 295, 296, 300, 301, 302,
312, 316, 318, 320, 324, 327, 346, 353, 354, 357, 358,
287, 288, 289, 290, 293, 295, 296, 300, 301, 302,
312, 316, 318, 320, 324, 327, 346, 354, 357, 358,
363, 373, 375, 376, 377, 378, 381, 382, 386, 426, 429,
431, 439, 443, 445, 448, 456, 462, 464, 465, 466, 475,
431, 439, 443, 445, 448, 456, 462, 466, 475,
477, 480, 481, 485, 498, 507, 516, 530, 531, 536, 537,
543, 544, 545, 546, 548, 549, 550, 551, 553, 554, 558,
559, 561, 563, 567, 569, 571, 576, 578, 579, 582, 588,
559, 561, 563, 567, 569, 576, 578, 579, 582, 588,
599, 600, 601, 612, 613, 614, 615, 616, 617, 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, 664, 666, 671, 672, 673, 674, 677, 685, 687,
690, 691, 692, 695, 696, 697, 698, 699, 700, 701, 702,
657, 658, 664, 666, 671, 673, 674, 677, 685, 687,
690, 692, 695, 696, 697, 698, 699, 700, 701, 702,
703, 704, 708, 711, 712, 713, 714, 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, 753, 754, 755, 757, 758, 759, 760, 761, 762, 763,
764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774,
775, 777, 779, 783, 790, 792, 794, 795, 850,
777, 779, 792, 794, 795,
};
}

View file

@ -9,7 +9,7 @@ namespace PKHeX.Core;
public sealed class GameDataPK9 : HomeOptional1, IGameDataSide<PK9>, IScaledSize3, IGameDataSplitAbility
{
private const HomeGameDataFormat ExpectFormat = HomeGameDataFormat.PK9;
private const int SIZE = HomeCrypto.SIZE_2GAME_PK9;
private const int SIZE = HomeCrypto.SIZE_3GAME_PK9;
protected override HomeGameDataFormat Format => ExpectFormat;
public GameDataPK9() : base(SIZE) { }
@ -44,33 +44,72 @@ public sealed class GameDataPK9 : HomeOptional1, IGameDataSide<PK9>, IScaledSize
public int Egg_Location { get => ReadUInt16LittleEndian(Data[0x1C..]); set => WriteUInt16LittleEndian(Data[0x1C..], (ushort)value); }
public int Met_Location { get => ReadUInt16LittleEndian(Data[0x1E..]); set => WriteUInt16LittleEndian(Data[0x1E..], (ushort)value); }
private const int RecordStart = 0x20;
private const int RecordCount = PK9.COUNT_RECORD; // Up to 200 TM flags, but not all are used.
private const int RecordLength = RecordCount / 8;
private Span<byte> RecordFlags => Data.Slice(RecordStart, RecordLength);
public bool GetMoveRecordFlag(int index)
{
if ((uint)index > RecordCount) // 0x19 bytes, 8 bits
throw new ArgumentOutOfRangeException(nameof(index));
return FlagUtil.GetFlag(RecordFlags, index >> 3, index & 7);
}
public void SetMoveRecordFlag(int index, bool value = true)
{
if ((uint)index > RecordCount) // 0x19 bytes, 8 bits
throw new ArgumentOutOfRangeException(nameof(index));
FlagUtil.SetFlag(RecordFlags, index >> 3, index & 7, value);
}
public bool GetMoveRecordFlagAny() => RecordFlags.IndexOfAnyExcept<byte>(0) >= 0;
public void ClearMoveRecordFlags() => RecordFlags.Clear();
private const int RecordStartBase = 0x20;
internal const int COUNT_RECORD_BASE = PK9.COUNT_RECORD_BASE; // Up to 200 TM flags, but not all are used.
private const int RecordLengthBase = COUNT_RECORD_BASE / 8; // 0x19 bytes, 8 bits
public Span<byte> RecordFlagsBase => Data.Slice(RecordStartBase, RecordLengthBase);
// Rev2 Additions
public byte Obedience_Level { get => Data[0x39]; set => Data[0x39] = value; }
public ushort Ability { get => ReadUInt16LittleEndian(Data[0x3A..]); set => WriteUInt16LittleEndian(Data[0x3A..], value); }
public byte AbilityNumber { get => Data[0x3C]; set => Data[0x3C] = value; }
// Rev3 Additions
private const int RecordStartDLC = 0x3D;
internal const int COUNT_RECORD_DLC = PK9.COUNT_RECORD_DLC; // 13 additional bytes allocated for DLC1/2 TM Flags
private const int RecordLengthDLC = COUNT_RECORD_DLC / 8;
public Span<byte> RecordFlagsDLC => Data.Slice(RecordStartDLC, RecordLengthDLC);
#endregion
#region TM Flag Methods
public bool GetMoveRecordFlag(int index)
{
if ((uint)index >= COUNT_RECORD_BASE)
return GetMoveRecordFlagDLC(index - COUNT_RECORD_BASE);
int ofs = index >> 3;
return FlagUtil.GetFlag(Data, RecordStartBase + ofs, index & 7);
}
private bool GetMoveRecordFlagDLC(int index)
{
if ((uint)index >= COUNT_RECORD_DLC)
throw new ArgumentOutOfRangeException(nameof(index));
int ofs = index >> 3;
return FlagUtil.GetFlag(Data, RecordStartDLC + ofs, index & 7);
}
public void SetMoveRecordFlag(int index, bool value = true)
{
if ((uint)index >= COUNT_RECORD_BASE)
{
SetMoveRecordFlagDLC(value, index - COUNT_RECORD_BASE);
return;
}
int ofs = index >> 3;
FlagUtil.SetFlag(Data, RecordStartBase + ofs, index & 7, value);
}
private void SetMoveRecordFlagDLC(bool value, int index)
{
if ((uint)index >= COUNT_RECORD_DLC)
throw new ArgumentOutOfRangeException(nameof(index));
int ofs = index >> 3;
FlagUtil.SetFlag(Data, RecordStartDLC + ofs, index & 7, value);
}
public bool GetMoveRecordFlagAny() => GetMoveRecordFlagAnyBase() || GetMoveRecordFlagAnyDLC();
private bool GetMoveRecordFlagAnyBase() => RecordFlagsBase.IndexOfAnyExcept<byte>(0) >= 0;
private bool GetMoveRecordFlagAnyDLC() => RecordFlagsDLC.IndexOfAnyExcept<byte>(0) >= 0;
public void ClearMoveRecordFlags()
{
ClearMoveRecordFlagsBase();
ClearMoveRecordFlagsDLC();
}
private void ClearMoveRecordFlagsBase() => RecordFlagsBase.Clear();
private void ClearMoveRecordFlagsDLC() => RecordFlagsDLC.Clear();
#endregion
#region Conversion
@ -83,7 +122,8 @@ public sealed class GameDataPK9 : HomeOptional1, IGameDataSide<PK9>, IScaledSize
pk.Scale = Scale;
pk.TeraTypeOriginal = TeraTypeOriginal;
pk.TeraTypeOverride = TeraTypeOverride;
RecordFlags.CopyTo(pk.RecordFlags);
RecordFlagsBase.CopyTo(pk.RecordFlagsBase);
RecordFlagsDLC.CopyTo(pk.RecordFlagsDLC);
pk.Obedience_Level = Obedience_Level;
pk.Ability = Ability;
pk.AbilityNumber = AbilityNumber;
@ -95,7 +135,8 @@ public sealed class GameDataPK9 : HomeOptional1, IGameDataSide<PK9>, IScaledSize
pkh.HeightScalar = Scale = pk.Scale; // Overwrite Height
TeraTypeOriginal = pk.TeraTypeOriginal;
TeraTypeOverride = pk.TeraTypeOverride;
pk.RecordFlags.CopyTo(RecordFlags);
pk.RecordFlagsBase.CopyTo(RecordFlagsBase);
pk.RecordFlagsDLC.CopyTo(RecordFlagsDLC);
Obedience_Level = pk.Obedience_Level;
Ability = (ushort)pk.Ability;
AbilityNumber = (byte)pk.AbilityNumber;

View file

@ -13,6 +13,7 @@ public static class HomeCrypto
{
public const int Version1 = 1;
public const int Version2 = 2;
public const int Version3 = 3;
public const int SIZE_1HEADER = 0x10; // 16
@ -31,11 +32,14 @@ public static class HomeCrypto
public const int SIZE_2GAME_PK9 = 0x3D; // 61
public const int SIZE_2STORED = 0x23A; // 570
public const int SIZE_STORED = SIZE_2STORED;
public const int SIZE_CORE = SIZE_2CORE;
public const int VersionLatest = Version2;
public const int SIZE_3GAME_PK9 = 0x3D + 0xD; // 61
public const int SIZE_3STORED = 0x247; // 583
public static bool IsKnownVersion(ushort version) => version is Version1 or Version2;
public const int SIZE_STORED = SIZE_3STORED;
public const int SIZE_CORE = SIZE_2CORE;
public const int VersionLatest = Version3;
public static bool IsKnownVersion(ushort version) => version is Version1 or Version2 or Version3;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetEncryptionKey(Span<byte> key, ulong seed)
@ -142,6 +146,7 @@ public static class HomeCrypto
{
Version1 => IsEncryptedCore1(data),
Version2 => IsEncryptedCore2(data),
Version3 => IsEncryptedCore3(data),
_ => throw new ArgumentException($"Unrecognized format: {format}"),
};
@ -178,6 +183,8 @@ public static class HomeCrypto
return false; // 64 bits checked is enough to feel safe about this check.
}
private static bool IsEncryptedCore3(ReadOnlySpan<byte> data) => IsEncryptedCore2(data); // Same struct as Core version 2.
/// <summary>
/// Gets the checksum of an Pokémon's AES-encrypted data.
/// </summary>

View file

@ -236,8 +236,8 @@ public sealed class PKH : PKM, IHandlerLanguage, IFormArgument, IHomeTrack, IBat
#endregion
public override int SIZE_PARTY => HomeCrypto.SIZE_2STORED;
public override int SIZE_STORED => HomeCrypto.SIZE_2STORED;
public override int SIZE_PARTY => HomeCrypto.SIZE_3STORED;
public override int SIZE_STORED => HomeCrypto.SIZE_3STORED;
public override bool Valid { get => true; set { } }
public override PersonalInfo PersonalInfo => LatestGameData.GetPersonalInfo(Species, Form);
public override void RefreshChecksum() => Checksum = 0;

View file

@ -46,6 +46,28 @@ public static class TeraTypeUtil
return GetTeraType((byte)t.TeraTypeOriginal, (byte)t.TeraTypeOverride);
}
/// <summary>
/// Indicates if the Tera Type value is valid (changed from anything to anything).
/// </summary>
/// <param name="override">Current override value</param>
/// <returns>True if valid.</returns>
public static bool IsValid(byte @override) => @override is <= MaxType or OverrideNone;
/// <summary>
/// Checks if Ogerpon's Tera Type is valid.
/// </summary>
/// <param name="type">Tera Type to check</param>
/// <param name="form">Ogerpon's form</param>
/// <returns>True if the Tera Type is valid.</returns>
public static bool IsValidOgerpon(byte type, byte form) => (form & 3) switch
{
0 => type is (byte)MoveType.Grass or OverrideNone,
1 => type is (byte)MoveType.Water,
2 => type is (byte)MoveType.Fire,
3 => type is (byte)MoveType.Rock,
_ => false,
};
/// <summary>
/// Calculates the effective Tera Type based on the inputs.
/// </summary>
@ -111,4 +133,11 @@ public static class TeraTypeUtil
_ => (MoveType)Tera9RNG.GetTeraTypeFromPersonal(enc.Species, enc.Form, Util.Rand.Rand64()),
};
}
/// <summary>
/// Checks if the given species can have its Tera Type changed.
/// </summary>
/// <param name="species">Species to check</param>
/// <returns>True if the species can have its Tera Type changed.</returns>
public static bool CanChangeTeraType(ushort species) => species != (int)Species.Ogerpon;
}

View file

@ -381,7 +381,8 @@ public sealed class PK6 : G6PKM, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetC
public override int Stat_SPD { get => ReadUInt16LittleEndian(Data.AsSpan(0xFC)); set => WriteUInt16LittleEndian(Data.AsSpan(0xFC), (ushort)value); }
#endregion
public int SuperTrainingMedalCount(int maxCount = 30) => BitOperations.PopCount(SuperTrainBitFlags >> 2);
private const int MedalCount = 30;
public int SuperTrainingMedalCount(int lowBitCount = MedalCount) => BitOperations.PopCount((SuperTrainBitFlags >> 2) & (uint.MaxValue >> (MedalCount - lowBitCount)));
public bool IsUntradedEvent6 => Geo1_Country == 0 && Geo1_Region == 0 && Met_Location / 10000 == 4 && Gen6;

View file

@ -414,7 +414,8 @@ public sealed class PK7 : G6PKM, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetC
public override int Stat_SPD { get => ReadUInt16LittleEndian(Data.AsSpan(0xFC)); set => WriteUInt16LittleEndian(Data.AsSpan(0xFC), (ushort)value); }
#endregion
public int SuperTrainingMedalCount(int maxCount = 30) => BitOperations.PopCount(SuperTrainBitFlags >> 2);
private const int MedalCount = 30;
public int SuperTrainingMedalCount(int lowBitCount = MedalCount) => BitOperations.PopCount((SuperTrainBitFlags >> 2) & (uint.MaxValue >> (MedalCount - lowBitCount)));
public bool IsUntradedEvent6 => Geo1_Country == 0 && Geo1_Region == 0 && Met_Location / 10000 == 4 && Gen6;

View file

@ -16,7 +16,6 @@ public sealed class PK9 : PKM, ISanityChecksum, ITeraType, ITechRecord, IObedien
0x23,
0x33,
0x3E, 0x3F,
0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x90, 0x91, 0x92, 0x93, // Status condition
0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
0xC5,
@ -325,7 +324,7 @@ public sealed class PK9 : PKM, ISanityChecksum, ITeraType, ITechRecord, IObedien
public byte WeightScalar { get => Data[0x49]; set => Data[0x49] = value; }
public byte Scale { get => Data[0x4A]; set => Data[0x4A] = value; }
// 0x52-0x57 unused
// 0x4B-0x57 is DLC TM Record Flags, see TM flag handling below for details
#endregion
#region Block B
@ -443,29 +442,63 @@ public sealed class PK9 : PKM, ISanityChecksum, ITeraType, ITechRecord, IObedien
set => WriteUInt64LittleEndian(Data.AsSpan(0x127), value);
}
private const int RecordStart = 0x12F;
internal const int COUNT_RECORD = 200; // Up to 200 TM flags, but not all are used.
private const int RecordLength = COUNT_RECORD / 8;
public Span<byte> RecordFlags => Data.AsSpan(RecordStart, RecordLength);
private const int RecordStartBase = 0x12F;
internal const int COUNT_RECORD_BASE = 200; // Up to 200 TM flags, but not all are used.
private const int RecordLengthBase = COUNT_RECORD_BASE / 8; // 0x19 bytes, 8 bits
public Span<byte> RecordFlagsBase => Data.AsSpan(RecordStartBase, RecordLengthBase);
private const int RecordStartDLC = 0x4B;
internal const int COUNT_RECORD_DLC = 104; // 13 additional bytes allocated for DLC1/2 TM Flags
private const int RecordLengthDLC = COUNT_RECORD_DLC / 8;
public Span<byte> RecordFlagsDLC => Data.AsSpan(RecordStartDLC, RecordLengthDLC);
public bool GetMoveRecordFlag(int index)
{
if ((uint)index > COUNT_RECORD) // 0x19 bytes, 8 bits
if ((uint)index >= COUNT_RECORD_BASE)
return GetMoveRecordFlagDLC(index - COUNT_RECORD_BASE);
int ofs = index >> 3;
return FlagUtil.GetFlag(Data, RecordStartBase + ofs, index & 7);
}
private bool GetMoveRecordFlagDLC(int index)
{
if ((uint)index >= COUNT_RECORD_DLC)
throw new ArgumentOutOfRangeException(nameof(index));
int ofs = index >> 3;
return FlagUtil.GetFlag(Data, RecordStart + ofs, index & 7);
return FlagUtil.GetFlag(Data, RecordStartDLC + ofs, index & 7);
}
public void SetMoveRecordFlag(int index, bool value = true)
{
if ((uint)index > COUNT_RECORD) // 0x19 bytes, 8 bits
throw new ArgumentOutOfRangeException(nameof(index));
if ((uint)index >= COUNT_RECORD_BASE)
{
SetMoveRecordFlagDLC(value, index - COUNT_RECORD_BASE);
return;
}
int ofs = index >> 3;
FlagUtil.SetFlag(Data, RecordStart + ofs, index & 7, value);
FlagUtil.SetFlag(Data, RecordStartBase + ofs, index & 7, value);
}
public bool GetMoveRecordFlagAny() => RecordFlags.IndexOfAnyExcept<byte>(0) >= 0;
public void ClearMoveRecordFlags() => RecordFlags.Clear();
private void SetMoveRecordFlagDLC(bool value, int index)
{
if ((uint)index >= COUNT_RECORD_DLC)
throw new ArgumentOutOfRangeException(nameof(index));
int ofs = index >> 3;
FlagUtil.SetFlag(Data, RecordStartDLC + ofs, index & 7, value);
}
public bool GetMoveRecordFlagAny() => GetMoveRecordFlagAnyBase() || GetMoveRecordFlagAnyDLC();
private bool GetMoveRecordFlagAnyBase() => RecordFlagsBase.IndexOfAnyExcept<byte>(0) >= 0;
private bool GetMoveRecordFlagAnyDLC() => RecordFlagsDLC.IndexOfAnyExcept<byte>(0) >= 0;
public void ClearMoveRecordFlags()
{
ClearMoveRecordFlagsBase();
ClearMoveRecordFlagsDLC();
}
private void ClearMoveRecordFlagsBase() => RecordFlagsBase.Clear();
private void ClearMoveRecordFlagsDLC() => RecordFlagsDLC.Clear();
#endregion
#region Battle Stats
@ -513,6 +546,9 @@ public sealed class PK9 : PKM, ISanityChecksum, ITeraType, ITechRecord, IObedien
{
if (IsEgg)
{
if (Egg_Location == 60005 && tr.Gender == OT_Gender && tr.Language == Language && tr.OT == OT_Name)
return; // Jacq gift, don't change.
// Apply link trade data, only if it left the OT (ignore if dumped & imported, or cloned, etc)
// If not matching the trainer details, mark as a traded egg.
if (!IsTradedEgg && tr.Gender == OT_Gender && tr.Language == Language && tr.OT == OT_Name)

View file

@ -110,5 +110,5 @@ public interface ISuperTrain
uint SuperTrainBitFlags { get; set; }
bool SecretSuperTrainingUnlocked { get; set; }
bool SecretSuperTrainingComplete { get; set; }
int SuperTrainingMedalCount(int maxCount = 30);
int SuperTrainingMedalCount(int lowBitCount = 30);
}

View file

@ -429,6 +429,10 @@ public static class FormConverter
types[0],
forms[Lord],
},
Ursaluna when generation >= 9 => new[] {
types[0],
forms[Bloodmoon],
},
Enamorus => new[] {
forms[641], // Incarnate
forms[952], // Therian
@ -486,6 +490,24 @@ public static class FormConverter
forms[Aquatic],
forms[Glide],
},
Ogerpon => new[] {
forms[MaskTeal],
forms[MaskWellspring],
forms[MaskHearthflame],
forms[MaskCornerstone],
$"*{forms[MaskTeal]}",
$"*{forms[MaskWellspring]}",
$"*{forms[MaskHearthflame]}",
$"*{forms[MaskCornerstone]}",
},
Poltchageist => new[] {
forms[Counterfeit],
forms[Artisan],
},
Sinistcha => new[] {
forms[Unremarkable],
forms[Masterpiece],
},
_ => EMPTY,
};
}
@ -873,6 +895,15 @@ public static class FormConverter
private const int PaldeanCombat = 1123;
private const int PaldeanBlaze = 1124;
private const int PaldeanAqua = 1125;
internal const int MaskTeal = 1126;
private const int Counterfeit = 1127;
private const int Unremarkable = 1128;
private const int Bloodmoon = 1129;
internal const int MaskWellspring = 1130;
internal const int MaskHearthflame = 1131;
internal const int MaskCornerstone = 1132;
private const int Artisan = 1133;
private const int Masterpiece = 1134;
public static string GetGigantamaxName(IReadOnlyList<string> forms) => forms[Gigantamax];

View file

@ -150,9 +150,12 @@ public static class SpeciesConverter
029, -53, -65, 025, -06, -03, -07, -04, -04, -08,
-04, 001, -03, -03, -06, -04, -47, -47, -47, -23,
-23, -05, -07, -09, -07, -20, -13, -09, -09, -29,
-23,
-23, 001, 012, 012, 000, 000, 000, -06, UNK, UNK,
UNK, UNK, UNK, UNK, UNK, UNK,
};
private const sbyte UNK = 111;
/// <summary>
/// Difference of Gen9 Species IDs (index) and the associated National Dex IDs (value)
/// </summary>
@ -168,6 +171,7 @@ public static class SpeciesConverter
029, 008, 003, 004, 004, 020, 004, 023, 006, 003,
003, 004, -01, 013, 009, 007, 005, 007, 009, 009,
-43, -43, -43, -68, -68, -68, -58, -58, -25, -29,
-31,
-31, 006, -01, UNK, 000, 000, 000, UNK, UNK, UNK,
UNK, UNK, UNK, UNK, -12, -12,
};
}

View file

@ -8,7 +8,7 @@ namespace PKHeX.Core;
/// </summary>
public sealed class PersonalInfo9SV : PersonalInfo, IPersonalAbility12H, IPersonalInfoTM, IPermitRecord
{
public const int SIZE = 0x44;
public const int SIZE = 0x4C;
private readonly byte[] Data;
public PersonalInfo9SV(byte[] data) => Data = data;
@ -45,7 +45,7 @@ public sealed class PersonalInfo9SV : PersonalInfo, IPersonalAbility12H, IPerson
public override int Color { get => Data[0x1B]; set => Data[0x1B] = (byte)value; }
public bool IsPresentInGame { get => Data[0x1C] != 0; set => Data[0x1C] = value ? (byte)1 : (byte)0; }
public byte DexGroup { get => Data[0x1D]; set => Data[0x1D] = value; }
public ushort DexIndex { get => ReadUInt16LittleEndian(Data.AsSpan(0x1E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x1E), value); }
public ushort DexPaldea { get => ReadUInt16LittleEndian(Data.AsSpan(0x1E)); set => WriteUInt16LittleEndian(Data.AsSpan(0x1E), value); }
public override int Height { get => ReadUInt16LittleEndian(Data.AsSpan(0x20)); set => WriteUInt16LittleEndian(Data.AsSpan(0x20), (ushort)value); }
public override int Weight { get => ReadUInt16LittleEndian(Data.AsSpan(0x22)); set => WriteUInt16LittleEndian(Data.AsSpan(0x22), (ushort)value); }
public ushort HatchSpecies { get => ReadUInt16LittleEndian(Data.AsSpan(0x24)); set => WriteUInt16LittleEndian(Data.AsSpan(0x24), value); }
@ -65,7 +65,7 @@ public sealed class PersonalInfo9SV : PersonalInfo, IPersonalAbility12H, IPerson
/// <summary>
/// Checks if the entry shows up in any of the built-in Pokédex.
/// </summary>
public bool IsInDex => DexIndex != 0;
public bool IsInDex => DexPaldea != 0 || DexKitakami != 0 || DexBlueberry != 0;
public override int AbilityCount => 3;
public override int GetIndexOfAbility(int abilityID) => abilityID == Ability1 ? 0 : abilityID == Ability2 ? 1 : abilityID == AbilityH ? 2 : -1;
@ -78,7 +78,7 @@ public sealed class PersonalInfo9SV : PersonalInfo, IPersonalAbility12H, IPerson
};
private const int TM = 0x2C;
private const int CountTM = 172;
private const int CountTM = 202;
private const int ByteCountTM = (CountTM + 7) / 8;
public bool GetIsLearnTM(int index)
@ -112,7 +112,7 @@ public sealed class PersonalInfo9SV : PersonalInfo, IPersonalAbility12H, IPerson
public bool IsRecordPermitted(int index) => GetIsLearnTM(index);
public ReadOnlySpan<ushort> RecordPermitIndexes => TM_SV;
public int RecordCountTotal => 200;
public int RecordCountTotal => 202;
public int RecordCountUsed => CountTM;
private static ReadOnlySpan<ushort> TM_SV => new ushort[]
@ -134,6 +134,12 @@ public sealed class PersonalInfo9SV : PersonalInfo, IPersonalAbility12H, IPerson
417, 126, 056, 059, 519, 518, 520, 528, 188, 089,
444, 566, 416, 307, 308, 338, 200, 315, 411, 437,
542, 433, 405, 063, 413, 394, 087, 370, 076, 434,
796, 851,
796, 851, 046, 268, 114, 092, 328, 180, 356, 479,
360, 282, 450, 162, 410, 679, 667, 333, 503, 535,
669, 253, 264, 311, 803, 807, 812, 814, 809, 808,
799, 802,
};
public byte DexKitakami { get => Data[0x4A]; set => Data[0x4A] = value; }
public byte DexBlueberry { get => Data[0x4B]; set => Data[0x4B] = value; }
}

View file

@ -2230,64 +2230,64 @@ TM168
TM169
TM170
TM171
TM172
TM173
TM174
TM175
TM176
TM177
TM178
TM179
TM180
TM181
TM182
TM183
TM184
TM185
TM186
TM187
TM188
TM189
TM190
TM191
TM192
TM193
TM194
TM195
TM196
TM197
TM198
TM199
TM200
TM201
TM202
TM203
TM204
TM205
TM206
TM207
TM208
TM209
TM210
TM211
TM212
TM213
TM214
TM215
TM216
TM217
TM218
TM219
TM220
TM221
TM222
TM223
TM224
TM225
TM226
TM227
TM228
TM229
@ -2398,4 +2398,85 @@ Grüner Teller
Oranger Teller
Roter Teller
Weißer Teller
Gelber Teller
Gelber Teller
Feendaune
Saftiger Apfel
Simple Teeschale
Edle Teeschale
Türkisgrüne Maske
Fundamentmaske
Brunnenmaske
Ofenmaske
Grüne Style-Karte
Kristallfragment
Heil-Mochi
Kraft-Mochi
Abwehr-Mochi
Genie-Mochi
Esprit-Mochi
Flink-Mochi
Standard-Stühle
Akademie-Stühle
Akademie-Stühle
Zauber-Stühle
Natur-Stühle
Groll-Stühle
Gelbkaro-Stühle
Blaukaro-Stühle
Rotkaro-Stühle
Retro-Gras-Stühle
Action-Stühle
Ungeheuer-Stühle
Streifen-Stühle
Rauten-Stühle
Punkte-Stühle
Violette Stühle
Türkise Stühle
Beige Stühle
Gelbe Stühle
Blaue Stühle
Pinke Stühle
Rettan-Zahn
Sandan-Kralle
Pii-Haar
Vulpix-Haar
Quapsel-Schleim
Knofensa-Ranke
Kleinstein-Splitter
Smogon-Gas
Mampfaxo-Zahn
Wiesor-Haar
Hoothoot-Feder
Webarak-Faden
Griffel-Haar
Yanma-Stachel
Skorgla-Zahn
Schneckmag-Lava
Quiekel-Haar
Fiffyen-Zahn
Loturzel-Blatt
Samurzel-Zweig
Nasgnet-Splitter
Volbeat-Sekret
Illumise-Sekret
Krebscorps-Schale
Barschwa-Schuppe
Zwirrlicht-Splitter
Klingplim-Splitter
Praktibalk-Schweiß
Strawickl-Blatt
Piccolente-Feder
Lichtel-Ruß
Lin-Fu-Kralle
Skallyk-Feder
Rocara-Edelstein
Paragoni-Zweig
Mabula-Faden
Wommel-Puder
Miniras-Schuppe
Urgl-Daune
Morpeko-Samen
Mortcha-Puder
Neuanfangs-Mochi
Rotom-Stick
Glitzerpin

View file

@ -2230,64 +2230,64 @@ TM168
TM169
TM170
TM171
TM172
TM173
TM174
TM175
TM176
TM177
TM178
TM179
TM180
TM181
TM182
TM183
TM184
TM185
TM186
TM187
TM188
TM189
TM190
TM191
TM192
TM193
TM194
TM195
TM196
TM197
TM198
TM199
TM200
TM201
TM202
TM203
TM204
TM205
TM206
TM207
TM208
TM209
TM210
TM211
TM212
TM213
TM214
TM215
TM216
TM217
TM218
TM219
TM220
TM221
TM222
TM223
TM224
TM225
TM226
TM227
TM228
TM229
@ -2398,4 +2398,85 @@ Green Dish
Orange Dish
Red Dish
White Dish
Yellow Dish
Yellow Dish
Fairy Feather
Syrupy Apple
Unremarkable Teacup
Masterpiece Teacup
Teal Mask
Cornerstone Mask
Wellspring Mask
Hearthflame Mask
Teal Style Card
Crystal Cluster
Health Mochi
Muscle Mochi
Resist Mochi
Genius Mochi
Clever Mochi
Swift Mochi
Simple Chairs
Academy Chairs
Academy Chairs
Whimsical Chairs
Leafy Chairs
Spooky Chairs
Plaid Chairs (Y)
Plaid Chairs (B)
Plaid Chairs (R)
B&W Grass Chairs
Battle Chairs
Monstrous Chairs
Striped Chairs
Diamond Chairs
Polka-Dot Chairs
Lilac Chairs
Mint Chairs
Peach Chairs
Yellow Chairs
Blue Chairs
Pink Chairs
Ekans Fang
Sandshrew Claw
Cleffa Fur
Vulpix Fur
Poliwag Slime
Bellsprout Vine
Geodude Fragment
Koffing Gas
Munchlax Fang
Sentret Fur
Hoothoot Feather
Spinarak Thread
Aipom Hair
Yanma Spike
Gligar Fang
Slugma Lava
Swinub Hair
Poochyena Fang
Lotad Leaf
Seedot Stem
Nosepass Fragment
Volbeat Fluid
Illumise Fluid
Corphish Shell
Feebas Scales
Duskull Fragment
Chingling Fragment
Timburr Sweat
Sewaddle Leaf
Ducklett Feather
Litwick Soot
Mienfoo Claw
Vullaby Feather
Carbink Jewel
Phantump Twig
Grubbin Thread
Cutiefly Powder
Jangmo-o Scales
Cramorant Down
Morpeko Snack
Poltchageist Powder
Fresh-Start Mochi
Roto-Stick
Glimmering Charm

View file

@ -2230,64 +2230,64 @@ MT168
MT169
MT170
MT171
MT172
MT173
MT174
MT175
MT176
MT177
MT178
MT179
MT180
MT181
MT182
MT183
MT184
MT185
MT186
MT187
MT188
MT189
MT190
MT191
MT192
MT193
MT194
MT195
MT196
MT197
MT198
MT199
MT200
MT201
MT202
MT203
MT204
MT205
MT206
MT207
MT208
MT209
MT210
MT211
MT212
MT213
MT214
MT215
MT216
MT217
MT218
MT219
MT220
MT221
MT222
MT223
MT224
MT225
MT226
MT227
MT228
MT229
@ -2398,4 +2398,85 @@ Plato Verde
Plato Naranja
Plato Rojo
Plato Blanco
Plato Amarillo
Plato Amarillo
Pluma Feérica
Manzana Melosa
Cuenco Mediocre
Cuenco Exquisito
Máscara Turquesa
Máscara Cimiento
Máscara Fuente
Máscara Horno
Tarjeta Chic Verde
Fragmento de Cristal
Mochi Vigor
Mochi Músculo
Mochi Aguante
Mochi Intelecto
Mochi Mente
Mochi Ímpetu
Sillas Simples
Sillas Academia
Sillas Academia
Sillas Cucas
Sillas Naturaleza
Sillas Espectrales
Sillas Cuadros Ámbares
Sillas Cuadros Azules
Sillas Cuadros Rojas
Sillas Hierba Alta
Sillas Combate
Sillas Monstruosas
Sillas Rayas
Sillas Rombos
Sillas Lunares
Sillas Malvas
Sillas Menta
Sillas Beis
Sillas Amarillas
Sillas Azules
Sillas Rosas
Colmillo de Ekans
Garra de Sandshrew
Pelo de Cleffa
Pelo de Vulpix
Secreción de Poliwag
Liana de Bellsprout
Fragmento de Geodude
Gas de Koffing
Colmillo de Munchlax
Pelo de Sentret
Pluma de Hoothoot
Hilo de Spinarak
Pelo de Aipom
Aguijón de Yanma
Colmillo de Gligar
Lava de Slugma
Pelo de Swinub
Colmillo de Poochyena
Hoja de Lotad
Tallo de Seedot
Fragmento de Nosepass
Fluido de Volbeat
Fluido de Illumise
Cáscara de Corphish
Escama de Feebas
Fragmento de Duskull
Fragmento de Chingling
Sudor de Timburr
Hoja de Sewaddle
Pluma de Ducklett
Hollín de Litwick
Garra de Mienfoo
Pluma de Vullaby
Gema de Carbink
Rama de Phantump
Hilo de Grubbin
Polvo de Cutiefly
Escama de Jangmo-o
Plumón de Cramorant
Semilla de Morpeko
Polvo de Poltchageist
Mochi Reinicio
Paloselfi Rotom
Amuleto Cristalino

View file

@ -2230,64 +2230,64 @@ CT168
CT169
CT170
CT171
CT172
CT173
CT174
CT175
CT176
CT177
CT178
CT179
CT180
CT181
CT182
CT183
CT184
CT185
CT186
CT187
CT188
CT189
CT190
CT191
CT192
CT193
CT194
CT195
CT196
CT197
CT198
CT199
CT200
CT201
CT202
CT203
CT204
CT205
CT206
CT207
CT208
CT209
CT210
CT211
CT212
CT213
CT214
CT215
CT216
CT217
CT218
CT219
CT220
CT221
CT222
CT223
CT224
CT225
CT226
CT227
CT228
CT229
@ -2398,4 +2398,85 @@ Assiette Verte
Assiette Orange
Assiette Rouge
Assiette Blanche
Assiette Jaune
Assiette Jaune
Plume Enchantée
Pomme Nectar
Bol Médiocre
Bol Exceptionnel
Masque Turquoise
Masque de la Pierre
Masque du Puits
Masque du Fourneau
Carte Élégance Verte
Morceau de Cristal
Mochi Santé
Mochi Force
Mochi Armure
Mochi Esprit
Mochi Mental
Mochi Sprint
Sièges Simples
Sièges de lAcadémie
Sièges de lAcadémie
Sièges Fantaisie
Sièges Verdoyants
Sièges Hantés
Sièges Tartan Jaunes
Sièges Tartan Bleus
Sièges Tartan Rouges
Sièges Hautes Herbes
Sièges Combat Pokémon
Sièges Kaiju
Sièges à Rayures
Sièges à Losanges
Sièges à Pois
Sièges Mauves
Sièges Menthe
Sièges Beiges
Sièges Jaunes
Sièges Bleus
Sièges Roses
Croc dAbo
Griffe de Sabelette
Poils de Mélo
Poils de Goupix
Mucus de Ptitard
Liane de Chétiflor
Fragment de Racaillou
Gaz de Smogo
Croc de Goinfrex
Poils de Fouinette
Plume de Hoothoot
Fil de Mimigal
Poils de Capumain
Dard de Yanma
Croc de Scorplane
Lave de Limagma
Poils de Marcacrin
Croc de Medhyèna
Feuille de Nénupiot
Tige de Grainipiot
Fragment de Tarinor
Fluide de Muciole
Fluide de Lumivole
Carapace dÉcrapince
Écaille de Barpau
Fragment de Skelénox
Fragment de Korillon
Sueur de Charpenti
Feuille de Larveyette
Plume de Couaneton
Suie de Funécire
Griffe de Kungfouine
Plume de Vostourno
Joyau de Strassie
Branche de Brocélôme
Fil de Larvibule
Poudre de Bombydou
Écaille de Bébécaille
Duvet de Nigosier
Graine de Morpeko
Poudre de Poltchageist
Mochi Renouveau
Perche à Motismart
Charme Éclatant

View file

@ -2230,64 +2230,64 @@ MT168
MT169
MT170
MT171
MT172
MT173
MT174
MT175
MT176
MT177
MT178
MT179
MT180
MT181
MT182
MT183
MT184
MT185
MT186
MT187
MT188
MT189
MT190
MT191
MT192
MT193
MT194
MT195
MT196
MT197
MT198
MT199
MT200
MT201
MT202
MT203
MT204
MT205
MT206
MT207
MT208
MT209
MT210
MT211
MT212
MT213
MT214
MT215
MT216
MT217
MT218
MT219
MT220
MT221
MT222
MT223
MT224
MT225
MT226
MT227
MT228
MT229
@ -2398,4 +2398,85 @@ Piatto verde
Piatto arancione
Piatto rosso
Piatto bianco
Piatto giallo
Piatto giallo
Piuma fatata
Sciroppomo
Tazza dozzinale
Tazza eccezionale
Maschera Turchese
Maschera Fondamenta
Maschera Pozzo
Maschera Focolare
Tessera chic verde
Pezzo di cristallo
Mochi della salute
Mochi della potenza
Mochi della tutela
Mochi dellingegno
Mochi dellintuito
Mochi della reazione
Sedie semplici
Sedie accademia
Sedie accademia
Sedie carine
Sedie natura
Sedie dispetto
Sedie a quadri gialle
Sedie a quadri viola
Sedie a quadri rosse
Sedie erba alta
Sedie sfida
Sedie mostruose
Sedie a righe
Sedie a rombi
Sedie a pois
Sedie lilla
Sedie menta
Sedie pesca
Sedie gialle
Sedie blu
Sedie rosa
Zanna di Ekans
Artiglio di Sandshrew
Pelo di Cleffa
Pelo di Vulpix
Muco di Poliwag
Viticcio di Bellsprout
Frammento di Geodude
Gas di Koffing
Zanna di Munchlax
Pelo di Sentret
Penna di Hoothoot
Filo di Spinarak
Pelo di Aipom
Aculeo di Yanma
Zanna di Gligar
Lava di Slugma
Pelo di Swinub
Zanna di Poochyena
Foglia di Lotad
Picciolo di Seedot
Frammento di Nosepass
Fluido di Volbeat
Fluido di Illumise
Carapace di Corphish
Squama di Feebas
Frammento di Duskull
Frammento di Chingling
Sudore di Timburr
Foglia di Sewaddle
Penna di Ducklett
Fuliggine di Litwick
Artiglio di Mienfoo
Penna di Vullaby
Gemma di Carbink
Ramo di Phantump
Filo di Grubbin
Polvere di Cutiefly
Squama di Jangmo-o
Piuma di Cramorant
Seme di Morpeko
Polvere di Poltchageist
Mochi del ripristino
Bastone Rotoselfie
Brillamuleto

View file

@ -2230,64 +2230,64 @@
わざマシン169
わざマシン170
わざマシン171
わざマシン172
わざマシン173
わざマシン174
わざマシン175
わざマシン176
わざマシン177
わざマシン178
わざマシン179
わざマシン180
わざマシン181
わざマシン182
わざマシン183
わざマシン184
わざマシン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
@ -2398,4 +2398,85 @@ Bステンレスボトル
オレンジプレート
レッドプレート
ホワイトプレート
イエロープレート
イエロープレート
ようせいのハネ
みついりりんご
ボンサクのちゃわん
ケッサクのちゃわん
みどりのめん
いしずえのめん
いどのめん
かまどのめん
おしゃれカードみどり
けっしょうのかけら
たいりょくのもち
きんりょくのもち
ていこうのもち
ちりょくのもち
せいしんのもち
しゅんぱつのもち
シンプルチェア
スクールチェア
スクールチェア
ファンシーチェア
ネイチャーチェア
うらめしチェア
きいろチェックチェア
あおチェックチェア
あかチェックチェア
くさむらチェア
しょうぶチェア
かいじゅうチェア
ストライプチェア
ダイヤチェア
みずたまチェア
パープルチェア
ミントチェア
ベージュチェア
イエローチェア
ブルーチェア
ピンクチェア
アーボのキバ
サンドのツメ
ピィのけ
ロコンのけ
ニョロモのねんえき
マダツボミのツル
イシツブテのかけら
ドガースのガス
ゴンベのキバ
オタチのけ
ホーホーのはね
イトマルのいと
エイパムのけ
ヤンヤンマのトゲ
グライガーのキバ
マグマッグのようがん
ウリムーのけ
ポチエナのキバ
ハスボーのはっぱ
タネボーのえだ
ノズパスのかけら
バルビートのしる
イルミーゼのしる
ヘイガニのから
ヒンバスのうろこ
ヨマワルのかけら
リーシャンのかけら
ドッコラーのあせ
クルミルのはっぱ
コアルヒーのはね
ヒトモシのすす
コジョフーのツメ
バルチャイのはね
メレシーのほうせき
ボクレーのえだ
アゴジムシのいと
アブリーのこな
ジャラコのウロコ
ウッウのうもう
モルペコのたね
チャデスのこな
まっさらもち
ロトりぼう
きらめくおまもり

View file

@ -2230,64 +2230,64 @@ DS플레이어
기술머신169
기술머신170
기술머신171
기술머신172
기술머신173
기술머신174
기술머신175
기술머신176
기술머신177
기술머신178
기술머신179
기술머신180
기술머신181
기술머신182
기술머신183
기술머신184
기술머신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
@ -2398,4 +2398,85 @@ B 스테인리스 보틀
오렌지 플레이트
레드 플레이트
화이트 플레이트
옐로 플레이트
옐로 플레이트
요정의깃털
꿀맛사과
범작찻잔
걸작찻잔
벽록의가면
주춧돌의가면
우물의가면
화덕의가면
멋쟁이카드 그린
결정조각
체력떡
근력떡
저항력떡
지력떡
정신력떡
순발력떡
심플 체어
스쿨 체어
스쿨 체어
팬시 체어
네이처 체어
원망 체어
옐로 체크 체어
블루 체크 체어
레드 체크 체어
풀숲 체어
배틀 체어
괴수 체어
줄무늬 체어
다이아 체어
물방울 체어
퍼플 체어
민트 체어
베이지 체어
옐로 체어
블루 체어
핑크 체어
아보의이빨
모래두지의발톱
삐의털
식스테일의털
발챙이의점액
모다피의덩굴
꼬마돌의조각
또가스의가스
먹고자의이빨
꼬리선의털
부우부의깃털
페이검의실
에이팜의털
왕자리의가시
글라이거의이빨
마그마그의용암
꾸꾸리의털
포챠나의이빨
연꽃몬의잎
도토링의가지
코코파스의조각
볼비트의체액
네오비트의체액
가재군의껍데기
빈티나의비늘
해골몽의조각
랑딸랑의조각
으랏차의땀
두르보의잎
꼬지보리의깃털
불켜미의검댕
비조푸의손톱
벌차이의깃털
멜리시의보석
나목령의가지
턱지충이의실
에블리의가루
짜랑꼬의비늘
윽우지의솜털
모르페코의씨앗
차데스의가루
순백떡
로토무셀카봉
반짝이는부적

View file

@ -2230,64 +2230,64 @@
招式学习器169
招式学习器170
招式学习器171
招式学习器172
招式学习器173
招式学习器174
招式学习器175
招式学习器176
招式学习器177
招式学习器178
招式学习器179
招式学习器180
招式学习器181
招式学习器182
招式学习器183
招式学习器184
招式学习器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
@ -2398,4 +2398,85 @@
橘色盘子
红色盘子
白色盘子
黄色盘子
黄色盘子
妖精之羽
蜜汁苹果
凡作茶碗
杰作茶碗
碧草面具
础石面具
水井面具
火灶面具
碧之时尚名人卡
结晶碎片
体力粘糕
肌力粘糕
抵抗粘糕
智力粘糕
精神粘糕
瞬发粘糕
简约椅子
校园椅子
校园椅子
幻彩椅子
大自然椅子
鬼祟椅子
黄色格子椅子
蓝色格子椅子
红色格子椅子
草丛椅子
对决椅子
怪兽椅子
条纹椅子
菱纹椅子
圆点椅子
紫色椅子
浅绿椅子
米色椅子
黄色椅子
蓝色椅子
粉红椅子
阿柏蛇的牙
穿山鼠的爪子
皮宝宝的毛
六尾的毛
蚊香蝌蚪的黏液
喇叭芽的藤蔓
小拳石的碎片
瓦斯弹的气体
小卡比兽的牙
尾立的毛
咕咕的羽毛
圆丝蛛的丝
长尾怪手的毛
蜻蜻蜓的刺
天蝎的牙
熔岩虫的熔岩
小山猪的毛
土狼犬的牙
莲叶童子的叶片
橡实果的枝条
朝北鼻的碎片
电萤虫的汁液
甜甜萤的汁液
龙虾小兵的壳
丑丑鱼的鳞片
夜巡灵的碎片
铃铛响的碎片
搬运小匠的汗
虫宝包的叶片
鸭宝宝的羽毛
烛光灵的煤灰
功夫鼬的爪子
秃鹰丫头的羽毛
小碎钻的宝石
小木灵的枝条
强颚鸡母虫的丝
萌虻的粉
心鳞宝的鳞片
古月鸟的羽绒
莫鲁贝可的种子
斯魔茶的粉
净空粘糕
洛拍棒
晶耀护符

View file

@ -2230,64 +2230,64 @@
招式學習器169
招式學習器170
招式學習器171
招式學習器172
招式學習器173
招式學習器174
招式學習器175
招式學習器176
招式學習器177
招式學習器178
招式學習器179
招式學習器180
招式學習器181
招式學習器182
招式學習器183
招式學習器184
招式學習器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
@ -2398,4 +2398,85 @@
橘色盤子
紅色盤子
白色盤子
黃色盤子
黃色盤子
妖精之羽
蜜汁蘋果
凡作茶碗
傑作茶碗
碧草面具
礎石面具
水井面具
火灶面具
碧之時尚名人卡
結晶碎片
體力糬
肌力糬
抵抗糬
智力糬
精神糬
瞬發糬
簡約椅子
校園椅子
校園椅子
幻彩椅子
大自然椅子
鬼祟椅子
黃色格子椅子
藍色格子椅子
紅色格子椅子
草叢椅子
對決椅子
怪獸椅子
條紋椅子
菱紋椅子
圓點椅子
紫色椅子
淺綠椅子
米色椅子
黃色椅子
藍色椅子
粉紅椅子
阿柏蛇的牙
穿山鼠的爪子
皮寶寶的毛
六尾的毛
蚊香蝌蚪的黏液
喇叭芽的藤蔓
小拳石的碎片
瓦斯彈的氣體
小卡比獸的牙
尾立的毛
咕咕的羽毛
圓絲蛛的絲
長尾怪手的毛
蜻蜻蜓的刺
天蠍的牙
熔岩蟲的熔岩
小山豬的毛
土狼犬的牙
蓮葉童子的葉片
橡實果的枝條
朝北鼻的碎片
電螢蟲的汁液
甜甜螢的汁液
龍蝦小兵的殼
醜醜魚的鱗片
夜巡靈的碎片
鈴鐺響的碎片
搬運小匠的汗
蟲寶包的葉片
鴨寶寶的羽毛
燭光靈的煤灰
功夫鼬的爪子
禿鷹丫頭的羽毛
小碎鑽的寶石
小木靈的枝條
強顎雞母蟲的絲
萌虻的粉
心鱗寶的鱗片
古月鳥的羽絨
莫魯貝可的種子
斯魔茶的粉
淨空糬
洛拍棒
晶耀護符

View file

@ -129,4 +129,43 @@ Zone Null
Zone Null
Orangen-Akademie
Trauben-Akademie
Trauben-Akademie
Kitakami-Straße
Midoriya
Apfelhügel
Gefährten-Platz
Pfad des Tanzes
Kitakami-Kulturzentrum
Oniyama
Schreckenshöhle
Oniyama
Rachen des Oni
Oniyama
Oniyama
Kristallsee
Gipfel des Oniyama
Kristallsee
Gipfel des Oniyama
Wisterienfelder
Mündungsufer
Hornschlucht
Paradiesebene
Wildnis von Kitakami
Immerwald
Wildnis von Kitakami
Infernopass
Oniyama
Kaltwasserkarst

View file

@ -129,4 +129,43 @@ Area Zero
Area Zero
Naranja Academy
Uva Academy
Uva Academy
Kitakami Road
Mossui Town
Apple Hills
Loyalty Plaza
Revelers Road
Kitakami Hall
Oni Mountain
Dreaded Den
Oni Mountain
Onis Maw
Oni Mountain
Oni Mountain
Crystal Pool
Oni Mountain Summit
Crystal Pool
Oni Mountain Summit
Wistful Fields
Mossfell Confluence
Fellhorn Gorge
Paradise Barrens
Kitakami Wilds
Timeless Woods
Kitakami Wilds
Infernal Pass
Oni Mountain
Chilling Waterhead

View file

@ -129,4 +129,43 @@ Laboratorio Cero
Área Cero
Academia Naranja
Academia Uva
Academia Uva
Carretera de Noroteo
Villa Versui
Colina Manzanar
Parque de los compatrones
Senda Jarana
centro cultural de Noroteo
Monte Ogro
Gruta del Pavor
Monte Ogro
Fauces del Ogro
Monte Ogro
Monte Ogro
Lago Cristalino
cima del Monte Ogro
Lago Cristalino
cima del Monte Ogro
Pradera Glicina
Ribera Confluencia
Desfiladero del Cuerno
Elíseo Baldío
Campos Prístinos de Noroteo
Soto Sempiterno
Campos Prístinos de Noroteo
Paso del Averno
Monte Ogro
Cueva Aguafría

View file

@ -129,4 +129,43 @@ Zone Zéro
Zone Zéro
Académie Orange
Académie Raisin
Académie Raisin
Route de Septentria
Jaderaude
Coteau Pommes
Parc Adorami
Sentier de la Liesse
Septemplion
Mont Strueux
Antre Interdit
Mont Strueux
Gueule du Monstre
Mont Strueux
Mont Strueux
Lac Cristallin
Sommet du Mont Strueux
Lac Cristallin
Sommet du Mont Strueux
Plaine des Glycines
Rives du Confluent
Gorge de la Corne
Lande de la Quiétude
Terres Vierges de Septentria
Forêt Ternelle
Terres Vierges de Septentria
Val Infernal
Mont Strueux
Grotte Douche Froide

View file

@ -129,4 +129,43 @@ Area Zero
Area Zero
Accademia Arancia
Accademia Uva
Accademia Uva
Via Nordivia
Verdegiada
Colle Mele
Parco dei beniamici
Sentiero del Tripudio
Centro Nordivia
Monte Orco
Antro del Terrore
Monte Orco
Bocca dellOrco
Monte Orco
Monte Orco
Lago Cristallìo
Vetta del Monte Orco
Lago Cristallìo
Vetta del Monte Orco
Piana dei Glicini
Piana Duefiumi
Canyon del Corno
Landa Paradisiaca
Terre Primeve di Nordivia
Foresta Perpetua
Terre Primeve di Nordivia
Pendio Infernale
Monte Orco
Grotta Doccia Fredda

View file

@ -129,4 +129,43 @@
エリアゼロ
オレンジアカデミー
グレープアカデミー
グレープアカデミー
キタカミ街道
スイリョクタウン
アップルヒルズ
ともっこプラザ
舞出山道
キタカミセンター
鬼が山
恐れ穴
鬼が山
鬼歯空洞
鬼が山
鬼が山
てらす池
鬼が山 山頂
てらす池
鬼が山 山頂
フジが原
落合川原
鬼角峡谷
楽土の荒地
キタカミ原生地域
とこしえの森
キタカミ原生地域
地獄谷
鬼が山
ひやみず洞

View file

@ -129,4 +129,43 @@
에리어 제로
오렌지 아카데미
그레이프 아카데미
그레이프 아카데미
북신 가도
스이록마을
애플 힐스
세벗 플라자
신명 산길
북신센터
도깨비산
공포의 굴
도깨비산
도깨비이빨 공동
도깨비산
도깨비산
태라수호
도깨비산 정상
태라수호
도깨비산 정상
등꽃 들판
북신 합류지
도깨비뿔 협곡
낙원의 황무지
북신 원생지
영겁의 숲
북신 원생지
지옥골
도깨비산
찬물 동굴

View file

@ -129,4 +129,43 @@
第零区
橘子学院
葡萄学院
葡萄学院
北上街道
翠绿镇
苹果之丘
宝伴广场
起舞山道
北上中心
鬼山
恐洞
鬼山
鬼齿洞
鬼山
鬼山
晶光池
鬼山山顶
晶光池
鬼山山顶
藤花原
汇流河滩
鬼角峡谷
乐土荒地
北上原生区
永久森林
北上原生区
地狱谷
鬼山
冷水洞

View file

@ -129,4 +129,43 @@
第零區
橘子學院
葡萄學院
葡萄學院
北上街道
翠綠鎮
蘋果之丘
寶伴廣場
起舞山道
北上中心
鬼山
恐洞
鬼山
鬼齒洞
鬼山
鬼山
晶光池
鬼山山頂
晶光池
鬼山山頂
藤花原
匯流河灘
鬼角峽谷
樂土荒地
北上原生區
永久森林
北上原生區
地獄谷
鬼山
冷水洞

View file

@ -77,70 +77,70 @@ Pokémon-Geschäft
Demoversion
Pokéball Plus
Pokémon HOME
[~ 78]
[~ 79]
[~ 80]
[~ 81]
[~ 82]
[~ 83]
[~ 84]
[~ 85]
[~ 86]
[~ 87]
[~ 88]
[~ 89]
[~ 90]
[~ 91]
[~ 92]
[~ 93]
[~ 94]
[~ 95]
[~ 96]
[~ 97]
[~ 98]
[~ 99]
[~ 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]

View file

@ -2,4 +2,5 @@
Ferne Person
Hortleiterinnen
Schatzsucher
Dame der Heißen Quellen
Dame der Heißen Quellen
Jim

View file

@ -2,4 +2,5 @@
someone far away
a Nursery worker
a treasure hunter
an old hot-springs visitor
an old hot-springs visitor
Jacq

View file

@ -2,4 +2,5 @@
Persona lejana
Cuidados Pokémon
Buscatesoros
Anciana del Balneario
Anciana del Balneario
Cinio

View file

@ -2,4 +2,5 @@
Personne lointaine
Responsable de la Garderie
Chercheur de Trésors
Dame des Eaux Thermales
Dame des Eaux Thermales
Jacq

View file

@ -2,4 +2,5 @@
da una persona lontana
allOstello Pokémon
da un Cercatesori
dalla vecchina delle terme
dalla vecchina delle terme
(regalo di Zim)

View file

@ -2,4 +2,5 @@
遠くにいる人
あずかり屋さん
トレジャーハンター
おんせんばあさん
おんせんばあさん
ジニア

View file

@ -2,4 +2,5 @@
멀리 있는 사람
맡기미집
트레져헌터
온천 할머니
온천 할머니
지니어

View file

@ -2,4 +2,5 @@
远处的人
寄放屋
寻宝猎人
温泉婆婆
温泉婆婆
吉尼亚

View file

@ -2,4 +2,5 @@
遠方的人
寄放屋
尋寶獵人
溫泉婆婆
溫泉婆婆
吉尼亞

View file

@ -296,4 +296,12 @@ Synchronauftritt
Giftbelag
Schweifrüstung
Bodenschmaus
Myzelienkraft
Myzelienkraft
Gastlichkeit
Geistiges Auge
Erinnerungskraft
Erinnerungskraft
Erinnerungskraft
Erinnerungskraft
Giftkette
Süßer Nektar

View file

@ -1123,4 +1123,13 @@ Wasser
Gleit
Gefecht
Flammen
Fluten
Fluten
Türkisgrüne
Imitations
Simple
Blutmond
Brunnen
Ofen
Fundament
Kostbarkeits
Edle

View file

@ -898,4 +898,8 @@ Hitzeturbo
Finsterturbo
Toxiturbo
Raufturbo
Zauberturbo
Zauberturbo
Blutmond
Quirlschuss
Sirupbombe
Rankenkeule

View file

@ -1008,4 +1008,11 @@ Eisenkrieger
Koraidon
Miraidon
Windewoge
Eisenblatt
Eisenblatt
Sirapfel
Mortcha
Fatalitcha
Boninu
Benesaru
Beatori
Ogerpon

View file

@ -296,4 +296,12 @@ Costar
Toxic Debris
Armor Tail
Earth Eater
Mycelium Might
Mycelium Might
Hospitality
Minds Eye
Embody Aspect
Embody Aspect
Embody Aspect
Embody Aspect
Toxic Chain
Supersweet Syrup

View file

@ -1123,4 +1123,13 @@ Aquatic
Glide
Combat
Blaze
Aqua
Aqua
Teal
Counterfeit
Unremarkable
Bloodmoon
Wellspring
Hearthflame
Cornerstone
Artisan
Masterpiece

View file

@ -898,4 +898,8 @@ Blazing Torque
Wicked Torque
Noxious Torque
Combat Torque
Magical Torque
Magical Torque
Blood Moon
Matcha Gotcha
Syrup Bomb
Ivy Cudgel

View file

@ -1008,4 +1008,11 @@ Iron Valiant
Koraidon
Miraidon
Walking Wake
Iron Leaves
Iron Leaves
Dipplin
Poltchageist
Sinistcha
Okidogi
Munkidori
Fezandipiti
Ogerpon

View file

@ -296,4 +296,12 @@ Unísono
Capa Tóxica
Cola Armadura
Geofagia
Poder Fúngico
Poder Fúngico
Hospitalidad
Ojo Mental
Evocarrecuerdos
Evocarrecuerdos
Evocarrecuerdos
Evocarrecuerdos
Cadena Tóxica
Néctar Dulce

View file

@ -1123,4 +1123,13 @@ Flote
Planeo
Combatiente
Ardiente
Acuática
Acuática
Turquesa
Fraudulenta
Mediocre
Luna Carmesí
Fuente
Horno
Cimiento
Opulenta
Exquisita

View file

@ -898,4 +898,8 @@ Pirochoque
Ominochoque
Ponzochoque
Pugnachoque
Feerichoque
Feerichoque
Luna Roja
Cañón Batidor
Bomba Caramelo
Garrote Liana

View file

@ -1008,4 +1008,11 @@ Ferropaladín
Koraidon
Miraidon
Ondulagua
Ferroverdor
Ferroverdor
Dipplin
Poltchageist
Sinistcha
Okidogi
Munkidori
Fezandipiti
Ogerpon

View file

@ -296,4 +296,12 @@ Collab
Dépôt Toxique
Armure Caudale
Absorbe-Terre
Force Fongique
Force Fongique
Aux Petits Soins
Œil Révélateur
Force Mémorielle
Force Mémorielle
Force Mémorielle
Force Mémorielle
Chaîne Toxique
Nectar Mielleux

View file

@ -1123,4 +1123,13 @@ Aquatique
Aérien
Combative
Flamboyante
Aquatique
Aquatique
Turquoise
Imitation
Médiocre
Lune Vermeille
Puits
Fourneau
Pierre
Onéreuse
Exceptionnelle

Some files were not shown because too many files have changed in this diff Show more