module Types.Util where import qualified Data.Text as T import qualified Data.Map.Strict as M import qualified SDL import qualified SDL.Internal.Numbered as SDL (fromNumber) import qualified SDL.Raw.Enum as SDLRaw -- internal imports import Types.Subsystems type Progress = (Float, T.Text) type ActionTranslation = M.Map (SDL.Scancode, ActionModifiers) Action data ActionModifiers = ActionModifiers { modLeftShift :: Bool , modRightShift :: Bool , modLeftCtrl :: Bool , modRightCtrl :: Bool , modLeftAlt :: Bool , modAltGr :: Bool , modCapsLock :: Bool } deriving (Show, Eq, Ord) compareSDLModifiers :: ActionModifiers -> SDL.KeyModifier -> Bool compareSDLModifiers mod sdlmod = modLeftShift mod == SDL.keyModifierLeftShift sdlmod && modRightShift mod == SDL.keyModifierRightShift sdlmod && modLeftCtrl mod == SDL.keyModifierLeftCtrl sdlmod && modRightCtrl mod == SDL.keyModifierRightCtrl sdlmod && modLeftAlt mod == SDL.keyModifierLeftAlt sdlmod && modAltGr mod == SDL.keyModifierAltGr sdlmod && modCapsLock mod == SDL.keyModifierCapsLock sdlmod translateSDLModifiers :: SDL.KeyModifier -> ActionModifiers translateSDLModifiers sdlmod = ActionModifiers { modLeftShift = SDL.keyModifierLeftShift sdlmod , modRightShift = SDL.keyModifierRightShift sdlmod , modLeftCtrl = SDL.keyModifierLeftCtrl sdlmod , modRightCtrl = SDL.keyModifierRightCtrl sdlmod , modLeftAlt = SDL.keyModifierLeftAlt sdlmod , modAltGr = SDL.keyModifierAltGr sdlmod , modCapsLock = SDL.keyModifierCapsLock sdlmod } nonmod = ActionModifiers False False False False False False False defaultTranslation :: ActionTranslation defaultTranslation = M.fromList [ ((SDL.ScancodeW, nonmod), MoveUp) , ((SDL.ScancodeS, nonmod), MoveDown) , ((SDL.ScancodeA, nonmod), MoveLeft) , ((SDL.ScancodeD, nonmod), MoveRight) , ((SDL.ScancodeSpace, nonmod), Jump) , ((SDL.ScancodeSpace, nonmod {modLeftShift = True}), JumpDown) , ((SDL.ScancodeF, nonmod), Activate) , ((SDL.Scancode1, nonmod), ReleasePowerup1) , ((SDL.Scancode2, nonmod), ReleasePowerup2) , ((SDL.Scancode3, nonmod), ReleasePowerup3) , ((SDL.ScancodeLCtrl, nonmod), Spit) , ((SDL.ScancodePause, nonmod), Pause) ]