Apply all world side effects using list

This commit is contained in:
2021-04-09 00:47:41 +02:00
parent feec924d5d
commit c42c5069ea
16 changed files with 106 additions and 82 deletions
+1 -1
View File
@@ -9,6 +9,7 @@ import Dodge.Update
import Dodge.Event import Dodge.Event
import Dodge.Render import Dodge.Render
import Dodge.LoadConfig import Dodge.LoadConfig
import Dodge.Config.Load
import Dodge.Config.Update import Dodge.Config.Update
import Dodge.LoadSound import Dodge.LoadSound
import Picture import Picture
@@ -47,7 +48,6 @@ main = do
doSideEffects :: PreloadData SoundOrigin -> World -> IO (PreloadData SoundOrigin) doSideEffects :: PreloadData SoundOrigin -> World -> IO (PreloadData SoundOrigin)
doSideEffects preData w = do doSideEffects preData w = do
startTicks <- SDL.ticks startTicks <- SDL.ticks
updateDodgeConfig w
void $ doDrawing (_renderData preData) w void $ doDrawing (_renderData preData) w
playPositionalSoundQueue (_loadedChunks $ _soundData preData) (_soundQueue w) playPositionalSoundQueue (_loadedChunks $ _soundData preData) (_soundQueue w)
newPlayingSounds <- playAndUpdate (_soundData preData) (_sounds w) newPlayingSounds <- playAndUpdate (_soundData preData) (_sounds w)
+23
View File
@@ -0,0 +1,23 @@
module Dodge.Config.Load
(
loadDodgeConfig
) where
import Dodge.Config.Data
import Data.Aeson
import System.Directory
loadDodgeConfig :: IO Configuration
loadDodgeConfig = do
fExists <- doesFileExist "data/dodge.config.json"
if fExists
then do
mayConfig <- decodeFileStrict "data/dodge.config.json"
case mayConfig of
Just config -> return config
Nothing -> do
putStrLn "invalid data/dodge.config.json, loading defaults"
return defaultConfig
else do
putStrLn "No data/data/dodge.config.json found, loading defaults"
return defaultConfig
+9 -6
View File
@@ -6,20 +6,23 @@ module Dodge.Config.Update
import Dodge.Data import Dodge.Data
import Dodge.Config.Data import Dodge.Config.Data
import Sound import Sound
import Preload.Data
import Data.Aeson (encodeFile) import Data.Aeson (encodeFile)
import Control.Monad (when) import Control.Monad (when)
updateDodgeConfig :: World -> IO () saveConfig :: Configuration -> PreloadData SoundOrigin -> IO (PreloadData SoundOrigin)
updateDodgeConfig w = case _menuLayers w of saveConfig cfig d = do
(ConfigSaveScreen : _) -> do
putStrLn "Saving config to data/dodge.config.json" putStrLn "Saving config to data/dodge.config.json"
encodeFile "data/dodge.config.json" cfig encodeFile "data/dodge.config.json" cfig
_ -> when (_configNeedsUpdate w) (setVolume cfig) return d
where
cfig = _config w
setVolume :: Configuration -> IO () setVolume :: Configuration -> IO ()
setVolume cfig = do setVolume cfig = do
setSoundVolume ( _volume_master cfig * _volume_sound cfig) setSoundVolume ( _volume_master cfig * _volume_sound cfig)
setMusicVolume ( _volume_master cfig * _volume_music cfig) setMusicVolume ( _volume_master cfig * _volume_music cfig)
setVol :: Configuration -> PreloadData SoundOrigin -> IO (PreloadData SoundOrigin)
setVol cfig d = do
setVolume cfig
return d
+6 -42
View File
@@ -10,27 +10,26 @@ module Dodge.Data
) )
where where
import Dodge.Data.Menu import Dodge.Data.Menu
import Dodge.Config.Data
import Dodge.LoadConfig.KeyConfig
import Preload.Data import Preload.Data
import Picture.Data import Picture.Data
import Geometry.Data import Geometry.Data
import Sound.Data import Sound.Data
import Control.Lens import Control.Lens
import Control.Monad.State import Control.Monad.State
import System.Random import System.Random
import Data.Graph.Inductive import Data.Graph.Inductive
import Data.Int (Int16)
import qualified Data.Set as S import qualified Data.Set as S
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import qualified Data.Map as M import qualified Data.Map as M
import qualified SDL.Mixer as Mix import qualified Data.DList as DL
import SDL (Scancode, MouseButton) import SDL (Scancode, MouseButton)
import qualified SDL.Mixer as Mix
import Graphics.Rendering.OpenGL (PrimitiveMode (..),GLfloat,Program,VertexArrayObject,BufferObject) import Graphics.Rendering.OpenGL (PrimitiveMode (..),GLfloat,Program,VertexArrayObject,BufferObject)
import Codec.Picture (Image,PixelRGBA8) import Codec.Picture (Image,PixelRGBA8)
import qualified Data.DList as DL
import Dodge.Config.Data
import Dodge.LoadConfig.KeyConfig
import Data.Int (Int16)
data World = World data World = World
{ _keys :: !(S.Set Scancode) { _keys :: !(S.Set Scancode)
@@ -85,7 +84,6 @@ data World = World
, _varMovementStrafeSpeedModifier :: Float , _varMovementStrafeSpeedModifier :: Float
, _debugMode :: Bool , _debugMode :: Bool
, _config :: Configuration , _config :: Configuration
, _configNeedsUpdate :: Bool
, _sideEffects :: [PreloadData SoundOrigin -> IO (PreloadData SoundOrigin)] , _sideEffects :: [PreloadData SoundOrigin -> IO (PreloadData SoundOrigin)]
, _doneSideEffects :: [PreloadData SoundOrigin -> IO (PreloadData SoundOrigin)] , _doneSideEffects :: [PreloadData SoundOrigin -> IO (PreloadData SoundOrigin)]
} }
@@ -526,8 +524,6 @@ data DamageType
data Either3 a b c = E3x1 a | E3x2 b | E3x3 c data Either3 a b c = E3x1 a | E3x2 b | E3x3 c
data WLID = WLID { _wlIDx :: Int, _wlIDy :: Int, _wlIDid :: Int}
data Wall data Wall
= Wall = Wall
{ _wlLine :: [Point2] , _wlID :: Int { _wlLine :: [Point2] , _wlID :: Int
@@ -596,36 +592,6 @@ data SoundOrigin = InventorySound
| GlassBreakSound Int | GlassBreakSound Int
deriving (Eq,Ord,Show) deriving (Eq,Ord,Show)
type Poly = [Point2]
data PSType = PutCrit Creature
| PutLS LightSource Picture
| PutButton Button
| PutFlIt FloorItem
| PutPressPlate PressPlate
| PutAutoDoor Point2 Point2
| PutBlock [Int] Color [Point2]
| PutLineBlock Wall Float Float Point2 Point2
| PutTriggerDoor Color (World -> Bool) Point2 Point2
| PutBtDoor Color Point2 Float Point2 Point2
| PutSwitchDoor Color Point2 Float Point2 Point2
| RandPS (State StdGen PSType)
| PutNothing
| CollectivePS
{ _collectiveID :: Int
, _collectiveNum :: Int
, _collectiveFunction :: [Int] -> State StdGen [PSType]
}
| LabelPS { _psLabel :: Int, _ps :: PSType}
| PutWindow { _pwPoly :: [Point2] , _pwColor :: Color
}
data PlacementSpot = PS
{ _psPos :: Point2
, _psRot :: Float
, _psType :: PSType
}
data SubNode a = SN a | InLink | OutLink
makeLenses ''World makeLenses ''World
makeLenses ''Cloud makeLenses ''Cloud
@@ -651,8 +617,6 @@ makeLenses ''ForceField
makeLenses ''FFState makeLenses ''FFState
makeLenses ''PressPlate makeLenses ''PressPlate
makeLenses ''Button makeLenses ''Button
makeLenses ''PSType
makeLenses ''PlacementSpot
numColor :: Int -> Color numColor :: Int -> Color
numColor 0 = (1,0,0,1) numColor 0 = (1,0,0,1)
-1
View File
@@ -236,7 +236,6 @@ defaultWorld = World
, _varMovementStrafeSpeedModifier = 3 , _varMovementStrafeSpeedModifier = 3
, _debugMode = True , _debugMode = True
, _config = defaultConfig , _config = defaultConfig
, _configNeedsUpdate = False
, _sideEffects = [] , _sideEffects = []
, _doneSideEffects = [] , _doneSideEffects = []
} }
-1
View File
@@ -128,4 +128,3 @@ before y (x:z:ys) | y == z = x
| otherwise = before y (z:ys) | otherwise = before y (z:ys)
after y (x:z:ys) | y == x = z after y (x:z:ys) | y == x = z
| otherwise = after y (z:ys) | otherwise = after y (z:ys)
+10 -9
View File
@@ -8,6 +8,7 @@ import Dodge.Floor
import Dodge.Initialisation import Dodge.Initialisation
import Dodge.SoundLogic import Dodge.SoundLogic
import Dodge.LoadConfig import Dodge.LoadConfig
import Dodge.Config.Update
import Data.Maybe import Data.Maybe
import qualified Data.Set as S import qualified Data.Set as S
@@ -39,14 +40,14 @@ handlePressedKeyInMenu mState scode w = case mState of
ScancodeC -> goToControls w ScancodeC -> goToControls w
_ -> Just w _ -> Just w
OptionMenu -> case scode of OptionMenu -> case scode of
ScancodeY -> Just $ w & config . volume_master %~ dec ScancodeY -> Just $ sw & config . volume_master %~ dec
ScancodeU -> Just $ w & config . volume_master %~ inc ScancodeU -> Just $ sw & config . volume_master %~ inc
ScancodeH -> Just $ w & config . volume_sound %~ dec ScancodeH -> Just $ sw & config . volume_sound %~ dec
ScancodeJ -> Just $ w & config . volume_sound %~ inc ScancodeJ -> Just $ sw & config . volume_sound %~ inc
ScancodeN -> Just $ w & config . volume_music %~ dec ScancodeN -> Just $ sw & config . volume_music %~ dec
ScancodeM -> Just $ w & config . volume_music %~ inc ScancodeM -> Just $ sw & config . volume_music %~ inc
_ -> Just $ w & menuLayers %~ ([ConfigSaveScreen , ConfigSaveScreen] ++) . tail _ -> Just $ w & menuLayers %~ tail
& configNeedsUpdate .~ False & sideEffects %~ (saveConfig (_config w) :)
ControlList -> Just $ w & menuLayers %~ tail ControlList -> Just $ w & menuLayers %~ tail
_ -> Just w _ -> Just w
where where
@@ -57,8 +58,8 @@ handlePressedKeyInMenu mState scode w = case mState of
dec x = max 0 (x - 0.1) dec x = max 0 (x - 0.1)
inc x = min 1 (x + 0.1) inc x = min 1 (x + 0.1)
goToOptionMenu w = Just $ w & menuLayers %~ (OptionMenu :) goToOptionMenu w = Just $ w & menuLayers %~ (OptionMenu :)
& configNeedsUpdate .~ True
goToControls w = Just $ w & menuLayers %~ (ControlList :) goToControls w = Just $ w & menuLayers %~ (ControlList :)
sw = w & sideEffects %~ (setVol (_config w) : )
storeLevel :: World -> World storeLevel :: World -> World
storeLevel w = case _storedLevel w of storeLevel w = case _storedLevel w of
+1 -1
View File
@@ -5,7 +5,6 @@ module Dodge.Floor
where where
import Geometry import Geometry
import Picture import Picture
import Dodge.Data import Dodge.Data
import Dodge.Rooms import Dodge.Rooms
import Dodge.Room.Data import Dodge.Room.Data
@@ -15,6 +14,7 @@ import Dodge.Creature
import Dodge.SoundLogic import Dodge.SoundLogic
import Dodge.RandomHelp import Dodge.RandomHelp
import Dodge.LightSources import Dodge.LightSources
import Dodge.LevelGen.Data
import Data.Tree import Data.Tree
+1
View File
@@ -6,6 +6,7 @@ module Dodge.Layout
-- imports {{{ -- imports {{{
import Dodge.Data import Dodge.Data
import Dodge.LevelGen import Dodge.LevelGen
import Dodge.LevelGen.Data
import Dodge.Base import Dodge.Base
import Dodge.RandomHelp import Dodge.RandomHelp
import Dodge.Graph import Dodge.Graph
+5 -8
View File
@@ -1,9 +1,10 @@
{-# LANGUAGE BangPatterns #-} {-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleInstances #-}
-- | deals with placement of objects within the world
-- after they have had their coordinates set by the layout
module Dodge.LevelGen module Dodge.LevelGen
( module Dodge.LevelGen ( module Dodge.LevelGen
, cutWalls , cutWalls
-- , createInnerWalls
, pairsToGraph , pairsToGraph
, makeButton , makeButton
, makeSwitch , makeSwitch
@@ -13,7 +14,6 @@ module Dodge.LevelGen
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.Room.Data import Dodge.Room.Data
import Dodge.LevelGen.Block import Dodge.LevelGen.Block
import Dodge.LevelGen.LineBlock import Dodge.LevelGen.LineBlock
import Dodge.LevelGen.Pathing import Dodge.LevelGen.Pathing
@@ -21,24 +21,21 @@ import Dodge.LevelGen.StaticWalls
import Dodge.LevelGen.AutoDoor import Dodge.LevelGen.AutoDoor
import Dodge.LevelGen.TriggerDoor import Dodge.LevelGen.TriggerDoor
import Dodge.LevelGen.Switch import Dodge.LevelGen.Switch
import Dodge.LevelGen.Data
import Geometry import Geometry
import Picture import Picture
import System.Random import System.Random
import Control.Monad.State import Control.Monad.State
import Data.List
import Data.Function
import Control.Applicative import Control.Applicative
import Control.Lens import Control.Lens
import Data.List
import Data.Function
import Data.Maybe import Data.Maybe
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import qualified Data.Set as S import qualified Data.Set as S
import qualified Data.Map as M import qualified Data.Map as M
-- deals with placement of objects within the world
-- after they have had their coordinates set by the layout
placeSpots :: [PlacementSpot] -> World -> World placeSpots :: [PlacementSpot] -> World -> World
placeSpots pss w = foldr placeSpot w basicPlacements placeSpots pss w = foldr placeSpot w basicPlacements
+40
View File
@@ -0,0 +1,40 @@
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE StrictData #-}
module Dodge.LevelGen.Data
where
import Dodge.Data
import Picture
import Control.Lens
import Control.Monad.State
import System.Random
data PSType = PutCrit Creature
| PutLS LightSource Picture
| PutButton Button
| PutFlIt FloorItem
| PutPressPlate PressPlate
| PutAutoDoor Point2 Point2
| PutBlock [Int] Color [Point2]
| PutLineBlock Wall Float Float Point2 Point2
| PutTriggerDoor Color (World -> Bool) Point2 Point2
| PutBtDoor Color Point2 Float Point2 Point2
| PutSwitchDoor Color Point2 Float Point2 Point2
| RandPS (State StdGen PSType)
| PutNothing
| CollectivePS
{ _collectiveID :: Int
, _collectiveNum :: Int
, _collectiveFunction :: [Int] -> State StdGen [PSType]
}
| LabelPS { _psLabel :: Int, _ps :: PSType}
| PutWindow { _pwPoly :: [Point2] , _pwColor :: Color
}
data PlacementSpot = PS
{ _psPos :: Point2
, _psRot :: Float
, _psType :: PSType
}
makeLenses ''PSType
makeLenses ''PlacementSpot
+1 -6
View File
@@ -1,15 +1,10 @@
module Dodge.LightSources where module Dodge.LightSources where
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.LevelGen.Data
import Geometry import Geometry
import Picture import Picture
--import Graphics.Gloss
--import Graphics.Gloss.Data.Vector
--import Graphics.Gloss.Geometry.Line
--import Graphics.Gloss.Geometry.Angle
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
lightAt p i = lightAt p i =
+1 -2
View File
@@ -4,8 +4,7 @@
{-# LANGUAGE StrictData #-} {-# LANGUAGE StrictData #-}
module Dodge.LoadConfig module Dodge.LoadConfig
( (
loadDodgeConfig module Dodge.LoadConfig.KeyConfig
, module Dodge.LoadConfig.KeyConfig
, module Dodge.Config.Data , module Dodge.Config.Data
) where ) where
import Dodge.LoadConfig.KeyConfig import Dodge.LoadConfig.KeyConfig
+4 -3
View File
@@ -2,16 +2,17 @@
{-# LANGUAGE StrictData #-} {-# LANGUAGE StrictData #-}
module Dodge.Room.Data module Dodge.Room.Data
where where
import Dodge.LevelGen.Data
import Geometry
import Dodge.Data
import Control.Lens import Control.Lens
data Room = Room data Room = Room
{ _rmPolys :: [Poly] { _rmPolys :: [ [Point2] ]
, _rmLinks :: [(Point2,Float)] , _rmLinks :: [(Point2,Float)]
, _rmPath :: [(Point2, Point2)] , _rmPath :: [(Point2, Point2)]
, _rmPS :: [PlacementSpot] , _rmPS :: [PlacementSpot]
, _rmBound :: Poly , _rmBound :: [Point2]
} }
data RoomLink = RL {_rlPos :: Point2, _rlRot :: Float} data RoomLink = RL {_rlPos :: Point2, _rlRot :: Float}
+1
View File
@@ -1,6 +1,7 @@
module Dodge.Room.Placement module Dodge.Room.Placement
where where
import Dodge.Data import Dodge.Data
import Dodge.LevelGen.Data
import Picture import Picture
import Dodge.Creature.Inanimate import Dodge.Creature.Inanimate
+1
View File
@@ -9,6 +9,7 @@ import Dodge.Item.Weapon
import Dodge.Creature import Dodge.Creature
import Dodge.Creature.Inanimate import Dodge.Creature.Inanimate
import Dodge.LevelGen import Dodge.LevelGen
import Dodge.LevelGen.Data
import Dodge.Base import Dodge.Base
import Dodge.RandomHelp import Dodge.RandomHelp
import Dodge.Default import Dodge.Default