using System.Collections.Generic; using System.IO; using System.Linq; namespace OpenVIII { namespace Kernel { /// /// Blue magic (Quistis limit break) /// /// public sealed class BlueMagicQuistisLimitBreak { #region Fields /// /// Section Count /// public const int Count = 16; /// /// Section ID /// public const int ID = 19; #endregion Fields #region Constructors private BlueMagicQuistisLimitBreak(BinaryReader br, BlueMagic i) { BlueMagic = i; //0x0000 2 bytes Offset to name Name = Memory.Strings.Read(Strings.FileID.Kernel, ID, (byte)i * 2); //0x0002 2 bytes Offset to description Description = Memory.Strings.Read(Strings.FileID.Kernel, ID, (byte)i * 2 + 1); br.BaseStream.Seek(4, SeekOrigin.Current); //0x0004 2 bytes Magic ID MagicID = (MagicID)br.ReadUInt16(); //0x0006 1 byte Unknown Unknown0 = br.ReadByte(); //0x0007 1 byte Attack Type AttackType = (AttackType)br.ReadByte(); //0x0008 1 byte Unknown Unknown1 = br.ReadByte(); //0x0009 1 byte Target // noticed we were missing a target // this byte made sense when tested. Target = (Target)br.ReadByte(); //0x000A 1 byte Attack Flags AttackFlags = (AttackFlags)br.ReadByte(); //0x000B 1 byte Unknown Unknown2 = br.ReadByte(); //0x000C 1 byte Element Element = (Element)br.ReadByte(); //0x000D 1 byte Status Attack StatusAttack = br.ReadByte(); //0x000E 1 byte Critical Bonus Critical = br.ReadByte(); //0x000F 1 byte Unknown Unknown3 = br.ReadByte(); //Related Crisis Level Parameters CrisisLevels = GetCrisisLevels(br, (byte)i); } #endregion Constructors #region Properties /// /// Attack flags /// public AttackFlags AttackFlags { get; } /// /// Attack type /// public AttackType AttackType { get; } /// /// Blue Magic /// public BlueMagic BlueMagic { get; } /// /// Crisis Level Parameters /// public IReadOnlyList CrisisLevels { get; } /// /// Critical Bonus /// public byte Critical { get; } /// /// Description of ability /// public FF8String Description { get; } /// /// Elements used /// public Element Element { get; } /// /// Magic ID /// public MagicID MagicID { get; } /// /// Name of ability /// public FF8String Name { get; } /// /// Status attack /// public byte StatusAttack { get; } /// /// Target /// public Target Target { get; } /// /// Unknown byte /// public byte Unknown0 { get; } /// /// Unknown byte /// public byte Unknown1 { get; } /// /// Unknown byte /// public byte Unknown2 { get; } /// /// Unknown byte /// public byte Unknown3 { get; } #endregion Properties #region Methods public static IReadOnlyDictionary Read(BinaryReader br) => Enumerable.Range(0, Count).ToDictionary(i => (BlueMagic)i, i => CreateInstance(br, (BlueMagic)i)); public override string ToString() => Name; private static BlueMagicQuistisLimitBreak CreateInstance(BinaryReader br, BlueMagic i) => new BlueMagicQuistisLimitBreak(br, i); private static IReadOnlyList GetCrisisLevels(BinaryReader br, byte i) { var current = br.BaseStream.Position; try { br.BaseStream.Seek( Memory.Strings[Strings.FileID.Kernel].GetFiles() .SubPositions[BlueMagicQuistisLimitBreakParameters.ID] + BlueMagicQuistisLimitBreakParameters.Size * i, SeekOrigin.Begin); return BlueMagicQuistisLimitBreakParameters.Read(br); } finally { br.BaseStream.Seek(current, SeekOrigin.Begin); } } #endregion Methods } } }