blob: 53ef3de1ff9d989bef6b42962ea7e546360bfb2b (
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
|
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;
}
}
}
|