PartyAbilities.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace OpenVIII
  6. {
  7. namespace Kernel
  8. {
  9. /// <summary>
  10. /// Party Abilities Data
  11. /// </summary>
  12. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Party-abilities"/>
  13. public sealed class PartyAbilities : IEquippableAbility
  14. {
  15. #region Fields
  16. /// <summary>
  17. /// Section Count
  18. /// </summary>
  19. public const int Count = 5;
  20. /// <summary>
  21. /// Section ID
  22. /// </summary>
  23. public const int ID = 15;
  24. #endregion Fields
  25. #region Constructors
  26. private PartyAbilities(BinaryReader br, int i)
  27. {
  28. //0x0000 2 bytes Offset
  29. Name = Memory.Strings.Read(Strings.FileID.Kernel, ID, i * 2);
  30. //0x0002 2 bytes Offset
  31. Description = Memory.Strings.Read(Strings.FileID.Kernel, ID, i * 2 + 1);
  32. br.BaseStream.Seek(4, SeekOrigin.Current);
  33. //0x0004 1 byte
  34. AP = br.ReadByte();
  35. //0x0005 1 byte //TODO reverse flags. probably a unique value for each ability
  36. Flags = new BitArray(br.ReadBytes(1)).Cast<bool>().ToList();
  37. //0x0006 2 byte
  38. Unknown0 = br.ReadBytes(2);
  39. }
  40. #endregion Constructors
  41. #region Properties
  42. public byte AP { get; }
  43. public FF8String Description { get; }
  44. /// <summary>
  45. /// Unknown flags
  46. /// </summary>
  47. public IReadOnlyList<bool> Flags { get; }
  48. public Icons.ID Icon { get; } = Icons.ID.Ability_Party;
  49. public FF8String Name { get; }
  50. public byte Palette { get; } = Ability.DefaultPalette;
  51. /// <summary>
  52. /// Unknown bytes
  53. /// </summary>
  54. public byte[] Unknown0 { get; }
  55. #endregion Properties
  56. #region Methods
  57. public static Dictionary<Abilities, PartyAbilities> Read(BinaryReader br)
  58. => Enumerable.Range(0, Count)
  59. .ToDictionary(i => (Abilities)(i + (int)Abilities.Alert), i => CreateInstance(br, i));
  60. private static PartyAbilities CreateInstance(BinaryReader br, int i)
  61. => new PartyAbilities(br, i);
  62. #endregion Methods
  63. }
  64. }
  65. }