Files
urm03/scripts/kinetic_weapon.gd
vh 380088c694 feat: tracer bullet — greybox arena, positioning piloting, auto-fire KINETIC weapon
One-screen 640x360 arena (walls, grid floor, fixed view), mech with
positioning-only movement (WASD/arrows, accel/decel, no aim), auto-fire
KINETIC hardpoint (nearest-target, visible range ring) firing slugs
that damage + knock back, untagged grunt trickle spawner with contact
damage, hull bar HUD, scene-reload on hull zero.

Headless smoke gate: tests/smoke.tscn asserts boot, piloting movement,
spawning, input-free auto-fire, grunt lethality, knockback displacement.
3/3 passes on nh3-dev headless 4.7.1.
2026-08-06 22:21:10 -07:00

45 lines
1.1 KiB
GDScript

extends Node2D
## Auto-fire KINETIC hardpoint. No player input ever touches this —
## the build expresses itself while the pilot only positions. Draws its
## own range ring so the kill zone is legible (positioning <-> build bet).
const PROJECTILE := preload("res://scenes/kinetic_projectile.tscn")
@export var fire_interval := 0.4
@export var range_px := 220.0
var _cooldown := 0.0
func _physics_process(delta: float) -> void:
_cooldown -= delta
if _cooldown > 0.0:
return
var target := _nearest_enemy()
if target == null:
return
_fire(target)
_cooldown = fire_interval
func _nearest_enemy() -> Node2D:
var best: Node2D = null
var best_d := range_px * range_px
for e in get_tree().get_nodes_in_group("enemies"):
var d: float = global_position.distance_squared_to(e.global_position)
if d < best_d:
best_d = d
best = e
return best
func _fire(target: Node2D) -> void:
var p := PROJECTILE.instantiate()
p.direction = (target.global_position - global_position).normalized()
p.position = global_position
owner.get_parent().add_child(p)
func _draw() -> void:
draw_arc(Vector2.ZERO, range_px, 0.0, TAU, 64, Color(0.55, 0.7, 0.85, 0.18), 1.0)