You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

105 lines
2.9 KiB

/**
* @file qol/stash.h
*
* Interface of player stash.
*/
#pragma once
#include <cstdint>
#include <map>
#include <vector>
#include "engine/point.hpp"
#include "items.h"
namespace devilution {
class StashStruct {
public:
using StashCell = uint16_t;
using StashGrid = std::array<std::array<StashCell, 10>, 10>;
static constexpr StashCell EmptyCell = -1;
void RemoveStashItem(StashCell iv);
std::map<unsigned, StashGrid> stashGrids;
std::vector<Item> stashList;
int gold;
bool dirty = false;
unsigned GetPage() const
{
return page;
}
StashGrid &GetCurrentGrid()
{
return stashGrids[GetPage()];
}
/**
* @brief Returns the 0-based index of the item at the specified position, or EmptyCell if no item occupies that slot
* @param gridPosition x,y coordinate of the current stash page
* @return a value which can be used to index into stashList or StashStruct::EmptyCell
*/
StashCell GetItemIdAtPosition(Point gridPosition)
{
// Because StashCell is an unsigned type we can let this underflow
return GetCurrentGrid()[gridPosition.x][gridPosition.y] - 1;
}
bool IsItemAtPosition(Point gridPosition)
{
return GetItemIdAtPosition(gridPosition) != EmptyCell;
}
void SetPage(unsigned newPage);
void NextPage(unsigned offset = 1);
void PreviousPage(unsigned offset = 1);
/** @brief Updates _iStatFlag for all stash items. */
void RefreshItemStatFlags();
private:
/** Current Page */
unsigned page;
};
constexpr Point InvalidStashPoint { -1, -1 };
extern bool IsStashOpen;
extern StashStruct Stash;
extern bool IsWithdrawGoldOpen;
extern int WithdrawGoldValue;
Point GetStashSlotCoord(Point slot);
void InitStash();
void FreeStashGFX();
void TransferItemToInventory(Player &player, uint16_t itemId);
/**
* @brief Render the inventory panel to the given buffer.
*/
void DrawStash(const Surface &out);
void CheckStashItem(Point mousePosition, bool isShiftHeld = false, bool isCtrlHeld = false);
bool UseStashItem(uint16_t cii);
uint16_t CheckStashHLight(Point mousePosition);
void CheckStashButtonRelease(Point mousePosition);
void CheckStashButtonPress(Point mousePosition);
void StartGoldWithdraw();
void WithdrawGoldKeyPress(char vkey);
void DrawGoldWithdraw(const Surface &out, int amount);
void CloseGoldWithdraw();
void GoldWithdrawNewText(string_view text);
/**
* @brief Checks whether the given item can be placed on the specified player's stash.
* If 'persistItem' is 'True', the item is also placed in the inventory.
* @param player The player to check.
* @param item The item to be checked.
* @param persistItem Pass 'True' to actually place the item in the inventory. The default is 'False'.
* @return 'True' in case the item can be placed on the player's inventory and 'False' otherwise.
*/
bool AutoPlaceItemInStash(Player &player, const Item &item, bool persistItem);
} // namespace devilution