OSDN Git Service

[Fix] デバッグメニュー一覧の -more- 表示
[hengbandforosx/hengbandosx.git] / src / wizard / cmd-wizard.cpp
1 /*!
2  * @brief デバッグコマンドの分岐実装
3  * @date 2020/08/01
4  * @author Hourier
5  * @details 通常のコマンドではないのでcmd-xxx/ ではなくwizard/ 以下に置く
6  */
7
8 #include "wizard/cmd-wizard.h"
9 #include "birth/inventory-initializer.h"
10 #include "cmd-io/cmd-help.h"
11 #include "core/asking-player.h"
12 #include "inventory/inventory-object.h"
13 #include "inventory/inventory-slot-types.h"
14 #include "io/input-key-requester.h"
15 #include "mutation/mutation-investor-remover.h"
16 #include "player/patron.h"
17 #include "spell-kind/spells-detection.h"
18 #include "spell-kind/spells-floor.h"
19 #include "spell-kind/spells-perception.h"
20 #include "spell-kind/spells-sight.h"
21 #include "spell-kind/spells-teleport.h"
22 #include "spell/spells-status.h"
23 #include "status/experience.h"
24 #include "system/floor-type-definition.h"
25 #include "system/grid-type-definition.h"
26 #include "system/object-type-definition.h"
27 #include "system/player-type-definition.h"
28 #include "term/screen-processor.h"
29 #include "util/int-char-converter.h"
30 #include "view/display-messages.h"
31 #include "wizard/wizard-game-modifier.h"
32 #include "wizard/wizard-item-modifier.h"
33 #include "wizard/wizard-player-modifier.h"
34 #include "wizard/wizard-special-process.h"
35 #include "wizard/wizard-spells.h"
36 #include "wizard/wizard-spoiler.h"
37 #include <sstream>
38 #include <string>
39 #include <vector>
40
41 /*!
42  * @brief デバグコマンド一覧表
43  * @details
44  * 空き: A,B,E,I,J,k,K,L,M,q,Q,R,T,U,V,W,y,Y
45  */
46 std::vector<std::vector<std::string>> debug_menu_table = {
47     { "a", _("全状態回復", "Restore all status") },
48     { "b", _("現在のターゲットを引き寄せる", "Teleport target back") },
49     { "c", _("オブジェクト生成", "Create object") },
50     { "C", _("固定アーティファクト生成", "Create fixed artifact") },
51     { "d", _("全感知", "Detection all") },
52     { "D", _("次元の扉", "Dimension door") },
53     { "e", _("能力値変更", "Modify player status") },
54     { "E", _("青魔法を全取得/エッセンスを全取得", "Learn all blue magics / Obtain all essences") },
55     { "f", _("*鑑定*", "*Idenfity*") },
56     { "F", _("地形ID変更", "Modify feature type under player") },
57     { "G", _("ゲーム設定コマンドメニュー", "Modify game configurations") },
58     { "H", _("モンスターの群れ生成", "Summon monsters") },
59     { "i", _("鑑定", "Idenfity") },
60     { "I", _("アイテム設定コマンドメニュー", "Modify item configurations") },
61     { "j", _("指定ダンジョン階にワープ", "Jump to floor depth of target dungeon") },
62     { "k", _("指定ダメージ・半径0の指定属性のボールを自分に放つ", "Fire a zero ball to self") },
63     { "m", _("魔法の地図", "Magic mapping") },
64     { "n", _("指定モンスター生成", "Summon target monster") },
65     { "N", _("指定モンスターをペットとして生成", "Summon target monster as pet") },
66     { "o", _("オブジェクトの能力変更", "Modift object abilities") },
67     { "O", _("オプション設定をダンプ", "Dump current options") },
68     { "p", _("ショート・テレポート", "Phase door") },
69     { "P", _("プレイヤー設定変更メニュー", "Modify player configurations") },
70     { "r", _("カオスパトロンの報酬", "Get reward of chaos patron") },
71     { "s", _("フロア相当のモンスター召喚", "Summon monster which be in target depth") },
72     { "t", _("テレポート", "Teleport self") },
73     { "u", _("啓蒙(忍者以外)", "Wiz-lite all floor except Ninja") },
74     { "w", _("啓蒙(忍者配慮)", "Wiz-lite all floor") },
75     { "x", _("経験値を得る(指定可)", "Get experience") },
76     { "X", _("所持品を初期状態に戻す", "Return inventory to initial") },
77     { "y", _("ダメージ100万・半径0の射撃のボールを放つ", "Cast missile ball had power a million") },
78     { "Y", _("指定ダメージ・半径0の指定属性のボールを放つ", "Cast zero ball had power a thousand") },
79     { "z", _("近隣のモンスター消去", "Terminate near monsters") },
80     { "Z", _("フロアの全モンスター消去", "Terminate all monsters in floor") },
81     { "@", _("特殊スペルの発動", "Activate specified spells") },
82     { "\"", _("スポイラーのダンプ", "Dump spoiler") },
83     { "?", _("ヘルプ表示", "Help") },
84 };
85
86 /*!
87  * @brief デバグコマンドの一覧を表示する
88  * @param page ページ番号
89  * @param max_page ページ数
90  * @param page_size 1ページ行数
91  * @param max_line コマンド数
92  */
93 void display_debug_menu(int page, int max_page, int page_size, int max_line)
94 {
95     for (int y = 1; y < page_size + 3; y++)
96         term_erase(14, y, 64);
97
98     int r = 1;
99     int c = 15;
100     for (int i = 0; i < page_size; i++) {
101         int pos = page * page_size + i;
102         if (pos >= max_line)
103             break;
104
105         std::stringstream ss;
106         ss << debug_menu_table[pos][0] << ") " << debug_menu_table[pos][1];
107         put_str(ss.str().c_str(), r++, c);
108     }
109     if (max_page > 1)
110         put_str("-- more --", r++, c);
111 }
112
113 /*!
114  * @brief デバッグコマンド選択処理への分岐
115  * @param player_ptr プレーヤーへの参照ポインタ
116  * @param cmd コマンドキー
117  * @return コマンド終了ならTRUE、ページ送りならFALSE
118  */
119 bool exe_cmd_debug(player_type *player_ptr, char cmd)
120 {
121     switch (cmd) {
122     case ' ':
123     case '<':
124     case '>':
125     case KTRL('a'):
126         return false;
127     case ESCAPE:
128     case '\n':
129     case '\r':
130         break;
131     case 'a':
132         wiz_cure_all(player_ptr);
133         break;
134     case 'b':
135         wiz_teleport_back(player_ptr);
136         break;
137     case 'c':
138         wiz_create_item(player_ptr);
139         break;
140     case 'C':
141         wiz_create_named_art(player_ptr, command_arg);
142         break;
143     case 'd':
144         detect_all(player_ptr, DETECT_RAD_ALL * 3);
145         break;
146     case 'D':
147         wiz_dimension_door(player_ptr);
148         break;
149     case 'e':
150         wiz_change_status(player_ptr);
151         break;
152     case 'E':
153         switch (player_ptr->pclass) {
154         case CLASS_BLUE_MAGE:
155             wiz_learn_blue_magic_all(player_ptr);
156             break;
157         case CLASS_SMITH:
158             wiz_fillup_all_smith_essences(player_ptr);
159             break;
160         default:
161             break;
162         }
163         break;
164     case 'f':
165         identify_fully(player_ptr, false);
166         break;
167     case 'F':
168         wiz_create_feature(player_ptr);
169         break;
170     case 'G':
171         wizard_game_modifier(player_ptr);
172         break;
173     case 'H':
174         wiz_summon_horde(player_ptr);
175         break;
176     case 'i':
177         (void)ident_spell(player_ptr, false);
178         break;
179     case 'I':
180         wizard_item_modifier(player_ptr);
181         break;
182     case 'j':
183         wiz_jump_to_dungeon(player_ptr);
184         break;
185     case 'k':
186         wiz_kill_me(player_ptr, 0, command_arg);
187         break;
188     case 'm':
189         map_area(player_ptr, DETECT_RAD_ALL * 3);
190         break;
191     case 'r':
192         gain_level_reward(player_ptr, command_arg);
193         break;
194     case 'N':
195         wiz_summon_pet(player_ptr, command_arg);
196         break;
197     case 'n':
198         wiz_summon_specific_enemy(player_ptr, command_arg);
199         break;
200     case 'O':
201         wiz_dump_options();
202         break;
203     case 'o':
204         wiz_modify_item(player_ptr);
205         break;
206     case 'p':
207         teleport_player(player_ptr, 10, TELEPORT_SPONTANEOUS);
208         break;
209     case 'P':
210         wizard_player_modifier(player_ptr);
211         break;
212     case 's':
213         if (command_arg <= 0)
214             command_arg = 1;
215
216         wiz_summon_random_enemy(player_ptr, command_arg);
217         break;
218     case 't':
219         teleport_player(player_ptr, 100, TELEPORT_SPONTANEOUS);
220         break;
221     case 'u':
222         for (int y = 0; y < player_ptr->current_floor_ptr->height; y++)
223             for (int x = 0; x < player_ptr->current_floor_ptr->width; x++)
224                 player_ptr->current_floor_ptr->grid_array[y][x].info |= CAVE_GLOW | CAVE_MARK;
225
226         wiz_lite(player_ptr, false);
227         break;
228     case 'w':
229         wiz_lite(player_ptr, (bool)(player_ptr->pclass == CLASS_NINJA));
230         break;
231     case 'x':
232         gain_exp(player_ptr, command_arg ? command_arg : (player_ptr->exp + 1));
233         break;
234     case 'X':
235         for (INVENTORY_IDX i = INVEN_TOTAL - 1; i >= 0; i--)
236             if (player_ptr->inventory_list[i].k_idx)
237                 drop_from_inventory(player_ptr, i, 999);
238
239         player_outfit(player_ptr);
240         break;
241     case 'y':
242         wiz_kill_enemy(player_ptr);
243         break;
244     case 'Y':
245         wiz_kill_enemy(player_ptr, 0, command_arg);
246         break;
247     case 'z':
248         wiz_zap_surrounding_monsters(player_ptr);
249         break;
250     case 'Z':
251         wiz_zap_floor_monsters(player_ptr);
252         break;
253     case '_':
254         probing(player_ptr);
255         break;
256     case '@':
257         wiz_debug_spell(player_ptr);
258         break;
259     case '"':
260         exe_output_spoilers();
261         break;
262     case '?':
263         do_cmd_help(player_ptr);
264         break;
265     default:
266         msg_print("That is not a valid debug command.");
267         break;
268     }
269
270     return true;
271 }
272
273 /*!
274  * @brief デバッグコマンドを選択する処理のメインルーチン /
275  * Ask for and parse a "debug command"
276  * The "command_arg" may have been set.
277  * @param player_ptr プレーヤーへの参照ポインタ
278  * @details
279  * 番号を指定するには、それをN及びデバッグコマンドをXとしてとして「0N^aX」とする
280  */
281 void do_cmd_debug(player_type *player_ptr)
282 {
283     TERM_LEN hgt, wid;
284     term_get_size(&wid, &hgt);
285
286     size_t max_line = debug_menu_table.size();
287     int page_size = hgt - 5;
288     int max_page = max_line / page_size + 1;
289     int page = 0;
290     char cmd;
291
292     while (true) {
293         screen_save();
294         display_debug_menu(page, max_page, page_size, max_line);
295         get_com("Debug Command: ", &cmd, false);
296         screen_load();
297
298         if (exe_cmd_debug(player_ptr, cmd))
299             break;
300
301         page = (page + 1) % max_page;
302     }
303 }