OSDN Git Service

[feature] ソースファイルをC++に対応
[hengbandforosx/hengbandosx.git] / src / inventory / floor-item-getter.c
index 4fa3b5a..15c94da 100644 (file)
@@ -46,10 +46,11 @@ static bool check_floor_item_tag_aux(player_type *owner_ptr, fis_type *fis_ptr,
         return FALSE;
 
     if (*prev_tag && command_cmd) {
-        fis_ptr->floor_num = scan_floor_items(owner_ptr, fis_ptr->floor_list, owner_ptr->y, owner_ptr->x, 0x03, fis_ptr->tval);
+        fis_ptr->floor_num
+            = 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);
         if (get_tag_floor(owner_ptr->current_floor_ptr, &fis_ptr->k, *prev_tag, fis_ptr->floor_list, fis_ptr->floor_num)) {
             *fis_ptr->cp = 0 - fis_ptr->floor_list[fis_ptr->k];
-            fis_ptr->tval = 0;
+            fis_ptr->tval = TV_NONE;
             item_tester_hook = NULL;
             command_cmd = 0;
             return TRUE;
@@ -62,7 +63,7 @@ static bool check_floor_item_tag_aux(player_type *owner_ptr, fis_type *fis_ptr,
     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))
         return FALSE;
 
-    fis_ptr->tval = 0;
+    fis_ptr->tval = TV_NONE;
     item_tester_hook = NULL;
     command_cmd = 0;
     return TRUE;
@@ -77,11 +78,18 @@ static bool check_floor_item_tag_aux(player_type *owner_ptr, fis_type *fis_ptr,
  */
 static bool get_floor_item_tag_inventory(player_type *owner_ptr, fis_type *fis_ptr, char *prev_tag)
 {
-    if ((*prev_tag == '\0') || !command_cmd)
-        return FALSE;
+    bool flag = FALSE;
+    item_use_flag use_flag = (*fis_ptr->cp >= INVEN_MAIN_HAND) ? USE_EQUIP : USE_INVEN;
+
+    flag |= !get_tag(owner_ptr, &fis_ptr->k, *prev_tag, use_flag, fis_ptr->tval);
+    flag |= !get_item_okay(owner_ptr, fis_ptr->k, fis_ptr->tval);
+
+    if (fis_ptr->k < INVEN_MAIN_HAND)
+        flag |= !fis_ptr->inven;
+    else
+        flag |= !fis_ptr->equip;
 
-    if (!get_tag(owner_ptr, &fis_ptr->k, *prev_tag, (*fis_ptr->cp >= INVEN_RARM) ? USE_EQUIP : USE_INVEN, fis_ptr->tval)
-        || ((fis_ptr->k < INVEN_RARM) ? !fis_ptr->inven : !fis_ptr->equip) || !get_item_okay(owner_ptr, fis_ptr->k, fis_ptr->tval)) {
+    if (flag) {
         *prev_tag = '\0';
         return FALSE;
     }
@@ -103,14 +111,14 @@ static bool get_floor_item_tag_inventory(player_type *owner_ptr, fis_type *fis_p
 static bool check_floor_item_tag_inventory(player_type *owner_ptr, fis_type *fis_ptr, char *prev_tag)
 {
     if ((!fis_ptr->inven || (*fis_ptr->cp < 0) || (*fis_ptr->cp >= INVEN_PACK))
-        && (!fis_ptr->equip || (*fis_ptr->cp < INVEN_RARM) || (*fis_ptr->cp >= INVEN_TOTAL)))
+        && (!fis_ptr->equip || (*fis_ptr->cp < INVEN_MAIN_HAND) || (*fis_ptr->cp >= INVEN_TOTAL)))
         return FALSE;
 
-    if (get_floor_item_tag_inventory(owner_ptr, fis_ptr, prev_tag))
-        return TRUE;
+    if ((*prev_tag != '\0') && command_cmd)
+        return get_floor_item_tag_inventory(owner_ptr, fis_ptr, prev_tag);
 
     if (get_item_okay(owner_ptr, *fis_ptr->cp, fis_ptr->tval)) {
-        fis_ptr->tval = 0;
+        fis_ptr->tval = TV_NONE;
         item_tester_hook = NULL;
         command_cmd = 0;
         return TRUE;
@@ -132,7 +140,7 @@ static bool check_floor_item_tag(player_type *owner_ptr, fis_type *fis_ptr, char
         return FALSE;
 
     if (fis_ptr->force && (*fis_ptr->cp == INVEN_FORCE)) {
-        fis_ptr->tval = 0;
+        fis_ptr->tval = TV_NONE;
         item_tester_hook = NULL;
         command_cmd = 0;
         return TRUE;
@@ -181,8 +189,9 @@ static void test_equipment_floor(player_type *owner_ptr, fis_type *fis_ptr)
     if (!use_menu)
         return;
 
-    for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++)
-        if (select_ring_slot ? is_ring_slot(i) : item_tester_okay(owner_ptr, &owner_ptr->inventory_list[i], fis_ptr->tval) || (fis_ptr->mode & USE_FULL))
+    for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++)
+        if (owner_ptr->select_ring_slot ? is_ring_slot(i)
+                                        : item_tester_okay(owner_ptr, &owner_ptr->inventory_list[i], fis_ptr->tval) || (fis_ptr->mode & USE_FULL))
             fis_ptr->max_equip++;
 }
 
@@ -204,6 +213,7 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
         return TRUE;
 
     msg_print(NULL);
+    handle_stuff(owner_ptr);
     test_inventory_floor(owner_ptr, fis_ptr);
     fis_ptr->done = FALSE;
     fis_ptr->item = FALSE;
@@ -215,10 +225,10 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
     while ((fis_ptr->i1 <= fis_ptr->i2) && (!get_item_okay(owner_ptr, fis_ptr->i2, fis_ptr->tval)))
         fis_ptr->i2--;
 
-    fis_ptr->e1 = INVEN_RARM;
+    fis_ptr->e1 = INVEN_MAIN_HAND;
     fis_ptr->e2 = INVEN_TOTAL - 1;
     test_equipment_floor(owner_ptr, fis_ptr);
-    if (have_two_handed_weapons(owner_ptr) && !(fis_ptr->mode & IGNORE_BOTHHAND_SLOT))
+    if (has_two_handed_weapons(owner_ptr) && !(fis_ptr->mode & IGNORE_BOTHHAND_SLOT))
         fis_ptr->max_equip++;
 
     while ((fis_ptr->e1 <= fis_ptr->e2) && (!get_item_okay(owner_ptr, fis_ptr->e1, fis_ptr->tval)))
@@ -227,25 +237,26 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
     while ((fis_ptr->e1 <= fis_ptr->e2) && (!get_item_okay(owner_ptr, fis_ptr->e2, fis_ptr->tval)))
         fis_ptr->e2--;
 
-    if (fis_ptr->equip && have_two_handed_weapons(owner_ptr) && !(fis_ptr->mode & IGNORE_BOTHHAND_SLOT)) {
-        if (have_right_hand_weapon(owner_ptr)) {
-            if (fis_ptr->e2 < INVEN_LARM)
-                fis_ptr->e2 = INVEN_LARM;
-        } else if (have_left_hand_weapon(owner_ptr))
-            fis_ptr->e1 = INVEN_RARM;
+    if (fis_ptr->equip && has_two_handed_weapons(owner_ptr) && !(fis_ptr->mode & IGNORE_BOTHHAND_SLOT)) {
+        if (can_attack_with_main_hand(owner_ptr)) {
+            if (fis_ptr->e2 < INVEN_SUB_HAND)
+                fis_ptr->e2 = INVEN_SUB_HAND;
+        } else if (can_attack_with_sub_hand(owner_ptr))
+            fis_ptr->e1 = INVEN_MAIN_HAND;
     }
 
     fis_ptr->floor_num = 0;
     if (fis_ptr->floor)
-        fis_ptr->floor_num = scan_floor_items(owner_ptr, fis_ptr->floor_list, owner_ptr->y, owner_ptr->x, 0x03, fis_ptr->tval);
+        fis_ptr->floor_num
+            = 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);
 
-    if (fis_ptr->i1 <= fis_ptr->i2)
+    if ((mode & USE_INVEN) && (fis_ptr->i1 <= fis_ptr->i2))
         fis_ptr->allow_inven = TRUE;
 
-    if (fis_ptr->e1 <= fis_ptr->e2)
+    if ((mode & USE_EQUIP) && (fis_ptr->e1 <= fis_ptr->e2))
         fis_ptr->allow_equip = TRUE;
 
-    if (fis_ptr->floor_num)
+    if ((mode & USE_FLOOR) && (fis_ptr->floor_num))
         fis_ptr->allow_floor = TRUE;
 
     if (!fis_ptr->allow_inven && !fis_ptr->allow_equip && !fis_ptr->allow_floor) {
@@ -294,7 +305,7 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
             fis_ptr->toggle = !fis_ptr->toggle;
         }
 
-        owner_ptr->window |= (PW_INVEN | PW_EQUIP);
+        owner_ptr->window_flags |= (PW_INVEN | PW_EQUIP);
         handle_stuff(owner_ptr);
         COMMAND_CODE get_item_label = 0;
         if (command_wrk == USE_INVEN) {
@@ -303,8 +314,8 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
             if (command_see)
                 get_item_label = show_inventory(owner_ptr, fis_ptr->menu_line, fis_ptr->mode, fis_ptr->tval);
         } else if (command_wrk == USE_EQUIP) {
-            fis_ptr->n1 = I2A(fis_ptr->e1 - INVEN_RARM);
-            fis_ptr->n2 = I2A(fis_ptr->e2 - INVEN_RARM);
+            fis_ptr->n1 = I2A(fis_ptr->e1 - INVEN_MAIN_HAND);
+            fis_ptr->n2 = I2A(fis_ptr->e2 - INVEN_MAIN_HAND);
             if (command_see)
                 get_item_label = show_equipment(owner_ptr, fis_ptr->menu_line, mode, fis_ptr->tval);
         } else if (command_wrk == USE_FLOOR) {
@@ -319,8 +330,9 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
         if (command_wrk == USE_INVEN) {
             sprintf(fis_ptr->out_val, _("持ち物:", "Inven:"));
             if (!use_menu) {
-                sprintf(fis_ptr->tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), index_to_label(fis_ptr->i1), index_to_label(fis_ptr->i2));
-                strcat(fis_ptr->out_val, fis_ptr->tmp_val);
+                char tmp_val[80];
+                sprintf(tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), index_to_label(fis_ptr->i1), index_to_label(fis_ptr->i2));
+                strcat(fis_ptr->out_val, tmp_val);
             }
 
             if (!command_see && !use_menu)
@@ -346,8 +358,9 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
         } else if (command_wrk == (USE_EQUIP)) {
             sprintf(fis_ptr->out_val, _("装備品:", "Equip:"));
             if (!use_menu) {
-                sprintf(fis_ptr->tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), index_to_label(fis_ptr->e1), index_to_label(fis_ptr->e2));
-                strcat(fis_ptr->out_val, fis_ptr->tmp_val);
+                char tmp_val[80];
+                sprintf(tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), index_to_label(fis_ptr->e1), index_to_label(fis_ptr->e2));
+                strcat(fis_ptr->out_val, tmp_val);
             }
 
             if (!command_see && !use_menu)
@@ -373,8 +386,9 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
         } else if (command_wrk == USE_FLOOR) {
             sprintf(fis_ptr->out_val, _("床上:", "Floor:"));
             if (!use_menu) {
-                sprintf(fis_ptr->tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), fis_ptr->n1, fis_ptr->n2);
-                strcat(fis_ptr->out_val, fis_ptr->tmp_val);
+                char tmp_val[80];
+                sprintf(tmp_val, _("%c-%c,'(',')',", " %c-%c,'(',')',"), fis_ptr->n1, fis_ptr->n2);
+                strcat(fis_ptr->out_val, tmp_val);
             }
 
             if (!command_see && !use_menu)
@@ -615,7 +629,8 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
                 i = owner_ptr->current_floor_ptr->o_list[i].next_o_idx;
 
             owner_ptr->current_floor_ptr->o_list[i].next_o_idx = o_idx;
-            fis_ptr->floor_num = scan_floor_items(owner_ptr, fis_ptr->floor_list, owner_ptr->y, owner_ptr->x, 0x03, fis_ptr->tval);
+            fis_ptr->floor_num
+                = 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);
             if (command_see) {
                 screen_load();
                 screen_save();
@@ -699,7 +714,7 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
                     break;
                 }
 
-                if ((fis_ptr->k < INVEN_RARM) ? !fis_ptr->inven : !fis_ptr->equip) {
+                if ((fis_ptr->k < INVEN_MAIN_HAND) ? !fis_ptr->inven : !fis_ptr->equip) {
                     bell();
                     break;
                 }
@@ -743,7 +758,7 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
                 bool not_found = FALSE;
                 if (!get_tag(owner_ptr, &fis_ptr->k, fis_ptr->which, command_wrk, fis_ptr->tval))
                     not_found = TRUE;
-                else if ((fis_ptr->k < INVEN_RARM) ? !fis_ptr->inven : !fis_ptr->equip)
+                else if ((fis_ptr->k < INVEN_MAIN_HAND) ? !fis_ptr->inven : !fis_ptr->equip)
                     not_found = TRUE;
                 else if (!get_item_okay(owner_ptr, fis_ptr->k, fis_ptr->tval))
                     not_found = TRUE;
@@ -825,12 +840,12 @@ bool get_item_floor(player_type *owner_ptr, COMMAND_CODE *cp, concptr pmt, concp
         command_see = FALSE;
     }
 
-    fis_ptr->tval = 0;
+    fis_ptr->tval = TV_NONE;
     item_tester_hook = NULL;
     if (fis_ptr->toggle)
         toggle_inventory_equipment(owner_ptr);
 
-    owner_ptr->window |= (PW_INVEN | PW_EQUIP);
+    owner_ptr->window_flags |= (PW_INVEN | PW_EQUIP);
     handle_stuff(owner_ptr);
     prt("", 0, 0);
     if (fis_ptr->oops && str)