From c423be629dca7357eca32500efdfbef409d39bfb Mon Sep 17 00:00:00 2001 From: NiteKat Date: Sat, 10 May 2025 18:46:42 -0400 Subject: [PATCH] Refactor and Fix Inv Paste and Witch Sell Fixes Inventory pasting and refactors it based on how DevilutionX works internally. Also fixes Adria's sell window storing wrong OldActiveStore. --- Source/dapi/Server.cpp | 62 ++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/Source/dapi/Server.cpp b/Source/dapi/Server.cpp index c51277f96..95e627650 100644 --- a/Source/dapi/Server.cpp +++ b/Source/dapi/Server.cpp @@ -1689,7 +1689,7 @@ void Server::sellItem(int itemID) devilution::PlaySFX(devilution::SfxID::MenuSelect); devilution::OldTextLine = devilution::CurrentTextLine; - devilution::OldActiveStore = devilution::TalkID::SmithSell; + devilution::OldActiveStore = devilution::ActiveStore; devilution::OldScrollPos = devilution::ScrollPos; if (!devilution::StoreGoldFit(devilution::PlayerItems[idx])) { @@ -2152,8 +2152,8 @@ void Server::putInCursor(size_t itemID) } } else { if (item.compare(devilution::Players[devilution::MyPlayerId].SpdList[i - 47]) && devilution::Players[devilution::MyPlayerId].SpdList[i - 47]._itype != devilution::ItemType::None) { - mx = devilution::InvRect[i].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[i].position.y + 1 + devilution::GetRightPanel().position.y; + mx = devilution::InvRect[i].position.x + 1 + devilution::GetMainPanel().position.x; + my = devilution::InvRect[i].position.y + 1 + devilution::GetMainPanel().position.y; break; } } @@ -2164,51 +2164,29 @@ void Server::putInCursor(size_t itemID) void Server::putCursorItem(int location) { - int mx, my; EquipSlot equipLocation = static_cast(location); if (!data->invflag) return; - if (12 <= devilution::pcurs && equipLocation <= EquipSlot::BELT8) { - mx = 0; - my = 0; - switch (equipLocation) { - case EquipSlot::HEAD: - mx = devilution::InvRect[0].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[0].position.y + 1 + devilution::GetRightPanel().position.y; - break; - case EquipSlot::LEFTRING: - mx = devilution::InvRect[1].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[1].position.y + 1 + devilution::GetRightPanel().position.y; - break; - case EquipSlot::RIGHTRING: - mx = devilution::InvRect[2].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[2].position.y + 1 + devilution::GetRightPanel().position.y; - break; - case EquipSlot::AMULET: - mx = devilution::InvRect[3].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[3].position.y + 1 + devilution::GetRightPanel().position.y; - break; - case EquipSlot::LEFTHAND: - mx = devilution::InvRect[4].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[4].position.y + 1 + devilution::GetRightPanel().position.y; - break; - case EquipSlot::RIGHTHAND: - mx = devilution::InvRect[5].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[5].position.y + 1 + devilution::GetRightPanel().position.y; - break; - case EquipSlot::BODY: - mx = devilution::InvRect[6].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[6].position.y + 1 + devilution::GetRightPanel().position.y; - break; - default: - mx = devilution::InvRect[static_cast(equipLocation)].position.x + 1 + devilution::GetRightPanel().position.x; - my = devilution::InvRect[static_cast(equipLocation)].position.y + 1 + devilution::GetRightPanel().position.y; - break; - } - devilution::CheckInvPaste(*devilution::MyPlayer, devilution::Point { mx, my }); + int invRectIndex = location; + devilution::Point cursorPosition; + devilution::Displacement panelAdjust; + if (equipLocation == EquipSlot::LEFTRING) { + invRectIndex = 1; + } else if (equipLocation == EquipSlot::RIGHTRING) { + invRectIndex = 2; } + cursorPosition = devilution::InvRect[invRectIndex].position + devilution::Displacement { 1, 1 }; + + if (equipLocation < EquipSlot::BELT1) { + panelAdjust = devilution::GetRightPanel().position - devilution::Point { 0, 0 }; + } else { + panelAdjust = devilution::GetMainPanel().position - devilution::Point { 0, 0 }; + } + + cursorPosition += panelAdjust; + devilution::CheckInvPaste(*devilution::MyPlayer, cursorPosition); } void Server::dropCursorItem()