OSDN Git Service

[Refactor] #3286 Removed player-redraw-types.h
[hengbandforosx/hengbandosx.git] / src / inventory / player-inventory.cpp
index 46df6b7..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
@@ -52,8 +53,9 @@ bool can_get_item(PlayerType *player_ptr, const ItemTester &item_tester)
         }
     }
 
+    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;
 }
 
@@ -85,27 +87,27 @@ static bool py_pickup_floor_aux(PlayerType *player_ptr)
  */
 void py_pickup_floor(PlayerType *player_ptr, bool pickup)
 {
-    GAME_TEXT o_name[MAX_NLEN];
-    ObjectType *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 == ItemKindType::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;
         }
 
@@ -123,9 +125,9 @@ void py_pickup_floor(PlayerType *player_ptr, bool pickup)
 
     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);
+            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);
         }
@@ -135,9 +137,9 @@ void py_pickup_floor(PlayerType *player_ptr, bool pickup)
 
     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);
+            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."));
         }
@@ -155,17 +157,19 @@ void py_pickup_floor(PlayerType *player_ptr, bool pickup)
         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);
 }
 
@@ -184,58 +188,48 @@ void py_pickup_floor(PlayerType *player_ptr, bool pickup)
  */
 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
 
-    ObjectType *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->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->fixed_artifact_idx == FixedArtifactId::CRIMSON) && (player_ptr->ppersonality == 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 = w_ptr->game_turn;
     check_find_art_quest_completion(player_ptr, o_ptr);
@@ -249,8 +243,9 @@ void describe_pickup_item(PlayerType *player_ptr, OBJECT_IDX o_idx)
 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);
     auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
@@ -262,41 +257,39 @@ void carry(PlayerType *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++;
-        ObjectType *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 == ItemKindType::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);
         }