X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Finventory%2Fplayer-inventory.cpp;h=b9ba1bbb0ce2a3d3d14ba58de7814561bde97af1;hb=23cf9fbcf5bcaddd0d8c2ff163a3c2791c201751;hp=46df6b7cdcea3fd8d36cfd43986f624849dbe539;hpb=a91d78639a522d12111441b7ec2d6bacabac5f6f;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/inventory/player-inventory.cpp b/src/inventory/player-inventory.cpp index 46df6b7cd..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 @@ -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); }