Kernel_bin.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. namespace OpenVIII
  5. {
  6. public partial class Kernel_bin
  7. {
  8. public const ushort MAX_HP_VALUE = 9999;
  9. public const byte MAX_STAT_VALUE = 255;
  10. private static List<Magic_Data> s_magicData;
  11. private static Dictionary<GFs, Junctionable_GFs_Data> s_junctionableGFsData;
  12. private static List<Enemy_Attacks_Data> s_enemyAttacksData;
  13. private static List<Battle_Commands> s_battleCommands;
  14. private static List<Weapons_Data> s_weaponsData;
  15. private static Dictionary<Renzokeken_Finisher, Renzokuken_Finishers_Data> s_renzokukenFinishersData;
  16. private static Dictionary<Characters, Character_Stats> s_characterStats;
  17. private static List<Battle_Items_Data> s_battleItemsData;
  18. public static List<Non_battle_Items_Data> s_nonbattleItemsData;
  19. private static List<Non_Junctionable_GFs_Attacks_Data> s_nonJunctionableGFsAttacksData;
  20. private static Dictionary<Abilities, Command_ability_data> s_commandabilitydata;
  21. private static Dictionary<Abilities, Junction_abilities> s_junctionabilities;
  22. private static Dictionary<Abilities, Command_abilities> s_commandabilities;
  23. private static Dictionary<Abilities, Stat_percent_abilities> s_statpercentabilities;
  24. private static Dictionary<Abilities, Character_abilities> s_characterabilities;
  25. private static Dictionary<Abilities, Party_abilities> s_partyabilities;
  26. private static Dictionary<Abilities, GF_abilities> s_gFabilities;
  27. private static Dictionary<Abilities, Menu_abilities> s_menuabilities;
  28. private static List<Temporary_character_limit_breaks> s_temporarycharacterlimitbreaks;
  29. private static Dictionary<Blue_Magic, Blue_magic_Quistis_limit_break> s_bluemagicQuistislimitbreak;
  30. private static List<Shot_Irvine_limit_break> s_shotIrvinelimitbreak;
  31. private static List<Duel_Zell_limit_break> s_duelZelllimitbreak;
  32. private static List<Zell_limit_break_parameters> s_zelllimitbreakparameters;
  33. private static List<Rinoa_limit_breaks_part_1> s_rinoalimitbreakspart1;
  34. private static List<Rinoa_limit_breaks_part_2> s_rinoalimitbreakspart2;
  35. private static List<Slot_array> s_slotarray;
  36. private static List<Selphie_limit_break_sets> s_selphielimitbreaksets;
  37. private static List<Devour> s_devour_;
  38. private static List<Misc_section> s_miscsection;
  39. private static List<Misc_text_pointers> s_misctextpointers;
  40. private static Dictionary<Abilities, Ability> s_allAbilities;
  41. private static Dictionary<Abilities, Equipable_Ability> s_equipableAbilities;
  42. private ArchiveWorker aw { get; set; }
  43. private Memory.Archive ArchiveString { get; } = Memory.Archives.A_MAIN;
  44. public static IReadOnlyList<Magic_Data> MagicData => s_magicData; //0
  45. public static IReadOnlyDictionary<GFs, Junctionable_GFs_Data> JunctionableGFsData => s_junctionableGFsData; //1
  46. public static IReadOnlyList<Enemy_Attacks_Data> EnemyAttacksData => s_enemyAttacksData; //2
  47. public static IReadOnlyList<Battle_Commands> BattleCommands => s_battleCommands; //3
  48. public static IReadOnlyList<Weapons_Data> WeaponsData => s_weaponsData; //4
  49. public static IReadOnlyDictionary<Renzokeken_Finisher, Renzokuken_Finishers_Data> RenzokukenFinishersData => s_renzokukenFinishersData; //5
  50. public static IReadOnlyDictionary<Characters, Character_Stats> CharacterStats => s_characterStats; //6
  51. public static IReadOnlyList<Battle_Items_Data> BattleItemsData => s_battleItemsData; //7
  52. public static IReadOnlyList<Non_battle_Items_Data> NonbattleItemsData => s_nonbattleItemsData; //8 //only strings
  53. public static IReadOnlyList<Non_Junctionable_GFs_Attacks_Data> NonJunctionableGFsAttacksData => s_nonJunctionableGFsAttacksData; //9
  54. public static IReadOnlyDictionary<Abilities, Command_ability_data> Commandabilitydata => s_commandabilitydata; //10
  55. public static IReadOnlyDictionary<Abilities, Junction_abilities> Junctionabilities => s_junctionabilities; //11
  56. public static IReadOnlyDictionary<Abilities, Command_abilities> Commandabilities => s_commandabilities; //12
  57. public static IReadOnlyDictionary<Abilities, Stat_percent_abilities> Statpercentabilities => s_statpercentabilities; //13
  58. public static IReadOnlyDictionary<Abilities, Character_abilities> Characterabilities => s_characterabilities; //14
  59. public static IReadOnlyDictionary<Abilities, Party_abilities> Partyabilities => s_partyabilities; //15
  60. public static IReadOnlyDictionary<Abilities, GF_abilities> GFabilities => s_gFabilities; //16
  61. public static IReadOnlyDictionary<Abilities, Menu_abilities> Menuabilities => s_menuabilities; //17
  62. public static IReadOnlyList<Temporary_character_limit_breaks> Temporarycharacterlimitbreaks => s_temporarycharacterlimitbreaks; //18
  63. public static IReadOnlyDictionary<Blue_Magic, Blue_magic_Quistis_limit_break> BluemagicQuistislimitbreak => s_bluemagicQuistislimitbreak; //19
  64. //public static List<Quistis_limit_break_parameters> Quistislimitbreakparameters { get; private set; }//20
  65. public static IReadOnlyList<Shot_Irvine_limit_break> ShotIrvinelimitbreak => s_shotIrvinelimitbreak; //21
  66. public static IReadOnlyList<Duel_Zell_limit_break> DuelZelllimitbreak => s_duelZelllimitbreak; //22
  67. public static IReadOnlyList<Zell_limit_break_parameters> Zelllimitbreakparameters => s_zelllimitbreakparameters; //23
  68. public static IReadOnlyList<Rinoa_limit_breaks_part_1> Rinoalimitbreakspart1 => s_rinoalimitbreakspart1; //24
  69. public static IReadOnlyList<Rinoa_limit_breaks_part_2> Rinoalimitbreakspart2 => s_rinoalimitbreakspart2; //25
  70. public static IReadOnlyList<Slot_array> Slotarray => s_slotarray; //26
  71. public static IReadOnlyList<Selphie_limit_break_sets> Selphielimitbreaksets => s_selphielimitbreaksets; //27
  72. public static IReadOnlyList<Devour> Devour_ => s_devour_; //28
  73. public static IReadOnlyList<Misc_section> Miscsection => s_miscsection; //29 //only_strings
  74. public static IReadOnlyList<Misc_text_pointers> Misctextpointers => s_misctextpointers; //30
  75. public static IReadOnlyDictionary<Abilities, Ability> AllAbilities => s_allAbilities; // should contain all abilities
  76. public static IReadOnlyDictionary<Abilities, Equipable_Ability> EquipableAbilities => s_equipableAbilities; // contains 4 types;
  77. /// <summary>
  78. /// Read binary data from into structures and arrays
  79. /// </summary>
  80. /// <see cref="http://forums.qhimm.com/index.php?topic=16923.msg240609#msg240609"/>
  81. /// <seealso cref="https://github.com/alexfilth/doomtrain"/>
  82. /// <seealso cref="https://github.com/alexfilth/doomtrain/wiki/Kernel.bin"/>
  83. public Kernel_bin()
  84. {
  85. aw = new ArchiveWorker(ArchiveString);
  86. byte[] buffer = aw.GetBinaryFile(Memory.Strings[Strings.FileID.KERNEL].GetFilenames()[0]);
  87. List<Loc> subPositions = Memory.Strings[Strings.FileID.KERNEL].GetFiles().subPositions;
  88. MemoryStream ms = null;
  89. using (BinaryReader br = new BinaryReader(ms = new MemoryStream(buffer)))
  90. {
  91. ms.Seek(subPositions[Battle_Commands.id], SeekOrigin.Begin);
  92. s_battleCommands = Battle_Commands.Read(br);
  93. ms.Seek(subPositions[Magic_Data.id], SeekOrigin.Begin);
  94. s_magicData = Magic_Data.Read(br);
  95. ms.Seek(subPositions[Junctionable_GFs_Data.id], SeekOrigin.Begin);
  96. s_junctionableGFsData = Junctionable_GFs_Data.Read(br);
  97. ms.Seek(subPositions[Enemy_Attacks_Data.id], SeekOrigin.Begin);
  98. s_enemyAttacksData = Enemy_Attacks_Data.Read(br);
  99. ms.Seek(subPositions[Weapons_Data.id], SeekOrigin.Begin);
  100. s_weaponsData = Weapons_Data.Read(br);
  101. ms.Seek(subPositions[Renzokuken_Finishers_Data.id], SeekOrigin.Begin);
  102. s_renzokukenFinishersData = Renzokuken_Finishers_Data.Read(br);
  103. ms.Seek(subPositions[Character_Stats.id], SeekOrigin.Begin);
  104. s_characterStats = Character_Stats.Read(br);
  105. ms.Seek(subPositions[Battle_Items_Data.id], SeekOrigin.Begin);
  106. s_battleItemsData = Battle_Items_Data.Read(br);
  107. s_nonbattleItemsData = Non_battle_Items_Data.Read();
  108. ms.Seek(subPositions[Non_Junctionable_GFs_Attacks_Data.id], SeekOrigin.Begin);
  109. s_nonJunctionableGFsAttacksData = Non_Junctionable_GFs_Attacks_Data.Read(br);
  110. ms.Seek(subPositions[Command_ability_data.id], SeekOrigin.Begin);
  111. s_commandabilitydata = Command_ability_data.Read(br);
  112. ms.Seek(subPositions[Junction_abilities.id], SeekOrigin.Begin);
  113. s_junctionabilities = Junction_abilities.Read(br);
  114. ms.Seek(subPositions[Command_abilities.id], SeekOrigin.Begin);
  115. s_commandabilities = Command_abilities.Read(br);
  116. ms.Seek(subPositions[Stat_percent_abilities.id], SeekOrigin.Begin);
  117. s_statpercentabilities = Stat_percent_abilities.Read(br);
  118. ms.Seek(subPositions[Character_abilities.id], SeekOrigin.Begin);
  119. s_characterabilities = Character_abilities.Read(br);
  120. ms.Seek(subPositions[Party_abilities.id], SeekOrigin.Begin);
  121. s_partyabilities = Party_abilities.Read(br);
  122. ms.Seek(subPositions[GF_abilities.id], SeekOrigin.Begin);
  123. s_gFabilities = GF_abilities.Read(br);
  124. ms.Seek(subPositions[Menu_abilities.id], SeekOrigin.Begin);
  125. s_menuabilities = Menu_abilities.Read(br);
  126. ms.Seek(subPositions[Temporary_character_limit_breaks.id], SeekOrigin.Begin);
  127. s_temporarycharacterlimitbreaks = Temporary_character_limit_breaks.Read(br);
  128. ms.Seek(subPositions[Blue_magic_Quistis_limit_break.id], SeekOrigin.Begin);
  129. s_bluemagicQuistislimitbreak = Blue_magic_Quistis_limit_break.Read(br);
  130. //ms.Seek(subPositions[Quistis_limit_break_parameters.id], SeekOrigin.Begin);
  131. //Quistislimitbreakparameters = Quistis_limit_break_parameters.Read(br);
  132. ms.Seek(subPositions[Shot_Irvine_limit_break.id], SeekOrigin.Begin);
  133. s_shotIrvinelimitbreak = Shot_Irvine_limit_break.Read(br);
  134. ms.Seek(subPositions[Duel_Zell_limit_break.id], SeekOrigin.Begin);
  135. s_duelZelllimitbreak = Duel_Zell_limit_break.Read(br);
  136. ms.Seek(subPositions[Zell_limit_break_parameters.id], SeekOrigin.Begin);
  137. s_zelllimitbreakparameters = Zell_limit_break_parameters.Read(br);
  138. ms.Seek(subPositions[Rinoa_limit_breaks_part_1.id], SeekOrigin.Begin);
  139. s_rinoalimitbreakspart1 = Rinoa_limit_breaks_part_1.Read(br);
  140. ms.Seek(subPositions[Rinoa_limit_breaks_part_2.id], SeekOrigin.Begin);
  141. s_rinoalimitbreakspart2 = Rinoa_limit_breaks_part_2.Read(br);
  142. ms.Seek(subPositions[Slot_array.id], SeekOrigin.Begin);
  143. s_slotarray = Slot_array.Read(br);
  144. ms.Seek(subPositions[Selphie_limit_break_sets.id], SeekOrigin.Begin);
  145. s_selphielimitbreaksets = Selphie_limit_break_sets.Read(br);
  146. ms.Seek(subPositions[Devour.id], SeekOrigin.Begin);
  147. s_devour_ = Devour.Read(br);
  148. s_devour_.Add(new Devour { Description = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 112) });
  149. ms.Seek(subPositions[Misc_section.id], SeekOrigin.Begin);
  150. s_miscsection = Misc_section.Read(br);
  151. s_misctextpointers = Misc_text_pointers.Read();
  152. s_allAbilities = new Dictionary<Abilities, Ability>(
  153. Menu_abilities.count +
  154. Junction_abilities.count +
  155. Command_abilities.count +
  156. Stat_percent_abilities.count +
  157. Character_abilities.count +
  158. Party_abilities.count +
  159. GF_abilities.count);
  160. foreach (Abilities ability in (Abilities[])(Enum.GetValues(typeof(Abilities))))
  161. {
  162. combine(Menuabilities);
  163. combine(Statpercentabilities);
  164. combine(Junctionabilities);
  165. combine(Commandabilities);
  166. combine(Characterabilities);
  167. combine(Partyabilities);
  168. combine(GFabilities);
  169. bool combine<T>(IReadOnlyDictionary<Abilities, T> dict)
  170. where T:Ability
  171. {
  172. if (dict.TryGetValue(ability, out T a))
  173. {
  174. s_allAbilities.Add(ability, a);
  175. return true;
  176. }
  177. return false;
  178. }
  179. }
  180. s_equipableAbilities = new Dictionary<Abilities, Equipable_Ability>(
  181. Stat_percent_abilities.count +
  182. Character_abilities.count +
  183. Party_abilities.count +
  184. GF_abilities.count);
  185. foreach (Abilities ability in (Abilities[])(Enum.GetValues(typeof(Abilities))))
  186. {
  187. if (Statpercentabilities.ContainsKey(ability))
  188. s_equipableAbilities[ability] = Statpercentabilities[ability];
  189. else if (Characterabilities.ContainsKey(ability))
  190. s_equipableAbilities[ability] = Characterabilities[ability];
  191. else if (Partyabilities.ContainsKey(ability))
  192. s_equipableAbilities[ability] = Partyabilities[ability];
  193. else if (Characterabilities.ContainsKey(ability))
  194. s_equipableAbilities[ability] = Characterabilities[ability];
  195. }
  196. ms = null;
  197. }
  198. }
  199. }
  200. }