mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
95 lines
3.2 KiB
C#
95 lines
3.2 KiB
C#
|
using Microsoft.Xna.Framework;
|
||
|
using ProjectZ.InGame.GameObjects.Base;
|
||
|
using ProjectZ.InGame.GameObjects.Base.Components;
|
||
|
using ProjectZ.InGame.GameSystems;
|
||
|
using ProjectZ.InGame.Map;
|
||
|
using ProjectZ.InGame.Things;
|
||
|
|
||
|
namespace ProjectZ.InGame.GameObjects.Things
|
||
|
{
|
||
|
internal class ObjRaccoonTeleporter : GameObject
|
||
|
{
|
||
|
private readonly int _offsetX;
|
||
|
private readonly int _offsetY;
|
||
|
|
||
|
private float _teleportTime;
|
||
|
private float _teleportCount;
|
||
|
|
||
|
private float _fadeTime;
|
||
|
|
||
|
private int _direction;
|
||
|
private int _mode;
|
||
|
private bool _isTeleporting;
|
||
|
|
||
|
public ObjRaccoonTeleporter() : base("editor teleporter")
|
||
|
{
|
||
|
EditorColor = Color.Green * 0.5f;
|
||
|
}
|
||
|
|
||
|
// mode 0: racoon
|
||
|
// mode 1: dungeon 6
|
||
|
public ObjRaccoonTeleporter(Map.Map map, int posX, int posY, int offsetX, int offsetY, int width, int height, int mode) : base(map)
|
||
|
{
|
||
|
// TODO_End: the object lights up the scene so we cant set the EntitySize
|
||
|
//EntityPosition = new CPosition(posX, posY, 0);
|
||
|
//EntitySize = new Rectangle(0, 0, width, height);
|
||
|
|
||
|
_offsetX = offsetX;
|
||
|
_offsetY = offsetY;
|
||
|
_mode = mode;
|
||
|
|
||
|
_teleportTime = _mode == 0 ? 300 : 300;
|
||
|
_fadeTime = mode == 0 ? 200 : 250;
|
||
|
|
||
|
AddComponent(ObjectCollisionComponent.Index, new ObjectCollisionComponent(new Rectangle(posX, posY, width, height), OnCollision));
|
||
|
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
if (!_isTeleporting)
|
||
|
return;
|
||
|
|
||
|
if (_mode == 0 || _mode == 1)
|
||
|
MapManager.ObjLink.FreezePlayer();
|
||
|
|
||
|
_teleportCount += Game1.DeltaTime * _direction;
|
||
|
if (_teleportCount >= _teleportTime)
|
||
|
{
|
||
|
_teleportCount = _teleportTime;
|
||
|
_direction = -1;
|
||
|
|
||
|
// teleport the colliding player to the new position
|
||
|
MapManager.ObjLink.SetPosition(new Vector2(
|
||
|
MapManager.ObjLink.PosX + _offsetX * Values.TileSize,
|
||
|
MapManager.ObjLink.PosY + _offsetY * Values.TileSize));
|
||
|
|
||
|
var goalPosition = Game1.GameManager.MapManager.GetCameraTarget();
|
||
|
MapManager.Camera.SoftUpdate(goalPosition);
|
||
|
}
|
||
|
|
||
|
if (_direction < 0 && _teleportCount <= 0)
|
||
|
{
|
||
|
_isTeleporting = false;
|
||
|
}
|
||
|
|
||
|
var transitionSystem = (MapTransitionSystem)Game1.GameManager.GameSystems[typeof(MapTransitionSystem)];
|
||
|
transitionSystem.SetColorMode(_mode == 0 ? Color.White : Color.Black, MathHelper.Clamp(_teleportCount / _fadeTime, 0, 1), false);
|
||
|
}
|
||
|
|
||
|
private void OnCollision(GameObject gameObject)
|
||
|
{
|
||
|
if (_isTeleporting)
|
||
|
return;
|
||
|
|
||
|
_direction = 1;
|
||
|
_isTeleporting = true;
|
||
|
|
||
|
if (_mode == 0)
|
||
|
{
|
||
|
Game1.GameManager.PlaySoundEffect("D360-30-1E");
|
||
|
Game1.GameManager.SaveManager.SetString("raccoon_warning", "0");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|