Added settings.ini

This commit is contained in:
2025-11-23 19:08:35 +01:00
parent adec55526e
commit f0a6b0d974
9 changed files with 258 additions and 26 deletions

112
src/core/Settings.cpp Normal file
View File

@ -0,0 +1,112 @@
#include "Settings.h"
#include <fstream>
#include <sstream>
#include <SDL3/SDL.h>
// Singleton instance
Settings& Settings::instance() {
static Settings s_instance;
return s_instance;
}
Settings::Settings() {
// Constructor - defaults already set in header
}
std::string Settings::getSettingsPath() {
// Save settings.ini in the game's directory
return "settings.ini";
}
bool Settings::load() {
std::ifstream file(getSettingsPath());
if (!file.is_open()) {
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Settings file not found, using defaults");
return false;
}
std::string line;
std::string currentSection;
while (std::getline(file, line)) {
// Trim whitespace
size_t start = line.find_first_not_of(" \t\r\n");
size_t end = line.find_last_not_of(" \t\r\n");
if (start == std::string::npos) continue; // Empty line
line = line.substr(start, end - start + 1);
// Skip comments
if (line[0] == ';' || line[0] == '#') continue;
// Check for section header
if (line[0] == '[' && line[line.length() - 1] == ']') {
currentSection = line.substr(1, line.length() - 2);
continue;
}
// Parse key=value
size_t equalsPos = line.find('=');
if (equalsPos == std::string::npos) continue;
std::string key = line.substr(0, equalsPos);
std::string value = line.substr(equalsPos + 1);
// Trim key and value
key.erase(key.find_last_not_of(" \t") + 1);
value.erase(0, value.find_first_not_of(" \t"));
// Parse settings
if (currentSection == "Display") {
if (key == "Fullscreen") {
m_fullscreen = (value == "1" || value == "true" || value == "True");
}
} else if (currentSection == "Audio") {
if (key == "Music") {
m_musicEnabled = (value == "1" || value == "true" || value == "True");
} else if (key == "Sound") {
m_soundEnabled = (value == "1" || value == "true" || value == "True");
}
} else if (currentSection == "Player") {
if (key == "Name") {
m_playerName = value;
}
} else if (currentSection == "Debug") {
if (key == "Enabled") {
m_debugEnabled = (value == "1" || value == "true" || value == "True");
}
}
}
file.close();
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Settings loaded from %s", getSettingsPath().c_str());
return true;
}
bool Settings::save() {
std::ofstream file(getSettingsPath());
if (!file.is_open()) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to save settings to %s", getSettingsPath().c_str());
return false;
}
// Write settings in INI format
file << "; Tetris Game Settings\n";
file << "; This file is auto-generated\n\n";
file << "[Display]\n";
file << "Fullscreen=" << (m_fullscreen ? "1" : "0") << "\n\n";
file << "[Audio]\n";
file << "Music=" << (m_musicEnabled ? "1" : "0") << "\n";
file << "Sound=" << (m_soundEnabled ? "1" : "0") << "\n\n";
file << "[Player]\n";
file << "Name=" << m_playerName << "\n\n";
file << "[Debug]\n";
file << "Enabled=" << (m_debugEnabled ? "1" : "0") << "\n";
file.close();
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Settings saved to %s", getSettingsPath().c_str());
return true;
}