EBLAN_ENGINE/include/engine_input.inc
Игорь Федосеев aa64510def feat: stabilize fixed-tick simulation
Decouple gameplay from presentation and preserve signed movement fractions. Separate cinematic camera ownership with safe body handoff and transactional current-room restarts.

Resample input latches on focus regain, discard modal timing debt, and attach cinematic lighting to the view to match editor preview.

Verify editor 137/137 and ASM 288/288, cinematic traces, RGB bake and IPC framebuffer parity without changing project assets.
2026-10-31 22:31:20 +03:00

126 lines
4.1 KiB
PHP

; Keyboard sampling never mutates simulation. Pending edges survive render-only
; frames and are cleared only by ConsumeInputEdges after one simulation tick.
.code
SampleHeld PROC uses ebx, first:DWORD, second:DWORD
invoke GetAsyncKeyState, first
mov ebx, eax
cmp second, 0
je @F
invoke GetAsyncKeyState, second
or eax, ebx
@@:
shr eax, 15
and eax, 1
ret
SampleHeld ENDP
SampleEdge PROC uses ebx esi edi, first:DWORD, second:DWORD, held:DWORD, pending:DWORD
invoke SampleHeld, first, second
mov esi, held
mov edi, pending
test eax, eax
jz edge_released
cmp BYTE PTR [esi], 0
jne edge_done
mov BYTE PTR [edi], 1
edge_released:
mov [esi], al
edge_done:
ret
SampleEdge ENDP
ConsumeInputEdges PROC
mov keyAction, 0
mov keyCutscene, 0
mov keySkipScene, 0
mov keyAttack, 0
mov keyRestart, 0
mov keyPause, 0
mov keyMap, 0
mov keyHud, 0
mov keyFlashlight, 0
mov keyLightMode, 0
mov keyWeapon1, 0
mov keyWeapon2, 0
mov keyWeapon3, 0
mov keyMenu1, 0
mov keyMenu2, 0
mov keyMenu3, 0
mov keyMenu4, 0
mov keyMenu5, 0
mov keyDismiss, 0
ret
ConsumeInputEdges ENDP
PollInput PROC uses eax ebx
LOCAL regained:DWORD
mov regained, 0
invoke GetForegroundWindow
cmp eax, hEngineWnd
je input_has_focus
cmp inputFocused, 0
je @F
mov clockReset, 1
@@:
mov inputFocused, 0
call ConsumeInputEdges
mov keyScreenshot, 0
mov keyForward, 0
mov keyBackward, 0
mov keyStrafeLeft, 0
mov keyStrafeRight, 0
mov keyTurnLeft, 0
mov keyTurnRight, 0
mov keyRun, 0
; On regain, sample every physical latch but discard the resulting edges.
ret
input_has_focus:
cmp inputFocused, 0
jne @F
mov clockReset, 1
mov regained, 1
@@:
mov inputFocused, 1
invoke SampleHeld, VK_KEY_W, VK_KEY_UP
mov keyForward, al
invoke SampleHeld, VK_KEY_S, VK_KEY_DOWN
mov keyBackward, al
invoke SampleHeld, VK_KEY_A, 0
mov keyStrafeLeft, al
invoke SampleHeld, VK_KEY_D, 0
mov keyStrafeRight, al
invoke SampleHeld, VK_KEY_LEFT, 0
mov keyTurnLeft, al
invoke SampleHeld, VK_KEY_RIGHT, 0
mov keyTurnRight, al
invoke SampleHeld, VK_KEY_SHIFT, 0
mov keyRun, al
invoke SampleEdge, VK_KEY_E, VK_KEY_SPACE, OFFSET keyActionHeld, OFFSET keyAction
invoke SampleEdge, VK_KEY_CONTROL, VK_LBUTTON, OFFSET keyAttackHeld, OFFSET keyAttack
; Separate Space latch prevents a second poll from re-emitting a pending edge.
invoke SampleEdge, VK_KEY_SPACE, 0, OFFSET keySpaceAttackHeld, OFFSET keyAttack
invoke SampleEdge, VK_KEY_R, 0, OFFSET keyRestartHeld, OFFSET keyRestart
invoke SampleEdge, VK_KEY_C, 0, OFFSET keySceneHeld, OFFSET keyCutscene
invoke SampleEdge, VK_KEY_TAB, 0, OFFSET keySkipHeld, OFFSET keySkipScene
invoke SampleEdge, VK_KEY_M, 0, OFFSET keyMapHeld, OFFSET keyMap
invoke SampleEdge, VK_KEY_F12, 0, OFFSET keyShotHeld, OFFSET keyScreenshot
invoke SampleEdge, VK_KEY_F1, VK_KEY_H, OFFSET keyHudStyleHeld, OFFSET keyHud
invoke SampleEdge, VK_KEY_F, 0, OFFSET keyFlashlightHeld, OFFSET keyFlashlight
invoke SampleEdge, VK_KEY_L, 0, OFFSET keyLightModeHeld, OFFSET keyLightMode
invoke SampleEdge, VK_KEY_ESCAPE, 0, OFFSET keyPauseHeld, OFFSET keyPause
invoke SampleEdge, 13, 0, OFFSET keyDismissHeld, OFFSET keyDismiss
invoke SampleEdge, VK_KEY_1, 0, OFFSET keyWeaponHeld1, OFFSET keyWeapon1
invoke SampleEdge, VK_KEY_2, 0, OFFSET keyWeaponHeld2, OFFSET keyWeapon2
invoke SampleEdge, VK_KEY_3, 0, OFFSET keyWeaponHeld3, OFFSET keyWeapon3
invoke SampleEdge, VK_KEY_1, 0, OFFSET keyMenuHeld1, OFFSET keyMenu1
invoke SampleEdge, VK_KEY_2, 0, OFFSET keyMenuHeld2, OFFSET keyMenu2
invoke SampleEdge, VK_KEY_3, 0, OFFSET keyMenuHeld3, OFFSET keyMenu3
invoke SampleEdge, VK_KEY_4, 0, OFFSET keyMenuHeld4, OFFSET keyMenu4
invoke SampleEdge, VK_KEY_5, 0, OFFSET keyMenuHeld5, OFFSET keyMenu5
cmp regained, 0
je input_sample_done
call ConsumeInputEdges
mov keyScreenshot, 0
input_sample_done:
ret
PollInput ENDP