From 9233bd8d75aca70d34fdca405b2c480738be98ec Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 6 May 2026 11:27:45 +0200 Subject: [PATCH] feat(title): fons title_bg.gif i outline 4-dir off-white als textos taronges --- data/title/title_bg.gif | Bin 0 -> 14242 bytes source/core/system/director.cpp | 10 +++++++-- source/game/scenes/title_scene.cpp | 33 ++++++++++++++++++++++------- source/game/scenes/title_scene.hpp | 3 ++- 4 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 data/title/title_bg.gif diff --git a/data/title/title_bg.gif b/data/title/title_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..42c0d74c61369a0290c1acc545bb3a4c2197b3ed GIT binary patch literal 14242 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 AN&o-= literal 0 HcmV?d00001 diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index c6dd874..c13afad 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -211,6 +211,12 @@ Director::Director() { constexpr const char* MINI_LOGO_KEY = "logo_jailgames_mini.gif"; Resource::Cache::get().loadSurface(MINI_LOGO_KEY, "data/logo/logo_jailgames_mini.gif"); auto mini_logo_surface = Resource::Cache::get().getSurface(MINI_LOGO_KEY); + + // Fons sencer de la TITLE (320×240). Igual que el minilogo, conserva + // la seua paleta nadiua perquè el GIF ja porta els colors finals. + constexpr const char* TITLE_BG_KEY = "title_bg.gif"; + Resource::Cache::get().loadSurface(TITLE_BG_KEY, "data/title/title_bg.gif"); + auto title_bg_surface = Resource::Cache::get().getSurface(TITLE_BG_KEY); ServiceMenu::get().init(menu_title_text, menu_items_text, ui_palette); // Overlay hook: Screen::present() cridarà aquesta lambda al principi, @@ -259,8 +265,8 @@ Director::Director() { auto make_intro = [placeholder_text, make_game]() -> std::unique_ptr { return std::make_unique(placeholder_text, make_game); }; - auto make_title = [menu_title_text, placeholder_text, mini_logo_surface, make_intro]() -> std::unique_ptr { - return std::make_unique(menu_title_text, placeholder_text, mini_logo_surface, make_intro); + auto make_title = [menu_title_text, placeholder_text, title_bg_surface, mini_logo_surface, make_intro]() -> std::unique_ptr { + return std::make_unique(menu_title_text, placeholder_text, title_bg_surface, mini_logo_surface, make_intro); }; switch (START) { diff --git a/source/game/scenes/title_scene.cpp b/source/game/scenes/title_scene.cpp index 2b6390d..012545b 100644 --- a/source/game/scenes/title_scene.cpp +++ b/source/game/scenes/title_scene.cpp @@ -48,9 +48,10 @@ namespace { } // namespace -TitleScene::TitleScene(std::shared_ptr display_font, std::shared_ptr condensed_font, std::shared_ptr mini_logo, SceneFactory next_factory) +TitleScene::TitleScene(std::shared_ptr display_font, std::shared_ptr condensed_font, std::shared_ptr background, std::shared_ptr mini_logo, SceneFactory next_factory) : display_font_(std::move(display_font)), condensed_font_(std::move(condensed_font)), + background_(std::move(background)), mini_logo_(std::move(mini_logo)), next_factory_(std::move(next_factory)), timer_ms_(UiConfig::get().titleDurationMs()) { @@ -85,24 +86,38 @@ void TitleScene::render() { const auto& ui_config = UiConfig::get(); const auto& palette = Resource::Cache::get().getPalette("ui"); - Screen::get().fillRect(0, 0, GameCanvas::WIDTH, GameCanvas::HEIGHT, palette[ui_config.titleBgColor()]); + // Fons: la imatge si està disponible (cobreix tot el canvas amb la + // seua paleta nadiua); en cas contrari, color pla de la paleta UI + // com a fallback defensiu. + if (background_) { + background_->render(0, 0); + } else { + Screen::get().fillRect(0, 0, GameCanvas::WIDTH, GameCanvas::HEIGHT, palette[ui_config.titleBgColor()]); + } const Uint8 TEXT_COLOR = ui_config.titleTextColor(); + const Uint8 OUTLINE_COLOR = ui_config.titleCopyrightColor(); + constexpr Uint8 OUTLINE_DIST = 1; + constexpr Uint8 STROKE4 = Text::CENTER_FLAG | Text::COLOR_FLAG | Text::STROKE4_FLAG; if (display_font_) { const int TITLE_Y = (GameCanvas::HEIGHT * TITLE_Y_PERCENT) / 100; - display_font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG, + display_font_->writeDX(STROKE4, GameCanvas::CENTER_X, TITLE_Y, TITLE_LINE_1, display_font_->getDefaultKerning(), - TEXT_COLOR); - display_font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG, + TEXT_COLOR, + OUTLINE_DIST, + OUTLINE_COLOR); + display_font_->writeDX(STROKE4, GameCanvas::CENTER_X, TITLE_Y + titleLineGap(*display_font_), TITLE_LINE_2, display_font_->getDefaultKerning(), - TEXT_COLOR); + TEXT_COLOR, + OUTLINE_DIST, + OUTLINE_COLOR); } if (condensed_font_) { @@ -115,12 +130,14 @@ void TitleScene::render() { if (VISIBLE) { const int PROMPT_Y = (GameCanvas::HEIGHT * PROMPT_Y_PERCENT) / 100; - condensed_font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG, + condensed_font_->writeDX(STROKE4, GameCanvas::CENTER_X, PROMPT_Y, Locale::get().text("title.press_start"), condensed_font_->getDefaultKerning() - 1, - TEXT_COLOR); + TEXT_COLOR, + OUTLINE_DIST, + OUTLINE_COLOR); } } diff --git a/source/game/scenes/title_scene.hpp b/source/game/scenes/title_scene.hpp index d4d6a7b..4040a84 100644 --- a/source/game/scenes/title_scene.hpp +++ b/source/game/scenes/title_scene.hpp @@ -16,7 +16,7 @@ class TitleScene : public Scene { public: using SceneFactory = std::function()>; - TitleScene(std::shared_ptr display_font, std::shared_ptr condensed_font, std::shared_ptr mini_logo, SceneFactory next_factory); + TitleScene(std::shared_ptr display_font, std::shared_ptr condensed_font, std::shared_ptr background, std::shared_ptr mini_logo, SceneFactory next_factory); ~TitleScene() override; void update(int delta_ms) override; @@ -25,6 +25,7 @@ class TitleScene : public Scene { private: std::shared_ptr display_font_; std::shared_ptr condensed_font_; + std::shared_ptr background_; std::shared_ptr mini_logo_; SceneFactory next_factory_; int timer_ms_;