/** * @file stores.h * * Interface of functionality for stores and towner dialogs. */ #pragma once #include #include #include "DiabloUI/ui_flags.hpp" #include "control/control.hpp" #include "engine/clx_sprite.hpp" #include "engine/surface.hpp" #include "game_mode.hpp" #include "items.h" #include "utils/attributes.h" #include "utils/static_vector.hpp" namespace devilution { constexpr int NumSmithBasicItems = 19; constexpr int NumSmithBasicItemsHf = 24; constexpr int NumSmithItems = 6; constexpr int NumSmithItemsHf = 15; constexpr int NumHealerItems = 17; constexpr int NumHealerItemsHf = 19; constexpr int NumHealerPinnedItems = 2; constexpr int NumHealerPinnedItemsMp = 3; constexpr int NumWitchItems = 17; constexpr int NumWitchItemsHf = 24; constexpr int NumWitchPinnedItems = 3; constexpr int NumStoreLines = 104; enum class TalkID : uint8_t { None, Smith, SmithBuy, SmithSell, SmithRepair, Witch, WitchBuy, WitchSell, WitchRecharge, NoMoney, NoRoom, Confirm, Boy, BoyBuy, Healer, Storyteller, HealerBuy, StorytellerIdentify, SmithPremiumBuy, Gossip, StorytellerIdentifyShow, Tavern, Drunk, Barmaid, }; /** Currently active store */ extern DVL_API_FOR_TEST TalkID ActiveStore; /** Current index into PlayerItemIndexes/PlayerItems */ extern DVL_API_FOR_TEST int CurrentItemIndex; /** Map of inventory items being presented in the store */ extern int8_t PlayerItemIndexes[48]; /** Copies of the players items as presented in the store */ extern DVL_API_FOR_TEST Item PlayerItems[48]; /** Items sold by Griswold */ extern DVL_API_FOR_TEST StaticVector SmithItems; /** Number of premium items for sale by Griswold */ extern DVL_API_FOR_TEST int PremiumItemCount; /** Base level of current premium items sold by Griswold */ extern DVL_API_FOR_TEST int PremiumItemLevel; /** Premium items sold by Griswold */ extern DVL_API_FOR_TEST StaticVector PremiumItems; /** Items sold by Pepin */ extern DVL_API_FOR_TEST StaticVector HealerItems; /** Items sold by Adria */ extern DVL_API_FOR_TEST StaticVector WitchItems; /** Current level of the item sold by Wirt */ extern DVL_API_FOR_TEST int BoyItemLevel; /** Current item sold by Wirt */ extern DVL_API_FOR_TEST Item BoyItem; /** Currently selected text line from TextLine */ extern DVL_API_FOR_TEST int CurrentTextLine; /** Remember currently selected text line from TextLine while displaying a dialog */ extern DVL_API_FOR_TEST int OldTextLine; /** Scroll position */ extern DVL_API_FOR_TEST int ScrollPos; /** Remember last scroll position */ extern DVL_API_FOR_TEST int OldScrollPos; /** Remember current store while displaying a dialog */ extern DVL_API_FOR_TEST TalkID OldActiveStore; /** Temporary item used to hold the item being traded */ extern DVL_API_FOR_TEST Item TempItem; void AddStoreHoldRepair(Item *itm, int8_t i); /** Clears premium items sold by Griswold and Wirt. */ void InitStores(); /** Spawns items sold by vendors, including premium items sold by Griswold and Wirt. */ void SetupTownStores(); void FreeStoreMem(); void PrintSString(const Surface &out, int margin, int line, std::string_view text, UiFlags flags, int price = 0, int cursId = -1, bool cursIndent = false); void DrawSLine(const Surface &out, int sy); void DrawSTextHelp(); void ClearSText(int s, int e); void StartStore(TalkID s); void DrawSText(const Surface &out); void StoreESC(); void StoreUp(); void StoreDown(); void StorePrior(); void StoreNext(); void TakePlrsMoney(int cost); void StoreEnter(); void CheckStoreBtn(); void ReleaseStoreBtn(); bool IsPlayerInStore(); /** * @brief Places an item in the player's inventory, belt, or equipment. * @param item The item to place. * @param persistItem If true, actually place the item. If false, just check if it can be placed. * @return true if the item can be/was placed. */ bool StoreAutoPlace(Item &item, bool persistItem); bool PlayerCanAfford(int price); /** * @brief Check if Griswold will buy this item. * @param item The item to check. * @return true if the item can be sold to Griswold. */ bool SmithWillBuy(const Item &item); /** * @brief Check if Adria will buy this item. * @param item The item to check. * @return true if the item can be sold to Adria. */ bool WitchWillBuy(const Item &item); } // namespace devilution