Air-Trap 1.0.0
A multiplayer R-Type clone game engine built with C++23 and ECS architecture
Loading...
Searching...
No Matches
Settings.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** Air-Trap
4** File description:
5** Settings - Game
6 * configuration and preferences
7*/
8
9#ifndef RTYPE_CLIENT_CORE_SETTINGS_HPP_
10 #define RTYPE_CLIENT_CORE_SETTINGS_HPP_
11
12#include "RType/Logger.hpp"
14#include "Utils/KeyAction.hpp"
15
16#include <SFML/Window/Keyboard.hpp>
17#include <algorithm>
18#include <filesystem>
19#include <fstream>
20#include <functional>
21#include <iostream>
22#include <sstream>
23#include <string>
24#include <unordered_map>
25#include <vector>
26
27namespace rtp::client
28{
33 enum class Language {
34 English,
35 French,
36 Spanish,
37 German,
39 };
40
45 enum class ColorBlindMode {
46 None,
47 Protanopia, // Red-blind
48 Deuteranopia, // Green-blind
49 Tritanopia // Blue-blind
50 };
51
56 enum class Difficulty {
57 Easy,
58 Normal,
59 Hard,
61 };
62
67 class Settings {
68 public:
69 Settings();
70
71 sf::Keyboard::Key getKey(KeyAction action) const;
72 void setKey(KeyAction action, sf::Keyboard::Key key);
73 std::string getKeyName(sf::Keyboard::Key key) const;
74
75 float getMasterVolume() const
76 {
77 return _masterVolume;
78 }
79
80 void setMasterVolume(float volume);
81
82 float getMusicVolume() const
83 {
84 return _musicVolume;
85 }
86
87 void setMusicVolume(float volume);
88
89 float getSfxVolume() const
90 {
91 return _sfxVolume;
92 }
93
94 void setSfxVolume(float volume);
95
96 using VolumeCallback = std::function<void(float)>;
97
99 {
100 _onMasterVolumeChanged.push_back(callback);
101 }
102
104 {
105 _onMusicVolumeChanged.push_back(callback);
106 }
107
109 {
110 _onSfxVolumeChanged.push_back(callback);
111 }
112
114 {
115 return _language;
116 }
117
118 void setLanguage(Language lang);
119 std::string getLanguageName(Language lang) const;
120
121 using LanguageCallback = std::function<void(Language)>;
122
124 {
125 _onLanguageChanged.push_back(callback);
126 }
127
129 {
130 return _colorBlindMode;
131 }
132
134 {
135 _colorBlindMode = mode;
136 }
137
138 std::string getColorBlindModeName(ColorBlindMode mode) const;
139
140 bool getHighContrast() const
141 {
142 return _highContrast;
143 }
144
145 void setHighContrast(bool enabled)
146 {
147 _highContrast = enabled;
148 }
149
151 {
152 return _difficulty;
153 }
154
155 void setDifficulty(Difficulty difficulty)
156 {
157 _difficulty = difficulty;
158 }
159
160 std::string getDifficultyName(Difficulty difficulty) const;
161
166
168 {
169 _selectedWeapon = weapon;
170 }
171
172 std::string getWeaponName(ecs::components::WeaponKind weapon) const;
173
174 bool getGamepadEnabled() const
175 {
176 return _gamepadEnabled;
177 }
178
179 void setGamepadEnabled(bool enabled)
180 {
181 _gamepadEnabled = enabled;
182 }
183
184 float getGamepadDeadzone() const
185 {
186 return _gamepadDeadzone;
187 }
188
189 void setGamepadDeadzone(float deadzone)
190 {
191 _gamepadDeadzone = std::clamp(deadzone, 0.0f, 100.0f);
192 }
193
194 unsigned int getGamepadShootButton() const
195 {
196 return _gamepadShootButton;
197 }
198
199 void setGamepadShootButton(unsigned int button)
200 {
201 _gamepadShootButton = button;
202 }
203
204 unsigned int getGamepadReloadButton() const
205 {
207 }
208
209 void setGamepadReloadButton(unsigned int button)
210 {
211 _gamepadReloadButton = button;
212 }
213
214 unsigned int getGamepadValidateButton() const
215 {
217 }
218
219 void setGamepadValidateButton(unsigned int button)
220 {
221 _gamepadValidateButton = button;
222 }
223
225 {
226 return _gamepadCursorSpeed;
227 }
228
229 void setGamepadCursorSpeed(float speed)
230 {
231 _gamepadCursorSpeed = std::clamp(speed, 1.0f, 20.0f);
232 }
233
234 unsigned int getGamepadPauseButton() const
235 {
236 return _gamepadPauseButton;
237 }
238
239 void setGamepadPauseButton(unsigned int button)
240 {
241 _gamepadPauseButton = button;
242 }
243
244 bool save(const std::string &filename = "config/settings.cfg");
245 bool load(const std::string &filename = "config/settings.cfg");
246
247 bool loadFromClientJson(const std::string &filename);
248
249 private:
250 std::unordered_map<KeyAction, sf::Keyboard::Key> _keyBindings;
252 sf::Keyboard::Key stringToKey(const std::string &keyName) const;
253
254 float _masterVolume{1.0f};
255 float _musicVolume{0.7f};
256 float _sfxVolume{0.8f};
257
259
261 bool _highContrast{false};
264
265 // Gamepad settings
266 bool _gamepadEnabled{true};
267 float _gamepadDeadzone{15.0f}; // Percentage (0-100)
268 unsigned int _gamepadShootButton{0}; // Button A (Xbox) / X (PlayStation)
269 unsigned int _gamepadReloadButton{2}; // Button X (Xbox) / Square (PlayStation)
270 unsigned int _gamepadValidateButton{0}; // Button A for menu navigation
271 float _gamepadCursorSpeed{8.0f}; // Cursor speed for menu navigation (1-20)
272 unsigned int _gamepadPauseButton{7}; // Button Start/Menu (Xbox/generic)
273
274 std::vector<VolumeCallback> _onMasterVolumeChanged;
275 std::vector<VolumeCallback> _onMusicVolumeChanged;
276 std::vector<VolumeCallback> _onSfxVolumeChanged;
277 std::vector<LanguageCallback> _onLanguageChanged;
278 };
279} // namespace rtp::client
280
281#endif // RTYPE_CLIENT_CORE_SETTINGS_HPP_
Logger declaration with support for multiple log levels.
Manages game settings and preferences.
Definition Settings.hpp:67
void setDifficulty(Difficulty difficulty)
Definition Settings.hpp:155
std::string getKeyName(sf::Keyboard::Key key) const
Definition Settings.cpp:185
void setKey(KeyAction action, sf::Keyboard::Key key)
Definition Settings.cpp:180
Language getLanguage() const
Definition Settings.hpp:113
void setMusicVolume(float volume)
Definition Settings.cpp:237
void onLanguageChanged(LanguageCallback callback)
Definition Settings.hpp:123
std::string getWeaponName(ecs::components::WeaponKind weapon) const
Definition Settings.cpp:316
void setGamepadPauseButton(unsigned int button)
Definition Settings.hpp:239
void setGamepadReloadButton(unsigned int button)
Definition Settings.hpp:209
unsigned int _gamepadReloadButton
Definition Settings.hpp:269
float getMusicVolume() const
Definition Settings.hpp:82
std::function< void(Language)> LanguageCallback
Definition Settings.hpp:121
std::vector< VolumeCallback > _onMusicVolumeChanged
Definition Settings.hpp:275
sf::Keyboard::Key stringToKey(const std::string &keyName) const
Definition Settings.cpp:128
unsigned int _gamepadShootButton
Definition Settings.hpp:268
std::string getDifficultyName(Difficulty difficulty) const
Definition Settings.cpp:300
std::unordered_map< KeyAction, sf::Keyboard::Key > _keyBindings
Definition Settings.hpp:250
unsigned int getGamepadReloadButton() const
Definition Settings.hpp:204
Difficulty getDifficulty() const
Definition Settings.hpp:150
ecs::components::WeaponKind getSelectedWeapon() const
Definition Settings.hpp:162
sf::Keyboard::Key getKey(KeyAction action) const
Definition Settings.cpp:171
ColorBlindMode getColorBlindMode() const
Definition Settings.hpp:128
void setSfxVolume(float volume)
Definition Settings.cpp:246
void setGamepadCursorSpeed(float speed)
Definition Settings.hpp:229
void setGamepadEnabled(bool enabled)
Definition Settings.hpp:179
bool loadFromClientJson(const std::string &filename)
Definition Settings.cpp:40
void onSfxVolumeChanged(VolumeCallback callback)
Definition Settings.hpp:108
void setLanguage(Language lang)
Definition Settings.cpp:255
float getMasterVolume() const
Definition Settings.hpp:75
std::vector< VolumeCallback > _onMasterVolumeChanged
Definition Settings.hpp:274
bool getGamepadEnabled() const
Definition Settings.hpp:174
void setColorBlindMode(ColorBlindMode mode)
Definition Settings.hpp:133
unsigned int getGamepadPauseButton() const
Definition Settings.hpp:234
void setSelectedWeapon(ecs::components::WeaponKind weapon)
Definition Settings.hpp:167
std::string getColorBlindModeName(ColorBlindMode mode) const
Definition Settings.cpp:284
void setHighContrast(bool enabled)
Definition Settings.hpp:145
bool save(const std::string &filename="config/settings.cfg")
Definition Settings.cpp:339
void initDefaultKeyBindings()
Definition Settings.cpp:28
void setMasterVolume(float volume)
Definition Settings.cpp:228
bool getHighContrast() const
Definition Settings.hpp:140
void setGamepadValidateButton(unsigned int button)
Definition Settings.hpp:219
void setGamepadDeadzone(float deadzone)
Definition Settings.hpp:189
ColorBlindMode _colorBlindMode
Definition Settings.hpp:260
unsigned int _gamepadPauseButton
Definition Settings.hpp:272
std::string getLanguageName(Language lang) const
Definition Settings.cpp:266
std::vector< VolumeCallback > _onSfxVolumeChanged
Definition Settings.hpp:276
ecs::components::WeaponKind _selectedWeapon
Definition Settings.hpp:263
unsigned int _gamepadValidateButton
Definition Settings.hpp:270
unsigned int getGamepadShootButton() const
Definition Settings.hpp:194
void setGamepadShootButton(unsigned int button)
Definition Settings.hpp:199
float getGamepadCursorSpeed() const
Definition Settings.hpp:224
void onMusicVolumeChanged(VolumeCallback callback)
Definition Settings.hpp:103
unsigned int getGamepadValidateButton() const
Definition Settings.hpp:214
float getSfxVolume() const
Definition Settings.hpp:89
std::vector< LanguageCallback > _onLanguageChanged
Definition Settings.hpp:277
float getGamepadDeadzone() const
Definition Settings.hpp:184
void onMasterVolumeChanged(VolumeCallback callback)
Definition Settings.hpp:98
bool load(const std::string &filename="config/settings.cfg")
Definition Settings.cpp:379
std::function< void(float)> VolumeCallback
Definition Settings.hpp:96
R-Type client namespace.
ColorBlindMode
Color blind assistance modes.
Definition Settings.hpp:45
KeyAction
Actions that can be bound to keys.
Definition KeyAction.hpp:16
Difficulty
Game difficulty levels (solo mode only)
Definition Settings.hpp:56
Language
Supported languages.
Definition Settings.hpp:33
WeaponKind
Types of player weapons.
@ Classic
Default spam/charge laser.