2 * @brief 床のアイテムが自動拾いに一致するかどうかを調べる関数だけを格納したファイル
5 * @todo 300行以上の凶悪関数なので後で分割しておく
8 #include "autopick/autopick-matcher.h"
9 #include "autopick/autopick-flags-table.h"
10 #include "autopick/autopick-key-flag-process.h"
11 #include "autopick/autopick-util.h"
12 #include "inventory/inventory-slot-types.h"
13 #include "monster-race/monster-race.h"
14 #include "monster-race/race-flags1.h"
15 #include "object-enchant/item-feeling.h"
16 #include "object-enchant/special-object-flags.h"
17 #include "object-hook/hook-armor.h"
18 #include "object-hook/hook-bow.h"
19 #include "object-hook/hook-checker.h"
20 #include "object-hook/hook-enchant.h"
21 #include "object-hook/hook-quest.h"
22 #include "object-hook/hook-weapon.h"
23 #include "object/object-info.h"
24 #include "object/object-kind.h"
25 #include "object/object-stack.h"
26 #include "object/object-value.h"
27 #include "perception/object-perception.h"
28 #include "player/player-realm.h"
29 #include "system/floor-type-definition.h"
30 #include "system/monster-race-definition.h"
31 #include "system/object-type-definition.h"
32 #include "system/player-type-definition.h"
33 #include "util/string-processor.h"
36 * A function for Auto-picker/destroyer
37 * Examine whether the object matches to the entry
39 bool is_autopick_match(player_type *player_ptr, object_type *o_ptr, autopick_type *entry, concptr o_name)
41 concptr ptr = entry->name;
42 if (IS_FLG(FLG_UNAWARE) && object_is_aware(o_ptr))
45 if (IS_FLG(FLG_UNIDENTIFIED) && (object_is_known(o_ptr) || (o_ptr->ident & IDENT_SENSE)))
48 if (IS_FLG(FLG_IDENTIFIED) && !object_is_known(o_ptr))
51 if (IS_FLG(FLG_STAR_IDENTIFIED) && (!object_is_known(o_ptr) || !object_is_fully_known(o_ptr)))
54 if (IS_FLG(FLG_BOOSTED)) {
55 object_kind *k_ptr = &k_info[o_ptr->k_idx];
56 if (!object_is_melee_weapon(o_ptr))
59 if ((o_ptr->dd == k_ptr->dd) && (o_ptr->ds == k_ptr->ds))
62 if (!object_is_known(o_ptr) && object_is_quest_target(player_ptr->current_floor_ptr->inside_quest, o_ptr)) {
67 if (IS_FLG(FLG_MORE_DICE)) {
68 if (o_ptr->dd * o_ptr->ds < entry->dice)
72 if (IS_FLG(FLG_MORE_BONUS)) {
73 if (!object_is_known(o_ptr))
77 if (o_ptr->pval < entry->bonus)
80 if (o_ptr->to_h < entry->bonus && o_ptr->to_d < entry->bonus && o_ptr->to_a < entry->bonus && o_ptr->pval < entry->bonus)
85 if (IS_FLG(FLG_WORTHLESS) && object_value(player_ptr, o_ptr) > 0)
88 if (IS_FLG(FLG_ARTIFACT)) {
89 if (!object_is_known(o_ptr) || !object_is_artifact(o_ptr))
93 if (IS_FLG(FLG_EGO)) {
94 if (!object_is_ego(o_ptr))
96 if (!object_is_known(o_ptr) && !((o_ptr->ident & IDENT_SENSE) && o_ptr->feeling == FEEL_EXCELLENT))
100 if (IS_FLG(FLG_GOOD)) {
101 if (!object_is_equipment(o_ptr))
103 if (object_is_known(o_ptr)) {
104 if (!object_is_nameless(player_ptr, o_ptr))
107 if (o_ptr->to_a <= 0 && (o_ptr->to_h + o_ptr->to_d) <= 0)
109 } else if (o_ptr->ident & IDENT_SENSE) {
110 switch (o_ptr->feeling) {
122 if (IS_FLG(FLG_NAMELESS)) {
123 if (!object_is_equipment(o_ptr))
125 if (object_is_known(o_ptr)) {
126 if (!object_is_nameless(player_ptr, o_ptr))
128 } else if (o_ptr->ident & IDENT_SENSE) {
129 switch (o_ptr->feeling) {
144 if (IS_FLG(FLG_AVERAGE)) {
145 if (!object_is_equipment(o_ptr))
147 if (object_is_known(o_ptr)) {
148 if (!object_is_nameless(player_ptr, o_ptr))
151 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr))
154 if (o_ptr->to_a > 0 || (o_ptr->to_h + o_ptr->to_d) > 0)
156 } else if (o_ptr->ident & IDENT_SENSE) {
157 switch (o_ptr->feeling) {
169 if (IS_FLG(FLG_RARE) && !object_is_rare(o_ptr))
172 if (IS_FLG(FLG_COMMON) && object_is_rare(o_ptr))
175 if (IS_FLG(FLG_WANTED) && !object_is_bounty(player_ptr, o_ptr))
178 if (IS_FLG(FLG_UNIQUE) && ((o_ptr->tval != TV_CORPSE && o_ptr->tval != TV_STATUE) || !(r_info[o_ptr->pval].flags1 & RF1_UNIQUE)))
181 if (IS_FLG(FLG_HUMAN) && (o_ptr->tval != TV_CORPSE || !angband_strchr("pht", r_info[o_ptr->pval].d_char)))
184 if (IS_FLG(FLG_UNREADABLE) && (o_ptr->tval < TV_LIFE_BOOK || check_book_realm(player_ptr, o_ptr->tval, o_ptr->sval)))
187 bool realm_except_class = player_ptr->pclass == CLASS_SORCERER || player_ptr->pclass == CLASS_RED_MAGE;
189 if (IS_FLG(FLG_REALM1) && (get_realm1_book(player_ptr) != o_ptr->tval || realm_except_class))
192 if (IS_FLG(FLG_REALM2) && (get_realm2_book(player_ptr) != o_ptr->tval || realm_except_class))
195 if (IS_FLG(FLG_FIRST) && (o_ptr->tval < TV_LIFE_BOOK || 0 != o_ptr->sval))
198 if (IS_FLG(FLG_SECOND) && (o_ptr->tval < TV_LIFE_BOOK || 1 != o_ptr->sval))
201 if (IS_FLG(FLG_THIRD) && (o_ptr->tval < TV_LIFE_BOOK || 2 != o_ptr->sval))
204 if (IS_FLG(FLG_FOURTH) && (o_ptr->tval < TV_LIFE_BOOK || 3 != o_ptr->sval))
207 if (IS_FLG(FLG_WEAPONS)) {
208 if (!object_is_weapon(player_ptr, o_ptr))
210 } else if (IS_FLG(FLG_FAVORITE_WEAPONS)) {
211 if (!object_is_favorite(player_ptr, o_ptr))
213 } else if (IS_FLG(FLG_ARMORS)) {
214 if (!object_is_armour(player_ptr, o_ptr))
216 } else if (IS_FLG(FLG_MISSILES)) {
217 if (!object_is_ammo(o_ptr))
219 } else if (IS_FLG(FLG_DEVICES)) {
220 switch (o_ptr->tval) {
229 } else if (IS_FLG(FLG_LIGHTS)) {
230 if (!(o_ptr->tval == TV_LITE))
232 } else if (IS_FLG(FLG_JUNKS)) {
233 switch (o_ptr->tval) {
242 } else if (IS_FLG(FLG_CORPSES)) {
243 if (o_ptr->tval != TV_CORPSE && o_ptr->tval != TV_SKELETON)
245 } else if (IS_FLG(FLG_SPELLBOOKS)) {
246 if (!(o_ptr->tval >= TV_LIFE_BOOK))
248 } else if (IS_FLG(FLG_HAFTED)) {
249 if (!(o_ptr->tval == TV_HAFTED))
251 } else if (IS_FLG(FLG_SHIELDS)) {
252 if (!(o_ptr->tval == TV_SHIELD))
254 } else if (IS_FLG(FLG_BOWS)) {
255 if (!(o_ptr->tval == TV_BOW))
257 } else if (IS_FLG(FLG_RINGS)) {
258 if (!(o_ptr->tval == TV_RING))
260 } else if (IS_FLG(FLG_AMULETS)) {
261 if (!(o_ptr->tval == TV_AMULET))
263 } else if (IS_FLG(FLG_SUITS)) {
264 if (!(o_ptr->tval == TV_DRAG_ARMOR || o_ptr->tval == TV_HARD_ARMOR || o_ptr->tval == TV_SOFT_ARMOR))
266 } else if (IS_FLG(FLG_CLOAKS)) {
267 if (!(o_ptr->tval == TV_CLOAK))
269 } else if (IS_FLG(FLG_HELMS)) {
270 if (!(o_ptr->tval == TV_CROWN || o_ptr->tval == TV_HELM))
272 } else if (IS_FLG(FLG_GLOVES)) {
273 if (!(o_ptr->tval == TV_GLOVES))
275 } else if (IS_FLG(FLG_BOOTS)) {
276 if (!(o_ptr->tval == TV_BOOTS))
282 if (strncmp(o_name, ptr, strlen(ptr)))
285 if (!angband_strstr(o_name, ptr))
289 if (!IS_FLG(FLG_COLLECTING))
292 for (int j = 0; j < INVEN_PACK; j++) {
294 * 'Collecting' means the item must be absorbed
295 * into an inventory slot.
296 * But an item can not be absorbed into itself!
298 if ((&player_ptr->inventory_list[j] != o_ptr) && object_similar(&player_ptr->inventory_list[j], o_ptr))