PKHeX/PKHeX.Core/Items/ItemStorage3RS.cs
Kurt fa9a809751
Encapsulate item pouch arrays/etc for finer control (#3860)
* Extract/encapsulate inventory legal arrays to interface+class

Hiding them behind methods allows these to be left as ReadOnlySpan<ushort> and thus never allocate on the heap.
Also refactors out some logic for checking if an item is legal.

End result feels more maintainable and is less bloaty (no more passing in a nullable func)

Batch editing
* Add HasType filter

```
=HasType=11
.HeldItem=Meadow Plate
```

slaps a meadow plate on any pkm with grass type
Use `=PersonalType1=11` for only primary grass types; only-secondary-type grass will not match it.
2023-04-16 12:58:07 -07:00

71 lines
3.3 KiB
C#

using System;
namespace PKHeX.Core;
public sealed class ItemStorage3RS : IItemStorage
{
public static readonly ItemStorage3RS Instance = new();
internal static ReadOnlySpan<ushort> Pouch_Items_RS => new ushort[]
{
13, 14, 15, 16, 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, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 93, 94, 95, 96, 97, 98, 103, 104, 106, 107, 108, 109, 110, 111, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 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, 254, 255, 256, 257, 258,
};
private static ReadOnlySpan<ushort> Pouch_Key_RS => new ushort[]
{
259, 260, 261, 262, 263, 264, 265, 266, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
};
private const int COUNT_TM = 50;
private const int COUNT_HM = 8;
internal static ReadOnlySpan<ushort> Pouch_TMHM_RS => new ushort[]
{
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, 328,
329, 330, 331, 332, 333, 334, 335, 336, 337, 338,
// HMs
339, 340, 341, 342, 343, 344, 345, 346,
};
internal static ReadOnlySpan<ushort> Pouch_TM_RS => Pouch_TMHM_RS[..COUNT_TM];
public static bool IsTMHM(ushort itemID) => (uint)(itemID - 289) < COUNT_TM + COUNT_HM;
public static bool IsTM(ushort itemID) => (uint)(itemID - 289) < COUNT_TM;
public static bool IsHM(ushort itemID) => (uint)(itemID - 339) < COUNT_HM;
internal static ReadOnlySpan<ushort> Pouch_Berries_RS => new ushort[]
{
133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
};
internal static ReadOnlySpan<ushort> Pouch_Ball_RS => new ushort[]
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
};
internal static ReadOnlySpan<ushort> Unreleased => new ushort[] { 005 }; // Safari Ball
public static ushort[] GetAllHeld()
{
return ArrayUtil.ConcatAll(Pouch_Items_RS, Pouch_Ball_RS, Pouch_Berries_RS, Pouch_TMHM_RS[..^COUNT_HM]);
}
private static readonly ushort[] PCItems = ArrayUtil.ConcatAll(Pouch_Items_RS, Pouch_Key_RS, Pouch_Ball_RS, Pouch_TMHM_RS, Pouch_Berries_RS);
public bool IsLegal(InventoryType type, int itemIndex, int itemCount) => true;
public ReadOnlySpan<ushort> GetItems(InventoryType type) => type switch
{
InventoryType.Items => Pouch_Items_RS,
InventoryType.KeyItems => Pouch_Key_RS,
InventoryType.Balls => Pouch_Ball_RS,
InventoryType.TMHMs => Pouch_TMHM_RS,
InventoryType.Berries => Pouch_Berries_RS,
InventoryType.PCItems => PCItems,
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
};
}