Unify menu event handling and display
This commit is contained in:
+59
-2
@@ -3,6 +3,7 @@ module Dodge.Menu
|
||||
import Dodge.Data
|
||||
import Dodge.Data.Menu
|
||||
import Dodge.Config.Data
|
||||
import Dodge.Config.Update
|
||||
import SDL
|
||||
import SDL.Internal.Numbered
|
||||
import Dodge.Layout
|
||||
@@ -17,12 +18,19 @@ import Data.Maybe
|
||||
data MenuOption
|
||||
= Toggle
|
||||
{ _moKey :: Scancode
|
||||
, _moEffect :: World -> Maybe World
|
||||
, _moEff :: World -> Maybe World
|
||||
, _moString :: World -> String
|
||||
}
|
||||
| Toggle2
|
||||
{ _moKey1 :: Scancode
|
||||
, _moEff1 :: World -> Maybe World
|
||||
, _moKey2 :: Scancode
|
||||
, _moEff2 :: World -> Maybe World
|
||||
, _moString :: World -> String
|
||||
}
|
||||
| InvisibleToggle
|
||||
{ _moKey :: Scancode
|
||||
, _moEffect :: World -> Maybe World
|
||||
, _moEff :: World -> Maybe World
|
||||
}
|
||||
|
||||
optionsOptions :: [MenuOption]
|
||||
@@ -30,9 +38,57 @@ optionsOptions =
|
||||
[ Toggle ScancodeV (pushMenu SoundOptionMenu) (const "VOLUME")
|
||||
, Toggle ScancodeG (pushMenu GraphicsOptionMenu) (const "GRAPHICS")
|
||||
]
|
||||
levelMenuOptions :: [MenuOption]
|
||||
levelMenuOptions =
|
||||
[ InvisibleToggle ScancodeEscape (const Nothing)
|
||||
, InvisibleToggle ScancodeO (pushMenu OptionMenu)
|
||||
, InvisibleToggle ScancodeC (pushMenu ControlList)
|
||||
]
|
||||
soundMenuOptions :: [MenuOption]
|
||||
soundMenuOptions =
|
||||
[ Toggle2 ScancodeY (master dec . sw)
|
||||
ScancodeU (master inc . sw) (\w -> "MASTER VOLUME:" ++ mavol w)
|
||||
, Toggle2 ScancodeH (soundEffs dec . sw)
|
||||
ScancodeJ (soundEffs inc . sw) (\w -> "EFFECTS VOLUME:" ++ snvol w)
|
||||
, Toggle2 ScancodeN (music dec . sw)
|
||||
ScancodeM (music inc . sw) (\w -> "MUSIC VOLUME:" ++ muvol w)
|
||||
]
|
||||
where
|
||||
dec x = max 0 (x - 0.1)
|
||||
inc x = min 1 (x + 0.1)
|
||||
sw w = w & sideEffects %~ (setVol (_config w) : )
|
||||
master g = Just . (config . volume_master %~ g)
|
||||
soundEffs g = Just . (config . volume_sound %~ g)
|
||||
music g = Just . (config . volume_music %~ g)
|
||||
cfig w = _config w
|
||||
mavol w = f $ _volume_master $ cfig w
|
||||
snvol w = f $ _volume_sound $ cfig w
|
||||
muvol w = f $ _volume_music $ cfig w
|
||||
f x = show (round $ 10 * x :: Int)
|
||||
|
||||
pushMenu :: MenuLayer -> World -> Maybe World
|
||||
pushMenu ml w' = Just $ w' & menuLayers %~ (ml :)
|
||||
|
||||
--soundOptions :: [MenuOption]
|
||||
--soundOptions =
|
||||
-- [ Toggle2 ScancodeY
|
||||
|
||||
graphicsMenuOptions :: [MenuOption]
|
||||
graphicsMenuOptions =
|
||||
[ Toggle ScancodeW (Just . (config . wall_textured %~ not)) wtextstring
|
||||
, Toggle ScancodeS upf resostring
|
||||
]
|
||||
where
|
||||
wtextstring w = "WALL TEXTURES:" ++ show (_wall_textured $ _config w)
|
||||
resostring w = "RESOLUTION: 1/" ++ show (_resolution_factor $ _config w)
|
||||
upf w = Just $ updateFramebufferSize $ w & config . resolution_factor %~ cycleResolution
|
||||
|
||||
cycleResolution :: (Eq a, Num a, Num p) => a -> p
|
||||
cycleResolution 1 = 2
|
||||
cycleResolution 2 = 4
|
||||
cycleResolution 4 = 1
|
||||
cycleResolution _ = 1
|
||||
|
||||
pauseMenuOptions :: [MenuOption]
|
||||
pauseMenuOptions =
|
||||
[ Toggle ScancodeN startNewGame (const "NEW LEVEL")
|
||||
@@ -42,6 +98,7 @@ pauseMenuOptions =
|
||||
, InvisibleToggle ScancodeEscape (const Nothing)
|
||||
]
|
||||
|
||||
startNewGame :: World -> Maybe World
|
||||
startNewGame w = Just $ w
|
||||
& menuLayers .~ [WaitMessage "GENERATING..." 1]
|
||||
& worldEvents .~ const aNewGame
|
||||
|
||||
Reference in New Issue
Block a user