BlueMagicQuistisLimitBreakParameters.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. namespace OpenVIII
  6. {
  7. namespace Kernel
  8. {
  9. /// <summary>
  10. /// Blue Magic Parameters - Four per spell for each crisis level. Higher Crisis Levels do more damage and/or have more effects.
  11. /// </summary>
  12. /// <see cref="https://finalfantasy.fandom.com/wiki/Blue_Magic_(Final_Fantasy_VIII)"/>
  13. /// <seealso cref="https://github.com/alexfilth/doomtrain/wiki/Quistis-limit-break-parameters"/>
  14. [StructLayout(LayoutKind.Explicit, Size = 8, Pack = 0)]
  15. public sealed class BlueMagicQuistisLimitBreakParameters
  16. {
  17. #region Fields
  18. /// <summary>
  19. /// <para>Section Count</para>
  20. /// 64 total but I want to add these to the Blue_Magic_Quistis_limit_break in an array
  21. /// </summary>
  22. public const int Count = 4;
  23. /// <summary>
  24. /// Section ID
  25. /// </summary>
  26. public const int ID = 20;
  27. /// <summary>
  28. /// Fixed Size of Data
  29. /// </summary>
  30. public const int Size = 8;
  31. #endregion Fields
  32. #region Properties
  33. [field: FieldOffset(6)]
  34. public byte AttackParam { get; }
  35. [field: FieldOffset(5)]
  36. public byte AttackPower { get; }
  37. [field: FieldOffset(4)]
  38. public PersistentStatuses Statuses0 { get; }
  39. [field: FieldOffset(0)]
  40. public BattleOnlyStatuses Statuses1 { get; }
  41. #endregion Properties
  42. #region Methods
  43. public static IReadOnlyList<BlueMagicQuistisLimitBreakParameters> Read(BinaryReader br)
  44. => Enumerable.Range(0, Count)
  45. .Select(i => CreateInstance(br)).ToList();
  46. private static BlueMagicQuistisLimitBreakParameters CreateInstance(BinaryReader br) => new BlueMagicQuistisLimitBreakParameters(br);
  47. private BlueMagicQuistisLimitBreakParameters(BinaryReader br)
  48. {
  49. Statuses1 = (BattleOnlyStatuses)br.ReadUInt32();
  50. //0x0000 4 bytes Status 1
  51. Statuses0 = (PersistentStatuses)br.ReadUInt16();
  52. //0x0004 2 bytes Status 0
  53. AttackPower = br.ReadByte();
  54. //0x0006 1 bytes Attack Power
  55. AttackParam = br.ReadByte();
  56. //0x0007 1 byte Attack Param
  57. }
  58. #endregion Methods
  59. }
  60. }
  61. }