Skip to main content

flatland_client_lib/
settings.rs

1//! Client keybind settings (`assets/config/client-settings.yaml`).
2
3use std::path::PathBuf;
4
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub struct ClientSettings {
9    #[serde(default = "default_version")]
10    pub version: String,
11    #[serde(default)]
12    pub keys: ClientKeyBindings,
13}
14
15fn default_version() -> String {
16    "1".into()
17}
18
19impl Default for ClientSettings {
20    fn default() -> Self {
21        Self {
22            version: default_version(),
23            keys: ClientKeyBindings::default(),
24        }
25    }
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
29pub struct ClientKeyBindings {
30    #[serde(default = "default_target_t1")]
31    pub target_t1: String,
32    #[serde(default = "default_target_t2")]
33    pub target_t2: String,
34    #[serde(default = "default_advance_t1")]
35    pub advance_t1: String,
36    #[serde(default = "default_advance_t2")]
37    pub advance_t2: String,
38    #[serde(default = "default_auto_t1")]
39    pub auto_t1: String,
40    #[serde(default = "default_auto_t2")]
41    pub auto_t2: String,
42    #[serde(default = "default_loadout")]
43    pub loadout_menu: String,
44    #[serde(default = "default_rotation_editor")]
45    pub rotation_editor: String,
46    #[serde(default = "default_dodge")]
47    pub dodge: String,
48    #[serde(default = "default_lunge")]
49    pub lunge: String,
50    #[serde(default = "default_block")]
51    pub block: String,
52    #[serde(default = "default_clear")]
53    pub clear_target_t1: String,
54}
55
56fn default_target_t1() -> String {
57    "Tab".into()
58}
59fn default_target_t2() -> String {
60    "Shift+Tab".into()
61}
62fn default_advance_t1() -> String {
63    "1".into()
64}
65fn default_advance_t2() -> String {
66    "2".into()
67}
68fn default_auto_t1() -> String {
69    "r".into()
70}
71fn default_auto_t2() -> String {
72    "Shift+r".into()
73}
74fn default_loadout() -> String {
75    "l".into()
76}
77fn default_rotation_editor() -> String {
78    "o".into()
79}
80fn default_dodge() -> String {
81    ";".into()
82}
83fn default_lunge() -> String {
84    "v".into()
85}
86fn default_block() -> String {
87    "'".into()
88}
89fn default_clear() -> String {
90    "0".into()
91}
92
93impl Default for ClientKeyBindings {
94    fn default() -> Self {
95        Self {
96            target_t1: default_target_t1(),
97            target_t2: default_target_t2(),
98            advance_t1: default_advance_t1(),
99            advance_t2: default_advance_t2(),
100            auto_t1: default_auto_t1(),
101            auto_t2: default_auto_t2(),
102            loadout_menu: default_loadout(),
103            rotation_editor: default_rotation_editor(),
104            dodge: default_dodge(),
105            lunge: default_lunge(),
106            block: default_block(),
107            clear_target_t1: default_clear(),
108        }
109    }
110}
111
112fn find_settings_path() -> PathBuf {
113    let manifest = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
114    for ancestor in manifest.ancestors() {
115        let candidate = ancestor.join("assets/config/client-settings.yaml");
116        if candidate.is_file() {
117            return candidate;
118        }
119    }
120    PathBuf::from("assets/config/client-settings.yaml")
121}
122
123pub fn load_client_settings() -> ClientSettings {
124    let path = find_settings_path();
125    let Ok(raw) = std::fs::read_to_string(&path) else {
126        return ClientSettings::default();
127    };
128    serde_yaml::from_str(&raw).unwrap_or_default()
129}