Browse Source

misc_msg: Encode keyboard mod state directly

`demo_0.dmo` migrated with a script
pull/5030/head
Gleb Mazovetskiy 4 years ago
parent
commit
79e23f26f2
  1. 3
      .editorconfig
  2. 8
      Source/diablo.cpp
  3. 8
      Source/miniwin/misc_msg.cpp
  4. 34
      Source/miniwin/misc_msg.h
  5. BIN
      test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo

3
.editorconfig

@ -20,6 +20,9 @@ end_of_line = lf
[*.py]
end_of_line = lf
[*.rb]
end_of_line = lf
[*.yml]
indent_style = space
end_of_line = lf

8
Source/diablo.cpp

@ -601,7 +601,7 @@ void GameEventHandler(uint32_t uMsg, uint32_t wParam, uint32_t lParam)
{
switch (uMsg) {
case DVL_WM_KEYDOWN:
PressKey(static_cast<SDL_Keycode>(wParam), DecodeKeyboardModState(lParam));
PressKey(static_cast<SDL_Keycode>(wParam), lParam);
return;
case DVL_WM_KEYUP:
ReleaseKey(static_cast<SDL_Keycode>(wParam));
@ -614,7 +614,7 @@ void GameEventHandler(uint32_t uMsg, uint32_t wParam, uint32_t lParam)
GetMousePos(lParam);
if (sgbMouseDown == CLICK_NONE) {
sgbMouseDown = CLICK_LEFT;
LeftMouseDown(DecodeMouseModState(wParam));
LeftMouseDown(wParam);
}
return;
case DVL_WM_LBUTTONUP:
@ -622,14 +622,14 @@ void GameEventHandler(uint32_t uMsg, uint32_t wParam, uint32_t lParam)
if (sgbMouseDown == CLICK_LEFT) {
LastMouseButtonAction = MouseActionType::None;
sgbMouseDown = CLICK_NONE;
LeftMouseUp(DecodeMouseModState(wParam));
LeftMouseUp(wParam);
}
return;
case DVL_WM_RBUTTONDOWN:
GetMousePos(lParam);
if (sgbMouseDown == CLICK_NONE) {
sgbMouseDown = CLICK_RIGHT;
RightMouseDown((DecodeMouseModState(wParam) & KMOD_SHIFT) != 0);
RightMouseDown((wParam & KMOD_SHIFT) != 0);
}
return;
case DVL_WM_RBUTTONUP:

8
Source/miniwin/misc_msg.cpp

@ -342,18 +342,18 @@ bool FetchMessage_Real(tagMSG *lpMsg)
return FalseAvail(e.type == SDL_KEYDOWN ? "SDL_KEYDOWN" : "SDL_KEYUP", e.key.keysym.sym);
lpMsg->message = e.type == SDL_KEYDOWN ? DVL_WM_KEYDOWN : DVL_WM_KEYUP;
lpMsg->wParam = static_cast<uint32_t>(key);
lpMsg->lParam = EncodeKeyboardModState(e.key.keysym.mod);
lpMsg->lParam = e.key.keysym.mod;
} break;
case SDL_MOUSEMOTION:
lpMsg->message = DVL_WM_MOUSEMOVE;
lpMsg->lParam = PositionForMouse(e.motion.x, e.motion.y);
lpMsg->wParam = EncodeMouseModState(SDL_GetModState());
lpMsg->wParam = SDL_GetModState();
if (ControlMode == ControlTypes::KeyboardAndMouse && invflag)
InvalidateInventorySlot();
break;
case SDL_MOUSEBUTTONDOWN: {
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y);
lpMsg->wParam = EncodeMouseModState(SDL_GetModState());
lpMsg->wParam = SDL_GetModState();
const int button = e.button.button;
switch (button) {
case SDL_BUTTON_LEFT:
@ -375,7 +375,7 @@ bool FetchMessage_Real(tagMSG *lpMsg)
} break;
case SDL_MOUSEBUTTONUP: {
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y);
lpMsg->wParam = EncodeMouseModState(SDL_GetModState());
lpMsg->wParam = SDL_GetModState();
const int button = e.button.button;
switch (button) {
case SDL_BUTTON_LEFT:

34
Source/miniwin/misc_msg.h

@ -34,40 +34,6 @@ void PushMessage(const tagMSG *lpMsg);
void PostMessage(uint32_t type, uint32_t wParam, uint32_t lParam);
void ClearMessageQueue();
// Encoding / decoding keyboard modifier state from wParam.
// This is only to be compatible with the old timedemo files.
// TODO: These should be removed next time we change the timedemo format.
inline uint32_t EncodeKeyboardModState(uint16_t modState)
{
return modState << 16;
}
inline uint16_t DecodeKeyboardModState(uint32_t wParam)
{
return wParam >> 16;
}
inline uint32_t EncodeMouseModState(uint16_t modState)
{
uint32_t result = 0;
if ((modState & KMOD_SHIFT) != 0)
result |= 0x0004;
if ((modState & KMOD_CTRL) != 0)
result |= 0x0008;
return result;
}
inline uint16_t DecodeMouseModState(uint32_t wParam)
{
uint16_t modState = 0;
if ((wParam & 0x0004) != 0)
modState |= KMOD_LSHIFT;
if ((wParam & 0x0008) != 0)
modState |= KMOD_LCTRL;
return modState;
}
//
// Events
//

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

Binary file not shown.
Loading…
Cancel
Save