OSDN Git Service

[Refactor] #3230 PlayerType::update に関わる処理を、RedrawingFlagsUpdaterに集約した
[hengbandforosx/hengbandosx.git] / src / autopick / autopick-command-menu.cpp
1 /*!
2  * @brief 自動拾いエディタのコマンドを受け付ける
3  * @date 2020/04/26
4  * @author Hourier
5  * @todo 1関数100行以上ある、後で関数を分割すること
6  */
7
8 #include "autopick/autopick-command-menu.h"
9 #include "autopick/autopick-menu-data-table.h"
10 #include "autopick/autopick-util.h"
11 #include "io/input-key-acceptor.h"
12 #include "system/angband.h"
13 #include "term/screen-processor.h"
14 #include "term/term-color-types.h"
15 #include "util/int-char-converter.h"
16
17 /*!
18  * @brief 自動拾いエディタの画面を再描画する
19  * @param redraw 再描画が必要ならTRUE
20  * @param level command_menu_type 構造体におけるメニュー (詳細不明)
21  * @param start
22  * @param linestr
23  * @param menu_key 自動拾いエディタのメニューで入力したキー
24  * @param max_len
25  */
26 static void redraw_edit_command_menu(bool *redraw, int level, int start, char *linestr, byte *menu_key, int max_len)
27 {
28     if (!*redraw) {
29         return;
30     }
31
32     int col0 = 5 + level * 7;
33     int row0 = 1 + level * 3;
34     int row1 = row0 + 1;
35     term_putstr(col0, row0, -1, TERM_WHITE, linestr);
36
37     *menu_key = 0;
38     for (int i = start; menu_data[i].level >= level; i++) {
39         char com_key_str[3];
40         if (menu_data[i].level > level) {
41             continue;
42         }
43
44         if (menu_data[i].com_id == -1) {
45             strcpy(com_key_str, _("▼", ">"));
46         } else if (menu_data[i].key != -1) {
47             com_key_str[0] = '^';
48             com_key_str[1] = menu_data[i].key + '@';
49             com_key_str[2] = '\0';
50         } else {
51             com_key_str[0] = '\0';
52         }
53
54         const auto str = format("| %c) %-*s %2s | ", *menu_key + 'a', max_len, menu_data[i].name, com_key_str);
55
56         term_putstr(col0, row1++, -1, TERM_WHITE, str);
57
58         (*menu_key)++;
59     }
60
61     term_putstr(col0, row1, -1, TERM_WHITE, linestr);
62     *redraw = false;
63 }
64
65 /*!
66  * @brief Display the menu, and get a command
67  */
68 int do_command_menu(int level, int start)
69 {
70     int max_len = 0;
71     int menu_id_list[26];
72     byte menu_key = 0;
73     for (int i = start; menu_data[i].level >= level; i++) {
74         /* Ignore lower level sub menus */
75         if (menu_data[i].level > level) {
76             continue;
77         }
78
79         int len = strlen(menu_data[i].name);
80         if (len > max_len) {
81             max_len = len;
82         }
83
84         menu_id_list[menu_key] = i;
85         menu_key++;
86     }
87
88     while (menu_key < 26) {
89         menu_id_list[menu_key] = -1;
90         menu_key++;
91     }
92
93     int max_menu_wid = max_len + 3 + 3;
94
95     char linestr[MAX_LINELEN];
96     linestr[0] = '\0';
97     strcat(linestr, "+");
98     for (int i = 0; i < max_menu_wid + 2; i++) {
99         strcat(linestr, "-");
100     }
101
102     strcat(linestr, "+");
103     bool redraw = true;
104     while (true) {
105         redraw_edit_command_menu(&redraw, level, start, linestr, &menu_key, max_len);
106         prt(format(_("(a-%c) コマンド:", "(a-%c) Command:"), menu_key + 'a' - 1), 0, 0);
107         char key = inkey();
108         if (key == ESCAPE) {
109             return 0;
110         }
111
112         int com_id;
113         bool is_alphabet = key >= 'a' && key <= 'z';
114         if (!is_alphabet) {
115             com_id = get_com_id(key);
116             if (com_id) {
117                 return com_id;
118             }
119
120             continue;
121         }
122
123         int menu_id = menu_id_list[key - 'a'];
124         if (menu_id < 0) {
125             continue;
126         }
127
128         com_id = menu_data[menu_id].com_id;
129         if (com_id == -1) {
130             com_id = do_command_menu(level + 1, menu_id + 1);
131             if (com_id) {
132                 return com_id;
133             } else {
134                 redraw = true;
135             }
136         } else if (com_id) {
137             return com_id;
138         }
139     }
140 }