module Dodge.Event.Menu ( handlePressedKeyInMenu ) where import Dodge.Data import Dodge.Rooms import Dodge.Floor import Dodge.Initialisation import Dodge.SoundLogic import Dodge.LoadConfig import Data.Maybe import qualified Data.Set as S import Control.Lens import SDL handlePressedKeyInMenu :: MenuLayer -> Scancode -> World -> Maybe World handlePressedKeyInMenu mState scode w = case mState of LevelMenu _ -> case scode of ScancodeEscape -> Nothing ScancodeO -> goToOptionMenu w _ -> startLevel w PauseMenu -> case scode of ScancodeEscape -> Nothing ScancodeR -> return $ fromMaybe w $ _storedLevel w ScancodeN -> Just $ putSound $ generateLevel 1 $ initialWorld {_randGen = _randGen w} ScancodeO -> goToOptionMenu w _ -> unpause w GameOverMenu -> case scode of ScancodeEscape -> Nothing ScancodeR -> Just $ fromMaybe w $ _storedLevel w ScancodeN -> Just $ putSound $ generateLevel 1 $ initialWorld {_randGen = _randGen w} ScancodeO -> goToOptionMenu w _ -> Just w OptionMenu -> case scode of ScancodeY -> Just $ w & config . volume_master %~ dec ScancodeU -> Just $ w & config . volume_master %~ inc ScancodeH -> Just $ w & config . volume_sound %~ dec ScancodeJ -> Just $ w & config . volume_sound %~ inc ScancodeN -> Just $ w & config . volume_music %~ dec ScancodeM -> Just $ w & config . volume_music %~ inc _ -> Just $ w & menuLayers %~ (ConfigSaveScreen 1:) . tail & configNeedsUpdate .~ False _ -> Just w where unpause w' = Just . resumeSound $ w' {_menuLayers = []} startLevel = unpause . storeLevel putSound = id -- set loadedSounds (_loadedSounds w) dec x = max 0 (x - 0.1) inc x = min 1 (x + 0.1) goToOptionMenu w = Just $ w & menuLayers %~ (OptionMenu :) & configNeedsUpdate .~ True storeLevel :: World -> World storeLevel w = case _storedLevel w of Nothing -> w & storedLevel ?~ w _ -> w