using System.Collections.Generic;
using V3.Camera;
using V3.Map;
using V3.Objects;
namespace V3.Data.Internal
{
///
/// Default implementation of IGameStateManager.
///
// 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;
}
///
/// Restores the given game state.
///
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;
}
///
/// Restores the given game state.
///
/// the game state to restore
public void LoadGameState(GameState gameState)
{
mObjectsManager.Clear();
mObjectsManager.ImportMapObjects(mMapManager.GetObjects());
var creatures = new Dictionary();
// 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;
}
}
}