3 * @brief 自動拾い機能の実装 / Object Auto-picker/Destroyer
6 * Copyright (c) 2002 Mogami\n
8 * This software may be copied and distributed for educational, research, and\n
9 * not for profit purposes provided that this copyright and statement are\n
10 * included in all such copies.\n
11 * 2014 Deskull rearranged comment for Doxygen.\n
14 #include "autopick/autopick.h"
15 #include "autopick/autopick-destroyer.h"
16 #include "autopick/autopick-finder.h"
17 #include "autopick/autopick-menu-data-table.h"
18 #include "autopick/autopick-methods-table.h"
19 #include "floor/floor-object.h"
20 #include "inventory/inventory-object.h"
21 #include "object/object-flavor.h"
22 #include "object/object-mark-types.h"
23 #include "object/object-info.h"
24 #include "player/player-move.h"
25 #include "util/util.h"
28 * Auto-destroy marked item
30 static void autopick_delayed_alter_aux(player_type *player_ptr, INVENTORY_IDX item)
33 o_ptr = ref_item(player_ptr, item);
35 if (o_ptr->k_idx == 0 || !(o_ptr->marked & OM_AUTODESTROY)) return;
37 GAME_TEXT o_name[MAX_NLEN];
38 object_desc(player_ptr, o_name, o_ptr, 0);
41 inven_item_increase(player_ptr, item, -(o_ptr->number));
42 inven_item_optimize(player_ptr, item);
46 delete_object_idx(player_ptr, 0 - item);
49 msg_format(_("%sを自動破壊します。", "Auto-destroying %s."), o_name);
54 * Auto-destroy marked items in inventry and on floor
56 void autopick_delayed_alter(player_type *owner_ptr)
61 * Scan inventry in reverse order to prevent
62 * skipping after inven_item_optimize()
64 for (item = INVEN_TOTAL - 1; item >= 0; item--)
65 autopick_delayed_alter_aux(owner_ptr, item);
67 floor_type *floor_ptr = owner_ptr->current_floor_ptr;
68 item = floor_ptr->grid_array[owner_ptr->y][owner_ptr->x].o_idx;
71 OBJECT_IDX next = floor_ptr->o_list[item].next_o_idx;
72 autopick_delayed_alter_aux(owner_ptr, -item);
79 * Auto-inscription and/or destroy
81 * Auto-destroyer works only on inventory or on floor stack only when
84 void autopick_alter_item(player_type *player_ptr, INVENTORY_IDX item, bool destroy)
87 o_ptr = ref_item(player_ptr, item);
88 int idx = find_autopick_list(player_ptr, o_ptr);
89 auto_inscribe_item(player_ptr, o_ptr, idx);
90 if (destroy && item <= INVEN_PACK)
91 auto_destroy_item(player_ptr, o_ptr, idx);
96 * Automatically pickup/destroy items in this grid.
98 void autopick_pickup_items(player_type* player_ptr, grid_type *g_ptr)
100 OBJECT_IDX this_o_idx, next_o_idx = 0;
101 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
103 object_type *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
104 next_o_idx = o_ptr->next_o_idx;
105 int idx = find_autopick_list(player_ptr, o_ptr);
106 auto_inscribe_item(player_ptr, o_ptr, idx);
107 bool is_auto_pickup = idx >= 0;
108 is_auto_pickup &= (autopick_list[idx].action & (DO_AUTOPICK | DO_QUERY_AUTOPICK)) != 0;
111 auto_destroy_item(player_ptr, o_ptr, idx);
115 disturb(player_ptr, FALSE, FALSE);
116 if (!check_store_item_to_inventory(o_ptr))
118 GAME_TEXT o_name[MAX_NLEN];
119 object_desc(player_ptr, o_name, o_ptr, 0);
120 msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), o_name);
121 o_ptr->marked |= OM_NOMSG;
125 if (!(autopick_list[idx].action & DO_QUERY_AUTOPICK))
127 py_pickup_aux(player_ptr, this_o_idx);
131 char out_val[MAX_NLEN + 20];
132 GAME_TEXT o_name[MAX_NLEN];
133 if (o_ptr->marked & OM_NO_QUERY)
138 object_desc(player_ptr, o_name, o_ptr, 0);
139 sprintf(out_val, _("%sを拾いますか? ", "Pick up %s? "), o_name);
140 if (!get_check(out_val))
142 o_ptr->marked |= OM_NOMSG | OM_NO_QUERY;
146 py_pickup_aux(player_ptr, this_o_idx);