diff --git a/Source/dapi/Backend/Messages/game.proto b/Source/dapi/Backend/Messages/game.proto index a5d28451e..7f3fe301e 100644 --- a/Source/dapi/Backend/Messages/game.proto +++ b/Source/dapi/Backend/Messages/game.proto @@ -20,19 +20,21 @@ message FrameUpdate { uint32 gameMode = 13; uint32 gnDifficulty = 14; uint32 connectedTo = 15; + uint32 stashGold = 16; - repeated dapi.data.TileData dPiece = 16; - repeated dapi.data.PlayerData playerData = 17; - repeated dapi.data.ItemData itemData = 18; - repeated uint32 groundItemID = 19; - repeated dapi.data.TownerData townerData = 20; - repeated uint32 storeOption = 21; - repeated uint32 storeItems = 22; - repeated dapi.data.TriggerData triggerData = 23; - repeated dapi.data.MonsterData monsterData = 24; - repeated dapi.data.ObjectData objectData = 25; - repeated dapi.data.MissileData missileData = 26; - repeated dapi.data.PortalData portalData = 27; - repeated dapi.data.QuestData questData = 28; - repeated string chatMessages = 29; + repeated dapi.data.TileData dPiece = 17; + repeated dapi.data.PlayerData playerData = 18; + repeated dapi.data.ItemData itemData = 19; + repeated uint32 groundItemID = 20; + repeated dapi.data.TownerData townerData = 21; + repeated uint32 storeOption = 22; + repeated uint32 storeItems = 23; + repeated uint32 stashItems = 24; + repeated dapi.data.TriggerData triggerData = 25; + repeated dapi.data.MonsterData monsterData = 26; + repeated dapi.data.ObjectData objectData = 27; + repeated dapi.data.MissileData missileData = 28; + repeated dapi.data.PortalData portalData = 29; + repeated dapi.data.QuestData questData = 30; + repeated string chatMessages = 31; } diff --git a/Source/dapi/GameData.h b/Source/dapi/GameData.h index 0a245483e..00cb09ae8 100644 --- a/Source/dapi/GameData.h +++ b/Source/dapi/GameData.h @@ -21,7 +21,8 @@ enum struct StoreOption { SELL, REPAIR, RECHARGE, - BACK + BACK, + ACCESSSTORAGE }; struct GameData { @@ -31,11 +32,13 @@ struct GameData { bool invflag; bool qtextflag; int currlevel; + int stashGold; size_t lastLogSize; std::map playerList; std::vector itemList; std::vector groundItems; + std::vector stashItems; std::map townerList; std::vector storeList; std::vector storeItems; diff --git a/Source/dapi/Server.cpp b/Source/dapi/Server.cpp index 6edc078aa..e8aa4992d 100644 --- a/Source/dapi/Server.cpp +++ b/Source/dapi/Server.cpp @@ -542,6 +542,8 @@ void Server::updateGameData() data->storeList.push_back(StoreOption::REPAIR); else if (!strcmp(devilution::TextLine[i].text.c_str(), "Recharge staves")) data->storeList.push_back(StoreOption::RECHARGE); + else if (!strcmp(devilution::TextLine[i].text.c_str(), "Access Storage")) + data->storeList.push_back(StoreOption::ACCESSSTORAGE); } } @@ -918,6 +920,28 @@ void Server::updateGameData() playerData->set_pmanashield(data->playerList[i].pManaShield); } + data->stashItems.clear(); + for (auto &stashItem : devilution::Stash.stashList) { + if (stashItem.isEmpty()) { + continue; + } + size_t itemID = data->itemList.size(); + for (size_t k = 0; k < data->itemList.size(); k++) { + if (data->itemList[k].compare(stashItem)) { + itemID = k; + break; + } + } + if (itemID == data->itemList.size()) + data->itemList.push_back(ItemData {}); + fullFillItemInfo(itemID, &stashItem); + data->stashItems.push_back(itemID); + update->add_stashitems(itemID); + } + + data->stashGold = devilution::Stash.gold; + update->set_stashgold(devilution::Stash.gold); + auto emptyFillItemInfo = [&](int itemID, devilution::Item *item) { itemsModified.push_back(itemID); @@ -1433,7 +1457,7 @@ void Server::selectStoreOption(StoreOption option) break; case StoreOption::WIRTPEEK: if (devilution::ActiveStore == devilution::TalkID::Boy) { - if (50 <= devilution::Players[devilution::MyPlayerId]._pGold) { + if (devilution::PlayerCanAfford(50)) { devilution::TakePlrsMoney(50); devilution::PlaySFX(devilution::SfxID::MenuSelect); devilution::StartStore(devilution::TalkID::BoyBuy); @@ -1472,6 +1496,14 @@ void Server::selectStoreOption(StoreOption option) break; } break; + case StoreOption::ACCESSSTORAGE: + if (devilution::ActiveStore != devilution::TalkID::Barmaid) + break; + devilution::ActiveStore = devilution::TalkID::None; + devilution::IsStashOpen = true; + devilution::Stash.RefreshItemStatFlags(); + devilution::invflag = true; + break; default: break; } @@ -1904,6 +1936,7 @@ void Server::toggleCharacterScreen() return; devilution::CharFlag = !devilution::CharFlag; + devilution::IsStashOpen = false; } void Server::increaseStat(CommandType commandType) @@ -2081,6 +2114,8 @@ void Server::toggleInventory() return; devilution::invflag = !devilution::invflag; + if (!devilution::invflag) + devilution::IsStashOpen = false; } void Server::putInCursor(size_t itemID) @@ -2096,7 +2131,7 @@ void Server::putInCursor(size_t itemID) mx = 0; my = 0; - for (int i = 0; i < 55; i++) { + for (int i = 0; i < 105; i++) { if (i < 7) { if (item.compare(devilution::Players[devilution::MyPlayerId].InvBody[i]) && devilution::Players[devilution::MyPlayerId].InvBody[i]._itype != devilution::ItemType::None) { if (!devilution::invflag) @@ -2152,12 +2187,33 @@ void Server::putInCursor(size_t itemID) } break; } - } else { + } else if (i < 55) { 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::GetMainPanel().position.x; my = devilution::InvRect[i].position.y + 1 + devilution::GetMainPanel().position.y; break; } + } else { + int j = 55; + for (auto point : devilution::StashGridRange) { + if (j != i) { + continue; + } + const devilution::StashStruct::StashCell itemId = devilution::Stash.GetItemIdAtPosition(point); + if (itemId == devilution::StashStruct::EmptyCell) { + continue; + } + devilution::Item &stashItem = devilution::Stash.stashList[itemId]; + if (stashItem.isEmpty()) { + continue; + } + if (item.compare(stashItem)) { + auto cursorPosition = devilution::GetStashSlotCoord(point); + devilution::CheckStashItem(point); + return; + } + j++; + } } } if (mx != 0 && my != 0) @@ -2185,7 +2241,10 @@ void Server::putCursorItem(int location) } if (equipLocation < EquipSlot::BELT1) { panelOffset = devilution::GetRightPanel().position - devilution::Point { 0, 0 }; - } else { + } else if (EquipSlot::BELT8 < equipLocation) { + panelOffset = devilution::GetLeftPanel().position - devilution::Point { 0, 0 }; + } + else { panelOffset = devilution::GetMainPanel().position - devilution::Point { 0, 0 }; } if (EquipSlot::INV1 <= equipLocation && equipLocation <= EquipSlot::INV40) { @@ -2197,9 +2256,22 @@ void Server::putCursorItem(int location) } else { hotPixelCellOffset = devilution::Displacement { 1, 1 }; } - - cursorPosition = devilution::InvRect[invRectIndex].position + panelOffset + hotPixelCellOffset; - devilution::CheckInvPaste(*devilution::MyPlayer, cursorPosition); + if (equipLocation < EquipSlot::STASH1) { + cursorPosition = devilution::InvRect[invRectIndex].position + panelOffset + hotPixelCellOffset; + devilution::CheckInvPaste(*devilution::MyPlayer, cursorPosition); + } else { + int i = static_cast(EquipSlot::STASH1); + for (auto point : devilution::StashGridRange) { + if (static_cast(i) != equipLocation) { + i++; + } else { + cursorPosition = devilution::GetStashSlotCoord(point); + break; + } + } + devilution::CheckStashItem(cursorPosition); + //cursorPosition = devilution::StashGridRange[invRectIndex] + panelOffset + hotPixelCellOffset; + } } void Server::dropCursorItem() diff --git a/Source/dapi/Server.h b/Source/dapi/Server.h index 31d95c51e..b698987da 100644 --- a/Source/dapi/Server.h +++ b/Source/dapi/Server.h @@ -189,7 +189,107 @@ enum struct EquipSlot { BELT5 = 51, BELT6 = 52, BELT7 = 53, - BELT8 = 54 + BELT8 = 54, + STASH1 = 55, + STASH2 = 56, + STASH3 = 57, + STASH4 = 58, + STASH5 = 59, + STASH6 = 60, + STASH7 = 61, + STASH8 = 62, + STASH9 = 63, + STASH10 = 64, + STASH11 = 65, + STASH12 = 66, + STASH13 = 67, + STASH14 = 68, + STASH15 = 69, + STASH16 = 70, + STASH17 = 71, + STASH18 = 72, + STASH19 = 73, + STASH20 = 74, + STASH21 = 75, + STASH22 = 76, + STASH23 = 77, + STASH24 = 78, + STASH25 = 79, + STASH26 = 80, + STASH27 = 81, + STASH28 = 82, + STASH29 = 83, + STASH30 = 84, + STASH31 = 85, + STASH32 = 86, + STASH33 = 87, + STASH34 = 88, + STASH35 = 89, + STASH36 = 90, + STASH37 = 91, + STASH38 = 92, + STASH39 = 93, + STASH40 = 94, + STASH41 = 95, + STASH42 = 96, + STASH43 = 97, + STASH44 = 98, + STASH45 = 99, + STASH46 = 100, + STASH47 = 101, + STASH48 = 102, + STASH49 = 103, + STASH50 = 104, + STASH51 = 105, + STASH52 = 106, + STASH53 = 107, + STASH54 = 108, + STASH55 = 109, + STASH56 = 110, + STASH57 = 111, + STASH58 = 112, + STASH59 = 113, + STASH60 = 114, + STASH61 = 115, + STASH62 = 116, + STASH63 = 117, + STASH64 = 118, + STASH65 = 119, + STASH66 = 120, + STASH67 = 121, + STASH68 = 122, + STASH69 = 123, + STASH70 = 124, + STASH71 = 125, + STASH72 = 126, + STASH73 = 127, + STASH74 = 128, + STASH75 = 129, + STASH76 = 130, + STASH77 = 131, + STASH78 = 132, + STASH79 = 133, + STASH80 = 134, + STASH81 = 135, + STASH82 = 136, + STASH83 = 137, + STASH84 = 138, + STASH85 = 139, + STASH86 = 140, + STASH87 = 141, + STASH88 = 142, + STASH89 = 143, + STASH90 = 144, + STASH91 = 145, + STASH92 = 146, + STASH93 = 147, + STASH94 = 148, + STASH95 = 149, + STASH96 = 150, + STASH97 = 151, + STASH98 = 152, + STASH99 = 153, + STASH100 = 154 }; enum struct Backend {