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
}
}
}