2 * @brief ゲーム属性を変更するデバッグコマンド
6 #include "wizard/wizard-game-modifier.h"
7 #include "core/asking-player.h"
8 #include "dungeon/quest.h"
9 #include "info-reader/fixed-map-parser.h"
10 #include "io/input-key-requester.h"
11 #include "market/arena.h"
12 #include "monster-race/monster-race.h"
13 #include "monster-race/race-flags1.h"
14 #include "monster-race/race-flags7.h"
15 #include "monster-race/race-indice-types.h"
16 #include "player-info/self-info.h"
17 #include "system/floor-type-definition.h"
18 #include "system/monster-race-info.h"
19 #include "system/player-type-definition.h"
20 #include "system/system-variables.h"
21 #include "term/screen-processor.h"
22 #include "util/bit-flags-calculator.h"
23 #include "util/int-char-converter.h"
24 #include "view/display-messages.h"
25 #include "wizard/wizard-special-process.h"
32 void wiz_enter_quest(PlayerType *player_ptr);
33 void wiz_complete_quest(PlayerType *player_ptr);
34 void wiz_restore_monster_max_num(MonsterRaceId r_idx);
39 constexpr std::array wizard_game_modifier_menu_table = {
40 std::make_tuple('t', _("プレイ時間変更", "Modify played time")),
41 std::make_tuple('q', _("現在のクエストを完了", "Complete current quest")),
42 std::make_tuple('Q', _("クエストに突入", "Enter quest")),
43 std::make_tuple('u', _("ユニーク/ナズグルの生存数を復元", "Restore living info of unique/nazgul")),
44 std::make_tuple('g', _("モンスター闘技場出場者更新", "Update gambling monster")),
48 * @brief ゲーム設定コマンドの一覧を表示する
50 void display_wizard_game_modifier_menu()
52 for (auto y = 1U; y <= wizard_game_modifier_menu_table.size(); y++) {
53 term_erase(14, y, 64);
58 for (const auto &[symbol, desc] : wizard_game_modifier_menu_table) {
60 ss << symbol << ") " << desc;
61 put_str(ss.str(), r++, c);
66 * @brief ゲーム設定コマンドの入力を受け付ける
67 * @param player_ptr プレイヤーの情報へのポインタ
69 void wizard_game_modifier(PlayerType *player_ptr)
72 display_wizard_game_modifier_menu();
74 const auto command = input_command("Player Command: ");
75 const auto cmd = command.value_or(ESCAPE);
85 update_gambling_monsters(player_ptr);
88 wiz_complete_quest(player_ptr);
91 wiz_enter_quest(player_ptr);
94 wiz_restore_monster_max_num(i2enum<MonsterRaceId>(command_arg));
103 * @brief 指定したクエストに突入する
104 * @param プレイヤーの情報へのポインタ
106 void wiz_enter_quest(PlayerType *player_ptr)
108 auto &quest_list = QuestList::get_instance();
109 const auto quest_max = enum2i(quest_list.rbegin()->first);
110 const auto quest_num = input_numerics("QuestID", 0, quest_max - 1, QuestId::NONE);
111 if (!quest_num.has_value()) {
115 auto q_idx = quest_num.value();
116 init_flags = i2enum<init_flags_type>(INIT_SHOW_TEXT | INIT_ASSIGN);
117 player_ptr->current_floor_ptr->quest_number = q_idx;
118 parse_fixed_map(player_ptr, QUEST_DEFINITION_LIST, 0, 0, 0, 0);
119 quest_list[q_idx].status = QuestStatusType::TAKEN;
120 if (quest_list[q_idx].dungeon == 0) {
121 exe_enter_quest(player_ptr, q_idx);
126 * @brief 指定したクエストを完了させる
127 * @param プレイヤーの情報へのポインタ
129 void wiz_complete_quest(PlayerType *player_ptr)
131 if (!inside_quest(player_ptr->current_floor_ptr->quest_number)) {
132 msg_print("No current quest");
137 const auto &quest_list = QuestList::get_instance();
138 if (quest_list[player_ptr->current_floor_ptr->quest_number].status == QuestStatusType::TAKEN) {
139 complete_quest(player_ptr, player_ptr->current_floor_ptr->quest_number);
143 void wiz_restore_monster_max_num(MonsterRaceId r_idx)
145 if (!MonsterRace(r_idx).is_valid()) {
146 const auto restore_monrace_id = input_numerics("MonsterID", 1, monraces_info.size() - 1, MonsterRaceId::FILTHY_URCHIN);
147 if (!restore_monrace_id.has_value()) {
151 r_idx = restore_monrace_id.value();
154 auto *r_ptr = &monraces_info[r_idx];
156 if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
158 } else if (r_ptr->population_flags.has(MonsterPopulationType::NAZGUL)) {
163 msg_print(_("出現数に制限がないモンスターです。", "This monster can appear any time."));
172 std::stringstream ss;
173 ss << r_ptr->name << _("の出現数を復元しました。", " can appear again now.");