1 #include "io/input-key-requester.h"
2 #include "cmd-io/cmd-menu-content-table.h"
3 #include "cmd-io/macro-util.h"
4 #include "core/asking-player.h" // todo 相互依存している、後で何とかする.
5 #include "game-option/game-play-options.h"
6 #include "game-option/input-options.h"
7 #include "inventory/inventory-slot-types.h"
9 #include "io/input-key-acceptor.h"
10 #include "main/sound-of-music.h"
11 #include "save/save.h"
12 #include "system/floor-type-definition.h" // todo 違和感、後で調査する.
13 #include "system/object-type-definition.h"
14 #include "term/screen-processor.h" // todo 相互依存している、後で何とかする.
15 #include "util/int-char-converter.h"
16 #include "util/quarks.h"
17 #include "util/string-processor.h"
18 #include "view/display-messages.h"
19 #include "window/main-window-util.h"
20 #include "world/world.h"
23 * Keymaps for each "mode" associated with each keypress.
25 concptr keymap_act[KEYMAP_MODES][256];
29 s16b command_cmd; /* Current "Angband Command" */
30 COMMAND_ARG command_arg; /*!< 各種コマンドの汎用的な引数として扱う / Gives argument of current command */
31 COMMAND_NUM command_rep; /*!< 各種コマンドの汎用的なリピート数として扱う / Gives repetition of current command */
32 DIRECTION command_dir; /*!< 各種コマンドの汎用的な方向値処理として扱う/ Gives direction of current command */
33 s16b command_see; /* アイテム使用時等にリストを表示させるかどうか (ゲームオプションの他、様々なタイミングでONになったりOFFになったりする模様……) */
34 s16b command_wrk; /* アイテムの使用許可状況 (ex. 装備品のみ、床上もOK等) */
35 TERM_LEN command_gap = 999; /* アイテムの表示に使う (詳細未調査) */
36 s16b command_new; /* Command chaining from inven/equip view */
39 * Hack -- special buffer to hold the action of the current keymap
41 static char request_command_buffer[256];
43 static char inkey_from_menu(player_type *player_ptr)
47 int num = 0, max_num, old_num = 0;
51 if (player_ptr->y - panel_row_min > 10)
60 floor_type *floor_ptr = player_ptr->current_floor_ptr;
67 put_str("+----------------------------------------------------+", basey, basex);
68 put_str("| |", basey + 1, basex);
69 put_str("| |", basey + 2, basex);
70 put_str("| |", basey + 3, basex);
71 put_str("| |", basey + 4, basex);
72 put_str("| |", basey + 5, basex);
73 put_str("+----------------------------------------------------+", basey + 6, basex);
75 for (i = 0; i < 10; i++) {
77 if (!menu_info[menu][i].cmd)
79 menu_name = menu_info[menu][i].name;
80 for (hoge = 0;; hoge++) {
81 if (!special_menu_info[hoge].name[0])
83 if ((menu != special_menu_info[hoge].window) || (i != special_menu_info[hoge].number))
85 switch (special_menu_info[hoge].jouken) {
87 if (player_ptr->pclass == special_menu_info[hoge].jouken_naiyou)
88 menu_name = special_menu_info[hoge].name;
91 if (!floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest) {
92 if ((byte)player_ptr->wild_mode == special_menu_info[hoge].jouken_naiyou)
93 menu_name = special_menu_info[hoge].name;
101 put_str(menu_name, basey + 1 + i / 2, basex + 4 + (i % 2) * 24);
106 put_str(_("》", "> "), basey + 1 + num / 2, basex + 2 + (num % 2) * 24);
108 move_cursor_relative(player_ptr->y, player_ptr->x);
110 if ((sub_cmd == ' ') || (sub_cmd == 'x') || (sub_cmd == 'X') || (sub_cmd == '\r') || (sub_cmd == '\n')) {
111 if (menu_info[menu][num].fin) {
112 cmd = menu_info[menu][num].cmd;
116 menu = menu_info[menu][num].cmd;
121 } else if ((sub_cmd == ESCAPE) || (sub_cmd == 'z') || (sub_cmd == 'Z') || (sub_cmd == '0')) {
133 } else if ((sub_cmd == '2') || (sub_cmd == 'j') || (sub_cmd == 'J')) {
136 num = (num + 2) % (max_num - 1);
138 num = (num + 2) % (max_num + 1);
140 num = (num + 2) % max_num;
141 } else if ((sub_cmd == '8') || (sub_cmd == 'k') || (sub_cmd == 'K')) {
144 num = (num + max_num - 3) % (max_num - 1);
146 num = (num + max_num - 1) % (max_num + 1);
148 num = (num + max_num - 2) % max_num;
149 } else if ((sub_cmd == '4') || (sub_cmd == '6') || (sub_cmd == 'h') || (sub_cmd == 'H') || (sub_cmd == 'l') || (sub_cmd == 'L')) {
150 if ((num % 2) || (num == max_num - 1)) {
152 } else if (num < max_num - 1) {
166 * Request a command from the user.
168 * Sets player_ptr->command_cmd, player_ptr->command_dir, player_ptr->command_rep,
169 * player_ptr->command_arg. May modify player_ptr->command_new.
171 * Note that "caret" ("^") is treated specially, and is used to
172 * allow manual input of control characters. This can be used
173 * on many machines to request repeated tunneling (Ctrl-H) and
174 * on the Macintosh to request "Control-Caret".
176 * Note that "backslash" is treated specially, and is used to bypass any
177 * keymap entry for the following character. This is useful for macros.
179 * Note that this command is used both in the dungeon and in
180 * stores, and must be careful to work in both situations.
182 * Note that "player_ptr->command_new" may not work any more.
184 void request_command(player_type *player_ptr, int shopping)
194 if (rogue_like_commands) {
195 mode = KEYMAP_MODE_ROGUE;
197 mode = KEYMAP_MODE_ORIG;
206 if (!macro_running() && !command_new && auto_debug_save) {
207 save_player(player_ptr, SAVE_TYPE_DEBUG);
218 if (need_term_fresh(player_ptr)) {
222 if (!shopping && command_menu && ((cmd == '\r') || (cmd == '\n') || (cmd == 'x') || (cmd == 'X')) && !keymap_act[mode][(byte)(cmd)])
223 cmd = inkey_from_menu(player_ptr);
228 COMMAND_ARG old_arg = command_arg;
230 prt(_("回数: ", "Count: "), 0, 0);
233 if ((cmd == 0x7F) || (cmd == KTRL('H'))) {
234 command_arg = command_arg / 10;
235 prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
236 } else if (cmd >= '0' && cmd <= '9') {
237 if (command_arg >= 1000) {
241 command_arg = command_arg * 10 + D2I(cmd);
244 prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
250 if (command_arg == 0) {
252 prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
256 command_arg = old_arg;
257 prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
260 if ((cmd == ' ') || (cmd == '\n') || (cmd == '\r')) {
261 if (!get_com(_("コマンド: ", "Command: "), (char *)&cmd, FALSE)) {
269 (void)get_com(_("コマンド: ", "Command: "), (char *)&cmd, FALSE);
275 if (get_com(_("CTRL: ", "Control: "), (char *)&cmd, FALSE))
279 act = keymap_act[mode][(byte)(cmd)];
280 if (act && !inkey_next) {
281 (void)strnfmt(request_command_buffer, 256, "%s", act);
282 inkey_next = request_command_buffer;
289 command_cmd = (byte)cmd;
293 if (always_repeat && (command_arg <= 0)) {
294 if (angband_strchr("TBDoc+", (char)command_cmd)) {
300 switch (command_cmd) {
316 for (int i = 0; i < 256; i++) {
318 if ((s = keymap_act[mode][i]) != NULL) {
319 if (*s == command_cmd && *(s + 1) == 0) {
327 caretcmd = command_cmd;
330 for (inventory_slot_type i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
331 object_type *o_ptr = &player_ptr->inventory_list[i];
335 if (!o_ptr->inscription)
338 concptr s = quark_str(o_ptr->inscription);
339 s = angband_strchr(s, '^');
342 if ((s[1] == caretcmd) || (s[1] == '*'))
344 if ((s[1] == command_cmd) || (s[1] == '*'))
347 if (!get_check(_("本当ですか? ", "Are you sure? "))) {
352 s = angband_strchr(s + 1, '^');