EBLAN_ENGINE/include/engine_input.inc

349 lines
8.2 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
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:
; 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