port: F5 -- (A) during the title build-in snaps the ONE shared clock to the settle
Measured by the Decoder: the plate reaches alpha 255 in a single frame against ~11 frames of ramp with no input, and the sweep enters at 255 with no ramp where an untouched run obeys its parent's declared t=70..100 gate. A cut, not an acceleration. It advances the ONE SHARED CLOCK, so authored/flow.json's clock: 'shared' stands. 🔴 I IMPLEMENTED THE OPPOSITE FIRST AND REVERTED IT. Their initial report had the artwork animating across the press, which would mean two clocks and an overlay-only jump; I built that (_plate_offset). It rested on a 5-frame window that sat entirely inside the 11-12 frame lag between a scripted press and its effect -- it compared frames where the input had not been acted on yet. A wider pre-registered test refuted it: three elements mid-fade vanish in one frame. 🔴 AND MY FIRST VERSION NEVER FIRED, SILENTLY. It gated on overlay.settle_instant, which is -1 for press_start: that screen declares a 22-unit settle window against SETTLE_WINDOW_MIN=30. The boot has always printed 'settles at t=236' from settle_time(), a DIFFERENT quantity, and I took the printed number as evidence for the field I was testing. Caught only by filming and seeing overlay-view stay flat at 0.0 across the press. ⚠️ The target is BOUNDED, not pinned: the capture puts it inside [100,238] -- past the sweep's gate at 100, not past 250 or ptloop01's exit ramp would return the sweep to alpha 0. settle_time()=236 sits inside that and is where the plate reaches full alpha. New diagnostic --press-at=S[,S...] presses (A) at wall-clock moments anywhere in a boot; --skip-at lives inside the movie branch and fires once, so it cannot reach the title. Marked fragile by construction. VERIFIED on a filmed boot: shared clock jumps 109.4 -> 236.0 and view_units and overlay_units move together across the press.
This commit is contained in:
@@ -180,6 +180,18 @@ func _ready() -> void:
|
|||||||
if args.has("script"):
|
if args.has("script"):
|
||||||
_script = args["script"].split(",", false)
|
_script = args["script"].split(",", false)
|
||||||
_skip_at = float(args.get("skip-at", "0"))
|
_skip_at = float(args.get("skip-at", "0"))
|
||||||
|
# `--press-at=S[,S…]` presses Ⓐ at wall-clock moments ANYWHERE in a boot.
|
||||||
|
# `--skip-at` cannot do it: it lives inside the movie branch and fires once,
|
||||||
|
# so it can skip the intro and nothing after. Needed to exercise the second
|
||||||
|
# of the three Ⓐ presses (the plate snap), which lands on the title.
|
||||||
|
#
|
||||||
|
# ⚠️ Wall-clock, and therefore fragile by construction -- the Decoder found
|
||||||
|
# blind delays cannot reliably hit a window when pacing varies. It is a
|
||||||
|
# DIAGNOSTIC for a deterministic local boot, not an instrument to assert with.
|
||||||
|
if args.has("press-at"):
|
||||||
|
for part in String(args["press-at"]).split(",", false):
|
||||||
|
_press_at.append(float(part))
|
||||||
|
_press_at.sort()
|
||||||
# `--focus=<element id>` draws a button's focus record in a `--screen` run,
|
# `--focus=<element id>` draws a button's focus record in a `--screen` run,
|
||||||
# which otherwise focuses nothing. A diagnostic: the spinning ring is only
|
# which otherwise focuses nothing. A diagnostic: the spinning ring is only
|
||||||
# drawn on a FOCUSED button, so without this the ring can only be observed in
|
# drawn on a FOCUSED button, so without this the ring can only be observed in
|
||||||
@@ -487,6 +499,9 @@ var _black_hold := 0.0
|
|||||||
## `--focus=<id>`: draw this element's focus record in a `--screen` run.
|
## `--focus=<id>`: draw this element's focus record in a `--screen` run.
|
||||||
var _force_focus := ""
|
var _force_focus := ""
|
||||||
var _skip_sent := false
|
var _skip_sent := false
|
||||||
|
|
||||||
|
## Pending `--press-at` moments, ascending. See where it is parsed.
|
||||||
|
var _press_at: Array = []
|
||||||
var _script_started := false
|
var _script_started := false
|
||||||
var _sequence: Array[Dictionary] = []
|
var _sequence: Array[Dictionary] = []
|
||||||
var _player: VideoStreamPlayer = null
|
var _player: VideoStreamPlayer = null
|
||||||
@@ -560,6 +575,10 @@ func _process(delta: float) -> void:
|
|||||||
_screen_frames += 1
|
_screen_frames += 1
|
||||||
_worst_gap = maxf(_worst_gap, delta)
|
_worst_gap = maxf(_worst_gap, delta)
|
||||||
view.queue_redraw()
|
view.queue_redraw()
|
||||||
|
while not _press_at.is_empty() and _elapsed >= float(_press_at[0]):
|
||||||
|
_press_at.pop_front()
|
||||||
|
print(" --press-at: pressing (A) at %.2f s" % _elapsed)
|
||||||
|
_press("ui_accept")
|
||||||
_overlay_process(delta)
|
_overlay_process(delta)
|
||||||
_menu_repeat(delta)
|
_menu_repeat(delta)
|
||||||
|
|
||||||
@@ -942,6 +961,45 @@ func _unhandled_input(event: InputEvent) -> void:
|
|||||||
_player.stop()
|
_player.stop()
|
||||||
_video_finished()
|
_video_finished()
|
||||||
return
|
return
|
||||||
|
# F5, MEASURED: Ⓐ during the title's build-in is a CUT, not an acceleration.
|
||||||
|
# The plate goes to alpha 255 in ONE frame against about eleven frames of ramp
|
||||||
|
# with no input, and the sweep enters at 255 with no ramp at all where an
|
||||||
|
# untouched run takes its parent's declared `t=70…100` gate
|
||||||
|
# (`docs/re/f5-a-press-snaps-the-plate.md`).
|
||||||
|
#
|
||||||
|
# 📌 IT ADVANCES THE ONE SHARED CLOCK, which is why `authored/flow.json`'s
|
||||||
|
# `clock: "shared"` stands. Both agents briefly had the opposite: a first pass
|
||||||
|
# reported the artwork animating across the press, which would have meant two
|
||||||
|
# clocks and an overlay-only jump. That rested on a 5-frame window which sat
|
||||||
|
# entirely inside the 11-12 frame lag between a scripted press and its effect,
|
||||||
|
# so it compared frames where the input had not been acted on yet. A wider
|
||||||
|
# pre-registered test refuted it: three elements mid-fade vanish in a single
|
||||||
|
# frame. I had implemented the overlay-only version; it is reverted here.
|
||||||
|
#
|
||||||
|
# ⚠️ The target is BOUNDED, not pinned. The capture puts it inside [100, 238]
|
||||||
|
# -- past the sweep's gate at 100, and not past 250 or `ptloop01`'s exit ramp
|
||||||
|
# would have taken the sweep back to alpha 0. `settle_time()` is 236 for this
|
||||||
|
# overlay, which is inside that bound and is where the plate reaches full
|
||||||
|
# alpha. If the game turns out to snap somewhere else in the window, this is
|
||||||
|
# the line to move and nothing else changes.
|
||||||
|
#
|
||||||
|
# 🔴 NOT `settle_instant`: the first version of this used it and NEVER FIRED,
|
||||||
|
# silently. `press_start` declares a 22-unit settle window against a 30-unit
|
||||||
|
# minimum, so `settle_instant` is -1 for this screen. The boot has always
|
||||||
|
# printed "settles at t=236" from `settle_time()`, a different quantity, and I
|
||||||
|
# read the printed number as evidence for the field I was testing.
|
||||||
|
#
|
||||||
|
# It is the SECOND of three presses from the logos to the menu -- skip movie,
|
||||||
|
# reveal plate, activate it. Consuming the press keeps the second and third
|
||||||
|
# distinct.
|
||||||
|
if overlay != null and event.is_action_pressed("ui_accept"):
|
||||||
|
var snap_to := overlay.settle_time()
|
||||||
|
if snap_to > 0.0 and view.time_units < snap_to:
|
||||||
|
print(" (A) snaps the title: shared clock %.1f -> %.1f" % [view.time_units, snap_to])
|
||||||
|
view.time_units = snap_to
|
||||||
|
view.queue_redraw()
|
||||||
|
_overlay_process(0.0)
|
||||||
|
return
|
||||||
if _menu == null or _menu.stack.is_empty():
|
if _menu == null or _menu.stack.is_empty():
|
||||||
return
|
return
|
||||||
# AUTHORED, not measured: a press during a screen's fade-out is dropped.
|
# AUTHORED, not measured: a press during a screen's fade-out is dropped.
|
||||||
|
|||||||
Reference in New Issue
Block a user