using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenVIII
{
namespace Kernel
{
///
/// Battle Commands
///
///
public sealed class BattleCommand : ICommand
{
#region Fields
///
/// Section Count
///
public const int Count = 39;
///
/// Section ID
///
public const int ID = 0;
///
/// Alternative Section ID
///
private const int AltLimitID = 18;
#endregion Fields
#region Constructors
public BattleCommand(FF8String name, FF8String description, byte ability, Battle.Dat.UnkFlag flags, Target target, byte unknown, int battleID)
=> (Name, Description, Ability, Flags, Target, Unknown, BattleID) = (name, description, ability, flags, target, unknown, battleID);
#endregion Constructors
#region Properties
///
/// Ability data
///
public byte Ability { get; }
///
/// Battle command ID
///
public int BattleID { get; }
///
/// ability description
///
public FF8String Description { get; }
///
/// Unknown Flags
///
public Battle.Dat.UnkFlag Flags { get; }
///
/// Name of Command
///
public FF8String Name { get; }
///
/// Target
///
public Target Target { get; }
///
/// Unknown / Unused
///
public byte Unknown { get; }
#endregion Properties
#region Methods
public static IReadOnlyList Read(BinaryReader br) =>
Enumerable.Range(0, Count).Select(i => CreateInstance(br, i)).ToList();
public override string ToString() => Name;
private static BattleCommand CreateInstance(BinaryReader br, int i)
{
FF8StringReference description;
FF8StringReference name;
switch (i)
{
//No Mercy
case 17:
name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 0); //Fire Cross
description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 1);
break;
//Sorcery
case 18:
name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 2); //Ice Strike
description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 3);
break;
//Limit #1
case 20:
name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 4); //Desperado
description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 5);
break;
//Limit #2
case 21:
name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 6); //Blood Pain
description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 7);
break;
//Limit #3
case 22:
name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 8); //Massive Anchor
description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 9);
break;
default:
name = Memory.Strings.Read(Strings.FileID.Kernel, ID, i * 2);
description = Memory.Strings.Read(Strings.FileID.Kernel, ID, i * 2 + 1);
break;
}
br.BaseStream.Seek(4, SeekOrigin.Current);
var ability = br.ReadByte();
var flags = (Battle.Dat.UnkFlag)br.ReadByte();
var target = (Target)br.ReadByte();
var unknown = br.ReadByte();
return new BattleCommand(name, description, ability, flags, target, unknown, i);
}
#endregion Methods
}
}
}