PKHeX/PKHeX.Core/Items/ItemStorage7SM.cs
Kurt d47bb1d297
Update .NET Runtime to .NET 8.0 (#4082)
With the new version of Visual Studio bringing C# 12, we can revise our logic for better readability as well as use new methods/APIs introduced in the .NET 8.0 BCL.
2023-12-03 20:13:20 -08:00

221 lines
7.7 KiB
C#

using System;
namespace PKHeX.Core;
public sealed class ItemStorage7SM : IItemStorage
{
public static readonly ItemStorage7SM Instance = new();
internal static ReadOnlySpan<ushort> Pouch_Regular_SM =>
[
001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 014, 015, 016,
055, 056, 057, 058, 059, 060, 061, 062, 063, 064,
068, 069,
070, 071, 072, 073, 074, 075, 076, 077, 078, 079,
080, 081, 082, 083, 084, 085, 086, 087, 088, 089,
090, 091, 092, 093, 094, 099,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
110, 111, 112, 116, 117, 118, 119,
135, 136, 137,
213, 214, 215, 217, 218, 219,
220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249,
250, 251, 252, 253, 254, 255, 256, 257, 258, 259,
260, 261, 262, 263, 264, 265, 266, 267, 268, 269,
270, 271, 272, 273, 274, 275, 276, 277, 278, 279,
280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
290, 291, 292, 293, 294, 295, 296, 297, 298, 299,
300, 301, 302, 303, 304, 305, 306, 307, 308, 309,
310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
320, 321, 322, 323, 324, 325, 326, 327,
492, 493, 494, 495, 496, 497, 498,
499, 534, 535, 537, 538, 539,
540, 541, 542, 543, 544, 545, 546, 547, 548, 549,
550, 551, 552, 553, 554, 555, 556, 557, 558, 559,
560, 561, 562, 563, 564,
571, 572, 573, 576, 577, // Poké Toy
580, 581, 582, 583,
584, 585, 586, 587, 588, 589, 590,
639,
640, 644, 646, 647, 648, 649,
650, 656, 657, 658, 659,
660, 661, 662, 663, 664, 665, 666, 667, 668, 669,
670, 671, 672, 673, 674, 675, 676, 677, 678, 679,
680, 681, 682, 683, 684, 685,
699,
704,
710, 711, 715,
752, 753, 754, 755, 756, 757, 758, 759,
760, 761, 762, 763, 764, 767, 768, 769,
770,
795, 796, 844, 846, 849,
851, 853, 854, 855, 856, 879,
880, 881, 882,
883, 884, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920,
];
private static ReadOnlySpan<ushort> Pouch_Key_SM =>
[
216,
465, 466, 628, 629, 631, 632, 638,
705, 706, 765, 773, 797,
841, 842, 843, 845, 847, 850, 857, 858, 860,
];
internal static ReadOnlySpan<ushort> Pouch_TMHM_SM =>
[
328, 329, 330, 331, 332, 333, 334, 335, 336, 337,
338, 339, 340, 341, 342, 343, 344, 345, 346, 347,
348, 349, 350, 351, 352, 353, 354, 355, 356, 357,
358, 359, 360, 361, 362, 363, 364, 365, 366, 367,
368, 369, 370, 371, 372, 373, 374, 375, 376, 377,
378, 379, 380, 381, 382, 383, 384, 385, 386, 387,
388, 389, 390, 391, 392, 393, 394, 395, 396, 397,
398, 399, 400, 401, 402, 403, 404, 405, 406, 407,
408, 409, 410, 411, 412, 413, 414, 415, 416, 417,
418, 419, // 01-92
618, 619, 620, // 93-95
690, 691, 692, 693, 694, // 96-100
];
internal static ReadOnlySpan<ushort> Pouch_Medicine_SM =>
[
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 65, 66, 67, 134,
504, 565, 566, 567, 568, 569, 570, 591, 645, 708, 709,
852,
];
internal static ReadOnlySpan<ushort> Pouch_Berries_SM =>
[
149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 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,
686, 687, 688,
];
private static ReadOnlySpan<ushort> Pouch_ZCrystal_SM =>
[
807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835,
];
private static ReadOnlySpan<ushort> Pouch_ZCrystalHeld_SM =>
[
// SM
776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 798, 799, 800, 801, 802, 803, 804, 805, 806, 836,
];
internal static ReadOnlySpan<ushort> Unreleased =>
[
005, // Safari Ball
016, // Cherish Ball
064, // Fluffy Tail
065, // Blue Flute
066, // Yellow Flute
067, // Red Flute
068, // Black Flute
069, // White Flute
070, // Shoal Salt
071, // Shoal Shell
103, // Old Amber
111, // Odd Keystone
164, // Razz Berry
166, // Nanab Berry
167, // Wepear Berry
175, // Cornn Berry
176, // Magost Berry
177, // Rabuta Berry
178, // Nomel Berry
179, // Spelon Berry
180, // Pamtre Berry
181, // Watmel Berry
182, // Durin Berry
183, // Belue Berry
//208, // Enigma Berry
//209, // Micle Berry
//210, // Custap Berry
//211, // Jaboca Berry
//212, // Rowap Berry
215, // Macho Brace
260, // Red Scarf
261, // Blue Scarf
262, // Pink Scarf
263, // Green Scarf
264, // Yellow Scarf
499, // Sport Ball
548, // Fire Gem
549, // Water Gem
550, // Electric Gem
551, // Grass Gem
552, // Ice Gem
553, // Fighting Gem
554, // Poison Gem
555, // Ground Gem
556, // Flying Gem
557, // Psychic Gem
558, // Bug Gem
559, // Rock Gem
560, // Ghost Gem
561, // Dragon Gem
562, // Dark Gem
563, // Steel Gem
576, // Dream Ball
584, // Relic Copper
585, // Relic Silver
587, // Relic Vase
588, // Relic Band
589, // Relic Statue
590, // Relic Crown
699, // Discount Coupon
715, // Fairy Gem
];
public static ushort[] GetAllHeld() => [..Pouch_Regular_SM, ..Pouch_Berries_SM, ..Pouch_Medicine_SM, ..Pouch_ZCrystalHeld_SM];
public static bool GetCrystalHeld(ushort itemKey, out ushort itemHeld)
{
var index = Pouch_ZCrystal_SM.IndexOf(itemKey);
if (index < 0)
{
itemHeld = 0;
return false;
}
itemHeld = Pouch_ZCrystalHeld_SM[index];
return true;
}
public static bool GetCrystalKey(ushort itemHeld, out ushort itemKey)
{
var index = Pouch_ZCrystalHeld_SM.IndexOf(itemHeld);
if (index < 0)
{
itemKey = 0;
return false;
}
itemKey = Pouch_ZCrystal_SM[index];
return true;
}
public bool IsLegal(InventoryType type, int itemIndex, int itemCount)
{
if (type is InventoryType.KeyItems or InventoryType.ZCrystals)
return true;
var items = GetItems(type);
if (items.BinarySearch((ushort)itemIndex) < 0)
return false;
return Unreleased.BinarySearch((ushort)itemIndex) < 0;
}
public ReadOnlySpan<ushort> GetItems(InventoryType type) => type switch
{
InventoryType.Medicine => Pouch_Medicine_SM,
InventoryType.Items => Pouch_Regular_SM,
InventoryType.TMHMs => Pouch_TMHM_SM,
InventoryType.Berries => Pouch_Berries_SM,
InventoryType.KeyItems => Pouch_Key_SM,
InventoryType.ZCrystals => Pouch_ZCrystal_SM,
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
};
}