Update shopping list price when item is identified
[crawl:crawl.git] / crawl-ref / source / shopping.h
1 /**
2  * @file
3  * @brief Shop keeper functions.
4 **/
5
6
7 #ifndef SHOPPING_H
8 #define SHOPPING_H
9
10 #include "externs.h"
11
12 int artefact_value(const item_def &item);
13
14 // ident == true overrides the item ident level and gives the price
15 // as if the item was fully id'd
16 unsigned int item_value(item_def item, bool ident = false);
17 // Return true if an item is classified as a worthless consumable.
18 // Note that this does not take into account the player's condition:
19 // curse scrolls are worthless for everyone, most potions aren't worthless
20 // for mummies, etcetera.
21 bool is_worthless_consumable(const item_def &item);
22 void shop();
23
24 shop_struct *get_shop(const coord_def& where);
25
26 void destroy_shop_at(coord_def p);
27
28 string shop_name(const coord_def& where);
29 string shop_name(const coord_def& where, bool add_stop);
30
31 bool shoptype_identifies_stock(shop_type type);
32
33 bool is_shop_item(const item_def &item);
34 bool shop_item_unknown(const item_def &item);
35
36 /////////////////////////////////////////////////////////////////////
37
38 struct level_pos;
39 class  Menu;
40
41 class ShoppingList
42 {
43 public:
44     ShoppingList();
45
46     bool add_thing(const item_def &item, int cost,
47                    const level_pos* pos = NULL);
48     bool add_thing(string desc, string buy_verb, int cost,
49                    const level_pos* pos = NULL);
50
51     bool is_on_list(const item_def &item, const level_pos* pos = NULL) const;
52     bool is_on_list(string desc, const level_pos* pos = NULL) const;
53
54     bool del_thing(const item_def &item, const level_pos* pos = NULL);
55     bool del_thing(string desc, const level_pos* pos = NULL);
56
57     void del_things_from(const level_id &lid);
58
59     void item_type_identified(object_class_type base_type, int sub_type);
60     unsigned int cull_identical_items(const item_def& item, int cost = -1);
61
62     void gold_changed(int old_amount, int new_amount);
63
64     void move_things(const coord_def &src, const coord_def &dst);
65     void forget_pos(const level_pos &pos);
66
67     void display();
68
69     void refresh();
70
71     bool empty() const { return !list || list->empty(); };
72     int size() const;
73
74     static bool items_are_same(const item_def& item_a,
75                                const item_def& item_b);
76
77 private:
78     CrawlVector* list;
79
80     int min_unbuyable_cost;
81     int min_unbuyable_idx;
82     int max_buyable_cost;
83     int max_buyable_idx;
84
85 private:
86     int find_thing(const item_def &item, const level_pos &pos) const;
87     int find_thing(const string &desc, const level_pos &pos) const;
88     void del_thing_at_index(int idx);
89
90     void fill_out_menu(Menu& shopmenu);
91
92     static       bool        thing_is_item(const CrawlHashTable& thing);
93     static const item_def&   get_thing_item(const CrawlHashTable& thing);
94     static       string get_thing_desc(const CrawlHashTable& thing);
95
96     static int       thing_cost(const CrawlHashTable& thing);
97     static level_pos thing_pos(const CrawlHashTable& thing);
98
99     static string name_thing(const CrawlHashTable& thing,
100                              description_level_type descrip = DESC_PLAIN);
101     static string describe_thing(const CrawlHashTable& thing,
102                                  description_level_type descrip = DESC_PLAIN);
103     static string item_name_simple(const item_def& item, bool ident = false);
104 };
105
106 extern ShoppingList shopping_list;
107
108 #endif