using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenVIII
{
namespace Kernel
{
///
/// Weapon Data
///
///
public sealed class WeaponsData
{
#region Fields
public const int Count = 33;
public const int ID = 4;
private static byte _counter;
private static Characters _lastCharacter = Characters.Blank;
#endregion Fields
#region Constructors
private WeaponsData(BinaryReader br, int stringID = 0)
{
if (br == null) throw new ArgumentNullException(nameof(br));
if (stringID < 0) throw new ArgumentOutOfRangeException(nameof(stringID));
WeaponID = checked((byte)stringID);
Name = Memory.Strings.Read(Strings.FileID.Kernel, ID, stringID);
br.BaseStream.Seek(2, SeekOrigin.Current);
Renzokuken = (RenzokukenFinisher)br.ReadByte(); //0x0002 1 byte Renzokuken finishers
Unknown0 = br.ReadByte(); //0x0003 1 byte Unknown
Character = (Characters)br.ReadByte();//0x0004 1 byte Character ID
if (_lastCharacter != Character)
{
AltID = _counter = 0;
_lastCharacter = Character;
}
else AltID = ++_counter;
AttackType = (AttackType)br.ReadByte();//0x0005 1 bytes Attack Type
AttackPower = br.ReadByte();//0x0006 1 byte Attack Power
Hit = br.ReadByte();//0x0007 1 byte Attack Parameter
STR = br.ReadByte();//0x0008 1 byte STR Bonus
Tier = br.ReadByte();//0x0009 1 byte Weapon Tier
Critical = br.ReadByte();//0x000A 1 byte Critical Bonus
Melee = br.ReadByte() != 0;//0x000B 1 byte Melee Weapon?
}
#endregion Constructors
#region Properties
public byte AltID { get; }
///
///0x0006 1 byte Attack Power
///
public byte AttackPower { get; }
///
///0x0005 1 bytes Attack Type
///
public AttackType AttackType { get; }
///
///0x0004 1 byte Character ID
///
public Characters Character { get; }
///
///0x000A 1 byte Critical Bonus
///
public byte Critical { get; }
///
///0x0007 1 byte Attack Parameter
///
public byte Hit { get; }
///
///0x000B 1 byte Melee Weapon?
///
public bool Melee { get; }
///
///0x0000 2 bytes Offset to weapon name
///
public FF8String Name { get; }
///
///0x0002 1 byte Renzokuken finishers
///
public RenzokukenFinisher Renzokuken { get; }
///
///0x0008 1 byte STR Bonus
///
public byte STR { get; }
///
///0x0009 1 byte Weapon Tier
///
public byte Tier { get; }
///
///0x0003 1 byte Unknown
///
public byte Unknown0 { get; }
public byte WeaponID { get; }
#endregion Properties
#region Methods
public static IReadOnlyList Read(BinaryReader br)
=> Enumerable.Range(0, Count).Select(x => new WeaponsData(br, x)).ToList();
public override string ToString() => Name;
#endregion Methods
}
}
}