You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.5 KiB

  1. use log::warn;
  2. use serde::{Deserialize, Serialize};
  3. use serde_json::from_reader;
  4. use smallvec::{smallvec, SmallVec};
  5. use space_crush_common::misc::{Vfs, WorldHelper as _};
  6. use specs::World;
  7. use crate::{misc::VirtualKeyCode, Error};
  8. #[derive(Debug, Default, Serialize, Deserialize)]
  9. pub struct Config {
  10. #[serde(default)]
  11. pub video: Video,
  12. #[serde(default)]
  13. pub input: Input,
  14. }
  15. #[derive(Debug, Serialize, Deserialize)]
  16. pub struct Video {
  17. #[serde(default = "defaults::resolution")]
  18. pub resolution: (u32, u32),
  19. #[serde(default = "defaults::multisampling")]
  20. pub multisampling: u16,
  21. #[serde(default = "defaults::fullscreen")]
  22. pub fullscreen: bool,
  23. #[serde(default = "defaults::windowed")]
  24. pub windowed: bool,
  25. }
  26. #[derive(Debug, Serialize, Deserialize)]
  27. pub struct Input {
  28. #[serde(default = "defaults::key_camera_move_up")]
  29. pub key_camera_move_up: VirtualKeyCodes,
  30. #[serde(default = "defaults::key_camera_move_down")]
  31. pub key_camera_move_down: VirtualKeyCodes,
  32. #[serde(default = "defaults::key_camera_move_left")]
  33. pub key_camera_move_left: VirtualKeyCodes,
  34. #[serde(default = "defaults::key_camera_move_right")]
  35. pub key_camera_move_right: VirtualKeyCodes,
  36. #[serde(default = "defaults::speed_camera_move")]
  37. pub speed_camera_move: f32,
  38. #[serde(default = "defaults::speed_camera_zoom")]
  39. pub speed_camera_zoom: f32,
  40. }
  41. type VirtualKeyCodes = SmallVec<[VirtualKeyCode; 2]>;
  42. impl Config {
  43. pub fn new(world: &World) -> Result<Self, Error> {
  44. let vfs = world.resource::<Vfs>()?;
  45. let config = match vfs.join("config.json")?.open_file() {
  46. Ok(mut file) => from_reader(&mut file)?,
  47. Err(err) => {
  48. warn!(
  49. "Unable to load config file, falling back to default config: {}",
  50. err
  51. );
  52. Config::default()
  53. }
  54. };
  55. Ok(config)
  56. }
  57. }
  58. impl Default for Video {
  59. fn default() -> Self {
  60. Self {
  61. resolution: defaults::resolution(),
  62. multisampling: defaults::multisampling(),
  63. fullscreen: defaults::fullscreen(),
  64. windowed: defaults::windowed(),
  65. }
  66. }
  67. }
  68. impl Default for Input {
  69. fn default() -> Self {
  70. Self {
  71. key_camera_move_up: defaults::key_camera_move_up(),
  72. key_camera_move_down: defaults::key_camera_move_down(),
  73. key_camera_move_left: defaults::key_camera_move_left(),
  74. key_camera_move_right: defaults::key_camera_move_right(),
  75. speed_camera_move: defaults::speed_camera_move(),
  76. speed_camera_zoom: defaults::speed_camera_zoom(),
  77. }
  78. }
  79. }
  80. mod defaults {
  81. use super::*;
  82. pub fn resolution() -> (u32, u32) {
  83. (1280, 720)
  84. }
  85. pub fn multisampling() -> u16 {
  86. 0
  87. }
  88. pub fn fullscreen() -> bool {
  89. true
  90. }
  91. pub fn windowed() -> bool {
  92. true
  93. }
  94. pub fn key_camera_move_up() -> VirtualKeyCodes {
  95. smallvec![VirtualKeyCode::W, VirtualKeyCode::Up]
  96. }
  97. pub fn key_camera_move_down() -> VirtualKeyCodes {
  98. smallvec![VirtualKeyCode::S, VirtualKeyCode::Down]
  99. }
  100. pub fn key_camera_move_left() -> VirtualKeyCodes {
  101. smallvec![VirtualKeyCode::A, VirtualKeyCode::Left]
  102. }
  103. pub fn key_camera_move_right() -> VirtualKeyCodes {
  104. smallvec![VirtualKeyCode::D, VirtualKeyCode::Right]
  105. }
  106. pub fn speed_camera_move() -> f32 {
  107. 500.0
  108. }
  109. pub fn speed_camera_zoom() -> f32 {
  110. 100.0
  111. }
  112. }