Files
loop/src/Dodge/Data/Config.hs
T
2025-11-21 11:34:06 +00:00

183 lines
4.5 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
= 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