Implement ADV History interaction
This commit is contained in:
@@ -1350,9 +1350,24 @@ source rows therefore retain five independent speaker names, and compositor sour
|
||||
each one into its bound object. A real-script regression retains SC0000 page one, runs unmodified
|
||||
`HISTORY.BIN`, observes a non-empty rendered row, and reaches its `(0,60000)` presentation call.
|
||||
|
||||
History's remaining work is interaction fidelity: `0x12e` rectangle hover/hit selection, stored voice replay
|
||||
through `0x1bd`, and the `0xd3/0xd4/0xd5` smooth-scroll callback scheduler. None changes backlog ownership or
|
||||
requires choosing a save/profile backend.
|
||||
The fourth port slice implements History's basic pointer interaction and clean return. Op `0x12e` treats its
|
||||
addressable operands as arrays in their actual VM domain (HISTORY's are local integers), scans from
|
||||
`incoming_index+1`, and tests inclusive intersection. Rectangle fields are `[left,right,top,bottom]`; each
|
||||
candidate's x/y offset is subtracted from the pointer before comparison with the reference rectangle.
|
||||
HISTORY's decoded arrays contain fourteen candidates: scrollbar/control regions, bottom-right close region
|
||||
8, and five 650x130 text rows at indices 9..13. Moving the pointer updates the selected index and executes the
|
||||
script's existing redraw, while left-button release on region 8 sets the script's exit state and runs its
|
||||
normal surface/layout/recording cleanup.
|
||||
|
||||
The host input bridge now distinguishes an enclosing ADV page wait from a script-owned timed raw-input loop.
|
||||
Registration through op `0xcc` marks the current frame as the raw-input owner until that frame returns;
|
||||
Godot routes physical button state and configured callback indices to it without signaling the parked ADV
|
||||
page. This is frame-scoped callback state, not a HISTORY name/offset special case, and also matches the
|
||||
existing HIDEWIN scheduler family. A real regression activates x=684 in SC0000, runs unmodified HISTORY,
|
||||
selects/closes region 8, observes retained text, and returns to the same single page wait.
|
||||
|
||||
History's remaining work is stored voice replay through `0x1bd` and the `0xd3/0xd4/0xd5` smooth-scroll
|
||||
callback scheduler. None changes backlog ownership or requires choosing a save/profile backend.
|
||||
|
||||
The original dependency order was **Hide Window first** to establish reusable callback/coroutine input, then
|
||||
Read-message Skip, then History after both the input layer and message-completion seam exist. Hide Window is
|
||||
|
||||
@@ -573,9 +573,9 @@ op 0x90 (u0041BEB0, argc 7): `0x90 x y w h tgt_a tgt_b tgt_c`. Kelebek left it "
|
||||
- **evidence:** Ghidra /v2: op_0x10a_set_cursor_virtual@0x421590 maps virtual coordinates through the active VirtualFullScreen geometry and calls SetCursorPos. SC0000 alternates the cursor by one vertical pixel after state-changing ADV button clicks so the hover state re-enters cleanly.
|
||||
|
||||
### 0x12e `find-hit-rectangle` (find-hit-rectangle, argc 8)
|
||||
- **summary:** (index_inout)(reference_rect)(pointer_x)(pointer_y)(rect_array)(x_offsets)(y_offsets)(count) - scan forward through encoded rectangles and return the next hit index, or -1.
|
||||
- **summary:** (index_inout)(reference_rect)(pointer_x)(pointer_y)(rect_array)(x_offsets)(y_offsets)(count) - scan after the incoming index for the next inclusive rectangle intersection, or return -1.
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
- **evidence:** Ghidra /v2: op_0x12e_find_hit_rectangle@0x428ff0 resolves the reference rectangle and three array operands as VM pointers, decodes rectangle/offset values with anti_tamper_a, scans candidates after the incoming index, applies per-entry x/y offsets to the pointer coordinates, performs rectangle overlap containment tests, and writes the matched array index or -1 to operand 1. HISTORY.BIN uses it for mouse hover selection over its literal-initialized row rectangles.
|
||||
- **evidence:** Ghidra /v2: op_0x12e_find_hit_rectangle@0x428ff0 resolves the reference rectangle and three array operands as VM pointers, decodes rectangle/offset values with anti_tamper_a, and starts at incoming_index+1. Each candidate is [left,right,top,bottom]; the worker subtracts its per-entry x/y offsets from the pointer, inclusively intersects it with the reference rectangle, and writes the matched array index or -1 to operand 1. HISTORY.BIN uses decoded local arrays for scrollbar/control regions, close region 8, and visible text rows 9..13.
|
||||
|
||||
### 0x19a `get-message-skip` (u00414E50, argc 1)
|
||||
- **summary:** (out) - return the current all-message skip state set by op 0x88.
|
||||
|
||||
@@ -1752,3 +1752,26 @@ opcodes and 840/854 instructions handled or safe-noop; its ten remaining effectf
|
||||
**Next:** implement the basic History interaction slice around rectangle hit/hover (`0x12e`) and clean exit
|
||||
using the existing callback layer. Then add stored voice replay (`0x1bd`); leave `0xd3/0xd4/0xd5` smooth
|
||||
scroll interpolation as a separate fidelity slice.
|
||||
|
||||
### ADV History basic interaction implemented (2026-07-19)
|
||||
|
||||
The fourth bounded slice is complete. Op `0x12e` now performs its native forward scan over addressable VM
|
||||
arrays, including HISTORY's local rectangle and offset tables. It begins after the incoming index, applies
|
||||
per-candidate offsets, and inclusively intersects `[left,right,top,bottom]` candidates with the supplied
|
||||
reference rectangle. The shipped arrays resolve to scrollbar/control regions, bottom-right close candidate
|
||||
8, and five 650x130 dialogue rows at candidates 9..13; the script's existing redraw owns hover visuals.
|
||||
|
||||
Raw input ownership is now frame-scoped. Registering a timed mouse callback through `0xcc` marks that script
|
||||
frame as the input owner until return. Godot continues updating raw mouse bits and input callback indices,
|
||||
but does not release the enclosing ADV page semaphore while that modal loop is active. This closes a real
|
||||
scheduler hole without a HISTORY filename, scene offset, or synthetic button path.
|
||||
|
||||
Two regressions cover inclusive edges/forward scan and the complete live route. The latter reaches SC0000's
|
||||
first wait, activates the real x=684 History hotspot, lets unmodified `HISTORY.BIN` render retained text,
|
||||
presses/releases its real close region, and proves the script returns with recording restored while the same
|
||||
single ADV wait remains parked. Validation: engine 196/196, zero-warning Godot build, threaded `SELFTEST OK`.
|
||||
HISTORY is now 69/78 distinct opcodes and 841/854 instructions handled or safe-noop; its nine remaining
|
||||
effectful gaps total 13 instructions.
|
||||
|
||||
**Next:** implement stored History voice replay (`0x1bd`) against the existing voice host path. Then take
|
||||
`0xd3/0xd4/0xd5` smooth-scroll interpolation as a separate scheduler/fidelity slice.
|
||||
|
||||
Reference in New Issue
Block a user