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#
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--;
|
|
}
|
|
}
|
|
}
|
|
|
|
|