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 *= _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 |