BlueMagicQuistisLimitBreak.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. namespace OpenVIII
  5. {
  6. namespace Kernel
  7. {
  8. /// <summary>
  9. /// Blue magic (Quistis limit break)
  10. /// </summary>
  11. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Blue-magic-%28Quistis-limit-break%29"/>
  12. public sealed class BlueMagicQuistisLimitBreak
  13. {
  14. #region Fields
  15. /// <summary>
  16. /// Section Count
  17. /// </summary>
  18. public const int Count = 16;
  19. /// <summary>
  20. /// Section ID
  21. /// </summary>
  22. public const int ID = 19;
  23. #endregion Fields
  24. #region Constructors
  25. private BlueMagicQuistisLimitBreak(BinaryReader br, BlueMagic i)
  26. {
  27. BlueMagic = i;
  28. //0x0000 2 bytes Offset to name
  29. Name = Memory.Strings.Read(Strings.FileID.Kernel, ID, (byte)i * 2);
  30. //0x0002 2 bytes Offset to description
  31. Description = Memory.Strings.Read(Strings.FileID.Kernel, ID, (byte)i * 2 + 1);
  32. br.BaseStream.Seek(4, SeekOrigin.Current);
  33. //0x0004 2 bytes Magic ID
  34. MagicID = (MagicID)br.ReadUInt16();
  35. //0x0006 1 byte Unknown
  36. Unknown0 = br.ReadByte();
  37. //0x0007 1 byte Attack Type
  38. AttackType = (AttackType)br.ReadByte();
  39. //0x0008 1 byte Unknown
  40. Unknown1 = br.ReadByte();
  41. //0x0009 1 byte Target
  42. // noticed we were missing a target
  43. // this byte made sense when tested.
  44. Target = (Target)br.ReadByte();
  45. //0x000A 1 byte Attack Flags
  46. AttackFlags = (AttackFlags)br.ReadByte();
  47. //0x000B 1 byte Unknown
  48. Unknown2 = br.ReadByte();
  49. //0x000C 1 byte Element
  50. Element = (Element)br.ReadByte();
  51. //0x000D 1 byte Status Attack
  52. StatusAttack = br.ReadByte();
  53. //0x000E 1 byte Critical Bonus
  54. Critical = br.ReadByte();
  55. //0x000F 1 byte Unknown
  56. Unknown3 = br.ReadByte();
  57. //Related Crisis Level Parameters
  58. CrisisLevels = GetCrisisLevels(br, (byte)i);
  59. }
  60. #endregion Constructors
  61. #region Properties
  62. /// <summary>
  63. /// Attack flags
  64. /// </summary>
  65. public AttackFlags AttackFlags { get; }
  66. /// <summary>
  67. /// Attack type
  68. /// </summary>
  69. public AttackType AttackType { get; }
  70. /// <summary>
  71. /// Blue Magic
  72. /// </summary>
  73. public BlueMagic BlueMagic { get; }
  74. /// <summary>
  75. /// Crisis Level Parameters
  76. /// </summary>
  77. public IReadOnlyList<BlueMagicQuistisLimitBreakParameters> CrisisLevels { get; }
  78. /// <summary>
  79. /// Critical Bonus
  80. /// </summary>
  81. public byte Critical { get; }
  82. /// <summary>
  83. /// Description of ability
  84. /// </summary>
  85. public FF8String Description { get; }
  86. /// <summary>
  87. /// Elements used
  88. /// </summary>
  89. public Element Element { get; }
  90. /// <summary>
  91. /// Magic ID
  92. /// </summary>
  93. public MagicID MagicID { get; }
  94. /// <summary>
  95. /// Name of ability
  96. /// </summary>
  97. public FF8String Name { get; }
  98. /// <summary>
  99. /// Status attack
  100. /// </summary>
  101. public byte StatusAttack { get; }
  102. /// <summary>
  103. /// Target
  104. /// </summary>
  105. public Target Target { get; }
  106. /// <summary>
  107. /// Unknown byte
  108. /// </summary>
  109. public byte Unknown0 { get; }
  110. /// <summary>
  111. /// Unknown byte
  112. /// </summary>
  113. public byte Unknown1 { get; }
  114. /// <summary>
  115. /// Unknown byte
  116. /// </summary>
  117. public byte Unknown2 { get; }
  118. /// <summary>
  119. /// Unknown byte
  120. /// </summary>
  121. public byte Unknown3 { get; }
  122. #endregion Properties
  123. #region Methods
  124. public static IReadOnlyDictionary<BlueMagic, BlueMagicQuistisLimitBreak> Read(BinaryReader br)
  125. => Enumerable.Range(0, Count).ToDictionary(i => (BlueMagic)i, i => CreateInstance(br, (BlueMagic)i));
  126. public override string ToString() => Name;
  127. private static BlueMagicQuistisLimitBreak CreateInstance(BinaryReader br, BlueMagic i)
  128. => new BlueMagicQuistisLimitBreak(br, i);
  129. private static IReadOnlyList<BlueMagicQuistisLimitBreakParameters> GetCrisisLevels(BinaryReader br, byte i)
  130. {
  131. var current = br.BaseStream.Position;
  132. try
  133. {
  134. br.BaseStream.Seek(
  135. Memory.Strings[Strings.FileID.Kernel].GetFiles()
  136. .SubPositions[BlueMagicQuistisLimitBreakParameters.ID] +
  137. BlueMagicQuistisLimitBreakParameters.Size * i, SeekOrigin.Begin);
  138. return BlueMagicQuistisLimitBreakParameters.Read(br);
  139. }
  140. finally
  141. {
  142. br.BaseStream.Seek(current, SeekOrigin.Begin);
  143. }
  144. }
  145. #endregion Methods
  146. }
  147. }
  148. }