; ============================================================================== ; 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 mov keyAttack, 0 mov keyRestart, 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 mov keyAttackHeld, 0 mov keyRestartHeld, 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: ; Attack Key: Space or Ctrl or Left Mouse Button invoke GetAsyncKeyState, VK_KEY_SPACE mov bx, ax invoke GetAsyncKeyState, VK_KEY_CONTROL or bx, ax invoke GetAsyncKeyState, VK_LBUTTON or bx, ax test bx, 8000h jz attack_released cmp keyAttackHeld, 0 jne attack_sampled mov keyAttack, 1 mov keyAttackHeld, 1 jmp attack_sampled attack_released: mov keyAttackHeld, 0 attack_sampled: ; Restart Key: R invoke GetAsyncKeyState, VK_KEY_R test ax, 8000h jz restart_released cmp keyRestartHeld, 0 jne restart_sampled mov keyRestart, 1 mov keyRestartHeld, 1 jmp restart_sampled restart_released: mov keyRestartHeld, 0 restart_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 mov keyAttack, 0 normal_keys_enabled: ; 11. Escape - Exit application invoke GetAsyncKeyState, VK_KEY_ESCAPE test ax, 8000h jz @F mov isRunning, 0 @@: ret PollInput ENDP