mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
223 lines
9.5 KiB
C#
223 lines
9.5 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 ObjMamu : GameObject
|
||
|
{
|
||
|
private readonly BodyComponent _body;
|
||
|
private readonly Animator _animator;
|
||
|
|
||
|
private readonly ObjPersonNew _leftFrog;
|
||
|
private readonly ObjPersonNew _rightFrog;
|
||
|
|
||
|
private Rectangle _interactRectangle;
|
||
|
private bool _wasColliding;
|
||
|
|
||
|
private readonly string _saveKey;
|
||
|
|
||
|
struct AnimationKeyframe
|
||
|
{
|
||
|
public float Time;
|
||
|
public string Left;
|
||
|
public string Right;
|
||
|
public string Middle;
|
||
|
|
||
|
public AnimationKeyframe(float time, string left, string right, string middle)
|
||
|
{
|
||
|
Time = time;
|
||
|
Left = left;
|
||
|
Right = right;
|
||
|
Middle = middle;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private AnimationKeyframe[] _songKeyframes = new AnimationKeyframe[]
|
||
|
{
|
||
|
new AnimationKeyframe(0f , "idle", "idle", "right"),
|
||
|
new AnimationKeyframe(0.9f , "right", "idle", "right"),
|
||
|
new AnimationKeyframe(1.85f, "right", "right", "right"),
|
||
|
new AnimationKeyframe(3.2f , "right", "right", "idleleft"),
|
||
|
new AnimationKeyframe(3.75f, "idle", "idle", "left"),
|
||
|
new AnimationKeyframe(4.2f , "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(4.7f , "left", "idle", "right"),
|
||
|
new AnimationKeyframe(5.15f, "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(5.65f, "right", "left", "left"),
|
||
|
new AnimationKeyframe(6.1f , "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(6.55f, "left", "right", "right"),
|
||
|
new AnimationKeyframe(7f , "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(7.5f , "right", "left", "left"),
|
||
|
new AnimationKeyframe(8f , "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(8.45f, "left", "right", "right"),
|
||
|
new AnimationKeyframe(8.9f , "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(9.4f , "right", "left", "left"),
|
||
|
new AnimationKeyframe(9.85f, "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(10.3f, "left", "right", "right"),
|
||
|
new AnimationKeyframe(10.8f, "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(11.25f, "right", "left", "left"),
|
||
|
new AnimationKeyframe(11.7f , "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(12.2f , "left", "right", "right"),
|
||
|
new AnimationKeyframe(12.65f, "idle", "idle", "right"),
|
||
|
new AnimationKeyframe(13.1f , "right", "left", "right"),
|
||
|
new AnimationKeyframe(13.6f , "right", "idle", "right"),
|
||
|
new AnimationKeyframe(14.1f , "right", "right", "right"),
|
||
|
new AnimationKeyframe(14.1f , "right", "right", "right"),
|
||
|
new AnimationKeyframe(14.5f , "right", "right", "idleright"),
|
||
|
new AnimationKeyframe(15f , "idle", "idle", "right"),
|
||
|
new AnimationKeyframe(15.45f, "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(15.95f, "right", "idle", "left"),
|
||
|
new AnimationKeyframe(16.4f , "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(16.85f, "left", "right", "right"),
|
||
|
new AnimationKeyframe(17.35f, "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(17.8f , "right", "left", "left"),
|
||
|
new AnimationKeyframe(18.3f , "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(18.75f, "left", "right", "right"),
|
||
|
new AnimationKeyframe(19.3f , "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(19.7f , "right", "left", "left"),
|
||
|
new AnimationKeyframe(20.15f, "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(20.6f , "left", "right", "right"),
|
||
|
new AnimationKeyframe(21.1f , "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(21.55f, "right", "left", "left"),
|
||
|
new AnimationKeyframe(22f , "idle", "idle", "idleright"),
|
||
|
new AnimationKeyframe(22.5f , "left", "right", "right"),
|
||
|
new AnimationKeyframe(22.95f, "idle", "idle", "idleleft"),
|
||
|
new AnimationKeyframe(23.4f , "right", "left", "left"),
|
||
|
new AnimationKeyframe(23.9f , "idle", "idle", "left"),
|
||
|
new AnimationKeyframe(24.4f , "left", "right", "left"),
|
||
|
new AnimationKeyframe(24.85f, "left", "idle", "left"),
|
||
|
new AnimationKeyframe(25.3f, "left", "left", "left"),
|
||
|
new AnimationKeyframe(26.3f, "idle", "idle", "idle")
|
||
|
};
|
||
|
|
||
|
private float _startDelay;
|
||
|
private float _songCounter;
|
||
|
private int _songIndex;
|
||
|
private bool _isPlaying;
|
||
|
private bool _startedPlaying;
|
||
|
|
||
|
public ObjMamu() : base("mamu") { }
|
||
|
|
||
|
public ObjMamu(Map.Map map, int posX, int posY, string saveKey) : base(map)
|
||
|
{
|
||
|
_saveKey = saveKey;
|
||
|
if (!string.IsNullOrEmpty(_saveKey) &&
|
||
|
Game1.GameManager.SaveManager.GetString(_saveKey) == "1")
|
||
|
{
|
||
|
IsDead = true;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
EntityPosition = new CPosition(posX + 16, posY + 32, 0);
|
||
|
EntitySize = new Rectangle(-16, -32, 32, 32);
|
||
|
|
||
|
_interactRectangle = new Rectangle(posX + 16 - 12, posY + 16, 24, 32);
|
||
|
|
||
|
_animator = AnimatorSaveLoad.LoadAnimator("NPCs/mamu");
|
||
|
_animator.Play("idle");
|
||
|
|
||
|
var sprite = new CSprite(EntityPosition);
|
||
|
var animationComponent = new AnimationComponent(_animator, sprite, Vector2.Zero);
|
||
|
|
||
|
_body = new BodyComponent(EntityPosition, -16, -32, 32, 32, 8);
|
||
|
|
||
|
var interactBox = new CBox(posX + 2, posY + 16, 0, 28, 16, 8);
|
||
|
AddComponent(InteractComponent.Index, new InteractComponent(interactBox, OnInteract));
|
||
|
|
||
|
AddComponent(BodyComponent.Index, _body);
|
||
|
AddComponent(CollisionComponent.Index, new BodyCollisionComponent(_body, Values.CollisionTypes.Normal));
|
||
|
AddComponent(BaseAnimationComponent.Index, animationComponent);
|
||
|
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
|
||
|
AddComponent(DrawComponent.Index, new BodyDrawComponent(_body, sprite, Values.LayerPlayer));
|
||
|
AddComponent(DrawShadowComponent.Index, new DrawShadowCSpriteComponent(sprite));
|
||
|
AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(OnKeyChange));
|
||
|
|
||
|
_leftFrog = new ObjPersonNew(map, posX - 32, posY + 42, null, "singing frog", null, "idle", new Rectangle(0, 0, 14, 12));
|
||
|
map.Objects.SpawnObject(_leftFrog);
|
||
|
|
||
|
_rightFrog = new ObjPersonNew(map, posX + 48, posY + 42, null, "singing frog", null, "idle", new Rectangle(0, 0, 14, 12));
|
||
|
map.Objects.SpawnObject(_rightFrog);
|
||
|
|
||
|
}
|
||
|
|
||
|
private bool OnInteract()
|
||
|
{
|
||
|
Game1.GameManager.StartDialogPath("mamu");
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private void OnKeyChange()
|
||
|
{
|
||
|
var startSing = Game1.GameManager.SaveManager.GetString("mamu_sing");
|
||
|
if (!_startedPlaying && startSing == "1")
|
||
|
{
|
||
|
_startDelay = 2500;
|
||
|
Game1.GameManager.SaveManager.RemoveString("mamu_sing");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void StartSong()
|
||
|
{
|
||
|
Game1.GameManager.SetMusic(52, 2);
|
||
|
_isPlaying = true;
|
||
|
_startedPlaying = true;
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
if (!_startedPlaying && MapManager.ObjLink.IsGrounded())
|
||
|
{
|
||
|
var colliding = MapManager.ObjLink.BodyRectangle.Intersects(_interactRectangle);
|
||
|
if (!_wasColliding && colliding)
|
||
|
{
|
||
|
Game1.GameManager.StartDialogPath("mamu");
|
||
|
}
|
||
|
|
||
|
_wasColliding = colliding;
|
||
|
}
|
||
|
|
||
|
if (_startDelay != 0)
|
||
|
{
|
||
|
_startDelay -= Game1.DeltaTime;
|
||
|
if (_startDelay <= 0)
|
||
|
{
|
||
|
_startDelay = 0;
|
||
|
StartSong();
|
||
|
}
|
||
|
|
||
|
MapManager.ObjLink.FreezePlayer();
|
||
|
Game1.GameManager.InGameOverlay.DisableInventoryToggle = true;
|
||
|
}
|
||
|
|
||
|
if (!_isPlaying)
|
||
|
return;
|
||
|
|
||
|
MapManager.ObjLink.FreezePlayer();
|
||
|
Game1.GameManager.InGameOverlay.DisableInventoryToggle = true;
|
||
|
|
||
|
_songCounter += Game1.DeltaTime;
|
||
|
|
||
|
// new keyframe?
|
||
|
if (_songCounter >= _songKeyframes[_songIndex].Time * 1000)
|
||
|
{
|
||
|
// set the animations
|
||
|
_leftFrog.Animator.Play(_songKeyframes[_songIndex].Left);
|
||
|
_animator.Play(_songKeyframes[_songIndex].Middle);
|
||
|
_rightFrog.Animator.Play(_songKeyframes[_songIndex].Right);
|
||
|
|
||
|
// finished playing?
|
||
|
_songIndex++;
|
||
|
if (_songIndex >= _songKeyframes.Length)
|
||
|
{
|
||
|
_isPlaying = false;
|
||
|
Game1.GameManager.StartDialogPath("mamu_finished");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|