OSDN Git Service

[Refactor] #39964 Removed the dependency from read-pref-file to autopick-pref-processor
[hengband/hengband.git] / src / cmd / cmd-visuals.c
1 #include "angband.h"
2 #include "cmd/cmd-visuals.h"
3 #include "cmd/cmd-draw.h"
4 #include "knowledge/knowledge-features.h"
5 #include "knowledge/knowledge-items.h"
6 #include "knowledge/knowledge-monsters.h"
7 #include "files.h"
8 #include "object/object-kind.h"
9 #include "object-flavor.h"
10 #include "gameterm.h"
11 #include "cmd/lighting-level-table.h"
12 #include "io/read-pref-file.h"
13 #include "view/display-main-window.h" // 暫定。後で消す.
14
15 /*!
16  * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
17  * @param i 指定対象となるキャラクタコード
18  * @param num 指定されたビジュアルIDを返す参照ポインタ
19  * @param max ビジュアルIDの最大数
20  * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
21  */
22 static bool cmd_visuals_aux(int i, IDX *num, IDX max)
23 {
24         if (iscntrl(i))
25         {
26                 char str[10] = "";
27                 sprintf(str, "%d", *num);
28                 if (!get_string(format("Input new number(0-%d): ", max - 1), str, 4))
29                         return FALSE;
30
31                 IDX tmp = (IDX)strtol(str, NULL, 0);
32                 if (tmp >= 0 && tmp < max)
33                         *num = tmp;
34         }
35         else if (isupper(i))
36                 *num = (*num + max - 1) % max;
37         else
38                 *num = (*num + 1) % max;
39
40         return TRUE;
41 }
42
43 /*!
44  * @brief キャラクタの変更メニュー表示
45  * @param choice_msg 選択メッセージ
46  * @return なし
47  */
48 static void print_visuals_menu(concptr choice_msg)
49 {
50         prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
51         prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
52         prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
53         prt(_("(2) アイテムの   色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
54         prt(_("(3) 地形の       色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
55         prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
56         prt(_("(5) アイテムの   色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
57         prt(_("(6) 地形の       色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
58         prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
59         prt(_("(8) アイテムの   色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
60         prt(_("(9) 地形の       色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
61         prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
62         prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
63 }
64
65
66 /*
67  * Interact with "visuals"
68  */
69 void do_cmd_visuals(player_type *creature_ptr, void(*process_autopick_file_command)(char*))
70 {
71         FILE *auto_dump_stream;
72         char tmp[160];
73         char buf[1024];
74         bool need_redraw = FALSE;
75         concptr empty_symbol = "<< ? >>";
76         if (use_bigtile) empty_symbol = "<< ?? >>";
77
78         FILE_TYPE(FILE_TYPE_TEXT);
79         screen_save();
80         while (TRUE)
81         {
82                 Term_clear();
83                 print_visuals_menu(NULL);
84                 int i = inkey();
85                 if (i == ESCAPE) break;
86
87                 switch (i)
88                 {
89                 case '0':
90                 {
91                         prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
92                         prt(_("ファイル: ", "File: "), 17, 0);
93                         sprintf(tmp, "%s.prf", creature_ptr->base_name);
94                         if (!askfor(tmp, 70)) continue;
95
96                         (void)process_pref_file(creature_ptr, tmp, process_autopick_file_command);
97                         need_redraw = TRUE;
98                         break;
99                 }
100                 case '1':
101                 {
102                         static concptr mark = "Monster attr/chars";
103                         prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
104                         prt(_("ファイル: ", "File: "), 17, 0);
105                         sprintf(tmp, "%s.prf", creature_ptr->base_name);
106                         if (!askfor(tmp, 70)) continue;
107
108                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
109                         if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue;
110
111                         auto_dump_printf(auto_dump_stream, _("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
112                         for (i = 0; i < max_r_idx; i++)
113                         {
114                                 monster_race *r_ptr = &r_info[i];
115                                 if (!r_ptr->name) continue;
116
117                                 auto_dump_printf(auto_dump_stream, "# %s\n", (r_name + r_ptr->name));
118                                 auto_dump_printf(auto_dump_stream, "R:%d:0x%02X/0x%02X\n\n", i,
119                                         (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
120                         }
121
122                         close_auto_dump(&auto_dump_stream, mark);
123                         msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
124                         break;
125                 }
126                 case '2':
127                 {
128                         static concptr mark = "Object attr/chars";
129                         prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
130                         prt(_("ファイル: ", "File: "), 17, 0);
131                         sprintf(tmp, "%s.prf", creature_ptr->base_name);
132                         if (!askfor(tmp, 70)) continue;
133
134                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
135                         if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue;
136
137                         auto_dump_printf(auto_dump_stream, _("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
138                         for (KIND_OBJECT_IDX k_idx = 0; k_idx < max_k_idx; k_idx++)
139                         {
140                                 GAME_TEXT o_name[MAX_NLEN];
141                                 object_kind *k_ptr = &k_info[k_idx];
142                                 if (!k_ptr->name) continue;
143
144                                 if (!k_ptr->flavor)
145                                 {
146                                         strip_name(o_name, k_idx);
147                                 }
148                                 else
149                                 {
150                                         object_type forge;
151                                         object_prep(&forge, k_idx);
152                                         object_desc(creature_ptr, o_name, &forge, OD_FORCE_FLAVOR);
153                                 }
154
155                                 auto_dump_printf(auto_dump_stream, "# %s\n", o_name);
156                                 auto_dump_printf(auto_dump_stream, "K:%d:0x%02X/0x%02X\n\n", (int)k_idx,
157                                         (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
158                         }
159
160                         close_auto_dump(&auto_dump_stream, mark);
161                         msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
162                         break;
163                 }
164                 case '3':
165                 {
166                         static concptr mark = "Feature attr/chars";
167                         prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
168                         prt(_("ファイル: ", "File: "), 17, 0);
169                         sprintf(tmp, "%s.prf", creature_ptr->base_name);
170                         if (!askfor(tmp, 70)) continue;
171
172                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
173                         if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue;
174
175                         auto_dump_printf(auto_dump_stream, _("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
176                         for (i = 0; i < max_f_idx; i++)
177                         {
178                                 feature_type *f_ptr = &f_info[i];
179                                 if (!f_ptr->name) continue;
180                                 if (f_ptr->mimic != i) continue;
181
182                                 auto_dump_printf(auto_dump_stream, "# %s\n", (f_name + f_ptr->name));
183                                 auto_dump_printf(auto_dump_stream, "F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
184                                         (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
185                                         (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
186                                         (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
187                         }
188
189                         close_auto_dump(&auto_dump_stream, mark);
190                         msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
191                         break;
192                 }
193                 case '4':
194                 {
195                         static concptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
196                         static MONRACE_IDX r = 0;
197                         prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
198                         while (TRUE)
199                         {
200                                 monster_race *r_ptr = &r_info[r];
201                                 int c;
202                                 IDX t;
203
204                                 TERM_COLOR da = r_ptr->d_attr;
205                                 byte dc = r_ptr->d_char;
206                                 TERM_COLOR ca = r_ptr->x_attr;
207                                 byte cc = r_ptr->x_char;
208
209                                 Term_putstr(5, 17, -1, TERM_WHITE,
210                                         format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
211                                 Term_putstr(10, 19, -1, TERM_WHITE,
212                                         format(_("初期値  色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
213                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
214                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
215                                 Term_putstr(10, 20, -1, TERM_WHITE,
216                                         format(_("現在値  色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
217                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
218                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
219                                 Term_putstr(0, 22, -1, TERM_WHITE,
220                                         _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "));
221                                 i = inkey();
222                                 if (i == ESCAPE) break;
223
224                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
225                                 else if (isupper(i)) c = 'a' + i - 'A';
226                                 else c = i;
227
228                                 switch (c)
229                                 {
230                                 case 'n':
231                                 {
232                                         IDX prev_r = r;
233                                         do
234                                         {
235                                                 if (!cmd_visuals_aux(i, &r, max_r_idx))
236                                                 {
237                                                         r = prev_r;
238                                                         break;
239                                                 }
240                                         } while (!r_info[r].name);
241                                 }
242
243                                 break;
244                                 case 'a':
245                                         t = (int)r_ptr->x_attr;
246                                         (void)cmd_visuals_aux(i, &t, 256);
247                                         r_ptr->x_attr = (byte)t;
248                                         need_redraw = TRUE;
249                                         break;
250                                 case 'c':
251                                         t = (int)r_ptr->x_char;
252                                         (void)cmd_visuals_aux(i, &t, 256);
253                                         r_ptr->x_char = (byte)t;
254                                         need_redraw = TRUE;
255                                         break;
256                                 case 'v':
257                                         do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, r);
258                                         Term_clear();
259                                         print_visuals_menu(choice_msg);
260                                         break;
261                                 }
262                         }
263
264                         break;
265                 }
266                 case '5':
267                 {
268                         static concptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
269                         static IDX k = 0;
270                         prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
271                         while (TRUE)
272                         {
273                                 object_kind *k_ptr = &k_info[k];
274                                 int c;
275                                 IDX t;
276
277                                 TERM_COLOR da = k_ptr->d_attr;
278                                 SYMBOL_CODE dc = k_ptr->d_char;
279                                 TERM_COLOR ca = k_ptr->x_attr;
280                                 SYMBOL_CODE cc = k_ptr->x_char;
281
282                                 Term_putstr(5, 17, -1, TERM_WHITE,
283                                         format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
284                                                 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
285                                 Term_putstr(10, 19, -1, TERM_WHITE,
286                                         format(_("初期値  色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
287                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
288                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
289                                 Term_putstr(10, 20, -1, TERM_WHITE,
290                                         format(_("現在値  色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
291                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
292                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
293                                 Term_putstr(0, 22, -1, TERM_WHITE,
294                                         _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "));
295
296                                 i = inkey();
297                                 if (i == ESCAPE) break;
298
299                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
300                                 else if (isupper(i)) c = 'a' + i - 'A';
301                                 else c = i;
302
303                                 switch (c)
304                                 {
305                                 case 'n':
306                                 {
307                                         IDX prev_k = k;
308                                         do
309                                         {
310                                                 if (!cmd_visuals_aux(i, &k, max_k_idx))
311                                                 {
312                                                         k = prev_k;
313                                                         break;
314                                                 }
315                                         } while (!k_info[k].name);
316                                 }
317
318                                 break;
319                                 case 'a':
320                                         t = (int)k_ptr->x_attr;
321                                         (void)cmd_visuals_aux(i, &t, 256);
322                                         k_ptr->x_attr = (byte)t;
323                                         need_redraw = TRUE;
324                                         break;
325                                 case 'c':
326                                         t = (int)k_ptr->x_char;
327                                         (void)cmd_visuals_aux(i, &t, 256);
328                                         k_ptr->x_char = (byte)t;
329                                         need_redraw = TRUE;
330                                         break;
331                                 case 'v':
332                                         do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, k);
333                                         Term_clear();
334                                         print_visuals_menu(choice_msg);
335                                         break;
336                                 }
337                         }
338
339                         break;
340                 }
341                 case '6':
342                 {
343                         static concptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
344                         static IDX f = 0;
345                         static IDX lighting_level = F_LIT_STANDARD;
346                         prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
347                         while (TRUE)
348                         {
349                                 feature_type *f_ptr = &f_info[f];
350                                 int c;
351                                 IDX t;
352
353                                 TERM_COLOR da = f_ptr->d_attr[lighting_level];
354                                 byte dc = f_ptr->d_char[lighting_level];
355                                 TERM_COLOR ca = f_ptr->x_attr[lighting_level];
356                                 byte cc = f_ptr->x_char[lighting_level];
357
358                                 prt("", 17, 5);
359                                 Term_putstr(5, 17, -1, TERM_WHITE,
360                                         format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
361                                                 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
362                                 Term_putstr(10, 19, -1, TERM_WHITE,
363                                         format(_("初期値  色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
364                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
365                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
366                                 Term_putstr(10, 20, -1, TERM_WHITE,
367                                         format(_("現在値  色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
368                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
369                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
370                                 Term_putstr(0, 22, -1, TERM_WHITE,
371                                         _("コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): "));
372
373                                 i = inkey();
374                                 if (i == ESCAPE) break;
375
376                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
377                                 else if (isupper(i)) c = 'a' + i - 'A';
378                                 else c = i;
379
380                                 switch (c)
381                                 {
382                                 case 'n':
383                                 {
384                                         IDX prev_f = f;
385                                         do
386                                         {
387                                                 if (!cmd_visuals_aux(i, &f, max_f_idx))
388                                                 {
389                                                         f = prev_f;
390                                                         break;
391                                                 }
392                                         } while (!f_info[f].name || (f_info[f].mimic != f));
393                                 }
394
395                                 break;
396                                 case 'a':
397                                         t = (int)f_ptr->x_attr[lighting_level];
398                                         (void)cmd_visuals_aux(i, &t, 256);
399                                         f_ptr->x_attr[lighting_level] = (byte)t;
400                                         need_redraw = TRUE;
401                                         break;
402                                 case 'c':
403                                         t = (int)f_ptr->x_char[lighting_level];
404                                         (void)cmd_visuals_aux(i, &t, 256);
405                                         f_ptr->x_char[lighting_level] = (byte)t;
406                                         need_redraw = TRUE;
407                                         break;
408                                 case 'l':
409                                         (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
410                                         break;
411                                 case 'd':
412                                         apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
413                                         need_redraw = TRUE;
414                                         break;
415                                 case 'v':
416                                         do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
417                                         Term_clear();
418                                         print_visuals_menu(choice_msg);
419                                         break;
420                                 }
421                         }
422
423                         break;
424                 }
425                 case '7':
426                         do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, -1);
427                         break;
428                 case '8':
429                         do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, -1);
430                         break;
431                 case '9':
432                 {
433                         IDX lighting_level = F_LIT_STANDARD;
434                         do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
435                         break;
436                 }
437                 case 'R':
438                 case 'r':
439                         reset_visuals(creature_ptr, process_autopick_file_command);
440                         msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
441                         need_redraw = TRUE;
442                         break;
443                 default:
444                         bell();
445                         break;
446                 }
447
448                 msg_erase();
449         }
450
451         screen_load();
452         if (need_redraw) do_cmd_redraw(creature_ptr);
453 }