module Game.LambdaHack.Action.Frontend.Std
(
FrontendSession
, display, nextEvent, promptGetAnyKey
, frontendName, startup
) where
import qualified Data.List as L
import qualified Data.ByteString.Char8 as BS
import qualified System.IO as SIO
import Data.Text.Encoding (encodeUtf8)
import qualified Game.LambdaHack.Key as K (Key(..), Modifier(..))
import qualified Game.LambdaHack.Color as Color
import Game.LambdaHack.Animation (SingleFrame(..))
type FrontendSession = ()
frontendName :: String
frontendName = "std"
startup :: String -> (FrontendSession -> IO ()) -> IO ()
startup _ k = k ()
display :: FrontendSession
-> Bool
-> Bool
-> Maybe SingleFrame
-> IO ()
display _ _ _ Nothing = return ()
display _ _ _ (Just SingleFrame{..}) =
let chars = L.map (BS.pack . L.map Color.acChar) sfLevel
bs = [encodeUtf8 sfTop, BS.empty] ++ chars ++ [encodeUtf8 sfBottom, BS.empty]
in mapM_ BS.putStrLn bs
nextEvent :: FrontendSession -> Maybe Bool -> IO (K.Key, K.Modifier)
nextEvent sess mb = do
e <- BS.hGet SIO.stdin 1
let c = BS.head e
if c == '\n'
then nextEvent sess mb
else return (keyTranslate c, K.NoModifier)
promptGetAnyKey :: FrontendSession -> SingleFrame
-> IO (K.Key, K.Modifier)
promptGetAnyKey sess frame = do
display sess True True $ Just frame
nextEvent sess Nothing
keyTranslate :: Char -> K.Key
keyTranslate e =
case e of
'\ESC' -> K.Esc
'\n' -> K.Return
'\r' -> K.Return
'\t' -> K.Tab
'P' -> K.Char 'U'
'V' -> K.Char 'Y'
'O' -> K.Char 'J'
'I' -> K.Char 'L'
'R' -> K.Char 'K'
'?' -> K.Char 'N'
'Q' -> K.Char 'H'
'X' -> K.Char 'B'
'D' -> K.Return
'.' -> K.Return
'<' -> K.Char 'q'
'>' -> K.Char '>'
'c' -> K.Char 'c'
'd' -> K.Char 'r'
'g' -> K.Char 'g'
'i' -> K.Char 'i'
'o' -> K.Char 'o'
'q' -> K.Char 'q'
'r' -> K.Char 'r'
't' -> K.Char 'g'
'z' -> K.Char 'g'
'p' -> K.Char 'g'
'a' -> K.Esc
'*' -> K.Char 'c'
'/' -> K.Char 'c'
'[' -> K.Char 'g'
']' -> K.Char 'g'
'{' -> K.Char 'g'
'}' -> K.Char 'g'
' ' -> K.Char 'D'
c | c `elem` "kjhlyubnKJHLYUBN" -> K.Char c
c | c `elem` ['0'..'9'] -> K.Char c
_ -> K.Char '>'