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

110 lines
4 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.Base;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Things
{
internal class ObjPowder : GameObject
{
private Rectangle _sourceRectangle = new Rectangle(1, 145, 4, 4);
private Vector3[] _points = new Vector3[3];
private Vector3[] _velocity = new Vector3[3];
private float[] _live = new float[3];
private float _gravity = -0.05f;
private bool _damage;
public ObjPowder(Map.Map map, float posX, float posY, float posZ, bool playerPowder) : base(map)
{
EntityPosition = new CPosition(posX, posY, posZ);
EntitySize = new Rectangle(-8, -16, 16, 16);
_points[0] = new Vector3(posX, posY, posZ + 7);
_points[1] = new Vector3(posX - 1, posY, posZ + 6);
_points[2] = new Vector3(posX + 1, posY, posZ + 6);
_velocity[0] = new Vector3(0, 0, 0);
_velocity[1] = new Vector3(-Game1.RandomNumber.Next(50, 150) / 1000f, 0, 0);
_velocity[2] = new Vector3(Game1.RandomNumber.Next(50, 150) / 1000f, 0, 0);
_live[0] = 1;
_live[1] = 1;
_live[2] = 1;
// play sound effect
if (playerPowder)
Game1.GameManager.PlaySoundEffect("D360-05-05", true);
else
_damage = true;
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerPlayer, EntityPosition));
AddComponent(LightDrawComponent.Index, new LightDrawComponent(DrawLight));
}
public void Update()
{
var finishedFalling = true;
for (var i = 0; i < _points.Length; i++)
{
if (_points[i].Z <= 3 && !_damage)
{
// deals damage
_damage = true;
Map.Objects.Hit(this, new Vector2(EntityPosition.X, EntityPosition.Y),
new Box(EntityPosition.X - 3, EntityPosition.Y - 8, 0, 6, 10, 8),
HitType.MagicPowder, 2, false, false);
}
// finished falling
if (_points[i].Z <= 0)
{
_points[i].Z = 0;
_live[i] -= 0.1f * Game1.TimeMultiplier;
}
else
{
_points[i] += _velocity[i] * Game1.TimeMultiplier;
_velocity[i].Z += _gravity * Game1.TimeMultiplier;
}
if (_live[i] > 0)
finishedFalling = false;
else
_live[i] = 0;
}
// remove object from the map
if (finishedFalling)
{
Map.Objects.DeleteObjects.Add(this);
}
}
public void Draw(SpriteBatch spriteBatch)
{
for (var i = 0; i < _points.Length; i++)
{
spriteBatch.Draw(Resources.SprItem, new Vector2(
_points[i].X - _sourceRectangle.Width / 2,
_points[i].Y - _sourceRectangle.Height - _points[i].Z), _sourceRectangle, Color.White * _live[i]);
}
}
public void DrawLight(SpriteBatch spriteBatch)
{
// draw shadow
for (var i = 0; i < _points.Length; i++)
{
DrawHelper.DrawLight(spriteBatch, new Rectangle(
(int)_points[i].X - 12, (int)(_points[i].Y - _points[i].Z) - 2 - 12, 24, 24), new Color(255, 220, 220) * 0.125f * _live[i]);
}
}
}
}