From a4fd00794dfc9e2a3c04f22a309a4596f4a7c122 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 3 Oct 2023 23:18:56 +0200 Subject: [PATCH] Ya se puede modificar el JailerID desde la pantalla de titulo, aunque hay que pulirlo un poco --- source/director.cpp | 4 -- source/enter_id.cpp | 99 +++++++++++++++++++++++------------- source/enter_id.h | 22 +++++--- source/jail_engine/utils.cpp | 16 ++++++ source/jail_engine/utils.h | 3 ++ source/title.cpp | 12 +++++ source/title.h | 5 ++ 7 files changed, 114 insertions(+), 47 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index f49fd1c..8dacb9d 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -1888,10 +1888,6 @@ void Director::run() runDemo(); break; - case SECTION_PROG_ENTER_ID: - runEnterID(); - break; - case SECTION_PROG_GAME: runGame(); break; diff --git a/source/enter_id.cpp b/source/enter_id.cpp index 4689013..d710801 100644 --- a/source/enter_id.cpp +++ b/source/enter_id.cpp @@ -31,21 +31,13 @@ EnterID::EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t SDL_SetTextureBlendMode(textTexture, SDL_BLENDMODE_BLEND); // Inicializa variables + oldJailerID = options->online.jailerID; + loopRunning = true; counter = 0; ticks = 0; ticksSpeed = 15; - pos = 0; - name[pos] = 0; - maxLenght = 15; - - if (options->online.enabled && options->online.jailerID == "") - { - this->section->name = SECTION_PROG_ENTER_ID; - } - else - { - endSection(); - } + jailerIDPos = 0; + initName(); // Escribe el texto en la textura fillTexture(); @@ -62,10 +54,7 @@ EnterID::~EnterID() // Bucle para el logo del juego void EnterID::run() { - // Detiene la música - JA_StopMusic(); - - while (section->name == SECTION_PROG_ENTER_ID) + while (loopRunning) { update(); checkEvents(); @@ -83,6 +72,7 @@ void EnterID::checkEvents() if (eventHandler->type == SDL_QUIT) { section->name = SECTION_PROG_QUIT; + loopRunning = false; break; } @@ -100,6 +90,13 @@ void EnterID::checkEvents() // Comprueba las teclas que se han pulsado if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN)) { + if (eventHandler->key.keysym.scancode == SDL_SCANCODE_RETURN) + { + options->online.jailerID = toLower((std::string)name); + endSection(); + break; + } + if (eventHandler->key.keysym.scancode >= SDL_SCANCODE_A && eventHandler->key.keysym.scancode <= SDL_SCANCODE_Z) { // Si pulsa una letra if (pos < maxLenght) @@ -138,6 +135,7 @@ void EnterID::checkEvents() else if (eventHandler->key.keysym.scancode == SDL_SCANCODE_ESCAPE) { section->name = SECTION_PROG_QUIT; + loopRunning = false; break; } @@ -188,6 +186,9 @@ void EnterID::update() // Actualiza el cursor cursor = (counter % 20 >= 10) ? " " : "_"; + + // Actualiza las notificaciones + screen->updateNotifier(); } } @@ -197,16 +198,13 @@ void EnterID::render() // Prepara para empezar a dibujar en la textura de juego screen->start(); - // Limpia la pantalla - screen->clean(); - // Dibuja la textura con el texto en pantalla SDL_RenderCopy(renderer, textTexture, nullptr, nullptr); // Escribe el jailerID const std::string jailerID = (std::string)name + cursor; const color_t color = stringToColor(options->palette, "white"); - text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, (16 * 8 + 1), jailerID, 1, color); + text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, jailerIDPos, jailerID, 1, color); // Vuelca el contenido del renderizador en pantalla screen->blit(); @@ -267,32 +265,28 @@ void EnterID::fillTexture() SDL_SetRenderTarget(renderer, nullptr); } -// Cambia la paleta -void EnterID::switchPalette() -{ - options->palette = options->palette == p_zxspectrum ? p_zxarne : p_zxspectrum; - fillTexture(); -} - // Inicializa los servicios online void EnterID::initOnline() { + // Si ya ha iniciado la sesión y no ha cambiado el jailerID, que no continue if (options->online.sessionEnabled) - { // Si ya ha iniciado la sesión, que no continue - return; + { + if (oldJailerID == options->online.jailerID) + { + return; + } } if (options->online.jailerID == "") { // Jailer ID no definido - options->online.enabled = false; + options->online.sessionEnabled = false; } else { // Jailer ID iniciado - options->online.enabled = options->online.sessionEnabled = true; + // Establece el servidor y el puerto jscore::init(options->online.server, options->online.port); - #ifdef DEBUG const std::string caption = "IS LOGGED IN (DEBUG)"; #else @@ -309,7 +303,42 @@ void EnterID::initOnline() // Termina la sección void EnterID::endSection() { + loopRunning = false; initOnline(); - section->name = (section->subsection == SUBSECTION_LOGO_TO_INTRO) ? SECTION_PROG_INTRO : SECTION_PROG_TITLE; - section->subsection = 0; -} \ No newline at end of file +} + +// Inicializa el vector utilizado para almacenar el texto que se escribe en pantalla +void EnterID::initName() +{ + // Calcula el tamaño del vector + name[0] = 0; + maxLenght = sizeof(name) / sizeof(name[pos]); + + // Inicializa el vector con ceros + for (int i = 0; i < maxLenght; ++i) + { + name[i] = 0; + } + + // Si no hay definido ningun JailerID, coloca el cursor en primera posición + if (options->online.jailerID == "") + { + pos = 0; + } + else + { // En caso contrario, copia el texto al vector y coloca el cursor en posición + const int len = std::min((int)options->online.jailerID.size(), maxLenght); + for (int i = 0; i < len; ++i) + { + name[i] = (char)options->online.jailerID[i]; + } + pos = len; + } +} + +// Cambia la paleta +void EnterID::switchPalette() +{ + options->palette = options->palette == p_zxspectrum ? p_zxarne : p_zxspectrum; + fillTexture(); +} diff --git a/source/enter_id.h b/source/enter_id.h index 1d7ca90..6d59b78 100644 --- a/source/enter_id.h +++ b/source/enter_id.h @@ -9,7 +9,7 @@ #include #ifndef ENTER_ID_H -#define ASK_ME_H +#define ENTER_ID_H class EnterID { @@ -32,15 +32,18 @@ private: section_t *section; // Estado del bucle principal para saber si continua o se sale // Variables + bool loopRunning; // Indica si ha de terminar el bucle principal int counter; // Contador Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa std::vector texts; // Vector con los textos std::string cursor; // Contiene el caracter que se muestra como cursor - char name[15]; - int pos; - int maxLenght; // Tamaño máximo del jailerID + char name[15]; // Aqui se guardan los caracteres de las teclas que se van pulsando + int pos; // Posición actual en el vector name + int maxLenght; // Tamaño máximo del jailerID + std::string oldJailerID; // Almacena el valor de jailerID al inicio para ver si se ha modificado + int jailerIDPos; // Posición en el eje Y donde ser va a escribir el texto // Actualiza las variables void update(); @@ -57,15 +60,18 @@ private: // Escribe el texto en la textura void fillTexture(); - // Cambia la paleta - void switchPalette(); - // Inicializa los servicios online void initOnline(); // Termina la sección void endSection(); + // Inicializa el vector utilizado para almacenar el texto que se escribe en pantalla + void initName(); + + // Cambia la paleta + void switchPalette(); + public: // Constructor EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, section_t *section); @@ -77,4 +83,4 @@ public: void run(); }; -#endif +#endif \ No newline at end of file diff --git a/source/jail_engine/utils.cpp b/source/jail_engine/utils.cpp index 7f6fae7..4c6f26d 100644 --- a/source/jail_engine/utils.cpp +++ b/source/jail_engine/utils.cpp @@ -553,4 +553,20 @@ bool colorAreEqual(color_t color1, color_t color2) const bool b = color1.b == color2.b; return (r && g && b); +} + +// Convierte una cadena a minusculas +std::string toLower(std::string str) +{ + const char *original = str.c_str(); + char *lower = (char *)malloc(str.size() + 1); + for (int i = 0; i < (int)str.size(); ++i) + { + char c = original[i]; + lower[i] = (c >= 65 && c <= 90) ? c + 32 : c; + } + lower[str.size()] = 0; + std::string nova(lower); + free(lower); + return nova; } \ No newline at end of file diff --git a/source/jail_engine/utils.h b/source/jail_engine/utils.h index 2dd9e2b..7dfa0de 100644 --- a/source/jail_engine/utils.h +++ b/source/jail_engine/utils.h @@ -197,4 +197,7 @@ std::string boolToString(bool value); // Compara dos colores bool colorAreEqual(color_t color1, color_t color2); +// Convierte una cadena a minusculas +std::string toLower(std::string str); + #endif \ No newline at end of file diff --git a/source/title.cpp b/source/title.cpp index 10c600b..8168692 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -153,6 +153,10 @@ void Title::checkEvents() showCheevos = !showCheevos; break; + case SDL_SCANCODE_Z: + runEnterID(); + break; + default: break; } @@ -389,4 +393,12 @@ void Title::moveCheevosList(int direction) cheevosTextureView.y = bottom; cheevosSprite->setSpriteClip(cheevosTextureView); +} + +// Ejecuta la seccion en la que se solicita al usuario su ID online +void Title::runEnterID() +{ + enterID = new EnterID(renderer, screen, asset, options, section); + enterID->run(); + delete enterID; } \ No newline at end of file diff --git a/source/title.h b/source/title.h index f6712e7..3b41905 100644 --- a/source/title.h +++ b/source/title.h @@ -2,6 +2,7 @@ #include #include "cheevos.h" +#include "enter_id.h" #include "jail_engine/asset.h" #include "jail_engine/input.h" #include "jail_engine/jail_audio.h" @@ -43,6 +44,7 @@ private: Texture *cheevosTexture; // Textura con lo lista de logros Sprite *cheevosSprite; // Sprite para manejar la textura con la lista de logros Cheevos *cheevos; // Objeto encargado de gestionar los logros del juego + EnterID *enterID; // Objeto para recoger el JailerID desde el teclado section_t *section; // Estado del bucle principal para saber si continua o se sale // Variables @@ -88,6 +90,9 @@ private: // Desplaza la lista de logros void moveCheevosList(int direction); + // Ejecuta la seccion en la que se solicita al usuario su ID online + void runEnterID(); + public: // Constructor Title(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);