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).
36 lines
1.2 KiB
GDScript
36 lines
1.2 KiB
GDScript
class_name VesselDefinitions
|
|
extends RefCounted
|
|
|
|
const ORDER: PackedStringArray = ["interceptor", "shield", "gas_bomber", "transporter", "carrier", "laser", "distorder"]
|
|
const DEFINITIONS: Dictionary = {
|
|
"interceptor": preload("res://InterceptorVesselDefinition.tres"),
|
|
"shield": preload("res://ShieldVesselDefinition.tres"),
|
|
"gas_bomber": preload("res://GasBomberVesselDefinition.tres"),
|
|
"transporter": preload("res://TransporterVesselDefinition.tres"),
|
|
"carrier": preload("res://CarrierVesselDefinition.tres"),
|
|
"laser": preload("res://LaserVesselDefinition.tres"),
|
|
"distorder": preload("res://DistorderVesselDefinition.tres"),
|
|
}
|
|
|
|
static func get_definition(definition_id: String) -> Resource:
|
|
return DEFINITIONS.get(definition_id)
|
|
|
|
static func all() -> Array:
|
|
var result: Array = []
|
|
for definition_id in ORDER:
|
|
result.append(DEFINITIONS[definition_id])
|
|
return result
|
|
|
|
|
|
static func fleet() -> Array:
|
|
var result: Array = []
|
|
for definition in all():
|
|
if definition.fleet_eligible:
|
|
result.append(definition)
|
|
return result
|
|
|
|
static func with_capability(capability: String) -> Resource:
|
|
for definition in all():
|
|
if definition.has_capability(capability):
|
|
return definition
|
|
return null
|