diff --git a/Makefile b/Makefile index 66e264d..6206859 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ windows: @echo off powershell if (Test-Path data\config\config.bin) {Remove-Item data\config\config.bin -Recurse -Force} powershell if (Test-Path data\config\score.bin) {Remove-Item data\config\score.bin -Recurse -Force} - g++ $(source) -std=c++11 -Wall -Os -lmingw32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o $(executable).exe + g++ $(source) -std=c++11 -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o $(executable).exe strip -s -R .comment -R .gnu.version $(executable).exe --strip-unneeded windows_release: @@ -29,7 +29,7 @@ windows_release: powershell Copy-Item "release/SDL2.dll" -Destination "$(releaseFolder)" # Build - g++ $(source) -D RELEASE -std=c++11 -Wall -Os -lmingw32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(releaseFolder)/$(executable).exe" + g++ $(source) -D RELEASE -std=c++11 -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(releaseFolder)/$(executable).exe" strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable).exe" --strip-unneeded # Create ZIP diff --git a/data/config/jailer_id.txt b/data/config/jailer_id.txt new file mode 100644 index 0000000..1bdc0f9 --- /dev/null +++ b/data/config/jailer_id.txt @@ -0,0 +1 @@ +JailDesigner \ No newline at end of file diff --git a/source/common/jscore.cpp b/source/common/jscore.cpp index f9710c0..2b2676a 100644 --- a/source/common/jscore.cpp +++ b/source/common/jscore.cpp @@ -1,38 +1,55 @@ #include "jscore.h" #include +#include +#include #include -#include -//#include -//#include -//#include +#ifdef WIN32 + #include +#else + #include + #include + #include +#endif #include #include #include namespace jscore { + using namespace std; struct user { - std::string name; + string name; int points; }; - std::vector score; + vector score; #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) - using namespace std; int sock; struct sockaddr_in client; int PORT = 9911; const char *HOST = "jaildoctor.duckdns.org"; - WSADATA WsaData; - std::string sendRequest(const std::string request) { +#ifdef WIN32 + WSADATA WsaData; +#endif + + bool jscore_error = false; + string error_message; + + void setErrorMessage(string message) { + jscore_error = true; + error_message = message; + } + + string sendRequest(const string request) { +#ifdef WIN32 int ret = WSAStartup(0x101,&WsaData); if (ret != 0) return 0; - +#endif struct hostent * host = gethostbyname(HOST); if ( (host == NULL) || (host->h_addr == NULL) ) { - printf("Error retrieving DNS information.\n"); + setErrorMessage("Error retrieving DNS information.\n"); return ""; } @@ -44,19 +61,19 @@ namespace jscore { sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { - printf("Error creating socket.\n"); + setErrorMessage("Error creating socket.\n"); return ""; } if ( connect(sock, (struct sockaddr *)&client, sizeof(client)) < 0 ) { close(sock); - printf("Could not connect\n"); + setErrorMessage("Could not connect\n"); return ""; } - std::string r = request + " HTTP/1.1\r\nHost: "+HOST+"\r\nConnection: close\r\n\r\n\r\n"; + string r = request + " HTTP/1.1\r\nHost: "+HOST+"\r\nConnection: close\r\n\r\n\r\n"; if (send(sock, r.c_str(), r.length(), 0) != (int)r.length()) { - printf("Error sending request.\n"); + setErrorMessage("Error sending request.\n"); return ""; } @@ -72,14 +89,17 @@ namespace jscore { buffer[pos] = cur; pos++; } +#ifdef WIN32 WSACleanup(); +#endif buffer[pos]=0; return buffer; } - const bool initOnlineScore(std::string game) { - std::string strbuff = sendRequest("GET /score-list.php?game=" + game); - + const bool initOnlineScore(string game) { + string strbuff = sendRequest("GET /score-list.php?game=" + game); + if (jscore_error) return not jscore_error; + user u; char buffer[1024]; strcpy(buffer, strbuff.c_str()); @@ -93,29 +113,34 @@ namespace jscore { *p=0; u.points = atoi(str); p++; str=p; score.push_back(u); } + return not jscore_error; } const int getNumUsers() { return score.size(); } - std::string getUserName(const int index) { + string getUserName(const int index) { return score[index].name; } const int getPoints(const int index) { return score[index].points; } - const bool updateUserPoints(std::string game, std::string user, const int points) { - char dst[255]; - std::string strbuff = sendRequest("GET /score-update.php?game=" + game + "&user=" + user + "&points=" + itoa(points, dst, 10)); + const bool updateUserPoints(string game, string user, const int points) { + string strbuff = sendRequest("GET /score-update.php?game=" + game + "&user=" + user + "&points=" + to_string(points)); initOnlineScore(game); + return not jscore_error; } - std::string getUserData(std::string game, std::string user) { + const int getUserPoints(string game, std::string user) { + return atoi(sendRequest("GET /getuserpoints.php?game=" + game + "&user=" + user).c_str()); + } + + string getUserData(string game, string user) { return sendRequest("GET /getuserdata.php?game=" + game + "&user=" + user); } - void setUserData(std::string game, std::string user, std::string data) { + void setUserData(string game, string user, string data) { sendRequest("GET /setuserdata.php?game=" + game + "&user=" + user + "&data=" + data); } diff --git a/source/common/jscore.h b/source/common/jscore.h index 089d7b5..43feb9b 100644 --- a/source/common/jscore.h +++ b/source/common/jscore.h @@ -6,6 +6,7 @@ namespace jscore { const int getNumUsers(); std::string getUserName(const int index); const int getPoints(const int index); + const int getUserPoints(std::string game, std::string user); const bool updateUserPoints(std::string game, std::string user, const int points); std::string getUserData(std::string game, std::string user); diff --git a/source/common/notify.cpp b/source/common/notify.cpp index e92a166..cbc5a4b 100644 --- a/source/common/notify.cpp +++ b/source/common/notify.cpp @@ -43,19 +43,16 @@ void Notify::update() { notifications.at(i).counter++; - const int height = notifications.at(i).texture->getHeight(); - const int halfDesp = text->getCharacterSize() / 2; - // Comprueba los estados if (notifications.at(i).state == ns_rising) { - const float step = ((float)notifications.at(i).counter / (height + halfDesp)); + const float step = ((float)notifications.at(i).counter / notifications.at(i).travelDist); const int alpha = 255 * step; notifications.at(i).rect.y++; notifications.at(i).texture->setAlpha(alpha); - if (notifications.at(i).rect.y == 0 + halfDesp) + if (notifications.at(i).rect.y == notifications.at(i).y) { notifications.at(i).state = ns_stay; notifications.at(i).texture->setAlpha(255); @@ -74,13 +71,13 @@ void Notify::update() else if (notifications.at(i).state == ns_vanishing) { - const float step = (notifications.at(i).counter / (float)height); + const float step = (notifications.at(i).counter / (float)notifications.at(i).travelDist); const int alpha = 255 * (1 - step); notifications.at(i).rect.y--; notifications.at(i).texture->setAlpha(alpha); - if (notifications.at(i).rect.y == -height) + if (notifications.at(i).rect.y == notifications.at(i).y - notifications.at(i).travelDist) { notifications.at(i).state = ns_finished; } @@ -112,17 +109,21 @@ void Notify::showText(std::string text) // Crea constantes const int width = this->text->lenght(text) + (this->text->getCharacterSize() * 2); const int height = this->text->getCharacterSize() * 2; - const int desp = this->text->getCharacterSize(); - const int halfDesp = desp / 2; + const int despH = this->text->getCharacterSize() / 2; + const int despV = despH; + const int travelDist = height + despV; + const int offset = (int)notifications.size() * (travelDist) + despV; // Crea la notificacion notification_t n; // inicializa variables + n.y = offset; + n.travelDist = travelDist; n.counter = 0; n.state = ns_rising; n.text = text; - n.rect = {halfDesp, -height, width, height}; + n.rect = {despH, offset - travelDist, width, height}; // Crea la textura n.texture = new Texture(renderer); @@ -131,7 +132,7 @@ void Notify::showText(std::string text) SDL_SetRenderDrawColor(renderer, bgColor.r, bgColor.g, bgColor.b, 255); SDL_RenderClear(renderer); n.texture->setBlendMode(SDL_BLENDMODE_BLEND); - this->text->writeDX(TXT_CENTER | TXT_STROKE, width / 2, halfDesp, text, 1, {255, 255, 255}, 1, {0, 0, 0}); + this->text->writeDX(TXT_CENTER | TXT_STROKE, width / 2, despV, text, 1, {255, 255, 255}, 1, {0, 0, 0}); // Crea el sprite n.sprite = new Sprite(n.rect, n.texture, renderer); diff --git a/source/common/notify.h b/source/common/notify.h index b9c7429..6a6b406 100644 --- a/source/common/notify.h +++ b/source/common/notify.h @@ -42,6 +42,8 @@ private: Texture *texture; Sprite *sprite; SDL_Rect rect; + int y; + int travelDist; }; // Objetos y punteros diff --git a/source/common/utils.h b/source/common/utils.h index f620e2d..eccc447 100644 --- a/source/common/utils.h +++ b/source/common/utils.h @@ -83,6 +83,14 @@ struct input_t Uint8 deviceType; // Tipo de dispositivo (teclado o mando) }; +// Estructura para el servicio online +struct online_t +{ + std::string gameID; // Identificador del juego para los servicios online + std::string jailerID; // Identificador del jugador para los servicios online + int score; // Puntuación almacenada online +}; + // Estructura con todas las opciones de configuración del programa struct options_t { @@ -100,6 +108,7 @@ struct options_t bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa bool borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana float borderSize; // Porcentaje de borde que se añade a lo ventana + online_t online; // Datos del servicio online }; // Calcula el cuadrado de la distancia entre dos puntos diff --git a/source/director.cpp b/source/director.cpp index b2d4cfd..ba2cd0a 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -1,7 +1,9 @@ +#include "common/jscore.h" +#include "common/utils.h" #include "const.h" #include "director.h" -#include "common/utils.h" #include +#include #include // Constructor @@ -37,6 +39,9 @@ Director::Director(std::string path) initInput(); screen = new Screen(window, renderer, asset, options, GAME_WIDTH, GAME_HEIGHT); + + // Inicializa los servicios online + initOnline(); } Director::~Director() @@ -170,6 +175,7 @@ bool Director::setFileList() asset->add(prefix + "/data/config/score.bin", t_data, false); asset->add(prefix + "/data/config/demo.bin", t_data); asset->add(prefix + "/data/config/config.bin", t_data, false); + asset->add(prefix + "/data/config/jailer_id.txt", t_data, false); asset->add(prefix + "/data/config/gamecontrollerdb.txt", t_data); // Musicas @@ -316,6 +322,9 @@ bool Director::loadConfigFile() options->keepAspect = true; options->borderSize = 0.0f; options->borderEnabled = false; + options->online.gameID = "coffee_crisis"; + options->online.jailerID = ""; + options->online.score = 0; // Indicador de éxito en la carga bool success = true; @@ -498,4 +507,56 @@ void Director::run() break; } } +} + +// Inicializa los servicios online +void Director::initOnline() +{ + // Obtiene la información online + if (jscore::initOnlineScore(options->online.gameID)) + { + screen->showText("Conectado a jaildoctor.duckdns.org"); + std::cout << "Conectado a jaildoctor.duckdns.org" << std::endl; + } + else + { + screen->showText("Fallo al conectar a jaildoctor.duckdns.org"); + std::cout << "Fallo al conectar a jaildoctor.duckdns.org" << std::endl; + } + + // Obten el Jailer ID + std::fstream f; + f.open(asset->get("jailer_id.txt"), std::ios::in); + if (f.is_open()) + { + std::string str; + if (getline(f, options->online.jailerID)) + { + f.close(); + } + } + f.close(); + + if (options->online.jailerID == "") + { + screen->showText("No ha especificado ningun Jailer ID"); + std::cout << "No ha especificado ningun Jailer ID" << std::endl; + } + else + { + screen->showText(options->online.jailerID + " ha iniciado sesion"); + std::cout << options->online.jailerID << " ha iniciado sesion" << std::endl; + } + + // Obten la puntuación online + const int points = jscore::getUserPoints(options->online.gameID, options->online.jailerID); + if (points == 0) + { + 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; + } } \ No newline at end of file diff --git a/source/director.h b/source/director.h index 19bb4b6..ea89c08 100644 --- a/source/director.h +++ b/source/director.h @@ -57,6 +57,9 @@ private: // Inicializa el objeto input void initInput(); + // Inicializa los servicios online + void initOnline(); + // Crea el indice de ficheros bool setFileList(); diff --git a/source/game.cpp b/source/game.cpp index 50567dd..165fdeb 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -1,4 +1,5 @@ #include "game.h" +#include "common/jscore.h" // Constructor Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang, Input *input, bool demo, options_t *options) @@ -54,6 +55,7 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr Game::~Game() { saveScoreFile(); + sendOnlineScore(); saveDemoFile(); // Restaura el metodo de control @@ -725,6 +727,28 @@ bool Game::saveScoreFile() return success; } +// Sube la puntuación online +bool Game::sendOnlineScore() +{ + const int score = players.at(0)->getScore(); + if (score <= options->online.score) + { + return true; + } + + if (jscore::updateUserPoints("coffee_crisis", options->online.jailerID, score)) + { + options->online.score = score; + screen->showText("PUNTUACION ENVIADA: " + std::to_string(score) + " PUNTOS"); + return true; + } + else + { + screen->showText("NO SE HA PODIDO ENVIAR LA PUNTUACION"); + return false; + } +} + // Guarda el fichero de datos para la demo bool Game::saveDemoFile() { @@ -1659,7 +1683,9 @@ void Game::renderScoreBoard() // HI-SCORE textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset3, lang->getText(56)); - textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset4, updateScoreText(hiScore)); + // textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset4, updateScoreText(hiScore)); + const std::string txt = jscore::getUserName(0) + " - " + updateScoreText((Uint32)jscore::getPoints(0)); + textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset4, txt); } // Actualiza las variables del jugador @@ -3581,6 +3607,9 @@ void Game::runGameOverScreen() // Guarda los puntos saveScoreFile(); + // Sube la puntuación online + sendOnlineScore(); + // Reinicia el menu gameOverMenu->reset(); diff --git a/source/game.h b/source/game.h index 17ce0c0..ed064d1 100644 --- a/source/game.h +++ b/source/game.h @@ -262,6 +262,9 @@ private: // Guarda el fichero de puntos bool saveScoreFile(); + // Sube la puntuación online + bool sendOnlineScore(); + // Guarda el fichero de datos para la demo bool saveDemoFile(); diff --git a/source/title.cpp b/source/title.cpp index 56fa410..ea0d8f3 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -1,4 +1,5 @@ #include "title.h" +#include "common/jscore.h" // Constructor Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, options_t *options, Lang *lang, section_t section)