From ef46dadb68e8a6ebc1743dea6bf0e10cd6bdfa05 Mon Sep 17 00:00:00 2001 From: Misa Date: Mon, 22 May 2023 12:18:40 -0700 Subject: [PATCH] Show skip prompt during credits and ending picture This adds a "- Press {button} to skip -" prompt to both the credits and ending picture sequences. It was always possible to skip them by pressing Enter, but not many people knew this. In fact, even I didn't know this until I saw Elomavi do it a year or so ago. So it's not really intuitive that this is possible. The prompt only shows up if you've completed the game before, and disappears after two seconds similar to the "[Press {button} to return to editor]" text. Unfortunately, given how the game works, game completion is detected based on if you have unlocked Flip Mode or not. At this point, the unlock for the game being completed (unlock 5) will already be set to true no matter what during the Plenary fanfare, but the Flip Mode unlock (unlock 18) won't be until the player hits "play" on the main menu. As a special case, the prompt will always show up in M&P (because Flip Mode is always unlocked in M&P). --- desktop_version/lang/ca/strings.xml | 1 + desktop_version/lang/de/strings.xml | 1 + desktop_version/lang/en/strings.xml | 1 + desktop_version/lang/eo/strings.xml | 1 + desktop_version/lang/es/strings.xml | 1 + desktop_version/lang/fr/strings.xml | 1 + desktop_version/lang/it/strings.xml | 1 + desktop_version/lang/nl/strings.xml | 1 + desktop_version/lang/pt_BR/strings.xml | 1 + desktop_version/lang/pt_PT/strings.xml | 1 + desktop_version/lang/ru/strings.xml | 1 + desktop_version/lang/tr/strings.xml | 1 + desktop_version/src/Game.cpp | 3 ++ desktop_version/src/Game.h | 3 ++ desktop_version/src/Logic.cpp | 2 ++ desktop_version/src/Render.cpp | 43 ++++++++++++++++++++++++++ desktop_version/src/RenderFixed.cpp | 22 +++++++++++++ desktop_version/src/RenderFixed.h | 2 ++ desktop_version/src/Script.cpp | 2 ++ desktop_version/src/main.cpp | 1 + 20 files changed, 90 insertions(+) diff --git a/desktop_version/lang/ca/strings.xml b/desktop_version/lang/ca/strings.xml index 441dfbd9..faf1aeea 100644 --- a/desktop_version/lang/ca/strings.xml +++ b/desktop_version/lang/ca/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/de/strings.xml b/desktop_version/lang/de/strings.xml index 06ae62aa..01f806d6 100644 --- a/desktop_version/lang/de/strings.xml +++ b/desktop_version/lang/de/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/en/strings.xml b/desktop_version/lang/en/strings.xml index 1be77f6c..c6218dfc 100644 --- a/desktop_version/lang/en/strings.xml +++ b/desktop_version/lang/en/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/eo/strings.xml b/desktop_version/lang/eo/strings.xml index 352e30f9..50f4261e 100644 --- a/desktop_version/lang/eo/strings.xml +++ b/desktop_version/lang/eo/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/es/strings.xml b/desktop_version/lang/es/strings.xml index 00f6168a..214f461b 100644 --- a/desktop_version/lang/es/strings.xml +++ b/desktop_version/lang/es/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/fr/strings.xml b/desktop_version/lang/fr/strings.xml index 96f4d6f0..b707ca16 100644 --- a/desktop_version/lang/fr/strings.xml +++ b/desktop_version/lang/fr/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/it/strings.xml b/desktop_version/lang/it/strings.xml index eb768a10..7338bc97 100644 --- a/desktop_version/lang/it/strings.xml +++ b/desktop_version/lang/it/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/nl/strings.xml b/desktop_version/lang/nl/strings.xml index 18bfbcc2..c4f593a2 100644 --- a/desktop_version/lang/nl/strings.xml +++ b/desktop_version/lang/nl/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/pt_BR/strings.xml b/desktop_version/lang/pt_BR/strings.xml index 393ce8fe..b8833a1a 100644 --- a/desktop_version/lang/pt_BR/strings.xml +++ b/desktop_version/lang/pt_BR/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/pt_PT/strings.xml b/desktop_version/lang/pt_PT/strings.xml index eb570743..984b5ebb 100644 --- a/desktop_version/lang/pt_PT/strings.xml +++ b/desktop_version/lang/pt_PT/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/ru/strings.xml b/desktop_version/lang/ru/strings.xml index cdb79350..0f8767f2 100644 --- a/desktop_version/lang/ru/strings.xml +++ b/desktop_version/lang/ru/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/lang/tr/strings.xml b/desktop_version/lang/tr/strings.xml index c0ba1de6..40b93eda 100644 --- a/desktop_version/lang/tr/strings.xml +++ b/desktop_version/lang/tr/strings.xml @@ -498,6 +498,7 @@ + diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index afb1fb41..81c2584e 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -384,6 +384,9 @@ void Game::init(void) disabletemporaryaudiopause = true; inputdelay = false; + old_skip_message_timer = 0; + skip_message_timer = 0; + setdefaultcontrollerbuttons(); } diff --git a/desktop_version/src/Game.h b/desktop_version/src/Game.h index 12c3b895..774dd76d 100644 --- a/desktop_version/src/Game.h +++ b/desktop_version/src/Game.h @@ -531,6 +531,9 @@ public: bool inputdelay; bool statelocked; + + int old_skip_message_timer; + int skip_message_timer; }; #ifndef GAME_DEFINITION diff --git a/desktop_version/src/Logic.cpp b/desktop_version/src/Logic.cpp index 4286c0d2..6ccb1991 100644 --- a/desktop_version/src/Logic.cpp +++ b/desktop_version/src/Logic.cpp @@ -78,6 +78,8 @@ void gamecompletelogic(void) //Return to game game.gamestate = GAMECOMPLETE2; graphics.fademode = FADE_START_FADEIN; + game.skip_message_timer = 1000; + game.old_skip_message_timer = 1000; } } diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp index 8f6e416d..f2308e6d 100644 --- a/desktop_version/src/Render.cpp +++ b/desktop_version/src/Render.cpp @@ -157,6 +157,45 @@ static void inline drawglitchrunnertext(const int y) font::print_wrap(PR_CEN, -1, y, buffer, tempr, tempg, tempb); } +static inline void draw_skip_message() +{ + /* Unlock 18 is Flip Mode. + * If this is the first playthrough, 5 (game completed) will be unlocked + * but not Flip Mode until the player hits "play" on the title screen */ + bool draw = +#ifndef MAKEANDPLAY + game.unlock[18] && +#endif + graphics.fademode == FADE_NONE; + if (!draw) + { + return; + } + + const int alpha = graphics.lerp( + game.old_skip_message_timer, game.skip_message_timer + ); + + draw = alpha > 100; + if (!draw) + { + return; + } + + char buffer[SCREEN_WIDTH_CHARS + 1]; + vformat_buf( + buffer, sizeof(buffer), + loc::gettext("- Press {button} to skip -"), + "button:but", + vformat_button(ActionSet_InGame, Action_InGame_Map) + ); + font::print( + PR_BRIGHTNESS(alpha) | PR_BOR | PR_CEN, + -1, graphics.flipmode ? 20 : 210, buffer, + 220 - help.glow, 220 - help.glow, 255 - help.glow / 2 + ); +} + static void menurender(void) { @@ -1875,6 +1914,8 @@ void gamecompleterender(void) font::print(PR_2X | PR_CEN | PR_CJK_LOW, -1, creditOffset + position, loc::gettext("playing!"), tr, tg, tb); } + draw_skip_message(); + graphics.drawfade(); graphics.render(); @@ -1907,6 +1948,8 @@ void gamecompleterender2(void) graphics.fill_rect(graphics.lerp(game.oldcreditposx * 8, game.creditposx * 8) + 8, game.creditposy * 8, 8, 8, 0, 0, 0); + draw_skip_message(); + graphics.drawfade(); graphics.render(); diff --git a/desktop_version/src/RenderFixed.cpp b/desktop_version/src/RenderFixed.cpp index 9fb7c090..03b995fa 100644 --- a/desktop_version/src/RenderFixed.cpp +++ b/desktop_version/src/RenderFixed.cpp @@ -21,6 +21,21 @@ static inline void titleupdatetextcol(void) if(graphics.col_tb>255) graphics.col_tb=255; } +static inline void tick_skip_message_timer(void) +{ + const bool tick = graphics.fademode == FADE_NONE; + if (!tick) + { + return; + } + + game.old_skip_message_timer = game.skip_message_timer; + if (game.skip_message_timer > 0) + { + game.skip_message_timer -= 15; + } +} + void gamerenderfixed(void) { if (!game.blackout && !game.completestop) @@ -257,4 +272,11 @@ void gamecompleterenderfixed(void) graphics.updatetitlecolours(); titleupdatetextcol(); + + tick_skip_message_timer(); +} + +void gamecompleterenderfixed2(void) +{ + tick_skip_message_timer(); } diff --git a/desktop_version/src/RenderFixed.h b/desktop_version/src/RenderFixed.h index 4953d91b..2e8c3f5e 100644 --- a/desktop_version/src/RenderFixed.h +++ b/desktop_version/src/RenderFixed.h @@ -11,4 +11,6 @@ void teleporterrenderfixed(void); void gamecompleterenderfixed(void); +void gamecompleterenderfixed2(void); + #endif /* RENDERFIXED_H */ diff --git a/desktop_version/src/Script.cpp b/desktop_version/src/Script.cpp index 5192bf14..d179ff36 100644 --- a/desktop_version/src/Script.cpp +++ b/desktop_version/src/Script.cpp @@ -1424,6 +1424,8 @@ void scriptclass::run(void) game.gamestate = GAMECOMPLETE; graphics.fademode = FADE_START_FADEIN; game.creditposition = 0; + game.skip_message_timer = 1000; + game.old_skip_message_timer = 1000; } } else if (words[0] == "finalmode") diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp index 017beb37..37180c22 100644 --- a/desktop_version/src/main.cpp +++ b/desktop_version/src/main.cpp @@ -175,6 +175,7 @@ static const inline struct ImplFunc* get_gamestate_funcs( FUNC_LIST_END FUNC_LIST_BEGIN(GAMECOMPLETE2) + {Func_fixed, gamecompleterenderfixed2}, {Func_delta, gamecompleterender2}, {Func_input, gamecompleteinput2}, {Func_fixed, gamecompletelogic2},