EnemyAttacksData.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. namespace OpenVIII
  5. {
  6. namespace Kernel
  7. {
  8. /// <summary>
  9. /// Enemy Attacks Data
  10. /// </summary>
  11. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Enemy-attacks"/>
  12. public class EnemyAttacksData
  13. {
  14. #region Fields
  15. public const int Count = 384;
  16. public const int ID = 3;
  17. #endregion Fields
  18. #region Constructors
  19. public EnemyAttacksData(BinaryReader br, int i, IReadOnlyList<BattleCommand> battleCommands)
  20. {
  21. EnemyAttackID = i;
  22. Name = i == 2 ? battleCommands[1].Name : Memory.Strings.Read(Strings.FileID.Kernel, ID, i);
  23. br.BaseStream.Seek(2, SeekOrigin.Current);
  24. MagicID = (MagicID)br.ReadUInt16(); //0x02 2 bytes Magic ID
  25. CameraChange = br.ReadByte(); //0x04 1 byte Camera Change
  26. Unknown0 = br.ReadByte(); //0x05 1 byte Unknown Maybe something similar to Target.
  27. AttackType = (AttackType)br.ReadByte();//0x06 1 byte Attack type
  28. AttackPower = br.ReadByte();//0x07 1 byte Attack power
  29. AttackFlags = (AttackFlags)(br.ReadByte());//0x08 1 byte Attack flags
  30. Unknown1 = br.ReadByte();//0x09 1 byte Unknown
  31. Element = (Element)br.ReadByte();//0x0A 1 byte Element
  32. Unknown2 = br.ReadByte();//0x0B 1 byte Unknown
  33. StatusAttack = br.ReadByte();//0x0C 1 byte Status attack enabler
  34. AttackParameter = br.ReadByte();//0x0D 1 byte Attack Parameter
  35. //Statuses = new BitArray(br.ReadBytes(6));
  36. Statuses0 = (PersistentStatuses)br.ReadUInt16();//0x0E 2 bytes status_0; //statuses 0-7
  37. Statuses1 = (BattleOnlyStatuses)br.ReadUInt32();//0x10 4 bytes status_1; //statuses 8-31
  38. }
  39. #endregion Constructors
  40. #region Properties
  41. /// <summary>
  42. /// 0x08 1 byte Attack flags
  43. /// </summary>
  44. public AttackFlags AttackFlags { get; }
  45. /// <summary>
  46. /// 0x0D 1 byte Attack Parameter, HIT?
  47. /// </summary>
  48. public byte AttackParameter { get; }
  49. /// <summary>
  50. /// 0x07 1 byte Attack power
  51. /// </summary>
  52. public byte AttackPower { get; }
  53. /// <summary>
  54. /// 0x06 1 byte Attack type
  55. /// </summary>
  56. public AttackType AttackType { get; }
  57. /// <summary>
  58. /// 0x04 1 byte Camera Change
  59. /// </summary>
  60. public byte CameraChange { get; }
  61. /// <summary>
  62. /// 0x0A 1 byte Element
  63. /// </summary>
  64. public Element Element { get; }
  65. /// <summary>
  66. /// Enemy Attack ID
  67. /// </summary>
  68. public int EnemyAttackID { get; }
  69. /// <summary>
  70. /// 0x02 2 bytes Magic ID
  71. /// </summary>
  72. public MagicID MagicID { get; }
  73. /// <summary>
  74. /// 0x00 2 bytes Offset to attack name
  75. /// </summary>
  76. public FF8String Name { get; }
  77. /// <summary>
  78. /// 0x0C 1 byte Status attack enabler
  79. /// </summary>
  80. public byte StatusAttack { get; }
  81. /// <summary>
  82. /// 0x0E 2 bytes status_0; //statuses 0-7
  83. /// </summary>
  84. public PersistentStatuses Statuses0 { get; }
  85. /// <summary>
  86. /// 0x10 4 bytes status_1; //statuses 8-31
  87. /// </summary>
  88. public BattleOnlyStatuses Statuses1 { get; }
  89. /// <summary>
  90. /// 0x05 1 byte Unknown
  91. /// </summary>
  92. public byte Unknown0 { get; }
  93. /// <summary>
  94. /// 0x09 1 byte Unknown
  95. /// </summary>
  96. public byte Unknown1 { get; }
  97. /// <summary>
  98. /// 0x0B 1 byte Unknown
  99. /// </summary>
  100. public byte Unknown2 { get; }
  101. #endregion Properties
  102. #region Methods
  103. public static IReadOnlyList<EnemyAttacksData> Read(BinaryReader br, IReadOnlyList<BattleCommand> battleCommands)
  104. => Enumerable.Range(0, Count).Select(x => CreateInstance(br, x, battleCommands)).ToList();
  105. public override string ToString() => Name;
  106. private static EnemyAttacksData CreateInstance(BinaryReader br, int i,
  107. IReadOnlyList<BattleCommand> battleCommands)
  108. => new EnemyAttacksData(br, i, battleCommands);
  109. #endregion Methods
  110. }
  111. }
  112. }