Browse Source

Make all movies escapable using ESC

Fixes #175
pull/479/head
Anders Jenbo 6 years ago
parent
commit
448c01a969
  1. 54
      Source/movie.cpp
  2. 1
      SourceS/miniwin/misc.h
  3. 1
      SourceS/miniwin/misc_macro.h
  4. 16
      SourceX/controls/game_controls.cpp
  5. 1
      SourceX/controls/game_controls.h
  6. 45
      SourceX/miniwin/misc_msg.cpp

54
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

1
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;

1
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

16
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;

1
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,

45
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) {

Loading…
Cancel
Save