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;
}
// 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

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);
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();
}

View File

@@ -6,53 +6,61 @@
#include <sstream>
// 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<stats_t> &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<stats_t> &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<stats_t> &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, "");
}

View File

@@ -28,20 +28,22 @@ private:
// Variables
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::string filePath; // Fichero con las estadísticas
std::vector<stats_t> bufferList; // Lista con las estadisticas temporales por habitación
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
int findByName(std::string name);
int findByName(std::string name, std::vector<stats_t> &list);
// Carga las estadisticas desde un fichero
bool loadFromFile();
bool loadFromFile(std::string filePath, std::vector<stats_t> &list);
// Carga las estadisticas desde un servidor
void loadFromServer();
// Guarda las estadisticas en un fichero
void saveToFile();
void saveToFile(std::string filePath, std::vector<stats_t> &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);