using System; using System.Collections.Generic; using System.IO; namespace OpenVIII { public partial class Kernel_bin { public const ushort MAX_HP_VALUE = 9999; public const byte MAX_STAT_VALUE = 255; private static List s_magicData; private static Dictionary s_junctionableGFsData; private static List s_enemyAttacksData; private static List s_battleCommands; private static List s_weaponsData; private static Dictionary s_renzokukenFinishersData; private static Dictionary s_characterStats; private static List s_battleItemsData; public static List s_nonbattleItemsData; private static List s_nonJunctionableGFsAttacksData; private static Dictionary s_commandabilitydata; private static Dictionary s_junctionabilities; private static Dictionary s_commandabilities; private static Dictionary s_statpercentabilities; private static Dictionary s_characterabilities; private static Dictionary s_partyabilities; private static Dictionary s_gFabilities; private static Dictionary s_menuabilities; private static List s_temporarycharacterlimitbreaks; private static Dictionary s_bluemagicQuistislimitbreak; private static List s_shotIrvinelimitbreak; private static List s_duelZelllimitbreak; private static List s_zelllimitbreakparameters; private static List s_rinoalimitbreakspart1; private static List s_rinoalimitbreakspart2; private static List s_slotarray; private static List s_selphielimitbreaksets; private static List s_devour_; private static List s_miscsection; private static List s_misctextpointers; private static Dictionary s_allAbilities; private static Dictionary s_equipableAbilities; private ArchiveWorker aw { get; set; } private Memory.Archive ArchiveString { get; } = Memory.Archives.A_MAIN; public static IReadOnlyList MagicData => s_magicData; //0 public static IReadOnlyDictionary JunctionableGFsData => s_junctionableGFsData; //1 public static IReadOnlyList EnemyAttacksData => s_enemyAttacksData; //2 public static IReadOnlyList BattleCommands => s_battleCommands; //3 public static IReadOnlyList WeaponsData => s_weaponsData; //4 public static IReadOnlyDictionary RenzokukenFinishersData => s_renzokukenFinishersData; //5 public static IReadOnlyDictionary CharacterStats => s_characterStats; //6 public static IReadOnlyList BattleItemsData => s_battleItemsData; //7 public static IReadOnlyList NonbattleItemsData => s_nonbattleItemsData; //8 //only strings public static IReadOnlyList NonJunctionableGFsAttacksData => s_nonJunctionableGFsAttacksData; //9 public static IReadOnlyDictionary Commandabilitydata => s_commandabilitydata; //10 public static IReadOnlyDictionary Junctionabilities => s_junctionabilities; //11 public static IReadOnlyDictionary Commandabilities => s_commandabilities; //12 public static IReadOnlyDictionary Statpercentabilities => s_statpercentabilities; //13 public static IReadOnlyDictionary Characterabilities => s_characterabilities; //14 public static IReadOnlyDictionary Partyabilities => s_partyabilities; //15 public static IReadOnlyDictionary GFabilities => s_gFabilities; //16 public static IReadOnlyDictionary Menuabilities => s_menuabilities; //17 public static IReadOnlyList Temporarycharacterlimitbreaks => s_temporarycharacterlimitbreaks; //18 public static IReadOnlyDictionary BluemagicQuistislimitbreak => s_bluemagicQuistislimitbreak; //19 //public static List Quistislimitbreakparameters { get; private set; }//20 public static IReadOnlyList ShotIrvinelimitbreak => s_shotIrvinelimitbreak; //21 public static IReadOnlyList DuelZelllimitbreak => s_duelZelllimitbreak; //22 public static IReadOnlyList Zelllimitbreakparameters => s_zelllimitbreakparameters; //23 public static IReadOnlyList Rinoalimitbreakspart1 => s_rinoalimitbreakspart1; //24 public static IReadOnlyList Rinoalimitbreakspart2 => s_rinoalimitbreakspart2; //25 public static IReadOnlyList Slotarray => s_slotarray; //26 public static IReadOnlyList Selphielimitbreaksets => s_selphielimitbreaksets; //27 public static IReadOnlyList Devour_ => s_devour_; //28 public static IReadOnlyList Miscsection => s_miscsection; //29 //only_strings public static IReadOnlyList Misctextpointers => s_misctextpointers; //30 public static IReadOnlyDictionary AllAbilities => s_allAbilities; // should contain all abilities public static IReadOnlyDictionary EquipableAbilities => s_equipableAbilities; // contains 4 types; /// /// Read binary data from into structures and arrays /// /// /// /// public Kernel_bin() { aw = new ArchiveWorker(ArchiveString); byte[] buffer = aw.GetBinaryFile(Memory.Strings[Strings.FileID.KERNEL].GetFilenames()[0]); List subPositions = Memory.Strings[Strings.FileID.KERNEL].GetFiles().subPositions; MemoryStream ms = null; using (BinaryReader br = new BinaryReader(ms = new MemoryStream(buffer))) { ms.Seek(subPositions[Battle_Commands.id], SeekOrigin.Begin); s_battleCommands = Battle_Commands.Read(br); ms.Seek(subPositions[Magic_Data.id], SeekOrigin.Begin); s_magicData = Magic_Data.Read(br); ms.Seek(subPositions[Junctionable_GFs_Data.id], SeekOrigin.Begin); s_junctionableGFsData = Junctionable_GFs_Data.Read(br); ms.Seek(subPositions[Enemy_Attacks_Data.id], SeekOrigin.Begin); s_enemyAttacksData = Enemy_Attacks_Data.Read(br); ms.Seek(subPositions[Weapons_Data.id], SeekOrigin.Begin); s_weaponsData = Weapons_Data.Read(br); ms.Seek(subPositions[Renzokuken_Finishers_Data.id], SeekOrigin.Begin); s_renzokukenFinishersData = Renzokuken_Finishers_Data.Read(br); ms.Seek(subPositions[Character_Stats.id], SeekOrigin.Begin); s_characterStats = Character_Stats.Read(br); ms.Seek(subPositions[Battle_Items_Data.id], SeekOrigin.Begin); s_battleItemsData = Battle_Items_Data.Read(br); s_nonbattleItemsData = Non_battle_Items_Data.Read(); ms.Seek(subPositions[Non_Junctionable_GFs_Attacks_Data.id], SeekOrigin.Begin); s_nonJunctionableGFsAttacksData = Non_Junctionable_GFs_Attacks_Data.Read(br); ms.Seek(subPositions[Command_ability_data.id], SeekOrigin.Begin); s_commandabilitydata = Command_ability_data.Read(br); ms.Seek(subPositions[Junction_abilities.id], SeekOrigin.Begin); s_junctionabilities = Junction_abilities.Read(br); ms.Seek(subPositions[Command_abilities.id], SeekOrigin.Begin); s_commandabilities = Command_abilities.Read(br); ms.Seek(subPositions[Stat_percent_abilities.id], SeekOrigin.Begin); s_statpercentabilities = Stat_percent_abilities.Read(br); ms.Seek(subPositions[Character_abilities.id], SeekOrigin.Begin); s_characterabilities = Character_abilities.Read(br); ms.Seek(subPositions[Party_abilities.id], SeekOrigin.Begin); s_partyabilities = Party_abilities.Read(br); ms.Seek(subPositions[GF_abilities.id], SeekOrigin.Begin); s_gFabilities = GF_abilities.Read(br); ms.Seek(subPositions[Menu_abilities.id], SeekOrigin.Begin); s_menuabilities = Menu_abilities.Read(br); ms.Seek(subPositions[Temporary_character_limit_breaks.id], SeekOrigin.Begin); s_temporarycharacterlimitbreaks = Temporary_character_limit_breaks.Read(br); ms.Seek(subPositions[Blue_magic_Quistis_limit_break.id], SeekOrigin.Begin); s_bluemagicQuistislimitbreak = Blue_magic_Quistis_limit_break.Read(br); //ms.Seek(subPositions[Quistis_limit_break_parameters.id], SeekOrigin.Begin); //Quistislimitbreakparameters = Quistis_limit_break_parameters.Read(br); ms.Seek(subPositions[Shot_Irvine_limit_break.id], SeekOrigin.Begin); s_shotIrvinelimitbreak = Shot_Irvine_limit_break.Read(br); ms.Seek(subPositions[Duel_Zell_limit_break.id], SeekOrigin.Begin); s_duelZelllimitbreak = Duel_Zell_limit_break.Read(br); ms.Seek(subPositions[Zell_limit_break_parameters.id], SeekOrigin.Begin); s_zelllimitbreakparameters = Zell_limit_break_parameters.Read(br); ms.Seek(subPositions[Rinoa_limit_breaks_part_1.id], SeekOrigin.Begin); s_rinoalimitbreakspart1 = Rinoa_limit_breaks_part_1.Read(br); ms.Seek(subPositions[Rinoa_limit_breaks_part_2.id], SeekOrigin.Begin); s_rinoalimitbreakspart2 = Rinoa_limit_breaks_part_2.Read(br); ms.Seek(subPositions[Slot_array.id], SeekOrigin.Begin); s_slotarray = Slot_array.Read(br); ms.Seek(subPositions[Selphie_limit_break_sets.id], SeekOrigin.Begin); s_selphielimitbreaksets = Selphie_limit_break_sets.Read(br); ms.Seek(subPositions[Devour.id], SeekOrigin.Begin); s_devour_ = Devour.Read(br); s_devour_.Add(new Devour { Description = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 112) }); ms.Seek(subPositions[Misc_section.id], SeekOrigin.Begin); s_miscsection = Misc_section.Read(br); s_misctextpointers = Misc_text_pointers.Read(); s_allAbilities = new Dictionary( Menu_abilities.count + Junction_abilities.count + Command_abilities.count + Stat_percent_abilities.count + Character_abilities.count + Party_abilities.count + GF_abilities.count); foreach (Abilities ability in (Abilities[])(Enum.GetValues(typeof(Abilities)))) { combine(Menuabilities); combine(Statpercentabilities); combine(Junctionabilities); combine(Commandabilities); combine(Characterabilities); combine(Partyabilities); combine(GFabilities); bool combine(IReadOnlyDictionary dict) where T:Ability { if (dict.TryGetValue(ability, out T a)) { s_allAbilities.Add(ability, a); return true; } return false; } } s_equipableAbilities = new Dictionary( Stat_percent_abilities.count + Character_abilities.count + Party_abilities.count + GF_abilities.count); foreach (Abilities ability in (Abilities[])(Enum.GetValues(typeof(Abilities)))) { if (Statpercentabilities.ContainsKey(ability)) s_equipableAbilities[ability] = Statpercentabilities[ability]; else if (Characterabilities.ContainsKey(ability)) s_equipableAbilities[ability] = Characterabilities[ability]; else if (Partyabilities.ContainsKey(ability)) s_equipableAbilities[ability] = Partyabilities[ability]; else if (Characterabilities.ContainsKey(ability)) s_equipableAbilities[ability] = Characterabilities[ability]; } ms = null; } } } }