Example #1
0
        public void writeVariables()
        {
            StreamReader sR   = File.OpenText(Properties.Settings.Default.inputUnitDataJSON);
            string       JSON = sR.ReadToEnd();

            sR.Close();

            Unit_Varaibles unit_Varaibles = JsonConvert.DeserializeObject <Unit_Varaibles>(JSON);

            if (unit_Varaibles.schemaVersion != schemaVersion)
            {
                throw new Exception("Unsupported Schema Version!");
            }

            List <Ammo_Data> ammoDataList = unit_Varaibles.ammo_Datas;

            MemoryStream ammo_Hash_Chunk_MS = new MemoryStream();

            appendUIntMemoryStream(ammo_Hash_Chunk_MS, (uint)ammoDataList.Count, true);

            for (int i = 0; i < ammoDataList.Count; i++)
            {
                appendUIntMemoryStream(ammo_Hash_Chunk_MS, ammoDataList[i].ammo_Hash, true);
            }

            MemoryStream data_Set_Index_MS         = new MemoryStream();
            List <int>   set_Data_Assignment_Index = unit_Varaibles.set_Data_Assignment_Index;

            appendUIntMemoryStream(data_Set_Index_MS, unit_Varaibles.setCount, true);
            for (int i = 0; i < unit_Varaibles.setCount; i++)
            {
                appendUIntMemoryStream(data_Set_Index_MS, (uint)set_Data_Assignment_Index[i], true);
            }

            MemoryStream data_Hash_MS  = new MemoryStream();
            MemoryStream data_Type_MS  = new MemoryStream();
            MemoryStream data_Value_MS = new MemoryStream();

            List <Unit_Data> dataList = unit_Varaibles.datas;

            appendUIntMemoryStream(data_Hash_MS, (uint)dataList.Count, true);
            List <MemoryStream> data_MS_List = new List <MemoryStream>();
            uint setCount = unit_Varaibles.setCount;

            for (int i = 0; i < setCount; i++)
            {
                data_MS_List.Add(new MemoryStream());
            }
            for (int i = 0; i < dataList.Count; i++)
            {
                Data_Hash      data_Hash  = dataList[i].Data_Hash;
                List <dynamic> Data_Value = dataList[i].Data_Value;
                data_Types     data_Type  = dataList[i].Data_Type_Enum;

                appendUIntMemoryStream(data_Hash_MS, data_Hash.Hash, true);
                appendUIntMemoryStream(data_Type_MS, (uint)data_Type, true);

                if (Data_Value.Count != unit_Varaibles.setCount)
                {
                    throw new Exception("Set count mismatch for hash: 0x" + data_Hash.Hash.ToString("X8"));
                }

                for (int j = 0; j < Data_Value.Count; j++)
                {
                    switch (data_Type)
                    {
                    case data_Types.Float:
                        appendFloatMemoryStream(data_MS_List[j], (float)Data_Value[j], true);
                        break;

                    case data_Types.Int:
                        appendUIntMemoryStream(data_MS_List[j], (uint)Data_Value[j], true);
                        break;

                    default:
                        appendUIntMemoryStream(data_MS_List[j], (uint)Data_Value[j], true);
                        break;
                    }
                }
            }

            for (int i = 0; i < setCount; i++)
            {
                MemoryStream memoryStream = data_MS_List[i];
                memoryStream.Seek(0, SeekOrigin.Begin);
                memoryStream.CopyTo(data_Value_MS);
            }

            ammo_Hash_Chunk_MS.Seek(0, SeekOrigin.Begin);
            data_Set_Index_MS.Seek(0, SeekOrigin.Begin);
            data_Hash_MS.Seek(0, SeekOrigin.Begin);
            data_Type_MS.Seek(0, SeekOrigin.Begin);
            data_Value_MS.Seek(0, SeekOrigin.Begin);

            MemoryStream Unit_Variable_MS = new MemoryStream();

            appendUIntMemoryStream(Unit_Variable_MS, unit_Varaibles.magic, true);
            appendUIntMemoryStream(Unit_Variable_MS, unit_Varaibles.Unit_ID, true);
            appendUIntMemoryStream(Unit_Variable_MS, unit_Varaibles.unk_Hash, true);
            appendUIntMemoryStream(Unit_Variable_MS, 0, true);

            appendUIntMemoryStream(Unit_Variable_MS, 0x30, true);
            appendUIntMemoryStream(Unit_Variable_MS, 0x30 + (uint)ammo_Hash_Chunk_MS.Length, true);
            appendUIntMemoryStream(Unit_Variable_MS, 0x30 + (uint)ammo_Hash_Chunk_MS.Length + (uint)data_Hash_MS.Length + (uint)data_Type_MS.Length, true);
            appendUIntMemoryStream(Unit_Variable_MS, 0x30 + (uint)ammo_Hash_Chunk_MS.Length + (uint)data_Hash_MS.Length + (uint)data_Type_MS.Length + (uint)data_Set_Index_MS.Length, true);

            appendUIntMemoryStream(Unit_Variable_MS, unit_Varaibles.reloadHashIndex_Slot_1, true);
            appendUIntMemoryStream(Unit_Variable_MS, unit_Varaibles.reloadHashIndex_Slot_2, true);
            appendUIntMemoryStream(Unit_Variable_MS, unit_Varaibles.reloadHashIndex_Slot_3, true);
            appendUIntMemoryStream(Unit_Variable_MS, unit_Varaibles.reloadHashIndex_Slot_4, true);

            ammo_Hash_Chunk_MS.CopyTo(Unit_Variable_MS);
            data_Hash_MS.CopyTo(Unit_Variable_MS);
            data_Type_MS.CopyTo(Unit_Variable_MS);
            data_Set_Index_MS.CopyTo(Unit_Variable_MS);
            data_Value_MS.CopyTo(Unit_Variable_MS);

            string     fileName = Path.GetFileNameWithoutExtension(Properties.Settings.Default.inputUnitDataJSON);
            FileStream ofs      = File.Create(Properties.Settings.Default.outputUnitDataBinaryPath + @"\" + fileName + ".bin");

            Unit_Variable_MS.Seek(0, SeekOrigin.Begin);
            Unit_Variable_MS.CopyTo(ofs);
            ofs.Close();
        }
Example #2
0
        public void readVariables()
        {
            FileStream fs       = File.OpenRead(Properties.Settings.Default.inputUnitDataBinary);
            FileStream reloadfs = File.OpenRead(Properties.Settings.Default.inputUnitDataReloadBinary);

            reloadfs.Seek(0x10, SeekOrigin.Begin);
            uint reloadHashCount = readUIntBigEndian(reloadfs);

            reloadfs.Seek(0x60, SeekOrigin.Begin);

            List <uint> reloadHashes = new List <uint>();

            for (int i = 0; i < reloadHashCount; i++)
            {
                uint reloadHash = readUIntBigEndian(reloadfs);
                reloadHashes.Add(reloadHash);
            }

            reloadfs.Seek(0x20, SeekOrigin.Begin);

            List <uint> reloadHashIndex = new List <uint>();

            for (int i = 0; i < 5; i++)
            {
                uint reloadHashInitialIndex = readUIntBigEndian(reloadfs);
                if (reloadHashes.Contains(reloadHashInitialIndex))
                {
                    uint index = (uint)reloadHashes.IndexOf(reloadHashInitialIndex);
                    reloadHashIndex.Add(index);
                }
                else
                {
                    reloadHashIndex.Add(0xFFFFFFFF);
                }
            }


            Data_Hash_Schema data_Hash_Schema = parseDataHashSchema(Properties.Settings.Default.inputUnitDataHashSchemaJSON);
            List <Data_Hash> data_Hashes      = data_Hash_Schema.Data_Hashes;
            Unit_Varaibles   unit_Varaibles   = new Unit_Varaibles();

            unit_Varaibles.schemaVersion = schemaVersion;

            uint Magic = readUIntBigEndian(fs);

            unit_Varaibles.magic = Magic;

            uint Unit_ID = readUIntBigEndian(fs);

            unit_Varaibles.Unit_ID = Unit_ID;

            uint unk_Hash = readUIntBigEndian(fs);

            unit_Varaibles.unk_Hash = unk_Hash;

            uint unk_0xC_enum = readUIntBigEndian(fs);

            if (unk_0xC_enum != 0)
            {
                throw new Exception("unk_0xC is not 0!");
            }

            uint ammoHashChunkPointer  = readUIntBigEndian(fs);
            uint unitDataHashChunk     = readUIntBigEndian(fs);
            uint unitDataSetIndexChunk = readUIntBigEndian(fs);
            uint unitDataValueChunk    = readUIntBigEndian(fs);

            uint reloadHashIndex_1 = readUIntBigEndian(fs);             // depreceated stuff, since they don't store used reload hash here anymore
            uint reloadHashIndex_2 = readUIntBigEndian(fs);             // depreceated stuff, since they don't store used reload hash here anymore
            uint reloadHashIndex_3 = readUIntBigEndian(fs);             // depreceated stuff, since they don't store used reload hash here anymore
            uint reloadHashIndex_4 = readUIntBigEndian(fs);             // depreceated stuff, since they don't store used reload hash here anymore

            unit_Varaibles.reloadHashIndex_Slot_1 = reloadHashIndex[0]; // reloadHashIndex_1;
            unit_Varaibles.reloadHashIndex_Slot_2 = reloadHashIndex[1]; // reloadHashIndex_2;
            unit_Varaibles.reloadHashIndex_Slot_3 = reloadHashIndex[2]; // reloadHashIndex_3;
            unit_Varaibles.reloadHashIndex_Slot_4 = reloadHashIndex[3]; // reloadHashIndex_4;

            // TODO: add 5th ammo?

            fs.Seek(ammoHashChunkPointer, SeekOrigin.Begin);
            uint ammoSlotCount = readUIntBigEndian(fs);

            List <Ammo_Data> ammoSlotHashes = unit_Varaibles.ammo_Datas;

            if (ammoSlotCount != 0x4)
            {
                throw new Exception("ammoSlot is not depreceated!");
            }

            /*
             * for (int i = 0; i < ammoSlotCount; i++)
             * {
             *  Ammo_Data ammo_Data = new Ammo_Data();
             *  uint ammo_Hash = readUIntBigEndian(fs); // probably nothing here.
             *  ammo_Data.ammo_Hash = ammo_Hash;
             *  ammoSlotHashes.Add(ammo_Data);
             * }
             */

            foreach (uint reloadHash in reloadHashes)
            {
                Ammo_Data ammo_Data = new Ammo_Data();
                ammo_Data.ammo_Hash = reloadHash;
                ammoSlotHashes.Add(ammo_Data);
            }

            fs.Seek(unitDataSetIndexChunk, SeekOrigin.Begin);
            uint setCount = readUIntBigEndian(fs);

            unit_Varaibles.setCount = setCount;

            for (int i = 0; i < setCount; i++)
            {
                int index = (int)readUIntBigEndian(fs);

                unit_Varaibles.set_Data_Assignment_Index.Add(index);

                if (index != i)
                {
                }
                //throw new Exception("index mismatch!");
            }

            fs.Seek(unitDataHashChunk, SeekOrigin.Begin);
            uint dataCount = readUIntBigEndian(fs);

            List <Unit_Data> dataList = unit_Varaibles.datas;

            for (int i = 0; i < dataCount; i++)
            {
                Unit_Data unit_Data = new Unit_Data();

                uint      data_Hash_Read = readUIntBigEndian(fs);
                Data_Hash data_Hash      = data_Hashes.FirstOrDefault(x => x.Hash == data_Hash_Read);
                if (data_Hash == null)
                {
                    throw new Exception("Unidentified hash: 0x" + data_Hash.Hash.ToString("X8"));
                }

                unit_Data.Data_Hash = data_Hash;
                long hashReturnPos = fs.Position;
                fs.Seek(unitDataHashChunk + dataCount * 0x4 + i * 0x4 + 0x4, SeekOrigin.Begin);

                uint       data_Hash_Type = readUIntBigEndian(fs);
                data_Types dataType       = (data_Types)data_Hash_Type;
                unit_Data.Data_Type_Enum = dataType;

                for (int j = 0; j < setCount; j++)
                {
                    fs.Seek(unitDataValueChunk + (j * dataCount * 4) + (i * 0x4), SeekOrigin.Begin);
                    dynamic value;
                    switch (dataType)
                    {
                    case data_Types.Float:
                        value = readFloat(fs, true);
                        break;

                    case data_Types.Int:     // I am not sure if this is int or uint
                        value = readUIntBigEndian(fs);
                        break;

                    case data_Types.Unk:
                        value = readUIntBigEndian(fs);
                        break;

                    default:
                        value = readUIntBigEndian(fs);
                        break;
                    }

                    unit_Data.Data_Value.Add(value);
                }

                fs.Seek(hashReturnPos, SeekOrigin.Begin);
                dataList.Add(unit_Data);
            }

            /*
             * string CS = File.ReadAllText(Properties.Settings.Default.CScriptFilePath);
             * List<uint> asd = data_Hashes.Select(x => x.Hash).ToList();
             *
             * AhoCorasick.Trie trie = new AhoCorasick.Trie();
             *
             * for (int i = 0; i < asd.Count; i++)
             * {
             *  string funcPointerHex = "0x" + asd[i].ToString("X");
             *  trie.Add(funcPointerHex.ToLower());
             * }
             * trie.Build();
             *
             * List<string> addedWord = new List<string>();
             * foreach (string word in trie.Find(CS))
             * {
             *  if(!addedWord.Contains(word))
             *      addedWord.Add(word);
             * }
             *
             * string JSONasd = JsonConvert.SerializeObject(addedWord, Formatting.Indented);
             * StreamWriter sWasd = File.CreateText(Properties.Settings.Default.outputUnitDataJSONPath + @"\asd.JSON");
             * sWasd.Write(JSONasd);
             * sWasd.Close();
             */

            Dictionary <uint, uint> conversionHash = new Dictionary <uint, uint>
            {
                { 0xCCE10B14, 0x83A09DD3 },
                { 0x5FAE7052, 0x10EFE695 },
                { 0x66A5F155, 0xBFD7B8DB }, // skip 0xB8AA5D4E, we take melee damage and apply it directly.
                { 0x3312894D, 0x86302075 },
                { 0x51AC65A2, 0xE48ECC9A },
                { 0x644EE109, 0x197DF49 },
                { 0x83B425AD, 0xB2AC12DA },

                { 0xFB54ED00, 0xA88DCE10 },
                { 0x681B9646, 0x3BC2B556 },
                { 0x25A32C27, 0x86AF159B }, // skip 0xFBAC803C, we take shooting damage and apply it directly.
                { 0x8E1DDA67, 0xC291056D },
                { 0xECA33688, 0xA02FE982 },
                { 0x86305C88, 0x38EF7209 },
                { 0x14FCA1E8, 0xEAB2BBF2 },

                { 0x906BF615, 0x10E5CA5B }, // skip 0x4E645A0E, should be 1 anyways.
            };

            if (Properties.Settings.Default.convertMBONUnitData)
            {
                Unit_Data MBON_Damage_Dealt_EX_Gauge_Increase_Multiplier = new Unit_Data();
                Unit_Data MBON_Damage_Taken_EX_Gauge_Increase_Multiplier = new Unit_Data();
                Unit_Data Awakening_unk_0x8  = new Unit_Data();
                Unit_Data Awakening_unk_0xC  = new Unit_Data();
                Unit_Data Awakening_unk_0x10 = new Unit_Data();
                Unit_Data Awakening_unk_0x14 = new Unit_Data();
                Unit_Data Awakening_unk_0x18 = new Unit_Data();

                List <Unit_Data> newUnitData = dataList.ToList();
                for (int i = 0; i < dataList.Count; i++)
                {
                    Unit_Data data = dataList[i];

                    switch (data.Data_Hash.Hash)
                    {
                    case 0x211CF6DD:     // Unknown Enum, not called by script, seen values of 0 or 1 - MBON Exclusive (removed in FB conversion)
                        newUnitData.Remove(data);
                        break;

                    case 0x1F2CEDD:     //"Unknown Enum, not called by script, seen values of 3 - MBON Exclusive (removed in FB conversion)"
                        newUnitData.Remove(data);
                        break;

                    case 0x7291BF3B:     // "Unknown Value, not called by script, always the same value as value of hash 0xA449D488, seen values of 0x578 (1400) - MBON Exclusive (removed in FB conversion)"
                        newUnitData.Remove(data);
                        break;

                    case 0xB8AA5D4E:
                        newUnitData.Remove(data);
                        break;

                    case 0xFBAC803C:
                        newUnitData.Remove(data);
                        break;

                    case 0x4E645A0E:
                        newUnitData.Remove(data);
                        break;

                    case 0xE1C391B7:
                        MBON_Damage_Dealt_EX_Gauge_Increase_Multiplier = data;
                        newUnitData.Remove(data);
                        break;

                    case 0xD9A9D2BF:
                        MBON_Damage_Taken_EX_Gauge_Increase_Multiplier = data;
                        newUnitData.Remove(data);
                        break;

                    case 0xF445B45A:
                        Awakening_unk_0x8 = data;
                        newUnitData.Remove(data);
                        break;

                    case 0xF83C13D:
                        Awakening_unk_0xC = data;
                        newUnitData.Remove(data);
                        break;

                    case 0x80815199:
                        Awakening_unk_0x10 = data;
                        newUnitData.Remove(data);
                        break;

                    case 0xD7F9E2AA:
                        Awakening_unk_0x14 = data;
                        newUnitData.Remove(data);
                        break;

                    case 0x794C406A:
                        Awakening_unk_0x18 = data;
                        newUnitData.Remove(data);
                        break;

                    default:
                        if (conversionHash.ContainsKey(data.Data_Hash.Hash))
                        {
                            uint      equivalentFBHash = conversionHash[data.Data_Hash.Hash];
                            Data_Hash FB_data_Hash     = data_Hashes.FirstOrDefault(x => x.Hash == equivalentFBHash);
                            if (FB_data_Hash == null)
                            {
                                throw new Exception("Unidentified hash: 0x" + FB_data_Hash.Hash.ToString("X8"));
                            }

                            data.Data_Hash.Hash        = FB_data_Hash.Hash;
                            data.Data_Hash.description = FB_data_Hash.description;
                        }
                        break;
                    }
                }

                unit_Varaibles.datas = newUnitData.ToList();
                dataList             = unit_Varaibles.datas;

                // Insert additional awakening data
                // Assault Burst:
                // Find the index for Boost Consumption Multiplier

                int ABBCIndex = dataList.FindIndex(x => x.Data_Hash.Hash == 0xB2AC12DA);

                // For the 0 value with correct number of sets.
                List <dynamic> unk_0_Values = new List <dynamic>();
                for (int j = 0; j < setCount; j++)
                {
                    unk_0_Values.Add(0);
                }

                Unit_Data unk_1C = new Unit_Data();
                unk_1C.Data_Hash.Hash        = 0x801145CC;
                unk_1C.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_1C.Data_Hash.Hash).description;
                unk_1C.Data_Type_Enum        = data_Types.Int;
                unk_1C.Data_Value            = unk_0_Values; // Always 0

                dataList.Insert(ABBCIndex + 1, unk_1C);

                Unit_Data unk_20 = new Unit_Data();
                unk_20.Data_Hash.Hash        = 0xCE8EA6A0;
                unk_20.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_20.Data_Hash.Hash).description;
                unk_20.Data_Type_Enum        = data_Types.Int;
                unk_20.Data_Value            = unk_0_Values; // Always 0

                dataList.Insert(ABBCIndex + 2, unk_20);

                Unit_Data Damage_Dealt_EX_Gauge_Increase_Multiplier = MBON_Damage_Dealt_EX_Gauge_Increase_Multiplier;
                Damage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0xF73F72CF;
                Damage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == Damage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(ABBCIndex + 3, Damage_Dealt_EX_Gauge_Increase_Multiplier);

                Unit_Data Damage_Taken_EX_Gauge_Increase_Multiplier = MBON_Damage_Taken_EX_Gauge_Increase_Multiplier;
                Damage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0x85B796C1;
                Damage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == Damage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(ABBCIndex + 4, Damage_Taken_EX_Gauge_Increase_Multiplier);

                Unit_Data unk_0x8 = Awakening_unk_0x8;
                unk_0x8.Data_Hash.Hash        = 0xF23C5041;
                unk_0x8.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_0x8.Data_Hash.Hash).description;

                dataList.Insert(ABBCIndex + 5, unk_0x8);

                Unit_Data unk_0xC = Awakening_unk_0xC;
                unk_0xC.Data_Hash.Hash        = 0x9FA2526;
                unk_0xC.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_0xC.Data_Hash.Hash).description;

                dataList.Insert(ABBCIndex + 6, unk_0xC);

                Unit_Data unk_0x10 = Awakening_unk_0x10;
                unk_0x10.Data_Hash.Hash        = 0x6B108DAF;
                unk_0x10.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_0x10.Data_Hash.Hash).description;

                dataList.Insert(ABBCIndex + 7, unk_0x10);

                Unit_Data unk_0x14 = Awakening_unk_0x14;
                unk_0x14.Data_Hash.Hash        = 0xD18006B1;
                unk_0x14.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_0x14.Data_Hash.Hash).description;

                dataList.Insert(ABBCIndex + 8, unk_0x14);

                Unit_Data unk_0x18 = Awakening_unk_0x18;
                unk_0x18.Data_Hash.Hash        = 0x92DD9C5C;
                unk_0x18.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_0x18.Data_Hash.Hash).description;

                dataList.Insert(ABBCIndex + 9, unk_0x18);


                int BBBCIndex = dataList.FindIndex(x => x.Data_Hash.Hash == 0xEAB2BBF2);

                Unit_Data BBunk_1C = (Unit_Data)unk_1C.DeepClone();
                BBunk_1C.Data_Hash.Hash        = 0x7246A834;
                BBunk_1C.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBunk_1C.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 1, BBunk_1C);

                Unit_Data BBunk_20 = (Unit_Data)unk_20.DeepClone();
                BBunk_20.Data_Hash.Hash        = 0x96900F88;
                BBunk_20.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBunk_20.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 2, BBunk_20);

                Unit_Data BBDamage_Dealt_EX_Gauge_Increase_Multiplier = (Unit_Data)Damage_Dealt_EX_Gauge_Increase_Multiplier.DeepClone();
                BBDamage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0x93DF0931;
                BBDamage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBDamage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 3, BBDamage_Dealt_EX_Gauge_Increase_Multiplier);

                Unit_Data BBDamage_Taken_EX_Gauge_Increase_Multiplier = (Unit_Data)Damage_Taken_EX_Gauge_Increase_Multiplier.DeepClone();
                BBDamage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0xBD8C1DB2;
                BBDamage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBDamage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 4, BBDamage_Taken_EX_Gauge_Increase_Multiplier);

                Unit_Data BBunk_0x8 = (Unit_Data)unk_0x8.DeepClone();
                BBunk_0x8.Data_Hash.Hash        = 0xCB44FD01;
                BBunk_0x8.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBunk_0x8.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 5, BBunk_0x8);

                Unit_Data BBunk_0xC = (Unit_Data)unk_0xC.DeepClone();
                BBunk_0xC.Data_Hash.Hash        = 0x30828866;
                BBunk_0xC.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBunk_0xC.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 6, BBunk_0xC);

                Unit_Data BBunk_0x10 = (Unit_Data)unk_0x10.DeepClone();
                BBunk_0x10.Data_Hash.Hash        = 0xC4B9C065;
                BBunk_0x10.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBunk_0x10.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 7, BBunk_0x10);

                Unit_Data BBunk_0x14 = (Unit_Data)unk_0x14.DeepClone();
                BBunk_0x14.Data_Hash.Hash        = 0xE8F8ABF1;
                BBunk_0x14.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBunk_0x14.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 8, BBunk_0x14);

                Unit_Data BBunk_0x18 = (Unit_Data)unk_0x18.DeepClone();
                BBunk_0x18.Data_Hash.Hash        = 0x3D74D196;
                BBunk_0x18.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == BBunk_0x18.Data_Hash.Hash).description;

                dataList.Insert(BBBCIndex + 9, BBunk_0x18);

                // For unknown Burst we need to add from the top, just reuse E burst's data for now.
                // Start from the end of Blast Burst's unk_0x30
                int EndOfBlastBurstIndex = dataList.FindIndex(x => x.Data_Hash.Hash == 0x3D74D196);

                Unit_Data E_Red_Lock_Melee         = dataList.FirstOrDefault(x => x.Data_Hash.Hash == 0x9872A871);
                Unit_Data unk_Burst_Red_Lock_Melee = new Unit_Data();
                unk_Burst_Red_Lock_Melee.Data_Hash.Hash        = 0xB196FF51;
                unk_Burst_Red_Lock_Melee.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_Burst_Red_Lock_Melee.Data_Hash.Hash).description;
                unk_Burst_Red_Lock_Melee.Data_Type_Enum        = E_Red_Lock_Melee.Data_Type_Enum;
                unk_Burst_Red_Lock_Melee.Data_Value            = E_Red_Lock_Melee.Data_Value;

                dataList.Insert(EndOfBlastBurstIndex + 1, unk_Burst_Red_Lock_Melee);

                Unit_Data E_Red_Lock         = dataList.FirstOrDefault(x => x.Data_Hash.Hash == 0xF9867B09);
                Unit_Data unk_Burst_Red_Lock = new Unit_Data();
                unk_Burst_Red_Lock.Data_Hash.Hash        = 0x22D98417;
                unk_Burst_Red_Lock.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_Burst_Red_Lock.Data_Hash.Hash).description;
                unk_Burst_Red_Lock.Data_Type_Enum        = E_Red_Lock.Data_Type_Enum;
                unk_Burst_Red_Lock.Data_Value            = E_Red_Lock.Data_Value;

                dataList.Insert(EndOfBlastBurstIndex + 2, unk_Burst_Red_Lock);

                Unit_Data E_Damage_Multiplier         = dataList.FirstOrDefault(x => x.Data_Hash.Hash == 0x10E5CA5B);
                Unit_Data unk_Burst_Damage_Multiplier = new Unit_Data();
                unk_Burst_Damage_Multiplier.Data_Hash.Hash        = 0x9187715B;
                unk_Burst_Damage_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_Burst_Damage_Multiplier.Data_Hash.Hash).description;
                unk_Burst_Damage_Multiplier.Data_Type_Enum        = E_Damage_Multiplier.Data_Type_Enum;
                unk_Burst_Damage_Multiplier.Data_Value            = E_Damage_Multiplier.Data_Value;

                dataList.Insert(EndOfBlastBurstIndex + 3, unk_Burst_Damage_Multiplier);

                Unit_Data E_Damage_Taken_Multiplier         = dataList.FirstOrDefault(x => x.Data_Hash.Hash == 0x1539CA4C);
                Unit_Data unk_Burst_Damage_Taken_Multiplier = new Unit_Data();
                unk_Burst_Damage_Taken_Multiplier.Data_Hash.Hash        = 0xFEF1E665;
                unk_Burst_Damage_Taken_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_Burst_Damage_Taken_Multiplier.Data_Hash.Hash).description;
                unk_Burst_Damage_Taken_Multiplier.Data_Type_Enum        = E_Damage_Taken_Multiplier.Data_Type_Enum;
                unk_Burst_Damage_Taken_Multiplier.Data_Value            = E_Damage_Taken_Multiplier.Data_Value;

                dataList.Insert(EndOfBlastBurstIndex + 4, unk_Burst_Damage_Taken_Multiplier);

                Unit_Data E_Mobility_Multiplier         = dataList.FirstOrDefault(x => x.Data_Hash.Hash == 0x778726A3);
                Unit_Data unk_Burst_Mobility_Multiplier = new Unit_Data();
                unk_Burst_Mobility_Multiplier.Data_Hash.Hash        = 0x9C4F0A8A;
                unk_Burst_Mobility_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_Burst_Mobility_Multiplier.Data_Hash.Hash).description;
                unk_Burst_Mobility_Multiplier.Data_Type_Enum        = E_Mobility_Multiplier.Data_Type_Enum;
                unk_Burst_Mobility_Multiplier.Data_Value            = E_Mobility_Multiplier.Data_Value;

                dataList.Insert(EndOfBlastBurstIndex + 5, unk_Burst_Mobility_Multiplier);

                Unit_Data E_Down_Value_Multiplier         = dataList.FirstOrDefault(x => x.Data_Hash.Hash == 0xAEA5ADC9);
                Unit_Data unk_Burst_Down_Value_Multiplier = new Unit_Data();
                unk_Burst_Down_Value_Multiplier.Data_Hash.Hash        = 0x2FC716C9;
                unk_Burst_Down_Value_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_Burst_Down_Value_Multiplier.Data_Hash.Hash).description;
                unk_Burst_Down_Value_Multiplier.Data_Type_Enum        = E_Down_Value_Multiplier.Data_Type_Enum;
                unk_Burst_Down_Value_Multiplier.Data_Value            = E_Down_Value_Multiplier.Data_Value;

                dataList.Insert(EndOfBlastBurstIndex + 6, unk_Burst_Down_Value_Multiplier);

                Unit_Data E_Boost_Consumption_Multiplier         = dataList.FirstOrDefault(x => x.Data_Hash.Hash == 0x372435B3);
                Unit_Data unk_Burst_Boost_Consumption_Multiplier = new Unit_Data();
                unk_Burst_Boost_Consumption_Multiplier.Data_Hash.Hash        = 0x6B97DED5;
                unk_Burst_Boost_Consumption_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unk_Burst_Boost_Consumption_Multiplier.Data_Hash.Hash).description;
                unk_Burst_Boost_Consumption_Multiplier.Data_Type_Enum        = E_Boost_Consumption_Multiplier.Data_Type_Enum;
                unk_Burst_Boost_Consumption_Multiplier.Data_Value            = E_Boost_Consumption_Multiplier.Data_Value;

                dataList.Insert(EndOfBlastBurstIndex + 7, unk_Burst_Boost_Consumption_Multiplier);

                Unit_Data unkBunk_1C = (Unit_Data)unk_1C.DeepClone();
                unkBunk_1C.Data_Hash.Hash        = 0x955B0EA3;
                unkBunk_1C.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBunk_1C.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 8, unkBunk_1C);

                Unit_Data unkBunk_20 = (Unit_Data)unk_20.DeepClone();
                unkBunk_20.Data_Hash.Hash        = 0x17B56AAF;
                unkBunk_20.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBunk_20.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 9, unkBunk_20);

                Unit_Data unkBDamage_Dealt_EX_Gauge_Increase_Multiplier = (Unit_Data)Damage_Dealt_EX_Gauge_Increase_Multiplier.DeepClone();
                unkBDamage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0x6AFDDA4;
                unkBDamage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBDamage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 10, unkBDamage_Dealt_EX_Gauge_Increase_Multiplier);

                Unit_Data unkBDamage_Taken_EX_Gauge_Increase_Multiplier = (Unit_Data)Damage_Taken_EX_Gauge_Increase_Multiplier.DeepClone();
                unkBDamage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0x1CB5995C;
                unkBDamage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBDamage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 11, unkBDamage_Taken_EX_Gauge_Increase_Multiplier);

                Unit_Data unkBunk_0x8 = (Unit_Data)unk_0x8.DeepClone();
                unkBunk_0x8.Data_Hash.Hash        = 0xDC6C99C1;
                unkBunk_0x8.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBunk_0x8.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 12, unkBunk_0x8);

                Unit_Data unkBunk_0xC = (Unit_Data)unk_0xC.DeepClone();
                unkBunk_0xC.Data_Hash.Hash        = 0x27AAECA6;
                unkBunk_0xC.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBunk_0xC.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 13, unkBunk_0xC);

                Unit_Data unkBunk_0x10 = (Unit_Data)unk_0x10.DeepClone();
                unkBunk_0x10.Data_Hash.Hash        = 0xA1DEFB23;
                unkBunk_0x10.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBunk_0x10.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 14, unkBunk_0x10);

                Unit_Data unkBunk_0x14 = (Unit_Data)unk_0x14.DeepClone();
                unkBunk_0x14.Data_Hash.Hash        = 0xFFD0CF31;
                unkBunk_0x14.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBunk_0x14.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 15, unkBunk_0x14);

                Unit_Data unkBunk_0x18 = (Unit_Data)unk_0x18.DeepClone();
                unkBunk_0x18.Data_Hash.Hash        = 0x5813EAD0;
                unkBunk_0x18.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkBunk_0x18.Data_Hash.Hash).description;

                dataList.Insert(EndOfBlastBurstIndex + 16, unkBunk_0x18);


                int Unk2BCIndex = dataList.FindIndex(x => x.Data_Hash.Hash == 0x372435B3);

                Unit_Data unkB2unk_1C = (Unit_Data)unk_1C.DeepClone();
                unkB2unk_1C.Data_Hash.Hash        = 0x9124A5C1;
                unkB2unk_1C.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2unk_1C.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 1, unkB2unk_1C);

                Unit_Data unkB2unk_20 = (Unit_Data)unk_20.DeepClone();
                unkB2unk_20.Data_Hash.Hash        = 0x4B0681C9;
                unkB2unk_20.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2unk_20.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 2, unkB2unk_20);

                Unit_Data unkB2Damage_Dealt_EX_Gauge_Increase_Multiplier = (Unit_Data)Damage_Dealt_EX_Gauge_Increase_Multiplier.DeepClone();
                unkB2Damage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0xAECA6071;
                unkB2Damage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2Damage_Dealt_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 3, unkB2Damage_Dealt_EX_Gauge_Increase_Multiplier);

                Unit_Data unkB2Damage_Taken_EX_Gauge_Increase_Multiplier = (Unit_Data)Damage_Taken_EX_Gauge_Increase_Multiplier.DeepClone();
                unkB2Damage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash        = 0x6D82D38C;
                unkB2Damage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2Damage_Taken_EX_Gauge_Increase_Multiplier.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 4, unkB2Damage_Taken_EX_Gauge_Increase_Multiplier);

                Unit_Data unkB2unk_0x8 = (Unit_Data)unk_0x8.DeepClone();
                unkB2unk_0x8.Data_Hash.Hash        = 0xA540F511;
                unkB2unk_0x8.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2unk_0x8.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 5, unkB2unk_0x8);

                Unit_Data unkB2unk_0xC = (Unit_Data)unk_0xC.DeepClone();
                unkB2unk_0xC.Data_Hash.Hash        = 0x5E868076;
                unkB2unk_0xC.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2unk_0xC.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 6, unkB2unk_0xC);

                Unit_Data unkB2unk_0x10 = (Unit_Data)unk_0x10.DeepClone();
                unkB2unk_0x10.Data_Hash.Hash        = 0x7A39B6B3;
                unkB2unk_0x10.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2unk_0x10.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 7, unkB2unk_0x10);

                Unit_Data unkB2unk_0x14 = (Unit_Data)unk_0x14.DeepClone();
                unkB2unk_0x14.Data_Hash.Hash        = 0x86FCA3E1;
                unkB2unk_0x14.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2unk_0x14.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 8, unkB2unk_0x14);

                Unit_Data unkB2unk_0x18 = (Unit_Data)unk_0x18.DeepClone();
                unkB2unk_0x18.Data_Hash.Hash        = 0x83F4A740;
                unkB2unk_0x18.Data_Hash.description = data_Hashes.FirstOrDefault(x => x.Hash == unkB2unk_0x18.Data_Hash.Hash).description;

                dataList.Insert(Unk2BCIndex + 9, unkB2unk_0x18);
            }

            fs.Close();
            string       JSON = JsonConvert.SerializeObject(unit_Varaibles, Formatting.Indented);
            StreamWriter sW   = File.CreateText(Properties.Settings.Default.outputUnitDataJSONPath + @"\UnitData.JSON");

            sW.Write(JSON);
            sW.Close();
        }