forked from jaildesigner-jailgames/jaildoctors_dilemma
Ya funcionan las estadísticas online
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
136
source/stats.cpp
136
source/stats.cpp
@@ -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);
|
||||
}
|
||||
@@ -293,3 +295,43 @@ 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, "");
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user