From 7bd38a3d744f52bd40263404034ed9132d3ec5df Mon Sep 17 00:00:00 2001 From: Hypernoot Date: Thu, 3 Jul 2025 11:58:05 +0200 Subject: [PATCH 1/2] TextScroller: Use exit script properly fixes #3219 --- src/object/textscroller.cpp | 20 ++++++++++++-------- src/object/textscroller.hpp | 1 + src/supertux/game_session.cpp | 9 +++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/object/textscroller.cpp b/src/object/textscroller.cpp index c3a8f817e81..feaa51e5d04 100644 --- a/src/object/textscroller.cpp +++ b/src/object/textscroller.cpp @@ -299,9 +299,13 @@ TextScroller::update(float dt_sec) // use start or escape keys to exit if (controller->pressed_any(Control::START, Control::ESCAPE) && - !m_fading && m_finish_script.empty()) { + !m_fading) { m_fading = true; - ScreenManager::current()->pop_screen(std::make_unique(FadeToBlack::FADEOUT, 0.5f)); + if (!m_finish_script.empty()) { + Sector::get().run_script(m_finish_script, "finishscript"); + } else { + ScreenManager::current()->pop_screen(std::make_unique(FadeToBlack::FADEOUT, 0.5f)); + } return; } } @@ -310,17 +314,17 @@ TextScroller::update(float dt_sec) if (m_scroll < 0) m_scroll = 0; - if (!m_finish_script.empty()) - { - Sector::get().run_script(m_finish_script, "finishscript"); - } else { // close when done if (m_finished && !m_fading) { - m_fading = true; - ScreenManager::current()->pop_screen(std::unique_ptr(new FadeToBlack(FadeToBlack::FADEOUT, 0.25f))); + m_fading = true; + if (!m_finish_script.empty()) { + Sector::get().run_script(m_finish_script, "finishscript"); + } else { + ScreenManager::current()->pop_screen(std::unique_ptr(new FadeToBlack(FadeToBlack::FADEOUT, 0.25f))); + } } } } diff --git a/src/object/textscroller.hpp b/src/object/textscroller.hpp index 930817866b7..ba5529b6cec 100644 --- a/src/object/textscroller.hpp +++ b/src/object/textscroller.hpp @@ -52,6 +52,7 @@ class TextScroller : public LayerObject inline void set_default_speed(float default_speed) { m_default_speed = default_speed; } inline bool is_finished() const { return m_finished; } + inline bool is_fading() const { return m_fading; } protected: const Controller* controller; diff --git a/src/supertux/game_session.cpp b/src/supertux/game_session.cpp index a2341dd6eba..f2c4fad8ad4 100644 --- a/src/supertux/game_session.cpp +++ b/src/supertux/game_session.cpp @@ -32,6 +32,7 @@ #include "object/music_object.hpp" #include "object/player.hpp" #include "object/spawnpoint.hpp" +#include "object/textscroller.hpp" #include "sdk/integration.hpp" #include "squirrel/squirrel_virtual_machine.hpp" #include "supertux/constants.hpp" @@ -312,6 +313,14 @@ GameSession::on_escape_press(bool force_quick_respawn) return; // Don't let the player open the menu, when Tux is dying. } + int textscrollers = m_currentsector->get_object_count([](const TextScroller& ts) { + return !ts.is_fading(); + }); + + if (textscrollers) { + return; + } + if (m_level->m_is_in_cutscene && !m_level->m_skip_cutscene) { m_level->m_skip_cutscene = true; From 18c3ed552e5459d4dbf30d63f4fb7c8305bc7af9 Mon Sep 17 00:00:00 2001 From: Hypernoot Date: Sat, 12 Jul 2025 15:26:31 +0200 Subject: [PATCH 2/2] TextScroller: create a function start_fading from existing code --- src/object/textscroller.cpp | 25 +++++++++++++------------ src/object/textscroller.hpp | 1 + 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/object/textscroller.cpp b/src/object/textscroller.cpp index feaa51e5d04..b330b7c1942 100644 --- a/src/object/textscroller.cpp +++ b/src/object/textscroller.cpp @@ -300,12 +300,7 @@ TextScroller::update(float dt_sec) // use start or escape keys to exit if (controller->pressed_any(Control::START, Control::ESCAPE) && !m_fading) { - m_fading = true; - if (!m_finish_script.empty()) { - Sector::get().run_script(m_finish_script, "finishscript"); - } else { - ScreenManager::current()->pop_screen(std::make_unique(FadeToBlack::FADEOUT, 0.5f)); - } + start_fading(); return; } } @@ -319,16 +314,22 @@ TextScroller::update(float dt_sec) // close when done if (m_finished && !m_fading) { - m_fading = true; - if (!m_finish_script.empty()) { - Sector::get().run_script(m_finish_script, "finishscript"); - } else { - ScreenManager::current()->pop_screen(std::unique_ptr(new FadeToBlack(FadeToBlack::FADEOUT, 0.25f))); - } + start_fading(); } } } +void +TextScroller::start_fading() +{ + m_fading = true; + if (!m_finish_script.empty()) { + Sector::get().run_script(m_finish_script, "finishscript"); + } else { + ScreenManager::current()->pop_screen(std::make_unique(FadeToBlack::FADEOUT, 0.5f)); + } +} + void TextScroller::scroll(float offset) { diff --git a/src/object/textscroller.hpp b/src/object/textscroller.hpp index ba5529b6cec..4a76bf528ec 100644 --- a/src/object/textscroller.hpp +++ b/src/object/textscroller.hpp @@ -61,6 +61,7 @@ class TextScroller : public LayerObject void parse_file(const std::string& filename); void parse_root(const ReaderObject& root); void parse_content(const ReaderCollection& collection); + void start_fading(); private: std::string m_filename;