using System; using System.Collections.Generic; using System.IO; namespace NHSE.Core { /// /// Logic for dumping decrypted game files. /// /// public static class GameFileDumper { /// /// Dumps a copy of the 's files in their decrypted state to the requested . /// /// Save Data to dump /// Path to dump to public static void Dump(this HorizonSave sav, string path) { sav.Main.Dump(path); foreach (var p in sav.Players) { var dir = Path.Combine(path, p.DirectoryName); p.Dump(dir); } } /// /// Dumps a copy of the 's files in their decrypted state to the requested . /// /// Save Data to dump /// Path to dump to public static void Dump(this Player player, string path) { foreach (var pair in player) pair.Dump(path); } /// /// Dumps a copy of the 's files in their decrypted state to the requested . /// /// Save Data to dump /// Path to dump to public static void Dump(this EncryptedFilePair pair, string path) { Dump(path, pair.Data, pair.NameData); } private static void Dump(string path, byte[] data, string name) { Directory.CreateDirectory(path); var file = Path.Combine(path, name); File.WriteAllBytes(file, data); } /// /// Dumps all villager houses to the requested . /// /// /// /// Path to dump to public static void DumpPlayerHouses(this IReadOnlyList houses, IReadOnlyList players, string path) { for (int i = 0; i < houses.Count; i++) { var filename = i < players.Count ? players[i].Personal.PlayerName : $"House {i}"; houses[i].Dump(filename, path); } } /// /// Dumps all villager houses to the requested . /// /// Save Data to dump from /// Path to dump to public static void DumpPlayerHouses(this HorizonSave sav, string path) { var count = Math.Min(sav.Players.Length, MainSaveOffsets.PlayerCount); for (int i = 0; i < count; i++) { var p = sav.Players[i]; var h = sav.Main.GetPlayerHouse(i); h.Dump(path, p.Personal); } } private static void Dump(this PlayerHouse h, string path, IVillagerOrigin p) => h.Dump(p.PlayerName, path); private static void Dump(this PlayerHouse h, string player, string path) { var dest = Path.Combine(path, $"{player}.nhph"); var data = h.Data; File.WriteAllBytes(dest, data); } /// /// Dumps all villager houses to the requested . /// /// Save Data to dump from /// Path to dump to public static void DumpVillagerHouses(this MainSave sav, string path) { for (int i = 0; i < MainSaveOffsets.VillagerCount; i++) { var v = sav.GetVillager(i); var h = sav.GetVillagerHouse(i); h.Dump(path, v); } } private static void Dump(this VillagerHouse h, string path, Villager v) { var name = GameInfo.Strings.GetVillager(v.InternalName); var dest = Path.Combine(path, $"{name}.nhvh"); var data = h.Data; File.WriteAllBytes(dest, data); } /// /// Dumps all villagers to the requested . /// /// Data to dump from /// Path to dump to public static void Dump(this IEnumerable villagers, string path) { foreach (var v in villagers) v.Dump(path); } private static void Dump(this Villager v, string path) { var name = GameInfo.Strings.GetVillager(v.InternalName); var dest = Path.Combine(path, $"{name}.nhv"); File.WriteAllBytes(dest, v.Data); } /// /// Dumps all designs to the requested . /// /// Save Data to dump from /// Path to dump to public static void DumpDesigns(this MainSave sav, string path) { for (int i = 0; i < MainSaveOffsets.PatternCount; i++) sav.GetDesign(i).Dump(path); } /// /// Dumps all designs to the requested . /// /// Patterns to dump /// Path to dump to public static void Dump(this IEnumerable patterns, string path) { foreach (var dp in patterns) dp.Dump(path); } private static void Dump(this DesignPattern dp, string path) { var name = dp.DesignName; var fn = StringUtil.CleanFileName($"{name}.nhd"); var dest = Path.Combine(path, fn); File.WriteAllBytes(dest, dp.Data); } /// /// Dumps all designs to the requested . /// /// Save Data to dump from /// Path to dump to public static void DumpDesignsPRO(this MainSave sav, string path) { for (int i = 0; i < MainSaveOffsets.PatternCount; i++) sav.GetDesignPRO(i).Dump(path); } /// /// Dumps all designs to the requested . /// /// Patterns to dump /// Path to dump to public static void Dump(this IEnumerable patterns, string path) { foreach (var dp in patterns) dp.Dump(path); } private static void Dump(this DesignPatternPRO dp, string path) { var name = dp.DesignName; var fn = StringUtil.CleanFileName($"{name}.nhpd"); var dest = Path.Combine(path, fn); File.WriteAllBytes(dest, dp.Data); } } }