53 lines
1.9 KiB
Haskell
53 lines
1.9 KiB
Haskell
module Dodge.Event.Keyboard
|
|
( handleKeyboardEvent
|
|
)
|
|
where
|
|
import Dodge.Data
|
|
import Dodge.Base
|
|
import Dodge.CreatureAction
|
|
import SDL
|
|
import Data.Maybe
|
|
import qualified Data.Set as S
|
|
import Control.Lens
|
|
import LoadConfig
|
|
|
|
handleKeyboardEvent :: KeyboardEventData -> World -> Maybe World
|
|
handleKeyboardEvent kev w = case keyboardEventKeyMotion kev of
|
|
Released -> Just $ w & keys %~ S.delete kcode
|
|
Pressed -> handlePressedKey
|
|
(keyboardEventRepeat kev)
|
|
kcode
|
|
(w & keys %~ S.insert kcode)
|
|
where
|
|
kcode = (keysymScancode . keyboardEventKeysym) kev
|
|
|
|
handlePressedKey :: Bool -> Scancode -> World -> Maybe World
|
|
handlePressedKey True _ w = Just w
|
|
handlePressedKey _ scancode w
|
|
| scancode == escapeKey (_keyConfig w) = Nothing
|
|
| scancode == pauseKey (_keyConfig w) = Just $ pauseGame $ escapeMap w
|
|
| scancode == dropItemKey (_keyConfig w) = Just $ dropItem w
|
|
| scancode == toggleMapKey (_keyConfig w) = Just $ toggleMap w
|
|
| scancode == reloadKey (_keyConfig w) = Just $ fromMaybe w $ reloadWeapon (_yourID w) w
|
|
| scancode == testEventKey (_keyConfig w) = Just $ testEvent w
|
|
| scancode == spaceActionKey (_keyConfig w) = Just $ spaceAction w
|
|
-- Rotation seems to be duplicated here and in Camera.hs ? why
|
|
| scancode == rotateCameraPlusKey (_keyConfig w) = Just $ w {_cameraRot = _cameraRot w + 0.01}
|
|
| scancode == rotateCameraMinusKey (_keyConfig w) = Just $ w {_cameraRot = _cameraRot w - 0.01}
|
|
handlePressedKey _ _ w = Just w
|
|
|
|
|
|
spaceAction :: World -> World
|
|
spaceAction w = case listToMaybe $ _closeActiveObjects w of
|
|
Just (Left flit) -> pickUpItem' flit w
|
|
Just (Right but) -> _btEvent but but w
|
|
Nothing -> w
|
|
|
|
testEvent :: World -> World
|
|
testEvent w = w
|
|
|
|
pauseGame :: World -> World
|
|
pauseGame w = w {_menuState = PauseMenu}
|
|
|
|
toggleMap w = w & carteDisplay %~ not
|
|
escapeMap w = w & carteDisplay .~ False |