use log::warn; use serde::{Deserialize, Serialize}; use serde_json::from_reader; use smallvec::{smallvec, SmallVec}; use space_crush_common::misc::{Vfs, WorldHelper as _}; use specs::World; use crate::{misc::VirtualKeyCode, Error}; #[derive(Debug, Default, Serialize, Deserialize)] pub struct Config { #[serde(default)] pub video: Video, #[serde(default)] pub input: Input, } #[derive(Debug, Serialize, Deserialize)] pub struct Video { #[serde(default = "defaults::resolution")] pub resolution: (u32, u32), #[serde(default = "defaults::multisampling")] pub multisampling: u16, #[serde(default = "defaults::fullscreen")] pub fullscreen: bool, #[serde(default = "defaults::windowed")] pub windowed: bool, } #[derive(Debug, Serialize, Deserialize)] pub struct Input { #[serde(default = "defaults::key_camera_move_up")] pub key_camera_move_up: VirtualKeyCodes, #[serde(default = "defaults::key_camera_move_down")] pub key_camera_move_down: VirtualKeyCodes, #[serde(default = "defaults::key_camera_move_left")] pub key_camera_move_left: VirtualKeyCodes, #[serde(default = "defaults::key_camera_move_right")] pub key_camera_move_right: VirtualKeyCodes, #[serde(default = "defaults::speed_camera_move")] pub speed_camera_move: f32, #[serde(default = "defaults::speed_camera_zoom")] pub speed_camera_zoom: f32, } type VirtualKeyCodes = SmallVec<[VirtualKeyCode; 2]>; impl Config { pub fn new(world: &World) -> Result { let vfs = world.resource::()?; let config = match vfs.join("config.json")?.open_file() { Ok(mut file) => from_reader(&mut file)?, Err(err) => { warn!( "Unable to load config file, falling back to default config: {}", err ); Config::default() } }; Ok(config) } } impl Default for Video { fn default() -> Self { Self { resolution: defaults::resolution(), multisampling: defaults::multisampling(), fullscreen: defaults::fullscreen(), windowed: defaults::windowed(), } } } impl Default for Input { fn default() -> Self { Self { key_camera_move_up: defaults::key_camera_move_up(), key_camera_move_down: defaults::key_camera_move_down(), key_camera_move_left: defaults::key_camera_move_left(), key_camera_move_right: defaults::key_camera_move_right(), speed_camera_move: defaults::speed_camera_move(), speed_camera_zoom: defaults::speed_camera_zoom(), } } } mod defaults { use super::*; pub fn resolution() -> (u32, u32) { (1280, 720) } pub fn multisampling() -> u16 { 0 } pub fn fullscreen() -> bool { true } pub fn windowed() -> bool { true } pub fn key_camera_move_up() -> VirtualKeyCodes { smallvec![VirtualKeyCode::W, VirtualKeyCode::Up] } pub fn key_camera_move_down() -> VirtualKeyCodes { smallvec![VirtualKeyCode::S, VirtualKeyCode::Down] } pub fn key_camera_move_left() -> VirtualKeyCodes { smallvec![VirtualKeyCode::A, VirtualKeyCode::Left] } pub fn key_camera_move_right() -> VirtualKeyCodes { smallvec![VirtualKeyCode::D, VirtualKeyCode::Right] } pub fn speed_camera_move() -> f32 { 500.0 } pub fn speed_camera_zoom() -> f32 { 100.0 } }