{-# 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