WeaponsData.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. /// Weapon Data
  11. /// </summary>
  12. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Weapons"/>
  13. public sealed class WeaponsData
  14. {
  15. #region Fields
  16. public const int Count = 33;
  17. public const int ID = 4;
  18. private static byte _counter;
  19. private static Characters _lastCharacter = Characters.Blank;
  20. #endregion Fields
  21. #region Constructors
  22. private WeaponsData(BinaryReader br, int stringID = 0)
  23. {
  24. if (br == null) throw new ArgumentNullException(nameof(br));
  25. if (stringID < 0) throw new ArgumentOutOfRangeException(nameof(stringID));
  26. WeaponID = checked((byte)stringID);
  27. Name = Memory.Strings.Read(Strings.FileID.Kernel, ID, stringID);
  28. br.BaseStream.Seek(2, SeekOrigin.Current);
  29. Renzokuken = (RenzokukenFinisher)br.ReadByte(); //0x0002 1 byte Renzokuken finishers
  30. Unknown0 = br.ReadByte(); //0x0003 1 byte Unknown
  31. Character = (Characters)br.ReadByte();//0x0004 1 byte Character ID
  32. if (_lastCharacter != Character)
  33. {
  34. AltID = _counter = 0;
  35. _lastCharacter = Character;
  36. }
  37. else AltID = ++_counter;
  38. AttackType = (AttackType)br.ReadByte();//0x0005 1 bytes Attack Type
  39. AttackPower = br.ReadByte();//0x0006 1 byte Attack Power
  40. Hit = br.ReadByte();//0x0007 1 byte Attack Parameter
  41. STR = br.ReadByte();//0x0008 1 byte STR Bonus
  42. Tier = br.ReadByte();//0x0009 1 byte Weapon Tier
  43. Critical = br.ReadByte();//0x000A 1 byte Critical Bonus
  44. Melee = br.ReadByte() != 0;//0x000B 1 byte Melee Weapon?
  45. }
  46. #endregion Constructors
  47. #region Properties
  48. public byte AltID { get; }
  49. /// <summary>
  50. ///0x0006 1 byte Attack Power
  51. /// </summary>
  52. public byte AttackPower { get; }
  53. /// <summary>
  54. ///0x0005 1 bytes Attack Type
  55. /// </summary>
  56. public AttackType AttackType { get; }
  57. /// <summary>
  58. ///0x0004 1 byte Character ID
  59. /// </summary>
  60. public Characters Character { get; }
  61. /// <summary>
  62. ///0x000A 1 byte Critical Bonus
  63. /// </summary>
  64. public byte Critical { get; }
  65. /// <summary>
  66. ///0x0007 1 byte Attack Parameter
  67. /// </summary>
  68. public byte Hit { get; }
  69. /// <summary>
  70. ///0x000B 1 byte Melee Weapon?
  71. /// </summary>
  72. public bool Melee { get; }
  73. /// <summary>
  74. ///0x0000 2 bytes Offset to weapon name
  75. /// </summary>
  76. public FF8String Name { get; }
  77. /// <summary>
  78. ///0x0002 1 byte Renzokuken finishers
  79. /// </summary>
  80. public RenzokukenFinisher Renzokuken { get; }
  81. /// <summary>
  82. ///0x0008 1 byte STR Bonus
  83. /// </summary>
  84. public byte STR { get; }
  85. /// <summary>
  86. ///0x0009 1 byte Weapon Tier
  87. /// </summary>
  88. public byte Tier { get; }
  89. /// <summary>
  90. ///0x0003 1 byte Unknown
  91. /// </summary>
  92. public byte Unknown0 { get; }
  93. public byte WeaponID { get; }
  94. #endregion Properties
  95. #region Methods
  96. public static IReadOnlyList<WeaponsData> Read(BinaryReader br)
  97. => Enumerable.Range(0, Count).Select(x => new WeaponsData(br, x)).ToList();
  98. public override string ToString() => Name;
  99. #endregion Methods
  100. }
  101. }
  102. }