e11eddf1b4
- room.gd: Add signal tracking and explicit cleanup in _exit_tree - room.gd: Guard _on_enemy_died against race condition after room freed - player.gd: Set _shield_ready = false on shield activation - player.gd: Fix coolant zone lambda syntax error - player.gd: Add apply_knockback() method for Hivemind pulse - player.gd: Fix coolant zone memory leak (use Timer child) - hud.gd: Remove deprecated boss bar code
42 lines
1.4 KiB
GDScript
42 lines
1.4 KiB
GDScript
extends EnemyBase
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# DRIFTER — Locomotion corruption
|
|
# Moves in slow arcs and wide curves. Never charges straight. Contact only.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
var _wobble_time: float = 0.0
|
|
var _wobble_phase: float = 0.0 # random start so groups don't sync
|
|
|
|
func _ready() -> void:
|
|
max_health = 24.0
|
|
current_health = 24.0
|
|
speed = 100.0
|
|
contact_damage = 1.0
|
|
super._ready()
|
|
_wobble_phase = randf() * TAU
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
_tick_spawn_delay(delta)
|
|
_find_player()
|
|
_tick_contact(delta)
|
|
_tick_flash(delta)
|
|
_tick_slow(delta)
|
|
if not is_active():
|
|
return
|
|
_do_arc_chase(delta)
|
|
velocity *= get_slow_factor()
|
|
move_and_slide()
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Arcing movement — sinusoidal perpendicular drift applied to toward-player dir
|
|
# ---------------------------------------------------------------------------
|
|
func _do_arc_chase(delta: float) -> void:
|
|
if _player == null:
|
|
velocity = Vector2.ZERO
|
|
return
|
|
var toward := (_player.global_position - global_position).normalized()
|
|
var perp := toward.rotated(PI * 0.5)
|
|
_wobble_time += delta
|
|
var wobble := sin(_wobble_time * 1.8 + _wobble_phase) * 0.75
|
|
velocity = (toward + perp * wobble).normalized() * speed |