module Game.LambdaHack.Key
( Key(..), handleDir, moveBinding, keyTranslate
) where
import Prelude hiding (Left, Right)
import qualified Data.List as L
import qualified Data.Char as Char
import Game.LambdaHack.PointXY
import Game.LambdaHack.Vector
data Key =
Esc
| Return
| Space
| Tab
| PgUp
| PgDn
| Left
| Right
| Up
| Down
| End
| Begin
| Home
| KP !Char
| Char !Char
| Unknown !String
deriving (Ord, Eq)
showKey :: Key -> String
showKey (Char c) = [c]
showKey Esc = "ESC"
showKey Return = "RET"
showKey Space = "SPACE"
showKey Tab = "TAB"
showKey PgUp = "<page-up>"
showKey PgDn = "<page-down>"
showKey Left = "<left>"
showKey Right = "<right>"
showKey Up = "<up>"
showKey Down = "<down>"
showKey End = "<end>"
showKey Begin = "<begin>"
showKey Home = "<home>"
showKey (KP c) = "<KeyPad " ++ [c] ++ ">"
showKey (Unknown s) = s
instance Show Key where
show = showKey
dirViChar :: [Char]
dirViChar = ['y', 'k', 'u', 'l', 'n', 'j', 'b', 'h']
dirViMoveKey :: [Key]
dirViMoveKey = map Char dirViChar
dirViRunKey :: [Key]
dirViRunKey = map (Char . Char.toUpper) dirViChar
dirMoveKey :: [Key]
dirMoveKey = [Home, Up, PgUp, Right, PgDn, Down, End, Left]
dirRunKey :: [Key]
dirRunKey = map KP ['7', '8', '9', '6', '3', '2', '1', '4']
handleDir :: X -> Key -> (Vector -> a) -> a -> a
handleDir lxsize e h k =
let mvs = moves lxsize
assocs = zip dirViMoveKey mvs ++ zip dirMoveKey mvs
in maybe k h (L.lookup e assocs)
moveBinding :: ((X -> Vector) -> a) -> ((X -> Vector) -> a)
-> [(Key, (String, a))]
moveBinding move run =
let assign f (key, dir) = (key, ("", f dir))
in map (assign move) (zip dirViMoveKey movesWidth) ++
map (assign move) (zip dirMoveKey movesWidth) ++
map (assign run) (zip dirViRunKey movesWidth) ++
map (assign run) (zip dirRunKey movesWidth)
keyTranslate :: String -> Key
keyTranslate "less" = Char '<'
keyTranslate "greater" = Char '>'
keyTranslate "period" = Char '.'
keyTranslate "colon" = Char ':'
keyTranslate "comma" = Char ','
keyTranslate "question" = Char '?'
keyTranslate "dollar" = Char '$'
keyTranslate "asterisk" = Char '*'
keyTranslate "KP_Multiply" = Char '*'
keyTranslate "slash" = Char '/'
keyTranslate "KP_Divide" = Char '/'
keyTranslate "underscore" = Char '_'
keyTranslate "minus" = Char '-'
keyTranslate "KP_Subtract" = Char '-'
keyTranslate "bracketleft" = Char '['
keyTranslate "bracketright" = Char ']'
keyTranslate "braceleft" = Char '{'
keyTranslate "braceright" = Char '}'
keyTranslate "Escape" = Esc
keyTranslate "Return" = Return
keyTranslate "space" = Space
keyTranslate "Tab" = Tab
keyTranslate "KP_Up" = Up
keyTranslate "KP_Down" = Down
keyTranslate "KP_Left" = Left
keyTranslate "KP_Right" = Right
keyTranslate "KP_Home" = Home
keyTranslate "KP_End" = End
keyTranslate "KP_Page_Up" = PgUp
keyTranslate "KP_Page_Down" = PgDn
keyTranslate "KP_Begin" = Begin
keyTranslate "KP_Enter" = Return
keyTranslate ['K','P','_',c] = KP c
keyTranslate [c] = Char c
keyTranslate s = Unknown s