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"
8 #include "object/object-kind.h"
9 #include "object-flavor.h"
11 #include "cmd/lighting-level-table.h"
12 #include "io/read-pref-file.h"
13 #include "view/display-main-window.h" // 暫定。後で消す.
16 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
17 * @param i 指定対象となるキャラクタコード
18 * @param num 指定されたビジュアルIDを返す参照ポインタ
19 * @param max ビジュアルIDの最大数
20 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
22 static bool cmd_visuals_aux(int i, IDX *num, IDX max)
27 sprintf(str, "%d", *num);
28 if (!get_string(format("Input new number(0-%d): ", max - 1), str, 4))
31 IDX tmp = (IDX)strtol(str, NULL, 0);
32 if (tmp >= 0 && tmp < max)
36 *num = (*num + max - 1) % max;
38 *num = (*num + 1) % max;
44 * @brief キャラクタの変更メニュー表示
45 * @param choice_msg 選択メッセージ
48 static void print_visuals_menu(concptr choice_msg)
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);
67 * Interact with "visuals"
69 void do_cmd_visuals(player_type *creature_ptr, void(*process_autopick_file_command)(char*))
71 FILE *auto_dump_stream;
74 bool need_redraw = FALSE;
75 concptr empty_symbol = "<< ? >>";
76 if (use_bigtile) empty_symbol = "<< ?? >>";
78 FILE_TYPE(FILE_TYPE_TEXT);
83 print_visuals_menu(NULL);
85 if (i == ESCAPE) break;
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;
96 (void)process_pref_file(creature_ptr, tmp, process_autopick_file_command);
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;
108 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
109 if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue;
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++)
114 monster_race *r_ptr = &r_info[i];
115 if (!r_ptr->name) continue;
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));
122 close_auto_dump(&auto_dump_stream, mark);
123 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
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;
134 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
135 if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue;
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++)
140 GAME_TEXT o_name[MAX_NLEN];
141 object_kind *k_ptr = &k_info[k_idx];
142 if (!k_ptr->name) continue;
146 strip_name(o_name, k_idx);
151 object_prep(&forge, k_idx);
152 object_desc(creature_ptr, o_name, &forge, OD_FORCE_FLAVOR);
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));
160 close_auto_dump(&auto_dump_stream, mark);
161 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
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;
172 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
173 if (!open_auto_dump(&auto_dump_stream, buf, mark)) continue;
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++)
178 feature_type *f_ptr = &f_info[i];
179 if (!f_ptr->name) continue;
180 if (f_ptr->mimic != i) continue;
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]));
189 close_auto_dump(&auto_dump_stream, mark);
190 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
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);
200 monster_race *r_ptr = &r_info[r];
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;
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): "));
222 if (i == ESCAPE) break;
224 if (iscntrl(i)) c = 'a' + i - KTRL('A');
225 else if (isupper(i)) c = 'a' + i - 'A';
235 if (!cmd_visuals_aux(i, &r, max_r_idx))
240 } while (!r_info[r].name);
245 t = (int)r_ptr->x_attr;
246 (void)cmd_visuals_aux(i, &t, 256);
247 r_ptr->x_attr = (byte)t;
251 t = (int)r_ptr->x_char;
252 (void)cmd_visuals_aux(i, &t, 256);
253 r_ptr->x_char = (byte)t;
257 do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, r);
259 print_visuals_menu(choice_msg);
268 static concptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
270 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
273 object_kind *k_ptr = &k_info[k];
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;
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): "));
297 if (i == ESCAPE) break;
299 if (iscntrl(i)) c = 'a' + i - KTRL('A');
300 else if (isupper(i)) c = 'a' + i - 'A';
310 if (!cmd_visuals_aux(i, &k, max_k_idx))
315 } while (!k_info[k].name);
320 t = (int)k_ptr->x_attr;
321 (void)cmd_visuals_aux(i, &t, 256);
322 k_ptr->x_attr = (byte)t;
326 t = (int)k_ptr->x_char;
327 (void)cmd_visuals_aux(i, &t, 256);
328 k_ptr->x_char = (byte)t;
332 do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, k);
334 print_visuals_menu(choice_msg);
343 static concptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
345 static IDX lighting_level = F_LIT_STANDARD;
346 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
349 feature_type *f_ptr = &f_info[f];
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];
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): "));
374 if (i == ESCAPE) break;
376 if (iscntrl(i)) c = 'a' + i - KTRL('A');
377 else if (isupper(i)) c = 'a' + i - 'A';
387 if (!cmd_visuals_aux(i, &f, max_f_idx))
392 } while (!f_info[f].name || (f_info[f].mimic != f));
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;
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;
409 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
412 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
416 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
418 print_visuals_menu(choice_msg);
426 do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, -1);
429 do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, -1);
433 IDX lighting_level = F_LIT_STANDARD;
434 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
439 reset_visuals(creature_ptr, process_autopick_file_command);
440 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
452 if (need_redraw) do_cmd_redraw(creature_ptr);