7 #include "inventory/floor-item-getter.h"
8 #include "core/stuff-handler.h"
9 #include "core/window-redrawer.h"
10 #include "floor/floor-object.h"
11 #include "floor/object-scanner.h"
12 #include "game-option/input-options.h"
13 #include "game-option/option-flags.h"
14 #include "game-option/text-display-options.h"
15 #include "grid/grid.h"
16 #include "inventory/inventory-slot-types.h"
17 #include "inventory/inventory-util.h"
18 #include "inventory/item-selection-util.h"
19 #include "io/command-repeater.h"
20 #include "io/input-key-acceptor.h"
21 #include "io/input-key-requester.h"
22 #include "main/sound-of-music.h"
23 #include "object/item-tester-hooker.h"
24 #include "object/item-use-flags.h"
25 #include "object/object-info.h"
26 #include "player/player-status-flags.h"
27 #include "system/floor-type-definition.h"
28 #include "term/gameterm.h"
29 #include "term/screen-processor.h"
30 #include "util/int-char-converter.h"
31 #include "view/display-inventory.h"
32 #include "view/display-messages.h"
33 #include "window/display-sub-windows.h"
36 * @brief 床上アイテムへにタグ付けがされているかの調査処理 (のはず)
37 * @param owner_ptr プレーヤーへの参照ポインタ
38 * @param fis_ptr 床上アイテムへの参照ポインタ
39 * @param prev_tag 前回選択したアイテムのタグ (のはず)
40 * @return プレイヤーによりアイテムが選択されたならTRUEを返す
41 * @todo 適切な関数名をどうしても付けられなかったので暫定でauxとした
43 static bool check_floor_item_tag_aux(player_type *owner_ptr, fis_type *fis_ptr, char *prev_tag)
45 if (!fis_ptr->floor || (*fis_ptr->cp >= 0))
48 if (*prev_tag && command_cmd) {
50 = scan_floor_items(owner_ptr, fis_ptr->floor_list, owner_ptr->y, owner_ptr->x, SCAN_FLOOR_ITEM_TESTER | SCAN_FLOOR_ONLY_MARKED, fis_ptr->tval);
51 if (get_tag_floor(owner_ptr->current_floor_ptr, &fis_ptr->k, *prev_tag, fis_ptr->floor_list, fis_ptr->floor_num)) {
52 *fis_ptr->cp = 0 - fis_ptr->floor_list[fis_ptr->k];
53 fis_ptr->tval = TV_NONE;
54 item_tester_hook = NULL;
63 if (!item_tester_okay(owner_ptr, &owner_ptr->current_floor_ptr->o_list[0 - (*fis_ptr->cp)], fis_ptr->tval) && ((fis_ptr->mode & USE_FULL) == 0))
66 fis_ptr->tval = TV_NONE;
67 item_tester_hook = NULL;
73 * @brief インベントリのアイテムにタグ付けを試みる
74 * @param owner_ptr プレーヤーへの参照ポインタ
75 * @param fis_ptr 床上アイテムへの参照ポインタ
76 * @param prev_tag 前回選択したアイテムのタグ (のはず)
77 * @return プレイヤーによりアイテムが選択されたならTRUEを返す
79 static bool get_floor_item_tag_inventory(player_type *owner_ptr, fis_type *fis_ptr, char *prev_tag)
82 item_use_flag use_flag = (*fis_ptr->cp >= INVEN_MAIN_HAND) ? USE_EQUIP : USE_INVEN;
84 flag |= !get_tag(owner_ptr, &fis_ptr->k, *prev_tag, use_flag, fis_ptr->tval);
85 flag |= !get_item_okay(owner_ptr, fis_ptr->k, fis_ptr->tval);
87 if (fis_ptr->k < INVEN_MAIN_HAND)
88 flag |= !fis_ptr->inven;
90 flag |= !fis_ptr->equip;
97 *fis_ptr->cp = fis_ptr->k;
98 fis_ptr->tval = TV_NONE;
99 item_tester_hook = NULL;
105 * @brief インベントリのアイテムにタグ付けがされているかの調査処理 (のはず)
106 * @param owner_ptr プレーヤーへの参照ポインタ
107 * @param fis_ptr 床上アイテムへの参照ポインタ
108 * @param prev_tag 前回選択したアイテムのタグ (のはず)
109 * @return プレイヤーによりアイテムが選択されたならTRUEを返す
111 static bool check_floor_item_tag_inventory(player_type *owner_ptr, fis_type *fis_ptr, char *prev_tag)
113 if ((!fis_ptr->inven || (*fis_ptr->cp < 0) || (*fis_ptr->cp >= INVEN_PACK))
114 && (!fis_ptr->equip || (*fis_ptr->cp < INVEN_MAIN_HAND) || (*fis_ptr->cp >= INVEN_TOTAL)))
117 if ((*prev_tag != '\0') && command_cmd)
118 return get_floor_item_tag_inventory(owner_ptr, fis_ptr, prev_tag);
120 if (get_item_okay(owner_ptr, *fis_ptr->cp, fis_ptr->tval)) {
121 fis_ptr->tval = TV_NONE;
122 item_tester_hook = NULL;
131 * @brief 床上アイテムにタグ付けがされているかの調査処理 (のはず)
132 * @param owner_ptr プレーヤーへの参照ポインタ
133 * @param fis_ptr 床上アイテムへの参照ポインタ
134 * @param prev_tag 前回選択したアイテムのタグ (のはず)
135 * @return プレイヤーによりアイテムが選択されたならTRUEを返す
137 static bool check_floor_item_tag(player_type *owner_ptr, fis_type *fis_ptr, char *prev_tag)
139 if (!repeat_pull(fis_ptr->cp))
142 if (fis_ptr->force && (*fis_ptr->cp == INVEN_FORCE)) {
143 fis_ptr->tval = TV_NONE;
144 item_tester_hook = NULL;
149 if (check_floor_item_tag_aux(owner_ptr, fis_ptr, prev_tag))
152 return check_floor_item_tag_inventory(owner_ptr, fis_ptr, prev_tag);
156 * @brief インベントリ内のアイテムが妥当かを判定する
157 * @param owner_ptr プレーヤーへの参照ポインタ
158 * @param fis_ptr 床上アイテムへの参照ポインタ
161 static void test_inventory_floor(player_type *owner_ptr, fis_type *fis_ptr)
163 if (!fis_ptr->inven) {
171 for (int i = 0; i < INVEN_PACK; i++)
172 if (item_tester_okay(owner_ptr, &owner_ptr->inventory_list[i], fis_ptr->tval) || (fis_ptr->mode & USE_FULL))
173 fis_ptr->max_inven++;
177 * @brief 装備品がが妥当かを判定する
178 * @param owner_ptr プレーヤーへの参照ポインタ
179 * @param fis_ptr 床上アイテムへの参照ポインタ
182 static void test_equipment_floor(player_type *owner_ptr, fis_type *fis_ptr)
184 if (!fis_ptr->equip) {
192 for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++)
193 if (owner_ptr->select_ring_slot ? is_ring_slot(i)
194 : item_tester_okay(owner_ptr, &owner_ptr->inventory_list[i], fis_ptr->tval) || (fis_ptr->mode & USE_FULL))
195 fis_ptr->max_equip++;
199 * @brief オブジェクト選択の汎用関数(床上アイテム用) /
200 * Let the user select an item, save its "index"
201 * @param cp 選択したオブジェクトのIDを返す。
202 * @param pmt 選択目的のメッセージ
203 * @param str 選択できるオブジェクトがない場合のキャンセルメッセージ
204 * @param mode オプションフラグ
205 * @return プレイヤーによりアイテムが選択されたならTRUEを返す。/
207 bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concptr str, BIT_FLAGS mode, tval_type tval)
210 fis_type *fis_ptr = initialize_fis_type(&tmp_fis, cp, mode, tval);
211 static char prev_tag = '\0';
212 if (check_floor_item_tag(owner_ptr, fis_ptr, &prev_tag))
216 handle_stuff(owner_ptr);
217 test_inventory_floor(owner_ptr, fis_ptr);
218 fis_ptr->done = FALSE;
219 fis_ptr->item = FALSE;
221 fis_ptr->i2 = INVEN_PACK - 1;
222 while ((fis_ptr->i1 <= fis_ptr->i2) && (!get_item_okay(owner_ptr, fis_ptr->i1, fis_ptr->tval)))
225 while ((fis_ptr->i1 <= fis_ptr->i2) && (!get_item_okay(owner_ptr, fis_ptr->i2, fis_ptr->tval)))
228 fis_ptr->e1 = INVEN_MAIN_HAND;
229 fis_ptr->e2 = INVEN_TOTAL - 1;
230 test_equipment_floor(owner_ptr, fis_ptr);
231 if (has_two_handed_weapons(owner_ptr) && !(fis_ptr->mode & IGNORE_BOTHHAND_SLOT))
232 fis_ptr->max_equip++;
234 while ((fis_ptr->e1 <= fis_ptr->e2) && (!get_item_okay(owner_ptr, fis_ptr->e1, fis_ptr->tval)))
237 while ((fis_ptr->e1 <= fis_ptr->e2) && (!get_item_okay(owner_ptr, fis_ptr->e2, fis_ptr->tval)))
240 if (fis_ptr->equip && has_two_handed_weapons(owner_ptr) && !(fis_ptr->mode & IGNORE_BOTHHAND_SLOT)) {
241 if (can_attack_with_main_hand(owner_ptr)) {
242 if (fis_ptr->e2 < INVEN_SUB_HAND)
243 fis_ptr->e2 = INVEN_SUB_HAND;
244 } else if (can_attack_with_sub_hand(owner_ptr))
245 fis_ptr->e1 = INVEN_MAIN_HAND;
248 fis_ptr->floor_num = 0;
251 = scan_floor_items(owner_ptr, fis_ptr->floor_list, owner_ptr->y, owner_ptr->x, SCAN_FLOOR_ITEM_TESTER | SCAN_FLOOR_ONLY_MARKED, fis_ptr->tval);
253 if ((mode & USE_INVEN) && (fis_ptr->i1 <= fis_ptr->i2))
254 fis_ptr->allow_inven = TRUE;
256 if ((mode & USE_EQUIP) && (fis_ptr->e1 <= fis_ptr->e2))
257 fis_ptr->allow_equip = TRUE;
259 if ((mode & USE_FLOOR) && (fis_ptr->floor_num))
260 fis_ptr->allow_floor = TRUE;
262 if (!fis_ptr->allow_inven && !fis_ptr->allow_equip && !fis_ptr->allow_floor) {
264 fis_ptr->oops = TRUE;
265 fis_ptr->done = TRUE;
267 if (fis_ptr->force) {
269 fis_ptr->item = TRUE;
272 if (command_see && (command_wrk == USE_EQUIP) && fis_ptr->allow_equip)
273 command_wrk = USE_EQUIP;
274 else if (fis_ptr->allow_inven)
275 command_wrk = USE_INVEN;
276 else if (fis_ptr->allow_equip)
277 command_wrk = USE_EQUIP;
278 else if (fis_ptr->allow_floor)
279 command_wrk = USE_FLOOR;
282 /* 追加オプション(always_show_list)が設定されている場合は常に一覧を表示する */
283 if ((always_show_list == TRUE) || use_menu)
289 while (!fis_ptr->done) {
292 for (int i = 0; i < 8; i++) {
293 if (!angband_term[i])
296 if (window_flag[i] & PW_INVEN)
299 if (window_flag[i] & PW_EQUIP)
303 if ((command_wrk == (USE_EQUIP) && ni && !ne) || (command_wrk == (USE_INVEN) && !ni && ne)) {
304 toggle_inventory_equipment(owner_ptr);
305 fis_ptr->toggle = !fis_ptr->toggle;
308 owner_ptr->window_flags |= (PW_INVEN | PW_EQUIP);
309 handle_stuff(owner_ptr);
310 COMMAND_CODE get_item_label = 0;
311 if (command_wrk == USE_INVEN) {
312 fis_ptr->n1 = I2A(fis_ptr->i1);
313 fis_ptr->n2 = I2A(fis_ptr->i2);
315 get_item_label = show_inventory(owner_ptr, fis_ptr->menu_line, fis_ptr->mode, fis_ptr->tval);
316 } else if (command_wrk == USE_EQUIP) {
317 fis_ptr->n1 = I2A(fis_ptr->e1 - INVEN_MAIN_HAND);
318 fis_ptr->n2 = I2A(fis_ptr->e2 - INVEN_MAIN_HAND);
320 get_item_label = show_equipment(owner_ptr, fis_ptr->menu_line, mode, fis_ptr->tval);
321 } else if (command_wrk == USE_FLOOR) {
322 int j = fis_ptr->floor_top;
323 fis_ptr->k = MIN(fis_ptr->floor_top + 23, fis_ptr->floor_num) - 1;
324 fis_ptr->n1 = I2A(j - fis_ptr->floor_top); // TODO: 常に'0'になる。どんな意図でこのようなコードになっているのか不明.
325 fis_ptr->n2 = I2A(fis_ptr->k - fis_ptr->floor_top);
327 get_item_label = show_floor_items(owner_ptr, fis_ptr->menu_line, owner_ptr->y, owner_ptr->x, &fis_ptr->min_width, fis_ptr->tval);
330 if (command_wrk == USE_INVEN) {
331 sprintf(fis_ptr->out_val, _("持ち物:", "Inven:"));
334 sprintf(tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), index_to_label(fis_ptr->i1), index_to_label(fis_ptr->i2));
335 strcat(fis_ptr->out_val, tmp_val);
338 if (!command_see && !use_menu)
339 strcat(fis_ptr->out_val, _(" '*'一覧,", " * to see,"));
341 if (fis_ptr->allow_equip) {
343 strcat(fis_ptr->out_val, _(" '/' 装備品,", " / for Equip,"));
344 else if (fis_ptr->allow_floor)
345 strcat(fis_ptr->out_val, _(" '6' 装備品,", " 6 for Equip,"));
347 strcat(fis_ptr->out_val, _(" '4'or'6' 装備品,", " 4 or 6 for Equip,"));
350 if (fis_ptr->allow_floor) {
352 strcat(fis_ptr->out_val, _(" '-'床上,", " - for floor,"));
353 else if (fis_ptr->allow_equip)
354 strcat(fis_ptr->out_val, _(" '4' 床上,", " 4 for floor,"));
356 strcat(fis_ptr->out_val, _(" '4'or'6' 床上,", " 4 or 6 for floor,"));
358 } else if (command_wrk == (USE_EQUIP)) {
359 sprintf(fis_ptr->out_val, _("装備品:", "Equip:"));
362 sprintf(tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), index_to_label(fis_ptr->e1), index_to_label(fis_ptr->e2));
363 strcat(fis_ptr->out_val, tmp_val);
366 if (!command_see && !use_menu)
367 strcat(fis_ptr->out_val, _(" '*'一覧,", " * to see,"));
369 if (fis_ptr->allow_inven) {
371 strcat(fis_ptr->out_val, _(" '/' 持ち物,", " / for Inven,"));
372 else if (fis_ptr->allow_floor)
373 strcat(fis_ptr->out_val, _(" '4' 持ち物,", " 4 for Inven,"));
375 strcat(fis_ptr->out_val, _(" '4'or'6' 持ち物,", " 4 or 6 for Inven,"));
378 if (fis_ptr->allow_floor) {
380 strcat(fis_ptr->out_val, _(" '-'床上,", " - for floor,"));
381 else if (fis_ptr->allow_inven)
382 strcat(fis_ptr->out_val, _(" '6' 床上,", " 6 for floor,"));
384 strcat(fis_ptr->out_val, _(" '4'or'6' 床上,", " 4 or 6 for floor,"));
386 } else if (command_wrk == USE_FLOOR) {
387 sprintf(fis_ptr->out_val, _("床上:", "Floor:"));
390 sprintf(tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), fis_ptr->n1, fis_ptr->n2);
391 strcat(fis_ptr->out_val, tmp_val);
394 if (!command_see && !use_menu)
395 strcat(fis_ptr->out_val, _(" '*'一覧,", " * to see,"));
398 if (fis_ptr->allow_inven && fis_ptr->allow_equip) {
399 strcat(fis_ptr->out_val, _(" '4' 装備品, '6' 持ち物,", " 4 for Equip, 6 for Inven,"));
400 } else if (fis_ptr->allow_inven) {
401 strcat(fis_ptr->out_val, _(" '4'or'6' 持ち物,", " 4 or 6 for Inven,"));
402 } else if (fis_ptr->allow_equip) {
403 strcat(fis_ptr->out_val, _(" '4'or'6' 装備品,", " 4 or 6 for Equip,"));
405 } else if (fis_ptr->allow_inven) {
406 strcat(fis_ptr->out_val, _(" '/' 持ち物,", " / for Inven,"));
407 } else if (fis_ptr->allow_equip) {
408 strcat(fis_ptr->out_val, _(" '/'装備品,", " / for Equip,"));
411 if (command_see && !use_menu) {
412 strcat(fis_ptr->out_val, _(" Enter 次,", " Enter for scroll down,"));
417 strcat(fis_ptr->out_val, _(" 'w'練気術,", " w for the Force,"));
419 strcat(fis_ptr->out_val, " ESC");
420 sprintf(fis_ptr->tmp_val, "(%s) %s", fis_ptr->out_val, pmt);
421 prt(fis_ptr->tmp_val, 0, 0);
422 fis_ptr->which = inkey();
425 if (command_wrk == USE_INVEN)
426 max_line = fis_ptr->max_inven;
427 else if (command_wrk == USE_EQUIP)
428 max_line = fis_ptr->max_equip;
429 else if (command_wrk == USE_FLOOR)
430 max_line = MIN(23, fis_ptr->floor_num);
431 switch (fis_ptr->which) {
436 fis_ptr->done = TRUE;
442 fis_ptr->menu_line += (max_line - 1);
448 fis_ptr->menu_line++;
454 if (command_wrk == (USE_INVEN)) {
455 if (fis_ptr->allow_floor)
456 command_wrk = USE_FLOOR;
457 else if (fis_ptr->allow_equip)
458 command_wrk = USE_EQUIP;
463 } else if (command_wrk == (USE_EQUIP)) {
464 if (fis_ptr->allow_inven)
465 command_wrk = USE_INVEN;
466 else if (fis_ptr->allow_floor)
467 command_wrk = USE_FLOOR;
472 } else if (command_wrk == (USE_FLOOR)) {
473 if (fis_ptr->allow_equip)
474 command_wrk = USE_EQUIP;
475 else if (fis_ptr->allow_inven)
476 command_wrk = USE_INVEN;
491 if (command_wrk == USE_INVEN)
492 max_line = fis_ptr->max_inven;
493 else if (command_wrk == USE_EQUIP)
494 max_line = fis_ptr->max_equip;
495 else if (command_wrk == USE_FLOOR)
496 max_line = MIN(23, fis_ptr->floor_num);
498 if (fis_ptr->menu_line > max_line)
499 fis_ptr->menu_line = max_line;
506 if (command_wrk == (USE_INVEN)) {
507 if (fis_ptr->allow_equip)
508 command_wrk = USE_EQUIP;
509 else if (fis_ptr->allow_floor)
510 command_wrk = USE_FLOOR;
515 } else if (command_wrk == (USE_EQUIP)) {
516 if (fis_ptr->allow_floor)
517 command_wrk = USE_FLOOR;
518 else if (fis_ptr->allow_inven)
519 command_wrk = USE_INVEN;
524 } else if (command_wrk == (USE_FLOOR)) {
525 if (fis_ptr->allow_inven)
526 command_wrk = USE_INVEN;
527 else if (fis_ptr->allow_equip)
528 command_wrk = USE_EQUIP;
543 if (command_wrk == USE_INVEN)
544 max_line = fis_ptr->max_inven;
545 else if (command_wrk == USE_EQUIP)
546 max_line = fis_ptr->max_equip;
547 else if (command_wrk == USE_FLOOR)
548 max_line = MIN(23, fis_ptr->floor_num);
550 if (fis_ptr->menu_line > max_line)
551 fis_ptr->menu_line = max_line;
559 if (command_wrk == USE_FLOOR)
560 *cp = -get_item_label;
562 if (!get_item_okay(owner_ptr, get_item_label, fis_ptr->tval)) {
567 if (!get_item_allow(owner_ptr, get_item_label)) {
568 fis_ptr->done = TRUE;
572 *cp = get_item_label;
575 fis_ptr->item = TRUE;
576 fis_ptr->done = TRUE;
580 if (fis_ptr->force) {
582 fis_ptr->item = TRUE;
583 fis_ptr->done = TRUE;
589 if (fis_ptr->menu_line > max_line)
590 fis_ptr->menu_line -= max_line;
595 switch (fis_ptr->which) {
597 fis_ptr->done = TRUE;
618 grid_type *g_ptr = &owner_ptr->current_floor_ptr->grid_array[owner_ptr->y][owner_ptr->x];
619 if (command_wrk != (USE_FLOOR))
622 o_idx = g_ptr->o_idx;
623 if (!(o_idx && owner_ptr->current_floor_ptr->o_list[o_idx].next_o_idx))
626 excise_object_idx(owner_ptr->current_floor_ptr, o_idx);
628 while (owner_ptr->current_floor_ptr->o_list[i].next_o_idx)
629 i = owner_ptr->current_floor_ptr->o_list[i].next_o_idx;
631 owner_ptr->current_floor_ptr->o_list[i].next_o_idx = o_idx;
633 = scan_floor_items(owner_ptr, fis_ptr->floor_list, owner_ptr->y, owner_ptr->x, SCAN_FLOOR_ITEM_TESTER | SCAN_FLOOR_ONLY_MARKED, fis_ptr->tval);
642 if (command_wrk == (USE_INVEN)) {
643 if (!fis_ptr->allow_equip) {
647 command_wrk = (USE_EQUIP);
648 } else if (command_wrk == (USE_EQUIP)) {
649 if (!fis_ptr->allow_inven) {
653 command_wrk = (USE_INVEN);
654 } else if (command_wrk == (USE_FLOOR)) {
655 if (fis_ptr->allow_inven) {
656 command_wrk = (USE_INVEN);
657 } else if (fis_ptr->allow_equip) {
658 command_wrk = (USE_EQUIP);
673 if (!fis_ptr->allow_floor) {
678 if (fis_ptr->floor_num == 1) {
679 if ((command_wrk == (USE_FLOOR)) || (!carry_query_flag)) {
680 fis_ptr->k = 0 - fis_ptr->floor_list[0];
681 if (!get_item_allow(owner_ptr, fis_ptr->k)) {
682 fis_ptr->done = TRUE;
687 fis_ptr->item = TRUE;
688 fis_ptr->done = TRUE;
698 command_wrk = (USE_FLOOR);
711 if (command_wrk != USE_FLOOR) {
712 if (!get_tag(owner_ptr, &fis_ptr->k, fis_ptr->which, command_wrk, fis_ptr->tval)) {
717 if ((fis_ptr->k < INVEN_MAIN_HAND) ? !fis_ptr->inven : !fis_ptr->equip) {
722 if (!get_item_okay(owner_ptr, fis_ptr->k, fis_ptr->tval)) {
727 if (get_tag_floor(owner_ptr->current_floor_ptr, &fis_ptr->k, fis_ptr->which, fis_ptr->floor_list, fis_ptr->floor_num)) {
728 fis_ptr->k = 0 - fis_ptr->floor_list[fis_ptr->k];
735 if (!get_item_allow(owner_ptr, fis_ptr->k)) {
736 fis_ptr->done = TRUE;
741 fis_ptr->item = TRUE;
742 fis_ptr->done = TRUE;
743 fis_ptr->cur_tag = fis_ptr->which;
747 if (fis_ptr->force) {
749 fis_ptr->item = TRUE;
750 fis_ptr->done = TRUE;
756 bool tag_not_found = FALSE;
758 if (command_wrk != USE_FLOOR) {
759 if (!get_tag(owner_ptr, &fis_ptr->k, fis_ptr->which, command_wrk, fis_ptr->tval))
760 tag_not_found = TRUE;
761 else if ((fis_ptr->k < INVEN_MAIN_HAND) ? !fis_ptr->inven : !fis_ptr->equip)
762 tag_not_found = TRUE;
765 fis_ptr->cur_tag = fis_ptr->which;
767 if (get_tag_floor(owner_ptr->current_floor_ptr, &fis_ptr->k, fis_ptr->which, fis_ptr->floor_list, fis_ptr->floor_num)) {
768 fis_ptr->k = 0 - fis_ptr->floor_list[fis_ptr->k];
769 fis_ptr->cur_tag = fis_ptr->which;
771 tag_not_found = TRUE;
775 fis_ptr->which = (char)tolower(fis_ptr->which);
776 if (command_wrk == (USE_INVEN)) {
777 if (fis_ptr->which == '(')
778 fis_ptr->k = fis_ptr->i1;
779 else if (fis_ptr->which == ')')
780 fis_ptr->k = fis_ptr->i2;
782 fis_ptr->k = label_to_inventory(owner_ptr, fis_ptr->which);
783 } else if (command_wrk == (USE_EQUIP)) {
784 if (fis_ptr->which == '(')
785 fis_ptr->k = fis_ptr->e1;
786 else if (fis_ptr->which == ')')
787 fis_ptr->k = fis_ptr->e2;
789 fis_ptr->k = label_to_equipment(owner_ptr, fis_ptr->which);
790 } else if (command_wrk == USE_FLOOR) {
791 if (fis_ptr->which == '(')
793 else if (fis_ptr->which == ')')
794 fis_ptr->k = fis_ptr->floor_num - 1;
796 fis_ptr->k = islower(fis_ptr->which) ? A2I(fis_ptr->which) : -1;
797 if (fis_ptr->k < 0 || fis_ptr->k >= fis_ptr->floor_num || fis_ptr->k >= 23) {
802 fis_ptr->k = 0 - fis_ptr->floor_list[fis_ptr->k];
806 if ((command_wrk != USE_FLOOR) && !get_item_okay(owner_ptr, fis_ptr->k, fis_ptr->tval)) {
811 int ver = isupper(fis_ptr->which);
812 if (ver && !verify(owner_ptr, _("本当に", "Try"), fis_ptr->k)) {
813 fis_ptr->done = TRUE;
817 if (!get_item_allow(owner_ptr, fis_ptr->k)) {
818 fis_ptr->done = TRUE;
823 fis_ptr->item = TRUE;
824 fis_ptr->done = TRUE;
835 fis_ptr->tval = TV_NONE;
836 item_tester_hook = NULL;
838 toggle_inventory_equipment(owner_ptr);
840 owner_ptr->window_flags |= (PW_INVEN | PW_EQUIP);
841 handle_stuff(owner_ptr);
843 if (fis_ptr->oops && str)
849 prev_tag = fis_ptr->cur_tag;
853 return fis_ptr->item;