Unify menu event handling and display

This commit is contained in:
2021-09-03 13:48:52 +01:00
parent 6a2df15d0d
commit 111b86d2df
3 changed files with 104 additions and 100 deletions
+59 -2
View File
@@ -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