Browse Source

Add Stash Support Part 1

Adds the start of support for the API to utilize the stash. Gold deposits and withdrawl is handled, and technically the API can place and remove items from the stash; however I believe I still need to add page controls and providing the layout of the active page through the API.
pull/7983/head
NiteKat 2 months ago
parent
commit
21e0b2fc6f
  1. 30
      Source/dapi/Backend/Messages/game.proto
  2. 5
      Source/dapi/GameData.h
  3. 86
      Source/dapi/Server.cpp
  4. 102
      Source/dapi/Server.h

30
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;
}

5
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<int, PlayerData> playerList;
std::vector<ItemData> itemList;
std::vector<int> groundItems;
std::vector<int> stashItems;
std::map<int, TownerData> townerList;
std::vector<StoreOption> storeList;
std::vector<int> storeItems;

86
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<int>(EquipSlot::STASH1);
for (auto point : devilution::StashGridRange) {
if (static_cast<EquipSlot>(i) != equipLocation) {
i++;
} else {
cursorPosition = devilution::GetStashSlotCoord(point);
break;
}
}
devilution::CheckStashItem(cursorPosition);
//cursorPosition = devilution::StashGridRange[invRectIndex] + panelOffset + hotPixelCellOffset;
}
}
void Server::dropCursorItem()

102
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 {

Loading…
Cancel
Save