Ya funcionan las estadísticas online

This commit is contained in:
2022-11-22 10:42:30 +01:00
parent fd0bebf533
commit 0d586c0827
4 changed files with 111 additions and 66 deletions

View File

@@ -116,18 +116,6 @@ void Director::initOnline()
return; return;
} }
// Obten las estadisticas online
const int points = jscore::getUserPoints(options->online.gameID, options->online.jailerID);
if (points == 0)
{ // Fallo de conexión o no hay registros
screen->showText("No se ha podido obtener la puntuacion online");
std::cout << "No se ha podido obtener la puntuacion online" << std::endl;
}
else
{
options->online.score = points;
}
} }
} }
@@ -1231,6 +1219,7 @@ bool Director::setFileList()
// Configuración // Configuración
asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data); asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data);
asset->add(prefix + "/data/config/config.txt", t_data, false); asset->add(prefix + "/data/config/config.txt", t_data, false);
asset->add(systemFolder + "/stats_buffer.csv", t_data, false, true);
asset->add(systemFolder + "/stats.csv", t_data, false, true); asset->add(systemFolder + "/stats.csv", t_data, false, true);
// Habitaciones // Habitaciones

View File

@@ -40,7 +40,7 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as
text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer); text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer);
music = JA_LoadMusic(asset->get("game.ogg").c_str()); music = JA_LoadMusic(asset->get("game.ogg").c_str());
deathSound = JA_LoadSound(asset->get("death.wav").c_str()); deathSound = JA_LoadSound(asset->get("death.wav").c_str());
stats = new Stats(asset->get("stats.csv"), options); stats = new Stats(asset->get("stats.csv"), asset->get("stats_buffer.csv"), options);
// Inicializa el resto de variables // Inicializa el resto de variables
ticks = 0; ticks = 0;
@@ -632,4 +632,6 @@ void Game::initStats()
{ {
stats->addDictionary(room.room->number, room.room->name); stats->addDictionary(room.room->number, room.room->name);
} }
stats->init();
} }

View File

@@ -6,53 +6,61 @@
#include <sstream> #include <sstream>
// Constructor // Constructor
Stats::Stats(std::string file, options_t *options) Stats::Stats(std::string file, std::string buffer, options_t *options)
{ {
this->options = options; this->options = options;
bufferPath = buffer;
filePath = file; filePath = file;
bufferList.clear();
list.clear(); list.clear();
dictionary.clear(); dictionary.clear();
if (options->online.enabled)
{
loadFromServer();
}
else
{
loadFromFile();
}
} }
// Destructor // Destructor
Stats::~Stats() Stats::~Stats()
{ {
// Calcula cual es la habitación con más muertes
checkWorstNightmare(); checkWorstNightmare();
#ifndef DEBUG
if (options->online.enabled)
{
saveToServer();
}
else
{
saveToFile();
}
#endif
saveToServer();
// Vuelca los datos del buffer en la lista de estadisticas
updateListFromBuffer();
// Guarda las estadísticas
saveToServer();
saveToFile(bufferPath, bufferList);
saveToFile(filePath, list);
bufferList.clear();
list.clear(); list.clear();
dictionary.clear(); dictionary.clear();
} }
// Inicializador
// Se debe llamar a este procediiento una vez se haya creado el diccionario numero-nombre
void Stats::init()
{
loadFromFile(bufferPath, bufferList);
loadFromFile(filePath, list);
if (options->online.enabled)
{
loadFromServer();
}
// Vuelca los datos del buffer en la lista de estadisticas
updateListFromBuffer();
}
// Añade una muerte a las estadisticas // Añade una muerte a las estadisticas
void Stats::addDeath(std::string name) void Stats::addDeath(std::string name)
{ {
// Normaliza el nombre // Normaliza el nombre
std::replace(name.begin(), name.end(), ' ', '_'); // std::replace(name.begin(), name.end(), ' ', '_');
// Primero busca si ya hay una entrada con ese nombre // Primero busca si ya hay una entrada con ese nombre
const int index = findByName(name); const int index = findByName(name, bufferList);
if (index != -1) if (index != -1)
{ {
list.at(index).died++; bufferList.at(index).died++;
} }
// En caso contrario crea la entrada // En caso contrario crea la entrada
@@ -62,7 +70,7 @@ void Stats::addDeath(std::string name)
item.name = name; item.name = name;
item.visited = 0; item.visited = 0;
item.died = 1; item.died = 1;
list.push_back(item); bufferList.push_back(item);
} }
} }
@@ -70,13 +78,13 @@ void Stats::addDeath(std::string name)
void Stats::addVisit(std::string name) void Stats::addVisit(std::string name)
{ {
// Normaliza el nombre // Normaliza el nombre
std::replace(name.begin(), name.end(), ' ', '_'); // std::replace(name.begin(), name.end(), ' ', '_');
// Primero busca si ya hay una entrada con ese nombre // Primero busca si ya hay una entrada con ese nombre
const int index = findByName(name); const int index = findByName(name, bufferList);
if (index != -1) if (index != -1)
{ {
list.at(index).visited++; bufferList.at(index).visited++;
} }
// En caso contrario crea la entrada // En caso contrario crea la entrada
@@ -86,13 +94,12 @@ void Stats::addVisit(std::string name)
item.name = name; item.name = name;
item.visited = 1; item.visited = 1;
item.died = 0; item.died = 0;
list.push_back(item); bufferList.push_back(item);
} }
std::cout << "VISITADO: " << list.back().name << ";" << list.back().visited << ";" << list.back().died << std::endl;
} }
// Busca una entrada en la lista por nombre // Busca una entrada en la lista por nombre
int Stats::findByName(std::string name) int Stats::findByName(std::string name, std::vector<stats_t> &list)
{ {
int i = 0; int i = 0;
@@ -109,8 +116,10 @@ int Stats::findByName(std::string name)
} }
// Carga las estadisticas desde un fichero // Carga las estadisticas desde un fichero
bool Stats::loadFromFile() bool Stats::loadFromFile(std::string filePath, std::vector<stats_t> &list)
{ {
list.clear();
// Indicador de éxito en la carga // Indicador de éxito en la carga
bool success = true; bool success = true;
@@ -154,7 +163,7 @@ bool Stats::loadFromFile()
// El fichero no existe // El fichero no existe
else else
{ // Crea el fichero con los valores por defecto { // Crea el fichero con los valores por defecto
saveToFile(); saveToFile(filePath, list);
} }
return success; return success;
@@ -163,7 +172,10 @@ bool Stats::loadFromFile()
// Carga las estadisticas desde un servidor // Carga las estadisticas desde un servidor
void Stats::loadFromServer() void Stats::loadFromServer()
{ {
// jscore::setUserData(options->online.gameID, options->online.jailerID, ""); // Limpia los datos del servidor
// eraseServerData();
list.clear();
std::string data; std::string data;
if (options->online.enabled) if (options->online.enabled)
@@ -190,7 +202,7 @@ void Stats::loadFromServer()
// Obtiene el nombre // Obtiene el nombre
getline(ss, tmp, ';'); getline(ss, tmp, ';');
stat.name = tmp; stat.name = numberToName(tmp);
// Obtiene las visitas // Obtiene las visitas
getline(ss, tmp, ';'); getline(ss, tmp, ';');
@@ -207,20 +219,11 @@ void Stats::loadFromServer()
} }
// Guarda las estadisticas en un fichero // Guarda las estadisticas en un fichero
void Stats::saveToFile() void Stats::saveToFile(std::string filePath, std::vector<stats_t> &list)
{ {
// Crea y abre el fichero de texto // Crea y abre el fichero de texto
std::ofstream file(filePath); std::ofstream file(filePath);
if (file.good())
{
std::cout << filePath << " open for writing" << std::endl;
}
else
{
std::cout << filePath << " can't be opened" << std::endl;
}
// Escribe en el fichero // Escribe en el fichero
file << "# NOMBRE DE LA HABITACION;VISITAS;MUERTES" << std::endl; file << "# NOMBRE DE LA HABITACION;VISITAS;MUERTES" << std::endl;
for (auto item : list) for (auto item : list)
@@ -240,9 +243,8 @@ void Stats::saveToServer()
{ {
for (auto item : list) for (auto item : list)
{ {
// data = data + nameToNumber(item.name) + ";" + std::to_string(item.visited) + ";" + std::to_string(item.died) + ";"; data = data + nameToNumber(item.name) + ";" + std::to_string(item.visited) + ";" + std::to_string(item.died) + ";";
data = data + item.name + ";" + std::to_string(item.visited) + ";" + std::to_string(item.died) + ";"; // std::cout << "GUARDADO: " << item.name << ";" << item.visited << ";" << item.died << std::endl;
std::cout << "GUARDADO: " << item.name << ";" << item.visited << ";" << item.died << std::endl;
} }
jscore::setUserData(options->online.gameID, options->online.jailerID, data); jscore::setUserData(options->online.gameID, options->online.jailerID, data);
} }
@@ -293,3 +295,43 @@ std::string Stats::nameToNumber(std::string name)
} }
return ""; return "";
} }
// Vuelca los datos del buffer en la lista de estadisticas
void Stats::updateListFromBuffer()
{
// Actualiza list desde bufferList
for (auto buffer : bufferList)
{
int index = findByName(buffer.name, list);
if (index != -1)
{ // Encontrado. Aumenta sus estadisticas
list.at(index).visited += buffer.visited;
list.at(index).died += buffer.died;
}
else
{ // En caso contrario crea la entrada
stats_t item;
item.name = buffer.name;
item.visited = buffer.visited;
item.died = buffer.died;
list.push_back(item);
}
}
// Sube los datos al servidor
if (options->online.enabled)
{
saveToServer();
bufferList.clear();
}
saveToFile(bufferPath, bufferList);
saveToFile(filePath, list);
}
// Limpia los datos del servidor
void Stats::eraseServerData()
{
jscore::setUserData(options->online.gameID, options->online.jailerID, "");
}

View File

@@ -28,20 +28,22 @@ private:
// Variables // Variables
std::vector<stats_dictionary_t> dictionary; // Lista con la equivalencia nombre-numero de habitacion std::vector<stats_dictionary_t> dictionary; // Lista con la equivalencia nombre-numero de habitacion
std::vector<stats_t> list; // Lista con las estadisticas por habitación std::vector<stats_t> bufferList; // Lista con las estadisticas temporales por habitación
std::string filePath; // Fichero con las estadísticas std::vector<stats_t> list; // Lista con las estadisticas completas por habitación
std::string bufferPath; // Fichero con las estadísticas temporales
std::string filePath; // Fichero con las estadísticas completas
// Busca una entrada en la lista por nombre // Busca una entrada en la lista por nombre
int findByName(std::string name); int findByName(std::string name, std::vector<stats_t> &list);
// Carga las estadisticas desde un fichero // Carga las estadisticas desde un fichero
bool loadFromFile(); bool loadFromFile(std::string filePath, std::vector<stats_t> &list);
// Carga las estadisticas desde un servidor // Carga las estadisticas desde un servidor
void loadFromServer(); void loadFromServer();
// Guarda las estadisticas en un fichero // Guarda las estadisticas en un fichero
void saveToFile(); void saveToFile(std::string filePath, std::vector<stats_t> &list);
// Guarda las estadisticas en un servidor // Guarda las estadisticas en un servidor
void saveToServer(); void saveToServer();
@@ -55,13 +57,23 @@ private:
// Obtiene el número de una habitación a partir del nombre // Obtiene el número de una habitación a partir del nombre
std::string nameToNumber(std::string name); std::string nameToNumber(std::string name);
// Vuelca los datos del buffer en la lista de estadisticas
void updateListFromBuffer();
// Limpia los datos del servidor
void eraseServerData();
public: public:
// Constructor // Constructor
Stats(std::string file, options_t *options); Stats(std::string file, std::string buffer, options_t *options);
// Destructor // Destructor
~Stats(); ~Stats();
// Inicializador
// Se debe llamar a este procediiento una vez se haya creado el diccionario numero-nombre
void init();
// Añade una muerte a las estadisticas // Añade una muerte a las estadisticas
void addDeath(std::string name); void addDeath(std::string name);