From a8b467290f73754b87bb673625161b4745561698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Wed, 23 Nov 2022 16:59:40 +0100 Subject: [PATCH] =?UTF-8?q?Completado=20el=20ciclo=20para=20pedir=20el=20I?= =?UTF-8?q?D=20online.=20A=C3=B1adido=20sonido=20a=20las=20notificaciones.?= =?UTF-8?q?=20Agregado=20control=20de=20versi=C3=B3n=20del=20fichero=20de?= =?UTF-8?q?=20configuraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- data/sound/notify.wav | Bin 0 -> 49358 bytes source/ask_me.cpp | 13 ------------- source/ask_me.h | 27 --------------------------- source/common/notify.cpp | 7 ++++++- source/common/notify.h | 6 ++++-- source/common/screen.cpp | 2 +- source/common/utils.cpp | 32 -------------------------------- source/common/utils.h | 31 ++++++++++++++++--------------- source/director.cpp | 37 ++++++++++++++++++++++++++++++------- source/enter_id.cpp | 30 ++++++++++++++++++++---------- source/enter_id.h | 3 +++ source/logo.cpp | 32 +++++++++++--------------------- source/logo.h | 3 +++ 14 files changed, 95 insertions(+), 130 deletions(-) create mode 100644 data/sound/notify.wav delete mode 100644 source/ask_me.cpp delete mode 100644 source/ask_me.h diff --git a/Makefile b/Makefile index a2dbe8b..e0e7dbc 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ executable = jaildoctors_dilemma source = source/*.cpp source/common/*.cpp appName = JailDoctor's Dilemma releaseFolder = jdd_release -version = v1.06 +version = v1.06.1 # Release names windowsRelease = $(executable)-$(version)-win32-x64.zip diff --git a/data/sound/notify.wav b/data/sound/notify.wav new file mode 100644 index 0000000000000000000000000000000000000000..87927fc25e2ebb436731a2150ca7da3faab6d69b GIT binary patch literal 49358 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ŠV^ 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:>gsgtJlIju?$iFh&Au(MHMCXG@}MQQ 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 Ut@!options = options; -} - -// Destructor -AskMe::~AskMe() -{ - -} \ No newline at end of file diff --git a/source/ask_me.h b/source/ask_me.h deleted file mode 100644 index fc4eec4..0000000 --- a/source/ask_me.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include -#include "common/utils.h" -#include -#include - -#ifndef ASK_ME_H -#define ASK_ME_H - -class AskMe -{ -private: - // Punteros y objetos - options_t *options; - - // Variables - - -public: - // Constructor - AskMe(options_t *options); - - // Destructor - ~AskMe(); -}; - -#endif diff --git a/source/common/notify.cpp b/source/common/notify.cpp index 4be6665..43e3ca3 100644 --- a/source/common/notify.cpp +++ b/source/common/notify.cpp @@ -4,7 +4,7 @@ #include // Constructor -Notify::Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile) +Notify::Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile, std::string soundFile) { // Inicializa variables this->renderer = renderer; @@ -14,6 +14,7 @@ Notify::Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textF // Crea objetos texture = new Texture(renderer, bitmapFile); text = new Text(textFile, texture, renderer); + sound = JA_LoadSound(soundFile.c_str()); } // Destructor @@ -22,6 +23,7 @@ Notify::~Notify() // Libera la memoria de los objetos delete texture; delete text; + JA_DeleteSound(sound); for (auto notification : notifications) { @@ -143,6 +145,9 @@ void Notify::showText(std::string text) // Añade la notificación a la lista notifications.push_back(n); + + // Reproduce el sonido de la notificación + JA_PlaySound(sound); } // Indica si hay notificaciones activas diff --git a/source/common/notify.h b/source/common/notify.h index dbc6b67..fae665f 100644 --- a/source/common/notify.h +++ b/source/common/notify.h @@ -1,9 +1,10 @@ #pragma once #include +#include "jail_audio.h" +#include "sprite.h" #include "text.h" #include "texture.h" -#include "sprite.h" #include "utils.h" #include @@ -55,6 +56,7 @@ private: color_t bgColor; // Color de fondo de las notificaciones int waitTime; // Tiempo que se ve la notificación std::vector notifications; // La lista de notificaciones activas + JA_Sound sound; // Sonido a reproducir cuando suena la notificación // Elimina las notificaciones finalizadas void clearFinishedNotifications(); @@ -67,7 +69,7 @@ public: void update(); // Constructor - Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile); + Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile, std::string soundFile); // Destructor ~Notify(); diff --git a/source/common/screen.cpp b/source/common/screen.cpp index 473f3f9..b05f846 100644 --- a/source/common/screen.cpp +++ b/source/common/screen.cpp @@ -12,7 +12,7 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options this->asset = asset; // Crea los objetos - notify = new Notify(renderer, asset->get("smb2.png"), asset->get("smb2.txt")); + notify = new Notify(renderer, asset->get("smb2.png"), asset->get("smb2.txt"), asset->get("notify.wav")); gameCanvasWidth = options->gameWidth; gameCanvasHeight = options->gameHeight; diff --git a/source/common/utils.cpp b/source/common/utils.cpp index e05dc28..7f6fae7 100644 --- a/source/common/utils.cpp +++ b/source/common/utils.cpp @@ -294,28 +294,6 @@ SDL_Point checkCollision(d_line_t &l1, v_line_t &l2) return {-1, -1}; } -// Detector de colisiones entre una linea diagonal y una vertical -/*bool checkCollision(d_line_t &l1, v_line_t &l2) -{ - // Normaliza la linea diagonal - normalizeLine(l1); - - // Comprueba si la linea vertical esta a la izquierda de la linea diagonal - if (l2.x < l1.x1) - { - return false; - } - - // Comprueba si la linea vertical esta a la derecha de la linea diagonal - if (l2.x > l1.x2) - { - return false; - } - - // Inacabada - return true; -}*/ - // Normaliza una linea diagonal void normalizeLine(d_line_t &l) { @@ -367,16 +345,6 @@ bool checkCollision(SDL_Point &p, d_line_t &l) // En caso contrario, el punto está en la linea return true; - - - /*const int m = (l.y2 - l.y1) / (l.x2 - l.x1); - const int c = 0; - - // Comprueba si p cumple la ecuación de la linea - if (p.y == ((m * p.x) + c)) - return true; - - return false;*/ } // Devuelve un color_t a partir de un string diff --git a/source/common/utils.h b/source/common/utils.h index 097a4d7..be1d648 100644 --- a/source/common/utils.h +++ b/source/common/utils.h @@ -92,21 +92,22 @@ struct op_stats_t // Estructura con todas las opciones de configuración del programa struct options_t { - Uint32 videoMode; // Contiene el valor del modo de pantalla completa - int windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana - Uint32 filter; // Filtro usado para el escalado de la imagen - bool vSync; // Indica si se quiere usar vsync o no - int gameWidth; // Ancho de la resolucion nativa del juego - int gameHeight; // Alto de la resolucion nativa del juego - bool integerScale; // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa - 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 - palette_e palette; // Paleta de colores a usar en el juego - bool console; // Indica si ha de mostrar información por la consola de texto - cheat_t cheat; // Contiene trucos y ventajas para el juego - op_stats_t stats; // Datos con las estadisticas de juego - online_t online; // Datos del servicio online + std::string configVersion; // Versión del programa. Sirve para saber si las opciones son compatibles + Uint32 videoMode; // Contiene el valor del modo de pantalla completa + int windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana + Uint32 filter; // Filtro usado para el escalado de la imagen + bool vSync; // Indica si se quiere usar vsync o no + int gameWidth; // Ancho de la resolucion nativa del juego + int gameHeight; // Alto de la resolucion nativa del juego + bool integerScale; // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa + 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 + palette_e palette; // Paleta de colores a usar en el juego + bool console; // Indica si ha de mostrar información por la consola de texto + cheat_t cheat; // Contiene trucos y ventajas para el juego + op_stats_t stats; // Datos con las estadisticas de juego + 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 4a8d033..d31e192 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -18,7 +18,7 @@ Director::Director(int argc, char *argv[]) section.subsection = SUBSECTION_LOGO_TO_INTRO; #ifdef DEBUG - section.name = SECTION_PROG_GAME; + section.name = SECTION_PROG_LOGO; #endif // Crea e inicializa las opciones del programa @@ -59,7 +59,7 @@ Director::Director(int argc, char *argv[]) music = JA_LoadMusic(asset->get("title.ogg").c_str()); // Inicializa los servicios online - initOnline(); + //initOnline(); } Director::~Director() @@ -112,7 +112,10 @@ void Director::initOptions() // Crea el puntero a la estructura de opciones options = new options_t; - // Inicializa valores + // Version + options->configVersion = "v1.06.1"; + + // Opciones dee video options->gameWidth = GAMECANVAS_WIDTH; options->gameHeight = GAMECANVAS_HEIGHT; options->videoMode = 0; @@ -134,8 +137,8 @@ void Director::initOptions() options->stats.rooms = 0; options->stats.items = 0; - // Online - options->online.enabled = false; + // Opciones online + options->online.enabled = true; options->online.server = "jaildoctor.duckdns.org"; options->online.port = 9911; #ifdef DEBUG @@ -188,6 +191,10 @@ bool Director::loadConfig() // Indicador de éxito en la carga bool success = true; + // Versión actual del fichero + const std::string configVersion = options->configVersion; + options->configVersion = ""; + // Variables para manejar el fichero std::string line; std::ifstream file(asset->get("config.txt")); @@ -234,6 +241,13 @@ bool Director::loadConfig() saveConfig(); } + // Si la versión de fichero no coincide, crea un fichero nuevo con los valores por defecto + if (configVersion != options->configVersion) + { + initOptions(); + saveConfig(); + } + // Normaliza los valores const bool a = options->videoMode == 0; const bool b = options->videoMode == SDL_WINDOW_FULLSCREEN; @@ -289,7 +303,10 @@ bool Director::saveConfig() } // Escribe en el fichero - file << "## VISUAL OPTIONS\n"; + file << "## VERSION\n"; + file << "version=" + options->configVersion + "\n"; + + file << "\n## VISUAL OPTIONS\n"; if (options->videoMode == 0) { file << "videoMode=0\n"; @@ -954,7 +971,12 @@ bool Director::setOptions(options_t *options, std::string var, std::string value // Indicador de éxito en la asignación bool success = true; - if (var == "videoMode") + if (var == "configVersion") + { + options->configVersion = value; + } + + else if (var == "videoMode") { if (value == "SDL_WINDOW_FULLSCREEN_DESKTOP") { @@ -1512,6 +1534,7 @@ bool Director::setFileList() asset->add(prefix + "/data/sound/jump22.wav", t_sound); asset->add(prefix + "/data/sound/jump23.wav", t_sound); asset->add(prefix + "/data/sound/jump24.wav", t_sound); + asset->add(prefix + "/data/sound/notify.wav", t_sound); // Logo asset->add(prefix + "/data/logo/jailgames.png", t_bitmap); diff --git a/source/enter_id.cpp b/source/enter_id.cpp index dbd4cea..357a910 100644 --- a/source/enter_id.cpp +++ b/source/enter_id.cpp @@ -40,9 +40,6 @@ EnterID::EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t // Escribe el texto en la textura fillTexture(); - - // Deja el texto a tamaño fijo - // text->setFixedWidth(true); } // Destructor @@ -81,6 +78,17 @@ void EnterID::checkEventHandler() break; } + // El ENTER solo se comprueba cuando se suelta, para no saltarse la siguiente sección + if ((eventHandler->type == SDL_KEYUP && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONUP)) + { + if (eventHandler->key.keysym.scancode == SDL_SCANCODE_RETURN) + { + options->online.jailerID = (std::string)name; + endSection(); + break; + } + } + // Comprueba las teclas que se han pulsado if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN)) { @@ -116,13 +124,7 @@ void EnterID::checkEventHandler() name[--pos] = 0; } } - else if (eventHandler->key.keysym.scancode == SDL_SCANCODE_RETURN) - { - options->online.jailerID = (std::string)name; - initOnline(); - section.name = SECTION_PROG_INTRO; - break; - } + else if (eventHandler->key.keysym.scancode == SDL_SCANCODE_ESCAPE) { section.name = SECTION_PROG_QUIT; @@ -286,4 +288,12 @@ void EnterID::initOnline() std::cout << caption << std::endl; } } +} + +// Termina la sección +void EnterID::endSection() +{ + initOnline(); + section.name = (section.subsection == SUBSECTION_LOGO_TO_INTRO) ? SECTION_PROG_INTRO : SECTION_PROG_TITLE; + section.subsection = 0; } \ No newline at end of file diff --git a/source/enter_id.h b/source/enter_id.h index 4f85bc9..38fdcbf 100644 --- a/source/enter_id.h +++ b/source/enter_id.h @@ -63,6 +63,9 @@ private: // Inicializa los servicios online void initOnline(); + // Termina la sección + void endSection(); + public: // Constructor EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options); diff --git a/source/logo.cpp b/source/logo.cpp index cb3d92a..3693ee8 100644 --- a/source/logo.cpp +++ b/source/logo.cpp @@ -125,8 +125,7 @@ void Logo::checkEventHandler() break; default: - section.name = SECTION_PROG_TITLE; - section.subsection = 0; + endSection(); break; } } @@ -269,22 +268,7 @@ void Logo::update() // Comprueba si ha terminado el logo if (counter == endLogo + postLogo) { - if (options->online.jailerID == "") - { - section.name = SECTION_PROG_ENTER_ID; - section.subsection = 0; - } - - else if (section.subsection == SUBSECTION_LOGO_TO_INTRO) - { - section.name = SECTION_PROG_INTRO; - section.subsection = 0; - } - else - { - section.name = SECTION_PROG_TITLE; - section.subsection = 0; - } + endSection(); } } } @@ -327,12 +311,18 @@ section_t Logo::run() // Cambia la paleta void Logo::switchPalette() { - if (options->palette == p_zxspectrum) + options->palette = options->palette == p_zxspectrum ? p_zxarne : p_zxspectrum; +} + +// Termina la sección +void Logo::endSection() +{ + if (options->online.enabled && options->online.jailerID == "") { - options->palette = p_zxarne; + section.name = SECTION_PROG_ENTER_ID; } else { - options->palette = p_zxspectrum; + section.name = (section.subsection == SUBSECTION_LOGO_TO_INTRO) ? SECTION_PROG_INTRO : SECTION_PROG_TITLE; } } \ No newline at end of file diff --git a/source/logo.h b/source/logo.h index 7bdc77e..882ea70 100644 --- a/source/logo.h +++ b/source/logo.h @@ -56,6 +56,9 @@ private: // Cambia la paleta void switchPalette(); + // Termina la sección + void endSection(); + public: // Constructor Logo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, int subsection);