-#include "cmd-io/macro-util.h"
-#include "core/player-redraw-types.h"
-#include "core/player-update-types.h"
+#include "store/cmd-store.h"
+#include "cmd-io/macro-util.h"
#include "core/stuff-handler.h"
#include "core/window-redrawer.h"
-#include "dungeon/dungeon.h"
#include "flavor/flavor-describer.h"
#include "floor/cave.h"
#include "floor/floor-events.h"
#include "floor/floor-town.h"
-#include "floor/wild.h"
#include "game-option/birth-options.h"
#include "game-option/input-options.h"
-#include "grid/feature.h"
#include "inventory/inventory-object.h"
#include "inventory/inventory-slot-types.h"
#include "io/input-key-requester.h"
#include "main/sound-of-music.h"
#include "object/object-info.h"
#include "player-status/player-energy.h"
-#include "store/cmd-store.h"
#include "store/home.h"
#include "store/store-key-processor.h"
#include "store/store-owners.h"
#include "store/store-util.h"
#include "store/store.h"
+#include "system/dungeon-info.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 "system/terrain-type-definition.h"
+#include "term/gameterm.h"
#include "term/screen-processor.h"
#include "util/bit-flags-calculator.h"
#include "view/display-messages.h"
* (cast magic) into "g" (get), and "s" (search) into "d" (drop).
* </pre>
*/
-void do_cmd_store(player_type *player_ptr)
+void do_cmd_store(PlayerType *player_ptr)
{
- if (player_ptr->wild_mode)
+ if (player_ptr->wild_mode) {
return;
+ }
+ TermCenteredOffsetSetter tcos(MAIN_TERM_MIN_COLS, std::nullopt);
TERM_LEN w, h;
term_get_size(&w, &h);
- xtra_stock = std::min(14 + 26, ((h > 24) ? (h - 24) : 0));
+ xtra_stock = std::min(14 + 26, ((h > MAIN_TERM_MIN_ROWS) ? (h - MAIN_TERM_MIN_ROWS) : 0));
store_bottom = MIN_STOCK + xtra_stock;
- grid_type *g_ptr;
- g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
-
- if (!g_ptr->cave_has_flag(FF::STORE)) {
+ auto *floor_ptr = player_ptr->current_floor_ptr;
+ const auto *g_ptr = &floor_ptr->grid_array[player_ptr->y][player_ptr->x];
+ if (!g_ptr->cave_has_flag(TerrainCharacteristics::STORE)) {
msg_print(_("ここには店がありません。", "You see no store here."));
return;
}
// inner_town_num は、施設内で C コマンドなどを使ったときにそのままでは現在地の偽装がバレる
// ため、それを糊塗するためのグローバル変数。
// この辺はリファクタしたい。
- StoreSaleType which = i2enum<StoreSaleType>(f_info[g_ptr->feat].subtype);
+ StoreSaleType store_num = i2enum<StoreSaleType>(terrains_info[g_ptr->feat].subtype);
old_town_num = player_ptr->town_num;
- if ((which == StoreSaleType::HOME) || (which == StoreSaleType::MUSEUM))
+ if ((store_num == StoreSaleType::HOME) || (store_num == StoreSaleType::MUSEUM)) {
player_ptr->town_num = 1;
- if (is_in_dungeon(player_ptr))
- player_ptr->town_num = NO_TOWN;
- inner_town_num = player_ptr->town_num;
+ }
- if ((town_info[player_ptr->town_num].store[enum2i(which)].store_open >= w_ptr->game_turn) || ironman_shops) {
+ if (floor_ptr->is_in_dungeon()) {
+ player_ptr->town_num = VALID_TOWNS;
+ }
+
+ inner_town_num = player_ptr->town_num;
+ auto &town = towns_info[player_ptr->town_num];
+ auto &store = town.stores[store_num];
+ if ((store.store_open >= w_ptr->game_turn) || ironman_shops) {
msg_print(_("ドアに鍵がかかっている。", "The doors are locked."));
player_ptr->town_num = old_town_num;
return;
}
- int maintain_num = (w_ptr->game_turn - town_info[player_ptr->town_num].store[enum2i(which)].last_visit) / (TURNS_PER_TICK * STORE_TICKS);
- if (maintain_num > 10)
+ int maintain_num = (w_ptr->game_turn - store.last_visit) / (TURNS_PER_TICK * STORE_TICKS);
+ if (maintain_num > 10) {
maintain_num = 10;
+ }
if (maintain_num) {
- store_maintenance(player_ptr, player_ptr->town_num, which, maintain_num);
+ store_maintenance(player_ptr, player_ptr->town_num, store_num, maintain_num);
- town_info[player_ptr->town_num].store[enum2i(which)].last_visit = w_ptr->game_turn;
+ store.last_visit = w_ptr->game_turn;
}
- forget_lite(player_ptr->current_floor_ptr);
- forget_view(player_ptr->current_floor_ptr);
+ forget_lite(floor_ptr);
+ forget_view(floor_ptr);
w_ptr->character_icky_depth = 1;
command_arg = 0;
command_rep = 0;
command_new = 0;
get_com_no_macros = true;
- cur_store_num = which;
cur_store_feat = g_ptr->feat;
- st_ptr = &town_info[player_ptr->town_num].store[enum2i(cur_store_num)];
- ot_ptr = &owners[enum2i(cur_store_num)][st_ptr->owner];
+ st_ptr = &towns_info[player_ptr->town_num].stores[store_num];
+ ot_ptr = &owners.at(store_num)[st_ptr->owner];
store_top = 0;
play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BUILD);
- display_store(player_ptr);
+ display_store(player_ptr, store_num);
leave_store = false;
-
+ auto &rfu = RedrawingFlagsUpdater::get_instance();
while (!leave_store) {
prt("", 1, 0);
clear_from(20 + xtra_stock);
prt(_(" スペース) 次ページ", " SPACE) Next page"), 23 + xtra_stock, 0);
}
- if (cur_store_num == StoreSaleType::HOME) {
+ if (store_num == StoreSaleType::HOME) {
prt(_("g) アイテムを取る", "g) Get an item."), 21 + xtra_stock, 27);
prt(_("d) アイテムを置く", "d) Drop an item."), 22 + xtra_stock, 27);
prt(_("x) 家のアイテムを調べる", "x) eXamine an item in the home."), 23 + xtra_stock, 27);
- } else if (cur_store_num == StoreSaleType::MUSEUM) {
+ } else if (store_num == StoreSaleType::MUSEUM) {
prt(_("d) アイテムを置く", "d) Drop an item."), 21 + xtra_stock, 27);
prt(_("r) アイテムの展示をやめる", "r) order to Remove an item."), 22 + xtra_stock, 27);
prt(_("x) 博物館のアイテムを調べる", "x) eXamine an item in the museum."), 23 + xtra_stock, 27);
}
prt(_("i/e) 持ち物/装備の一覧", "i/e) Inventry/Equipment list"), 21 + xtra_stock, 56);
- if (rogue_like_commands)
+ if (rogue_like_commands) {
prt(_("w/T) 装備する/はずす", "w/T) Wear/Take off equipment"), 22 + xtra_stock, 56);
- else
+ } else {
prt(_("w/t) 装備する/はずす", "w/t) Wear/Take off equipment"), 22 + xtra_stock, 56);
+ }
prt(_("コマンド:", "You may: "), 20 + xtra_stock, 0);
- request_command(player_ptr, true);
- store_process_command(player_ptr);
-
- bool need_redraw_store_inv = any_bits(player_ptr->update, PU_BONUS);
+ InputKeyRequestor(player_ptr, true).request_command();
+ store_process_command(player_ptr, store_num);
w_ptr->character_icky_depth = 1;
handle_stuff(player_ptr);
- if (player_ptr->inventory_list[INVEN_PACK].k_idx) {
+ if (player_ptr->inventory_list[INVEN_PACK].bi_id) {
INVENTORY_IDX item = INVEN_PACK;
- object_type *o_ptr = &player_ptr->inventory_list[item];
- if (cur_store_num != StoreSaleType::HOME) {
- if (cur_store_num == StoreSaleType::MUSEUM)
+ auto *o_ptr = &player_ptr->inventory_list[item];
+ if (store_num != StoreSaleType::HOME) {
+ if (store_num == StoreSaleType::MUSEUM) {
msg_print(_("ザックからアイテムがあふれそうなので、あわてて博物館から出た...", "Your pack is so full that you flee the Museum..."));
- else
+ } else {
msg_print(_("ザックからアイテムがあふれそうなので、あわてて店から出た...", "Your pack is so full that you flee the store..."));
+ }
leave_store = true;
- } else if (!store_check_num(o_ptr)) {
+ } else if (!store_check_num(o_ptr, store_num)) {
msg_print(_("ザックからアイテムがあふれそうなので、あわてて家から出た...", "Your pack is so full that you flee your home..."));
leave_store = true;
} else {
int item_pos;
- object_type forge;
- object_type *q_ptr;
- GAME_TEXT o_name[MAX_NLEN];
+ ItemEntity forge;
+ ItemEntity *q_ptr;
msg_print(_("ザックからアイテムがあふれてしまった!", "Your pack overflows!"));
q_ptr = &forge;
q_ptr->copy_from(o_ptr);
- describe_flavor(player_ptr, o_name, q_ptr, 0);
- msg_format(_("%sが落ちた。(%c)", "You drop %s (%c)."), o_name, index_to_label(item));
+ const auto item_name = describe_flavor(player_ptr, q_ptr, 0);
+ msg_format(_("%sが落ちた。(%c)", "You drop %s (%c)."), item_name.data(), index_to_label(item));
vary_item(player_ptr, item, -255);
handle_stuff(player_ptr);
- item_pos = home_carry(player_ptr, q_ptr);
+ item_pos = home_carry(player_ptr, q_ptr, store_num);
if (item_pos >= 0) {
store_top = (item_pos / store_bottom) * store_bottom;
- display_store_inventory(player_ptr);
+ display_store_inventory(player_ptr, store_num);
}
}
}
- if (need_redraw_store_inv)
- display_store_inventory(player_ptr);
+ if (rfu.has(StatusRedrawingFlag::BONUS)) {
+ display_store_inventory(player_ptr, store_num);
+ }
- if (st_ptr->store_open >= w_ptr->game_turn)
+ if (st_ptr->store_open >= w_ptr->game_turn) {
leave_store = true;
+ }
}
// 現在地の偽装を解除。
msg_erase();
term_clear();
- player_ptr->update |= PU_VIEW | PU_LITE | PU_MON_LITE;
- player_ptr->update |= PU_MONSTERS;
- player_ptr->redraw |= PR_BASIC | PR_EXTRA | PR_EQUIPPY;
- player_ptr->redraw |= PR_MAP;
+ const auto flags_srf = {
+ StatusRedrawingFlag::VIEW,
+ StatusRedrawingFlag::LITE,
+ StatusRedrawingFlag::MONSTER_LITE,
+ StatusRedrawingFlag::MONSTER_STATUSES,
+ };
+ rfu.set_flags(flags_srf);
+ const auto flags_mwrf = {
+ MainWindowRedrawingFlag::BASIC,
+ MainWindowRedrawingFlag::EXTRA,
+ MainWindowRedrawingFlag::EQUIPPY,
+ MainWindowRedrawingFlag::MAP,
+ };
+ rfu.set_flags(flags_mwrf);
player_ptr->window_flags |= PW_OVERHEAD | PW_DUNGEON;
}