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

141 lines
4.9 KiB
C#

using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.Things;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.Map;
namespace ProjectZ.InGame.GameObjects.Dungeon
{
internal class ObjTower : GameObject
{
private readonly Animator _animatorTop0;
private readonly Animator _animatorTop1;
private readonly Animator _animatorTop2;
private readonly Animator _animatorBottom;
private readonly string _strKey;
private bool _opening;
private bool _opened;
private bool _isRotating;
private float _shakeCounter;
private bool _shakeScreen;
public ObjTower() : base("tower") { }
public ObjTower(Map.Map map, int posX, int posY, string strKey) : base(map)
{
EntityPosition = new CPosition(posX - 16, posY - 16, 0);
EntitySize = new Rectangle(0, 0, 80, 80);
_strKey = strKey;
_animatorTop0 = SaveLoad.AnimatorSaveLoad.LoadAnimator("Objects/d7 tower");
_animatorTop0.Play("idle");
_animatorTop0.Pause();
_animatorTop1 = SaveLoad.AnimatorSaveLoad.LoadAnimator("Objects/d7 tower top 1");
_animatorTop1.Play("idle");
_animatorTop1.Pause();
_animatorTop2 = SaveLoad.AnimatorSaveLoad.LoadAnimator("Objects/d7 tower top 2");
_animatorTop2.Play("idle");
_animatorBottom = SaveLoad.AnimatorSaveLoad.LoadAnimator("Objects/d7 tower bottom");
_animatorBottom.Play("idle");
_animatorBottom.Pause();
var opened = !string.IsNullOrEmpty(strKey) && Game1.GameManager.SaveManager.GetString(strKey) == "1";
if (!opened)
{
AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(OnKeyChange));
AddComponent(CollisionComponent.Index, new BoxCollisionComponent(new CBox(posX + 8, posY + 48, 0, 16, 16, 16), Values.CollisionTypes.Normal));
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
}
else
{
_animatorBottom.Play("opened");
}
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerBottom, EntityPosition));
}
private void Open()
{
if (_opening || _opened)
return;
_animatorTop0.Continue();
_animatorTop1.Continue();
_animatorBottom.Continue();
_opening = true;
Game1.GameManager.PlaySoundEffect("D378-04-04");
Game1.GameManager.StopMusic();
}
private void OnKeyChange()
{
if (!string.IsNullOrEmpty(_strKey))
{
var keyState = Game1.GameManager.SaveManager.GetString(_strKey);
if (keyState == "1")
Open();
}
}
private void Update()
{
if (!_opening || _opened)
return;
MapManager.ObjLink.FreezePlayer();
_animatorTop0.Update();
_animatorTop1.Update();
_animatorBottom.Update();
_shakeCounter += Game1.DeltaTime;
if (!_shakeScreen && _shakeCounter > 2000)
{
_shakeScreen = true;
Game1.GameManager.ShakeScreen(2750, 1, 0, 5, 5);
Game1.GameManager.PlaySoundEffect("D378-29-1D");
}
if (_opening && !_animatorTop0.IsPlaying)
{
if (!_isRotating)
{
_isRotating = true;
_animatorTop0.Play("rotate");
_animatorTop1.Play("rotate");
_animatorBottom.Play("rotate");
Game1.GameManager.PlaySoundEffect("D360-46-2E");
}
else if (_isRotating)
{
_opened = true;
Game1.GameManager.PlaySoundEffect("D360-02-02");
Game1.GameManager.PlayMusic();
RemoveComponent(CollisionComponent.Index);
}
}
}
private void Draw(SpriteBatch spriteBatch)
{
_animatorTop0.Draw(spriteBatch, new Vector2(EntityPosition.X, EntityPosition.Y), Color.White);
_animatorTop1.Draw(spriteBatch, new Vector2(EntityPosition.X, EntityPosition.Y), Color.White);
_animatorTop2.Draw(spriteBatch, new Vector2(EntityPosition.X + 16, EntityPosition.Y - 96), Color.White);
_animatorBottom.Draw(spriteBatch, new Vector2(EntityPosition.X, EntityPosition.Y), Color.White);
}
}
}