using System.Diagnostics.CodeAnalysis; using System.IO; using System.Runtime.InteropServices; namespace OpenVIII.Battle.Dat { /// /// Section 7: Information & stats /// /// /// /// [StructLayout(LayoutKind.Sequential, Pack = 1, Size = ByteSize)] [SuppressMessage("ReSharper", "UnusedMember.Global")] public struct Information { #region Fields public const int ByteSize = 380; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)] private readonly byte[] _name; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly byte[] HP; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly byte[] STR; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly byte[] VIT; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly byte[] MAG; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly byte[] SPR; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly byte[] SPD; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly byte[] EVA; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public readonly Abilities[] AbilitiesLow; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public readonly Abilities[] AbilitiesMed; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public readonly Abilities[] AbilitiesHigh; /// /// Level med stats start /// public readonly byte MedLevelStart; /// /// Level high stats start /// public readonly byte HighLevelStart; public readonly UnkFlag UnkFlag; public readonly Flag1 BitSwitch; /// /// Cards per ifrit this is more of a drop, mod and rare mod /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public readonly Cards.ID[] Card; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public readonly byte[] Devour; public readonly Flag2 BitSwitch2; public readonly UnkFlag UnkFlag2; public readonly ushort ExpExtra; public readonly ushort Exp; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Magic[] DrawLow; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Magic[] DrawMed; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Magic[] DrawHigh; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Saves.Item[] MugLow; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Saves.Item[] MugMed; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Saves.Item[] MugHigh; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Saves.Item[] DropLow; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Saves.Item[] DropMed; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public readonly Saves.Item[] DropHigh; public readonly byte MugRate; public readonly byte DropRate; public readonly byte Padding; public readonly byte AP; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public readonly byte[] Unk3; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public readonly byte[] Resistance; public readonly byte DeathResistanceMental; public readonly byte PoisonResistanceMental; public readonly byte PetrifyResistanceMental; public readonly byte DarknessResistanceMental; public readonly byte SilenceResistanceMental; public readonly byte BerserkResistanceMental; public readonly byte ZombieResistanceMental; public readonly byte SleepResistanceMental; public readonly byte HasteResistanceMental; public readonly byte SlowResistanceMental; public readonly byte StopResistanceMental; public readonly byte RegenResistanceMental; public readonly byte ReflectResistanceMental; public readonly byte DoomResistanceMental; public readonly byte SlowPetrifyResistanceMental; public readonly byte FloatResistanceMental; public readonly byte ConfuseResistanceMental; public readonly byte DrainResistanceMental; public readonly byte ExpulsionResistanceMental; public readonly byte PercentResistanceMental; #endregion Fields #region Properties public FF8String Name => _name; #endregion Properties #region Methods public Information CreateInstance(BinaryReader br, long byteOffset) { br.BaseStream.Seek(byteOffset, SeekOrigin.Begin); return Extended.ByteArrayToStructure(br.ReadBytes(ByteSize)); } public override string ToString() => Name; #endregion Methods } }