From 448c01a96979254d161e06afc6cfd206a17ccce1 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 17 Nov 2019 01:29:55 +0100 Subject: [PATCH] Make all movies escapable using ESC Fixes #175 --- Source/movie.cpp | 54 ++++++++++-------------------- SourceS/miniwin/misc.h | 1 - SourceS/miniwin/misc_macro.h | 1 - SourceX/controls/game_controls.cpp | 16 --------- SourceX/controls/game_controls.h | 1 - SourceX/miniwin/misc_msg.cpp | 45 ++++--------------------- 6 files changed, 25 insertions(+), 93 deletions(-) diff --git a/Source/movie.cpp b/Source/movie.cpp index 1c365cd27..ff304908b 100644 --- a/Source/movie.cpp +++ b/Source/movie.cpp @@ -8,56 +8,38 @@ BOOL loop_movie; void play_movie(char *pszMovie, BOOL user_can_close) { - WNDPROC saveProc; HANDLE video_stream; - saveProc = SetWindowProc(MovieWndProc); movie_playing = TRUE; sound_disable_music(TRUE); sfx_stop(); effects_play_sound("Sfx\\Misc\\blank.wav"); SVidPlayBegin(pszMovie, 0, 0, 0, 0, loop_movie ? 0x100C0808 : 0x10280808, &video_stream); - if (video_stream) { - MSG Msg; - while (video_stream) { - if (user_can_close && !movie_playing) + MSG Msg; + while (video_stream && movie_playing) { + while (movie_playing && PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&Msg); + switch (Msg.message) { + case WM_KEYDOWN: + case WM_CHAR: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + if (user_can_close || (Msg.message == WM_CHAR && Msg.wParam == VK_ESCAPE)) + movie_playing = FALSE; break; - while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { - if (Msg.message != WM_QUIT) { - TranslateMessage(&Msg); - DispatchMessage(&Msg); - } - } - if (!SVidPlayContinue()) + case WM_QUIT: + movie_playing = FALSE; break; + } } - if (video_stream) - SVidPlayEnd(video_stream); + if (!SVidPlayContinue()) + break; } - SetWindowProc(saveProc); + if (video_stream) + SVidPlayEnd(video_stream); sound_disable_music(FALSE); movie_playing = FALSE; } -LRESULT __stdcall MovieWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - switch (Msg) { - case WM_KEYFIRST: - case WM_CHAR: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - movie_playing = FALSE; - break; - case WM_SYSCOMMAND: - if (wParam == SC_CLOSE) { - movie_playing = FALSE; - return 0; - } - break; - } - - return MainWndProc(hWnd, Msg, wParam, lParam); -} - DEVILUTION_END_NAMESPACE diff --git a/SourceS/miniwin/misc.h b/SourceS/miniwin/misc.h index 52ade8388..97153afac 100644 --- a/SourceS/miniwin/misc.h +++ b/SourceS/miniwin/misc.h @@ -479,7 +479,6 @@ constexpr auto DVL_WM_LBUTTONUP = 0x0202; constexpr auto DVL_WM_RBUTTONDOWN = 0x0204; constexpr auto DVL_WM_RBUTTONUP = 0x0205; -constexpr auto DVL_WM_KEYFIRST = 0x0100; constexpr auto DVL_WM_KEYDOWN = 0x0100; constexpr auto DVL_WM_KEYUP = 0x0101; constexpr auto DVL_WM_SYSKEYDOWN = 0x0104; diff --git a/SourceS/miniwin/misc_macro.h b/SourceS/miniwin/misc_macro.h index 0ac810a49..ba33703d6 100644 --- a/SourceS/miniwin/misc_macro.h +++ b/SourceS/miniwin/misc_macro.h @@ -176,7 +176,6 @@ #define WM_RBUTTONDOWN DVL_WM_RBUTTONDOWN #define WM_RBUTTONUP DVL_WM_RBUTTONUP -#define WM_KEYFIRST DVL_WM_KEYFIRST #define WM_KEYDOWN DVL_WM_KEYDOWN #define WM_KEYUP DVL_WM_KEYUP #define WM_SYSKEYDOWN DVL_WM_SYSKEYDOWN diff --git a/SourceX/controls/game_controls.cpp b/SourceX/controls/game_controls.cpp index 47901f6ce..d0ec198b6 100644 --- a/SourceX/controls/game_controls.cpp +++ b/SourceX/controls/game_controls.cpp @@ -125,22 +125,6 @@ bool GetGameAction(const SDL_Event &event, GameAction *action) return false; } -bool ShouldSkipMovie(const SDL_Event &event) -{ - if (GetMenuAction(event) != MenuAction::NONE) - return true; - switch (event.type) { - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - return event.button.button == SDL_BUTTON_LEFT; - case SDL_KEYDOWN: - case SDL_KEYUP: - return true; - default: - return false; - } -} - MoveDirection GetMoveDirection() { const float stickX = leftStickX; diff --git a/SourceX/controls/game_controls.h b/SourceX/controls/game_controls.h index b544ca889..bcad974f9 100644 --- a/SourceX/controls/game_controls.h +++ b/SourceX/controls/game_controls.h @@ -64,7 +64,6 @@ struct GameAction { }; bool GetGameAction(const SDL_Event &event, GameAction *action); -bool ShouldSkipMovie(const SDL_Event &event); enum class MoveDirectionX { NONE = 0, diff --git a/SourceX/miniwin/misc_msg.cpp b/SourceX/miniwin/misc_msg.cpp index a1c7831be..3d7b50e38 100644 --- a/SourceX/miniwin/misc_msg.cpp +++ b/SourceX/miniwin/misc_msg.cpp @@ -250,38 +250,6 @@ WINBOOL false_avail(const char *name, int value) return true; } -void SetMouseLMBMessage(const SDL_Event &event, LPMSG lpMsg) -{ - switch (event.type) { -#ifndef USE_SDL1 - case SDL_CONTROLLERBUTTONDOWN: - case SDL_CONTROLLERBUTTONUP: - lpMsg->message = event.type == SDL_CONTROLLERBUTTONUP ? DVL_WM_LBUTTONUP : DVL_WM_LBUTTONDOWN; - lpMsg->lParam = (MouseY << 16) | (MouseX & 0xFFFF); - break; -#endif - case SDL_JOYBUTTONDOWN: - case SDL_JOYBUTTONUP: - lpMsg->message = event.type == SDL_JOYBUTTONUP ? DVL_WM_LBUTTONUP : DVL_WM_LBUTTONDOWN; - lpMsg->lParam = (MouseY << 16) | (MouseX & 0xFFFF); - break; - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - lpMsg->message = event.type == SDL_MOUSEBUTTONUP ? DVL_WM_LBUTTONUP : DVL_WM_LBUTTONDOWN; - lpMsg->lParam = (event.button.y << 16) | (event.button.x & 0xFFFF); - break; - case SDL_KEYDOWN: - case SDL_KEYUP: - lpMsg->message = event.type == SDL_KEYUP ? DVL_WM_LBUTTONUP : DVL_WM_LBUTTONDOWN; - lpMsg->lParam = (MouseY << 16) | (MouseX & 0xFFFF); - break; - default: - UNIMPLEMENTED(); - } - if (lpMsg->message == DVL_WM_LBUTTONUP || lpMsg->message == DVL_WM_LBUTTONDOWN) - lpMsg->wParam = keystate_for_mouse(lpMsg->message == DVL_WM_LBUTTONUP ? 0 : DVL_MK_LBUTTON); -} - // Moves the mouse to the first inventory slot. void FocusOnInventory() { @@ -398,12 +366,6 @@ WINBOOL PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilter } #endif - if (movie_playing) { - if (ShouldSkipMovie(e)) - SetMouseLMBMessage(e, lpMsg); - return true; - } - if (ProcessControllerMotion(e)) { ScaleJoysticks(); return true; @@ -413,6 +375,13 @@ WINBOOL PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilter if (GetGameAction(e, &action)) { if (action.type != GameActionType::NONE) { sgbControllerActive = true; + + if (movie_playing) { + lpMsg->message = DVL_WM_CHAR; + if (action.type == GameActionType::SEND_KEY) + lpMsg->wParam = action.send_key.vk_code; + return true; + } } switch (action.type) {