From b821d4658755e6aba36e89a3a7f7283b7e9300c4 Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Sat, 6 Dec 2025 12:54:39 -0500 Subject: [PATCH 1/6] Improve Standing Attack --- Source/controls/plrctrls.cpp | 25 ++++++++++++++----------- Source/diablo.cpp | 8 +++----- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 37d4c1c70..89397f85d 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -510,20 +510,23 @@ void Interact() } const Player &myPlayer = *MyPlayer; + Direction pdir = myPlayer._pdir; + const AxisDirection moveDir = GetMoveDirection(); + const bool motion = moveDir.x != AxisDirectionX_NONE || moveDir.y != AxisDirectionY_NONE; - if (leveltype != DTYPE_TOWN && IsStandingGround()) { - Direction pdir = myPlayer._pdir; - const AxisDirection moveDir = GetMoveDirection(); - const bool motion = moveDir.x != AxisDirectionX_NONE || moveDir.y != AxisDirectionY_NONE; - if (motion) { - pdir = FaceDir[static_cast(moveDir.x)][static_cast(moveDir.y)]; - } + if (motion) { + pdir = FaceDir[static_cast(moveDir.x)][static_cast(moveDir.y)]; + } - Point position = myPlayer.position.tile + pdir; - if (pcursmonst != -1 && !motion) { - position = Monsters[pcursmonst].position.tile; - } + Point position = myPlayer.position.tile + pdir; + + if (pcursmonst != -1 && !motion) { + position = Monsters[pcursmonst].position.tile; + } + + bool bNear = myPlayer.position.tile.WalkingDistance(position) < 2; + if (leveltype != DTYPE_TOWN && IsStandingGround() && !bNear) { NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position); LastPlayerAction = PlayerActionType::Attack; return; diff --git a/Source/diablo.cpp b/Source/diablo.cpp index f006b2a53..64568cc81 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -245,8 +245,6 @@ bool ProcessInput() void LeftMouseCmd(bool bShift) { - bool bNear; - assert(!GetMainPanel().contains(MousePosition)); if (leveltype == DTYPE_TOWN) { @@ -264,14 +262,14 @@ void LeftMouseCmd(bool bShift) } const Player &myPlayer = *MyPlayer; - bNear = myPlayer.position.tile.WalkingDistance(cursPosition) < 2; + bool bNear = myPlayer.position.tile.WalkingDistance(cursPosition) < 2; if (pcursitem != -1 && pcurs == CURSOR_HAND && !bShift) { NetSendCmdLocParam1(true, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursPosition, pcursitem); } else if (ObjectUnderCursor != nullptr && !ObjectUnderCursor->IsDisabled() && (!bShift || (bNear && ObjectUnderCursor->_oBreak == 1))) { LastPlayerAction = PlayerActionType::OperateObject; NetSendCmdLoc(MyPlayerId, true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursPosition); } else if (myPlayer.UsesRangedWeapon()) { - if (bShift) { + if (bShift && !bNear) { LastPlayerAction = PlayerActionType::Attack; NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, cursPosition); } else if (pcursmonst != -1) { @@ -286,7 +284,7 @@ void LeftMouseCmd(bool bShift) NetSendCmdParam1(true, CMD_RATTACKPID, PlayerUnderCursor->getId()); } } else { - if (bShift) { + if (bShift && !bNear) { if (pcursmonst != -1) { if (CanTalkToMonst(Monsters[pcursmonst])) { NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); From c2f1181ccdcf67f48ba043534d856ba41122fc7d Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Sat, 6 Dec 2025 14:55:21 -0500 Subject: [PATCH 2/6] Move distance check --- Source/controls/plrctrls.cpp | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 89397f85d..590b7fb4e 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -510,26 +510,25 @@ void Interact() } const Player &myPlayer = *MyPlayer; - Direction pdir = myPlayer._pdir; - const AxisDirection moveDir = GetMoveDirection(); - const bool motion = moveDir.x != AxisDirectionX_NONE || moveDir.y != AxisDirectionY_NONE; - if (motion) { - pdir = FaceDir[static_cast(moveDir.x)][static_cast(moveDir.y)]; - } - - Point position = myPlayer.position.tile + pdir; - - if (pcursmonst != -1 && !motion) { - position = Monsters[pcursmonst].position.tile; - } + if (leveltype != DTYPE_TOWN && IsStandingGround()) { + Direction pdir = myPlayer._pdir; + const AxisDirection moveDir = GetMoveDirection(); + const bool motion = moveDir.x != AxisDirectionX_NONE || moveDir.y != AxisDirectionY_NONE; + if (motion) { + pdir = FaceDir[static_cast(moveDir.x)][static_cast(moveDir.y)]; + } - bool bNear = myPlayer.position.tile.WalkingDistance(position) < 2; + Point position = myPlayer.position.tile + pdir; + if (pcursmonst != -1 && !motion) { + position = Monsters[pcursmonst].position.tile; + } - if (leveltype != DTYPE_TOWN && IsStandingGround() && !bNear) { - NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position); - LastPlayerAction = PlayerActionType::Attack; - return; + if (myPlayer.position.tile.WalkingDistance(position) > 1) { + NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position); + LastPlayerAction = PlayerActionType::Attack; + return; + } } if (pcursmonst != -1) { From 00440184e5dc7939811c499929fb38a7d818c0b0 Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Sat, 6 Dec 2025 15:56:01 -0500 Subject: [PATCH 3/6] Fix broken logic --- Source/controls/plrctrls.cpp | 4 ++- Source/diablo.cpp | 51 ++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 590b7fb4e..1207d64c4 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -524,7 +524,9 @@ void Interact() position = Monsters[pcursmonst].position.tile; } - if (myPlayer.position.tile.WalkingDistance(position) > 1) { + bool bNear = myPlayer.position.tile.WalkingDistance(position) < 2; + + if (!(bNear && (pcursmonst != -1 || PlayerUnderCursor != nullptr))) { NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position); LastPlayerAction = PlayerActionType::Attack; return; diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 64568cc81..468928c5b 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -269,10 +269,7 @@ void LeftMouseCmd(bool bShift) LastPlayerAction = PlayerActionType::OperateObject; NetSendCmdLoc(MyPlayerId, true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursPosition); } else if (myPlayer.UsesRangedWeapon()) { - if (bShift && !bNear) { - LastPlayerAction = PlayerActionType::Attack; - NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, cursPosition); - } else if (pcursmonst != -1) { + if (pcursmonst != -1) { if (CanTalkToMonst(Monsters[pcursmonst])) { NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); } else { @@ -282,20 +279,18 @@ void LeftMouseCmd(bool bShift) } else if (PlayerUnderCursor != nullptr && !myPlayer.friendlyMode) { LastPlayerAction = PlayerActionType::AttackPlayerTarget; NetSendCmdParam1(true, CMD_RATTACKPID, PlayerUnderCursor->getId()); + } else if (bShift) { + LastPlayerAction = PlayerActionType::Attack; + NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, cursPosition); } } else { - if (bShift && !bNear) { - if (pcursmonst != -1) { - if (CanTalkToMonst(Monsters[pcursmonst])) { - NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); - } else { - LastPlayerAction = PlayerActionType::Attack; - NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); - } - } else { - LastPlayerAction = PlayerActionType::Attack; - NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); + if (bShift && !(bNear && (pcursmonst != -1 || PlayerUnderCursor != nullptr))) { + if (pcursmonst != -1 && CanTalkToMonst(Monsters[pcursmonst])) { + NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); + return; } + LastPlayerAction = PlayerActionType::Attack; + NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); } else if (pcursmonst != -1) { LastPlayerAction = PlayerActionType::AttackMonsterTarget; NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); @@ -2234,31 +2229,31 @@ void InitPadmapActions() N_("Move up"), N_("Moves the player character up."), ControllerButton_BUTTON_DPAD_UP, - [] {}); + [] { }); options.Padmapper.AddAction( "MoveDown", N_("Move down"), N_("Moves the player character down."), ControllerButton_BUTTON_DPAD_DOWN, - [] {}); + [] { }); options.Padmapper.AddAction( "MoveLeft", N_("Move left"), N_("Moves the player character left."), ControllerButton_BUTTON_DPAD_LEFT, - [] {}); + [] { }); options.Padmapper.AddAction( "MoveRight", N_("Move right"), N_("Moves the player character right."), ControllerButton_BUTTON_DPAD_RIGHT, - [] {}); + [] { }); options.Padmapper.AddAction( "StandGround", N_("Stand ground"), N_("Hold to prevent the player from moving."), ControllerButton_NONE, - [] {}); + [] { }); options.Padmapper.AddAction( "ToggleStandGround", N_("Toggle stand ground"), @@ -2344,49 +2339,49 @@ void InitPadmapActions() 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( "MouseUp", N_("Move mouse up"), N_("Simulates upward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_UP }, - [] {}); + [] { }); options.Padmapper.AddAction( "MouseDown", N_("Move mouse down"), N_("Simulates downward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_DOWN }, - [] {}); + [] { }); options.Padmapper.AddAction( "MouseLeft", N_("Move mouse left"), N_("Simulates leftward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_LEFT }, - [] {}); + [] { }); options.Padmapper.AddAction( "MouseRight", N_("Move mouse right"), N_("Simulates rightward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_RIGHT }, - [] {}); + [] { }); auto leftMouseDown = [] { const ControllerButtonCombo standGroundCombo = GetOptions().Padmapper.ButtonComboForAction("StandGround"); const bool standGround = StandToggle || IsControllerButtonComboPressed(standGroundCombo); From c36696a0c4dfcdd2468ca76e410b1dbf3568cdf6 Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Sat, 6 Dec 2025 16:01:14 -0500 Subject: [PATCH 4/6] clang --- Source/diablo.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 468928c5b..aaa2b602d 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -2229,31 +2229,31 @@ void InitPadmapActions() N_("Move up"), N_("Moves the player character up."), ControllerButton_BUTTON_DPAD_UP, - [] { }); + [] {}); options.Padmapper.AddAction( "MoveDown", N_("Move down"), N_("Moves the player character down."), ControllerButton_BUTTON_DPAD_DOWN, - [] { }); + [] {}); options.Padmapper.AddAction( "MoveLeft", N_("Move left"), N_("Moves the player character left."), ControllerButton_BUTTON_DPAD_LEFT, - [] { }); + [] {}); options.Padmapper.AddAction( "MoveRight", N_("Move right"), N_("Moves the player character right."), ControllerButton_BUTTON_DPAD_RIGHT, - [] { }); + [] {}); options.Padmapper.AddAction( "StandGround", N_("Stand ground"), N_("Hold to prevent the player from moving."), ControllerButton_NONE, - [] { }); + [] {}); options.Padmapper.AddAction( "ToggleStandGround", N_("Toggle stand ground"), From ecf7bbde22fd4af20df1ecb5feeb47860db7654f Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Sat, 6 Dec 2025 16:01:57 -0500 Subject: [PATCH 5/6] clang --- Source/diablo.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/diablo.cpp b/Source/diablo.cpp index aaa2b602d..cf672a48e 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -2339,49 +2339,49 @@ void InitPadmapActions() 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( "MouseUp", N_("Move mouse up"), N_("Simulates upward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_UP }, - [] { }); + [] {}); options.Padmapper.AddAction( "MouseDown", N_("Move mouse down"), N_("Simulates downward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_DOWN }, - [] { }); + [] {}); options.Padmapper.AddAction( "MouseLeft", N_("Move mouse left"), N_("Simulates leftward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_LEFT }, - [] { }); + [] {}); options.Padmapper.AddAction( "MouseRight", N_("Move mouse right"), N_("Simulates rightward mouse movement."), { ControllerButton_BUTTON_BACK, ControllerButton_BUTTON_DPAD_RIGHT }, - [] { }); + [] {}); auto leftMouseDown = [] { const ControllerButtonCombo standGroundCombo = GetOptions().Padmapper.ButtonComboForAction("StandGround"); const bool standGround = StandToggle || IsControllerButtonComboPressed(standGroundCombo); From 214850aa384759c4671a6b2b532d0c0206b408f8 Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Wed, 10 Dec 2025 02:48:30 -0500 Subject: [PATCH 6/6] Update CHANGELOG.md --- docs/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1617ce738..6e2fef0ee 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Features + +#### Gameplay + +- Stand ground attacks nearby targets instead of nearby tiles to improve accuracy + ## DevilutionX 1.5.2 ### Bug Fixes