using System; using System.Runtime.InteropServices; using static System.Buffers.Binary.BinaryPrimitives; namespace PKHeX.Core; /// /// Unpacks data from legality binary inputs. /// public static class LearnsetReader { private static readonly Learnset EMPTY = new([], []); /// /// Loads a learnset by reading 16-bit move,level pairs. /// /// Entry data public static Learnset[] GetArray(BinLinkerAccessor16 entries) { var result = new Learnset[entries.Length]; result[0] = EMPTY; // empty entry for (int i = 1; i < result.Length; i++) result[i] = ReadLearnset16(entries[i]); return result; } /// /// Reads a Level up move pool definition from a single move pool definition. /// private static Learnset ReadLearnset16(ReadOnlySpan data) { if (data.Length == 0) return EMPTY; // move[], .. level[] var count = data.Length / 3; var size = count << 1; // 2 bytes per move var moves = MemoryMarshal.Cast(data[..size]).ToArray(); if (!BitConverter.IsLittleEndian) ReverseEndianness(moves, moves); var levels = data.Slice(size, count).ToArray(); return new Learnset(moves, levels); } }