OSDN Git Service

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