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;
|
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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
136
source/stats.cpp
136
source/stats.cpp
@@ -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, "");
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user