Devour.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System.Collections.Generic;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. namespace OpenVIII
  7. {
  8. namespace Kernel
  9. {
  10. /// <summary>
  11. /// Devour Data
  12. /// </summary>
  13. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Devour"/>
  14. [StructLayout(LayoutKind.Explicit, Size = 12, Pack = 0)]
  15. public class Devour
  16. {
  17. #region Fields
  18. public const int Count = 16;
  19. public const int ID = 28;
  20. public const int Size = 12;
  21. #endregion Fields
  22. #region Constructors
  23. public FF8String Description => Memory.Strings.ReadByOffset(Strings.FileID.Kernel, ID, _descriptionOffset);
  24. public override string ToString() => Description;
  25. public Devour(BinaryReader br, int i)
  26. {
  27. //Description = Memory.Strings.Read(Strings.FileID.KERNEL, ID, i);
  28. //br.BaseStream.Seek(2, SeekOrigin.Current);
  29. if (!br.Read(out _descriptionOffset)) return;
  30. Debug.WriteLine(Description); //TODO fix description
  31. //0x0000 2 bytes Offset to devour description
  32. if (!br.Read(out _damageOrHeal)) return;
  33. //0x0002 1 byte Damage or heal HP and Status
  34. //0x1E - Cure
  35. //0x1F - Damage
  36. _quantity = (Quantity)br.ReadByte();
  37. //0x0003 1 byte HP Heal / DMG Quantity Flag
  38. //0x00 - 0 %
  39. //0x01 - 6.25 %
  40. //0x02 - 12.50 %
  41. //0x04 - 25 %
  42. //0x08 - 50 %
  43. //0x10 - 100 %
  44. Statuses1 = (BattleOnlyStatuses)br.ReadUInt32();
  45. //0x0004 4 bytes status_1; //statuses 8-39
  46. Statuses0 = (PersistentStatuses)br.ReadUInt16();
  47. //0x0008 2 bytes status_0; //statuses 0-7
  48. StatFlags = (StatFlags)br.ReadByte();
  49. //0x000A 1 byte Raised Stat Flag
  50. //0x00 - None
  51. //0x01 - STR
  52. //0x02 - VIT
  53. //0x04 - MAG
  54. //0x08 - SPR
  55. //0x10 - SPD
  56. HP = br.ReadByte();
  57. //0x000B 1 byte Raised Stat HP Quantity
  58. }
  59. #endregion Constructors
  60. #region Properties
  61. [field: FieldOffset(0x3)]
  62. private readonly Quantity _quantity;
  63. [field: FieldOffset(0x2)]
  64. private readonly byte _damageOrHeal;
  65. public float Amount
  66. {
  67. get
  68. {
  69. var a = 0f;
  70. if (_quantity.HasFlag(Quantity._0625f)) a += .0625f;
  71. if (_quantity.HasFlag(Quantity._1250f)) a += .1250f;
  72. if (_quantity.HasFlag(Quantity._1f)) a += 1f;
  73. if (_quantity.HasFlag(Quantity._25f)) a += .25f;
  74. if (_quantity.HasFlag(Quantity._50f)) a += .50f;
  75. return a;
  76. }
  77. }
  78. [field: FieldOffset(0x0)]
  79. private readonly ushort _descriptionOffset;
  80. /// <summary>
  81. /// True for heal, False for damage
  82. /// </summary>
  83. public bool DamageOrHeal
  84. {
  85. get
  86. {
  87. switch (_damageOrHeal)
  88. {
  89. case 0x1E:
  90. return true;
  91. case 0x1F:
  92. return false;
  93. default:
  94. throw new InvalidDataException($"{nameof(Devour)}::{nameof(DamageOrHeal)} Invalid value: 0x{_damageOrHeal:X2} to be 0x1E or 0x1F");
  95. }
  96. }
  97. }
  98. [field: FieldOffset(0xB)]
  99. public byte HP { get; }
  100. [field: FieldOffset(0xA)]
  101. public StatFlags StatFlags { get; }
  102. [field: FieldOffset(0x8)]
  103. public PersistentStatuses Statuses0 { get; }
  104. [field: FieldOffset(0x4)]
  105. public BattleOnlyStatuses Statuses1 { get; }
  106. #endregion Properties
  107. #region Methods
  108. public static IReadOnlyList<Devour> Read(BinaryReader br)
  109. => Enumerable.Range(0, Count).Select(x => CreateInstance(br, x)).ToList();
  110. //public override string ToString() => Description;
  111. private static Devour CreateInstance(BinaryReader br, int i) => new Devour(br, i);
  112. #endregion Methods
  113. }
  114. }
  115. }