Skip to content

Commit 45862e0

Browse files
authored
Merge pull request #4461 from daftmugi/fix/accidental-skip-cutscene
Prevent accidental skip cutscene at loading screen
2 parents f96a27f + c9dd97d commit 45862e0

File tree

4 files changed

+29
-11
lines changed

4 files changed

+29
-11
lines changed

code/cutscene/movie.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ void processEvents()
5151
{
5252
io::mouse::CursorManager::get()->showCursor(false);
5353

54+
os_remove_deferred_cutscene_key_events();
5455
os_poll();
5556
}
5657

code/osapi/osapi.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ static char szWinTitle[128];
300300
static char szWinClass[128];
301301
static int Os_inited = 0;
302302

303-
static SCP_vector<SDL_Event> buffered_events;
303+
static SCP_vector<SDL_Event> deferred_events;
304304

305305
int Os_debugger_running = 0;
306306

@@ -713,11 +713,11 @@ namespace os
713713
}
714714
}
715715

716-
void os_ignore_events() {
716+
void os_defer_events_on_load_screen() {
717717
SDL_Event event;
718718
while (SDL_PollEvent(&event)) {
719-
// Add event to buffer
720-
buffered_events.push_back(event);
719+
// Add event to be handled later
720+
deferred_events.push_back(event);
721721
}
722722
}
723723

@@ -745,14 +745,28 @@ static void handle_sdl_event(const SDL_Event& event) {
745745
}
746746
}
747747

748+
void os_remove_deferred_cutscene_key_events() {
749+
deferred_events.erase(
750+
std::remove_if(deferred_events.begin(), deferred_events.end(), [](const SDL_Event &event)
751+
{
752+
return (event.type == SDL_KEYUP) && (
753+
event.key.keysym.sym == SDLK_KP_ENTER ||
754+
event.key.keysym.sym == SDLK_RETURN ||
755+
event.key.keysym.sym == SDLK_SPACE
756+
);
757+
}),
758+
deferred_events.end()
759+
);
760+
}
761+
748762
void os_poll()
749763
{
750-
// Replay the buffered events
751-
auto end = buffered_events.end();
752-
for (auto it = buffered_events.begin(); it != end; ++it) {
764+
// Replay the deferred events
765+
auto end = deferred_events.end();
766+
for (auto it = deferred_events.begin(); it != end; ++it) {
753767
handle_sdl_event(*it);
754768
}
755-
buffered_events.clear();
769+
deferred_events.clear();
756770

757771
SDL_Event event;
758772

code/osapi/osapi.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ int os_foreground();
6464
// process management --------------------------------------------------------------
6565

6666
/**
67-
* @brief Removes all pending events and ignores them
67+
* @brief Defers all pending events to be handled later
6868
*/
69-
void os_ignore_events();
69+
void os_defer_events_on_load_screen();
70+
71+
// removes key events that may unintentionally skip the cutscene
72+
void os_remove_deferred_cutscene_key_events();
7073

7174
// call to process windows messages. only does something in non THREADED mode
7275
void os_poll();

freespace2/freespace.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1193,7 +1193,7 @@ void game_loading_callback(int count)
11931193

11941194
Script_system.RemHookVar("Progress");
11951195

1196-
os_ignore_events();
1196+
os_defer_events_on_load_screen();
11971197

11981198
if (do_flip)
11991199
gr_flip();

0 commit comments

Comments
 (0)