Browse Source

misc_msg: Always use `lParam` for mod state

Previously, keyboard events used `lParam` for modifier key state,
while mouse events used `wParam`.

Changes the mouse events to use `lParam`, which allows us to
change `lParam` to `uint16_t`.

Demo migrated with a script.
pull/5049/head
Gleb Mazovetskiy 4 years ago
parent
commit
adf40f5c80
  1. 20
      Source/diablo.cpp
  2. 2
      Source/diablo.h
  3. 14
      Source/engine/demomode.cpp
  4. 24
      Source/miniwin/misc_msg.cpp
  5. 6
      Source/miniwin/misc_msg.h
  6. BIN
      test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo

20
Source/diablo.cpp

@ -598,7 +598,7 @@ void GetMousePos(uint32_t lParam)
MousePosition = { (std::int16_t)(lParam & 0xffff), (std::int16_t)((lParam >> 16) & 0xffff) };
}
void GameEventHandler(uint32_t uMsg, uint32_t wParam, uint32_t lParam)
void GameEventHandler(uint32_t uMsg, uint32_t wParam, uint16_t lParam)
{
switch (uMsg) {
case DVL_WM_KEYDOWN:
@ -608,29 +608,29 @@ void GameEventHandler(uint32_t uMsg, uint32_t wParam, uint32_t lParam)
ReleaseKey(static_cast<SDL_Keycode>(wParam));
return;
case DVL_WM_MOUSEMOVE:
GetMousePos(lParam);
GetMousePos(wParam);
gmenu_on_mouse_move();
return;
case DVL_WM_LBUTTONDOWN:
GetMousePos(lParam);
GetMousePos(wParam);
if (sgbMouseDown == CLICK_NONE) {
sgbMouseDown = CLICK_LEFT;
LeftMouseDown(wParam);
LeftMouseDown(lParam);
}
return;
case DVL_WM_LBUTTONUP:
GetMousePos(lParam);
GetMousePos(wParam);
if (sgbMouseDown == CLICK_LEFT) {
LastMouseButtonAction = MouseActionType::None;
sgbMouseDown = CLICK_NONE;
LeftMouseUp(wParam);
LeftMouseUp(lParam);
}
return;
case DVL_WM_RBUTTONDOWN:
GetMousePos(lParam);
GetMousePos(wParam);
if (sgbMouseDown == CLICK_NONE) {
sgbMouseDown = CLICK_RIGHT;
RightMouseDown((wParam & KMOD_SHIFT) != 0);
RightMouseDown((lParam & KMOD_SHIFT) != 0);
}
return;
case DVL_WM_RBUTTONUP:
@ -2014,14 +2014,14 @@ bool PressEscKey()
return rv;
}
void DisableInputEventHandler(uint32_t uMsg, uint32_t /*wParam*/, uint32_t lParam)
void DisableInputEventHandler(uint32_t uMsg, uint32_t wParam, uint16_t /*lParam*/)
{
switch (uMsg) {
case DVL_WM_KEYDOWN:
case DVL_WM_KEYUP:
return;
case DVL_WM_MOUSEMOVE:
GetMousePos(lParam);
GetMousePos(wParam);
return;
case DVL_WM_LBUTTONDOWN:
if (sgbMouseDown != CLICK_NONE)

2
Source/diablo.h

@ -93,7 +93,7 @@ bool diablo_is_focused();
void diablo_focus_pause();
void diablo_focus_unpause();
bool PressEscKey();
void DisableInputEventHandler(uint32_t uMsg, uint32_t wParam, uint32_t lParam);
void DisableInputEventHandler(uint32_t uMsg, uint32_t wParam, uint16_t lParam);
void LoadGameLevel(bool firstflag, lvl_entry lvldir);
/**

14
Source/engine/demomode.cpp

@ -29,7 +29,7 @@ struct DemoMsg {
DemoMsgType type;
uint32_t message;
uint32_t wParam;
uint32_t lParam;
uint16_t lParam;
float progressToNextGameTick;
};
@ -48,7 +48,7 @@ int StartTime = 0;
uint16_t DemoGraphicsWidth = 640;
uint16_t DemoGraphicsHeight = 480;
void PumpDemoMessage(DemoMsgType demoMsgType, uint32_t message, uint32_t wParam, uint32_t lParam, float progressToNextGameTick)
void PumpDemoMessage(DemoMsgType demoMsgType, uint32_t message, uint32_t wParam, uint16_t lParam, float progressToNextGameTick)
{
Demo_Message_Queue.push_back(DemoMsg { demoMsgType, message, wParam, lParam, progressToNextGameTick });
}
@ -80,7 +80,7 @@ bool LoadDemoMessages(int i)
case DemoMsgType::Message: {
const uint32_t message = ReadLE32(demofile);
const uint32_t wParam = ReadLE32(demofile);
const uint32_t lParam = ReadLE32(demofile);
const uint16_t lParam = ReadLE16(demofile);
PumpDemoMessage(type, message, wParam, lParam, progressToNextGameTick);
break;
}
@ -186,8 +186,8 @@ bool FetchMessage(tagMSG *lpMsg)
if (SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
lpMsg->message = DVL_WM_QUIT;
lpMsg->lParam = 0;
lpMsg->wParam = 0;
lpMsg->lParam = 0;
return true;
}
if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) {
@ -213,8 +213,8 @@ bool FetchMessage(tagMSG *lpMsg)
const DemoMsg dmsg = Demo_Message_Queue.front();
if (dmsg.type == DemoMsgType::Message) {
lpMsg->message = dmsg.message;
lpMsg->lParam = dmsg.lParam;
lpMsg->wParam = dmsg.wParam;
lpMsg->lParam = dmsg.lParam;
gfProgressToNextGameTick = dmsg.progressToNextGameTick;
Demo_Message_Queue.pop_front();
return true;
@ -222,8 +222,8 @@ bool FetchMessage(tagMSG *lpMsg)
}
lpMsg->message = 0;
lpMsg->lParam = 0;
lpMsg->wParam = 0;
lpMsg->lParam = 0;
return false;
}
@ -242,7 +242,7 @@ void RecordMessage(tagMSG *lpMsg)
WriteLEFloat(DemoRecording, gfProgressToNextGameTick);
WriteLE32(DemoRecording, lpMsg->message);
WriteLE32(DemoRecording, lpMsg->wParam);
WriteLE32(DemoRecording, lpMsg->lParam);
WriteLE16(DemoRecording, lpMsg->lParam);
}
void NotifyGameLoopStart()

24
Source/miniwin/misc_msg.cpp

@ -97,9 +97,9 @@ void FocusOnCharInfo()
namespace {
int32_t PositionForMouse(int16_t x, int16_t y)
uint32_t PositionForMouse(int16_t x, int16_t y)
{
return (((uint16_t)(y & 0xFFFF)) << 16) | (uint16_t)(x & 0xFFFF);
return (static_cast<uint16_t>(y) << 16) | static_cast<uint16_t>(x);
}
bool FalseAvail(const char *name, int value)
@ -235,8 +235,8 @@ bool FetchMessage_Real(tagMSG *lpMsg)
}
lpMsg->message = 0;
lpMsg->lParam = 0;
lpMsg->wParam = 0;
lpMsg->lParam = 0;
#ifdef __vita__
HandleTouchEvent(&e, MousePosition);
@ -302,8 +302,8 @@ bool FetchMessage_Real(tagMSG *lpMsg)
lpMsg->message = action.send_key.up
? (button == SDL_BUTTON_LEFT ? DVL_WM_LBUTTONUP : DVL_WM_RBUTTONUP)
: (button == SDL_BUTTON_RIGHT ? DVL_WM_LBUTTONDOWN : DVL_WM_RBUTTONDOWN);
lpMsg->wParam = 0;
lpMsg->lParam = (static_cast<int16_t>(MousePosition.y) << 16) | static_cast<int16_t>(MousePosition.x);
lpMsg->wParam = (static_cast<int16_t>(MousePosition.y) << 16) | static_cast<int16_t>(MousePosition.x);
lpMsg->lParam = 0;
} else {
lpMsg->message = action.send_key.up ? DVL_WM_KEYUP : DVL_WM_KEYDOWN;
lpMsg->wParam = action.send_key.vk_code;
@ -346,14 +346,14 @@ bool FetchMessage_Real(tagMSG *lpMsg)
} break;
case SDL_MOUSEMOTION:
lpMsg->message = DVL_WM_MOUSEMOVE;
lpMsg->lParam = PositionForMouse(e.motion.x, e.motion.y);
lpMsg->wParam = SDL_GetModState();
lpMsg->wParam = PositionForMouse(e.motion.x, e.motion.y);
lpMsg->lParam = SDL_GetModState();
if (ControlMode == ControlTypes::KeyboardAndMouse && invflag)
InvalidateInventorySlot();
break;
case SDL_MOUSEBUTTONDOWN: {
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y);
lpMsg->wParam = SDL_GetModState();
lpMsg->wParam = PositionForMouse(e.button.x, e.button.y);
lpMsg->lParam = SDL_GetModState();
const int button = e.button.button;
switch (button) {
case SDL_BUTTON_LEFT:
@ -374,8 +374,8 @@ bool FetchMessage_Real(tagMSG *lpMsg)
}
} break;
case SDL_MOUSEBUTTONUP: {
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y);
lpMsg->wParam = SDL_GetModState();
lpMsg->wParam = PositionForMouse(e.button.x, e.button.y);
lpMsg->lParam = SDL_GetModState();
const int button = e.button.button;
switch (button) {
case SDL_BUTTON_LEFT:
@ -510,7 +510,7 @@ void PushMessage(const tagMSG *lpMsg)
CurrentEventHandler(lpMsg->message, lpMsg->wParam, lpMsg->lParam);
}
void PostMessage(uint32_t type, uint32_t wParam, uint32_t lParam)
void PostMessage(uint32_t type, uint32_t wParam, uint16_t lParam)
{
message_queue.push_back({ type, wParam, lParam });
}

6
Source/miniwin/misc_msg.h

@ -19,10 +19,10 @@ namespace devilution {
struct tagMSG {
uint32_t message;
uint32_t wParam;
uint32_t lParam;
uint16_t lParam;
};
typedef void (*EventHandler)(uint32_t, uint32_t, uint32_t);
typedef void (*EventHandler)(uint32_t, uint32_t, uint16_t);
void SetCursorPos(Point position);
void FocusOnCharInfo();
@ -31,7 +31,7 @@ void SetMouseButtonEvent(SDL_Event &event, uint32_t type, uint8_t button, Point
bool FetchMessage(tagMSG *lpMsg);
void PushMessage(const tagMSG *lpMsg);
void PostMessage(uint32_t type, uint32_t wParam, uint32_t lParam);
void PostMessage(uint32_t type, uint32_t wParam, uint16_t lParam);
void ClearMessageQueue();
//

BIN
test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo vendored

Binary file not shown.
Loading…
Cancel
Save