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.
189 lines
4.6 KiB
189 lines
4.6 KiB
/** |
|
* @file qol/visual_store.h |
|
* |
|
* Interface of visual grid-based store UI. |
|
*/ |
|
#pragma once |
|
|
|
#include <cstdint> |
|
#include <span> |
|
#include <vector> |
|
|
|
#include "engine/point.hpp" |
|
#include "engine/surface.hpp" |
|
#include "items.h" |
|
#include "utils/attributes.h" |
|
|
|
namespace devilution { |
|
|
|
enum class VisualStoreVendor : uint8_t { |
|
Smith, |
|
Witch, |
|
Healer, |
|
Boy |
|
}; |
|
|
|
enum class VisualStoreTab : uint8_t { |
|
Basic = 0, |
|
Premium = 1 |
|
}; |
|
|
|
// Grid: 10x9 = 90 slots per page |
|
inline constexpr int VisualStoreGridWidth = 10; |
|
inline constexpr int VisualStoreGridHeight = 9; |
|
|
|
struct VisualStoreItem { |
|
uint16_t index; // Index in the vendor's item list |
|
Point position; // Top-left position in the grid |
|
}; |
|
|
|
struct VisualStorePage { |
|
std::vector<VisualStoreItem> items; |
|
uint16_t grid[VisualStoreGridWidth][VisualStoreGridHeight]; |
|
}; |
|
|
|
struct VisualStoreState { |
|
VisualStoreVendor vendor; |
|
VisualStoreTab activeTab; // For Smith: Regular vs Premium |
|
unsigned currentPage; |
|
std::vector<VisualStorePage> pages; |
|
}; |
|
|
|
extern DVL_API_FOR_TEST bool IsVisualStoreOpen; |
|
extern DVL_API_FOR_TEST VisualStoreState VisualStore; |
|
extern DVL_API_FOR_TEST int16_t pcursstoreitem; // Currently highlighted store item index (-1 if none) |
|
extern DVL_API_FOR_TEST int16_t pcursstorebtn; |
|
|
|
/** |
|
* @brief Load visual store graphics. |
|
*/ |
|
void InitVisualStore(); |
|
|
|
/** |
|
* @brief Free visual store graphics. |
|
*/ |
|
void FreeVisualStoreGFX(); |
|
|
|
/** |
|
* @brief Open the visual store for a vendor. |
|
* Opens both the store panel (left) and inventory panel (right). |
|
* @param vendor The vendor to open the store for. |
|
*/ |
|
void OpenVisualStore(VisualStoreVendor vendor); |
|
|
|
/** |
|
* @brief Close the visual store and inventory panels. |
|
*/ |
|
void CloseVisualStore(); |
|
|
|
/** |
|
* @brief Set the active tab for Smith (Regular/Premium). |
|
* @param tab The tab to switch to. |
|
*/ |
|
void SetVisualStoreTab(VisualStoreTab tab); |
|
|
|
/** |
|
* @brief Navigate to the next page of store items. |
|
*/ |
|
void VisualStoreNextPage(); |
|
|
|
/** |
|
* @brief Navigate to the previous page of store items. |
|
*/ |
|
void VisualStorePreviousPage(); |
|
|
|
/** |
|
* @brief Render the visual store panel to the given buffer. |
|
*/ |
|
void DrawVisualStore(const Surface &out); |
|
|
|
/** |
|
* @brief Handle a click on the visual store panel. |
|
* @param mousePosition The mouse position. |
|
*/ |
|
void CheckVisualStoreItem(Point mousePosition, bool isCtrlHeld, bool isShiftHeld); |
|
|
|
/** |
|
* @brief Handle dropping an item on the visual store to sell. |
|
* @param mousePosition The mouse position. |
|
*/ |
|
void CheckVisualStorePaste(Point mousePosition); |
|
|
|
/** |
|
* @brief Check for item highlight under the cursor. |
|
* @param mousePosition The mouse position. |
|
* @return The index of the highlighted item, or -1 if none. |
|
*/ |
|
int16_t CheckVisualStoreHLight(Point mousePosition); |
|
|
|
/** |
|
* @brief Handle button press in the visual store. |
|
* @param mousePosition The mouse position. |
|
*/ |
|
void CheckVisualStoreButtonPress(Point mousePosition); |
|
|
|
/** |
|
* @brief Handle button release in the visual store. |
|
* @param mousePosition The mouse position. |
|
*/ |
|
void CheckVisualStoreButtonRelease(Point mousePosition); |
|
|
|
/** |
|
* @brief Check if an item can be sold to the current vendor. |
|
* @param item The item to check. |
|
* @return true if the item can be sold. |
|
*/ |
|
bool CanSellToCurrentVendor(const Item &item); |
|
|
|
/** |
|
* @brief Sell an item from the player's inventory to the current vendor. |
|
* @param invIndex The inventory index of the item. |
|
*/ |
|
void SellItemToVisualStore(int invIndex); |
|
|
|
/** |
|
* @brief Get the number of items for the current vendor/tab. |
|
* @return The item count. |
|
*/ |
|
int GetVisualStoreItemCount(); |
|
|
|
/** |
|
* @brief Get the items array for the current vendor/tab. |
|
* @return A span of items. |
|
*/ |
|
std::span<Item> GetVisualStoreItems(); |
|
|
|
/** |
|
* @brief Get the total number of pages for the current vendor/tab. |
|
* @return The page count. |
|
*/ |
|
int GetVisualStorePageCount(); |
|
|
|
/** |
|
* @brief Convert a grid slot position to screen coordinates. |
|
* @param slot The grid slot position. |
|
* @return The screen coordinates. |
|
*/ |
|
Point GetVisualStoreSlotCoord(Point slot); |
|
|
|
/** |
|
* @brief Gets the point for a btn on the panel. |
|
* @param slot Btn id. |
|
* @return The screen coordinates. |
|
*/ |
|
Rectangle GetVisualBtnCoord(int btnId); |
|
|
|
/** |
|
* @brief Calculate the cost to repair an item. |
|
* @param item The item to repair. |
|
* @return The cost in gold. |
|
*/ |
|
int GetRepairCost(const Item &item); |
|
|
|
/** |
|
* @brief Repair a specific item from the player's inventory/body. |
|
* @param invIndex The inventory index of the item. |
|
*/ |
|
void VisualStoreRepairItem(int invIndex); |
|
|
|
} // namespace devilution
|
|
|