public List <Unit_Files_List> parse_Unit_Files_List_FB(string path) { FileStream fs = File.OpenRead(path); List <Unit_Files_List> unit_Files_List = new List <Unit_Files_List>(); while (fs.Position < fs.Length) { Unit_Files_List unit_files = new Unit_Files_List(); unit_files.Unit_ID = readUIntBigEndian(fs); unit_files.dummy_PAC_hash = readUIntBigEndian(fs); unit_files.data_and_script_PAC_hash = readUIntBigEndian(fs); unit_files.model_and_texture_PAC_hash = readUIntBigEndian(fs); unit_files.animation_OMO_PAC_hash = readUIntBigEndian(fs); unit_files.effects_EIDX_PAC_hash = readUIntBigEndian(fs); unit_files.sound_effect_PAC_hash = readUIntBigEndian(fs); unit_files.global_pilot_voices_PAC_hash = readUIntBigEndian(fs); unit_files.weapon_image_DNSO_PAC_hash = readUIntBigEndian(fs); unit_files.sortie_and_awakening_sprites_PAC_hash = readUIntBigEndian(fs); unit_files.sortie_mouth_anim_enum_KPKP_PAC_hash = readUIntBigEndian(fs); unit_files.voice_file_list_PAC_hash = readUIntBigEndian(fs); unit_files.local_pilot_voices_STREAM_PAC_hash = readUIntBigEndian(fs); unit_Files_List.Add(unit_files); } fs.Close(); return(unit_Files_List); }
public List <Unit_Files_List> parse_Unit_Files_List_MBON(string path) { FileStream fs = File.OpenRead(path); List <Unit_Files_List> unit_Files_List = new List <Unit_Files_List>(); while (fs.Position < fs.Length) { Unit_Files_List unit_files = new Unit_Files_List(); unit_files.Unit_ID = readUIntBigEndian(fs); unit_files.dummy_PAC_hash = readUIntBigEndian(fs); unit_files.data_and_script_PAC_hash = readUIntBigEndian(fs); uint BABB1 = readUIntBigEndian(fs); uint BABB2 = readUIntBigEndian(fs); unit_files.model_and_texture_PAC_hash = readUIntBigEndian(fs); unit_files.animation_OMO_PAC_hash = readUIntBigEndian(fs); unit_files.effects_EIDX_PAC_hash = readUIntBigEndian(fs); uint FFFF1 = readUIntBigEndian(fs); if (FFFF1 != 0xFFFFFFFF) { throw new Exception(); } uint FFFF2 = readUIntBigEndian(fs); if (FFFF2 != 0xFFFFFFFF) { throw new Exception(); } unit_files.weapon_image_DNSO_PAC_hash = readUIntBigEndian(fs); uint unknownHash = readUIntBigEndian(fs); unit_files.sortie_mouth_anim_enum_KPKP_PAC_hash = readUIntBigEndian(fs); uint FFFF3 = readUIntBigEndian(fs); if (FFFF3 != 0xFFFFFFFF) { throw new Exception(); } uint FFFF4 = readUIntBigEndian(fs); if (FFFF4 != 0xFFFFFFFF) { throw new Exception(); } unit_Files_List.Add(unit_files); } fs.Close(); return(unit_Files_List); }
public void extractNPCImages() { string totalMBONExportFolder = @"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\Total MBON Export"; List <string> allUnitFolders = Directory.GetDirectories(totalMBONExportFolder, "*", SearchOption.TopDirectoryOnly).ToList(); string json = File.OpenText(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\AllUnitsPACHashes.json").ReadToEnd(); List <Unit_Files_List> unit_Files_List = JsonConvert.DeserializeObject <List <Unit_Files_List> >(json); json = File.OpenText(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\Unit List MBON.json").ReadToEnd(); List <Unit_Info_List> unit_Info_List = JsonConvert.DeserializeObject <List <Unit_Info_List> >(json); List <string> allbossunitimagesfolder = Directory.GetDirectories(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Extract\Output\MBON\v2\All Boss Unit Image & Sound Effects", "*", SearchOption.TopDirectoryOnly).ToList(); foreach (string unitFolder in allUnitFolders) { string unitFolderName = Path.GetFileName(unitFolder.TrimEnd(Path.DirectorySeparatorChar)); int unit_ID_str_index = unitFolderName.IndexOf("- "); string unit_ID_str = string.Empty; if (unit_ID_str_index >= 0) { unit_ID_str = unitFolderName.Substring(unit_ID_str_index + 2, unitFolderName.Length - unit_ID_str_index - 2); } uint unit_ID = Convert.ToUInt32(unit_ID_str); Unit_Files_List unit_Files = unit_Files_List.FirstOrDefault(x => x.Unit_ID == unit_ID); Unit_Info_List unit_Infos = unit_Info_List.FirstOrDefault(x => x.unit_ID == unit_ID); if (unit_ID >= 0x13880 && unit_ID <= 0x13a00) { if (unit_Files != null && unit_Files.MBONAdded) // Bosses { // Sound Effects string BossFolder = allbossunitimagesfolder.FirstOrDefault(s => s.Contains(unit_ID.ToString())); string arcadeUnitSpriteFolder = Directory.GetDirectories(BossFolder, "*", SearchOption.TopDirectoryOnly).FirstOrDefault(s => Path.GetFileName(s).Contains("Arcade Sprite")); string arcadeUnitSprite = arcadeUnitSpriteFolder + @"\001-MBON\002.dds"; string arcadePilotSpriteFolder = Directory.GetDirectories(BossFolder, "*", SearchOption.TopDirectoryOnly).FirstOrDefault(s => Path.GetFileName(s).Contains("Arcade Sprite")); string arcadePilotSprite = arcadePilotSpriteFolder + @"\001-MBON\002.dds"; if (!File.Exists(arcadeUnitSprite)) { throw new Exception(); } string extractedExportArcadeFolder = unitFolder + @"\Extracted MBON\Arcade_Sprites - " + unit_Infos.arcade_selection_sprite_costume_1_hash; string extractedExportFreeBattleSelectionFolder = unitFolder + @"\Extracted MBON\Free_Battle_Selection_Sprite_Costume_1 - " + unit_Infos.free_battle_selection_sprite_costume_1_hash; string extractedExportInGameSortieFolder = unitFolder + @"\Extracted MBON\In_Game_Sortie_and_Awakening_Sprite_Costume_1 - " + unit_Files.sortie_and_awakening_sprites_PAC_hash; string extractedExportLoadingAllyFolder = unitFolder + @"\Extracted MBON\Loading_Ally_Sprite_Costume_1 - " + unit_Infos.loading_ally_sprite_costume_1_hash; string extractedExportLoadingEnemyFolder = unitFolder + @"\Extracted MBON\Loading_Enemy_Sprite_Costume_1 - " + unit_Infos.loading_enemy_sprite_costume_1_hash; string extractedExportLoadingEnemyTargetPilotFolder = unitFolder + @"\Extracted MBON\Loading_Enemy_Target_Pilot_Sprite_Costume_1 - " + unit_Infos.loading_enemy_target_pilot_sprite_costume_1_hash; string extractedExportLoadingEnemyTargetUnitFolder = unitFolder + @"\Extracted MBON\Loading_Enemy_Target_Unit_Sprite_Costume_1 - " + unit_Infos.loading_enemy_target_unit_sprite_costume_1_hash; string extractedExportFigurineSpriteFolder = unitFolder + @"\Extracted MBON\Figurine_Sprite - " + unit_Infos.figurine_sprite_hash; string extractedExportResultSmallSpriteFolder = unitFolder + @"\Extracted MBON\Result_Small_Sprite - " + unit_Infos.result_small_sprite_hash; string extractedExportTargetSmallSpriteFolder = unitFolder + @"\Extracted MBON\Target_Small_Sprite - " + unit_Infos.figurine_sprite_hash; Directory.CreateDirectory(extractedExportArcadeFolder); Directory.CreateDirectory(extractedExportFreeBattleSelectionFolder); Directory.CreateDirectory(extractedExportInGameSortieFolder); Directory.CreateDirectory(extractedExportLoadingAllyFolder); Directory.CreateDirectory(extractedExportLoadingEnemyFolder); Directory.CreateDirectory(extractedExportLoadingEnemyTargetPilotFolder); Directory.CreateDirectory(extractedExportLoadingEnemyTargetUnitFolder); Directory.CreateDirectory(extractedExportFigurineSpriteFolder); Directory.CreateDirectory(extractedExportResultSmallSpriteFolder); Directory.CreateDirectory(extractedExportTargetSmallSpriteFolder); resize_dds_precise(arcadeUnitSprite, extractedExportArcadeFolder + @"\arcade_unit.dds", 0, true, 1280, 720); } } } }
public void extractNPCSounds() { string totalMBONExportFolder = @"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\Total MBON Export"; List <string> allUnitFolders = Directory.GetDirectories(totalMBONExportFolder, "*", SearchOption.TopDirectoryOnly).ToList(); string json = File.OpenText(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\AllUnitsPACHashes.json").ReadToEnd(); List <Unit_Files_List> unit_Files_List = JsonConvert.DeserializeObject <List <Unit_Files_List> >(json); List <string> allbossunitsoundeffectsfolder = Directory.GetDirectories(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Extract\Output\MBON\v2\All Boss Unit Image & Sound Effects", "*", SearchOption.TopDirectoryOnly).ToList(); foreach (string unitFolder in allUnitFolders) { string unitFolderName = Path.GetFileName(unitFolder.TrimEnd(Path.DirectorySeparatorChar)); int unit_ID_str_index = unitFolderName.IndexOf("- "); string unit_ID_str = string.Empty; if (unit_ID_str_index >= 0) { unit_ID_str = unitFolderName.Substring(unit_ID_str_index + 2, unitFolderName.Length - unit_ID_str_index - 2); } uint unit_ID = Convert.ToUInt32(unit_ID_str); Unit_Files_List unit_Files = unit_Files_List.FirstOrDefault(x => x.Unit_ID == unit_ID); if (unit_ID >= 0x13880 && unit_ID <= 0x13a00) { if (unit_Files != null && unit_Files.MBONAdded) // Bosses { // Sound Effects string BossFolder = allbossunitsoundeffectsfolder.FirstOrDefault(s => s.Contains(unit_ID.ToString())); string SEFolder = Directory.GetDirectories(BossFolder, "*", SearchOption.TopDirectoryOnly).FirstOrDefault(s => Path.GetFileName(s).Contains("Sound Effect")); string SE = SEFolder + @"\001-MBON\002.nus3bank"; if (!File.Exists(SE)) { throw new Exception(); } string reimportSEFolder = unitFolder + @"\Extracted MBON\Sound Effects"; Directory.CreateDirectory(reimportSEFolder); File.Copy(SE, unitFolder + @"\Extracted MBON\Sound Effect.nus3bank", true); convertNUS3toWav(SE, reimportSEFolder); // Local Voice Files List <string> nus3AudioVoiceFiles = Directory.GetFiles(unitFolder + @"\Extracted MBON", "*.nus3audio", SearchOption.TopDirectoryOnly).ToList(); string LocalVoiceFile = nus3AudioVoiceFiles.FirstOrDefault(s => Path.GetFileName(s).Contains("Local Voice Files")); if (!File.Exists(LocalVoiceFile)) { throw new Exception(); } string reimportLVFFolder = unitFolder + @"\Extracted MBON\Local Voice Files"; Directory.CreateDirectory(reimportLVFFolder); convertNUS3toWav(LocalVoiceFile, reimportLVFFolder); // Global Voice Files string GlobalVoiceFile = nus3AudioVoiceFiles.FirstOrDefault(s => Path.GetFileName(s).Contains("Global Voice Files")); if (!File.Exists(GlobalVoiceFile)) { throw new Exception(); } string reimportGVFFolder = unitFolder + @"\Extracted MBON\Global Voice Files"; Directory.CreateDirectory(reimportGVFFolder); convertNUS3toWav(GlobalVoiceFile, reimportGVFFolder); } } } }
public recompilescript() { List <string> allUnitFolders = Directory.GetDirectories(totalMBONExportFolder, "*", SearchOption.TopDirectoryOnly).ToList(); string json = File.OpenText(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\AllUnitsPACHashes.json").ReadToEnd(); List <Unit_Files_List> unit_Files_List = JsonConvert.DeserializeObject <List <Unit_Files_List> >(json); foreach (string unitFolder in allUnitFolders) { string unitFolderName = Path.GetFileName(unitFolder.TrimEnd(Path.DirectorySeparatorChar)); string extractMBONFolder = unitFolder + @"\Extracted MBON"; string reimportFolder = XBReimportFolder + @"\" + unitFolderName; string reimportConvertedfromMBONFolder = XBReimportFolder + @"\" + unitFolderName + @"\" + "Converted from MBON"; string reimportFilestoRepack = XBReimportFolder + @"\" + unitFolderName + @"\" + "Files to Repack"; string reimportRepackedFiles = XBReimportFolder + @"\" + unitFolderName + @"\" + "Repacked Files"; Directory.CreateDirectory(reimportFolder); Directory.CreateDirectory(reimportConvertedfromMBONFolder); Directory.CreateDirectory(reimportFilestoRepack); Directory.CreateDirectory(reimportRepackedFiles); Match unitNoMatch = Regex.Match(unitFolder, @"([0-9]{1,100}). "); string unitNoStr = unitNoMatch.Groups[0].Captures[0].Value; uint.TryParse(unitNoStr, out uint unitNo); int unit_ID_str_index = unitFolderName.IndexOf("- "); string unit_ID_str = string.Empty; if (unit_ID_str_index >= 0) { unit_ID_str = unitFolderName.Substring(unit_ID_str_index + 2, unitFolderName.Length - unit_ID_str_index - 2); } uint unit_ID = Convert.ToUInt32(unit_ID_str); Unit_Files_List unit_Files = unit_Files_List.FirstOrDefault(x => x.Unit_ID == unit_ID); if (unit_ID < 59900 && unit_Files != null && !unit_Files.MBONAdded && unit_ID == 13921) { List <string> script1Folder = Directory.GetDirectories(extractMBONFolder, "*", SearchOption.TopDirectoryOnly).ToList(); script1Folder = script1Folder.Where(x => x.Contains("Script 1")).ToList(); if (script1Folder.Count() == 0 || script1Folder.Count() > 0x1) { throw new Exception(); } List <string> dataFolder = Directory.GetDirectories(extractMBONFolder, "*", SearchOption.TopDirectoryOnly).ToList(); dataFolder = dataFolder.Where(x => x.Contains("Data")).ToList(); if (dataFolder.Count() == 0 || dataFolder.Count() > 0x1) { throw new Exception(); } string script1 = script1Folder[0]; string data = dataFolder[0]; // -------------------------------------------- Script Refactor -------------------------------------------- Properties.Settings.Default.BABBFilePath = script1 + @"\001-FHM\002.bin"; Properties.Settings.Default.outputScriptFolderPath = XBScriptFolder + @"\Refactored Script"; Properties.Settings.Default.scriptBigEndian = false; Properties.Settings.Default.CScriptFilePath = XBScriptFolder + @"\Script\" + unitFolderName + @".c"; Properties.Settings.Default.MinScriptPointer = 100000; compileMSCwithFix(unitFolderName); repackData( reimportRepackedFiles, reimportFilestoRepack, unitFolderName, data, reimportConvertedfromMBONFolder, unit_Files ); } } }
public void repackData( string reimportRepackedFiles, string reimportFilestoRepack, string unitFolderName, string data, string reimportConvertedfromMBONFolder, Unit_Files_List unit_Files ) { RepackPAC repackInstance = new RepackPAC(Properties.Settings.Default.OutputRepackPAC); Properties.Settings.Default.OutputRepackPAC = reimportRepackedFiles; string data_folder_path = reimportFilestoRepack + @"\Data - " + unit_Files.data_and_script_PAC_hash.ToString("X8"); Directory.CreateDirectory(data_folder_path); /// Repack Data Folder DirectoryCopy(repackTemplates + @"\Data", data_folder_path, true); string data_001FHM_path = data_folder_path + @"\001-FHM\"; FileStream fs002 = File.Create(data_001FHM_path + @"\002.bin"); FileStream vardataFS = File.OpenRead(reimportConvertedfromMBONFolder + @"\Unit Variables\UnitData.bin"); vardataFS.Seek(0, SeekOrigin.Begin); vardataFS.CopyTo(fs002); fs002.Close(); vardataFS.Close(); FileStream fs003 = File.Create(data_001FHM_path + @"\003.bin"); FileStream MBON003FS = File.OpenRead(data + @"\001-FHM\003.bin"); MBON003FS.Seek(0, SeekOrigin.Begin); MBON003FS.CopyTo(fs003); fs003.Close(); MBON003FS.Close(); FileStream fs005 = File.Create(data_001FHM_path + @"\005.bin"); FileStream MBON005FS = File.OpenRead(data + @"\001-FHM\005.bin"); MBON005FS.Seek(0, SeekOrigin.Begin); MBON005FS.CopyTo(fs005); fs005.Close(); MBON005FS.Close(); FileStream fs006 = File.Create(data_001FHM_path + @"\006.bin"); FileStream mscFS = File.OpenRead(XBScriptFolder + @"\Compiled Refactored Script\" + unitFolderName + ".mscsb"); mscFS.Seek(0, SeekOrigin.Begin); mscFS.CopyTo(fs006); fs006.Close(); mscFS.Close(); FileStream fs008 = File.Create(data_001FHM_path + @"\008.bin"); FileStream voicelogicFS = File.OpenRead(reimportConvertedfromMBONFolder + @"\Voice Data\006.bin"); voicelogicFS.Seek(0, SeekOrigin.Begin); voicelogicFS.CopyTo(fs008); fs008.Close(); voicelogicFS.Close(); Properties.Settings.Default.OpenRepackPath = data_folder_path; repackInstance.initializePACInfoFileRepack(); repackInstance.parseInfo(); repackInstance.repackPAC(); // Get unit's english name UnitIDList unit_Infos = load_UnitID(); string unitName = unit_Infos.Unit_ID.FirstOrDefault(s => s.id == unit_Files.Unit_ID).name_english.Replace(" ", "_"); unitName = unitName.Replace(".", "_"); unitName = unitName.Replace("∀", "Turn_A"); string basePsarcRepackFolder = XBCombinedPsarcFolder + @"\Units\FB_Units\" + unitName; string[] allRepackedPACs = Directory.GetFiles(reimportRepackedFiles, "*", SearchOption.TopDirectoryOnly); string Data_Path = basePsarcRepackFolder + @"\Data\PATCH" + unit_Files.data_and_script_PAC_hash.ToString("X8") + ".PAC"; FileStream dataFS = File.OpenRead(allRepackedPACs.FirstOrDefault(s => s.Contains("Data"))); dataFS.Seek(0, SeekOrigin.Begin); FileStream newDataFS = File.Create(Data_Path); dataFS.CopyTo(newDataFS); dataFS.Close(); newDataFS.Close(); }
public Parse_Unit_Files_List() { List <Unit_Files_List> FB_List = parse_Unit_Files_List_FB(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\list_fb.bin"); List <Unit_Files_List> MBON_List = parse_Unit_Files_List_MBON(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\big_endian_list.bin"); List <Unit_Files_List> Combined_List = new List <Unit_Files_List>(); UnitIDList unitIDList = load_UnitID(); List <UnitID> unit_ID_List = unitIDList.Unit_ID; StringBuilder MBONlog = new StringBuilder(); MBONlog.AppendLine("MBON PAC Hashes"); foreach (var MBON in MBON_List) { if (FB_List.Any(x => x.Unit_ID == MBON.Unit_ID)) { Unit_Files_List FBUnit = FB_List.FirstOrDefault(x => x.Unit_ID == MBON.Unit_ID); FBUnit.MBONAdded = false; Combined_List.Add(FBUnit); } else { if (unit_ID_List.Any(x => x.id == MBON.Unit_ID)) { UnitID unit = unit_ID_List.FirstOrDefault(x => x.id == MBON.Unit_ID); MBONlog.AppendLine(@"//----------------------- " + unit.name_english + @"-----------------------//"); // Manually add own made hashes to newly added MBON units Crc32 crc32 = new Crc32(); string sound_effect_str = unit.name_english + "_sound_effects"; string sound_effect_hash = crc32.Get(Encoding.UTF8.GetBytes(sound_effect_str.ToLower())).ToString("X8"); MBONlog.AppendLine(sound_effect_str + " - 0x" + sound_effect_hash); uint.TryParse(sound_effect_hash, out uint result); MBON.sound_effect_PAC_hash = result; string global_pilot_voices_str = unit.name_english + "_global_pilot_voices"; string global_pilot_voices_hash = crc32.Get(Encoding.UTF8.GetBytes(global_pilot_voices_str.ToLower())).ToString("X8"); MBONlog.AppendLine(global_pilot_voices_str + " - 0x" + global_pilot_voices_hash); uint.TryParse(global_pilot_voices_hash, out result); MBON.global_pilot_voices_PAC_hash = result; string sortie_and_awakening_sprites_costume_1_str = unit.name_english + "_sortie_and_awakening_sprites_costume_1"; string sortie_and_awakening_sprites_costume_1_hash = crc32.Get(Encoding.UTF8.GetBytes(sortie_and_awakening_sprites_costume_1_str.ToLower())).ToString("X8"); MBONlog.AppendLine(sortie_and_awakening_sprites_costume_1_str + " - 0x" + sortie_and_awakening_sprites_costume_1_hash); uint.TryParse(sortie_and_awakening_sprites_costume_1_hash, out result); MBON.sortie_and_awakening_sprites_PAC_hash = result; string global_pilot_voice_file_list_str = unit.name_english + "_global_pilot_voice_file_list"; string global_pilot_voice_file_list_hash = crc32.Get(Encoding.UTF8.GetBytes(global_pilot_voice_file_list_str.ToLower())).ToString("X8"); MBONlog.AppendLine(global_pilot_voice_file_list_str + " - 0x" + global_pilot_voice_file_list_hash); uint.TryParse(global_pilot_voice_file_list_hash, out result); MBON.voice_file_list_PAC_hash = result; string local_pilot_voices_str = unit.name_english + "_global_pilot_voices"; string local_pilot_voices_hash = crc32.Get(Encoding.UTF8.GetBytes(local_pilot_voices_str.ToLower())).ToString("X8"); MBONlog.AppendLine(local_pilot_voices_str + " - 0x" + local_pilot_voices_hash); uint.TryParse(local_pilot_voices_hash, out result); MBON.local_pilot_voices_STREAM_PAC_hash = result; MBON.MBONAdded = true; Combined_List.Add(MBON); } } } StreamWriter streamWriter = File.CreateText(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\GeneratedMBONPACHashes.txt"); streamWriter.Write(MBONlog.ToString()); streamWriter.Close(); string json = JsonConvert.SerializeObject(Combined_List, Formatting.Indented); StreamWriter jsonSW = File.CreateText(@"D:\Games\PS3\EXVSFB JPN\Pkg research\FB Repacker\Repack\PAC\Input\MBON Reimport Project\AllUnitsPACHashes.json"); jsonSW.Write(json); jsonSW.Close(); }