45 lines
1.2 KiB
GDScript
45 lines
1.2 KiB
GDScript
extends Area2D
|
|
|
|
@export var speed: float = 500.0
|
|
@export var lifetime: float = 2.0
|
|
@export var damage: float = 10.0
|
|
@export_enum("AP", "HE") var ammo_type: int = 0
|
|
@export var explosion_radius: float = 100.0
|
|
var shooter_group: String = "player"
|
|
|
|
func _ready():
|
|
# Connect collision signal
|
|
body_entered.connect(_on_body_entered)
|
|
|
|
# Delete bullet after lifetime seconds
|
|
await get_tree().create_timer(lifetime).timeout
|
|
queue_free()
|
|
|
|
func _physics_process(delta):
|
|
position += Vector2.RIGHT.rotated(rotation) * speed * delta
|
|
|
|
func _on_body_entered(body):
|
|
if body.is_in_group(shooter_group):
|
|
return
|
|
|
|
if ammo_type == 0: # AP
|
|
if body.has_method("take_damage"):
|
|
body.take_damage(damage)
|
|
elif ammo_type == 1: # HE
|
|
explode()
|
|
|
|
queue_free()
|
|
|
|
func explode():
|
|
# Visual effect could go here
|
|
# Find all potential targets
|
|
# If shooter is player, target enemies. If shooter is enemy, target player.
|
|
var target_group = "enemy" if shooter_group == "player" else "player"
|
|
var targets = get_tree().get_nodes_in_group(target_group)
|
|
|
|
for target in targets:
|
|
var distance = global_position.distance_to(target.global_position)
|
|
if distance <= explosion_radius:
|
|
if target.has_method("take_damage"):
|
|
target.take_damage(damage)
|