void SaveToPath(string path, SavegameOutputFiles savegameFiles, int saveSlot, IFileContainer savesContainer) { void WriteFile(string name, IDataWriter writer) { var fullPath = Path.Combine(path, name); Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); File.WriteAllBytes(fullPath, writer.ToArray()); } void WriteFiles(string name, Dictionary <int, IDataWriter> writers) { var output = new DataWriter(); FileWriter.WriteContainer(output, writers.ToDictionary(w => (uint)w.Key, w => w.Value.ToArray()), FileType.AMBR); File.WriteAllBytes(Path.Combine(path, name), output.ToArray()); } WriteFile($"Save.{saveSlot:00}/Party_data.sav", savegameFiles.SaveDataWriter); WriteFiles($"Save.{saveSlot:00}/Party_char.amb", savegameFiles.PartyMemberDataWriters); WriteFiles($"Save.{saveSlot:00}/Chest_data.amb", savegameFiles.ChestDataWriters); WriteFiles($"Save.{saveSlot:00}/Merchant_data.amb", savegameFiles.MerchantDataWriters); WriteFiles($"Save.{saveSlot:00}/Automap.amb", savegameFiles.AutomapDataWriters); var savesWriter = new DataWriter(); FileWriter.Write(savesWriter, savesContainer); File.WriteAllBytes(Path.Combine(path, "Saves"), savesWriter.ToArray()); }
public SavegameOutputFiles Write(Savegame savegame) { var files = new SavegameOutputFiles(); var partyMemberWriter = new Characters.PartyMemberWriter(); var chestWriter = new ChestWriter(); var merchantWriter = new MerchantWriter(); var automapWriter = new AutomapWriter(); Dictionary <int, IDataWriter> WriteContainer <T>(Dictionary <uint, T> collection, Action <IDataWriter, T> writer) { var container = new Dictionary <int, IDataWriter>(collection.Count); foreach (var item in collection) { var valueWriter = new DataWriter(); writer(valueWriter, item.Value); container.Add((int)item.Key, valueWriter); } return(container); } files.PartyMemberDataWriters = WriteContainer(savegame.PartyMembers, (w, p) => partyMemberWriter.WritePartyMember(p, w)); files.ChestDataWriters = WriteContainer(savegame.Chests, (w, c) => chestWriter.WriteChest(c, w)); files.MerchantDataWriters = WriteContainer(savegame.Merchants, (w, m) => merchantWriter.WriteMerchant(m, w)); files.AutomapDataWriters = WriteContainer(savegame.Automaps, (w, a) => automapWriter.WriteAutomap(a, w)); files.SaveDataWriter = new DataWriter(); WriteSaveData(savegame, files.SaveDataWriter); return(files); }
void SaveToGameData(IGameData gameData, SavegameOutputFiles savegameFiles, int saveSlot) { void WriteSingleFile(string name, IDataWriter writer) { if (!gameData.Files.ContainsKey(name)) { gameData.Files.Add(name, FileReader.CreateRawFile(name, writer.ToArray())); } else { gameData.Files[name].Files[1] = new DataReader(writer.ToArray()); } } void WriteFile(string name, IDataWriter writer, int fileIndex) { if (!gameData.Files.ContainsKey(name)) { gameData.Files.Add(name, FileReader.CreateRawContainer(name, new Dictionary <int, byte[]> { { fileIndex, writer.ToArray() } })); } else { gameData.Files[name].Files[fileIndex] = new DataReader(writer.ToArray()); } } void WriteFiles(string name, Dictionary <int, IDataWriter> writers) { foreach (var writer in writers) { WriteFile(name, writer.Value, writer.Key); } } WriteSingleFile($"Save.{saveSlot:00}/Party_data.sav", savegameFiles.SaveDataWriter); WriteFiles($"Save.{saveSlot:00}/Party_char.amb", savegameFiles.PartyMemberDataWriters); WriteFiles($"Save.{saveSlot:00}/Chest_data.amb", savegameFiles.ChestDataWriters); WriteFiles($"Save.{saveSlot:00}/Merchant_data.amb", savegameFiles.MerchantDataWriters); WriteFiles($"Save.{saveSlot:00}/Automap.amb", savegameFiles.AutomapDataWriters); }