aboutsummaryrefslogtreecommitdiff
path: root/V3/Data/Internal/GameStateManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'V3/Data/Internal/GameStateManager.cs')
-rw-r--r--V3/Data/Internal/GameStateManager.cs81
1 files changed, 81 insertions, 0 deletions
diff --git a/V3/Data/Internal/GameStateManager.cs b/V3/Data/Internal/GameStateManager.cs
new file mode 100644
index 0000000..53ef3de
--- /dev/null
+++ b/V3/Data/Internal/GameStateManager.cs
@@ -0,0 +1,81 @@
+using System.Collections.Generic;
+using V3.Camera;
+using V3.Map;
+using V3.Objects;
+
+namespace V3.Data.Internal
+{
+ /// <summary>
+ /// Default implementation of IGameStateManager.
+ /// </summary>
+ // ReSharper disable once ClassNeverInstantiated.Global
+ internal sealed class GameStateManager : IGameStateManager
+ {
+ private readonly CameraManager mCameraManager;
+ private readonly CreatureFactory mCreatureFactory;
+ private readonly IMapManager mMapManager;
+ private readonly IObjectsManager mObjectsManager;
+
+ public GameStateManager(CameraManager cameraManager, CreatureFactory creatureFactory,
+ IMapManager mapManager, IObjectsManager objectsManager)
+ {
+ mCameraManager = cameraManager;
+ mCreatureFactory = creatureFactory;
+ mMapManager = mapManager;
+ mObjectsManager = objectsManager;
+ }
+
+ /// <summary>
+ /// Restores the given game state.
+ /// </summary>
+ public GameState GetGameState()
+ {
+ var gameState = new GameState();
+ foreach (var obj in mObjectsManager.CreatureList)
+ {
+ gameState.mCreatures.Add(obj.SaveData());
+ }
+ gameState.mCameraPosition = mCameraManager.GetCamera().Location;
+ return gameState;
+ }
+
+ /// <summary>
+ /// Restores the given game state.
+ /// </summary>
+ /// <param name="gameState">the game state to restore</param>
+ public void LoadGameState(GameState gameState)
+ {
+ mObjectsManager.Clear();
+ mObjectsManager.ImportMapObjects(mMapManager.GetObjects());
+ var creatures = new Dictionary<int, ICreature>();
+
+ // load creatures
+ foreach (var creatureData in gameState.mCreatures)
+ {
+ ICreature creature = mCreatureFactory.CreateCreature(creatureData.Type, creatureData.Id);
+ if (creature == null)
+ continue;
+ creature.LoadData(creatureData);
+ if (creature is Necromancer)
+ mObjectsManager.CreatePlayerCharacter((Necromancer) creature);
+ else if (creature is King) // || creature is Prince
+ mObjectsManager.CreateBoss(creature);
+ else
+ mObjectsManager.CreateCreature(creature);
+
+ creatures.Add(creature.Id, creature);
+ }
+
+ // fix references
+ foreach (var creatureData in gameState.mCreatures)
+ {
+ if (!creatures.ContainsKey(creatureData.Id))
+ continue;
+ creatures[creatureData.Id].LoadReferences(creatureData, creatures);
+ }
+
+ if (mCameraManager.GetCamera() is CameraScrolling)
+ mCameraManager.GetCamera().Location = gameState.mCameraPosition;
+ }
+ }
+}