Fix pivot tap-spam speed exploit (#72)
_finish_pivot_tap() granted a full PIVOT_MIN_STEP rotation on every button/key release with no rate limit, so tapping fast enough rotated the formation far beyond PIVOT_SPEED's smooth held-rate cap - well above what holding the button down can ever produce. Each of those artificially-frequent re-seats (Fleet.apply_formation()) forced every ship into a fresh max-speed catch-up dash toward its new slot with no time to settle between dashes, and since outer-wedge ships swing further per pivot than inner ones, spamming made them visibly diverge in speed while each ship's own bounded max_speed made the fleet read as constantly pinned at its speed ceiling. Added a per-direction cooldown (the time a genuine hold needs to reach PIVOT_MIN_STEP on its own) so tap-spam can't out-pace holding the button. Deliberately NOT shared between CW/CCW: a quick correction tap the other way right after an overshoot is normal play, and test_keyboard_input.gd already covers Q and E each independently producing their own minimum step back-to-back - only repeatedly re-tapping the SAME direction needed capping.
This commit is contained in:
parent
1de66c6fb2
commit
d68aac6444
2 changed files with 46 additions and 3 deletions
|
|
@ -5,7 +5,10 @@ extends SceneTree
|
|||
# Covers the fleet-pivot buttons:
|
||||
# 1. HOLDING one turns the formation continuously, not once per press
|
||||
# 2. a brief tap still produces a clear minimum step
|
||||
# 3. pivoting works while the fleet is under way, i.e. the new layout
|
||||
# 3. immediately repeating a tap grants nothing extra until the cooldown
|
||||
# clears (#72) - spamming taps must never rotate faster than holding
|
||||
# the button would
|
||||
# 4. pivoting works while the fleet is under way, i.e. the new layout
|
||||
# survives the joystick's per-frame steering updates instead of being
|
||||
# overwritten by the old offsets
|
||||
|
||||
|
|
@ -76,6 +79,17 @@ func _process(delta: float) -> bool:
|
|||
quit(1)
|
||||
return true
|
||||
|
||||
# --- #72: spamming taps grants nothing extra during the cooldown ---
|
||||
var before_spam: float = _angle()
|
||||
for i in range(5):
|
||||
controller._finish_pivot_tap(1.0)
|
||||
var spammed: float = absf(angle_difference(before_spam, _angle()))
|
||||
print("5 taps back-to-back -> turned %.4f rad (expected ~0, cooldown not yet cleared)" % spammed)
|
||||
if spammed > 0.001:
|
||||
print("TEST_PIVOT_CONTROLS: FAIL (tap-spam granted rotation during the cooldown)")
|
||||
quit(1)
|
||||
return true
|
||||
|
||||
# --- pivot WHILE the joystick is held -------------------------
|
||||
# Two fingers at once. This is routed through the same raw-touch
|
||||
# path the real device uses, because Godot's Control GUI treats
|
||||
|
|
|
|||
Loading…
Reference in a new issue