Kernel_bin.GF_abilities.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. namespace OpenVIII
  5. {
  6. namespace Kernel
  7. {
  8. #region Classes
  9. /// <summary>
  10. /// GF Abilities Data
  11. /// </summary>
  12. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/GF-abilities"/>
  13. public sealed class GFAbilities : EquippableAbility
  14. {
  15. #region Fields
  16. /// <summary>
  17. /// Section Count
  18. /// </summary>
  19. public const int Count = 9;
  20. /// <summary>
  21. /// Icon for this type.
  22. /// </summary>
  23. public new const Icons.ID Icon = Icons.ID.Ability_GF;
  24. /// <summary>
  25. /// Section ID
  26. /// </summary>
  27. public const int ID = 16;
  28. #endregion Fields
  29. #region Constructors
  30. private GFAbilities(FF8String name, FF8String description, byte ap, bool boost, Stat stat, byte value) :
  31. base(name, description, ap, Icon) => (Boost, Stat, Value) = (boost, stat, value);
  32. #endregion Constructors
  33. #region Properties
  34. /// <summary>
  35. /// Boost Enable
  36. /// </summary>
  37. public bool Boost { get; }
  38. /// <summary>
  39. /// Stat to increase
  40. /// </summary>
  41. public Stat Stat { get; }
  42. /// <summary>
  43. /// Increase value
  44. /// </summary>
  45. public byte Value { get; }
  46. #endregion Properties
  47. #region Methods
  48. public static Dictionary<Abilities, GFAbilities> Read(BinaryReader br)
  49. => Enumerable.Range(0, Count)
  50. .ToDictionary(i => (Abilities)(i + (int)Abilities.SumMag10), i => CreateInstance(br, i));
  51. private static GFAbilities CreateInstance(BinaryReader br, int i)
  52. {
  53. //0x0000 2 bytes Offset to name
  54. FF8StringReference name = Memory.Strings.Read(Strings.FileID.KERNEL, ID, i * 2);
  55. //0x0002 2 bytes Offset to description
  56. FF8StringReference description = Memory.Strings.Read(Strings.FileID.KERNEL, ID, i * 2 + 1);
  57. br.BaseStream.Seek(4, SeekOrigin.Current);
  58. //0x0004 1 byte AP needed to learn the ability
  59. byte ap = br.ReadByte();
  60. //0x0005 1 byte
  61. bool boost = br.ReadByte() != 0;
  62. //0x0006 1 byte
  63. Stat stat = (Stat)br.ReadByte();
  64. //0x0007 1 byte
  65. byte value = br.ReadByte();
  66. return new GFAbilities(name, description, ap, boost, stat, value);
  67. }
  68. #endregion Methods
  69. }
  70. #endregion Classes
  71. }
  72. }