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