113 lines
3.5 KiB
C++
113 lines
3.5 KiB
C++
#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;
|
|
}
|