Kernel_bin.Character_abilities.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. /// Characters Abilities Data
  11. /// </summary>
  12. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Character-abilities"/>
  13. public sealed class CharacterAbilities : EquippableAbility
  14. {
  15. #region Fields
  16. /// <summary>
  17. /// Section Count
  18. /// </summary>
  19. public const int Count = 20;
  20. /// <summary>
  21. /// Section ID
  22. /// </summary>
  23. public const int ID = 14;
  24. /// <summary>
  25. /// Icon for this type.
  26. /// </summary>
  27. public new const Icons.ID Icon = Icons.ID.Ability_Character2;
  28. #endregion Fields
  29. #region Constructors
  30. private CharacterAbilities
  31. (FF8String name, FF8String description, byte ap, CharacterAbilityFlags flags) :
  32. base(name, description, ap, Icon) => Flags = flags;
  33. #endregion Constructors
  34. #region Properties
  35. /// <summary>
  36. /// Ability Flags that are enabled by this
  37. /// </summary>
  38. public CharacterAbilityFlags Flags { get; }
  39. #endregion Properties
  40. #region Methods
  41. public static Dictionary<Abilities, CharacterAbilities> Read(BinaryReader br)
  42. => Enumerable.Range(0, Count)
  43. .ToDictionary(i => (Abilities)(i + (int)Abilities.Mug), i => CreateInstance(br, i));
  44. private static CharacterAbilities CreateInstance(BinaryReader br, int i)
  45. {
  46. //0x0000 2 bytes
  47. FF8StringReference name = Memory.Strings.Read(Strings.FileID.KERNEL, ID, i * 2);
  48. //0x0002 2 bytes
  49. FF8StringReference description = Memory.Strings.Read(Strings.FileID.KERNEL, ID, i * 2 + 1);
  50. br.BaseStream.Seek(4, SeekOrigin.Current);
  51. //0x0004 1 byte
  52. byte ap = br.ReadByte();
  53. //0x0005 3 byte
  54. byte[] tmp = br.ReadBytes(3);
  55. CharacterAbilityFlags flags =
  56. (CharacterAbilityFlags)(tmp[2] << (16) | tmp[1] << (8) | tmp[0]);
  57. return new CharacterAbilities(name, description, ap, flags);
  58. }
  59. #endregion Methods
  60. }
  61. #endregion Classes
  62. }
  63. }