Browse Source

Fix Automap movement being hardcoded to right stick on gamepad (#7921)

pull/8112/head
Nick Wicked 7 months ago committed by GitHub
parent
commit
120993c9a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      Source/controls/game_controls.cpp
  2. 49
      Source/controls/plrctrls.cpp
  3. 2
      Source/cursor.cpp
  4. 92
      Source/diablo.cpp
  5. 4
      Source/diablo.h
  6. 2
      Source/init.cpp
  7. 2
      Source/objects.cpp
  8. 12
      Source/player.cpp
  9. 2
      Source/qol/itemlabels.cpp
  10. 26
      Source/track.cpp
  11. 2
      Source/track.h

4
Source/controls/game_controls.cpp

@ -166,7 +166,7 @@ bool GetGameAction(const SDL_Event &event, ControllerButtonEvent ctrlEvent, Game
|| (!VirtualGamepadState.secondaryActionButton.isHeld && ControllerActionHeld == GameActionType_SECONDARY_ACTION) || (!VirtualGamepadState.secondaryActionButton.isHeld && ControllerActionHeld == GameActionType_SECONDARY_ACTION)
|| (!VirtualGamepadState.spellActionButton.isHeld && ControllerActionHeld == GameActionType_CAST_SPELL)) { || (!VirtualGamepadState.spellActionButton.isHeld && ControllerActionHeld == GameActionType_CAST_SPELL)) {
ControllerActionHeld = GameActionType_NONE; ControllerActionHeld = GameActionType_NONE;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
} }
} }
} }
@ -265,7 +265,7 @@ void PressControllerButton(ControllerButton button)
switch (button) { switch (button) {
case devilution::ControllerButton_BUTTON_DPAD_UP: case devilution::ControllerButton_BUTTON_DPAD_UP:
PressEscKey(); PressEscKey();
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
PadHotspellMenuActive = false; PadHotspellMenuActive = false;
PadMenuNavigatorActive = false; PadMenuNavigatorActive = false;
gamemenu_on(); gamemenu_on();

49
Source/controls/plrctrls.cpp

@ -516,7 +516,7 @@ void Interact()
} }
NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position); NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position);
LastMouseButtonAction = MouseActionType::Attack; LastPlayerAction = PlayerActionType::Attack;
return; return;
} }
@ -526,19 +526,19 @@ void Interact()
} else { } else {
NetSendCmdParam1(true, CMD_RATTACKID, pcursmonst); NetSendCmdParam1(true, CMD_RATTACKID, pcursmonst);
} }
LastMouseButtonAction = MouseActionType::AttackMonsterTarget; LastPlayerAction = PlayerActionType::AttackMonsterTarget;
return; return;
} }
if (leveltype != DTYPE_TOWN && PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) { if (leveltype != DTYPE_TOWN && PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) {
NetSendCmdParam1(true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKPID : CMD_ATTACKPID, PlayerUnderCursor->getId()); NetSendCmdParam1(true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKPID : CMD_ATTACKPID, PlayerUnderCursor->getId());
LastMouseButtonAction = MouseActionType::AttackPlayerTarget; LastPlayerAction = PlayerActionType::AttackPlayerTarget;
return; return;
} }
if (ObjectUnderCursor != nullptr) { if (ObjectUnderCursor != nullptr) {
NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition);
LastMouseButtonAction = MouseActionType::OperateObject; LastPlayerAction = PlayerActionType::OperateObject;
return; return;
} }
} }
@ -1521,6 +1521,23 @@ void ProcessLeftStickOrDPadGameUI()
handler(GetLeftStickOrDpadDirection(false)); handler(GetLeftStickOrDpadDirection(false));
} }
void ProcessAutomapMovementGamepad()
{
if (!AutomapActive)
return;
const auto &padmapper = GetOptions().Padmapper;
if (IsControllerButtonComboPressed(padmapper.ButtonComboForAction("AutomapMoveUp")))
AutomapUp();
if (IsControllerButtonComboPressed(padmapper.ButtonComboForAction("AutomapMoveDown")))
AutomapDown();
if (IsControllerButtonComboPressed(padmapper.ButtonComboForAction("AutomapMoveLeft")))
AutomapLeft();
if (IsControllerButtonComboPressed(padmapper.ButtonComboForAction("AutomapMoveRight")))
AutomapRight();
}
void Movement(Player &player) void Movement(Player &player)
{ {
if (PadMenuNavigatorActive || PadHotspellMenuActive || InGameMenu()) if (PadMenuNavigatorActive || PadHotspellMenuActive || InGameMenu())
@ -1827,15 +1844,6 @@ void HandleRightStickMotion()
return; return;
} }
if (AutomapActive) { // move map
int dx = 0;
int dy = 0;
acc.Pool(&dx, &dy, 32);
AutomapOffset.deltaX += dy + dx;
AutomapOffset.deltaY += dy - dx;
return;
}
{ // move cursor { // move cursor
InvalidateInventorySlot(); InvalidateInventorySlot();
int x = MousePosition.x; int x = MousePosition.x;
@ -1900,7 +1908,7 @@ void plrctrls_after_check_curs_move()
} }
// While holding the button down we should retain target (but potentially lose it if it dies, goes out of view, etc) // While holding the button down we should retain target (but potentially lose it if it dies, goes out of view, etc)
if (ControllerActionHeld != GameActionType_NONE && IsNoneOf(LastMouseButtonAction, MouseActionType::None, MouseActionType::Attack, MouseActionType::Spell)) { if (ControllerActionHeld != GameActionType_NONE && IsNoneOf(LastPlayerAction, PlayerActionType::None, PlayerActionType::Attack, PlayerActionType::Spell)) {
InvalidateTargets(); InvalidateTargets();
if (pcursmonst == -1 && ObjectUnderCursor == nullptr && pcursitem == -1 && pcursinvitem == -1 && pcursstashitem == StashStruct::EmptyCell && PlayerUnderCursor == nullptr) { if (pcursmonst == -1 && ObjectUnderCursor == nullptr && pcursitem == -1 && pcursinvitem == -1 && pcursstashitem == StashStruct::EmptyCell && PlayerUnderCursor == nullptr) {
@ -1937,6 +1945,7 @@ void plrctrls_every_frame()
{ {
ProcessLeftStickOrDPadGameUI(); ProcessLeftStickOrDPadGameUI();
HandleRightStickMotion(); HandleRightStickMotion();
ProcessAutomapMovementGamepad();
} }
void plrctrls_after_game_logic() void plrctrls_after_game_logic()
@ -2101,11 +2110,11 @@ void PerformSpellAction()
UpdateSpellTarget(myPlayer._pRSpell); UpdateSpellTarget(myPlayer._pRSpell);
CheckPlrSpell(false); CheckPlrSpell(false);
if (PlayerUnderCursor != nullptr) if (PlayerUnderCursor != nullptr)
LastMouseButtonAction = MouseActionType::SpellPlayerTarget; LastPlayerAction = PlayerActionType::SpellPlayerTarget;
else if (pcursmonst != -1) else if (pcursmonst != -1)
LastMouseButtonAction = MouseActionType::SpellMonsterTarget; LastPlayerAction = PlayerActionType::SpellMonsterTarget;
else else
LastMouseButtonAction = MouseActionType::Spell; LastPlayerAction = PlayerActionType::Spell;
} }
void CtrlUseInvItem() void CtrlUseInvItem()
@ -2188,7 +2197,7 @@ void PerformSecondaryAction()
NetSendCmdLocParam1(true, CMD_GOTOAGETITEM, cursPosition, pcursitem); NetSendCmdLocParam1(true, CMD_GOTOAGETITEM, cursPosition, pcursitem);
} else if (ObjectUnderCursor != nullptr) { } else if (ObjectUnderCursor != nullptr) {
NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition);
LastMouseButtonAction = MouseActionType::OperateObject; LastPlayerAction = PlayerActionType::OperateObject;
} else { } else {
if (pcursmissile != nullptr) { if (pcursmissile != nullptr) {
MakePlrPath(myPlayer, pcursmissile->position.tile, true); MakePlrPath(myPlayer, pcursmissile->position.tile, true);
@ -2205,7 +2214,7 @@ void PerformSecondaryAction()
void QuickCast(size_t slot) void QuickCast(size_t slot)
{ {
MouseActionType prevMouseButtonAction = LastMouseButtonAction; PlayerActionType prevMouseButtonAction = LastPlayerAction;
Player &myPlayer = *MyPlayer; Player &myPlayer = *MyPlayer;
SpellID spell = myPlayer._pSplHotKey[slot]; SpellID spell = myPlayer._pSplHotKey[slot];
SpellType spellType = myPlayer._pSplTHotKey[slot]; SpellType spellType = myPlayer._pSplTHotKey[slot];
@ -2215,7 +2224,7 @@ void QuickCast(size_t slot)
} }
CheckPlrSpell(false, spell, spellType); CheckPlrSpell(false, spell, spellType);
LastMouseButtonAction = prevMouseButtonAction; LastPlayerAction = prevMouseButtonAction;
} }
} // namespace devilution } // namespace devilution

2
Source/cursor.cpp

@ -771,7 +771,7 @@ void ShiftToDiamondGridAlignment(Point screenPosition, Point &tile, bool &flipfl
*/ */
bool CheckMouseHold(const Point currentTile) bool CheckMouseHold(const Point currentTile)
{ {
if ((sgbMouseDown != CLICK_NONE || ControllerActionHeld != GameActionType_NONE) && IsNoneOf(LastMouseButtonAction, MouseActionType::None, MouseActionType::Attack, MouseActionType::Spell)) { if ((sgbMouseDown != CLICK_NONE || ControllerActionHeld != GameActionType_NONE) && IsNoneOf(LastPlayerAction, PlayerActionType::None, PlayerActionType::Attack, PlayerActionType::Spell)) {
InvalidateTargets(); InvalidateTargets();
if (pcursmonst == -1 && ObjectUnderCursor == nullptr && pcursitem == -1 && pcursinvitem == -1 && pcursstashitem == StashStruct::EmptyCell && PlayerUnderCursor == nullptr) { if (pcursmonst == -1 && ObjectUnderCursor == nullptr && pcursitem == -1 && pcursinvitem == -1 && pcursstashitem == StashStruct::EmptyCell && PlayerUnderCursor == nullptr) {

92
Source/diablo.cpp

@ -139,7 +139,7 @@ std::vector<std::string> DebugCmdsFromCommandLine;
GameLogicStep gGameLogicStep = GameLogicStep::None; GameLogicStep gGameLogicStep = GameLogicStep::None;
/** This and the following mouse variables are for handling in-game click-and-hold actions */ /** This and the following mouse variables are for handling in-game click-and-hold actions */
MouseActionType LastMouseButtonAction = MouseActionType::None; PlayerActionType LastPlayerAction = PlayerActionType::None;
// Controller support: Actions to run after updating the cursor state. // Controller support: Actions to run after updating the cursor state.
// Defined in SourceX/controls/plctrls.cpp. // Defined in SourceX/controls/plctrls.cpp.
@ -179,7 +179,7 @@ void StartGame(interface_mode uMsg)
InitLevelCursor(); InitLevelCursor();
sgnTimeoutCurs = CURSOR_NONE; sgnTimeoutCurs = CURSOR_NONE;
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
} }
void FreeGame() void FreeGame()
@ -224,7 +224,7 @@ bool ProcessInput()
#endif #endif
CheckCursMove(); CheckCursMove();
plrctrls_after_check_curs_move(); plrctrls_after_check_curs_move();
RepeatMouseAction(); RepeatPlayerAction();
} }
return true; return true;
@ -244,7 +244,7 @@ void LeftMouseCmd(bool bShift)
if (pcursmonst != -1) if (pcursmonst != -1)
NetSendCmdLocParam1(true, CMD_TALKXY, cursPosition, pcursmonst); NetSendCmdLocParam1(true, CMD_TALKXY, cursPosition, pcursmonst);
if (pcursitem == -1 && pcursmonst == -1 && PlayerUnderCursor == nullptr) { if (pcursitem == -1 && pcursmonst == -1 && PlayerUnderCursor == nullptr) {
LastMouseButtonAction = MouseActionType::Walk; LastPlayerAction = PlayerActionType::Walk;
NetSendCmdLoc(MyPlayerId, true, CMD_WALKXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_WALKXY, cursPosition);
} }
return; return;
@ -255,21 +255,21 @@ void LeftMouseCmd(bool bShift)
if (pcursitem != -1 && pcurs == CURSOR_HAND && !bShift) { if (pcursitem != -1 && pcurs == CURSOR_HAND && !bShift) {
NetSendCmdLocParam1(true, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursPosition, pcursitem); NetSendCmdLocParam1(true, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursPosition, pcursitem);
} else if (ObjectUnderCursor != nullptr && !ObjectUnderCursor->IsDisabled() && (!bShift || (bNear && ObjectUnderCursor->_oBreak == 1))) { } else if (ObjectUnderCursor != nullptr && !ObjectUnderCursor->IsDisabled() && (!bShift || (bNear && ObjectUnderCursor->_oBreak == 1))) {
LastMouseButtonAction = MouseActionType::OperateObject; LastPlayerAction = PlayerActionType::OperateObject;
NetSendCmdLoc(MyPlayerId, true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursPosition);
} else if (myPlayer.UsesRangedWeapon()) { } else if (myPlayer.UsesRangedWeapon()) {
if (bShift) { if (bShift) {
LastMouseButtonAction = MouseActionType::Attack; LastPlayerAction = PlayerActionType::Attack;
NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, cursPosition);
} else if (pcursmonst != -1) { } else if (pcursmonst != -1) {
if (CanTalkToMonst(Monsters[pcursmonst])) { if (CanTalkToMonst(Monsters[pcursmonst])) {
NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst);
} else { } else {
LastMouseButtonAction = MouseActionType::AttackMonsterTarget; LastPlayerAction = PlayerActionType::AttackMonsterTarget;
NetSendCmdParam1(true, CMD_RATTACKID, pcursmonst); NetSendCmdParam1(true, CMD_RATTACKID, pcursmonst);
} }
} else if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) { } else if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) {
LastMouseButtonAction = MouseActionType::AttackPlayerTarget; LastPlayerAction = PlayerActionType::AttackPlayerTarget;
NetSendCmdParam1(true, CMD_RATTACKPID, PlayerUnderCursor->getId()); NetSendCmdParam1(true, CMD_RATTACKPID, PlayerUnderCursor->getId());
} }
} else { } else {
@ -278,23 +278,23 @@ void LeftMouseCmd(bool bShift)
if (CanTalkToMonst(Monsters[pcursmonst])) { if (CanTalkToMonst(Monsters[pcursmonst])) {
NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst);
} else { } else {
LastMouseButtonAction = MouseActionType::Attack; LastPlayerAction = PlayerActionType::Attack;
NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition);
} }
} else { } else {
LastMouseButtonAction = MouseActionType::Attack; LastPlayerAction = PlayerActionType::Attack;
NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition);
} }
} else if (pcursmonst != -1) { } else if (pcursmonst != -1) {
LastMouseButtonAction = MouseActionType::AttackMonsterTarget; LastPlayerAction = PlayerActionType::AttackMonsterTarget;
NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst);
} else if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) { } else if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) {
LastMouseButtonAction = MouseActionType::AttackPlayerTarget; LastPlayerAction = PlayerActionType::AttackPlayerTarget;
NetSendCmdParam1(true, CMD_ATTACKPID, PlayerUnderCursor->getId()); NetSendCmdParam1(true, CMD_ATTACKPID, PlayerUnderCursor->getId());
} }
} }
if (!bShift && pcursitem == -1 && ObjectUnderCursor == nullptr && pcursmonst == -1 && PlayerUnderCursor == nullptr) { if (!bShift && pcursitem == -1 && ObjectUnderCursor == nullptr && pcursmonst == -1 && PlayerUnderCursor == nullptr) {
LastMouseButtonAction = MouseActionType::Walk; LastPlayerAction = PlayerActionType::Walk;
NetSendCmdLoc(MyPlayerId, true, CMD_WALKXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_WALKXY, cursPosition);
} }
} }
@ -318,7 +318,7 @@ bool TryOpenDungeonWithMouse()
void LeftMouseDown(uint16_t modState) void LeftMouseDown(uint16_t modState)
{ {
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
if (gmenu_left_mouse(true)) if (gmenu_left_mouse(true))
return; return;
@ -417,7 +417,7 @@ void LeftMouseUp(uint16_t modState)
void RightMouseDown(bool isShiftHeld) void RightMouseDown(bool isShiftHeld)
{ {
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
if (gmenu_is_active() || sgnTimeoutCurs != CURSOR_NONE || PauseMode == 2 || MyPlayer->_pInvincible) { if (gmenu_is_active() || sgnTimeoutCurs != CURSOR_NONE || PauseMode == 2 || MyPlayer->_pInvincible) {
return; return;
@ -522,7 +522,7 @@ void PressKey(SDL_Keycode vkey, uint16_t modState)
// Disallow player from accessing escape menu during the frames before the death message appears // Disallow player from accessing escape menu during the frames before the death message appears
if (vkey == SDLK_ESCAPE && MyPlayer->_pHitPoints > 0) { if (vkey == SDLK_ESCAPE && MyPlayer->_pHitPoints > 0) {
if (!PressEscKey()) { if (!PressEscKey()) {
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
gamemenu_on(); gamemenu_on();
} }
return; return;
@ -683,11 +683,11 @@ void HandleMouseButtonDown(Uint8 button, uint16_t modState)
void HandleMouseButtonUp(Uint8 button, uint16_t modState) void HandleMouseButtonUp(Uint8 button, uint16_t modState)
{ {
if (sgbMouseDown == CLICK_LEFT && button == SDL_BUTTON_LEFT) { if (sgbMouseDown == CLICK_LEFT && button == SDL_BUTTON_LEFT) {
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
LeftMouseUp(modState); LeftMouseUp(modState);
} else if (sgbMouseDown == CLICK_RIGHT && button == SDL_BUTTON_RIGHT) { } else if (sgbMouseDown == CLICK_RIGHT && button == SDL_BUTTON_RIGHT) {
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
} else { } else {
KeymapperRelease(static_cast<SDL_Keycode>(button | KeymapperMouseButtonMask)); KeymapperRelease(static_cast<SDL_Keycode>(button | KeymapperMouseButtonMask));
@ -1538,7 +1538,7 @@ void HelpKeyPressed()
InfoString = StringOrView {}; InfoString = StringOrView {};
AddInfoBoxString(_("No help available")); /// BUGFIX: message isn't displayed AddInfoBoxString(_("No help available")); /// BUGFIX: message isn't displayed
AddInfoBoxString(_("while in stores")); AddInfoBoxString(_("while in stores"));
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
} else { } else {
CloseInventory(); CloseInventory();
CloseCharPanel(); CloseCharPanel();
@ -1638,7 +1638,7 @@ void DisplaySpellsKeyPressed()
} else { } else {
SpellSelectFlag = false; SpellSelectFlag = false;
} }
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
} }
void SpellBookKeyPressed() void SpellBookKeyPressed()
@ -2095,12 +2095,12 @@ void InitPadmapActions()
ControllerButton_BUTTON_B, ControllerButton_BUTTON_B,
[] { [] {
ControllerActionHeld = GameActionType_PRIMARY_ACTION; ControllerActionHeld = GameActionType_PRIMARY_ACTION;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
PerformPrimaryAction(); PerformPrimaryAction();
}, },
[] { [] {
ControllerActionHeld = GameActionType_NONE; ControllerActionHeld = GameActionType_NONE;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
}, },
CanPlayerTakeAction); CanPlayerTakeAction);
options.Padmapper.AddAction( options.Padmapper.AddAction(
@ -2110,12 +2110,12 @@ void InitPadmapActions()
ControllerButton_BUTTON_Y, ControllerButton_BUTTON_Y,
[] { [] {
ControllerActionHeld = GameActionType_SECONDARY_ACTION; ControllerActionHeld = GameActionType_SECONDARY_ACTION;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
PerformSecondaryAction(); PerformSecondaryAction();
}, },
[] { [] {
ControllerActionHeld = GameActionType_NONE; ControllerActionHeld = GameActionType_NONE;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
}, },
CanPlayerTakeAction); CanPlayerTakeAction);
options.Padmapper.AddAction( options.Padmapper.AddAction(
@ -2125,12 +2125,12 @@ void InitPadmapActions()
ControllerButton_BUTTON_X, ControllerButton_BUTTON_X,
[] { [] {
ControllerActionHeld = GameActionType_CAST_SPELL; ControllerActionHeld = GameActionType_CAST_SPELL;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
PerformSpellAction(); PerformSpellAction();
}, },
[] { [] {
ControllerActionHeld = GameActionType_NONE; ControllerActionHeld = GameActionType_NONE;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
}, },
[]() { return CanPlayerTakeAction() && !InGameMenu(); }); []() { return CanPlayerTakeAction() && !InGameMenu(); });
options.Padmapper.AddAction( options.Padmapper.AddAction(
@ -2264,11 +2264,35 @@ void InitPadmapActions()
nullptr, nullptr,
[]() { return CanPlayerTakeAction() && !InGameMenu(); }); []() { return CanPlayerTakeAction() && !InGameMenu(); });
options.Padmapper.AddAction( options.Padmapper.AddAction(
"Toggle Automap", "ToggleAutomap",
N_("Toggle automap"), N_("Toggle automap"),
N_("Toggles if automap is displayed."), N_("Toggles if automap is displayed."),
ControllerButton_BUTTON_LEFTSTICK, ControllerButton_BUTTON_LEFTSTICK,
DoAutoMap); DoAutoMap);
options.Padmapper.AddAction(
"AutomapMoveUp",
N_("Automap Move Up"),
N_("Moves the automap up when active."),
ControllerButton_NONE,
[] {});
options.Padmapper.AddAction(
"AutomapMoveDown",
N_("Automap Move Down"),
N_("Moves the automap down when active."),
ControllerButton_NONE,
[] {});
options.Padmapper.AddAction(
"AutomapMoveLeft",
N_("Automap Move Left"),
N_("Moves the automap left when active."),
ControllerButton_NONE,
[] {});
options.Padmapper.AddAction(
"AutomapMoveRight",
N_("Automap Move Right"),
N_("Moves the automap right when active."),
ControllerButton_NONE,
[] {});
options.Padmapper.AddAction( options.Padmapper.AddAction(
"MouseUp", "MouseUp",
N_("Move mouse up"), N_("Move mouse up"),
@ -2302,7 +2326,7 @@ void InitPadmapActions()
auto leftMouseUp = [] { auto leftMouseUp = [] {
ControllerButtonCombo standGroundCombo = GetOptions().Padmapper.ButtonComboForAction("StandGround"); ControllerButtonCombo standGroundCombo = GetOptions().Padmapper.ButtonComboForAction("StandGround");
bool standGround = StandToggle || IsControllerButtonComboPressed(standGroundCombo); bool standGround = StandToggle || IsControllerButtonComboPressed(standGroundCombo);
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
LeftMouseUp(standGround ? KMOD_SHIFT : KMOD_NONE); LeftMouseUp(standGround ? KMOD_SHIFT : KMOD_NONE);
}; };
@ -2323,12 +2347,12 @@ void InitPadmapActions()
auto rightMouseDown = [] { auto rightMouseDown = [] {
ControllerButtonCombo standGroundCombo = GetOptions().Padmapper.ButtonComboForAction("StandGround"); ControllerButtonCombo standGroundCombo = GetOptions().Padmapper.ButtonComboForAction("StandGround");
bool standGround = StandToggle || IsControllerButtonComboPressed(standGroundCombo); bool standGround = StandToggle || IsControllerButtonComboPressed(standGroundCombo);
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
sgbMouseDown = CLICK_RIGHT; sgbMouseDown = CLICK_RIGHT;
RightMouseDown(standGround); RightMouseDown(standGround);
}; };
auto rightMouseUp = [] { auto rightMouseUp = [] {
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
}; };
options.Padmapper.AddAction( options.Padmapper.AddAction(
@ -2362,7 +2386,7 @@ void InitPadmapActions()
auto toggleGameMenu = [] { auto toggleGameMenu = [] {
bool inMenu = gmenu_is_active(); bool inMenu = gmenu_is_active();
PressEscKey(); PressEscKey();
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
PadHotspellMenuActive = false; PadHotspellMenuActive = false;
PadMenuNavigatorActive = false; PadMenuNavigatorActive = false;
if (!inMenu) if (!inMenu)
@ -2775,7 +2799,7 @@ void diablo_pause_game()
PauseMode = 2; PauseMode = 2;
sound_stop(); sound_stop();
qtextflag = false; qtextflag = false;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
} }
RedrawEverything(); RedrawEverything();
@ -2806,7 +2830,7 @@ void diablo_focus_pause()
if (!GameWasAlreadyPaused) { if (!GameWasAlreadyPaused) {
PauseMode = 2; PauseMode = 2;
sound_stop(); sound_stop();
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
} }
SVidMute(); SVidMute();
@ -3237,7 +3261,7 @@ void LoadGameLevelCrypt()
void LoadGameLevelCalculateCursor() void LoadGameLevelCalculateCursor()
{ {
// Recalculate mouse selection of entities after level change/load // Recalculate mouse selection of entities after level change/load
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
ResetItemlabelHighlighted(); // level changed => item changed ResetItemlabelHighlighted(); // level changed => item changed
pcursmonst = -1; // ensure pcurstemp is set to a valid value pcursmonst = -1; // ensure pcurstemp is set to a valid value

4
Source/diablo.h

@ -51,7 +51,7 @@ enum class GameLogicStep : uint8_t {
ProcessMissilesTown, ProcessMissilesTown,
}; };
enum class MouseActionType : uint8_t { enum class PlayerActionType : uint8_t {
None, None,
Walk, Walk,
Spell, Spell,
@ -79,7 +79,7 @@ extern clicktype sgbMouseDown;
extern uint16_t gnTickDelay; extern uint16_t gnTickDelay;
extern char gszProductName[64]; extern char gszProductName[64];
extern MouseActionType LastMouseButtonAction; extern PlayerActionType LastPlayerAction;
void InitKeymapActions(); void InitKeymapActions();
void SetCursorPos(Point position); void SetCursorPos(Point position);

2
Source/init.cpp

@ -156,7 +156,7 @@ void MainWndProc(const SDL_Event &event)
break; break;
case SDL_WINDOWEVENT_LEAVE: case SDL_WINDOWEVENT_LEAVE:
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
RedrawEverything(); RedrawEverything();
break; break;
case SDL_WINDOWEVENT_CLOSE: case SDL_WINDOWEVENT_CLOSE:

2
Source/objects.cpp

@ -1519,7 +1519,7 @@ void UpdateCircle(Object &circle)
} }
AddMissile(playerOnCircle->position.tile, { 35, 46 }, Direction::South, MissileID::Phasing, TARGET_BOTH, *playerOnCircle, 0, 0); AddMissile(playerOnCircle->position.tile, { 35, 46 }, Direction::South, MissileID::Phasing, TARGET_BOTH, *playerOnCircle, 0, 0);
if (playerOnCircle == MyPlayer) { if (playerOnCircle == MyPlayer) {
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
sgbMouseDown = CLICK_NONE; sgbMouseDown = CLICK_NONE;
} }
ClrPlrPath(*playerOnCircle); ClrPlrPath(*playerOnCircle);

12
Source/player.cpp

@ -3188,21 +3188,21 @@ void CheckPlrSpell(bool isShiftHeld, SpellID spellID, SpellType spellType)
myPlayer.Say(HeroSpeech::ICantDoThat); myPlayer.Say(HeroSpeech::ICantDoThat);
break; break;
} }
LastMouseButtonAction = MouseActionType::None; LastPlayerAction = PlayerActionType::None;
} }
return; return;
} }
const int spellFrom = 0; const int spellFrom = 0;
if (IsWallSpell(spellID)) { if (IsWallSpell(spellID)) {
LastMouseButtonAction = MouseActionType::Spell; LastPlayerAction = PlayerActionType::Spell;
Direction sd = GetDirection(myPlayer.position.tile, cursPosition); Direction sd = GetDirection(myPlayer.position.tile, cursPosition);
NetSendCmdLocParam4(true, CMD_SPELLXYD, cursPosition, static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), static_cast<uint16_t>(sd), spellFrom); NetSendCmdLocParam4(true, CMD_SPELLXYD, cursPosition, static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), static_cast<uint16_t>(sd), spellFrom);
} else if (pcursmonst != -1 && !isShiftHeld && leveltype != DTYPE_TOWN) { } else if (pcursmonst != -1 && !isShiftHeld) {
LastMouseButtonAction = MouseActionType::SpellMonsterTarget; LastPlayerAction = PlayerActionType::SpellMonsterTarget;
NetSendCmdParam4(true, CMD_SPELLID, pcursmonst, static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), spellFrom); NetSendCmdParam4(true, CMD_SPELLID, pcursmonst, static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), spellFrom);
} else if (PlayerUnderCursor != nullptr && !isShiftHeld && !myPlayer.friendlyMode) { } else if (PlayerUnderCursor != nullptr && !isShiftHeld && !myPlayer.friendlyMode) {
LastMouseButtonAction = MouseActionType::SpellPlayerTarget; LastPlayerAction = PlayerActionType::SpellPlayerTarget;
NetSendCmdParam4(true, CMD_SPELLPID, PlayerUnderCursor->getId(), static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), spellFrom); NetSendCmdParam4(true, CMD_SPELLPID, PlayerUnderCursor->getId(), static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), spellFrom);
} else { } else {
Point targetedTile = cursPosition; Point targetedTile = cursPosition;
@ -3215,7 +3215,7 @@ void CheckPlrSpell(bool isShiftHeld, SpellID spellID, SpellType spellType)
targetedTile = myPlayer.position.temp + relativeMove; targetedTile = myPlayer.position.temp + relativeMove;
} }
} }
LastMouseButtonAction = MouseActionType::Spell; LastPlayerAction = PlayerActionType::Spell;
NetSendCmdLocParam3(true, CMD_SPELLXY, targetedTile, static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), spellFrom); NetSendCmdLocParam3(true, CMD_SPELLXY, targetedTile, static_cast<int8_t>(spellID), static_cast<uint8_t>(spellType), spellFrom);
} }
} }

2
Source/qol/itemlabels.cpp

@ -196,7 +196,7 @@ void DrawItemNameLabels(const Surface &out)
&& !MyPlayerIsDead && !MyPlayerIsDead
&& !IsPlayerInStore() && !IsPlayerInStore()
&& IsMouseOverGameArea() && IsMouseOverGameArea()
&& LastMouseButtonAction == MouseActionType::None) { && LastPlayerAction == PlayerActionType::None) {
isLabelHighlighted = true; isLabelHighlighted = true;
cursPosition = item.position; cursPosition = item.position;
pcursitem = label.id; pcursitem = label.id;

26
Source/track.cpp

@ -59,7 +59,7 @@ void InvalidateTargets()
} }
} }
void RepeatMouseAction() void RepeatPlayerAction()
{ {
if (pcurs != CURSOR_HAND) if (pcurs != CURSOR_HAND)
return; return;
@ -70,7 +70,7 @@ void RepeatMouseAction()
if (IsPlayerInStore()) if (IsPlayerInStore())
return; return;
if (LastMouseButtonAction == MouseActionType::None) if (LastPlayerAction == PlayerActionType::None)
return; return;
Player &myPlayer = *MyPlayer; Player &myPlayer = *MyPlayer;
@ -82,49 +82,49 @@ void RepeatMouseAction()
return; return;
bool rangedAttack = myPlayer.UsesRangedWeapon(); bool rangedAttack = myPlayer.UsesRangedWeapon();
switch (LastMouseButtonAction) { switch (LastPlayerAction) {
case MouseActionType::Attack: case PlayerActionType::Attack:
if (InDungeonBounds(cursPosition)) if (InDungeonBounds(cursPosition))
NetSendCmdLoc(MyPlayerId, true, rangedAttack ? CMD_RATTACKXY : CMD_SATTACKXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, rangedAttack ? CMD_RATTACKXY : CMD_SATTACKXY, cursPosition);
break; break;
case MouseActionType::AttackMonsterTarget: case PlayerActionType::AttackMonsterTarget:
if (pcursmonst != -1) if (pcursmonst != -1)
NetSendCmdParam1(true, rangedAttack ? CMD_RATTACKID : CMD_ATTACKID, pcursmonst); NetSendCmdParam1(true, rangedAttack ? CMD_RATTACKID : CMD_ATTACKID, pcursmonst);
break; break;
case MouseActionType::AttackPlayerTarget: case PlayerActionType::AttackPlayerTarget:
if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode)
NetSendCmdParam1(true, rangedAttack ? CMD_RATTACKPID : CMD_ATTACKPID, PlayerUnderCursor->getId()); NetSendCmdParam1(true, rangedAttack ? CMD_RATTACKPID : CMD_ATTACKPID, PlayerUnderCursor->getId());
break; break;
case MouseActionType::Spell: case PlayerActionType::Spell:
if (ControlMode != ControlTypes::KeyboardAndMouse) { if (ControlMode != ControlTypes::KeyboardAndMouse) {
UpdateSpellTarget(MyPlayer->_pRSpell); UpdateSpellTarget(MyPlayer->_pRSpell);
} }
CheckPlrSpell(ControlMode == ControlTypes::KeyboardAndMouse); CheckPlrSpell(ControlMode == ControlTypes::KeyboardAndMouse);
break; break;
case MouseActionType::SpellMonsterTarget: case PlayerActionType::SpellMonsterTarget:
if (pcursmonst != -1) if (pcursmonst != -1)
CheckPlrSpell(false); CheckPlrSpell(false);
break; break;
case MouseActionType::SpellPlayerTarget: case PlayerActionType::SpellPlayerTarget:
if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode)
CheckPlrSpell(false); CheckPlrSpell(false);
break; break;
case MouseActionType::OperateObject: case PlayerActionType::OperateObject:
if (ObjectUnderCursor != nullptr && !ObjectUnderCursor->isDoor()) { if (ObjectUnderCursor != nullptr && !ObjectUnderCursor->isDoor()) {
NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition); NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition);
} }
break; break;
case MouseActionType::Walk: case PlayerActionType::Walk:
RepeatWalk(myPlayer); RepeatWalk(myPlayer);
break; break;
case MouseActionType::None: case PlayerActionType::None:
break; break;
} }
} }
bool track_isscrolling() bool track_isscrolling()
{ {
return LastMouseButtonAction == MouseActionType::Walk; return LastPlayerAction == PlayerActionType::Walk;
} }
} // namespace devilution } // namespace devilution

2
Source/track.h

@ -8,7 +8,7 @@
namespace devilution { namespace devilution {
void InvalidateTargets(); void InvalidateTargets();
void RepeatMouseAction(); void RepeatPlayerAction();
bool track_isscrolling(); bool track_isscrolling();
} // namespace devilution } // namespace devilution

Loading…
Cancel
Save