- Stage 1: Eliminate fish-eye distortion with precomputed tangential ray offset table and fractional DDA depth - Stage 2: Full asset management in EblanStudio (stb_image/stb_image_write, 128x128 BGRA texture packaging, WAV sound manager) - Stage 3: Multi-level room streaming, LevelTransition/CELL_PORTAL trigger system, 16-frame screen fade to black - Stage 4: 60Hz cutscene engine in pure x86 ASM (v4 binary track, waypoint camera motion, shortest-arc pan, CP1251 Russian subtitles, letterbox overlay, audio) - Stage 5: EblanStudio cutscene timeline (F6) and windowless Live ASM Viewport over shared-memory IPC directly rendered into DX11 - Tooling & Tests: comprehensive regression test suite (94 editor + 107 engine tests), IPC tests, and cutscene demo
168 lines
3.8 KiB
PHP
168 lines
3.8 KiB
PHP
; ==============================================================================
|
|
; EBLAN ENGINE - Input System (Keyboard via GetAsyncKeyState)
|
|
; ==============================================================================
|
|
|
|
.code
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; PollInput: Reads keyboard state and updates movement & action flags
|
|
; ------------------------------------------------------------------------------
|
|
PollInput PROC uses eax ebx
|
|
mov keyForward, 0
|
|
mov keyBackward, 0
|
|
mov keyStrafeLeft, 0
|
|
mov keyStrafeRight, 0
|
|
mov keyTurnLeft, 0
|
|
mov keyTurnRight, 0
|
|
mov keyRun, 0
|
|
mov keyAction, 0
|
|
mov keyScreenshot, 0
|
|
mov keyCutscene, 0
|
|
mov keySkipScene, 0
|
|
invoke GetForegroundWindow
|
|
cmp eax, hEngineWnd
|
|
je input_has_focus
|
|
mov keyActionHeld, 0
|
|
mov keyMapHeld, 0
|
|
mov keyShotHeld, 0
|
|
mov keySceneHeld, 0
|
|
mov keySkipHeld, 0
|
|
ret
|
|
input_has_focus:
|
|
|
|
; 1. Forward (W / Up Arrow)
|
|
invoke GetAsyncKeyState, VK_KEY_W
|
|
mov bx, ax
|
|
invoke GetAsyncKeyState, VK_KEY_UP
|
|
or bx, ax
|
|
test bx, 8000h
|
|
jz @F
|
|
mov keyForward, 1
|
|
@@:
|
|
|
|
; 2. Backward (S / Down Arrow)
|
|
invoke GetAsyncKeyState, VK_KEY_S
|
|
mov bx, ax
|
|
invoke GetAsyncKeyState, VK_KEY_DOWN
|
|
or bx, ax
|
|
test bx, 8000h
|
|
jz @F
|
|
mov keyBackward, 1
|
|
@@:
|
|
|
|
; 3. Strafe Left (A)
|
|
invoke GetAsyncKeyState, VK_KEY_A
|
|
test ax, 8000h
|
|
jz @F
|
|
mov keyStrafeLeft, 1
|
|
@@:
|
|
|
|
; 4. Strafe Right (D)
|
|
invoke GetAsyncKeyState, VK_KEY_D
|
|
test ax, 8000h
|
|
jz @F
|
|
mov keyStrafeRight, 1
|
|
@@:
|
|
|
|
; 5. Turn Left (Left Arrow)
|
|
invoke GetAsyncKeyState, VK_KEY_LEFT
|
|
test ax, 8000h
|
|
jz @F
|
|
mov keyTurnLeft, 1
|
|
@@:
|
|
|
|
; 6. Turn Right (Right Arrow)
|
|
invoke GetAsyncKeyState, VK_KEY_RIGHT
|
|
test ax, 8000h
|
|
jz @F
|
|
mov keyTurnRight, 1
|
|
@@:
|
|
|
|
; Actions are emitted once per physical press (also for E + Space).
|
|
invoke GetAsyncKeyState, VK_KEY_E
|
|
mov bx, ax
|
|
invoke GetAsyncKeyState, VK_KEY_SPACE
|
|
or bx, ax
|
|
test bx, 8000h
|
|
jz action_released
|
|
cmp keyActionHeld, 0
|
|
jne action_sampled
|
|
mov keyAction, 1
|
|
mov keyActionHeld, 1
|
|
jmp action_sampled
|
|
action_released:
|
|
mov keyActionHeld, 0
|
|
action_sampled:
|
|
|
|
; 8. Run / Sprint (Shift)
|
|
invoke GetAsyncKeyState, VK_KEY_SHIFT
|
|
test ax, 8000h
|
|
jz @F
|
|
mov keyRun, 1
|
|
@@:
|
|
|
|
invoke GetAsyncKeyState, VK_KEY_M
|
|
test ax, 8000h
|
|
jz map_key_released
|
|
cmp keyMapHeld, 0
|
|
jne map_key_sampled
|
|
xor keyShowMap, 1
|
|
mov keyMapHeld, 1
|
|
jmp map_key_sampled
|
|
map_key_released:
|
|
mov keyMapHeld, 0
|
|
map_key_sampled:
|
|
invoke GetAsyncKeyState, VK_KEY_F12
|
|
test ax, 8000h
|
|
jz shot_key_released
|
|
cmp keyShotHeld, 0
|
|
jne shot_key_sampled
|
|
mov keyScreenshot, 1
|
|
mov keyShotHeld, 1
|
|
jmp shot_key_sampled
|
|
shot_key_released:
|
|
mov keyShotHeld, 0
|
|
shot_key_sampled:
|
|
|
|
invoke GetAsyncKeyState, VK_KEY_C
|
|
test ax, 8000h
|
|
jz scene_key_released
|
|
cmp keySceneHeld, 0
|
|
jne scene_key_sampled
|
|
mov keyCutscene, 1
|
|
mov keySceneHeld, 1
|
|
jmp scene_key_sampled
|
|
scene_key_released:
|
|
mov keySceneHeld, 0
|
|
scene_key_sampled:
|
|
invoke GetAsyncKeyState, VK_KEY_TAB
|
|
test ax, 8000h
|
|
jz skip_key_released
|
|
cmp keySkipHeld, 0
|
|
jne skip_key_sampled
|
|
mov keySkipScene, 1
|
|
mov keySkipHeld, 1
|
|
jmp skip_key_sampled
|
|
skip_key_released:
|
|
mov keySkipHeld, 0
|
|
skip_key_sampled:
|
|
cmp isCutsceneActive, 0
|
|
je normal_keys_enabled
|
|
mov keyForward, 0
|
|
mov keyBackward, 0
|
|
mov keyStrafeLeft, 0
|
|
mov keyStrafeRight, 0
|
|
mov keyTurnLeft, 0
|
|
mov keyTurnRight, 0
|
|
mov keyRun, 0
|
|
mov keyAction, 0
|
|
normal_keys_enabled:
|
|
; 11. Escape - Exit application
|
|
invoke GetAsyncKeyState, VK_KEY_ESCAPE
|
|
test ax, 8000h
|
|
jz @F
|
|
mov isRunning, 0
|
|
@@:
|
|
|
|
ret
|
|
PollInput ENDP
|