From 8a44ab15e72dbb9388209dd58a55c499cdb6be9c Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 17 Apr 2026 10:11:31 +0200 Subject: [PATCH] eliminades locales no utilitzades modificats textos de ui a case tipo frase notificacions llargues pasen a multilinea --- data/locale/ca.yaml | 116 ++++++++++-------------------------- data/locale/en.yaml | 116 ++++++++++-------------------------- source/game/scenes/game.cpp | 16 ++--- source/game/ui/notifier.cpp | 54 ++++++++++++++--- 4 files changed, 118 insertions(+), 184 deletions(-) diff --git a/data/locale/ca.yaml b/data/locale/ca.yaml index 6c06838..f40d22f 100644 --- a/data/locale/ca.yaml +++ b/data/locale/ca.yaml @@ -2,7 +2,6 @@ # lang: ca title: - marquee: "EI JAILERS!! ESTEM EN 2022 I ENCARA HO PETEM COM EN 1998!! QUÉ, HO HEU SENTIT O NO? ELS JAILGAMES HAN TORNAT!! SÍ, COLLONS, HAN TORNAT!! MÉS DE 10 TÍTOLS QUE EL JAILDOC TÉ EN LA CUINA A FOC LENT!! MOLT LENT!! AIXÒ ÉS UNA BARBARITAT, PERÒ... QUIN EIXIRÀ PRIMER? I ATENCIÓ, QUE HI HA UN APARELLET NOU QUE VOS FARÀ VOLAR EL CAP: EL P.A.C.O.! PERÒ UN MOMENT... QUÈ ÉS AQUELLA COSETA QUE VE PER ALLÀ? OOOH, AQUELLA MINIASCII ÉS AMOR DEL BO!! LI PEGARIA UNA LLEPAETA A CADA BYTE! OSTRES! I NO VOS OBLIDEU DE PUJAR AQUELLS JAILGAMES VELLS I PANXUTS DE MS-DOS A GITHUB, QUE SI NO ES PERDRAN!! QUIN SERÀ EL PRÒXIM PROJECTE DE JAILDOC? SERÀ UN PROJECTE DE MERDA? AI MARE... NI IDEA, PERÒ ACÍ PODEU SABER-HO SI RESOLEU EL DILEMA DEL JAILDOCTOR... VOS ATREVIU O QUÈ? VAAAAA!!!" menu: play: "1. JUGAR" keyboard: "2. REDEFINIR TECLES" @@ -24,78 +23,42 @@ title: defined: "BOTONS DEFINITS" already_used: "BOTÓ JA USAT! PROVA'N UN ALTRE" -game_over: - title: "G A M E O V E R" - items: "OBJECTES: " - rooms: "SALES: " - -ending: - t0: "FINALMENT HO VA ACONSEGUIR" - t1: "ARRIBAR A LA JAIL" - t2: "AMB TOTS ELS SEUS PROJECTES" - t3: "A PUNT D'ALLIBERAR-LOS" - t4: "ALLÍ ESTAVEN TOTS ELS JAILERS" - t5: "ESPERANT QUE ELS JAILGAMES" - t6: "FOREN ALLIBERATS" - t7: "HI HAVIA FINS I TOT BARRULLS" - t8: "I BEGGINERS ENTRE LA GENT" - t9: "BRY ESTAVA PLORANT..." - t10: "PERÒ DE SOBTE ALGUNA COSA" - t11: "LI VA CRIDAR L'ATENCIÓ" - t12: "UN MUNT DE FERRALLA!" - t13: "PLE DE TRASTOS QUE NI ANAVEN!!" - t14: "I ALESHORES," - t15: "QUARANTA PROJECTES NOUS" - t16: "VAN NÀIXER..." - -ending2: - starring: "PROTAGONISTES" - jaildoctor: "JAILDOCTOR" - thank_you: "GRÀCIES" - for_playing: "PER JUGAR!" - -credits: - instructions: "INSTRUCCIONS:" - l0: "AJUDA A JAILDOC A RECUPERAR" - l1: "ELS SEUS PROJECTES I ARRIBAR" - l2: "A LA JAIL PER ACABAR-LOS" - keys: "TECLES:" - keys_move: "CURSORS PER A MOURE I SALTAR" - f8: "F8 ACTIVAR/DESACTIVAR MÚSICA" - f11: "F11 PAUSAR EL JOC" - f1f2: "F1-F2 MIDA DE LA FINESTRA" - f3: "F3 PANTALLA COMPLETA" - f9: "F9 VORA DE LA PANTALLA" - author: "UN JOC DE JAILDESIGNER" - date: "FET A L'ESTIU/TARDOR DEL 2022" - love: "I LOVE JAILGAMES! " - achievements: header: "ASSOLIMENT DESBLOQUEJAT!" ui: - press_again_menu: "PREM DE NOU PER TORNAR AL MENÚ" - press_again_exit: "PREM DE NOU PER EIXIR" - border_enabled: "VORA ACTIVADA" - border_disabled: "VORA DESACTIVADA" - fullscreen_enabled: "PANTALLA COMPLETA ACTIVADA" - fullscreen_disabled: "PANTALLA COMPLETA DESACTIVADA" - window_zoom: "ZOOM FINESTRA x" - shaders_enabled: "SHADERS ACTIVATS" - shaders_disabled: "SHADERS DESACTIVATS" - shader: "SHADER" - postfx: "POSTFX" - crtpi: "CRTPI" - supersampling_enabled: "SUPERMOSTREIG ACTIVAT" - supersampling_disabled: "SUPERMOSTREIG DESACTIVAT" - palette: "PALETA" - palette_sort: "ORDENACIÓ PALETA" - integer_scale_enabled: "ESCALAT SENCER ACTIVAT" - integer_scale_disabled: "ESCALAT SENCER DESACTIVAT" - vsync_enabled: "V-SYNC ACTIVAT" - vsync_disabled: "V-SYNC DESACTIVAT" - gamepad_connected: "CONNECTAT" - gamepad_disconnected: "DESCONNECTAT" + press_again_menu: "Prem de nou per tornar al menú" + press_again_exit: "Prem de nou per eixir" + border_enabled: "Vora activada" + border_disabled: "Vora desactivada" + fullscreen_enabled: "Pantalla completa activada" + fullscreen_disabled: "Pantalla completa desactivada" + window_zoom: "Zoom finestra x" + shaders_enabled: "Shaders activats" + shaders_disabled: "Shaders desactivats" + shader: "Shader" + postfx: "PostFX" + crtpi: "CRTPi" + palette: "Paleta" + palette_sort: "Ordenació paleta" + integer_scale_enabled: "Escalat sencer activat" + integer_scale_disabled: "Escalat sencer desactivat" + vsync_enabled: "V-Sync activat" + vsync_disabled: "V-Sync desactivat" + gamepad_connected: "connectat" + gamepad_disconnected: "desconnectat" + music_enabled: "Música activada" + music_disabled: "Música desactivada" + paused: "Joc en pausa" + running: "Joc en marxa" + enabled: " activat" + disabled: " desactivat" + cheat_infinite_lives: "Vides infinites" + cheat_invincible: "Invencible" + debug_enabled: "Debug activat" + debug_disabled: "Debug desactivat" + editor_enabled: "Editor activat" + editor_disabled: "Editor desactivat" scoreboard: lives: "vides " @@ -104,18 +67,3 @@ scoreboard: music_on: "musica" cheat_infinite_lives: "vides infinites" cheat_invincibility: "invencibilitat" - -game: - music_enabled: "MÚSICA ACTIVADA" - music_disabled: "MÚSICA DESACTIVADA" - paused: "JOC EN PAUSA" - running: "JOC EN MARXA" - enabled: " ACTIVAT" - disabled: " DESACTIVAT" - cheat_infinite_lives: "VIDES INFINITES" - cheat_invincible: "INVENCIBLE" - cheat_jail_open: "JAIL OBERTA" - debug_enabled: "DEBUG ACTIVAT" - debug_disabled: "DEBUG DESACTIVAT" - editor_enabled: "EDITOR ACTIVAT" - editor_disabled: "EDITOR DESACTIVAT" diff --git a/data/locale/en.yaml b/data/locale/en.yaml index 1988791..1f3f369 100644 --- a/data/locale/en.yaml +++ b/data/locale/en.yaml @@ -2,7 +2,6 @@ # lang: en title: - marquee: "HEY JAILERS!! IT'S 2022 AND WE'RE STILL ROCKING LIKE IT'S 1998!!! HAVE YOU HEARD IT? JAILGAMES ARE BACK!! YEEESSS BACK!! MORE THAN 10 TITLES ON JAILDOC'S KITCHEN!! THATS A LOOOOOOT OF JAILGAMES, BUT WHICH ONE WILL STRIKE FIRST? THERE IS ALSO A NEW DEVICE TO COME THAT WILL BLOW YOUR MIND WITH JAILGAMES ON THE GO: P.A.C.O. BUT WAIT! WHAT'S THAT BEAUTY I'M SEEING RIGHT OVER THERE?? OOOH THAT TINY MINIASCII IS PURE LOVE!! I WANT TO LICK EVERY BYTE OF IT!! OH SHIT! AND DON'T FORGET TO BRING BACK THOSE OLD AND FAT MS-DOS JAILGAMES TO GITHUB TO KEEP THEM ALIVE!! WHAT WILL BE THE NEXT JAILDOC RELEASE? WHAT WILL BE THE NEXT PROJECT TO COME ALIVE?? OH BABY WE DON'T KNOW BUT HERE YOU CAN FIND THE ANSWER, YOU JUST HAVE TO COMPLETE JAILDOCTOR'S DILEMMA ... COULD YOU?" menu: play: "1. PLAY" keyboard: "2. REDEFINE KEYBOARD" @@ -24,78 +23,42 @@ title: defined: "BUTTONS DEFINED" already_used: "BUTTON ALREADY USED! TRY ANOTHER" -game_over: - title: "G A M E O V E R" - items: "ITEMS: " - rooms: "ROOMS: " - -ending: - t0: "HE FINALLY MANAGED" - t1: "TO GET TO THE JAIL" - t2: "WITH ALL HIS PROJECTS" - t3: "READY TO BE FREED" - t4: "ALL THE JAILERS WERE THERE" - t5: "WAITING FOR THE JAILGAMES" - t6: "TO BE RELEASED" - t7: "THERE WERE EVEN BARRULLS AND" - t8: "BEGINNERS AMONG THE CROWD" - t9: "BRY WAS CRYING..." - t10: "BUT SUDDENLY SOMETHING" - t11: "CAUGHT HIS ATTENTION" - t12: "A PILE OF JUNK!" - t13: "FULL OF NON WORKING TRASH!!" - t14: "AND THEN," - t15: "FOURTY NEW PROJECTS" - t16: "WERE BORN..." - -ending2: - starring: "STARRING" - jaildoctor: "JAILDOCTOR" - thank_you: "THANK YOU" - for_playing: "FOR PLAYING!" - -credits: - instructions: "INSTRUCTIONS:" - l0: "HELP JAILDOC TO GET BACK ALL" - l1: "HIS PROJECTS AND GO TO THE" - l2: "JAIL TO FINISH THEM" - keys: "KEYS:" - keys_move: "CURSORS TO MOVE AND JUMP" - f8: "F8 TOGGLE THE MUSIC" - f11: "F11 PAUSE THE GAME" - f1f2: "F1-F2 WINDOWS SIZE" - f3: "F3 TOGGLE FULLSCREEN" - f9: "F9 TOOGLE BORDER SCREEN" - author: "A GAME BY JAILDESIGNER" - date: "MADE ON SUMMER/FALL 2022" - love: "I LOVE JAILGAMES! " - achievements: header: "ACHIEVEMENT UNLOCKED!" ui: - press_again_menu: "PRESS AGAIN TO RETURN TO MENU" - press_again_exit: "PRESS AGAIN TO EXIT" - border_enabled: "BORDER ENABLED" - border_disabled: "BORDER DISABLED" - fullscreen_enabled: "FULLSCREEN ENABLED" - fullscreen_disabled: "FULLSCREEN DISABLED" - window_zoom: "WINDOW ZOOM x" - shaders_enabled: "SHADERS ON" - shaders_disabled: "SHADERS OFF" - shader: "SHADER" - postfx: "POSTFX" - crtpi: "CRTPI" - supersampling_enabled: "SUPERSAMPLING ON" - supersampling_disabled: "SUPERSAMPLING OFF" - palette: "PALETTE" - palette_sort: "PALETTE SORT" - integer_scale_enabled: "INTEGER SCALE ENABLED" - integer_scale_disabled: "INTEGER SCALE DISABLED" - vsync_enabled: "V-SYNC ENABLED" - vsync_disabled: "V-SYNC DISABLED" - gamepad_connected: "CONNECTED" - gamepad_disconnected: "DISCONNECTED" + press_again_menu: "Press again to return to menu" + press_again_exit: "Press again to exit" + border_enabled: "Border enabled" + border_disabled: "Border disabled" + fullscreen_enabled: "Fullscreen enabled" + fullscreen_disabled: "Fullscreen disabled" + window_zoom: "Window zoom x" + shaders_enabled: "Shaders on" + shaders_disabled: "Shaders off" + shader: "Shader" + postfx: "PostFX" + crtpi: "CRTPi" + palette: "Palette" + palette_sort: "Palette sort" + integer_scale_enabled: "Integer scale enabled" + integer_scale_disabled: "Integer scale disabled" + vsync_enabled: "V-Sync enabled" + vsync_disabled: "V-Sync disabled" + gamepad_connected: "connected" + gamepad_disconnected: "disconnected" + music_enabled: "Music enabled" + music_disabled: "Music disabled" + paused: "Game paused" + running: "Game running" + enabled: " enabled" + disabled: " disabled" + cheat_infinite_lives: "Infinite lives" + cheat_invincible: "Invincible" + debug_enabled: "Debug enabled" + debug_disabled: "Debug disabled" + editor_enabled: "Editor enabled" + editor_disabled: "Editor disabled" scoreboard: lives: "lives " @@ -104,18 +67,3 @@ scoreboard: music_on: "music" cheat_infinite_lives: "infinite lives" cheat_invincibility: "invincibility" - -game: - music_enabled: "MUSIC ENABLED" - music_disabled: "MUSIC DISABLED" - paused: "GAME PAUSED" - running: "GAME RUNNING" - enabled: " ENABLED" - disabled: " DISABLED" - cheat_infinite_lives: "INFINITE LIVES" - cheat_invincible: "INVINCIBLE" - cheat_jail_open: "JAIL IS OPEN" - debug_enabled: "DEBUG ENABLED" - debug_disabled: "DEBUG DISABLED" - editor_enabled: "EDITOR ENABLED" - editor_disabled: "EDITOR DISABLED" diff --git a/source/game/scenes/game.cpp b/source/game/scenes/game.cpp index 7167bd1..c491fe7 100644 --- a/source/game/scenes/game.cpp +++ b/source/game/scenes/game.cpp @@ -211,10 +211,10 @@ void Game::handleEvents() { if (event.type == SDL_EVENT_KEY_DOWN && event.key.key == KeyConfig::get()->key("EDITOR", "toggle") && static_cast(event.key.repeat) == 0) { if (MapEditor::get()->isActive()) { GameControl::exit_editor(); - Notifier::get()->show({Locale::get()->get("game.editor_disabled")}); + Notifier::get()->show({Locale::get()->get("ui.editor_disabled")}); } else { GameControl::enter_editor(); - Notifier::get()->show({Locale::get()->get("game.editor_enabled")}); + Notifier::get()->show({Locale::get()->get("ui.editor_enabled")}); } } else if (event.type == SDL_EVENT_KEY_DOWN && event.key.key == KeyConfig::get()->key("EDITOR", "grid") && static_cast(event.key.repeat) == 0 && MapEditor::get()->isActive()) { MapEditor::get()->showGrid(!MapEditor::get()->isGridEnabled()); @@ -236,7 +236,7 @@ void Game::handleInput() { if (Input::get()->checkAction(InputAction::TOGGLE_IN_GAME_MUSIC, Input::DO_NOT_ALLOW_REPEAT)) { scoreboard_data_->music = !scoreboard_data_->music; scoreboard_data_->music ? Audio::get()->resumeMusic() : Audio::get()->pauseMusic(); - Notifier::get()->show({scoreboard_data_->music ? Locale::get()->get("game.music_enabled") : Locale::get()->get("game.music_disabled")}); + Notifier::get()->show({scoreboard_data_->music ? Locale::get()->get("ui.music_enabled") : Locale::get()->get("ui.music_disabled")}); } // Si la consola está activa, no procesar inputs del juego @@ -262,7 +262,7 @@ void Game::handleInput() { // Input de pausa solo en estado PLAYING if (Input::get()->checkAction(InputAction::PAUSE, Input::DO_NOT_ALLOW_REPEAT)) { togglePause(); - Notifier::get()->show({paused_ ? Locale::get()->get("game.paused") : Locale::get()->get("game.running")}); + Notifier::get()->show({paused_ ? Locale::get()->get("ui.paused") : Locale::get()->get("ui.running")}); } GlobalInputs::handle(); @@ -612,7 +612,7 @@ void Game::renderPostFadeEnding() { static void toggleCheat(Options::Cheat::State& cheat, const std::string& label) { cheat = (cheat == Options::Cheat::State::ENABLED) ? Options::Cheat::State::DISABLED : Options::Cheat::State::ENABLED; const bool ENABLED = (cheat == Options::Cheat::State::ENABLED); - Notifier::get()->show({label + (ENABLED ? Locale::get()->get("game.enabled") : Locale::get()->get("game.disabled"))}, Notifier::Style::DEFAULT, -1, true); + Notifier::get()->show({label + (ENABLED ? Locale::get()->get("ui.enabled") : Locale::get()->get("ui.disabled"))}, Notifier::Style::DEFAULT, -1, true); } // Pone la información de debug en pantalla @@ -655,9 +655,9 @@ void Game::handleDebugEvents(const SDL_Event& event) { } else if (KEY == kc->key("DEBUG", "nav_right")) { changeRoom(room_->getRoom(Room::Border::RIGHT)); } else if (KEY == kc->key("DEBUG", "infinite_lives")) { - toggleCheat(Options::cheats.infinite_lives, Locale::get()->get("game.cheat_infinite_lives")); + toggleCheat(Options::cheats.infinite_lives, Locale::get()->get("ui.cheat_infinite_lives")); } else if (KEY == kc->key("DEBUG", "invincibility")) { - toggleCheat(Options::cheats.invincible, Locale::get()->get("game.cheat_invincible")); + toggleCheat(Options::cheats.invincible, Locale::get()->get("ui.cheat_invincible")); } else if (KEY == kc->key("DEBUG", "test_cheevo")) { Notifier::get()->show({Locale::get()->get("achievements.header"), Locale::get()->get("achievements.c11")}, Notifier::Style::CHEEVO, -1, false, "F7"); } else if (KEY == kc->key("DEBUG", "debug_mode")) { @@ -666,7 +666,7 @@ void Game::handleDebugEvents(const SDL_Event& event) { invincible_before_debug_ = (Options::cheats.invincible == Options::Cheat::State::ENABLED); } Debug::get()->toggleEnabled(); - Notifier::get()->show({Debug::get()->isEnabled() ? Locale::get()->get("game.debug_enabled") : Locale::get()->get("game.debug_disabled")}); + Notifier::get()->show({Debug::get()->isEnabled() ? Locale::get()->get("ui.debug_enabled") : Locale::get()->get("ui.debug_disabled")}); room_->redrawMap(); if (Debug::get()->isEnabled()) { Options::cheats.invincible = Options::Cheat::State::ENABLED; diff --git a/source/game/ui/notifier.cpp b/source/game/ui/notifier.cpp index 56ad1d0..5ae47d9 100644 --- a/source/game/ui/notifier.cpp +++ b/source/game/ui/notifier.cpp @@ -22,6 +22,41 @@ // [SINGLETON] Notifier* Notifier::notifier = nullptr; +// Parte un texto en varias líneas cuando no cabe en max_width píxeles. +// Divide por espacios; si una palabra sola excede el ancho, queda en su propia línea. +static auto wrapToWidth(const std::string& text, int max_width, Text* text_obj, int kerning = 1) -> std::vector { + if (max_width <= 0 || text_obj->length(text, kerning) <= max_width) { + return {text}; + } + + std::vector lines; + std::string current; + std::string word; + + auto flush_word = [&]() { + if (word.empty()) { return; } + const std::string CANDIDATE = current.empty() ? word : current + " " + word; + if (text_obj->length(CANDIDATE, kerning) <= max_width) { + current = CANDIDATE; + } else { + if (!current.empty()) { lines.push_back(current); } + current = word; + } + word.clear(); + }; + + for (const char c : text) { + if (c == ' ') { + flush_word(); + } else { + word += c; + } + } + flush_word(); + if (!current.empty()) { lines.push_back(current); } + return lines; +} + // Definición de estilos predefinidos const Notifier::Style Notifier::Style::DEFAULT = { .bg_color = Defaults::Notification::BG_COLOR, @@ -149,14 +184,6 @@ void Notifier::show(std::vector texts, const Style& style, int icon auto result = std::ranges::remove_if(texts, [](const std::string& s) -> bool { return s.empty(); }); texts.erase(result.begin(), result.end()); - // Encuentra la cadena más larga - std::string longest; - for (const auto& text : texts) { - if (text.length() > longest.length()) { - longest = text; - } - } - // Inicializa variables constexpr float TEXT_SIZE = LINE_HEIGHT; const auto PADDING_IN_H = TEXT_SIZE; @@ -164,6 +191,17 @@ void Notifier::show(std::vector texts, const Style& style, int icon const int ICON_SPACE = icon >= 0 ? ICON_SIZE + PADDING_IN_H : 0; const TextAlign TEXT_IS = ICON_SPACE > 0 ? TextAlign::LEFT : style.text_align; const float WIDTH = Options::game.width - (PADDING_OUT * 2); + const int MAX_TEXT_WIDTH = static_cast(WIDTH - (PADDING_IN_H * 2) - ICON_SPACE); + + // Si un texto no cabe en una línea, parte por espacios en varias líneas + std::vector wrapped; + wrapped.reserve(texts.size()); + for (const auto& t : texts) { + auto lines = wrapToWidth(t, MAX_TEXT_WIDTH, text_.get()); + wrapped.insert(wrapped.end(), std::make_move_iterator(lines.begin()), std::make_move_iterator(lines.end())); + } + texts = std::move(wrapped); + const float HEIGHT = (TEXT_SIZE * texts.size()) + (PADDING_IN_V * 2); const auto SHAPE = style.shape;