Revert "Track who destroys an item; incur Nemelex penance for deck destruction."
[crawl.git] / crawl-ref / source / items.h
1 /**
2  * @file
3  * @brief Misc (mostly) inventory related functions.
4 **/
5
6
7 #ifndef ITEMS_H
8 #define ITEMS_H
9
10 #include "externs.h"
11
12 // Ways to get items, other than finding them on the ground or looting them
13 // from slain monsters.
14 enum item_source_type
15 {
16     IT_SRC_NONE   = 0,
17
18     // Empty space for the gods
19
20     AQ_SCROLL     = 100,
21     AQ_CARD_GENIE,
22     IT_SRC_START,
23     IT_SRC_SHOP,
24
25     // Empty space for new non-wizmode acquisition methods
26
27     AQ_WIZMODE    = 200,
28 };
29
30 int get_max_subtype(object_class_type base_type);
31 bool item_type_has_unidentified(object_class_type base_type);
32
33 bool dec_inv_item_quantity(int obj, int amount, bool suppress_burden = false);
34 bool dec_mitm_item_quantity(int obj, int amount);
35
36 void inc_inv_item_quantity(int obj, int amount, bool suppress_burden = false);
37 void inc_mitm_item_quantity(int obj, int amount);
38
39 bool move_item_to_grid(int *const obj, const coord_def& p,
40                         bool silent = false);
41 void move_item_stack_to_grid(const coord_def& from, const coord_def& to);
42 void note_inscribe_item(item_def &item);
43 int  move_item_to_player(int obj, int quant_got, bool quiet = false,
44                          bool ignore_burden = false);
45 void mark_items_non_pickup_at(const coord_def &pos);
46 void mark_items_non_visit_at(const coord_def &pos);
47 bool is_stackable_item(const item_def &item);
48 bool items_similar(const item_def &item1, const item_def &item2);
49 bool items_stack(const item_def &item1, const item_def &item2,
50                   bool force_merge = false);
51 void merge_item_stacks(item_def &source, item_def &dest,
52                        int quant = -1);
53
54 item_def *find_floor_item(object_class_type cls, int sub_type);
55 int item_on_floor(const item_def &item, const coord_def& where);
56
57 void init_item(int item);
58
59 void link_items(void);
60
61 void fix_item_coordinates(void);
62
63 int get_mitm_slot(int reserve = 50);
64
65 void unlink_item(int dest);
66 void destroy_item(item_def &item, bool never_created = false);
67 void destroy_item(int dest, bool never_created = false);
68 void lose_item_stack(const coord_def& where);
69
70 void item_check(bool verbose);
71 void request_autopickup(bool do_pickup = true);
72
73 bool player_on_single_stack();
74 void pickup_menu(int item_link);
75 void pickup(bool partial_quantity = false);
76
77 bool item_is_branded(const item_def& item);
78 void item_list_on_square(vector<const item_def*>& items,
79                          int obj, bool force_squelch = false);
80
81 bool copy_item_to_grid(const item_def &item, const coord_def& p,
82                        int quant_drop = -1,    // item.quantity by default
83                        bool mark_dropped = false,
84                        bool silent = false);
85 coord_def item_pos(const item_def &item);
86
87 bool move_top_item(const coord_def &src, const coord_def &dest);
88
89 // Get the top item in a given cell. If there are no items, return NULL.
90 const item_def* top_item_at(const coord_def& where);
91
92 // Returns whether there is more than one item in a given cell.
93 bool multiple_items_at(const coord_def& where);
94
95 void drop(void);
96
97 int inv_count(void);
98 int runes_in_pack();
99 bool player_has_orb();
100
101 bool pickup_single_item(int link, int qty);
102
103 bool drop_item(int item_dropped, int quant_drop);
104 void drop_last();
105
106 int          get_equip_slot(const item_def *item);
107 mon_inv_type get_mon_equip_slot(const monster* mon, const item_def &item);
108
109 void origin_reset(item_def &item);
110 void origin_set(const coord_def& where);
111 void origin_set_monster(item_def &item, const monster* mons);
112 bool origin_known(const item_def &item);
113 bool origin_describable(const item_def &item);
114 string origin_desc(const item_def &item);
115 void origin_purchased(item_def &item);
116 void origin_acquired(item_def &item, int agent);
117 void origin_set_startequip(item_def &item);
118 void origin_set_unknown(item_def &item);
119 void origin_set_inventory(void (*oset)(item_def &item));
120 bool origin_is_god_gift(const item_def& item, god_type *god = NULL);
121 bool origin_is_acquirement(const item_def& item,
122                            item_source_type *type = NULL);
123
124 bool item_needs_autopickup(const item_def &);
125 bool can_autopickup();
126
127 bool need_to_autopickup();
128 void autopickup();
129
130 int find_free_slot(const item_def &i);
131
132 bool need_to_autoinscribe();
133 void request_autoinscribe(bool do_inscribe = true);
134 void autoinscribe();
135
136 bool item_is_equipped(const item_def &item, bool quiver_too = false);
137 bool item_is_melded(const item_def& item);
138 equipment_type item_equip_slot(const item_def &item);
139
140 void item_was_lost(const item_def &item);
141 void item_was_destroyed(const item_def &item, int cause = -1);
142 void corrode_item(item_def &item, actor *holder);
143
144 bool get_item_by_name(item_def *item, char* specs,
145                       object_class_type class_wanted,
146                       bool create_for_real = false);
147
148 void move_items(const coord_def r, const coord_def p);
149 object_class_type get_random_item_mimic_type();
150 object_class_type get_item_mimic_type();
151 bool is_valid_mimic_item(object_class_type type);
152 // Returns the Orb's position on the ground, or origin()
153 coord_def orb_position();
154
155 // stack_iterator guarantees validity so long as you don't manually
156 // mess with item_def.link: i.e., you can kill the item you're
157 // examining but you can't kill the item linked to it.
158 class stack_iterator : public iterator<forward_iterator_tag, item_def>
159 {
160 public:
161     explicit stack_iterator(const coord_def& pos, bool accessible = false);
162     explicit stack_iterator(int start_link);
163
164     operator bool() const;
165     item_def& operator *() const;
166     item_def* operator->() const;
167     int link() const;
168
169     const stack_iterator& operator ++ ();
170     stack_iterator operator ++ (int);
171 private:
172     int cur_link;
173     int next_link;
174 };
175
176 #endif