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