OSDN Git Service

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