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