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.

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