Files
loop/src/Dodge/Data/Config.hs
T

160 lines
4.3 KiB
Haskell

{-# LANGUAGE StrictData #-}
{-# LANGUAGE TemplateHaskell #-}
module Dodge.Data.Config where
import Shape.Data
import Control.Lens
import Data.Aeson
import Data.Aeson.TH
import qualified Data.Set as S
{-# ANN module "HLint: ignore Use camelCase" #-}
data NumShadowCasters
= NumShadowCasters0
| NumShadowCasters1
| NumShadowCasters2
| NumShadowCasters3
| NumShadowCasters4
| NumShadowCasters5
| NumShadowCasters6
| NumShadowCasters7
| NumShadowCasters8
| NumShadowCasters9
| NumShadowCasters10
| NumShadowCasters11
| NumShadowCasters12
| NumShadowCasters13
| NumShadowCasters14
| NumShadowCasters15
| NumShadowCasters16
| NumShadowCasters17
| NumShadowCasters18
| NumShadowCasters19
| NumShadowCasters20
deriving (Show,Eq,Bounded,Ord,Enum)
data Configuration = Configuration
{ _volume_master :: Float
, _volume_sound :: Float
, _volume_music :: Float
, _graphics_cloud_shadows :: Bool
, _graphics_distortions :: Bool
, _graphics_bloom :: Bool
, _graphics_shadow_rendering :: ShadowRendering
, _graphics_shadow_size :: Importance
, _graphics_downsize_resolution :: ResFactor
, _graphics_world_resolution :: ResFactor
, _graphics_distortion_resolution :: ResFactor
, _graphics_num_shadow_casters :: NumShadowCasters
, _windowX :: Int
, _windowY :: Int
, _windowPosX :: Int
, _windowPosY :: Int
, _gameplay_rotate_to_wall :: Bool
, _debug_view_clip_bounds :: RoomClipping
, _debug_booleans :: S.Set DebugBool -- consider using Data.BitSet
}
deriving (Show)
windowXFloat :: Configuration -> Float
windowXFloat = fromIntegral . _windowX
windowYFloat :: Configuration -> Float
windowYFloat = fromIntegral . _windowY
data DebugBool
= Show_ms_frame
| Enable_debug
| Show_sound
| Noclip
| Cr_status
| Cr_awareness
| Mouse_position
| View_boundaries
| Walls_info
| Pathing
| Remove_LOS
| Cull_more_lights
| Close_shape_culling
| Show_bound_box
| Bound_box_screen
| Show_wall_search_rays
| Show_dda_test
| Collision_test
| Show_far_wall_detect
| Show_walls_near_point_cursor
| Show_walls_near_point_you
| Show_zone_near_point_cursor
| Inspect_wall
| Show_nodes_near_select
| Show_path_between
deriving (Eq, Ord, Bounded, Enum, Show)
data ResFactor = DoubleRes | FullRes | HalfRes | QuarterRes | EighthRes | SixteenthRes
deriving (Show, Eq, Ord, Enum, Bounded)
data ShadowRendering
= GeoObjShads
| InstancingShads
| NoObjShads
| NoShadows
| NoLighting
| ComputeShader
deriving (Show, Eq, Ord, Enum, Bounded)
data RoomClipping = NoRoomClipBoundaries | AllRoomClipBoundaries | IntersectingRoomClipBoundaries
deriving (Show, Eq, Ord, Enum, Bounded)
applyResFactor :: ResFactor -> Int -> Int
applyResFactor rf = case rf of
DoubleRes -> (2*)
FullRes -> id
HalfRes -> (`div` 2)
QuarterRes -> (`div` 4)
EighthRes -> (`div` 8)
SixteenthRes -> (`div` 16)
--resFactorNum :: ResFactor -> Int
--resFactorNum rf = case rf of
-- FullRes -> 1
-- HalfRes -> 2
-- QuarterRes -> 4
-- EighthRes -> 8
-- SixteenthRes -> 16
defaultConfig :: Configuration
defaultConfig =
Configuration
{ _volume_master = 1
, _volume_sound = 1
, _volume_music = 0
, _graphics_cloud_shadows = True
, _graphics_bloom = True
, _graphics_shadow_rendering = GeoObjShads
, _graphics_shadow_size = Typical
, _graphics_distortions = True
, _graphics_downsize_resolution = SixteenthRes
, _graphics_world_resolution = QuarterRes
, _graphics_distortion_resolution = FullRes
, _graphics_num_shadow_casters = toEnum 10
, _windowX = 800
, _windowY = 600
, _windowPosX = 0
, _windowPosY = 0
, _gameplay_rotate_to_wall = True
, _debug_booleans = S.singleton Show_ms_frame
, _debug_view_clip_bounds = NoRoomClipBoundaries
}
debugOn :: DebugBool -> Configuration -> Bool
debugOn db = S.member db . _debug_booleans
makeLenses ''Configuration
deriveJSON defaultOptions ''NumShadowCasters
deriveJSON defaultOptions ''ResFactor
deriveJSON defaultOptions ''ShadowRendering
deriveJSON defaultOptions ''RoomClipping
deriveJSON defaultOptions ''DebugBool
deriveJSON defaultOptions ''Configuration