2
0

Information.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using System;
  2. using System.IO;
  3. using System.Runtime.InteropServices;
  4. namespace OpenVIII
  5. {
  6. public partial class Debug_battleDat
  7. {
  8. #region Fields
  9. public Information information;
  10. private const int Section7Size = 380;
  11. #endregion Fields
  12. #region Methods
  13. /// <summary>
  14. /// Information
  15. /// </summary>
  16. /// <param name="start"></param>
  17. /// <param name="br"></param>
  18. /// <param name="fileName"></param>
  19. private void ReadSection7(uint start)
  20. {
  21. br.BaseStream.Seek(start, SeekOrigin.Begin);
  22. information = Extended.ByteArrayToStructure<Information>(br.ReadBytes(Section7Size));
  23. }
  24. #endregion Methods
  25. #region Structs
  26. [StructLayout(LayoutKind.Explicit, Pack = 1, Size = 4)]
  27. public struct Abilities
  28. {
  29. [Flags]
  30. public enum KernelFlag : byte
  31. {
  32. None = 0,
  33. unk0 = 0x1,
  34. magic = 0x2,
  35. item = 0x4,
  36. monster = 0x8,
  37. unk1 = 0x10,
  38. unk2 = 0x20,
  39. unk3 = 0x40,
  40. unk4 = 0x80,
  41. }
  42. [FieldOffset(0)]
  43. public KernelFlag kernelId; //0x2 magic, 0x4 item, 0x8 monsterAbility;
  44. [FieldOffset(1)]
  45. public byte animation; // ifrit states one of theses is an animation id.
  46. [FieldOffset(2)]
  47. public ushort abilityId;
  48. private const string unk = "Unknown";
  49. public Kernel_bin.Magic_Data MAGIC => (kernelId & KernelFlag.magic) != 0 && Kernel_bin.MagicData.Count > abilityId ? Kernel_bin.MagicData[abilityId] : null;
  50. public Item_In_Menu? ITEM => (kernelId & KernelFlag.item) != 0 && Memory.MItems != null && Memory.MItems.Items.Count > abilityId ? Memory.MItems?.Items[abilityId] : null;
  51. public Kernel_bin.Enemy_Attacks_Data MONSTER => (kernelId & KernelFlag.monster) != 0 && Kernel_bin.EnemyAttacksData.Count > abilityId ? Kernel_bin.EnemyAttacksData[abilityId] : null;
  52. public override string ToString()
  53. {
  54. if (MAGIC != null)
  55. return MAGIC.Name ?? unk;
  56. if (ITEM != null)
  57. return ITEM.Value.Name ?? unk;
  58. if (MONSTER != null)
  59. return MONSTER.Name ?? unk;
  60. return "";
  61. }
  62. }
  63. /// <summary>
  64. /// </summary>
  65. /// <see cref="http://forums.qhimm.com/index.php?topic=8741.0"/>
  66. /// <seealso cref="http://wiki.ffrtt.ru/index.php/FF8/FileFormat_DAT#Section_7:_Informations_.26_stats"/>
  67. /// <seealso cref="http://www.gjoerulv.com/"/>
  68. [StructLayout(LayoutKind.Sequential, Pack = 1, Size = Section7Size)]
  69. public struct Information
  70. {
  71. [Flags]
  72. public enum Flag1 : byte
  73. {
  74. None = 0,
  75. Zombie = 0x1,
  76. Fly = 0x2,
  77. zz1 = 0x4,
  78. zz2 = 0x8,
  79. zz3 = 0x10,
  80. Auto_Reflect = 0x20,
  81. Auto_Shell = 0x40,
  82. Auto_Protect = 0x80,
  83. }
  84. [Flags]
  85. public enum Flag2 : byte
  86. {
  87. None = 0,
  88. zz1 = 0x1,
  89. zz2 = 0x2,
  90. unused1 = 0x4,
  91. unused2 = 0x8,
  92. unused3 = 0x10,
  93. unused4 = 0x20,
  94. DiablosMissed = 0x40,
  95. AlwaysCard = 0x80,
  96. }
  97. [Flags]
  98. public enum UnkFlag : byte
  99. {
  100. None = 0,
  101. unk0 = 0x1,
  102. unk1 = 0x2,
  103. unk2 = 0x4,
  104. unk3 = 0x8,
  105. unk4 = 0x10,
  106. unk5 = 0x20,
  107. unk6 = 0x40,
  108. unk7 = 0x80,
  109. }
  110. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
  111. private byte[] _name;
  112. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  113. public byte[] hp;
  114. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  115. public byte[] str;
  116. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  117. public byte[] vit;
  118. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  119. public byte[] mag;
  120. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  121. public byte[] spr;
  122. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  123. public byte[] spd;
  124. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  125. public byte[] eva;
  126. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
  127. public Abilities[] abilitiesLow;
  128. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
  129. public Abilities[] abilitiesMed;
  130. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
  131. public Abilities[] abilitiesHigh;
  132. /// <summary>
  133. /// Level med stats start
  134. /// </summary>
  135. public byte medLevelStart;
  136. /// <summary>
  137. /// Level high stats start
  138. /// </summary>
  139. public byte highLevelStart;
  140. public UnkFlag unkflag;
  141. public Flag1 bitSwitch;
  142. /// <summary>
  143. /// Cards per ifrit this is more of a drop, mod and rare mod
  144. /// </summary>
  145. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
  146. public Cards.ID[] card;
  147. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
  148. public byte[] devour;
  149. public Flag2 bitSwitch2;
  150. public UnkFlag unkflag2;
  151. public ushort expExtra;
  152. public ushort exp;
  153. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  154. public Magic[] drawlow;
  155. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  156. public Magic[] drawmed;
  157. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  158. public Magic[] drawhigh;
  159. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  160. public Saves.Item[] muglow;
  161. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  162. public Saves.Item[] mugmed;
  163. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  164. public Saves.Item[] mughigh;
  165. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  166. public Saves.Item[] droplow;
  167. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  168. public Saves.Item[] dropmed;
  169. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  170. public Saves.Item[] drophigh;
  171. public byte mugRate;
  172. public byte dropRate;
  173. public byte padding;
  174. public byte ap;
  175. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
  176. public byte[] unk3;
  177. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
  178. public byte[] resistance;
  179. public byte deathResistanceMental;
  180. public byte poisonResistanceMental;
  181. public byte petrifyResistanceMental;
  182. public byte darknessResistanceMental;
  183. public byte silenceResistanceMental;
  184. public byte berserkResistanceMental;
  185. public byte zombieResistanceMental;
  186. public byte sleepResistanceMental;
  187. public byte hasteResistanceMental;
  188. public byte slowResistanceMental;
  189. public byte stopResistanceMental;
  190. public byte regenResistanceMental;
  191. public byte reflectResistanceMental;
  192. public byte doomResistanceMental;
  193. public byte slowPetrifyResistanceMental;
  194. public byte floatResistanceMental;
  195. public byte confuseResistanceMental;
  196. public byte drainResistanceMental;
  197. public byte explusionResistanceMental;
  198. public byte percentResistanceMental;
  199. public FF8String name => _name;
  200. }
  201. [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 2)]
  202. public struct Magic
  203. {
  204. public byte ID;
  205. public byte unk;
  206. public Kernel_bin.Magic_Data DATA => Kernel_bin.MagicData.Count > ID ? Kernel_bin.MagicData[ID] : null;
  207. public Kernel_bin.Junctionable_GFs_Data JGFDATA => Kernel_bin.JunctionableGFsData.ContainsKey(GF)? Kernel_bin.JunctionableGFsData[GF]: null;
  208. // per IFRIT gf's id is between 0x40 and 0x4F. And they seem to be in order of GFs enum.
  209. public GFs GF => ID > 0x4F || ID < 0x40 ? GFs.Blank : (GFs)(ID - 0x40);
  210. public FF8String Name { get => GF != GFs.Blank ? Memory.Strings.GetName(GF) : DATA?.Name; }
  211. public override string ToString() => Name;
  212. }
  213. #endregion Structs
  214. }
  215. }