content: module Game.GameInput
      (gameInput,
       gameMotion) where
  
  import Graphics.UI.GLUT
  import System.Exit
  import Data.IORef
  import Input.InputState as InputState
  import Settings.DisplaySettings as DisplaySettings
  
  -- gameMotion
  gameMotion :: IORef InputState.MousePos -> Position -> IO ()
  gameMotion mousePosRef (Position posX posY) =
      writeIORef mousePosRef (InputState.MousePos (fromIntegral posX) (truncate DisplaySettings.screenResHeight - fromIntegral posY))
  
  -- gameInput
  gameInput :: IORef InputState.KeysState -> Key -> KeyState -> Modifiers -> Position -> IO ()
  gameInput keysStateRef key state _ _ = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {lMousePrevDown = lMouseDown keysState})
      keyboardAct keysStateRef key state
  
  -- keyboardAct
  keyboardAct :: IORef InputState.KeysState -> Key -> KeyState -> IO ()
  
  -- up arrow key
  keyboardAct keysStateRef (SpecialKey KeyUp) Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {upKeyDown = True})
  
  keyboardAct keysStateRef (SpecialKey KeyUp) Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {upKeyDown = False})
  
  -- down arrow key
  keyboardAct keysStateRef (SpecialKey KeyDown) Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {downKeyDown = True})
  
  keyboardAct keysStateRef (SpecialKey KeyDown) Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {downKeyDown = False})
  
  -- left arrow key
  keyboardAct keysStateRef (SpecialKey KeyLeft) Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {leftKeyDown = True})
  
  keyboardAct keysStateRef (SpecialKey KeyLeft) Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {leftKeyDown = False})
  
  -- right arrow key
  keyboardAct keysStateRef (SpecialKey KeyRight) Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {rightKeyDown = True})
  
  keyboardAct keysStateRef (SpecialKey KeyRight) Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {rightKeyDown = False})
  
  -- space key
  keyboardAct keysStateRef (Char ' ') Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {spaceKeyDown = True})
  
  keyboardAct keysStateRef (Char ' ') Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {spaceKeyDown = False})
  
  -- esc key
  keyboardAct keysStateRef (Char '\ESC') Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {escKeyDown = True})
  
  keyboardAct keysStateRef (Char '\ESC') Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {escKeyDown = False})
  
  -- quit key
  keyboardAct _ (Char 'q') Down =
      exitSuccess
  
  -- left mouse button
  keyboardAct keysStateRef (MouseButton LeftButton) Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {lMouseDown = True})
  
  keyboardAct keysStateRef (MouseButton LeftButton) Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {lMouseDown = False})
  
  -- right mouse button
  keyboardAct keysStateRef (MouseButton RightButton) Down = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {rMouseDown = True})
  
  keyboardAct keysStateRef (MouseButton RightButton) Up = do
      keysState <- readIORef keysStateRef
      writeIORef keysStateRef (keysState {rMouseDown = False})
  
  keyboardAct _ _ _ = return ()
  
  