From 0d586c0827298bfae50a07d0a9d44ecfb55303ce Mon Sep 17 00:00:00 2001 From: Sergio Valor Martinez Date: Tue, 22 Nov 2022 10:42:30 +0100 Subject: [PATCH] =?UTF-8?q?Ya=20funcionan=20las=20estad=C3=ADsticas=20onli?= =?UTF-8?q?ne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/director.cpp | 13 +---- source/game.cpp | 4 +- source/stats.cpp | 136 +++++++++++++++++++++++++++++--------------- source/stats.h | 24 ++++++-- 4 files changed, 111 insertions(+), 66 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index 31f42cf..03f2f94 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -116,18 +116,6 @@ void Director::initOnline() 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 asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data); 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); // Habitaciones diff --git a/source/game.cpp b/source/game.cpp index 0a3ab2b..de1be51 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -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); music = JA_LoadMusic(asset->get("game.ogg").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 ticks = 0; @@ -632,4 +632,6 @@ void Game::initStats() { stats->addDictionary(room.room->number, room.room->name); } + + stats->init(); } \ No newline at end of file diff --git a/source/stats.cpp b/source/stats.cpp index f6dd287..b7541c2 100644 --- a/source/stats.cpp +++ b/source/stats.cpp @@ -6,53 +6,61 @@ #include // Constructor -Stats::Stats(std::string file, options_t *options) +Stats::Stats(std::string file, std::string buffer, options_t *options) { this->options = options; + bufferPath = buffer; filePath = file; + bufferList.clear(); list.clear(); dictionary.clear(); - if (options->online.enabled) - { - loadFromServer(); - } - else - { - loadFromFile(); - } } // Destructor Stats::~Stats() { + // Calcula cual es la habitación con más muertes 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(); 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 void Stats::addDeath(std::string name) { // 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 - const int index = findByName(name); + const int index = findByName(name, bufferList); if (index != -1) { - list.at(index).died++; + bufferList.at(index).died++; } // En caso contrario crea la entrada @@ -62,7 +70,7 @@ void Stats::addDeath(std::string name) item.name = name; item.visited = 0; 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) { // 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 - const int index = findByName(name); + const int index = findByName(name, bufferList); if (index != -1) { - list.at(index).visited++; + bufferList.at(index).visited++; } // En caso contrario crea la entrada @@ -86,13 +94,12 @@ void Stats::addVisit(std::string name) item.name = name; item.visited = 1; 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 -int Stats::findByName(std::string name) +int Stats::findByName(std::string name, std::vector &list) { int i = 0; @@ -109,8 +116,10 @@ int Stats::findByName(std::string name) } // Carga las estadisticas desde un fichero -bool Stats::loadFromFile() +bool Stats::loadFromFile(std::string filePath, std::vector &list) { + list.clear(); + // Indicador de éxito en la carga bool success = true; @@ -154,7 +163,7 @@ bool Stats::loadFromFile() // El fichero no existe else { // Crea el fichero con los valores por defecto - saveToFile(); + saveToFile(filePath, list); } return success; @@ -163,7 +172,10 @@ bool Stats::loadFromFile() // Carga las estadisticas desde un servidor void Stats::loadFromServer() { - // jscore::setUserData(options->online.gameID, options->online.jailerID, ""); + // Limpia los datos del servidor + // eraseServerData(); + + list.clear(); std::string data; if (options->online.enabled) @@ -190,7 +202,7 @@ void Stats::loadFromServer() // Obtiene el nombre getline(ss, tmp, ';'); - stat.name = tmp; + stat.name = numberToName(tmp); // Obtiene las visitas getline(ss, tmp, ';'); @@ -207,20 +219,11 @@ void Stats::loadFromServer() } // Guarda las estadisticas en un fichero -void Stats::saveToFile() +void Stats::saveToFile(std::string filePath, std::vector &list) { // Crea y abre el fichero de texto 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 file << "# NOMBRE DE LA HABITACION;VISITAS;MUERTES" << std::endl; for (auto item : list) @@ -240,9 +243,8 @@ void Stats::saveToServer() { for (auto item : list) { - // 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; + data = data + nameToNumber(item.name) + ";" + std::to_string(item.visited) + ";" + std::to_string(item.died) + ";"; + // std::cout << "GUARDADO: " << item.name << ";" << item.visited << ";" << item.died << std::endl; } jscore::setUserData(options->online.gameID, options->online.jailerID, data); } @@ -292,4 +294,44 @@ std::string Stats::nameToNumber(std::string name) } } 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, ""); } \ No newline at end of file diff --git a/source/stats.h b/source/stats.h index 681b622..e75a898 100644 --- a/source/stats.h +++ b/source/stats.h @@ -28,20 +28,22 @@ private: // Variables std::vector dictionary; // Lista con la equivalencia nombre-numero de habitacion - std::vector list; // Lista con las estadisticas por habitación - std::string filePath; // Fichero con las estadísticas + std::vector bufferList; // Lista con las estadisticas temporales por habitación + std::vector 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 - int findByName(std::string name); + int findByName(std::string name, std::vector &list); // Carga las estadisticas desde un fichero - bool loadFromFile(); + bool loadFromFile(std::string filePath, std::vector &list); // Carga las estadisticas desde un servidor void loadFromServer(); // Guarda las estadisticas en un fichero - void saveToFile(); + void saveToFile(std::string filePath, std::vector &list); // Guarda las estadisticas en un servidor void saveToServer(); @@ -55,13 +57,23 @@ private: // Obtiene el número de una habitación a partir del nombre 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: // Constructor - Stats(std::string file, options_t *options); + Stats(std::string file, std::string buffer, options_t *options); // Destructor ~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 void addDeath(std::string name);