#115: the lancer winds up once, and leaves hard

One back and forth rather than two and a half, over 0.85s rather than 1.2.
The tell is a recoil and a spring; repeating it turned a wind-up into a
fidget and the player stopped reading it as "about to happen".

And the charge is 1650px/s, up from 950, which read as a fast drift rather
than as the thing the whole wind-up was promising.

The test counts how many times the wind-up crosses its anchor: one back and
forth crosses exactly once, two would cross three times.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Loïc Wisniewski 2026-08-23 21:38:08 +02:00
commit 7a78d1b1a6
2 changed files with 33 additions and 8 deletions

View file

@ -32,14 +32,21 @@ enum Phase { HUNT, WINDUP, CHARGE, RECOVER }
# The drift in HUNT is deliberately slower than the charge by an order of
# magnitude: the approach is a stalk, the charge is the attack.
@export var approach_speed_factor: float = 0.5
@export var windup_time: float = 1.2
# Shortened with the cycle count (#115): one back-and-forth in the time two
# and a half used to take would be a slow-motion tell.
@export var windup_time: float = 0.85
# #96 to the letter: the trajectory line appears 300ms before it leaves.
@export var telegraph_time: float = 0.3
# The "small back and forth" - it recoils along the charge axis, so the
# motion reads as winding up to spring rather than as drifting.
@export var windup_sway: float = 30.0
@export var windup_cycles: float = 2.5
@export var charge_speed: float = 950.0
@export var windup_sway: float = 34.0
# #115: exactly ONE back and forth, not two and a half. The tell is a recoil
# and a spring; repeating it turned a wind-up into a fidget, and the player
# stopped reading it as "about to happen".
@export var windup_cycles: float = 1.0
# #115: and it leaves hard. At 950 the charge read as a fast drift rather
# than as the thing the whole wind-up was promising.
@export var charge_speed: float = 1650.0
# It flies THROUGH the locked point rather than stopping on it. A charge
# that halted exactly where the ship used to be would look like it was
# aiming at empty space on purpose.
@ -93,7 +100,10 @@ func _tick_hunt(enemy: Node2D, delta: float) -> void:
return
var to_target: Vector2 = target.global_position - enemy.global_position
var distance: float = to_target.length()
if distance > detection_range or distance < 0.001:
if distance < 0.001:
return
# #113: see EnemyPursuitComponent.
if not EnemyTargets.ignores_range(enemy) and distance > detection_range:
return
var direction: Vector2 = to_target / distance
if distance <= lock_range: