/* * File: invent.h * Summary: Functions for inventory related commands. * Written by: Linley Henzell */ #ifndef INVENT_H #define INVENT_H #include #include #include "menu.h" #include "enum.h" #include "itemname.h" enum object_selector { OSEL_ANY = -1, OSEL_WIELD = -2, OSEL_UNIDENT = -3, OSEL_EQUIP = -4, OSEL_RECHARGE = -5, OSEL_ENCH_ARM = -6, OSEL_VAMP_EAT = -7, OSEL_DRAW_DECK = -8, OSEL_THROWABLE = -9, OSEL_BUTCHERY = -10, OSEL_EVOKABLE = -11, OSEL_WORN_ARMOUR = -12, OSEL_FRUIT = -13, OSEL_PONDER_ARM = -14 }; #define PROMPT_ABORT -1 #define PROMPT_GOT_SPECIAL -2 #define PROMPT_NOTHING -3 #define PROMPT_INAPPROPRIATE -4 struct SelItem { int slot; int quantity; const item_def *item; SelItem() : slot(0), quantity(0), item(NULL) { } SelItem( int s, int q, const item_def *it = NULL ) : slot(s), quantity(q), item(it) { } }; typedef std::string (*invtitle_annotator)( const Menu *m, const std::string &oldtitle); struct InvTitle : public MenuEntry { Menu *m; invtitle_annotator titlefn; InvTitle( Menu *mn, const std::string &title, invtitle_annotator tfn ); std::string get_text() const; }; class InvShowPrices; class InvEntry : public MenuEntry { private: static bool show_prices; static bool show_glyph; static void set_show_prices(bool doshow); mutable std::string basename; mutable std::string qualname; friend class InvShowPrices; public: const item_def *item; InvEntry( const item_def &i ); std::string get_text() const; void set_show_glyph(bool doshow); const std::string &get_basename() const; const std::string &get_qualname() const; const std::string &get_fullname() const; bool is_item_cursed() const; bool is_item_glowing() const; bool is_item_ego() const; bool is_item_art() const; bool is_item_equipped() const; int item_freshness() const; virtual int highlight_colour() const { return menu_colour(get_text(), menu_colour_item_prefix( *( (item_def*) item) ), tag ); } virtual void select( int qty = -1 ); virtual std::string get_filter_text() const; #ifdef USE_TILE virtual bool get_tiles(std::vector& tiles) const; #endif private: void add_class_hotkeys(const item_def &i); }; class InvShowPrices { public: InvShowPrices(bool doshow = true); ~InvShowPrices(); }; class InvMenu : public Menu { public: InvMenu(int mflags = MF_MULTISELECT); public: unsigned char getkey() const; void set_preselect(const std::vector *pre); void set_type(menu_type t); // Sets function to annotate the title with meta-information if needed. // If you set this, do so *before* calling set_title, or it won't take // effect. void set_title_annotator(invtitle_annotator fn); void set_title(MenuEntry *title, bool first = true); void set_title(const std::string &s); // Loads items into the menu. If "procfn" is provided, it'll be called // for each MenuEntry added. // NOTE: Does not set menu title, ever! You *must* set the title explicitly void load_items(const std::vector &items, MenuEntry *(*procfn)(MenuEntry *me) = NULL); // Loads items from the player's inventory into the menu, and sets the // title to the stock title. If "procfn" is provided, it'll be called for // each MenuEntry added, *excluding the title*. void load_inv_items(int item_selector = OSEL_ANY, int excluded_slot = -1, MenuEntry *(*procfn)(MenuEntry *me) = NULL); std::vector get_selitems() const; // Returns vector of item_def pointers to each item_def in the given // vector. Note: make sure the original vector stays around for the lifetime // of the use of the item pointers, or mayhem results! static std::vector xlat_itemvect( const std::vector &); const menu_sort_condition *find_menu_sort_condition() const; void sort_menu(std::vector &items, const menu_sort_condition *cond); protected: bool process_key(int key); void do_preselect(InvEntry *ie); virtual bool is_selectable(int index) const; protected: menu_type type; const std::vector *pre_select; invtitle_annotator title_annotate; }; int prompt_invent_item( const char *prompt, menu_type type, int type_expect, bool must_exist = true, bool allow_auto_list = true, bool allow_easy_quit = true, const char other_valid_char = '\0', int excluded_slot = -1, int *const count = NULL, operation_types oper = OPER_ANY, bool allow_list_known = false ); std::vector select_items( const std::vector &items, const char *title, bool noselect = false, menu_type mtype = MT_PICKUP ); std::vector prompt_invent_items( const char *prompt, menu_type type, int type_expect, invtitle_annotator titlefn = NULL, bool allow_auto_list = true, bool allow_easy_quit = true, const char other_valid_char = '\0', std::vector *filter = NULL, Menu::selitem_tfn fn = NULL, const std::vector *pre_select = NULL ); unsigned char invent_select( // Use NULL for stock Inventory title const char *title = NULL, // MT_DROP allows the multidrop toggle menu_type type = MT_INVLIST, int item_selector = OSEL_ANY, int excluded_slot = -1, int menu_select_flags = MF_NOSELECT, invtitle_annotator titlefn = NULL, std::vector *sels = NULL, std::vector *filter = NULL, Menu::selitem_tfn fn = NULL, const std::vector *pre_select = NULL ); void browse_inventory( bool show_price ); unsigned char get_invent(int invent_type); bool in_inventory(const item_def &i); std::string item_class_name(int type, bool terse = false); bool check_old_item_warning(const item_def& item, operation_types oper); bool check_warning_inscriptions(const item_def& item, operation_types oper); bool has_warning_inscription(const item_def& item, operation_types oper); void init_item_sort_comparators(item_sort_comparators &list, const std::string &set); bool prompt_failed(int retval, std::string msg = ""); bool item_is_evokable(const item_def &item, bool known = false, bool all_wands = false, bool msg = false); #endif