using Microsoft.Xna.Framework; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Runtime.InteropServices; namespace OpenVIII.Battle.Dat { /// /// Section 1: Skeleton /// /// [StructLayout(LayoutKind.Explicit, Pack = 1)] [SuppressMessage("ReSharper", "UnusedMember.Global")] public class Skeleton { #region Fields [field: FieldOffset(16)] public readonly IReadOnlyList Bones; /// /// Number of bones /// [field: FieldOffset(0)] public readonly ushort CBones; [field: FieldOffset(2)] public readonly ushort Scale; [field: FieldOffset(4)] public readonly ushort Unk2; [field: FieldOffset(6)] public readonly ushort Unk3; [field: FieldOffset(8)] public readonly ushort Unk4; [field: FieldOffset(10)] public readonly ushort Unk5; [field: FieldOffset(12)] public readonly ushort Unk6; [field: FieldOffset(14)] public readonly ushort Unk7; #endregion Fields #region Constructors private Skeleton(BinaryReader br) { if (br.BaseStream.Position + 16 >= br.BaseStream.Length) throw new InvalidDataException($"{nameof(Skeleton)} Stream to short to read"); CBones = br.ReadUInt16(); Scale = br.ReadUInt16(); Unk2 = br.ReadUInt16(); Unk3 = br.ReadUInt16(); Unk4 = br.ReadUInt16(); Unk5 = br.ReadUInt16(); Unk6 = br.ReadUInt16(); Unk7 = br.ReadUInt16(); Bones = Bone.CreateInstances(br, CBones); } #endregion Constructors #region Properties public Vector3 GetScale => new Vector3(Scale / DatFile.ScaleHelper * 12, Scale / DatFile.ScaleHelper * 12, Scale / DatFile.ScaleHelper * 12); #endregion Properties #region Methods public static Skeleton CreateInstance(BinaryReader br, long startOffset) { br.BaseStream.Seek(startOffset, SeekOrigin.Begin); return new Skeleton(br); } public static Skeleton CreateInstance(BinaryReader br) => new Skeleton(br); #endregion Methods } }