LADXHD/InGame/GameObjects/Things/ObjMermaidStatue.cs
2023-12-14 17:21:22 -05:00

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");
}
}
}