mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
160 lines
5.2 KiB
C#
160 lines
5.2 KiB
C#
|
using Microsoft.Xna.Framework;
|
|||
|
using Microsoft.Xna.Framework.Graphics;
|
|||
|
using ProjectZ.InGame.Map;
|
|||
|
using ProjectZ.InGame.SaveLoad;
|
|||
|
using ProjectZ.InGame.Things;
|
|||
|
using System;
|
|||
|
using System.Threading;
|
|||
|
|
|||
|
namespace ProjectZ.InGame.GameSystems
|
|||
|
{
|
|||
|
class MapShowSystem : GameSystem
|
|||
|
{
|
|||
|
private Thread _loadingThread;
|
|||
|
|
|||
|
public Color TransitionColor = Color.White;
|
|||
|
|
|||
|
private Vector2[] _cameraTargets = new Vector2[] {
|
|||
|
new Vector2(248, 1344),
|
|||
|
new Vector2(120, 1488),
|
|||
|
new Vector2(416, 1984),
|
|||
|
new Vector2(256, 704),
|
|||
|
new Vector2(400, 1216) };
|
|||
|
|
|||
|
private float _counter;
|
|||
|
private const float ChangeTargetTime = 5350;
|
|||
|
private const float FadeTime = 500;
|
|||
|
private const float FadeLock = 250;
|
|||
|
private int _targetIndex;
|
|||
|
|
|||
|
private bool _isActive;
|
|||
|
private bool _finished;
|
|||
|
private bool _finishedLoading;
|
|||
|
private bool _init;
|
|||
|
|
|||
|
public override void OnLoad()
|
|||
|
{
|
|||
|
_targetIndex = 0;
|
|||
|
_finished = false;
|
|||
|
_isActive = false;
|
|||
|
}
|
|||
|
|
|||
|
public override void Update()
|
|||
|
{
|
|||
|
if (!_isActive)
|
|||
|
return;
|
|||
|
|
|||
|
if (!_init)
|
|||
|
{
|
|||
|
if (_finishedLoading && _counter <= 0)
|
|||
|
{
|
|||
|
_counter = ChangeTargetTime;
|
|||
|
_finishedLoading = false;
|
|||
|
_init = true;
|
|||
|
FinishLoading();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_counter -= Game1.DeltaTime;
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
_counter -= Game1.DeltaTime;
|
|||
|
|
|||
|
if (_finished && _counter < ChangeTargetTime - FadeTime - FadeLock)
|
|||
|
{
|
|||
|
_isActive = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (_counter < 0)
|
|||
|
{
|
|||
|
_counter += ChangeTargetTime;
|
|||
|
|
|||
|
_targetIndex++;
|
|||
|
if (_targetIndex < _cameraTargets.Length)
|
|||
|
{
|
|||
|
Game1.GameManager.MapManager.CurrentMap.CameraTarget = _cameraTargets[_targetIndex];
|
|||
|
MapManager.Camera.ForceUpdate(Game1.GameManager.MapManager.GetCameraTarget());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_finished = true;
|
|||
|
|
|||
|
// switch back to the ending map
|
|||
|
var oldMap = Game1.GameManager.MapManager.CurrentMap;
|
|||
|
Game1.GameManager.MapManager.CurrentMap = Game1.GameManager.MapManager.NextMap;
|
|||
|
Game1.GameManager.MapManager.NextMap = oldMap;
|
|||
|
|
|||
|
Game1.GameManager.InGameOverlay.StartSequence("final");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void Draw(SpriteBatch spriteBatch)
|
|||
|
{
|
|||
|
if (!_isActive)
|
|||
|
return;
|
|||
|
|
|||
|
spriteBatch.Begin();
|
|||
|
|
|||
|
var fadePercentage = 0f;
|
|||
|
// fade out
|
|||
|
if (_counter < FadeTime + FadeLock)
|
|||
|
fadePercentage = 1 - MathF.Sin(MathHelper.Clamp((_counter - FadeLock) / FadeTime, 0, 1) * MathF.PI * 0.5f);
|
|||
|
// fade in
|
|||
|
else if (ChangeTargetTime - FadeTime - FadeLock < _counter)
|
|||
|
fadePercentage = MathF.Sin((1 - MathHelper.Clamp((ChangeTargetTime - FadeLock - _counter) / FadeTime, 0, 1)) * MathF.PI * 0.5f);
|
|||
|
|
|||
|
spriteBatch.Draw(Resources.SprWhite, new Rectangle(0, 0, Game1.RenderWidth, Game1.RenderHeight), TransitionColor * fadePercentage);
|
|||
|
spriteBatch.End();
|
|||
|
}
|
|||
|
|
|||
|
public void StartEnding()
|
|||
|
{
|
|||
|
if (_isActive)
|
|||
|
return;
|
|||
|
|
|||
|
_isActive = true;
|
|||
|
_finishedLoading = false;
|
|||
|
_init = false;
|
|||
|
_counter = FadeLock + FadeTime;
|
|||
|
|
|||
|
// used to spawn different npcs on the overworld
|
|||
|
Game1.GameManager.SaveManager.SetString("final_show", "1");
|
|||
|
Game1.GameManager.SaveManager.SetString("marin_state", "1");
|
|||
|
|
|||
|
// start loading the new map in a thread
|
|||
|
_loadingThread = new Thread(o => ThreadLoading("overworld.map"));
|
|||
|
_loadingThread.Start();
|
|||
|
}
|
|||
|
|
|||
|
private void ThreadLoading(string mapFileName)
|
|||
|
{
|
|||
|
// load the map file
|
|||
|
SaveLoadMap.LoadMap(mapFileName, Game1.GameManager.MapManager.NextMap);
|
|||
|
|
|||
|
// create the objects
|
|||
|
Game1.GameManager.MapManager.NextMap.Objects.LoadObjects();
|
|||
|
|
|||
|
_finishedLoading = true;
|
|||
|
}
|
|||
|
|
|||
|
private void FinishLoading()
|
|||
|
{
|
|||
|
// switch to the new map
|
|||
|
var oldMap = Game1.GameManager.MapManager.CurrentMap;
|
|||
|
Game1.GameManager.MapManager.CurrentMap = Game1.GameManager.MapManager.NextMap;
|
|||
|
Game1.GameManager.MapManager.NextMap = oldMap;
|
|||
|
|
|||
|
// center the camera
|
|||
|
Game1.GameManager.MapManager.CurrentMap.CameraTarget = _cameraTargets[_targetIndex];
|
|||
|
MapManager.Camera.ForceUpdate(Game1.GameManager.MapManager.GetCameraTarget());
|
|||
|
|
|||
|
Game1.GameManager.StartDialogPath("final_show_map");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|