396 lines
9.5 KiB
PHP
396 lines
9.5 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:
|
|
|
|
; 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
|