You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.4 KiB
C#

using Godot;
namespace RogueTank.Combat;
public partial class Bullet : Area2D
{
[Export] public float Speed = 520f;
[Export] public float Damage = 10f;
[Export] public int Pierce = 0;
[Export] public float Lifetime = 1.6f;
private float _alive;
private Vector2 _velocity;
public void Init(Vector2 dir)
{
_velocity = dir.Normalized() * Speed;
Rotation = _velocity.Angle();
}
public override void _Ready()
{
BodyEntered += OnBodyEntered;
AreaEntered += OnAreaEntered;
}
public override void _PhysicsProcess(double delta)
{
var d = (float)delta;
GlobalPosition += _velocity * d;
_alive += d;
if (_alive >= Lifetime)
QueueFree();
}
private void OnBodyEntered(Node body)
{
if (body is IDamageable dmg)
{
dmg.TakeDamage(Damage);
if (Pierce <= 0)
QueueFree();
else
Pierce--;
}
else if (body is StaticBody2D)
{
QueueFree();
}
}
private void OnAreaEntered(Area2D area)
{
// In case targets use Area2D-based hurtboxes.
if (area is IDamageableArea dmg)
{
dmg.TakeDamage(Damage);
if (Pierce <= 0)
QueueFree();
else
Pierce--;
}
}
}