aboutsummaryrefslogtreecommitdiff
path: root/V3/Data/Internal/SaveGameManager.cs
blob: 1c52b50fcfb155a1e244dd8fa992da8de56a6f02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Xml.Serialization;

namespace V3.Data.Internal
{
    /// <summary>
    /// Default implementation if ISaveGameManager.
    /// </summary>
    // ReSharper disable once ClassNeverInstantiated.Global
    internal sealed class SaveGameManager : ISaveGameManager
    {
        private readonly IPathManager mPathManager;

        private const int CurrentVersion = 1;
        private readonly XmlSerializer mFormatter = new XmlSerializer(typeof(SaveGame));

        /// <summary>
        /// Creates a new SaveGameManager. The save game directory must already
        /// be created.
        /// </summary>
        public SaveGameManager(IPathManager pathManager)
        {
            mPathManager = pathManager;
        }

        /// <summary>
        /// Creates and persists a new save game of the given data with the
        /// title.
        /// </summary>
        /// <param name="gameState">the data to store</param>
        public void CreateSaveGame(GameState gameState)
        {
            var saveGame = new SaveGame(DateTime.Now, CurrentVersion, gameState);
            var fileName = GetUniqueFileName();
            var stream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
            mFormatter.Serialize(stream, saveGame);
            stream.Close();
        }

        /// <summary>
        /// Loads all available save games and returns them ordered by the
        /// creation date.
        /// </summary>
        /// <returns>a list of all available save games, orderd by creation
        /// data</returns>
        public List<ISaveGame> GetSaveGames()
        {
            var saveGames = new List<ISaveGame>();
            foreach (var file in Directory.GetFiles(mPathManager.SaveGameDirectory))
            {
                var stream = new FileStream(file, FileMode.Open, FileAccess.Read);
                try
                {
                    var saveGame = (ISaveGame)mFormatter.Deserialize(stream);
                    if (saveGame.Version == CurrentVersion)
                        saveGames.Add(saveGame);
                }
                catch (SerializationException)
                {
                    // ignore so far
                }
                stream.Close();
            }
            saveGames.Sort();
            return saveGames;
        }

        private string GetUniqueFileName()
        {
            var index = 1;
            var fileName = GetFileName(index);
            while (File.Exists(fileName))
            {
                index++;
                fileName = GetFileName(index);
            }
            return fileName;
        }

        private string GetFileName(int index)
        {
            return $"{mPathManager.SaveGameDirectory}/{index:000}.xml";
        }
    }
}