BattleCommand.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. namespace OpenVIII
  5. {
  6. namespace Kernel
  7. {
  8. /// <summary>
  9. /// Battle Commands
  10. /// </summary>
  11. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Battle-commands"/>
  12. public sealed class BattleCommand : ICommand
  13. {
  14. #region Fields
  15. /// <summary>
  16. /// Section Count
  17. /// </summary>
  18. public const int Count = 39;
  19. /// <summary>
  20. /// Section ID
  21. /// </summary>
  22. public const int ID = 0;
  23. /// <summary>
  24. /// Alternative Section ID
  25. /// </summary>
  26. private const int AltLimitID = 18;
  27. #endregion Fields
  28. #region Constructors
  29. public BattleCommand(FF8String name, FF8String description, byte ability, Battle.Dat.UnkFlag flags, Target target, byte unknown, int battleID)
  30. => (Name, Description, Ability, Flags, Target, Unknown, BattleID) = (name, description, ability, flags, target, unknown, battleID);
  31. #endregion Constructors
  32. #region Properties
  33. /// <summary>
  34. /// Ability data
  35. /// </summary>
  36. public byte Ability { get; }
  37. /// <summary>
  38. /// Battle command ID
  39. /// </summary>
  40. public int BattleID { get; }
  41. /// <summary>
  42. /// ability description
  43. /// </summary>
  44. public FF8String Description { get; }
  45. /// <summary>
  46. /// Unknown Flags
  47. /// </summary>
  48. public Battle.Dat.UnkFlag Flags { get; }
  49. /// <summary>
  50. /// Name of Command
  51. /// </summary>
  52. public FF8String Name { get; }
  53. /// <summary>
  54. /// Target
  55. /// </summary>
  56. public Target Target { get; }
  57. /// <summary>
  58. /// Unknown / Unused
  59. /// </summary>
  60. public byte Unknown { get; }
  61. #endregion Properties
  62. #region Methods
  63. public static IReadOnlyList<BattleCommand> Read(BinaryReader br) =>
  64. Enumerable.Range(0, Count).Select(i => CreateInstance(br, i)).ToList();
  65. public override string ToString() => Name;
  66. private static BattleCommand CreateInstance(BinaryReader br, int i)
  67. {
  68. FF8StringReference description;
  69. FF8StringReference name;
  70. switch (i)
  71. {
  72. //No Mercy
  73. case 17:
  74. name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 0); //Fire Cross
  75. description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 1);
  76. break;
  77. //Sorcery
  78. case 18:
  79. name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 2); //Ice Strike
  80. description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 3);
  81. break;
  82. //Limit #1
  83. case 20:
  84. name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 4); //Desperado
  85. description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 5);
  86. break;
  87. //Limit #2
  88. case 21:
  89. name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 6); //Blood Pain
  90. description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 7);
  91. break;
  92. //Limit #3
  93. case 22:
  94. name = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 8); //Massive Anchor
  95. description = Memory.Strings.Read(Strings.FileID.Kernel, AltLimitID, 9);
  96. break;
  97. default:
  98. name = Memory.Strings.Read(Strings.FileID.Kernel, ID, i * 2);
  99. description = Memory.Strings.Read(Strings.FileID.Kernel, ID, i * 2 + 1);
  100. break;
  101. }
  102. br.BaseStream.Seek(4, SeekOrigin.Current);
  103. var ability = br.ReadByte();
  104. var flags = (Battle.Dat.UnkFlag)br.ReadByte();
  105. var target = (Target)br.ReadByte();
  106. var unknown = br.ReadByte();
  107. return new BattleCommand(name, description, ability, flags, target, unknown, i);
  108. }
  109. #endregion Methods
  110. }
  111. }
  112. }