Add space-time distorder vessel and fleet speed fader (#59)
GameState.fleet_speed_multiplier (1.0-3.0) is applied at the point of
use - Fleet's cruise anchor and Ship's own max_speed/acceleration -
rather than baked into stored stats, so a stat upgrade researched
mid-boost can't corrupt the base value and the fader takes effect
immediately with no re-apply step.
Ship.arrive_radius is scaled by the same multiplier: at higher speeds
each physics tick covers a proportionally larger step, and once that
step outgrows a fixed arrive_radius the ship can overshoot its
snap-to-target zone every tick while chasing a target that's now also
receding faster - visible as the fleet stretching apart under boost.
Scaling it preserves the same "snaps onto its slot" tightness at any
boost level that 1.0x already has.
SpeedFader.gd is a self-contained vertical drag control (TouchJoystick's
raw-touch idiom, not _gui_input) that writes straight to the autoload
rather than reporting a value for something else to apply. It also
resets the multiplier to 1.0 the instant fleet.has_capability("distorder")
goes false, so a fleet can never be left permanently boosted by a vessel
it no longer has.
VesselDistorderComponent carries no per-shot behaviour (energy drain
while boosted is #62) - its presence is what matters. Registered in
VesselDefinitions, wired into the crafter/hangar/ship-lab menus per
#57's note (5/5/6 -> 6/6/7 columns).
This commit is contained in:
parent
ed46cd77e6
commit
116e0f97d3
14 changed files with 675 additions and 86 deletions
21
Ship.gd
21
Ship.gd
|
|
@ -97,16 +97,29 @@ func _physics_process(delta: float) -> void:
|
|||
if child.has_method("tick"):
|
||||
child.tick(delta)
|
||||
|
||||
# #59: multiplied here, at the point of use, rather than baked into the
|
||||
# cached max_speed/acceleration fields apply_vessel_stats() sets - those
|
||||
# stay the true base values, so a stat upgrade researched mid-boost can't
|
||||
# corrupt them, and the fader takes effect the instant it moves with no
|
||||
# re-apply needed. arrive_radius is scaled too: at N physics ticks/sec a
|
||||
# ship's per-tick step is `speed * delta`, and once that step outgrows
|
||||
# the (otherwise fixed) arrive_radius it can overshoot the snap-to-target
|
||||
# zone every tick while chasing a target that is ALSO now receding N
|
||||
# times faster - a small, boost-proportional radius keeps the same
|
||||
# "snaps onto its slot" formation tightness at any boost level that
|
||||
# 1.0x already has.
|
||||
var boost: float = GameState.fleet_speed_multiplier
|
||||
var to_target: Vector2 = move_target - position
|
||||
var distance: float = to_target.length()
|
||||
if distance <= arrive_radius:
|
||||
if distance <= arrive_radius * boost:
|
||||
position = move_target
|
||||
velocity = Vector2.ZERO
|
||||
else:
|
||||
var braking_speed: float = sqrt(2.0 * acceleration * distance)
|
||||
var desired_speed: float = min(max_speed, braking_speed)
|
||||
var effective_acceleration: float = acceleration * boost
|
||||
var braking_speed: float = sqrt(2.0 * effective_acceleration * distance)
|
||||
var desired_speed: float = min(max_speed * boost, braking_speed)
|
||||
var desired_velocity: Vector2 = to_target.normalized() * desired_speed
|
||||
velocity = velocity.move_toward(desired_velocity, acceleration * delta)
|
||||
velocity = velocity.move_toward(desired_velocity, effective_acceleration * delta)
|
||||
position += velocity * delta
|
||||
|
||||
var motion: Vector2 = velocity + fleet_velocity
|
||||
|
|
|
|||
Loading…
Reference in a new issue