using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace OpenVIII { namespace Kernel { /// /// Command Abilities Data /// /// public class CommandAbilityData { public const int Count = 12; public const int ID = 10; public Abilities Ability { get; } public MagicID MagicID { get; } public byte[] Unknown0 { get; } public AttackType AttackType { get; } public byte AttackPower { get; } public AttackFlags AttackFlags { get; } public byte HitCount { get; } public Element Element { get; } public byte StatusAttack { get; } public PersistentStatuses Statuses0 { get; } public BattleOnlyStatuses Statuses1 { get; } public static explicit operator CommandAbility(CommandAbilityData commandAbilityData) { CommandAbility value = null; if (Memory.KernelBin?.CommandAbilities?.TryGetValue(commandAbilityData.Ability, out value) ?? false) { } return value; } /// /// order is different so conversation is required. /// private static IEnumerable ConvertCommandAbilityToAbility { get; } = new [] { Abilities.Recover, Abilities.Revive, Abilities.Treatment, Abilities.MadRush, Abilities.Doom, Abilities.Absorb, Abilities.LvDown, Abilities.LvUp, Abilities.Kamikaze, Abilities.Devour, Abilities.Card, Abilities.Defend }; public static IReadOnlyDictionary Read(BinaryReader br) => ConvertCommandAbilityToAbility.ToDictionary(x => x, x => CreateInstance(br, x)); private static CommandAbilityData CreateInstance(BinaryReader br, Abilities i) => new CommandAbilityData(br,i); private CommandAbilityData(BinaryReader br, Abilities i) { Ability = i; MagicID = (MagicID)br.ReadUInt16(); //0x0000 2 bytes Magic ID Unknown0 = br.ReadBytes(2); //0x0002 2 bytes Unknown AttackType = (AttackType)br.ReadByte(); //0x0004 1 byte Attack type AttackPower = br.ReadByte(); //0x0005 1 byte Attack power AttackFlags = (AttackFlags)br.ReadByte(); //0x0006 1 byte Attack flags HitCount = br.ReadByte(); //0x0007 1 byte Hit Count Element = (Element)br.ReadByte(); //0x0008 1 byte Element StatusAttack = br.ReadByte(); //0x0009 1 byte Status attack enabler Statuses0 = (PersistentStatuses)br.ReadUInt16(); Statuses1 = (BattleOnlyStatuses)br.ReadUInt32(); //0x000A 6 bytes Statuses } } } }