X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Finventory%2Fplayer-inventory.cpp;h=b9ba1bbb0ce2a3d3d14ba58de7814561bde97af1;hb=23cf9fbcf5bcaddd0d8c2ff163a3c2791c201751;hp=786d719da3a54fc78dd633ea6a6994988b1f0ad4;hpb=07d5cbc6a66b19a688f349c2b41cfca042a8bcf3;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/inventory/player-inventory.cpp b/src/inventory/player-inventory.cpp index 786d719da..b9ba1bbb0 100644 --- a/src/inventory/player-inventory.cpp +++ b/src/inventory/player-inventory.cpp @@ -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" @@ -28,9 +26,12 @@ #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 @@ -44,14 +45,17 @@ * @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 プレーヤーへの参照ポインタ + * @param player_ptr プレイヤーへの参照ポインタ * @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 プレーヤーへの参照ポインタ + * @param player_ptr プレイヤーへの参照ポインタ * @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); }