mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2024-11-10 06:38:34 +01:00
Added a way to configure stats and moved parser logic to other file.
This commit is contained in:
parent
1d920c538a
commit
bca4bd6dc1
8 changed files with 486 additions and 298 deletions
|
@ -82,6 +82,13 @@ For the sort methods: 0 = none, 1 = ascending, 2 = descending
|
||||||
For the display type: 0 = none, 1 = numeric, 2 = time seconds, 3 = milliseconds
|
For the display type: 0 = none, 1 = numeric, 2 = time seconds, 3 = milliseconds
|
||||||
An example can be found in steam_settings.EXAMPLE
|
An example can be found in steam_settings.EXAMPLE
|
||||||
|
|
||||||
|
Stats:
|
||||||
|
By default this emulators assumes all stats do not exist unless they have been written once by the game. This works for the majority of games but some games might read a stat for the first time
|
||||||
|
and expect a default value to be read when doing so. To set the type for each stat along with the default value, put a stats.txt file in the steam_settings/ folder.
|
||||||
|
The format is: STAT_NAME=type=default value
|
||||||
|
The type can be: int, float or avgrate
|
||||||
|
The default value is simply a number that represents the default value for the stat.
|
||||||
|
|
||||||
Support for CPY steam_api(64).dll cracks: See the build in the experimental folder.
|
Support for CPY steam_api(64).dll cracks: See the build in the experimental folder.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,20 @@ struct Leaderboard_config {
|
||||||
enum ELeaderboardDisplayType display_type;
|
enum ELeaderboardDisplayType display_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum Stat_Type {
|
||||||
|
STAT_TYPE_INT,
|
||||||
|
STAT_TYPE_FLOAT,
|
||||||
|
STAT_TYPE_AVGRATE
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Stat_config {
|
||||||
|
enum Stat_Type type;
|
||||||
|
union {
|
||||||
|
float default_value_float;
|
||||||
|
uint32 default_value_int;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class Settings {
|
class Settings {
|
||||||
CSteamID steam_id;
|
CSteamID steam_id;
|
||||||
CGameID game_id;
|
CGameID game_id;
|
||||||
|
@ -50,7 +64,9 @@ class Settings {
|
||||||
std::vector<struct Mod_entry> mods;
|
std::vector<struct Mod_entry> mods;
|
||||||
std::map<AppId_t, std::string> app_paths;
|
std::map<AppId_t, std::string> app_paths;
|
||||||
std::map<std::string, Leaderboard_config> leaderboards;
|
std::map<std::string, Leaderboard_config> leaderboards;
|
||||||
|
std::map<std::string, Stat_config> stats;
|
||||||
bool create_unknown_leaderboards;
|
bool create_unknown_leaderboards;
|
||||||
|
uint16 port;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
#ifdef LOBBY_CONNECT
|
#ifdef LOBBY_CONNECT
|
||||||
|
@ -68,6 +84,8 @@ public:
|
||||||
void set_lobby(CSteamID lobby_id);
|
void set_lobby(CSteamID lobby_id);
|
||||||
CSteamID get_lobby();
|
CSteamID get_lobby();
|
||||||
bool is_offline() {return offline; }
|
bool is_offline() {return offline; }
|
||||||
|
uint16 get_port() {return port;}
|
||||||
|
void set_port(uint16 port) { this->port = port;}
|
||||||
|
|
||||||
//DLC stuff
|
//DLC stuff
|
||||||
void unlockAllDLC(bool value);
|
void unlockAllDLC(bool value);
|
||||||
|
@ -91,6 +109,13 @@ public:
|
||||||
std::map<std::string, Leaderboard_config> getLeaderboards() { return leaderboards; }
|
std::map<std::string, Leaderboard_config> getLeaderboards() { return leaderboards; }
|
||||||
void setCreateUnknownLeaderboards(bool enable) {create_unknown_leaderboards = enable;}
|
void setCreateUnknownLeaderboards(bool enable) {create_unknown_leaderboards = enable;}
|
||||||
bool createUnknownLeaderboards() { return create_unknown_leaderboards; }
|
bool createUnknownLeaderboards() { return create_unknown_leaderboards; }
|
||||||
|
|
||||||
|
//custom broadcasts
|
||||||
|
std::set<uint32> custom_broadcasts;
|
||||||
|
|
||||||
|
//stats
|
||||||
|
std::map<std::string, Stat_config> getStats() { return stats; }
|
||||||
|
void setStatDefiniton(std::string name, struct Stat_config stat_config) {stats[name] = stat_config; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
394
dll/settings_parser.cpp
Normal file
394
dll/settings_parser.cpp
Normal file
|
@ -0,0 +1,394 @@
|
||||||
|
/* Copyright (C) 2019 Mr Goldberg
|
||||||
|
This file is part of the Goldberg Emulator
|
||||||
|
|
||||||
|
The Goldberg Emulator is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The Goldberg Emulator is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the Goldberg Emulator; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include "settings_parser.h"
|
||||||
|
#include <fstream>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
|
static void load_custom_broadcasts(std::string broadcasts_filepath, std::set<uint32> &custom_broadcasts)
|
||||||
|
{
|
||||||
|
std::ifstream broadcasts_file(broadcasts_filepath);
|
||||||
|
PRINT_DEBUG("Broadcasts file path: %s\n", broadcasts_filepath.c_str());
|
||||||
|
if (broadcasts_file.is_open()) {
|
||||||
|
std::string line;
|
||||||
|
while (std::getline(broadcasts_file, line)) {
|
||||||
|
std::set<uint32> ips = Networking::resolve_ip(line);
|
||||||
|
custom_broadcasts.insert(ips.begin(), ips.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32 create_localstorage_settings(Settings **settings_client_out, Settings **settings_server_out, Local_Storage **local_storage_out)
|
||||||
|
{
|
||||||
|
std::string program_path = Local_Storage::get_program_path(), save_path = Local_Storage::get_user_appdata_path();;
|
||||||
|
|
||||||
|
PRINT_DEBUG("Current Path %s save_path: %s\n", program_path.c_str(), save_path.c_str());
|
||||||
|
|
||||||
|
char array[10] = {};
|
||||||
|
array[0] = '0';
|
||||||
|
Local_Storage::get_file_data(Local_Storage::get_game_settings_path() + "steam_appid.txt", array, sizeof(array) - 1);
|
||||||
|
uint32 appid = 0;
|
||||||
|
try {
|
||||||
|
appid = std::stoi(array);
|
||||||
|
} catch (...) {}
|
||||||
|
if (!appid) {
|
||||||
|
memset(array, 0, sizeof(array));
|
||||||
|
array[0] = '0';
|
||||||
|
Local_Storage::get_file_data("steam_appid.txt", array, sizeof(array) - 1);
|
||||||
|
try {
|
||||||
|
appid = std::stoi(array);
|
||||||
|
} catch (...) {}
|
||||||
|
if (!appid) {
|
||||||
|
memset(array, 0, sizeof(array));
|
||||||
|
array[0] = '0';
|
||||||
|
Local_Storage::get_file_data(program_path + "steam_appid.txt", array, sizeof(array) - 1);
|
||||||
|
try {
|
||||||
|
appid = std::stoi(array);
|
||||||
|
} catch (...) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!appid) {
|
||||||
|
std::string str_appid = get_env_variable("SteamAppId");
|
||||||
|
std::string str_gameid = get_env_variable("SteamGameId");
|
||||||
|
PRINT_DEBUG("str_appid %s str_gameid: %s\n", str_appid.c_str(), str_gameid.c_str());
|
||||||
|
uint32 appid_env = 0;
|
||||||
|
uint32 gameid_env = 0;
|
||||||
|
|
||||||
|
if (str_appid.size() > 0) {
|
||||||
|
try {
|
||||||
|
appid_env = std::stoul(str_appid);
|
||||||
|
} catch (...) {
|
||||||
|
appid_env = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_gameid.size() > 0) {
|
||||||
|
try {
|
||||||
|
gameid_env = std::stoul(str_gameid);
|
||||||
|
} catch (...) {
|
||||||
|
gameid_env = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_DEBUG("appid_env %u gameid_env: %u\n", appid_env, gameid_env);
|
||||||
|
if (appid_env) {
|
||||||
|
appid = appid_env;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gameid_env) {
|
||||||
|
appid = gameid_env;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
char array[33] = {};
|
||||||
|
if (Local_Storage::get_file_data(program_path + "local_save.txt", array, sizeof(array) - 1) != -1) {
|
||||||
|
save_path = program_path + Settings::sanitize(array);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_DEBUG("Set save_path: %s\n", save_path.c_str());
|
||||||
|
Local_Storage *local_storage = new Local_Storage(save_path);
|
||||||
|
local_storage->setAppId(appid);
|
||||||
|
|
||||||
|
// Listen port
|
||||||
|
char array_port[10] = {};
|
||||||
|
array_port[0] = '0';
|
||||||
|
local_storage->get_data_settings("listen_port.txt", array_port, sizeof(array_port) - 1);
|
||||||
|
uint16 port = std::stoi(array_port);
|
||||||
|
if (port == 0) {
|
||||||
|
port = DEFAULT_PORT;
|
||||||
|
snprintf(array_port, sizeof(array_port), "%hu", port);
|
||||||
|
local_storage->store_data_settings("listen_port.txt", array_port, strlen(array_port));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Custom broadcasts
|
||||||
|
std::set<uint32> custom_broadcasts;
|
||||||
|
load_custom_broadcasts(local_storage->get_global_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
|
||||||
|
load_custom_broadcasts(Local_Storage::get_game_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
|
||||||
|
|
||||||
|
// Acount name
|
||||||
|
char name[32] = {};
|
||||||
|
if (local_storage->get_data_settings("account_name.txt", name, sizeof(name) - 1) <= 0) {
|
||||||
|
strcpy(name, DEFAULT_NAME);
|
||||||
|
local_storage->store_data_settings("account_name.txt", name, strlen(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Language
|
||||||
|
char language[32] = {};
|
||||||
|
if (local_storage->get_data_settings("language.txt", language, sizeof(language) - 1) <= 0) {
|
||||||
|
strcpy(language, DEFAULT_LANGUAGE);
|
||||||
|
local_storage->store_data_settings("language.txt", language, strlen(language));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Steam ID
|
||||||
|
char array_steam_id[32] = {};
|
||||||
|
CSteamID user_id;
|
||||||
|
uint64 steam_id = 0;
|
||||||
|
bool generate_new = false;
|
||||||
|
//try to load steam id from game specific settings folder first
|
||||||
|
if (local_storage->get_data(SETTINGS_STORAGE_FOLDER, "user_steam_id.txt", array_steam_id, sizeof(array_steam_id) - 1) > 0) {
|
||||||
|
user_id = CSteamID((uint64)std::atoll(array_steam_id));
|
||||||
|
if (!user_id.IsValid()) {
|
||||||
|
generate_new = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
generate_new = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (generate_new) {
|
||||||
|
generate_new = false;
|
||||||
|
if (local_storage->get_data_settings("user_steam_id.txt", array_steam_id, sizeof(array_steam_id) - 1) > 0) {
|
||||||
|
user_id = CSteamID((uint64)std::atoll(array_steam_id));
|
||||||
|
if (!user_id.IsValid()) {
|
||||||
|
generate_new = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
generate_new = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (generate_new) {
|
||||||
|
user_id = generate_steam_id_user();
|
||||||
|
uint64 steam_id = user_id.ConvertToUint64();
|
||||||
|
char temp_text[32] = {};
|
||||||
|
snprintf(temp_text, sizeof(temp_text), "%llu", steam_id);
|
||||||
|
local_storage->store_data_settings("user_steam_id.txt", temp_text, strlen(temp_text));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool steam_offline_mode = false;
|
||||||
|
{
|
||||||
|
std::string steam_settings_path = Local_Storage::get_game_settings_path();
|
||||||
|
|
||||||
|
std::vector<std::string> paths = Local_Storage::get_filenames_path(steam_settings_path);
|
||||||
|
for (auto & p: paths) {
|
||||||
|
PRINT_DEBUG("steam settings path %s\n", p.c_str());
|
||||||
|
if (p == "offline.txt") {
|
||||||
|
steam_offline_mode = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings *settings_client = new Settings(user_id, CGameID(appid), name, language, steam_offline_mode);
|
||||||
|
Settings *settings_server = new Settings(generate_steam_id_server(), CGameID(appid), name, language, steam_offline_mode);
|
||||||
|
settings_client->set_port(port);
|
||||||
|
settings_server->set_port(port);
|
||||||
|
settings_client->custom_broadcasts = custom_broadcasts;
|
||||||
|
settings_server->custom_broadcasts = custom_broadcasts;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::string dlc_config_path = Local_Storage::get_game_settings_path() + "DLC.txt";
|
||||||
|
std::ifstream input( dlc_config_path );
|
||||||
|
if (input.is_open()) {
|
||||||
|
settings_client->unlockAllDLC(false);
|
||||||
|
settings_server->unlockAllDLC(false);
|
||||||
|
PRINT_DEBUG("Locking all DLC\n");
|
||||||
|
|
||||||
|
for( std::string line; std::getline( input, line ); ) {
|
||||||
|
if (!line.empty() && line.front() == '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!line.empty() && line.back() == '\n') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!line.empty() && line.back() == '\r') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t deliminator = line.find("=");
|
||||||
|
if (deliminator != 0 && deliminator != std::string::npos && deliminator != line.size()) {
|
||||||
|
AppId_t appid = stol(line.substr(0, deliminator));
|
||||||
|
std::string name = line.substr(deliminator + 1);
|
||||||
|
bool available = true;
|
||||||
|
|
||||||
|
if (appid) {
|
||||||
|
PRINT_DEBUG("Adding DLC: %u|%s| %u\n", appid, name.c_str(), available);
|
||||||
|
settings_client->addDLC(appid, name, available);
|
||||||
|
settings_server->addDLC(appid, name, available);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//unlock all DLC
|
||||||
|
PRINT_DEBUG("Unlocking all DLC\n");
|
||||||
|
settings_client->unlockAllDLC(true);
|
||||||
|
settings_server->unlockAllDLC(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::string dlc_config_path = Local_Storage::get_game_settings_path() + "app_paths.txt";
|
||||||
|
std::ifstream input( dlc_config_path );
|
||||||
|
if (input.is_open()) {
|
||||||
|
for( std::string line; getline( input, line ); ) {
|
||||||
|
if (!line.empty() && line[line.length()-1] == '\n') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!line.empty() && line[line.length()-1] == '\r') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t deliminator = line.find("=");
|
||||||
|
if (deliminator != 0 && deliminator != std::string::npos && deliminator != line.size()) {
|
||||||
|
AppId_t appid = stol(line.substr(0, deliminator));
|
||||||
|
std::string rel_path = line.substr(deliminator + 1);
|
||||||
|
std::string path = canonical_path(program_path + rel_path);
|
||||||
|
|
||||||
|
if (appid) {
|
||||||
|
if (path.size()) {
|
||||||
|
PRINT_DEBUG("Adding app path: %u|%s|\n", appid, path.c_str());
|
||||||
|
settings_client->setAppInstallPath(appid, path);
|
||||||
|
settings_server->setAppInstallPath(appid, path);
|
||||||
|
} else {
|
||||||
|
PRINT_DEBUG("Error adding app path for: %u does this path exist? |%s|\n", appid, rel_path.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::string dlc_config_path = Local_Storage::get_game_settings_path() + "leaderboards.txt";
|
||||||
|
std::ifstream input( dlc_config_path );
|
||||||
|
if (input.is_open()) {
|
||||||
|
settings_client->setCreateUnknownLeaderboards(false);
|
||||||
|
settings_server->setCreateUnknownLeaderboards(false);
|
||||||
|
|
||||||
|
for( std::string line; getline( input, line ); ) {
|
||||||
|
if (!line.empty() && line[line.length()-1] == '\n') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!line.empty() && line[line.length()-1] == '\r') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string leaderboard;
|
||||||
|
unsigned int sort_method = 0;
|
||||||
|
unsigned int display_type = 0;
|
||||||
|
|
||||||
|
std::size_t deliminator = line.find("=");
|
||||||
|
if (deliminator != 0 && deliminator != std::string::npos && deliminator != line.size()) {
|
||||||
|
leaderboard = line.substr(0, deliminator);
|
||||||
|
std::size_t deliminator2 = line.find("=", deliminator + 1);
|
||||||
|
if (deliminator2 != std::string::npos && deliminator2 != line.size()) {
|
||||||
|
sort_method = stol(line.substr(deliminator + 1, deliminator2 - (deliminator + 1)));
|
||||||
|
display_type = stol(line.substr(deliminator2 + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (leaderboard.size() && sort_method <= k_ELeaderboardSortMethodDescending && display_type <= k_ELeaderboardDisplayTypeTimeMilliSeconds) {
|
||||||
|
PRINT_DEBUG("Adding leaderboard: %s|%u|%u\n", leaderboard.c_str(), sort_method, display_type);
|
||||||
|
settings_client->setLeaderboard(leaderboard, (ELeaderboardSortMethod)sort_method, (ELeaderboardDisplayType)display_type);
|
||||||
|
settings_server->setLeaderboard(leaderboard, (ELeaderboardSortMethod)sort_method, (ELeaderboardDisplayType)display_type);
|
||||||
|
} else {
|
||||||
|
PRINT_DEBUG("Error adding leaderboard for: %s, are sort method %u or display type %u valid?\n", leaderboard.c_str(), sort_method, display_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::string stats_config_path = Local_Storage::get_game_settings_path() + "stats.txt";
|
||||||
|
std::ifstream input( stats_config_path );
|
||||||
|
if (input.is_open()) {
|
||||||
|
|
||||||
|
for( std::string line; getline( input, line ); ) {
|
||||||
|
if (!line.empty() && line[line.length()-1] == '\n') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!line.empty() && line[line.length()-1] == '\r') {
|
||||||
|
line.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string stat_name;
|
||||||
|
std::string stat_type;
|
||||||
|
std::string stat_default_value;
|
||||||
|
|
||||||
|
std::size_t deliminator = line.find("=");
|
||||||
|
if (deliminator != 0 && deliminator != std::string::npos && deliminator != line.size()) {
|
||||||
|
stat_name = line.substr(0, deliminator);
|
||||||
|
std::size_t deliminator2 = line.find("=", deliminator + 1);
|
||||||
|
|
||||||
|
if (deliminator2 != std::string::npos && deliminator2 != line.size()) {
|
||||||
|
stat_type = line.substr(deliminator + 1, deliminator2 - (deliminator + 1));
|
||||||
|
stat_default_value = line.substr(deliminator2 + 1);
|
||||||
|
} else {
|
||||||
|
stat_type = line.substr(deliminator + 1);
|
||||||
|
stat_default_value = "0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::transform(stat_type.begin(), stat_type.end(), stat_type.begin(),[](unsigned char c){ return std::tolower(c); });
|
||||||
|
struct Stat_config config = {};
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (stat_type == "float") {
|
||||||
|
config.type = Stat_Type::STAT_TYPE_FLOAT;
|
||||||
|
config.default_value_float = std::stof(stat_default_value);
|
||||||
|
} else if (stat_type == "int") {
|
||||||
|
config.type = Stat_Type::STAT_TYPE_INT;
|
||||||
|
config.default_value_int = std::stol(stat_default_value);
|
||||||
|
} else if (stat_type == "avgrate") {
|
||||||
|
config.type = Stat_Type::STAT_TYPE_AVGRATE;
|
||||||
|
config.default_value_float = std::stof(stat_default_value);
|
||||||
|
} else {
|
||||||
|
PRINT_DEBUG("Error adding stat %s, type %s isn't valid\n", stat_name.c_str(), stat_type.c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
PRINT_DEBUG("Error adding stat %s, default value %s isn't valid\n", stat_name.c_str(), stat_default_value.c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stat_name.size()) {
|
||||||
|
PRINT_DEBUG("Adding stat type: %s|%u|%f|%u\n", stat_name.c_str(), config.type, config.default_value_float, config.default_value_int);
|
||||||
|
settings_client->setStatDefiniton(stat_name, config);
|
||||||
|
settings_server->setStatDefiniton(stat_name, config);
|
||||||
|
} else {
|
||||||
|
PRINT_DEBUG("Error adding stat for: %s, empty name\n", stat_name.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::string mod_path = Local_Storage::get_game_settings_path() + "mods";
|
||||||
|
std::vector<std::string> paths = Local_Storage::get_filenames_path(mod_path);
|
||||||
|
for (auto & p: paths) {
|
||||||
|
PRINT_DEBUG("mod directory %s\n", p.c_str());
|
||||||
|
try {
|
||||||
|
PublishedFileId_t id = std::stoull(p);
|
||||||
|
settings_client->addMod(id, p, mod_path + PATH_SEPARATOR + p);
|
||||||
|
settings_server->addMod(id, p, mod_path + PATH_SEPARATOR + p);
|
||||||
|
} catch (...) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*settings_client_out = settings_client;
|
||||||
|
*settings_server_out = settings_server;
|
||||||
|
*local_storage_out = local_storage;
|
||||||
|
|
||||||
|
return appid;
|
||||||
|
}
|
27
dll/settings_parser.h
Normal file
27
dll/settings_parser.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/* Copyright (C) 2019 Mr Goldberg
|
||||||
|
This file is part of the Goldberg Emulator
|
||||||
|
|
||||||
|
The Goldberg Emulator is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The Goldberg Emulator is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the Goldberg Emulator; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#ifndef SETTINGS_PARSER_INCLUDE
|
||||||
|
#define SETTINGS_PARSER_INCLUDE
|
||||||
|
|
||||||
|
//returns appid
|
||||||
|
uint32 create_localstorage_settings(Settings **settings_client_out, Settings **settings_server_out, Local_Storage **local_storage_out);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -16,8 +16,8 @@
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include "steam_client.h"
|
#include "steam_client.h"
|
||||||
|
#include "settings_parser.h"
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
static void background_thread(Steam_Client *client)
|
static void background_thread(Steam_Client *client)
|
||||||
{
|
{
|
||||||
|
@ -39,305 +39,13 @@ static void background_thread(Steam_Client *client)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void load_custom_broadcasts(std::string broadcasts_filepath, std::set<uint32> &custom_broadcasts)
|
|
||||||
{
|
|
||||||
std::ifstream broadcasts_file(broadcasts_filepath);
|
|
||||||
PRINT_DEBUG("Broadcasts file path: %s\n", broadcasts_filepath.c_str());
|
|
||||||
if (broadcasts_file.is_open()) {
|
|
||||||
std::string line;
|
|
||||||
while (std::getline(broadcasts_file, line)) {
|
|
||||||
std::set<uint32> ips = Networking::resolve_ip(line);
|
|
||||||
custom_broadcasts.insert(ips.begin(), ips.end());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Steam_Client::Steam_Client()
|
Steam_Client::Steam_Client()
|
||||||
{
|
{
|
||||||
std::string program_path = Local_Storage::get_program_path(), save_path = Local_Storage::get_user_appdata_path();;
|
|
||||||
|
|
||||||
PRINT_DEBUG("Current Path %s save_path: %s\n", program_path.c_str(), save_path.c_str());
|
|
||||||
|
|
||||||
char array[10] = {};
|
|
||||||
array[0] = '0';
|
|
||||||
Local_Storage::get_file_data(Local_Storage::get_game_settings_path() + "steam_appid.txt", array, sizeof(array) - 1);
|
|
||||||
uint32 appid = 0;
|
|
||||||
try {
|
|
||||||
appid = std::stoi(array);
|
|
||||||
} catch (...) {}
|
|
||||||
if (!appid) {
|
|
||||||
memset(array, 0, sizeof(array));
|
|
||||||
array[0] = '0';
|
|
||||||
Local_Storage::get_file_data("steam_appid.txt", array, sizeof(array) - 1);
|
|
||||||
try {
|
|
||||||
appid = std::stoi(array);
|
|
||||||
} catch (...) {}
|
|
||||||
if (!appid) {
|
|
||||||
memset(array, 0, sizeof(array));
|
|
||||||
array[0] = '0';
|
|
||||||
Local_Storage::get_file_data(program_path + "steam_appid.txt", array, sizeof(array) - 1);
|
|
||||||
try {
|
|
||||||
appid = std::stoi(array);
|
|
||||||
} catch (...) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!appid) {
|
|
||||||
std::string str_appid = get_env_variable("SteamAppId");
|
|
||||||
std::string str_gameid = get_env_variable("SteamGameId");
|
|
||||||
PRINT_DEBUG("str_appid %s str_gameid: %s\n", str_appid.c_str(), str_gameid.c_str());
|
|
||||||
uint32 appid_env = 0;
|
|
||||||
uint32 gameid_env = 0;
|
|
||||||
|
|
||||||
if (str_appid.size() > 0) {
|
|
||||||
try {
|
|
||||||
appid_env = std::stoul(str_appid);
|
|
||||||
} catch (...) {
|
|
||||||
appid_env = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (str_gameid.size() > 0) {
|
|
||||||
try {
|
|
||||||
gameid_env = std::stoul(str_gameid);
|
|
||||||
} catch (...) {
|
|
||||||
gameid_env = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINT_DEBUG("appid_env %u gameid_env: %u\n", appid_env, gameid_env);
|
|
||||||
if (appid_env) {
|
|
||||||
appid = appid_env;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gameid_env) {
|
|
||||||
appid = gameid_env;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
char array[33] = {};
|
|
||||||
if (Local_Storage::get_file_data(program_path + "local_save.txt", array, sizeof(array) - 1) != -1) {
|
|
||||||
save_path = program_path + Settings::sanitize(array);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINT_DEBUG("Set save_path: %s\n", save_path.c_str());
|
|
||||||
local_storage = new Local_Storage(save_path);
|
|
||||||
local_storage->setAppId(appid);
|
|
||||||
|
|
||||||
// Listen port
|
|
||||||
char array_port[10] = {};
|
|
||||||
array_port[0] = '0';
|
|
||||||
local_storage->get_data_settings("listen_port.txt", array_port, sizeof(array_port) - 1);
|
|
||||||
uint16 port = std::stoi(array_port);
|
|
||||||
if (port == 0) {
|
|
||||||
port = DEFAULT_PORT;
|
|
||||||
snprintf(array_port, sizeof(array_port), "%hu", port);
|
|
||||||
local_storage->store_data_settings("listen_port.txt", array_port, strlen(array_port));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom broadcasts
|
|
||||||
std::set<uint32> custom_broadcasts;
|
|
||||||
load_custom_broadcasts(local_storage->get_global_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
|
|
||||||
load_custom_broadcasts(Local_Storage::get_game_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
|
|
||||||
|
|
||||||
// Acount name
|
|
||||||
char name[32] = {};
|
|
||||||
if (local_storage->get_data_settings("account_name.txt", name, sizeof(name) - 1) <= 0) {
|
|
||||||
strcpy(name, DEFAULT_NAME);
|
|
||||||
local_storage->store_data_settings("account_name.txt", name, strlen(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Language
|
|
||||||
char language[32] = {};
|
|
||||||
if (local_storage->get_data_settings("language.txt", language, sizeof(language) - 1) <= 0) {
|
|
||||||
strcpy(language, DEFAULT_LANGUAGE);
|
|
||||||
local_storage->store_data_settings("language.txt", language, strlen(language));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Steam ID
|
|
||||||
char array_steam_id[32] = {};
|
|
||||||
CSteamID user_id;
|
|
||||||
uint64 steam_id = 0;
|
|
||||||
bool generate_new = false;
|
|
||||||
//try to load steam id from game specific settings folder first
|
|
||||||
if (local_storage->get_data(SETTINGS_STORAGE_FOLDER, "user_steam_id.txt", array_steam_id, sizeof(array_steam_id) - 1) > 0) {
|
|
||||||
user_id = CSteamID((uint64)std::atoll(array_steam_id));
|
|
||||||
if (!user_id.IsValid()) {
|
|
||||||
generate_new = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
generate_new = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generate_new) {
|
|
||||||
generate_new = false;
|
|
||||||
if (local_storage->get_data_settings("user_steam_id.txt", array_steam_id, sizeof(array_steam_id) - 1) > 0) {
|
|
||||||
user_id = CSteamID((uint64)std::atoll(array_steam_id));
|
|
||||||
if (!user_id.IsValid()) {
|
|
||||||
generate_new = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
generate_new = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generate_new) {
|
|
||||||
user_id = generate_steam_id_user();
|
|
||||||
uint64 steam_id = user_id.ConvertToUint64();
|
|
||||||
char temp_text[32] = {};
|
|
||||||
snprintf(temp_text, sizeof(temp_text), "%llu", steam_id);
|
|
||||||
local_storage->store_data_settings("user_steam_id.txt", temp_text, strlen(temp_text));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool steam_offline_mode = false;
|
|
||||||
{
|
|
||||||
std::string steam_settings_path = Local_Storage::get_game_settings_path();
|
|
||||||
|
|
||||||
std::vector<std::string> paths = Local_Storage::get_filenames_path(steam_settings_path);
|
|
||||||
for (auto & p: paths) {
|
|
||||||
PRINT_DEBUG("steam settings path %s\n", p.c_str());
|
|
||||||
if (p == "offline.txt") {
|
|
||||||
steam_offline_mode = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
settings_client = new Settings(user_id, CGameID(appid), name, language, steam_offline_mode);
|
|
||||||
settings_server = new Settings(generate_steam_id_server(), CGameID(appid), name, language, steam_offline_mode);
|
|
||||||
|
|
||||||
{
|
|
||||||
std::string dlc_config_path = Local_Storage::get_game_settings_path() + "DLC.txt";
|
|
||||||
std::ifstream input( dlc_config_path );
|
|
||||||
if (input.is_open()) {
|
|
||||||
settings_client->unlockAllDLC(false);
|
|
||||||
settings_server->unlockAllDLC(false);
|
|
||||||
PRINT_DEBUG("Locking all DLC\n");
|
|
||||||
|
|
||||||
for( std::string line; std::getline( input, line ); ) {
|
|
||||||
if (!line.empty() && line.front() == '#') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!line.empty() && line.back() == '\n') {
|
|
||||||
line.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!line.empty() && line.back() == '\r') {
|
|
||||||
line.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t deliminator = line.find("=");
|
|
||||||
if (deliminator != 0 && deliminator != std::string::npos && deliminator != line.size()) {
|
|
||||||
AppId_t appid = stol(line.substr(0, deliminator));
|
|
||||||
std::string name = line.substr(deliminator + 1);
|
|
||||||
bool available = true;
|
|
||||||
|
|
||||||
if (appid) {
|
|
||||||
PRINT_DEBUG("Adding DLC: %u|%s| %u\n", appid, name.c_str(), available);
|
|
||||||
settings_client->addDLC(appid, name, available);
|
|
||||||
settings_server->addDLC(appid, name, available);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//unlock all DLC
|
|
||||||
PRINT_DEBUG("Unlocking all DLC\n");
|
|
||||||
settings_client->unlockAllDLC(true);
|
|
||||||
settings_server->unlockAllDLC(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
std::string dlc_config_path = Local_Storage::get_game_settings_path() + "app_paths.txt";
|
|
||||||
std::ifstream input( dlc_config_path );
|
|
||||||
if (input.is_open()) {
|
|
||||||
for( std::string line; getline( input, line ); ) {
|
|
||||||
if (!line.empty() && line[line.length()-1] == '\n') {
|
|
||||||
line.erase(line.length()-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!line.empty() && line[line.length()-1] == '\r') {
|
|
||||||
line.erase(line.length()-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t deliminator = line.find("=");
|
|
||||||
if (deliminator != 0 && deliminator != std::string::npos && deliminator != line.size()) {
|
|
||||||
AppId_t appid = stol(line.substr(0, deliminator));
|
|
||||||
std::string rel_path = line.substr(deliminator + 1);
|
|
||||||
std::string path = canonical_path(program_path + rel_path);
|
|
||||||
|
|
||||||
if (appid) {
|
|
||||||
if (path.size()) {
|
|
||||||
PRINT_DEBUG("Adding app path: %u|%s|\n", appid, path.c_str());
|
|
||||||
settings_client->setAppInstallPath(appid, path);
|
|
||||||
settings_server->setAppInstallPath(appid, path);
|
|
||||||
} else {
|
|
||||||
PRINT_DEBUG("Error adding app path for: %u does this path exist? |%s|\n", appid, rel_path.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
std::string dlc_config_path = Local_Storage::get_game_settings_path() + "leaderboards.txt";
|
|
||||||
std::ifstream input( dlc_config_path );
|
|
||||||
if (input.is_open()) {
|
|
||||||
settings_client->setCreateUnknownLeaderboards(false);
|
|
||||||
settings_server->setCreateUnknownLeaderboards(false);
|
|
||||||
|
|
||||||
for( std::string line; getline( input, line ); ) {
|
|
||||||
if (!line.empty() && line[line.length()-1] == '\n') {
|
|
||||||
line.erase(line.length()-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!line.empty() && line[line.length()-1] == '\r') {
|
|
||||||
line.erase(line.length()-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string leaderboard;
|
|
||||||
unsigned int sort_method = 0;
|
|
||||||
unsigned int display_type = 0;
|
|
||||||
|
|
||||||
std::size_t deliminator = line.find("=");
|
|
||||||
if (deliminator != 0 && deliminator != std::string::npos && deliminator != line.size()) {
|
|
||||||
leaderboard = line.substr(0, deliminator);
|
|
||||||
std::size_t deliminator2 = line.find("=", deliminator + 1);
|
|
||||||
if (deliminator2 != std::string::npos && deliminator2 != line.size()) {
|
|
||||||
sort_method = stol(line.substr(deliminator + 1, deliminator2));
|
|
||||||
display_type = stol(line.substr(deliminator2 + 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leaderboard.size() && sort_method <= k_ELeaderboardSortMethodDescending && display_type <= k_ELeaderboardDisplayTypeTimeMilliSeconds) {
|
|
||||||
PRINT_DEBUG("Adding leaderboard: %s|%u|%u\n", leaderboard.c_str(), sort_method, display_type);
|
|
||||||
settings_client->setLeaderboard(leaderboard, (ELeaderboardSortMethod)sort_method, (ELeaderboardDisplayType)display_type);
|
|
||||||
settings_server->setLeaderboard(leaderboard, (ELeaderboardSortMethod)sort_method, (ELeaderboardDisplayType)display_type);
|
|
||||||
} else {
|
|
||||||
PRINT_DEBUG("Error adding leaderboard for: %s, are sort method %u or display type %u valid?\n", leaderboard.c_str(), sort_method, display_type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
std::string mod_path = Local_Storage::get_game_settings_path() + "mods";
|
|
||||||
std::vector<std::string> paths = Local_Storage::get_filenames_path(mod_path);
|
|
||||||
for (auto & p: paths) {
|
|
||||||
PRINT_DEBUG("mod directory %s\n", p.c_str());
|
|
||||||
try {
|
|
||||||
PublishedFileId_t id = std::stoull(p);
|
|
||||||
settings_client->addMod(id, p, mod_path + PATH_SEPARATOR + p);
|
|
||||||
settings_server->addMod(id, p, mod_path + PATH_SEPARATOR + p);
|
|
||||||
} catch (...) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
uint32 appid = create_localstorage_settings(&settings_client, &settings_server, &local_storage);
|
||||||
std::string items_db_file_path = (Local_Storage::get_game_settings_path() + "items.json");
|
std::string items_db_file_path = (Local_Storage::get_game_settings_path() + "items.json");
|
||||||
|
|
||||||
network = new Networking(settings_server->get_local_steam_id(), appid, port, &custom_broadcasts);
|
network = new Networking(settings_server->get_local_steam_id(), appid, settings_server->get_port(), &(settings_server->custom_broadcasts));
|
||||||
|
|
||||||
callback_results_client = new SteamCallResults();
|
callback_results_client = new SteamCallResults();
|
||||||
callback_results_server = new SteamCallResults();
|
callback_results_server = new SteamCallResults();
|
||||||
|
@ -345,7 +53,7 @@ Steam_Client::Steam_Client()
|
||||||
callbacks_server = new SteamCallBacks(callback_results_server);
|
callbacks_server = new SteamCallBacks(callback_results_server);
|
||||||
run_every_runcb = new RunEveryRunCB();
|
run_every_runcb = new RunEveryRunCB();
|
||||||
|
|
||||||
PRINT_DEBUG("steam client init: id: %llu server id: %llu appid: %u port: %u \n", user_id.ConvertToUint64(), settings_server->get_local_steam_id().ConvertToUint64(), appid, port);
|
PRINT_DEBUG("steam client init: id: %llu server id: %llu appid: %u port: %u \n", settings_client->get_local_steam_id().ConvertToUint64(), settings_server->get_local_steam_id().ConvertToUint64(), appid, settings_server->get_port());
|
||||||
|
|
||||||
steam_user = new Steam_User(settings_client, local_storage, network, callback_results_client, callbacks_client);
|
steam_user = new Steam_User(settings_client, local_storage, network, callback_results_client, callbacks_client);
|
||||||
steam_friends = new Steam_Friends(settings_client, network, callback_results_client, callbacks_client, run_every_runcb);
|
steam_friends = new Steam_Friends(settings_client, network, callback_results_client, callbacks_client, run_every_runcb);
|
||||||
|
|
|
@ -361,7 +361,7 @@ void AdvertiseGame( CSteamID steamIDGameServer, uint32 unIPServer, uint16 usPort
|
||||||
STEAM_CALL_RESULT( EncryptedAppTicketResponse_t )
|
STEAM_CALL_RESULT( EncryptedAppTicketResponse_t )
|
||||||
SteamAPICall_t RequestEncryptedAppTicket( void *pDataToInclude, int cbDataToInclude )
|
SteamAPICall_t RequestEncryptedAppTicket( void *pDataToInclude, int cbDataToInclude )
|
||||||
{
|
{
|
||||||
PRINT_DEBUG("Steam_User::RequestEncryptedAppTicket\n");
|
PRINT_DEBUG("Steam_User::RequestEncryptedAppTicket %i\n", cbDataToInclude);
|
||||||
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
||||||
EncryptedAppTicketResponse_t data;
|
EncryptedAppTicketResponse_t data;
|
||||||
data.m_eResult = k_EResultOK;
|
data.m_eResult = k_EResultOK;
|
||||||
|
|
|
@ -83,11 +83,21 @@ bool GetStat( const char *pchName, int32 *pData )
|
||||||
PRINT_DEBUG("GetStat int32 %s\n", pchName);
|
PRINT_DEBUG("GetStat int32 %s\n", pchName);
|
||||||
if (!pchName || !pData) return false;
|
if (!pchName || !pData) return false;
|
||||||
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
||||||
|
auto stats_config = settings->getStats();
|
||||||
|
auto stats_data = stats_config.find(pchName);
|
||||||
|
if (stats_data != stats_config.end()) {
|
||||||
|
if (stats_data->second.type != Stat_Type::STAT_TYPE_INT) return false;
|
||||||
|
}
|
||||||
|
|
||||||
int read_data = local_storage->get_data(STATS_STORAGE_FOLDER, pchName, (char* )pData, sizeof(*pData));
|
int read_data = local_storage->get_data(STATS_STORAGE_FOLDER, pchName, (char* )pData, sizeof(*pData));
|
||||||
if (read_data == sizeof(int32))
|
if (read_data == sizeof(int32))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (stats_data != stats_config.end()) {
|
||||||
|
*pData = stats_data->second.default_value_int;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,11 +106,21 @@ bool GetStat( const char *pchName, float *pData )
|
||||||
PRINT_DEBUG("GetStat float %s\n", pchName);
|
PRINT_DEBUG("GetStat float %s\n", pchName);
|
||||||
if (!pchName || !pData) return false;
|
if (!pchName || !pData) return false;
|
||||||
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
||||||
|
auto stats_config = settings->getStats();
|
||||||
|
auto stats_data = stats_config.find(pchName);
|
||||||
|
if (stats_data != stats_config.end()) {
|
||||||
|
if (stats_data->second.type == Stat_Type::STAT_TYPE_INT) return false;
|
||||||
|
}
|
||||||
|
|
||||||
int read_data = local_storage->get_data(STATS_STORAGE_FOLDER, pchName, (char* )pData, sizeof(*pData));
|
int read_data = local_storage->get_data(STATS_STORAGE_FOLDER, pchName, (char* )pData, sizeof(*pData));
|
||||||
if (read_data == sizeof(int32))
|
if (read_data == sizeof(float))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (stats_data != stats_config.end()) {
|
||||||
|
*pData = stats_data->second.default_value_float;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
7
files_example/steam_settings.EXAMPLE/stats.EXAMPLE.txt
Normal file
7
files_example/steam_settings.EXAMPLE/stats.EXAMPLE.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
lifetime_experience=int=0
|
||||||
|
experience=int=0
|
||||||
|
stat_example_name1=float=3.5
|
||||||
|
stat_example_name2=int=1337
|
||||||
|
stat_example_name3=int=0
|
||||||
|
stat_example_name4=float=0
|
||||||
|
stat_example_name5=avgrate=0
|
Loading…
Reference in a new issue