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

91 lines
3.3 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.NPCs
{
internal class ObjTrendy : GameObject
{
private readonly BodyComponent _body;
private readonly Animator _animator;
private readonly CSprite _sprite;
private bool _grabbed;
private bool _fallen;
private bool _endDialog;
public ObjTrendy() : base("person") { }
public ObjTrendy(Map.Map map, int posX, int posY) : base(map)
{
EntityPosition = new CPosition(posX + 8, posY + 16, 0);
EntitySize = new Rectangle(-8, -16, 16, 16);
_animator = AnimatorSaveLoad.LoadAnimator("NPCs/npc_trendy");
_animator.Play("stand_0");
_sprite = new CSprite(EntityPosition);
var animationComponent = new AnimationComponent(_animator, _sprite, Vector2.Zero);
_body = new BodyComponent(EntityPosition, -4, -8, 8, 8, 8)
{
RestAdditionalMovement = false,
Gravity = -0.15f,
Bounciness = 0.5f,
MoveCollision = OnMoveCollision
};
var box = new CBox(EntityPosition, -7, -14, 14, 14, 8);
AddComponent(BodyComponent.Index, _body);
AddComponent(CollisionComponent.Index, new BoxCollisionComponent(box, Values.CollisionTypes.Enemy | Values.CollisionTypes.PushIgnore));
AddComponent(InteractComponent.Index, new InteractComponent(box, Interact));
AddComponent(BaseAnimationComponent.Index, animationComponent);
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
AddComponent(DrawComponent.Index, new BodyDrawComponent(_body, _sprite, Values.LayerPlayer) { WaterOutline = false });
AddComponent(DrawShadowComponent.Index, new BodyDrawShadowComponent(_body, _sprite));
}
private void Update()
{
// go grabbed?
if (!_grabbed && _body.IgnoresZ)
{
_grabbed = true;
_animator.Play("grabbed");
}
// let go by the grabber
if (_grabbed && !_body.IgnoresZ)
{
_fallen = true;
_animator.Play("fall");
}
// ending dialog?
if (_fallen && !_endDialog && _body.AdditionalMovementVT == Vector2.Zero && EntityPosition.Z == 0 && _body.Velocity.Z == 0)
{
_endDialog = true;
Game1.GameManager.StartDialogPath("trendy_marin_end");
}
if (_grabbed)
MapManager.ObjLink.FreezePlayer();
}
private void OnMoveCollision(Values.BodyCollision collision)
{
if ((collision & Values.BodyCollision.Floor) != 0)
Game1.GameManager.PlaySoundEffect("D360-09-09");
}
private bool Interact()
{
Game1.GameManager.StartDialogPath("npc_trendy");
return true;
}
}
}