269 lines
5.9 KiB
PHP
269 lines
5.9 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:
|
|
|
|
; Weapon Selection Keys: 1, 2, 3
|
|
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
|
|
@@:
|
|
|
|
; 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
|
|
|
|
; Option 1: Resume
|
|
invoke GetAsyncKeyState, VK_KEY_1
|
|
test ax, 8000h
|
|
jz @F
|
|
mov isGamePaused, 0
|
|
@@:
|
|
; Option 2: Restart level
|
|
invoke GetAsyncKeyState, VK_KEY_2
|
|
test ax, 8000h
|
|
jz @F
|
|
mov isGamePaused, 0
|
|
mov keyRestart, 1
|
|
@@:
|
|
; Option 3: Toggle Map
|
|
invoke GetAsyncKeyState, VK_KEY_3
|
|
test ax, 8000h
|
|
jz @F
|
|
xor keyShowMap, 1
|
|
@@:
|
|
; Option 4: Quit
|
|
invoke GetAsyncKeyState, VK_KEY_4
|
|
test ax, 8000h
|
|
jz @F
|
|
mov isRunning, 0
|
|
@@:
|
|
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
|