mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-25 16:03:02 +00:00
193 lines
7.3 KiB
C#
193 lines
7.3 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
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.Things
|
|
{
|
|
internal class ObjShellHouse : GameObject
|
|
{
|
|
private readonly DictAtlasEntry _barSprite;
|
|
private readonly Animator _barAnimator;
|
|
|
|
private bool _triggerEntryDialog;
|
|
private bool _triggerDialog;
|
|
|
|
private float _barHeight = 16;
|
|
private int _shellCount;
|
|
private int _targetHeight;
|
|
private bool _fillBar;
|
|
|
|
private float _soundCounter;
|
|
private float _partileCounter = 1250;
|
|
private bool _particle;
|
|
|
|
private float _spawnCounter = 300;
|
|
private bool _spawnPresent;
|
|
|
|
public ObjShellHouse() : base("shell_bar") { }
|
|
|
|
public ObjShellHouse(Map.Map map, int posX, int posY) : base(map)
|
|
{
|
|
EntityPosition = new CPosition(posX, posY + 16, 0);
|
|
EntitySize = new Rectangle(0, -16, 16, 16);
|
|
|
|
// already collected the sword
|
|
if (Game1.GameManager.SaveManager.GetString("hasSword2") == "1")
|
|
{
|
|
IsDead = true;
|
|
return;
|
|
}
|
|
|
|
_barSprite = Resources.GetSprite("shell_bar");
|
|
_barAnimator = AnimatorSaveLoad.LoadAnimator("Objects/shell_mansion_bar");
|
|
|
|
var objShells = Game1.GameManager.GetItem("shell");
|
|
if (objShells != null)
|
|
{
|
|
_shellCount = objShells.Count;
|
|
_targetHeight = 16;
|
|
// the first 10 shells move the bar more
|
|
_targetHeight += (int)(MathHelper.Min(_shellCount, 10) / 5f * 32);
|
|
// the second 10 shells move the bar half as much
|
|
_targetHeight += (int)MathHelper.Max(0, (_shellCount - 10) / 10f * 32);
|
|
}
|
|
|
|
if (objShells == null || objShells.Count == 0)
|
|
{
|
|
_triggerDialog = true;
|
|
_targetHeight = 0;
|
|
}
|
|
|
|
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
|
|
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerBottom, EntityPosition));
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
var playerDistance = EntityPosition.Position - MapManager.ObjLink.EntityPosition.Position;
|
|
if (!_triggerEntryDialog && playerDistance.X < 105)
|
|
{
|
|
_triggerEntryDialog = true;
|
|
Game1.GameManager.StartDialogPath("shell_mansion_entry");
|
|
}
|
|
|
|
if (!_triggerDialog && playerDistance.X < 66)
|
|
{
|
|
_fillBar = true;
|
|
_triggerDialog = true;
|
|
}
|
|
|
|
if (_fillBar)
|
|
{
|
|
MapManager.ObjLink.FreezePlayer();
|
|
|
|
_soundCounter -= Game1.DeltaTime;
|
|
if (_soundCounter < 0)
|
|
{
|
|
_soundCounter += 150;
|
|
Game1.GameManager.PlaySoundEffect("D370-06-06");
|
|
}
|
|
|
|
// 2sec -> 16px
|
|
// 2000 / 16 = 125ms
|
|
var addValue = Game1.DeltaTime / 125 * 2;
|
|
if (_targetHeight > _barHeight + addValue)
|
|
{
|
|
_barHeight += addValue;
|
|
}
|
|
else
|
|
{
|
|
_fillBar = false;
|
|
_barHeight = _targetHeight;
|
|
|
|
_particle = true;
|
|
|
|
if (_shellCount == 20)
|
|
_barAnimator.Play("idle");
|
|
|
|
if (_shellCount == 5 || _shellCount == 10 || _shellCount == 20)
|
|
Game1.GameManager.PlaySoundEffect("D360-02-02");
|
|
else
|
|
Game1.GameManager.PlaySoundEffect("D360-29-1D");
|
|
|
|
var objParticle0 = new ObjAnimator(Map, 0, 0, 0, 0, Values.LayerPlayer, "Particles/shell_mansion_particle", "idle", true);
|
|
objParticle0.Animator.CurrentAnimation.LoopCount = 1;
|
|
objParticle0.EntityPosition.Set(new Vector2((int)EntityPosition.X - 8, (int)EntityPosition.Y - (int)_barHeight + 7));
|
|
Map.Objects.SpawnObject(objParticle0);
|
|
|
|
var objParticle1 = new ObjAnimator(Map, 0, 0, 0, 0, Values.LayerPlayer, "Particles/shell_mansion_particle", "idle", true);
|
|
objParticle1.Animator.CurrentAnimation.LoopCount = 1;
|
|
objParticle1.EntityPosition.Set(new Vector2((int)EntityPosition.X + 16 + 8, (int)EntityPosition.Y - (int)_barHeight + 7));
|
|
Map.Objects.SpawnObject(objParticle1);
|
|
}
|
|
}
|
|
|
|
// wait a little bit while showing the particles
|
|
if (_particle)
|
|
{
|
|
MapManager.ObjLink.FreezePlayer();
|
|
|
|
if (_partileCounter > 0)
|
|
_partileCounter -= Game1.DeltaTime;
|
|
else
|
|
{
|
|
_particle = false;
|
|
if (_shellCount == 5 || _shellCount == 10)
|
|
{
|
|
_spawnPresent = true;
|
|
|
|
Game1.GameManager.PlaySoundEffect("D378-12-0C");
|
|
|
|
var objExplosion = new ObjAnimator(Map, 0, 0, 0, 0, Values.LayerBottom, "Particles/explosionBomb", "run", true);
|
|
objExplosion.EntityPosition.Set(new Vector2((int)EntityPosition.X - 48, (int)EntityPosition.Y - 64));
|
|
Map.Objects.SpawnObject(objExplosion);
|
|
}
|
|
else if (_shellCount == 20)
|
|
{
|
|
Game1.GameManager.StartDialogPath("shell_mansion_sword");
|
|
}
|
|
else
|
|
{
|
|
Game1.GameManager.StartDialogPath("shell_mansion_nothing");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_spawnPresent)
|
|
{
|
|
if (_spawnCounter > 0)
|
|
_spawnCounter -= Game1.DeltaTime;
|
|
else
|
|
{
|
|
_spawnPresent = false;
|
|
|
|
var objItem = new ObjItem(Map, 0, 0, null, null, "shellPresent", null);
|
|
objItem.EntityPosition.Set(new Vector2((int)EntityPosition.X - 48, (int)EntityPosition.Y - 56));
|
|
Map.Objects.SpawnObject(objItem);
|
|
}
|
|
}
|
|
|
|
if (_barAnimator.IsPlaying)
|
|
_barAnimator.Update();
|
|
}
|
|
|
|
private void Draw(SpriteBatch spriteBatch)
|
|
{
|
|
// draw the animated bar
|
|
if (_barAnimator.IsPlaying)
|
|
{
|
|
for (int i = 1; i < 8; i++)
|
|
_barAnimator.Draw(spriteBatch, new Vector2(EntityPosition.X, EntityPosition.Y - 16 * i), Color.White);
|
|
}
|
|
else
|
|
{
|
|
spriteBatch.Draw(_barSprite.Texture, new Rectangle((int)EntityPosition.X, (int)EntityPosition.Y - (int)_barHeight, 16, (int)_barHeight), _barSprite.ScaledRectangle, Color.White);
|
|
}
|
|
}
|
|
}
|
|
} |