mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
117 lines
4.4 KiB
C#
117 lines
4.4 KiB
C#
|
using System;
|
||
|
using Microsoft.Xna.Framework;
|
||
|
using ProjectZ.InGame.GameObjects.Base;
|
||
|
using ProjectZ.InGame.GameObjects.Base.CObjects;
|
||
|
using ProjectZ.InGame.GameObjects.Base.Components;
|
||
|
using ProjectZ.InGame.GameObjects.Base.Components.AI;
|
||
|
using ProjectZ.InGame.Map;
|
||
|
using ProjectZ.InGame.Things;
|
||
|
|
||
|
namespace ProjectZ.InGame.GameObjects.Things
|
||
|
{
|
||
|
internal class ObjMermaidStatue : GameObject
|
||
|
{
|
||
|
private readonly AiComponent _aiComponent;
|
||
|
private readonly BodyComponent _body;
|
||
|
private readonly CBox _box;
|
||
|
|
||
|
private Vector2 _startPosition;
|
||
|
private Vector2 _endPosition;
|
||
|
|
||
|
private readonly string _strKey;
|
||
|
private readonly int _moveTime = 650;
|
||
|
|
||
|
private bool _moved;
|
||
|
|
||
|
public ObjMermaidStatue() : base("mermaid_statue") { }
|
||
|
|
||
|
public ObjMermaidStatue(Map.Map map, int posX, int posY, string strKey) : base(map)
|
||
|
{
|
||
|
int offset = -4;
|
||
|
|
||
|
EntityPosition = new CPosition(posX + 8, posY + 32 + offset, 0);
|
||
|
EntitySize = new Rectangle(-8, -32 - offset, 16, 32);
|
||
|
|
||
|
_startPosition = EntityPosition.Position;
|
||
|
_endPosition = _startPosition - new Vector2(16, 0);
|
||
|
|
||
|
_strKey = strKey;
|
||
|
|
||
|
_body = new BodyComponent(EntityPosition, -8, -16 - offset, 16, 16, 8);
|
||
|
|
||
|
var stateIdle = new AiState();
|
||
|
var statePreMoving = new AiState(UpdateFreezePlayer);
|
||
|
statePreMoving.Trigger.Add(new AiTriggerCountdown(250, null, () => _aiComponent.ChangeState("moving")));
|
||
|
var stateMoving = new AiState(UpdateFreezePlayer) { Init = InitMoving };
|
||
|
stateMoving.Trigger.Add(new AiTriggerCountdown(_moveTime, MoveTick, MoveEnd));
|
||
|
var stateMoved = new AiState();
|
||
|
|
||
|
_aiComponent = new AiComponent();
|
||
|
_aiComponent.States.Add("idle", stateIdle);
|
||
|
_aiComponent.States.Add("preMoving", statePreMoving);
|
||
|
_aiComponent.States.Add("moving", stateMoving);
|
||
|
_aiComponent.States.Add("moved", stateMoved);
|
||
|
_aiComponent.ChangeState("idle");
|
||
|
|
||
|
_box = new CBox(EntityPosition, -8, -16 - offset, 16, 16, 16);
|
||
|
|
||
|
AddComponent(InteractComponent.Index, new InteractComponent(_box, OnInteract));
|
||
|
AddComponent(AiComponent.Index, _aiComponent);
|
||
|
AddComponent(BodyComponent.Index, _body);
|
||
|
AddComponent(CollisionComponent.Index, new BoxCollisionComponent(_box, Values.CollisionTypes.Normal | Values.CollisionTypes.Hookshot));
|
||
|
AddComponent(DrawComponent.Index, new DrawSpriteComponent("mermaid_statue", EntityPosition, Values.LayerPlayer));
|
||
|
|
||
|
// already moved?
|
||
|
if (!string.IsNullOrEmpty(_strKey) && Game1.GameManager.SaveManager.GetString(_strKey) == "1")
|
||
|
{
|
||
|
MoveTick(0);
|
||
|
_aiComponent.ChangeState("moved");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private bool OnInteract()
|
||
|
{
|
||
|
var itemScale = Game1.GameManager.GetItem("trade12");
|
||
|
if (itemScale != null && itemScale.Count >= 1)
|
||
|
{
|
||
|
Game1.GameManager.RemoveItem("trade12", 1);
|
||
|
Game1.GameManager.StartDialogPath("mermaid_statue_1");
|
||
|
Game1.GameManager.PlaySoundEffect("D378-04-04");
|
||
|
_aiComponent.ChangeState("preMoving");
|
||
|
}
|
||
|
else if (!_moved)
|
||
|
{
|
||
|
Game1.GameManager.StartDialogPath("mermaid_statue_0");
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private void UpdateFreezePlayer()
|
||
|
{
|
||
|
MapManager.ObjLink.FreezePlayer();
|
||
|
}
|
||
|
|
||
|
private void InitMoving()
|
||
|
{
|
||
|
Game1.GameManager.PlaySoundEffect("D378-17-11");
|
||
|
}
|
||
|
|
||
|
private void MoveTick(double time)
|
||
|
{
|
||
|
// the movement is fast in the beginning and slows down at the end
|
||
|
var amount = (float)Math.Sin((_moveTime - time) / _moveTime * (Math.PI / 2f));
|
||
|
var newPosition = Vector2.Lerp(_startPosition, _endPosition, amount);
|
||
|
EntityPosition.Set(newPosition);
|
||
|
}
|
||
|
|
||
|
private void MoveEnd()
|
||
|
{
|
||
|
MoveTick(0);
|
||
|
Game1.GameManager.SaveManager.SetString(_strKey, "1");
|
||
|
_aiComponent.ChangeState("moved");
|
||
|
|
||
|
Game1.GameManager.PlaySoundEffect("D360-02-02");
|
||
|
}
|
||
|
}
|
||
|
}
|