sots-engine/include
alex dd105da759 SD: a sub-bracket on the ship-design composer 0x006ad700
Extends lane PAR's airng module with a detour on the composer itself, so a
row says what ONE COMPOSER CALL spent rather than what the turn spent.

Three pieces:

  * the detour. The composer's calling convention is neither cdecl nor MSVC
    __fastcall -- two register arguments, two stack arguments, and the CALLER
    cleans -- so it is entered through a hand-written thunk that re-pushes the
    four arguments as cdecl, and the trampoline is re-entered through a second
    thunk that restores ECX/EDX.

  * the sub-bracket. left (RNG+0x9c8) read off the client generator at composer
    entry and exit, and the draws seen in between re-tallied by return address.
    Two independent numbers per row, printed together, because PAR's own
    instrument double-counted a word and only its second measurement caught it.

  * cl_Chance's note is now taken AFTER the trampoline, so a row carries the
    DECISION as well as the call. Site 0x006ae413's 0.3 coin selects the
    fraction that governs the loop-carried draw's trip count, and a call count
    alone cannot say which way it went.

The row also carries the model's prediction beside the measurement: N, the
per-section bank counts and the PointDefence flags are read off the design the
call produced, L is computed from them, and the row says HOLDS, WRONG, or
GATED-OR-WRONG when the prediction is positive and the measurement is zero --
which is the weapon-lookup gate, and is not counted as a confirmation.

Header regenerated from ghidra/addresses.json plus the fragments, never
hand-resolved; the six new lane-sd entries do not change any existing constant
and the module uses none of them by name.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARBgSooAfokKUy6wKUKEyZ
2026-09-08 20:30:22 -04:00
..
generated SD: a sub-bracket on the ship-design composer 0x006ad700 2026-09-08 20:30:22 -04:00