{-# LANGUAGE DeriveGeneric #-}
module Script.Event where

import           Data.Binary
import           Data.Word     (Word8)
import           GHC.Generics  (Generic)

import           Input.Keycode (Keycode)

-- | キーボードのイベント
data KeyboardEvent
  = KeyboardEvent
    { keKeycode :: Keycode
    , keMotion  :: InputMotion
    }
  deriving (Eq, Show, Read, Generic)

instance Binary KeyboardEvent

-- | ジョイスティックのイベント
data JoystickEvent
  -- | ボタンのイベント
  = JoystickEvent
    { jeButton :: JoystickButton
    , jeMotion :: InputMotion
    }
  -- | ハットスイッチ(十字ボタン)のイベント
  | JoyHatEvent
    { jeHatId :: HatId
    , jeHats  :: [JoyHat] -- ^ 押されている `JoyHat` のリスト
    }
  deriving (Eq, Show, Read, Generic)

instance Binary JoystickEvent

-- | ジョイスティックのボタン番号(どのボタンか?)
type JoystickButton = Word8

-- | ハットスイッチの識別子(どのハットスイッチか?上下左右のボタンで一つのハットスイッチ。)
type HatId = Word8

-- | ボタンアクション
data InputMotion
  = Pressed -- ^ 押した
  | Released -- ^ 離した
  deriving (Eq, Show, Read, Generic)

instance Binary InputMotion

-- | ハットスイッチ(十字ボタン)
data JoyHat
  = HatUp -- ^ 上ボタン
  | HatDown -- ^ 下ボタン
  | HatLeft -- ^ 左ボタン
  | HatRight -- ^ 右ボタン
  deriving (Eq, Show, Read, Generic)

instance Binary JoyHat