#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
}
}
+ 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;
}
*/
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;
}
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);
}
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."));
}
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);
}
*/
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);
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];
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);
}