Space-time distorder drains energy while boosting (#62)
GameState._advance_distorder_drain() runs in GameState._process() - not the distorder component's tick() - alongside extractor mining and production, so it (and the fleet's travel) keeps working across the space<->surface scene swap. Drain scales with how far above 1.0 the multiplier is: (fleet_speed_multiplier - 1.0) / (MAX - 1.0) * ENERGY_DRAIN_PER_SECOND (2.0 at full boost), accumulated fractionally the same way extractor mining_progress is so small multipliers still drain a nonzero amount instead of rounding to zero every frame. Running the fleet hold's energy to exactly zero force-resets fleet_speed_multiplier to 1.0 and raises a one-shot boost_depleted_notice flag, since GameState can't reach into whichever scene's SpeedFader may or may not currently exist. SpeedFader.gd consumes the flag on its next _process(), snaps its knob down (it was already reading the multiplier live, so this falls out for free) and shows "Out of energy!" - also clearing active_touch_index so a still-held drag can't immediately re-boost from the position the finger never moved away from. test_space_time_distorder.gd (#59) updated to stock fleet energy first, for the same reason #60/#61 needed it: boosting is no longer free, and that test's own multi-second boosted phases would otherwise get cut short mid-measurement by running out.
This commit is contained in:
parent
facbd83dd2
commit
651f8b787e
4 changed files with 211 additions and 1 deletions
38
GameState.gd
38
GameState.gd
|
|
@ -29,6 +29,17 @@ var planet_definition_id: String = "rocky"
|
|||
const MAX_FLEET_SPEED_MULTIPLIER: float = 3.0
|
||||
var fleet_speed_multiplier: float = 1.0
|
||||
|
||||
# #62: energy cost of sustaining a boost, scaled by how far above 1.0 the
|
||||
# multiplier is - a small boost costs proportionally less, full boost costs
|
||||
# ENERGY_DRAIN_PER_SECOND. Sitting at exactly 1.0 costs nothing.
|
||||
const ENERGY_DRAIN_PER_SECOND: float = 2.0
|
||||
var _distorder_drain_progress: float = 0.0
|
||||
# One-shot notice, consumed and cleared by SpeedFader.gd: true the instant
|
||||
# a sustained boost is force-reset for running the fleet hold's energy
|
||||
# to zero, so the control (which may not even be part of the current
|
||||
# scene tree at that exact frame) can show why on its next _process().
|
||||
var boost_depleted_notice: bool = false
|
||||
|
||||
|
||||
func set_fleet_speed_multiplier(value: float) -> void:
|
||||
fleet_speed_multiplier = clampf(value, 1.0, MAX_FLEET_SPEED_MULTIPLIER)
|
||||
|
|
@ -1165,6 +1176,32 @@ func _advance_gas_burners(delta: float) -> void:
|
|||
b.gas_burn_progress = progress
|
||||
|
||||
|
||||
func _advance_distorder_drain(delta: float) -> void:
|
||||
if fleet_speed_multiplier <= 1.0:
|
||||
# Nothing owed at 1.0x - and no stale fractional progress should
|
||||
# carry over into a LATER, unrelated boost.
|
||||
_distorder_drain_progress = 0.0
|
||||
return
|
||||
var rate: float = (fleet_speed_multiplier - 1.0) / (MAX_FLEET_SPEED_MULTIPLIER - 1.0) \
|
||||
* ENERGY_DRAIN_PER_SECOND
|
||||
_distorder_drain_progress += rate * delta
|
||||
var whole: int = int(floor(_distorder_drain_progress))
|
||||
if whole <= 0:
|
||||
return
|
||||
_distorder_drain_progress -= whole
|
||||
var available: int = fleet_inventory.amount(RESOURCE_ENERGY)
|
||||
if available >= whole:
|
||||
fleet_inventory.withdraw(RESOURCE_ENERGY, whole)
|
||||
return
|
||||
# Ran out mid-drain: take whatever is left (down to exactly zero) and
|
||||
# force the boost back to its default, rather than let the fleet keep
|
||||
# travelling fast on credit.
|
||||
fleet_inventory.withdraw(RESOURCE_ENERGY, available)
|
||||
fleet_speed_multiplier = 1.0
|
||||
_distorder_drain_progress = 0.0
|
||||
boost_depleted_notice = true
|
||||
|
||||
|
||||
# Planet conquest: a planet must have every one of its capture points held
|
||||
# before an extractor can be built there (see BuildController's placement
|
||||
# gates). Keyed by the same stable planet_id as `extractors`, entirely
|
||||
|
|
@ -1240,6 +1277,7 @@ func _process(delta: float) -> void:
|
|||
_advance_lab_research(delta)
|
||||
_advance_vessel_deliveries(delta)
|
||||
_advance_gas_burners(delta)
|
||||
_advance_distorder_drain(delta)
|
||||
for e in extractors:
|
||||
e.mining_progress = float(e.get("mining_progress", 0.0)) + delta * EXTRACTOR_RATE
|
||||
var whole: int = int(floor(float(e.mining_progress)))
|
||||
|
|
|
|||
Loading…
Reference in a new issue