OSDN Git Service

[Refactor] #3286 Removed player-redraw-types.h
[hengbandforosx/hengbandosx.git] / src / inventory / player-inventory.cpp
index 786d719..b9ba1bb 100644 (file)
@@ -2,8 +2,6 @@
 #include "autopick/autopick.h"
 #include "core/asking-player.h"
 #include "core/disturbance.h"
-#include "core/player-redraw-types.h"
-#include "core/player-update-types.h"
 #include "core/stuff-handler.h"
 #include "core/window-redrawer.h"
 #include "dungeon/quest.h"
 #include "spell-kind/spells-perception.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-type-definition.h"
-#include "system/object-type-definition.h"
+#include "system/item-entity.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "target/target-checker.h"
+#include "term/z-form.h"
+#include "util/string-processor.h"
 #include "view/display-messages.h"
 #include "world/world.h"
 #ifdef JP
  * @return アイテムを拾えるならばTRUEを返す。
  * @details assuming mode = (USE_EQUIP | USE_INVEN | USE_FLOOR).
  */
-bool can_get_item(player_type *player_ptr, const ItemTester& item_tester)
+bool can_get_item(PlayerType *player_ptr, const ItemTester &item_tester)
 {
-    for (int j = 0; j < INVEN_TOTAL; j++)
-        if (item_tester.okay(&player_ptr->inventory_list[j]))
+    for (int j = 0; j < INVEN_TOTAL; j++) {
+        if (item_tester.okay(&player_ptr->inventory_list[j])) {
             return true;
+        }
+    }
 
+    constexpr auto mode = SCAN_FLOOR_ITEM_TESTER | SCAN_FLOOR_ONLY_MARKED;
     OBJECT_IDX floor_list[23];
-    ITEM_NUMBER floor_num = scan_floor_items(player_ptr, floor_list, player_ptr->y, player_ptr->x, SCAN_FLOOR_ITEM_TESTER | SCAN_FLOOR_ONLY_MARKED, item_tester);
+    ITEM_NUMBER floor_num = scan_floor_items(player_ptr, floor_list, player_ptr->y, player_ptr->x, mode, item_tester);
     return floor_num != 0;
 }
 
@@ -59,16 +63,17 @@ bool can_get_item(player_type *player_ptr, const ItemTester& item_tester)
  * @brief 床上のアイテムを拾う選択用サブルーチン
  * @return プレイヤーによりアイテムが選択されたならTRUEを返す。
  */
-static bool py_pickup_floor_aux(player_type *player_ptr)
+static bool py_pickup_floor_aux(PlayerType *player_ptr)
 {
     OBJECT_IDX this_o_idx;
     OBJECT_IDX item;
     concptr q = _("どれを拾いますか?", "Get which item? ");
     concptr s = _("もうザックには床にあるどのアイテムも入らない。", "You no longer have any room for the objects on the floor.");
-    if (choose_object(player_ptr, &item, q, s, (USE_FLOOR), FuncItemTester(check_store_item_to_inventory, player_ptr)))
+    if (choose_object(player_ptr, &item, q, s, (USE_FLOOR), FuncItemTester(check_store_item_to_inventory, player_ptr))) {
         this_o_idx = 0 - item;
-    else
+    } else {
         return false;
+    }
 
     describe_pickup_item(player_ptr, this_o_idx);
     return true;
@@ -80,89 +85,98 @@ static bool py_pickup_floor_aux(player_type *player_ptr)
  * @details
  * This is called by py_pickup() when easy_floor is TRUE.
  */
-void py_pickup_floor(player_type *player_ptr, bool pickup)
+void py_pickup_floor(PlayerType *player_ptr, bool pickup)
 {
-    GAME_TEXT o_name[MAX_NLEN];
-    object_type *o_ptr;
     int floor_num = 0;
     OBJECT_IDX floor_o_idx = 0;
     int can_pickup = 0;
     auto &o_idx_list = player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].o_idx_list;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     for (auto it = o_idx_list.begin(); it != o_idx_list.end();) {
         const OBJECT_IDX this_o_idx = *it++;
-        o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
-        describe_flavor(player_ptr, o_name, o_ptr, 0);
+        auto *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
+        const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
         disturb(player_ptr, false, false);
-        if (o_ptr->tval == TV_GOLD) {
-            msg_format(_(" $%ld の価値がある%sを見つけた。", "You have found %ld gold pieces worth of %s."), (long)o_ptr->pval, o_name);
+        if (o_ptr->bi_key.tval() == ItemKindType::GOLD) {
+            constexpr auto mes = _(" $%ld の価値がある%sを見つけた。", "You have found %ld gold pieces worth of %s.");
+            msg_format(mes, (long)o_ptr->pval, item_name.data());
             sound(SOUND_SELL);
             player_ptr->au += o_ptr->pval;
-            player_ptr->redraw |= (PR_GOLD);
+            rfu.set_flag(MainWindowRedrawingFlag::GOLD);
             player_ptr->window_flags |= (PW_PLAYER);
             delete_object_idx(player_ptr, this_o_idx);
             continue;
-        } else if (o_ptr->marked & OM_NOMSG) {
-            o_ptr->marked &= ~(OM_NOMSG);
+        } else if (o_ptr->marked.has(OmType::SUPRESS_MESSAGE)) {
+            o_ptr->marked.reset(OmType::SUPRESS_MESSAGE);
             continue;
         }
 
-        if (check_store_item_to_inventory(player_ptr, o_ptr))
+        if (check_store_item_to_inventory(player_ptr, o_ptr)) {
             can_pickup++;
+        }
 
         floor_num++;
         floor_o_idx = this_o_idx;
     }
 
-    if (!floor_num)
+    if (!floor_num) {
         return;
+    }
 
     if (!pickup) {
         if (floor_num == 1) {
-            o_ptr = &player_ptr->current_floor_ptr->o_list[floor_o_idx];
-            describe_flavor(player_ptr, o_name, o_ptr, 0);
-            msg_format(_("%sがある。", "You see %s."), o_name);
-        } else
+            auto *o_ptr = &player_ptr->current_floor_ptr->o_list[floor_o_idx];
+            const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
+            msg_format(_("%sがある。", "You see %s."), item_name.data());
+        } else {
             msg_format(_("%d 個のアイテムの山がある。", "You see a pile of %d items."), floor_num);
+        }
 
         return;
     }
 
     if (!can_pickup) {
         if (floor_num == 1) {
-            o_ptr = &player_ptr->current_floor_ptr->o_list[floor_o_idx];
-            describe_flavor(player_ptr, o_name, o_ptr, 0);
-            msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), o_name);
-        } else
+            auto *o_ptr = &player_ptr->current_floor_ptr->o_list[floor_o_idx];
+            const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
+            msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), item_name.data());
+        } else {
             msg_print(_("ザックには床にあるどのアイテムも入らない。", "You have no room for any of the objects on the floor."));
+        }
 
         return;
     }
 
     if (floor_num != 1) {
-        while (can_pickup--)
-            if (!py_pickup_floor_aux(player_ptr))
+        while (can_pickup--) {
+            if (!py_pickup_floor_aux(player_ptr)) {
                 break;
+            }
+        }
 
         return;
     }
 
-    if (carry_query_flag) {
-        char out_val[MAX_NLEN + 20];
-        o_ptr = &player_ptr->current_floor_ptr->o_list[floor_o_idx];
-        describe_flavor(player_ptr, o_name, o_ptr, 0);
-        (void)sprintf(out_val, _("%sを拾いますか? ", "Pick up %s? "), o_name);
-        if (!get_check(out_val))
-            return;
+    if (!carry_query_flag) {
+        describe_pickup_item(player_ptr, floor_o_idx);
+        return;
+    }
+
+    char out_val[MAX_NLEN + 20];
+    auto *o_ptr = &player_ptr->current_floor_ptr->o_list[floor_o_idx];
+    const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
+    strnfmt(out_val, sizeof(out_val), _("%sを拾いますか? ", "Pick up %s? "), item_name.data());
+    if (!get_check(out_val)) {
+        return;
     }
 
-    o_ptr = &player_ptr->current_floor_ptr->o_list[floor_o_idx];
     describe_pickup_item(player_ptr, floor_o_idx);
 }
 
 /*!
  * @brief プレイヤーがオブジェクトを拾った際のメッセージ表示処理 /
  * Helper routine for py_pickup() and py_pickup_floor().
- * @param player_ptr ã\83\97ã\83¬ã\83¼ヤーへの参照ポインタ
+ * @param player_ptr ã\83\97ã\83¬ã\82¤ヤーへの参照ポインタ
  * @param o_idx 取得したオブジェクトの参照ID
  * @details
  * アイテムを拾った際に「2つのケーキを持っている」
@@ -172,77 +186,69 @@ void py_pickup_floor(player_type *player_ptr, bool pickup)
  * Add the given dungeon object to the character's inventory.\n
  * Delete the object afterwards.\n
  */
-void describe_pickup_item(player_type *player_ptr, OBJECT_IDX o_idx)
+void describe_pickup_item(PlayerType *player_ptr, OBJECT_IDX o_idx)
 {
+    auto *o_ptr = &player_ptr->current_floor_ptr->o_list[o_idx];
 #ifdef JP
-    GAME_TEXT o_name[MAX_NLEN];
-    GAME_TEXT old_name[MAX_NLEN];
-    char kazu_str[80];
-    int hirottakazu;
+    const auto old_item_name = describe_flavor(player_ptr, o_ptr, OD_NAME_ONLY);
+    const auto picked_count_str = describe_count_with_counter_suffix(*o_ptr);
+    const auto picked_count = o_ptr->number;
 #else
-    GAME_TEXT o_name[MAX_NLEN];
+    (void)o_ptr;
 #endif
 
-    object_type *o_ptr;
-    o_ptr = &player_ptr->current_floor_ptr->o_list[o_idx];
-
-#ifdef JP
-    describe_flavor(player_ptr, old_name, o_ptr, OD_NAME_ONLY);
-    object_desc_count_japanese(kazu_str, o_ptr);
-    hirottakazu = o_ptr->number;
-#endif
-
-    INVENTORY_IDX slot = store_item_to_inventory(player_ptr, o_ptr);
+    auto slot = store_item_to_inventory(player_ptr, o_ptr);
     o_ptr = &player_ptr->inventory_list[slot];
     delete_object_idx(player_ptr, o_idx);
-    if (player_ptr->pseikaku == PERSONALITY_MUNCHKIN) {
+    if (player_ptr->ppersonality == PERSONALITY_MUNCHKIN) {
         bool old_known = identify_item(player_ptr, o_ptr);
         autopick_alter_item(player_ptr, slot, (bool)(destroy_identify && !old_known));
-        if (o_ptr->marked & OM_AUTODESTROY)
+        if (o_ptr->marked.has(OmType::AUTODESTROY)) {
             return;
+        }
     }
 
-    describe_flavor(player_ptr, o_name, o_ptr, 0);
-
+    const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
 #ifdef JP
-    if ((o_ptr->name1 == ART_CRIMSON) && (player_ptr->pseikaku == PERSONALITY_COMBAT)) {
+    if (o_ptr->is_specific_artifact(FixedArtifactId::CRIMSON) && (player_ptr->ppersonality == PERSONALITY_COMBAT)) {
         msg_format("こうして、%sは『クリムゾン』を手に入れた。", player_ptr->name);
         msg_print("しかし今、『混沌のサーペント』の放ったモンスターが、");
         msg_format("%sに襲いかかる...", player_ptr->name);
     } else {
         if (plain_pickup) {
-            msg_format("%s(%c)を持っている。", o_name, index_to_label(slot));
+            msg_format("%s(%c)を持っている。", item_name.data(), index_to_label(slot));
         } else {
-            if (o_ptr->number > hirottakazu) {
-                msg_format("%s拾って、%s(%c)を持っている。", kazu_str, o_name, index_to_label(slot));
+            if (o_ptr->number > picked_count) {
+                msg_format("%s拾って、%s(%c)を持っている。", picked_count_str.data(), item_name.data(), index_to_label(slot));
             } else {
-                msg_format("%s(%c)を拾った。", o_name, index_to_label(slot));
+                msg_format("%s(%c)を拾った。", item_name.data(), index_to_label(slot));
             }
         }
     }
 
-    strcpy(record_o_name, old_name);
+    angband_strcpy(record_o_name, old_item_name.data(), old_item_name.length());
 #else
-    msg_format("You have %s (%c).", o_name, index_to_label(slot));
-    strcpy(record_o_name, o_name);
+    msg_format("You have %s (%c).", item_name.data(), index_to_label(slot));
+    angband_strcpy(record_o_name, item_name.data(), item_name.length());
 #endif
-    record_turn = current_world_ptr->game_turn;
+    record_turn = w_ptr->game_turn;
     check_find_art_quest_completion(player_ptr, o_ptr);
 }
 
 /*!
  * @brief プレイヤーがオブジェクト上に乗った際の表示処理 / Player "wants" to pick up an object or gold.
- * @param player_ptr ã\83\97ã\83¬ã\83¼ヤーへの参照ポインタ
+ * @param player_ptr ã\83\97ã\83¬ã\82¤ヤーへの参照ポインタ
  * @param pickup 自動拾い処理を行うならばTRUEとする
  */
-void carry(player_type *player_ptr, bool pickup)
+void carry(PlayerType *player_ptr, bool pickup)
 {
     verify_panel(player_ptr);
-    player_ptr->update |= PU_MONSTERS;
-    player_ptr->redraw |= PR_MAP;
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
+    rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+    rfu.set_flag(MainWindowRedrawingFlag::MAP);
     player_ptr->window_flags |= PW_OVERHEAD;
     handle_stuff(player_ptr);
-    grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
+    auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
     autopick_pickup_items(player_ptr, g_ptr);
     if (easy_floor) {
         py_pickup_floor(player_ptr, pickup);
@@ -251,41 +257,39 @@ void carry(player_type *player_ptr, bool pickup)
 
     for (auto it = g_ptr->o_idx_list.begin(); it != g_ptr->o_idx_list.end();) {
         const OBJECT_IDX this_o_idx = *it++;
-        object_type *o_ptr;
-        o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
-        GAME_TEXT o_name[MAX_NLEN];
-        describe_flavor(player_ptr, o_name, o_ptr, 0);
+        auto *o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
+        const auto item_name = describe_flavor(player_ptr, o_ptr, 0);
         disturb(player_ptr, false, false);
-        if (o_ptr->tval == TV_GOLD) {
+        if (o_ptr->bi_key.tval() == ItemKindType::GOLD) {
             int value = (long)o_ptr->pval;
             delete_object_idx(player_ptr, this_o_idx);
-            msg_format(_(" $%ld の価値がある%sを見つけた。", "You collect %ld gold pieces worth of %s."), (long)value, o_name);
+            msg_format(_(" $%ld の価値がある%sを見つけた。", "You collect %ld gold pieces worth of %s."), (long)value, item_name.data());
             sound(SOUND_SELL);
             player_ptr->au += value;
-            player_ptr->redraw |= (PR_GOLD);
+            rfu.set_flag(MainWindowRedrawingFlag::GOLD);
             player_ptr->window_flags |= (PW_PLAYER);
             continue;
         }
 
-        if (o_ptr->marked & OM_NOMSG) {
-            o_ptr->marked &= ~OM_NOMSG;
+        if (o_ptr->marked.has(OmType::SUPRESS_MESSAGE)) {
+            o_ptr->marked.reset(OmType::SUPRESS_MESSAGE);
             continue;
         }
 
         if (!pickup) {
-            msg_format(_("%sがある。", "You see %s."), o_name);
+            msg_format(_("%sがある。", "You see %s."), item_name.data());
             continue;
         }
 
         if (!check_store_item_to_inventory(player_ptr, o_ptr)) {
-            msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), o_name);
+            msg_format(_("ザックには%sを入れる隙間がない。", "You have no room for %s."), item_name.data());
             continue;
         }
 
         int is_pickup_successful = true;
         if (carry_query_flag) {
             char out_val[MAX_NLEN + 20];
-            sprintf(out_val, _("%sを拾いますか? ", "Pick up %s? "), o_name);
+            strnfmt(out_val, sizeof(out_val), _("%sを拾いますか? ", "Pick up %s? "), item_name.data());
             is_pickup_successful = get_check(out_val);
         }