{-# 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 = NumLight0 | NumLight1 | NumLight2 | NumLight3 | NumLight4 | NumLight5 | NumLight6 | NumLight7 | NumLight8 | NumLight9 | NumLight10 | NumLight11 | NumLight12 | NumLight13 | NumLight14 | NumLight15 | NumLight16 | NumLight17 | NumLight18 | NumLight19 | NumLight20 | NumLight21 | NumLight22 | NumLight23 | NumLight24 | NumLight25 | NumLight26 | NumLight27 | NumLight28 | NumLight29 | NumLight30 deriving (Show,Eq,Bounded,Ord,Enum) data Config = Config { _volume_master :: Float , _volume_sound :: Float , _volume_music :: Float , _gr_cloud_shadows :: Bool , _gr_distortions :: Bool , _gr_bloom :: Bool , _gr_shadow_rendering :: ShadowRendering , _gr_shadows_on_clouds :: ShadowRendering , _gr_shadow_size :: Importance , _gr_downsize_res :: ResFactor , _gr_world_res :: ResFactor , _gr_num_shadow_casters :: NumShadowCasters , _windowX :: Int --size , _windowY :: Int , _windowPosX :: Int --position in os , _windowPosY :: Int , _gameplay_rotate_to_wall :: Bool , _debug_view_clip_bounds :: RoomClipping , _debug_booleans :: S.Set DebugBool -- consider using Data.BitSet } deriving (Show) windowXFloat :: Config -> Float windowXFloat = fromIntegral . _windowX windowYFloat :: Config -> Float windowYFloat = fromIntegral . _windowY data DebugBool = Show_ms_frame | Display_debug | Debug_get | Debug_put | 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 | Circ_collision_test | Show_far_wall_detect | Show_walls_near_point_cursor | Show_walls_near_point_you | Show_walls_near_segment | Show_zone_near_point_cursor | Show_zone_circ | Inspect_wall | Show_path_between | Show_writable_values | Show_mouse_click_pos deriving (Eq, Ord, Bounded, Enum, Show) data ResFactor = DoubleRes | FullRes | HalfRes | QuarterRes | EighthRes | SixteenthRes deriving (Show, Eq, Ord, Enum, Bounded) data ShadowRendering = GeoObjShads | NoObjShads | NoShadows | NoLighting 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) applyResFactorF :: ResFactor -> Float -> Float applyResFactorF rf = case rf of DoubleRes -> (2*) FullRes -> id HalfRes -> (/ 2) QuarterRes -> (/ 4) EighthRes -> (/ 8) SixteenthRes -> (/ 16) --resFactorNum :: ResFactor -> Int --resFactorNum rf = case rf of -- FullRes -> 1 -- HalfRes -> 2 -- QuarterRes -> 4 -- EighthRes -> 8 -- SixteenthRes -> 16 defaultConfig :: Config defaultConfig = Config { _volume_master = 1 , _volume_sound = 1 , _volume_music = 0 , _gr_cloud_shadows = True , _gr_bloom = True , _gr_shadow_rendering = GeoObjShads , _gr_shadows_on_clouds = NoObjShads , _gr_shadow_size = Typical , _gr_distortions = True , _gr_downsize_res = EighthRes , _gr_world_res = QuarterRes , _gr_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 -> Config -> Bool debugOn db = S.member db . _debug_booleans makeLenses ''Config deriveJSON defaultOptions ''NumShadowCasters deriveJSON defaultOptions ''ResFactor deriveJSON defaultOptions ''ShadowRendering deriveJSON defaultOptions ''RoomClipping deriveJSON defaultOptions ''DebugBool deriveJSON defaultOptions ''Config