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 "autopick/autopick-util.h"
20 #include "core/asking-player.h"
21 #include "core/disturbance.h"
22 #include "flavor/flavor-describer.h"
23 #include "floor/floor-object.h"
24 #include "inventory/inventory-object.h"
25 #include "inventory/inventory-slot-types.h"
26 #include "inventory/player-inventory.h"
27 #include "object/object-info.h"
28 #include "object/object-mark-types.h"
29 #include "system/floor-type-definition.h"
30 #include "system/grid-type-definition.h"
31 #include "system/item-entity.h"
32 #include "system/player-type-definition.h"
33 #include "term/screen-processor.h"
34 #include "view/display-messages.h"
35 #include "window/display-sub-windows.h"
39 * @brief Auto-destroy marked item
41 static void autopick_delayed_alter_aux(PlayerType *player_ptr, INVENTORY_IDX item)
43 const auto *o_ptr = ref_item(player_ptr, item);
44 if (!o_ptr->is_valid() || o_ptr->marked.has_not(OmType::AUTODESTROY)) {
48 const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
50 inven_item_increase(player_ptr, item, -(o_ptr->number));
51 inven_item_optimize(player_ptr, item);
53 delete_object_idx(player_ptr, 0 - item);
56 msg_format(_("%sを自動破壊します。", "Auto-destroying %s."), item_name.data());
60 * @brief Auto-destroy marked items in inventry and on floor
62 * Scan inventry in reverse order to prevent
63 * skipping after inven_item_optimize()
65 void autopick_delayed_alter(PlayerType *player_ptr)
67 for (INVENTORY_IDX item = INVEN_TOTAL - 1; item >= 0; item--) {
68 autopick_delayed_alter_aux(player_ptr, item);
71 auto &grid = player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
72 for (auto it = grid.o_idx_list.begin(); it != grid.o_idx_list.end();) {
73 INVENTORY_IDX item = *it++;
74 autopick_delayed_alter_aux(player_ptr, -item);
77 // PW_FLOOR_ITEM_LISTは遅れるので即時更新
78 fix_floor_item_list(player_ptr, player_ptr->y, player_ptr->x);
82 * @brief Auto-inscription and/or destroy
84 * Auto-destroyer works only on inventory or on floor stack only when
87 void autopick_alter_item(PlayerType *player_ptr, INVENTORY_IDX item, bool destroy)
90 o_ptr = ref_item(player_ptr, item);
91 int idx = find_autopick_list(player_ptr, o_ptr);
92 auto_inscribe_item(player_ptr, o_ptr, idx);
93 if (destroy && item <= INVEN_PACK) {
94 auto_destroy_item(player_ptr, o_ptr, idx);
99 * @brief Automatically pickup/destroy items in this grid.
101 void autopick_pickup_items(PlayerType *player_ptr, grid_type *g_ptr)
103 for (auto it = g_ptr->o_idx_list.begin(); it != g_ptr->o_idx_list.end();) {
104 OBJECT_IDX this_o_idx = *it++;
105 auto *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
106 int idx = find_autopick_list(player_ptr, o_ptr);
107 auto_inscribe_item(player_ptr, o_ptr, idx);
108 if ((idx < 0) || (autopick_list[idx].action & (DO_AUTOPICK | DO_QUERY_AUTOPICK)) == 0) {
109 auto_destroy_item(player_ptr, o_ptr, idx);
113 disturb(player_ptr, false, false);
114 if (!check_store_item_to_inventory(player_ptr, o_ptr)) {
115 const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
116 msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), item_name.data());
117 o_ptr->marked.set(OmType::SUPRESS_MESSAGE);
121 if (!(autopick_list[idx].action & DO_QUERY_AUTOPICK)) {
122 describe_pickup_item(player_ptr, this_o_idx);
126 if (o_ptr->marked.has(OmType::NO_QUERY)) {
130 const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
131 std::stringstream ss;
132 ss << _(item_name, "Pick up ") << _("を拾いますか", item_name) << "? ";
133 if (!get_check(ss.str())) {
134 o_ptr->marked.set({ OmType::SUPRESS_MESSAGE, OmType::NO_QUERY });
138 describe_pickup_item(player_ptr, this_o_idx);