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);
        }