RinoaLimitBreaksPart2.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. namespace OpenVIII
  5. {
  6. namespace Kernel
  7. {
  8. /// <summary>
  9. /// Rinoa limit breaks (part 2)
  10. /// </summary>
  11. /// <see cref="https://github.com/alexfilth/doomtrain/wiki/Rinoa-limit-breaks-%28part-2%29"/>
  12. public sealed class RinoaLimitBreaksPart2
  13. {
  14. #region Fields
  15. public const int Count = 5;
  16. public const int ID = 25;
  17. public const int Size = 20;
  18. #endregion Fields
  19. #region Constructors
  20. private RinoaLimitBreaksPart2(BinaryReader br, int i)
  21. {
  22. RinoaLimit2ID = i;
  23. switch (i)
  24. {
  25. case 0:
  26. Angelo = Angelo.Cannon;
  27. break;
  28. case 1:
  29. Angelo = Angelo.Strike;
  30. break;
  31. case 2:
  32. Angelo = Angelo.Invincible_Moon;
  33. break;
  34. case 3:
  35. Angelo = Angelo.Wishing_Star;
  36. break;
  37. case 4:
  38. Angelo = Angelo.Angel_Wing;
  39. break;
  40. default:
  41. Angelo = Angelo.None;
  42. break;
  43. }
  44. var offset = br.ReadUInt16();
  45. Name = new FF8StringReference(Memory.Strings[Strings.FileID.Kernel].GetArchive(), Memory.Strings[Strings.FileID.Kernel].GetFileNames()[0],
  46. Memory.Strings[Strings.FileID.Kernel].GetFiles().SubPositions[(int)((Strings.Kernel)Memory.Strings[Strings.FileID.Kernel]).StringLocations[ID].Item1] + offset, settings: (FF8StringReference.Settings.Namedic | FF8StringReference.Settings.MultiCharByte));
  47. //0x0000 2 bytes Offset to name
  48. //br.BaseStream.Seek(2, SeekOrigin.Current);
  49. MagicID = (MagicID)br.ReadUInt16();
  50. //0x0002 2 bytes Magic ID
  51. AttackType = (AttackType)br.ReadByte();
  52. //0x0004 1 byte Attack type
  53. AttackPower = br.ReadByte();
  54. //0x0005 1 byte Attack power
  55. AttackFlags = (AttackFlags)br.ReadByte();
  56. //0x0006 1 byte Attack flags
  57. Unknown0 = br.ReadByte();
  58. //0x0007 1 byte Unknown
  59. Target = (Target)br.ReadByte();
  60. //0x0008 1 byte Target info
  61. Unknown1 = br.ReadByte();
  62. //0x0009 1 byte Unknown
  63. HitCount = br.ReadByte();
  64. //0x000A 1 byte Hit Count
  65. Element = (Element)br.ReadByte();
  66. //0x000B 1 byte Element Attack
  67. ElementPercent = br.ReadByte();
  68. //0x000C 1 byte Element Attack %
  69. StatusAttack = br.ReadByte();
  70. //0x000D 1 byte Status Attack Enabler
  71. Statuses0 = (PersistentStatuses)br.ReadUInt16();
  72. //0x000E 2 bytes status_0; //statuses 0-7
  73. Statuses1 = (BattleOnlyStatuses)br.ReadUInt32();
  74. //0x0010 4 bytes status_1; //statuses 8-39
  75. }
  76. #endregion Constructors
  77. #region Properties
  78. public Angelo Angelo { get; }
  79. public AttackFlags AttackFlags { get; }
  80. public byte AttackPower { get; }
  81. public AttackType AttackType { get; }
  82. public Element Element { get; }
  83. public byte ElementPercent { get; }
  84. public byte HitCount { get; }
  85. public MagicID MagicID { get; }
  86. public FF8String Name { get; }
  87. public int RinoaLimit2ID { get; }
  88. public byte StatusAttack { get; }
  89. public PersistentStatuses Statuses0 { get; }
  90. public BattleOnlyStatuses Statuses1 { get; }
  91. public Target Target { get; }
  92. public byte Unknown0 { get; }
  93. public byte Unknown1 { get; }
  94. #endregion Properties
  95. #region Methods
  96. public static IReadOnlyList<RinoaLimitBreaksPart2> Read(BinaryReader br)
  97. => Enumerable.Range(0, Count).Select(x => CreateInstance(br, x)).ToList().AsReadOnly();
  98. public override string ToString() => Name;
  99. private static RinoaLimitBreaksPart2 CreateInstance(BinaryReader br, int i) => new RinoaLimitBreaksPart2(br, i);
  100. #endregion Methods
  101. }
  102. }
  103. }