using System.Collections.Generic; using System.IO; using System.Linq; namespace OpenVIII { namespace Kernel { /// /// Enemy Attacks Data /// /// public class EnemyAttacksData { #region Fields public const int Count = 384; public const int ID = 3; #endregion Fields #region Constructors public EnemyAttacksData(BinaryReader br, int i, IReadOnlyList battleCommands) { EnemyAttackID = i; Name = i == 2 ? battleCommands[1].Name : Memory.Strings.Read(Strings.FileID.Kernel, ID, i); br.BaseStream.Seek(2, SeekOrigin.Current); MagicID = (MagicID)br.ReadUInt16(); //0x02 2 bytes Magic ID CameraChange = br.ReadByte(); //0x04 1 byte Camera Change Unknown0 = br.ReadByte(); //0x05 1 byte Unknown Maybe something similar to Target. AttackType = (AttackType)br.ReadByte();//0x06 1 byte Attack type AttackPower = br.ReadByte();//0x07 1 byte Attack power AttackFlags = (AttackFlags)(br.ReadByte());//0x08 1 byte Attack flags Unknown1 = br.ReadByte();//0x09 1 byte Unknown Element = (Element)br.ReadByte();//0x0A 1 byte Element Unknown2 = br.ReadByte();//0x0B 1 byte Unknown StatusAttack = br.ReadByte();//0x0C 1 byte Status attack enabler AttackParameter = br.ReadByte();//0x0D 1 byte Attack Parameter //Statuses = new BitArray(br.ReadBytes(6)); Statuses0 = (PersistentStatuses)br.ReadUInt16();//0x0E 2 bytes status_0; //statuses 0-7 Statuses1 = (BattleOnlyStatuses)br.ReadUInt32();//0x10 4 bytes status_1; //statuses 8-31 } #endregion Constructors #region Properties /// /// 0x08 1 byte Attack flags /// public AttackFlags AttackFlags { get; } /// /// 0x0D 1 byte Attack Parameter, HIT? /// public byte AttackParameter { get; } /// /// 0x07 1 byte Attack power /// public byte AttackPower { get; } /// /// 0x06 1 byte Attack type /// public AttackType AttackType { get; } /// /// 0x04 1 byte Camera Change /// public byte CameraChange { get; } /// /// 0x0A 1 byte Element /// public Element Element { get; } /// /// Enemy Attack ID /// public int EnemyAttackID { get; } /// /// 0x02 2 bytes Magic ID /// public MagicID MagicID { get; } /// /// 0x00 2 bytes Offset to attack name /// public FF8String Name { get; } /// /// 0x0C 1 byte Status attack enabler /// public byte StatusAttack { get; } /// /// 0x0E 2 bytes status_0; //statuses 0-7 /// public PersistentStatuses Statuses0 { get; } /// /// 0x10 4 bytes status_1; //statuses 8-31 /// public BattleOnlyStatuses Statuses1 { get; } /// /// 0x05 1 byte Unknown /// public byte Unknown0 { get; } /// /// 0x09 1 byte Unknown /// public byte Unknown1 { get; } /// /// 0x0B 1 byte Unknown /// public byte Unknown2 { get; } #endregion Properties #region Methods public static IReadOnlyList Read(BinaryReader br, IReadOnlyList battleCommands) => Enumerable.Range(0, Count).Select(x => CreateInstance(br, x, battleCommands)).ToList(); public override string ToString() => Name; private static EnemyAttacksData CreateInstance(BinaryReader br, int i, IReadOnlyList battleCommands) => new EnemyAttacksData(br, i, battleCommands); #endregion Methods } } }