CommandAbilityData.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace OpenVIII
  6. {
  7. namespace Kernel
  8. {
  9. /// <summary>
  10. /// Command Abilities Data
  11. /// </summary>
  12. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Command-ability-data"/>
  13. public class CommandAbilityData
  14. {
  15. public const int Count = 12;
  16. public const int ID = 10;
  17. public Abilities Ability { get; }
  18. public MagicID MagicID { get; }
  19. public byte[] Unknown0 { get; }
  20. public AttackType AttackType { get; }
  21. public byte AttackPower { get; }
  22. public AttackFlags AttackFlags { get; }
  23. public byte HitCount { get; }
  24. public Element Element { get; }
  25. public byte StatusAttack { get; }
  26. public PersistentStatuses Statuses0 { get; }
  27. public BattleOnlyStatuses Statuses1 { get; }
  28. public static explicit operator CommandAbility(CommandAbilityData commandAbilityData)
  29. {
  30. CommandAbility value = null;
  31. if (Memory.KernelBin?.CommandAbilities?.TryGetValue(commandAbilityData.Ability, out value) ?? false)
  32. { }
  33. return value;
  34. }
  35. /// <summary>
  36. /// order is different so conversation is required.
  37. /// </summary>
  38. private static IEnumerable<Abilities> ConvertCommandAbilityToAbility { get; } = new []
  39. {
  40. Abilities.Recover,
  41. Abilities.Revive,
  42. Abilities.Treatment,
  43. Abilities.MadRush,
  44. Abilities.Doom,
  45. Abilities.Absorb,
  46. Abilities.LvDown,
  47. Abilities.LvUp,
  48. Abilities.Kamikaze,
  49. Abilities.Devour,
  50. Abilities.Card,
  51. Abilities.Defend
  52. };
  53. public static IReadOnlyDictionary<Abilities, CommandAbilityData> Read(BinaryReader br) =>
  54. ConvertCommandAbilityToAbility.ToDictionary(x => x, x => CreateInstance(br, x));
  55. private static CommandAbilityData CreateInstance(BinaryReader br, Abilities i)
  56. => new CommandAbilityData(br,i);
  57. private CommandAbilityData(BinaryReader br, Abilities i)
  58. {
  59. Ability = i;
  60. MagicID = (MagicID)br.ReadUInt16();
  61. //0x0000 2 bytes Magic ID
  62. Unknown0 = br.ReadBytes(2);
  63. //0x0002 2 bytes Unknown
  64. AttackType = (AttackType)br.ReadByte();
  65. //0x0004 1 byte Attack type
  66. AttackPower = br.ReadByte();
  67. //0x0005 1 byte Attack power
  68. AttackFlags = (AttackFlags)br.ReadByte();
  69. //0x0006 1 byte Attack flags
  70. HitCount = br.ReadByte();
  71. //0x0007 1 byte Hit Count
  72. Element = (Element)br.ReadByte();
  73. //0x0008 1 byte Element
  74. StatusAttack = br.ReadByte();
  75. //0x0009 1 byte Status attack enabler
  76. Statuses0 = (PersistentStatuses)br.ReadUInt16();
  77. Statuses1 = (BattleOnlyStatuses)br.ReadUInt32();
  78. //0x000A 6 bytes Statuses
  79. }
  80. }
  81. }
  82. }