; ============================================================================== ; 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: ; F1 / H: Toggle Clean HUD vs Debug HUD invoke GetAsyncKeyState, VK_KEY_F1 mov bx, ax invoke GetAsyncKeyState, VK_KEY_H or bx, ax test bx, 8000h jz hud_key_released cmp keyHudStyleHeld, 0 jne hud_key_sampled xor hudStyle, 1 mov keyHudStyleHeld, 1 cmp hudStyle, HUD_STYLE_CLEAN je toast_hud_clean invoke ShowGameToast, OFFSET szHudDebugToast, 60, COLOR_CYAN jmp hud_key_sampled toast_hud_clean: invoke ShowGameToast, OFFSET szHudCleanToast, 60, COLOR_GREEN jmp hud_key_sampled hud_key_released: mov keyHudStyleHeld, 0 hud_key_sampled: ; F: Toggle Flashlight invoke GetAsyncKeyState, VK_KEY_F test ax, 8000h jz flash_key_released cmp keyFlashlightHeld, 0 jne flash_key_sampled xor isFlashlightOn, 1 mov keyFlashlightHeld, 1 cmp isFlashlightOn, 1 je toast_flash_on invoke ShowGameToast, OFFSET szFlashlightOff, 60, 00808080h jmp flash_key_sampled toast_flash_on: invoke ShowGameToast, OFFSET szFlashlightOn, 60, COLOR_CYAN jmp flash_key_sampled flash_key_released: mov keyFlashlightHeld, 0 flash_key_sampled: ; L: Cycle Lighting Mode (0: Off -> 1: Baked -> 2: Dynamic) invoke GetAsyncKeyState, VK_KEY_L test ax, 8000h jz light_key_released cmp keyLightModeHeld, 0 jne light_key_sampled inc lightingMode cmp lightingMode, 3 jl @F mov lightingMode, 0 @@: mov keyLightModeHeld, 1 cmp lightingMode, LIGHTING_MODE_NONE je toast_light_none cmp lightingMode, LIGHTING_MODE_BAKED je toast_light_baked invoke ShowGameToast, OFFSET szLightMode2, 60, COLOR_YELLOW jmp light_key_sampled toast_light_none: invoke ShowGameToast, OFFSET szLightMode0, 60, 00808080h jmp light_key_sampled toast_light_baked: invoke ShowGameToast, OFFSET szLightMode1, 60, COLOR_CYAN jmp light_key_sampled light_key_released: mov keyLightModeHeld, 0 light_key_sampled: ; Weapon Selection Keys: 1, 2, 3 (only in Action mode with weapons enabled) cmp gameMode, GAME_MODE_ACTION jne skip_weapon_select cmp enableWeapons, 0 je skip_weapon_select invoke GetAsyncKeyState, VK_KEY_1 test ax, 8000h jz @F mov playerWeapon, WEAPON_KNIFE @@: invoke GetAsyncKeyState, VK_KEY_2 test ax, 8000h jz @F mov playerWeapon, WEAPON_PISTOL @@: invoke GetAsyncKeyState, VK_KEY_3 test ax, 8000h jz @F mov playerWeapon, WEAPON_SHOTGUN @@: skip_weapon_select: ; Escape / Pause Key invoke GetAsyncKeyState, VK_KEY_ESCAPE test ax, 8000h jz pause_key_released cmp keyPauseHeld, 0 jne pause_key_sampled xor isGamePaused, 1 mov keyPauseHeld, 1 jmp pause_key_sampled pause_key_released: mov keyPauseHeld, 0 pause_key_sampled: ; If paused, handle pause menu choices cmp isGamePaused, 0 je not_in_pause_menu ; While paused, mask normal movement & attack mov keyForward, 0 mov keyBackward, 0 mov keyStrafeLeft, 0 mov keyStrafeRight, 0 mov keyTurnLeft, 0 mov keyTurnRight, 0 mov keyAttack, 0 mov keyAction, 0 ; Check if any menu key is pressed invoke GetAsyncKeyState, VK_KEY_1 mov bx, ax invoke GetAsyncKeyState, VK_KEY_2 or bx, ax invoke GetAsyncKeyState, VK_KEY_3 or bx, ax invoke GetAsyncKeyState, VK_KEY_4 or bx, ax invoke GetAsyncKeyState, VK_KEY_5 or bx, ax test bx, 8000h jz menu_keys_released ; If a key is pressed, check if already held cmp keyMenuHeld, 0 jne pause_menu_done mov keyMenuHeld, 1 ; Option 1: Resume invoke GetAsyncKeyState, VK_KEY_1 test ax, 8000h jz @F mov isGamePaused, 0 jmp pause_menu_done @@: ; Option 2: Toggle Weapons / Peaceful Mode invoke GetAsyncKeyState, VK_KEY_2 test ax, 8000h jz @F xor enableWeapons, 1 cmp enableWeapons, 0 je set_peaceful_mode mov gameMode, GAME_MODE_ACTION mov playerWeapon, WEAPON_PISTOL mov showCrosshair, 1 invoke ShowGameToast, OFFSET szWeaponsEnabledToast, 80, COLOR_YELLOW jmp pause_menu_done set_peaceful_mode: mov gameMode, GAME_MODE_ADVENTURE mov playerWeapon, WEAPON_NONE mov showCrosshair, 0 invoke ShowGameToast, OFFSET szWeaponsDisabledToast, 80, COLOR_GREEN jmp pause_menu_done @@: ; Option 3: Toggle HUD (Clean vs Debug) invoke GetAsyncKeyState, VK_KEY_3 test ax, 8000h jz @F xor hudStyle, 1 cmp hudStyle, HUD_STYLE_CLEAN je toast_pause_clean invoke ShowGameToast, OFFSET szHudDebugToast, 60, COLOR_CYAN jmp pause_menu_done toast_pause_clean: invoke ShowGameToast, OFFSET szHudCleanToast, 60, COLOR_GREEN jmp pause_menu_done @@: ; Option 4: Restart level invoke GetAsyncKeyState, VK_KEY_4 test ax, 8000h jz @F mov isGamePaused, 0 mov keyRestart, 1 jmp pause_menu_done @@: ; Option 5: Quit to Windows invoke GetAsyncKeyState, VK_KEY_5 test ax, 8000h jz pause_menu_done mov isRunning, 0 jmp pause_menu_done menu_keys_released: mov keyMenuHeld, 0 pause_menu_done: ret not_in_pause_menu: 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: ret PollInput ENDP