3 * @brief プレイヤーのインターフェイスに関するコマンドの実装 / Interface commands
7 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
8 * This software may be copied and distributed for educational, research,
9 * and not for profit purposes provided that this copyright and statement
10 * are included in all such copies. Other copyrights may also apply.
14 * A set of functions to maintain automatic dumps of various kinds.
16 * remove_auto_dump(orig_file, mark)
17 * Remove the old automatic dump of type "mark".
18 * auto_dump_printf(fmt, ...)
19 * Dump a formatted string using fprintf().
20 * open_auto_dump(buf, mark)
21 * Open a file, remove old dump, and add new header.
22 * close_auto_dump(void)
23 * Add a footer, and close the file.
24 * The dump commands of original Angband simply add new lines to
25 * existing files; these files will become bigger and bigger unless
26 * an user deletes some or all of these files by hand at some
28 * These three functions automatically delete old dumped lines
29 * before adding new ones. Since there are various kinds of automatic
30 * dumps in a single file, we add a header and a footer with a type
31 * name for every automatic dump, and kill old lines only when the
32 * lines have the correct type of header and footer.
33 * We need to be quite paranoid about correctness; the user might
34 * (mistakenly) edit the file by hand, and see all their work come
35 * to nothing on the next auto dump otherwise. The current code only
36 * detects changes by noting inconsistencies between the actual number
37 * of lines and the number written in the footer. Note that this will
38 * not catch single-line edits.
50 * Mark strings for auto dump
52 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
53 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
56 * Variables for auto dump
58 static FILE *auto_dump_stream;
59 static cptr auto_dump_mark;
60 static int auto_dump_line_num;
64 * @brief prf出力内容を消去する /
65 * Remove old lines automatically generated before.
66 * @param orig_file 消去を行うファイル名
68 static void remove_auto_dump(cptr orig_file)
70 FILE *tmp_fff, *orig_fff;
74 bool between_mark = FALSE;
77 long header_location = 0;
78 char header_mark_str[80];
79 char footer_mark_str[80];
82 /* Prepare a header/footer mark string */
83 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
84 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
86 mark_len = strlen(footer_mark_str);
88 /* Open an old dump file in read-only mode */
89 orig_fff = my_fopen(orig_file, "r");
91 /* If original file does not exist, nothing to do */
92 if (!orig_fff) return;
94 /* Open a new (temporary) file */
95 tmp_fff = my_fopen_temp(tmp_file, 1024);
99 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), tmp_file);
104 /* Loop for every line */
108 if (my_fgets(orig_fff, buf, sizeof(buf)))
110 /* Read error: Assume End of File */
113 * Was looking for the footer, but not found.
115 * Since automatic dump might be edited by hand,
116 * it's dangerous to kill these lines.
117 * Seek back to the next line of the (pseudo) header,
122 fseek(orig_fff, header_location, SEEK_SET);
123 between_mark = FALSE;
127 /* Success -- End the loop */
134 /* We are looking for the header mark of automatic dump */
137 /* Is this line a header? */
138 if (!strcmp(buf, header_mark_str))
140 /* Memorise seek point of this line */
141 header_location = ftell(orig_fff);
143 /* Initialize counter for number of lines */
146 /* Look for the footer from now */
149 /* There are some changes */
156 /* Copy orginally lines */
157 fprintf(tmp_fff, "%s\n", buf);
161 /* We are looking for the footer mark of automatic dump */
164 /* Is this line a footer? */
165 if (!strncmp(buf, footer_mark_str, mark_len))
170 * Compare the number of lines
172 * If there is an inconsistency between
173 * actual number of lines and the
174 * number here, the automatic dump
175 * might be edited by hand. So it's
176 * dangerous to kill these lines.
177 * Seek back to the next line of the
178 * (pseudo) header, and read again.
180 if (!sscanf(buf + mark_len, " (%d)", &tmp)
183 fseek(orig_fff, header_location, SEEK_SET);
186 /* Look for another header */
187 between_mark = FALSE;
193 /* Ignore old line, and count number of lines */
203 /* If there are some changes, overwrite the original file with new one */
206 /* Copy contents of temporary file */
208 tmp_fff = my_fopen(tmp_file, "r");
209 orig_fff = my_fopen(orig_file, "w");
211 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
212 fprintf(orig_fff, "%s\n", buf);
218 /* Kill the temporary file */
226 * @brief prfファイルのフォーマットに従った内容を出力する /
227 * Dump a formatted line, using "vstrnfmt()".
230 static void auto_dump_printf(cptr fmt, ...)
237 /* Begin the Varargs Stuff */
240 /* Format the args, save the length */
241 (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
243 /* End the Varargs Stuff */
246 /* Count number of lines */
247 for (p = buf; *p; p++)
249 if (*p == '\n') auto_dump_line_num++;
253 fprintf(auto_dump_stream, "%s", buf);
258 * @brief prfファイルをファイルオープンする /
259 * Open file to append auto dump.
261 * @param mark 出力するヘッダマーク
262 * @return ファイルポインタを取得できたらTRUEを返す
264 static bool open_auto_dump(cptr buf, cptr mark)
267 char header_mark_str[80];
269 /* Save the mark string */
270 auto_dump_mark = mark;
272 /* Prepare a header mark string */
273 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
275 /* Remove old macro dumps */
276 remove_auto_dump(buf);
278 /* Append to the file */
279 auto_dump_stream = my_fopen(buf, "a");
282 if (!auto_dump_stream) {
283 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
291 fprintf(auto_dump_stream, "%s\n", header_mark_str);
293 /* Initialize counter */
294 auto_dump_line_num = 0;
296 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
297 "# *Warning!* The lines below are an automatic dump.\n"));
298 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
299 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
305 * @brief prfファイルをファイルクローズする /
306 * Append foot part and close auto dump.
309 static void close_auto_dump(void)
311 char footer_mark_str[80];
313 /* Prepare a footer mark string */
314 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
316 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
317 "# *Warning!* The lines below are an automatic dump.\n"));
318 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
319 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
321 fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
324 my_fclose(auto_dump_stream);
333 * @brief Return suffix of ordinal number
335 * @return pointer of suffix string.
337 cptr get_ordinal_number_suffix(int num)
339 num = ABS(num) % 100;
343 return (num == 11) ? "th" : "st";
345 return (num == 12) ? "th" : "nd";
347 return (num == 13) ? "th" : "rd";
356 * @brief 日記にメッセージを追加する /
357 * Take note to the diary.
358 * @param type 日記内容のID
359 * @param num 日記内容のIDに応じた数値
360 * @param note 日記内容のIDに応じた文字列参照ポインタ
363 errr do_cmd_write_nikki(int type, int num, cptr note)
369 cptr note_level = "";
370 bool do_level = TRUE;
371 char note_level_buf[40];
374 static bool disable_nikki = FALSE;
376 extract_day_hour_min(&day, &hour, &min);
378 if (disable_nikki) return(-1);
380 if (type == NIKKI_FIX_QUEST_C ||
381 type == NIKKI_FIX_QUEST_F ||
382 type == NIKKI_RAND_QUEST_C ||
383 type == NIKKI_RAND_QUEST_F ||
384 type == NIKKI_TO_QUEST)
388 old_quest = p_ptr->inside_quest;
389 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
391 /* Get the quest text */
392 init_flags = INIT_NAME_ONLY;
394 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
396 /* Reset the old quest number */
397 p_ptr->inside_quest = old_quest;
400 /* different filne name to avoid mixing */
401 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
403 /* Build the filename */
404 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
406 /* File type is "TEXT" */
407 FILE_TYPE(FILE_TYPE_TEXT);
409 fff = my_fopen(buf, "a");
414 msg_format(_("%s を開くことができませんでした。プレイ記録を一時停止します。", "Failed to open %s. Play-Record is disabled temporally."), buf);
420 q_idx = quest_number(dun_level);
424 if (p_ptr->inside_arena)
425 note_level = _("アリーナ:", "Arane:");
427 note_level = _("地上:", "Surface:");
428 else if (q_idx && (is_fixed_quest_idx(q_idx)
429 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
430 note_level = _("クエスト:", "Quest:");
434 sprintf(note_level_buf, "%d階(%s):", (int)dun_level, d_name+d_info[dungeon_type].name);
436 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, (int)dun_level);
438 note_level = note_level_buf;
446 if (day < MAX_DAYS) fprintf(fff, _("%d日目\n", "Day %d\n"), day);
447 else fputs(_("*****日目\n", "Day *****\n"), fff);
455 fprintf(fff, "%s\n",note);
459 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
464 fprintf(fff, _(" %2d:%02d %20s %sを発見した。\n", " %2d:%02d %20s discovered %s.\n"), hour, min, note_level, note);
467 case NIKKI_ART_SCROLL:
469 fprintf(fff, _(" %2d:%02d %20s 巻物によって%sを生成した。\n", " %2d:%02d %20s created %s by scroll.\n"), hour, min, note_level, note);
474 fprintf(fff, _(" %2d:%02d %20s %sを倒した。\n", " %2d:%02d %20s defeated %s.\n"), hour, min, note_level, note);
477 case NIKKI_FIX_QUEST_C:
479 if (quest[num].flags & QUEST_FLAG_SILENT) break;
480 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」を達成した。\n",
481 " %2d:%02d %20s completed quest '%s'.\n"), hour, min, note_level, quest[num].name);
484 case NIKKI_FIX_QUEST_F:
486 if (quest[num].flags & QUEST_FLAG_SILENT) break;
487 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」から命からがら逃げ帰った。\n",
488 " %2d:%02d %20s run away from quest '%s'.\n"), hour, min, note_level, quest[num].name);
491 case NIKKI_RAND_QUEST_C:
494 strcpy(name, r_name+r_info[quest[num].r_idx].name);
495 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)を達成した。\n",
496 " %2d:%02d %20s completed random quest '%s'\n"), hour, min, note_level, name);
499 case NIKKI_RAND_QUEST_F:
502 strcpy(name, r_name+r_info[quest[num].r_idx].name);
503 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)から逃げ出した。\n",
504 " %2d:%02d %20s ran away from quest '%s'.\n"), hour, min, note_level, name);
507 case NIKKI_MAXDEAPTH:
509 fprintf(fff, _(" %2d:%02d %20s %sの最深階%d階に到達した。\n",
510 " %2d:%02d %20s reached level %d of %s for the first time.\n"), hour, min, note_level,
511 _(d_name+d_info[dungeon_type].name, num),
512 _(num, d_name+d_info[dungeon_type].name));
517 fprintf(fff, _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n",
518 " %2d:%02d %20s reset recall level of %s to %d %s.\n"), hour, min, note_level, note,
519 _(d_name + d_info[num].name, (int)max_dlv[num]),
520 _((int)max_dlv[num], d_name + d_info[num].name));
526 if (q_idx && (is_fixed_quest_idx(q_idx)
527 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
529 to = _("地上", "the surface");
533 if (!(dun_level+num)) to = _("地上", "the surface");
534 else to = format(_("%d階", "level %d"), dun_level+num);
536 fprintf(fff, _(" %2d:%02d %20s %sへ%s。\n", " %2d:%02d %20s %s %s.\n"), hour, min, note_level, _(to, note), _(note, to));
542 fprintf(fff, _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n"),
543 hour, min, note_level, _(d_name+d_info[dungeon_type].name, (int)max_dlv[dungeon_type]),
544 _((int)max_dlv[dungeon_type], d_name+d_info[dungeon_type].name));
546 fprintf(fff, _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n"), hour, min, note_level);
551 if (quest[num].flags & QUEST_FLAG_SILENT) break;
552 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」へと突入した。\n", " %2d:%02d %20s entered the quest '%s'.\n"),
553 hour, min, note_level, quest[num].name);
558 fprintf(fff, _(" %2d:%02d %20s レベル・テレポートで脱出した。\n", " %2d:%02d %20s Got out using teleport level.\n"),
559 hour, min, note_level);
564 fprintf(fff, _(" %2d:%02d %20s %sを購入した。\n", " %2d:%02d %20s bought %s.\n"), hour, min, note_level, note);
569 fprintf(fff, _(" %2d:%02d %20s %sを売却した。\n", " %2d:%02d %20s sold %s.\n"), hour, min, note_level, note);
577 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦で、%sの前に敗れ去った。\n", " %2d:%02d %20s beaten by %s in the %d%s fight.\n"),
578 hour, min, note_level, _(n, note), _("", n), _(note, get_ordinal_number_suffix(n)));
581 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦(%s)に勝利した。\n", " %2d:%02d %20s won the %d%s fight (%s).\n"),
582 hour, min, note_level, num, _("", get_ordinal_number_suffix(num)), note);
584 if (num == MAX_ARENA_MONS)
586 fprintf(fff, _(" 闘技場のすべての敵に勝利し、チャンピオンとなった。\n",
587 " won all fight to become a Chanpion.\n"));
594 fprintf(fff, _(" %2d:%02d %20s %sを識別した。\n", " %2d:%02d %20s identified %s.\n"), hour, min, note_level, note);
601 to = _("地上", "the surface");
603 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
605 fprintf(fff, _(" %2d:%02d %20s %sへとウィザード・テレポートで移動した。\n",
606 " %2d:%02d %20s wizard-teleport to %s.\n"), hour, min, note_level, to);
613 to = _("地上", "the surface");
615 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
617 fprintf(fff, _(" %2d:%02d %20s %sへとパターンの力で移動した。\n",
618 " %2d:%02d %20s used Pattern to teleport to %s.\n"), hour, min, note_level, to);
623 fprintf(fff, _(" %2d:%02d %20s レベルが%dに上がった。\n", " %2d:%02d %20s reached player level %d.\n"), hour, min, note_level, num);
626 case NIKKI_GAMESTART:
628 time_t ct = time((time_t*)0);
632 fprintf(fff, "%s %s",note, ctime(&ct));
635 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
638 case NIKKI_NAMED_PET:
640 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
643 case RECORD_NAMED_PET_NAME:
644 fprintf(fff, _("%sを旅の友にすることに決めた。\n", "decided to travel together with %s.\n"), note);
646 case RECORD_NAMED_PET_UNNAME:
647 fprintf(fff, _("%sの名前を消した。\n", "unnamed %s.\n"), note);
649 case RECORD_NAMED_PET_DISMISS:
650 fprintf(fff, _("%sを解放した。\n", "dismissed %s.\n"), note);
652 case RECORD_NAMED_PET_DEATH:
653 fprintf(fff, _("%sが死んでしまった。\n", "%s died.\n"), note);
655 case RECORD_NAMED_PET_MOVED:
656 fprintf(fff, _("%sをおいて別のマップへ移動した。\n", "moved to another map leaving %s behind.\n"), note);
658 case RECORD_NAMED_PET_LOST_SIGHT:
659 fprintf(fff, _("%sとはぐれてしまった。\n", "lost sight of %s.\n"), note);
661 case RECORD_NAMED_PET_DESTROY:
662 fprintf(fff, _("%sが*破壊*によって消え去った。\n", "%s was made disappeared by *destruction*.\n"), note);
664 case RECORD_NAMED_PET_EARTHQUAKE:
665 fprintf(fff, _("%sが岩石に押し潰された。\n", "%s was crushed by falling rocks.\n"), note);
667 case RECORD_NAMED_PET_GENOCIDE:
668 fprintf(fff, _("%sが抹殺によって消え去った。\n", "%s was made disappeared by genocide.\n"), note);
670 case RECORD_NAMED_PET_WIZ_ZAP:
671 fprintf(fff, _("%sがデバッグコマンドによって消え去った。\n", "%s was removed by debug command.\n"), note);
673 case RECORD_NAMED_PET_TELE_LEVEL:
674 fprintf(fff, _("%sがテレポート・レベルによって消え去った。\n", "%s was made disappeared by teleport level.\n"), note);
676 case RECORD_NAMED_PET_BLAST:
677 fprintf(fff, _("%sを爆破した。\n", "blasted %s.\n"), note);
679 case RECORD_NAMED_PET_HEAL_LEPER:
680 fprintf(fff, _("%sの病気が治り旅から外れた。\n", "%s was healed and left.\n"), note);
682 case RECORD_NAMED_PET_COMPACT:
683 fprintf(fff, _("%sがモンスター情報圧縮によって消え去った。\n", "%s was made disappeared by compacting monsters.\n"), note);
685 case RECORD_NAMED_PET_LOSE_PARENT:
686 fprintf(fff, _("%sの召喚者が既にいないため消え去った。\n", "%s disappeared because there does not exist summoner.\n"), note);
697 case NIKKI_WIZARD_LOG:
698 fprintf(fff, "%s\n", note);
707 if (do_level) write_level = FALSE;
713 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
716 * @brief 日記のタイトル表記と内容出力 /
719 * 日記のタイトルは本関数の subtitle ローカル変数で定義されている。
721 static void do_cmd_disp_nikki(void)
723 char nikki_title[256];
729 static const char subtitle[][30] = {"最強の肉体を求めて",
760 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
761 "Attack is the best form of defence.",
763 "An unexpected windfall",
764 "A drowning man will catch at a straw",
765 "Don't count your chickens before they are hatched.",
766 "It is no use crying over spilt milk.",
767 "Seeing is believing.",
768 "Strike the iron while it is hot.",
769 "I don't care what follows.",
770 "To dig a well to put out a house on fire.",
771 "Tomorrow is another day.",
772 "Easy come, easy go.",
773 "The more haste, the less speed.",
774 "Where there is life, there is hope.",
775 "There is no royal road to *WINNER*.",
776 "Danger past, God forgotten.",
777 "The best thing to do now is to run away.",
778 "Life is but an empty dream.",
779 "Dead men tell no tales.",
780 "A book that remains shut is but a block.",
781 "Misfortunes never come singly.",
782 "A little knowledge is a dangerous thing.",
783 "History repeats itself.",
784 "*WINNER* was not built in a day.",
785 "Ignorance is bliss.",
786 "To lose is to win?",
787 "No medicine can cure folly.",
788 "All good things come to an end.",
789 "M$ Empire strikes back.",
790 "To see is to believe",
792 "Quest of The World's Greatest Brain"};
794 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
796 /* Build the filename */
797 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
799 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
800 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
801 else if (IS_WIZARD_CLASS())
802 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
803 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
806 sprintf(nikki_title, "「%s%s%sの伝説 -%s-」",
807 ap_ptr->title, ap_ptr->no ? "の" : "", p_ptr->name, tmp);
809 sprintf(nikki_title, "Legend of %s %s '%s'",
810 ap_ptr->title, p_ptr->name, tmp);
813 /* Display the file contents */
814 show_file(FALSE, buf, nikki_title, -1, 0);
818 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
821 static void do_cmd_bunshou(void)
824 char bunshou[80] = "\0";
826 if (get_string(_("内容: ", "diary note: "), tmp, 79))
828 strcpy(bunshou, tmp);
830 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
835 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
838 static void do_cmd_last_get(void)
843 if (record_o_name[0] == '\0') return;
845 sprintf(buf,_("%sの入手を記録します。", "Do you really want to record getting %s? "),record_o_name);
846 if (!get_check(buf)) return;
850 sprintf(buf,_("%sを手に入れた。", "descover %s."), record_o_name);
851 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
856 * @brief ファイル中の全日記記録を消去する /
859 static void do_cmd_erase_nikki(void)
865 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your record? "))) return;
866 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
868 /* Build the filename */
869 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
871 /* Remove the file */
874 fff = my_fopen(buf, "w");
877 msg_format(_("記録を消去しました。", "deleted record."));
879 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
888 void do_cmd_nikki(void)
892 /* File type is "TEXT" */
893 FILE_TYPE(FILE_TYPE_TEXT);
895 /* Save the screen */
898 /* Interact until done */
904 /* Ask for a choice */
905 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
907 /* Give some choices */
908 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
909 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
910 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record item you last get/identify"), 6, 5);
911 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
913 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
916 prt(_("コマンド:", "Command: "), 18, 0);
921 if (i == ESCAPE) break;
935 do_cmd_erase_nikki();
939 prepare_movie_hooks();
941 default: /* Unknown option */
949 /* Restore the screen */
954 * @brief 画面を再描画するコマンドのメインルーチン
955 * Hack -- redraw the screen
959 * This command performs various low level updates, clears all the "extra"
960 * windows, does a total redraw of the main window, and requests all of the
961 * interesting updates and redraws that I can think of.
963 * This command is also used to "instantiate" the results of the user
964 * selecting various things, such as graphics mode, so it must call
965 * the "TERM_XTRA_REACT" hook before redrawing the windows.
968 void do_cmd_redraw(void)
975 /* Hack -- react to changes */
976 Term_xtra(TERM_XTRA_REACT, 0);
979 /* Combine and Reorder the pack (later) */
980 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
984 p_ptr->update |= (PU_TORCH);
986 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
988 /* Forget lite/view */
989 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
991 /* Update lite/view */
992 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
994 /* Update monsters */
995 p_ptr->update |= (PU_MONSTERS);
997 /* Redraw everything */
998 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1000 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1002 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1006 /* Hack -- update */
1009 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1012 /* Redraw every window */
1013 for (j = 0; j < 8; j++)
1016 if (!angband_term[j]) continue;
1019 Term_activate(angband_term[j]);
1032 * @brief 名前を変更するコマンドのメインルーチン
1033 * Hack -- change name
1036 void do_cmd_change_name(void)
1045 /* Save the screen */
1053 /* Display the player */
1054 display_player(mode);
1059 display_player(mode);
1064 Term_putstr(2, 23, -1, TERM_WHITE,
1065 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1067 Term_putstr(2, 23, -1, TERM_WHITE,
1068 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1076 if (c == ESCAPE) break;
1083 /* Process the player name */
1084 process_player_name(FALSE);
1090 sprintf(tmp, "%s.txt", player_base);
1091 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1093 if (tmp[0] && (tmp[0] != ' '))
1095 file_character(tmp);
1111 /* Flush messages */
1115 /* Restore the screen */
1118 /* Redraw everything */
1119 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1126 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1127 * Recall the most recent message
1130 void do_cmd_message_one(void)
1132 /* Recall one message */
1133 prt(format("> %s", message_str(0)), 0, 0);
1138 * @brief メッセージのログを表示するコマンドのメインルーチン
1139 * Recall the most recent message
1143 * Show previous messages to the user -BEN-
1145 * The screen format uses line 0 and 23 for headers and prompts,
1146 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1148 * This command shows you which commands you are viewing, and allows
1149 * you to "search" for strings in the recall.
1151 * Note that messages may be longer than 80 characters, but they are
1152 * displayed using "infinite" length, with a special sub-command to
1153 * "slide" the virtual display to the left or right.
1155 * Attempt to only hilite the matching portions of the string.
1158 void do_cmd_messages(int num_now)
1162 char shower_str[81];
1163 char finder_str[81];
1169 Term_get_size(&wid, &hgt);
1171 /* Number of message lines in a screen */
1172 num_lines = hgt - 4;
1175 strcpy(finder_str, "");
1178 strcpy(shower_str, "");
1180 /* Total messages */
1183 /* Start on first message */
1186 /* Save the screen */
1192 /* Process requests until done */
1198 /* Dump up to 20 lines of messages */
1199 for (j = 0; (j < num_lines) && (i + j < n); j++)
1201 cptr msg = message_str(i+j);
1203 /* Dump the messages, bottom to top */
1204 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1206 /* Hilite "shower" */
1207 if (shower && shower[0])
1211 /* Display matches */
1212 while ((str = my_strstr(str, shower)) != NULL)
1214 int len = strlen(shower);
1216 /* Display the match */
1217 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1225 /* Erase remaining lines */
1226 for (; j < num_lines; j++)
1228 Term_erase(0, num_lines + 1 - j, 255);
1231 /* Display header */
1233 prt(format(_("以前のメッセージ %d-%d 全部で(%d)", "Message Recall (%d-%d of %d)"),
1234 i, i + j - 1, n), 0, 0);
1236 /* Display prompt (not very informative) */
1237 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1238 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1241 skey = inkey_special(TRUE);
1243 /* Exit on Escape */
1244 if (skey == ESCAPE) break;
1246 /* Hack -- Save the old index */
1251 /* Hack -- handle show */
1254 prt(_("強調: ", "Show: "), hgt - 1, 0);
1256 /* Get a "shower" string, or continue */
1257 strcpy(back_str, shower_str);
1258 if (askfor(shower_str, 80))
1261 shower = shower_str[0] ? shower_str : NULL;
1263 else strcpy(shower_str, back_str);
1267 /* Hack -- handle find */
1274 prt(_("検索: ", "Find: "), hgt - 1, 0);
1276 /* Get a "finder" string, or continue */
1277 strcpy(back_str, finder_str);
1278 if (!askfor(finder_str, 80))
1280 strcpy(finder_str, back_str);
1283 else if (!finder_str[0])
1285 shower = NULL; /* Stop showing */
1290 shower = finder_str;
1293 for (z = i + 1; z < n; z++)
1295 cptr msg = message_str(z);
1298 if (my_strstr(msg, finder_str))
1309 /* Recall 1 older message */
1311 /* Go to the oldest line */
1315 /* Recall 1 newer message */
1317 /* Go to the newest line */
1321 /* Recall 1 older message */
1326 /* Go older if legal */
1327 i = MIN(i + 1, n - num_lines);
1330 /* Recall 10 older messages */
1332 /* Go older if legal */
1333 i = MIN(i + 10, n - num_lines);
1336 /* Recall 20 older messages */
1341 /* Go older if legal */
1342 i = MIN(i + num_lines, n - num_lines);
1345 /* Recall 20 newer messages */
1349 /* Go newer (if able) */
1350 i = MAX(0, i - num_lines);
1353 /* Recall 10 newer messages */
1355 /* Go newer (if able) */
1359 /* Recall 1 newer messages */
1362 /* Go newer (if able) */
1367 /* Hack -- Error of some kind */
1371 /* Restore the screen */
1377 * @brief チートオプションを変更するコマンドのメインルーチン
1378 * Interact with some options for cheating
1379 * @param info 表示メッセージ
1382 static void do_cmd_options_cheat(cptr info)
1385 int i, k = 0, n = CHEAT_MAX;
1391 /* Interact with the player */
1397 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1402 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1403 prt(" << 注意 >>", 11, 0);
1404 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1405 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1406 prt(" じらないようにして下さい。", 14, 0);
1408 /* Display the options */
1409 for (i = 0; i < n; i++)
1411 byte a = TERM_WHITE;
1413 /* Color current option */
1414 if (i == k) a = TERM_L_BLUE;
1416 /* Display the option text */
1417 sprintf(buf, "%-48s: %s (%s)",
1418 cheat_info[i].o_desc,
1419 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1420 cheat_info[i].o_text);
1421 c_prt(a, buf, i + 2, 0);
1424 /* Hilite current option */
1425 move_cursor(k + 2, 50);
1431 * HACK - Try to translate the key into a direction
1432 * to allow using the roguelike keys for navigation.
1434 dir = get_keymap_dir(ch);
1435 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1449 k = (n + k - 1) % n;
1467 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1468 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1469 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1470 (*cheat_info[k].o_var) = TRUE;
1479 (*cheat_info[k].o_var) = FALSE;
1486 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1487 /* Peruse the help file */
1488 (void)show_file(TRUE, buf, NULL, 0, 0);
1505 * @brief セーブ頻度ターンの次の値を返す
1506 * @param current 現在のセーブ頻度ターン値
1507 * @return 次のセーブ頻度ターン値
1509 static s16b toggle_frequency(s16b current)
1514 case 50: return 100;
1515 case 100: return 250;
1516 case 250: return 500;
1517 case 500: return 1000;
1518 case 1000: return 2500;
1519 case 2500: return 5000;
1520 case 5000: return 10000;
1521 case 10000: return 25000;
1528 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1529 * @param info 表示メッセージ
1532 static void do_cmd_options_autosave(cptr info)
1535 int i, k = 0, n = 2;
1542 /* Interact with the player */
1546 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1547 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1551 /* Display the options */
1552 for (i = 0; i < n; i++)
1554 byte a = TERM_WHITE;
1556 /* Color current option */
1557 if (i == k) a = TERM_L_BLUE;
1559 /* Display the option text */
1560 sprintf(buf, "%-48s: %s (%s)",
1561 autosave_info[i].o_desc,
1562 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1563 autosave_info[i].o_text);
1564 c_prt(a, buf, i + 2, 0);
1566 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1568 /* Hilite current option */
1569 move_cursor(k + 2, 50);
1585 k = (n + k - 1) % n;
1603 (*autosave_info[k].o_var) = TRUE;
1612 (*autosave_info[k].o_var) = FALSE;
1620 autosave_freq = toggle_frequency(autosave_freq);
1621 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1627 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1643 * @brief 標準オプションを変更するコマンドのサブルーチン /
1644 * Interact with some options
1645 * @param page オプションページ番号
1646 * @param info 表示メッセージ
1649 void do_cmd_options_aux(int page, cptr info)
1652 int i, k = 0, n = 0, l;
1655 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1656 (!p_ptr->wizard || !allow_debug_opts);
1659 /* Lookup the options */
1660 for (i = 0; i < 24; i++) opt[i] = 0;
1662 /* Scan the options */
1663 for (i = 0; option_info[i].o_desc; i++)
1665 /* Notice options on this "page" */
1666 if (option_info[i].o_page == page) opt[n++] = i;
1672 /* Interact with the player */
1678 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1679 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1682 /* HACK -- description for easy-auto-destroy options */
1683 if (page == OPT_PAGE_AUTODESTROY)
1684 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1685 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1687 /* Display the options */
1688 for (i = 0; i < n; i++)
1690 byte a = TERM_WHITE;
1692 /* Color current option */
1693 if (i == k) a = TERM_L_BLUE;
1695 /* Display the option text */
1696 sprintf(buf, "%-48s: %s (%.19s)",
1697 option_info[opt[i]].o_desc,
1698 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1699 option_info[opt[i]].o_text);
1700 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1701 else c_prt(a, buf, i + 2, 0);
1704 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1707 /* Hilite current option */
1708 move_cursor(k + 2 + l, 50);
1714 * HACK - Try to translate the key into a direction
1715 * to allow using the roguelike keys for navigation.
1717 dir = get_keymap_dir(ch);
1718 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1732 k = (n + k - 1) % n;
1749 if (browse_only) break;
1750 (*option_info[opt[k]].o_var) = TRUE;
1759 if (browse_only) break;
1760 (*option_info[opt[k]].o_var) = FALSE;
1768 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1774 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1775 /* Peruse the help file */
1776 (void)show_file(TRUE, buf, NULL, 0, 0);
1793 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1794 * Modify the "window" options
1797 static void do_cmd_options_win(void)
1807 /* Memorize old flags */
1808 for (j = 0; j < 8; j++)
1810 /* Acquire current flags */
1811 old_flag[j] = window_flag[j];
1822 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1824 /* Display the windows */
1825 for (j = 0; j < 8; j++)
1827 byte a = TERM_WHITE;
1829 cptr s = angband_term_name[j];
1832 if (j == x) a = TERM_L_BLUE;
1834 /* Window name, staggered, centered */
1835 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1838 /* Display the options */
1839 for (i = 0; i < 16; i++)
1841 byte a = TERM_WHITE;
1843 cptr str = window_flag_desc[i];
1846 if (i == y) a = TERM_L_BLUE;
1849 if (!str) str = _("(未使用)", "(Unused option)");
1852 Term_putstr(0, i + 5, -1, a, str);
1854 /* Display the windows */
1855 for (j = 0; j < 8; j++)
1861 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1864 if (window_flag[j] & (1L << i)) c = 'X';
1867 Term_putch(35 + j * 5, i + 5, a, c);
1872 Term_gotoxy(35 + x * 5, y + 5);
1890 for (j = 0; j < 8; j++)
1892 window_flag[j] &= ~(1L << y);
1896 for (i = 0; i < 16; i++)
1898 window_flag[x] &= ~(1L << i);
1911 window_flag[x] |= (1L << y);
1919 window_flag[x] &= ~(1L << y);
1925 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
1933 d = get_keymap_dir(ch);
1935 x = (x + ddx[d] + 8) % 8;
1936 y = (y + ddy[d] + 16) % 16;
1943 /* Notice changes */
1944 for (j = 0; j < 8; j++)
1949 if (!angband_term[j]) continue;
1951 /* Ignore non-changes */
1952 if (window_flag[j] == old_flag[j]) continue;
1955 Term_activate(angband_term[j]);
1978 option_fields[OPT_NUM] =
1981 { '1', " キー入力 オプション", 3 },
1982 { '2', " マップ画面 オプション", 4 },
1983 { '3', " テキスト表示 オプション", 5 },
1984 { '4', " ゲームプレイ オプション", 6 },
1985 { '5', " 行動中止関係 オプション", 7 },
1986 { '6', " 簡易自動破壊 オプション", 8 },
1987 { 'r', " プレイ記録 オプション", 9 },
1989 { 'p', "自動拾いエディタ", 11 },
1990 { 'd', " 基本ウェイト量 ", 12 },
1991 { 'h', "低ヒットポイント", 13 },
1992 { 'm', " 低魔力色閾値 ", 14 },
1993 { 'a', " 自動セーブ オプション", 15 },
1994 { 'w', "ウインドウフラグ", 16 },
1996 { 'b', " 初期 オプション (参照のみ)", 18 },
1997 { 'c', " 詐欺 オプション", 19 },
1999 { '1', "Input Options", 3 },
2000 { '2', "Map Screen Options", 4 },
2001 { '3', "Text Display Options", 5 },
2002 { '4', "Game-Play Options", 6 },
2003 { '5', "Disturbance Options", 7 },
2004 { '6', "Easy Auto-Destroyer Options", 8 },
2005 { 'r', "Play record Options", 9 },
2007 { 'p', "Auto-picker/destroyer editor", 11 },
2008 { 'd', "Base Delay Factor", 12 },
2009 { 'h', "Hitpoint Warning", 13 },
2010 { 'm', "Mana Color Threshold", 14 },
2011 { 'a', "Autosave Options", 15 },
2012 { 'w', "Window Flags", 16 },
2014 { 'b', "Birth Options (Browse Only)", 18 },
2015 { 'c', "Cheat Options", 19 },
2021 * @brief 標準オプションを変更するコマンドのメインルーチン /
2022 * Set or unset various options.
2026 * The user must use the "Ctrl-R" command to "adapt" to changes
2027 * in any options which control "visual" aspects of the game.
2030 void do_cmd_options(void)
2036 /* Save the screen */
2044 /* Does not list cheat option when cheat option is off */
2045 if (!p_ptr->noscore && !allow_debug_opts) n--;
2050 /* Why are we here */
2051 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2055 /* Give some choices */
2056 for (i = 0; i < n; i++)
2058 byte a = TERM_WHITE;
2059 if (i == y) a = TERM_L_BLUE;
2060 Term_putstr(5, option_fields[i].row, -1, a,
2061 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2064 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2067 skey = inkey_special(TRUE);
2068 if (!(skey & SKEY_MASK)) k = (char)skey;
2072 if (k == ESCAPE) break;
2074 if (my_strchr("\n\r ", k))
2076 k = option_fields[y].key;
2080 for (i = 0; i < n; i++)
2082 if (tolower(k) == option_fields[i].key) break;
2085 /* Command is found */
2088 /* Hack -- browse help */
2089 if (k == '?') break;
2093 if (skey == SKEY_UP) d = 8;
2094 if (skey == SKEY_DOWN) d = 2;
2095 y = (y + ddy[d] + n) % n;
2100 if (k == ESCAPE) break;
2107 /* Process the general options */
2108 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2114 /* Process the general options */
2115 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2122 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2129 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2136 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2143 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2147 /* Play-record Options */
2152 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2161 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2162 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2163 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2167 /* Cheating Options */
2170 if (!p_ptr->noscore && !allow_debug_opts)
2172 /* Cheat options are not permitted */
2178 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2185 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2194 do_cmd_options_win();
2195 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2196 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2197 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2198 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2203 /* Auto-picker/destroyer editor */
2207 do_cmd_edit_autopick();
2211 /* Hack -- Delay Speed */
2217 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2219 /* Get a new value */
2222 int msec = delay_factor * delay_factor * delay_factor;
2223 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2224 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2226 if (k == ESCAPE) break;
2229 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2232 else if (isdigit(k)) delay_factor = D2I(k);
2239 /* Hack -- hitpoint warning factor */
2245 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2247 /* Get a new value */
2250 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2251 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2253 if (k == ESCAPE) break;
2256 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2259 else if (isdigit(k)) hitpoint_warn = D2I(k);
2266 /* Hack -- mana color factor */
2272 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2274 /* Get a new value */
2277 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2278 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2280 if (k == ESCAPE) break;
2283 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2286 else if (isdigit(k)) mana_warn = D2I(k);
2294 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2298 /* Unknown option */
2306 /* Flush messages */
2311 /* Restore the screen */
2314 /* Hack - Redraw equippy chars */
2315 p_ptr->redraw |= (PR_EQUIPPY);
2321 * @brief prefファイルを選択して処理する /
2322 * Ask for a "user pref line" and process it
2325 * Allow absolute file names?
2327 void do_cmd_pref(void)
2334 /* Ask for a "user pref command" */
2335 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2337 /* Process that pref command */
2338 (void)process_pref_file_command(buf);
2342 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2345 void do_cmd_reload_autopick(void)
2347 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2348 /* Load the file with messages */
2349 autopick_load_pref(TRUE);
2355 * @brief マクロ情報をprefファイルに保存する /
2356 * @param fname ファイル名
2359 static errr macro_dump(cptr fname)
2361 static cptr mark = "Macro Dump";
2367 /* Build the filename */
2368 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2370 /* File type is "TEXT" */
2371 FILE_TYPE(FILE_TYPE_TEXT);
2373 /* Append to the file */
2374 if (!open_auto_dump(buf, mark)) return (-1);
2377 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2380 for (i = 0; i < macro__num; i++)
2382 /* Extract the action */
2383 ascii_to_text(buf, macro__act[i]);
2385 /* Dump the macro */
2386 auto_dump_printf("A:%s\n", buf);
2388 /* Extract the action */
2389 ascii_to_text(buf, macro__pat[i]);
2391 /* Dump normal macros */
2392 auto_dump_printf("P:%s\n", buf);
2395 auto_dump_printf("\n");
2407 * @brief マクロのトリガーキーを取得する /
2408 * Hack -- ask for a "trigger" (see below)
2409 * @param buf キー表記を保管するバッファ
2413 * Note the complex use of the "inkey()" function from "util.c".
2415 * Note that both "flush()" calls are extremely important.
2418 static void do_cmd_macro_aux(char *buf)
2426 /* Do not process macros */
2432 /* Read the pattern */
2438 /* Do not process macros */
2441 /* Do not wait for keys */
2444 /* Attempt to read a key */
2453 /* Convert the trigger */
2454 ascii_to_text(tmp, buf);
2456 /* Hack -- display the trigger */
2457 Term_addstr(-1, TERM_WHITE, tmp);
2463 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2464 * Hack -- ask for a keymap "trigger" (see below)
2465 * @param buf キー表記を取得するバッファ
2469 * Note that both "flush()" calls are extremely important. This may
2470 * no longer be true, since "util.c" is much simpler now.
2473 static void do_cmd_macro_aux_keymap(char *buf)
2483 /* Convert to ascii */
2484 ascii_to_text(tmp, buf);
2486 /* Hack -- display the trigger */
2487 Term_addstr(-1, TERM_WHITE, tmp);
2494 * @brief キーマップをprefファイルにダンプする /
2495 * Hack -- append all keymaps to the given file
2496 * @param fname ファイルネーム
2500 static errr keymap_dump(cptr fname)
2502 static cptr mark = "Keymap Dump";
2511 if (rogue_like_commands)
2513 mode = KEYMAP_MODE_ROGUE;
2519 mode = KEYMAP_MODE_ORIG;
2523 /* Build the filename */
2524 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2526 /* File type is "TEXT" */
2527 FILE_TYPE(FILE_TYPE_TEXT);
2529 /* Append to the file */
2530 if (!open_auto_dump(buf, mark)) return -1;
2533 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2536 for (i = 0; i < 256; i++)
2540 /* Loop up the keymap */
2541 act = keymap_act[mode][i];
2543 /* Skip empty keymaps */
2546 /* Encode the key */
2549 ascii_to_text(key, buf);
2551 /* Encode the action */
2552 ascii_to_text(buf, act);
2554 /* Dump the macro */
2555 auto_dump_printf("A:%s\n", buf);
2556 auto_dump_printf("C:%d:%s\n", mode, key);
2568 * @brief マクロを設定するコマンドのメインルーチン /
2569 * Interact with "macros"
2573 * Note that the macro "action" must be defined before the trigger.
2575 * Could use some helpful instructions on this page.
2578 void do_cmd_macros(void)
2590 if (rogue_like_commands)
2592 mode = KEYMAP_MODE_ROGUE;
2598 mode = KEYMAP_MODE_ORIG;
2601 /* File type is "TEXT" */
2602 FILE_TYPE(FILE_TYPE_TEXT);
2607 /* Process requests until done */
2612 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2614 /* Describe that action */
2615 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2617 /* Analyze the current action */
2618 ascii_to_text(buf, macro__buf);
2620 /* Display the current action */
2625 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2627 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2628 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2629 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2630 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2631 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2632 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2633 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2634 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2635 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2636 #endif /* ALLOW_MACROS */
2639 prt(_("コマンド: ", "Command: "), 16, 0);
2645 if (i == ESCAPE) break;
2647 /* Load a 'macro' file */
2653 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2656 prt(_("ファイル: ", "File: "), 18, 0);
2658 /* Default filename */
2659 sprintf(tmp, "%s.prf", player_base);
2661 /* Ask for a file */
2662 if (!askfor(tmp, 80)) continue;
2664 /* Process the given filename */
2665 err = process_pref_file(tmp);
2668 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2673 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2677 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2687 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2690 prt(_("ファイル: ", "File: "), 18, 0);
2692 /* Default filename */
2693 sprintf(tmp, "%s.prf", player_base);
2695 /* Ask for a file */
2696 if (!askfor(tmp, 80)) continue;
2698 /* Dump the macros */
2699 (void)macro_dump(tmp);
2702 msg_print(_("マクロを追加しました。", "Appended macros."));
2711 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2715 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2717 /* Get a macro trigger */
2718 do_cmd_macro_aux(buf);
2720 /* Acquire action */
2721 k = macro_find_exact(buf);
2727 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2733 /* Obtain the action */
2734 strcpy(macro__buf, macro__act[k]);
2736 /* Analyze the current action */
2737 ascii_to_text(buf, macro__buf);
2739 /* Display the current action */
2743 msg_print(_("マクロを確認しました。", "Found a macro."));
2747 /* Create a macro */
2751 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2754 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2756 /* Get a macro trigger */
2757 do_cmd_macro_aux(buf);
2763 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2764 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2767 prt(_("マクロ行動: ", "Action: "), 20, 0);
2769 /* Convert to text */
2770 ascii_to_text(tmp, macro__buf);
2772 /* Get an encoded action */
2773 if (askfor(tmp, 80))
2775 /* Convert to ascii */
2776 text_to_ascii(macro__buf, tmp);
2778 /* Link the macro */
2779 macro_add(buf, macro__buf);
2782 msg_print(_("マクロを追加しました。", "Added a macro."));
2786 /* Remove a macro */
2790 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2793 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2795 /* Get a macro trigger */
2796 do_cmd_macro_aux(buf);
2798 /* Link the macro */
2799 macro_add(buf, buf);
2802 msg_print(_("マクロを削除しました。", "Removed a macro."));
2809 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2812 prt(_("ファイル: ", "File: "), 18, 0);
2814 /* Default filename */
2815 sprintf(tmp, "%s.prf", player_base);
2817 /* Ask for a file */
2818 if (!askfor(tmp, 80)) continue;
2820 /* Dump the macros */
2821 (void)keymap_dump(tmp);
2824 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2827 /* Query a keymap */
2833 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2836 prt(_("押すキー: ", "Keypress: "), 18, 0);
2838 /* Get a keymap trigger */
2839 do_cmd_macro_aux_keymap(buf);
2841 /* Look up the keymap */
2842 act = keymap_act[mode][(byte)(buf[0])];
2848 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2854 /* Obtain the action */
2855 strcpy(macro__buf, act);
2857 /* Analyze the current action */
2858 ascii_to_text(buf, macro__buf);
2860 /* Display the current action */
2864 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2868 /* Create a keymap */
2872 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2875 prt(_("押すキー: ", "Keypress: "), 18, 0);
2877 /* Get a keymap trigger */
2878 do_cmd_macro_aux_keymap(buf);
2884 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2885 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2888 prt(_("行動: ", "Action: "), 20, 0);
2890 /* Convert to text */
2891 ascii_to_text(tmp, macro__buf);
2893 /* Get an encoded action */
2894 if (askfor(tmp, 80))
2896 /* Convert to ascii */
2897 text_to_ascii(macro__buf, tmp);
2899 /* Free old keymap */
2900 string_free(keymap_act[mode][(byte)(buf[0])]);
2902 /* Make new keymap */
2903 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2906 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2910 /* Remove a keymap */
2914 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
2917 prt(_("押すキー: ", "Keypress: "), 18, 0);
2919 /* Get a keymap trigger */
2920 do_cmd_macro_aux_keymap(buf);
2922 /* Free old keymap */
2923 string_free(keymap_act[mode][(byte)(buf[0])]);
2925 /* Make new keymap */
2926 keymap_act[mode][(byte)(buf[0])] = NULL;
2929 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
2932 /* Enter a new action */
2936 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
2942 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2943 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2946 prt(_("マクロ行動: ", "Action: "), 20, 0);
2948 /* Hack -- limit the value */
2951 /* Get an encoded action */
2952 if (!askfor(buf, 80)) continue;
2954 /* Extract an action */
2955 text_to_ascii(macro__buf, buf);
2958 #endif /* ALLOW_MACROS */
2965 /* Flush messages */
2974 * @brief キャラクタ色の明暗表現
2976 static cptr lighting_level_str[F_LIT_MAX] =
2991 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
2992 * @param i 指定対象となるキャラクタコード
2993 * @param num 指定されたビジュアルIDを返す参照ポインタ
2994 * @param max ビジュアルIDの最大数
2995 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
2997 static bool cmd_visuals_aux(int i, IDX *num, IDX max)
3004 sprintf(str, "%d", *num);
3006 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3009 tmp = (IDX)strtol(str, NULL, 0);
3010 if (tmp >= 0 && tmp < max)
3013 else if (isupper(i))
3014 *num = (*num + max - 1) % max;
3016 *num = (*num + 1) % max;
3022 * @brief キャラクタの変更メニュー表示
3023 * @param choice_msg 選択メッセージ
3026 static void print_visuals_menu(cptr choice_msg)
3028 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3030 /* Give some choices */
3031 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3033 #ifdef ALLOW_VISUALS
3034 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3035 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3036 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3037 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3038 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3039 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3040 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3041 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3042 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3043 #endif /* ALLOW_VISUALS */
3045 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3048 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3051 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx);
3052 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx);
3053 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level);
3056 * Interact with "visuals"
3058 void do_cmd_visuals(void)
3063 bool need_redraw = FALSE;
3064 const char *empty_symbol = "<< ? >>";
3066 if (use_bigtile) empty_symbol = "<< ?? >>";
3068 /* File type is "TEXT" */
3069 FILE_TYPE(FILE_TYPE_TEXT);
3071 /* Save the screen */
3074 /* Interact until done */
3080 /* Ask for a choice */
3081 print_visuals_menu(NULL);
3086 if (i == ESCAPE) break;
3090 /* Load a 'pref' file */
3093 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3096 prt(_("ファイル: ", "File: "), 17, 0);
3098 /* Default filename */
3099 sprintf(tmp, "%s.prf", player_base);
3102 if (!askfor(tmp, 70)) continue;
3104 /* Process the given filename */
3105 (void)process_pref_file(tmp);
3110 #ifdef ALLOW_VISUALS
3112 /* Dump monster attr/chars */
3115 static cptr mark = "Monster attr/chars";
3118 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3121 prt(_("ファイル: ", "File: "), 17, 0);
3123 /* Default filename */
3124 sprintf(tmp, "%s.prf", player_base);
3126 /* Get a filename */
3127 if (!askfor(tmp, 70)) continue;
3129 /* Build the filename */
3130 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3132 /* Append to the file */
3133 if (!open_auto_dump(buf, mark)) continue;
3136 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3139 for (i = 0; i < max_r_idx; i++)
3141 monster_race *r_ptr = &r_info[i];
3143 /* Skip non-entries */
3144 if (!r_ptr->name) continue;
3146 /* Dump a comment */
3147 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3149 /* Dump the monster attr/char info */
3150 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3151 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3157 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3162 /* Dump object attr/chars */
3165 static cptr mark = "Object attr/chars";
3166 KIND_OBJECT_IDX k_idx;
3169 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3172 prt(_("ファイル: ", "File: "), 17, 0);
3174 /* Default filename */
3175 sprintf(tmp, "%s.prf", player_base);
3177 /* Get a filename */
3178 if (!askfor(tmp, 70)) continue;
3180 /* Build the filename */
3181 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3183 /* Append to the file */
3184 if (!open_auto_dump(buf, mark)) continue;
3187 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3190 for (k_idx = 0; k_idx < max_k_idx; k_idx++)
3193 object_kind *k_ptr = &k_info[k_idx];
3195 /* Skip non-entries */
3196 if (!k_ptr->name) continue;
3201 strip_name(o_name, k_idx);
3207 /* Prepare dummy object */
3208 object_prep(&forge, k_idx);
3210 /* Get un-shuffled flavor name */
3211 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3214 /* Dump a comment */
3215 auto_dump_printf("# %s\n", o_name);
3217 /* Dump the object attr/char info */
3218 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", (int)k_idx,
3219 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3225 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3230 /* Dump feature attr/chars */
3233 static cptr mark = "Feature attr/chars";
3236 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3239 prt(_("ファイル: ", "File: "), 17, 0);
3241 /* Default filename */
3242 sprintf(tmp, "%s.prf", player_base);
3244 /* Get a filename */
3245 if (!askfor(tmp, 70)) continue;
3247 /* Build the filename */
3248 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3250 /* Append to the file */
3251 if (!open_auto_dump(buf, mark)) continue;
3254 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3257 for (i = 0; i < max_f_idx; i++)
3259 feature_type *f_ptr = &f_info[i];
3261 /* Skip non-entries */
3262 if (!f_ptr->name) continue;
3264 /* Skip mimiccing features */
3265 if (f_ptr->mimic != i) continue;
3267 /* Dump a comment */
3268 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3270 /* Dump the feature attr/char info */
3271 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3272 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3273 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3274 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3280 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3285 /* Modify monster attr/chars (numeric operation) */
3288 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3291 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3293 /* Hack -- query until done */
3296 monster_race *r_ptr = &r_info[r];
3300 TERM_COLOR da = r_ptr->d_attr;
3301 byte dc = r_ptr->d_char;
3302 TERM_COLOR ca = r_ptr->x_attr;
3303 byte cc = r_ptr->x_char;
3305 /* Label the object */
3306 Term_putstr(5, 17, -1, TERM_WHITE,
3307 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3309 /* Label the Default values */
3310 Term_putstr(10, 19, -1, TERM_WHITE,
3311 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3313 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3314 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3316 /* Label the Current values */
3317 Term_putstr(10, 20, -1, TERM_WHITE,
3318 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3320 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3321 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3324 Term_putstr(0, 22, -1, TERM_WHITE,
3325 _("コマンド (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): "));
3331 if (i == ESCAPE) break;
3333 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3334 else if (isupper(i)) c = 'a' + i - 'A';
3344 if (!cmd_visuals_aux(i, &r, max_r_idx))
3350 while (!r_info[r].name);
3354 t = (int)r_ptr->x_attr;
3355 (void)cmd_visuals_aux(i, &t, 256);
3356 r_ptr->x_attr = (byte)t;
3360 t = (int)r_ptr->x_char;
3361 (void)cmd_visuals_aux(i, &t, 256);
3362 r_ptr->x_char = (byte)t;
3366 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3370 print_visuals_menu(choice_msg);
3378 /* Modify object attr/chars (numeric operation) */
3381 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3383 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3385 /* Hack -- query until done */
3388 object_kind *k_ptr = &k_info[k];
3392 TERM_COLOR da = k_ptr->d_attr;
3393 SYMBOL_CODE dc = k_ptr->d_char;
3394 TERM_COLOR ca = k_ptr->x_attr;
3395 SYMBOL_CODE cc = k_ptr->x_char;
3397 /* Label the object */
3398 Term_putstr(5, 17, -1, TERM_WHITE,
3399 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3400 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3402 /* Label the Default values */
3403 Term_putstr(10, 19, -1, TERM_WHITE,
3404 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3406 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3407 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3409 /* Label the Current values */
3410 Term_putstr(10, 20, -1, TERM_WHITE,
3411 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3413 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3414 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3417 Term_putstr(0, 22, -1, TERM_WHITE,
3418 _("コマンド (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): "));
3424 if (i == ESCAPE) break;
3426 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3427 else if (isupper(i)) c = 'a' + i - 'A';
3437 if (!cmd_visuals_aux(i, &k, max_k_idx))
3443 while (!k_info[k].name);
3447 t = (int)k_ptr->x_attr;
3448 (void)cmd_visuals_aux(i, &t, 256);
3449 k_ptr->x_attr = (byte)t;
3453 t = (int)k_ptr->x_char;
3454 (void)cmd_visuals_aux(i, &t, 256);
3455 k_ptr->x_char = (byte)t;
3459 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3463 print_visuals_menu(choice_msg);
3471 /* Modify feature attr/chars (numeric operation) */
3474 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3476 static IDX lighting_level = F_LIT_STANDARD;
3477 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3479 /* Hack -- query until done */
3482 feature_type *f_ptr = &f_info[f];
3486 TERM_COLOR da = f_ptr->d_attr[lighting_level];
3487 byte dc = f_ptr->d_char[lighting_level];
3488 TERM_COLOR ca = f_ptr->x_attr[lighting_level];
3489 byte cc = f_ptr->x_char[lighting_level];
3491 /* Label the object */
3493 Term_putstr(5, 17, -1, TERM_WHITE,
3494 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3495 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3497 /* Label the Default values */
3498 Term_putstr(10, 19, -1, TERM_WHITE,
3499 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3501 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3502 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3504 /* Label the Current values */
3506 Term_putstr(10, 20, -1, TERM_WHITE,
3507 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3509 Term_putstr(10, 20, -1, TERM_WHITE,
3510 format("Current attr/char = %3d / %3d", ca, cc));
3513 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3514 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3518 Term_putstr(0, 22, -1, TERM_WHITE,
3519 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3521 Term_putstr(0, 22, -1, TERM_WHITE,
3522 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3529 if (i == ESCAPE) break;
3531 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3532 else if (isupper(i)) c = 'a' + i - 'A';
3542 if (!cmd_visuals_aux(i, &f, max_f_idx))
3548 while (!f_info[f].name || (f_info[f].mimic != f));
3552 t = (int)f_ptr->x_attr[lighting_level];
3553 (void)cmd_visuals_aux(i, &t, 256);
3554 f_ptr->x_attr[lighting_level] = (byte)t;
3558 t = (int)f_ptr->x_char[lighting_level];
3559 (void)cmd_visuals_aux(i, &t, 256);
3560 f_ptr->x_char[lighting_level] = (byte)t;
3564 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3567 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3571 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3575 print_visuals_menu(choice_msg);
3583 /* Modify monster attr/chars (visual mode) */
3585 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3588 /* Modify object attr/chars (visual mode) */
3590 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3593 /* Modify feature attr/chars (visual mode) */
3596 IDX lighting_level = F_LIT_STANDARD;
3597 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3601 #endif /* ALLOW_VISUALS */
3609 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3613 /* Unknown option */
3619 /* Flush messages */
3623 /* Restore the screen */
3626 if (need_redraw) do_cmd_redraw();
3631 * Interact with "colors"
3633 void do_cmd_colors(void)
3642 /* File type is "TEXT" */
3643 FILE_TYPE(FILE_TYPE_TEXT);
3646 /* Save the screen */
3650 /* Interact until done */
3656 /* Ask for a choice */
3657 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3659 /* Give some choices */
3660 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3663 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3664 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3668 prt(_("コマンド: ", "Command: "), 8, 0);
3672 if (i == ESCAPE) break;
3674 /* Load a 'pref' file */
3678 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3681 prt(_("ファイル: ", "File: "), 10, 0);
3684 sprintf(tmp, "%s.prf", player_base);
3687 if (!askfor(tmp, 70)) continue;
3689 /* Process the given filename */
3690 (void)process_pref_file(tmp);
3692 /* Mega-Hack -- react to changes */
3693 Term_xtra(TERM_XTRA_REACT, 0);
3695 /* Mega-Hack -- redraw */
3704 static cptr mark = "Colors";
3707 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3710 prt(_("ファイル: ", "File: "), 10, 0);
3712 /* Default filename */
3713 sprintf(tmp, "%s.prf", player_base);
3715 /* Get a filename */
3716 if (!askfor(tmp, 70)) continue;
3718 /* Build the filename */
3719 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3721 /* Append to the file */
3722 if (!open_auto_dump(buf, mark)) continue;
3725 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3728 for (i = 0; i < 256; i++)
3730 int kv = angband_color_table[i][0];
3731 int rv = angband_color_table[i][1];
3732 int gv = angband_color_table[i][2];
3733 int bv = angband_color_table[i][3];
3735 cptr name = _("未知", "unknown");
3737 /* Skip non-entries */
3738 if (!kv && !rv && !gv && !bv) continue;
3740 /* Extract the color name */
3741 if (i < 16) name = color_names[i];
3743 /* Dump a comment */
3744 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3746 /* Dump the monster attr/char info */
3747 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3754 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3763 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3765 /* Hack -- query until done */
3774 /* Exhibit the normal colors */
3775 for (j = 0; j < 16; j++)
3777 /* Exhibit this color */
3778 Term_putstr(j*4, 20, -1, a, "###");
3780 /* Exhibit all colors */
3781 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3784 /* Describe the color */
3785 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3787 /* Describe the color */
3788 Term_putstr(5, 10, -1, TERM_WHITE,
3789 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3791 /* Label the Current values */
3792 Term_putstr(5, 12, -1, TERM_WHITE,
3793 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3794 angband_color_table[a][0],
3795 angband_color_table[a][1],
3796 angband_color_table[a][2],
3797 angband_color_table[a][3]));
3800 Term_putstr(0, 14, -1, TERM_WHITE,
3801 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3808 if (i == ESCAPE) break;
3811 if (i == 'n') a = (byte)(a + 1);
3812 if (i == 'N') a = (byte)(a - 1);
3813 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3814 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3815 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3816 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3817 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3818 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3819 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3820 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3822 /* Hack -- react to changes */
3823 Term_xtra(TERM_XTRA_REACT, 0);
3825 /* Hack -- redraw */
3832 /* Unknown option */
3838 /* Flush messages */
3843 /* Restore the screen */
3849 * Note something in the message recall
3851 void do_cmd_note(void)
3859 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3861 /* Ignore empty notes */
3862 if (!buf[0] || (buf[0] == ' ')) return;
3864 /* Add the note to the message recall */
3865 msg_format(_("メモ: %s", "Note: %s"), buf);
3870 * Mention the current version
3872 void do_cmd_version(void)
3876 #if FAKE_VER_EXTRA > 0
3877 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3878 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3880 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3881 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3888 * Array of feeling strings
3890 static cptr do_cmd_feeling_text[11] =
3892 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3893 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3894 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3895 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3896 _("とても悪い予感がする...", "You have a very bad feeling..."),
3897 _("悪い予感がする...", "You have a bad feeling..."),
3898 _("何か緊張する。", "You feel nervous."),
3899 _("少し不運な気がする...", "You feel your luck is turning..."),
3900 _("この場所は好きになれない。", "You don't like the look of this place."),
3901 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3902 _("なんて退屈なところだ...", "What a boring place...")
3905 static cptr do_cmd_feeling_text_combat[11] =
3907 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3908 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3909 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
3910 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3911 _("とても悪い予感がする...", "You have a very bad feeling..."),
3912 _("悪い予感がする...", "You have a bad feeling..."),
3913 _("何か緊張する。", "You feel nervous."),
3914 _("少し不運な気がする...", "You feel your luck is turning..."),
3915 _("この場所は好きになれない。", "You don't like the look of this place."),
3916 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3917 _("なんて退屈なところだ...", "What a boring place...")
3920 static cptr do_cmd_feeling_text_lucky[11] =
3922 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3923 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3924 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
3925 _("素晴らしい感じがする...", "You have an excellent feeling..."),
3926 _("とても良い感じがする...", "You have a very good feeling..."),
3927 _("良い感じがする...", "You have a good feeling..."),
3928 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
3929 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
3930 _("見た感じ悪くはない...", "You like the look of this place..."),
3931 _("全然駄目ということはないが...", "This level can't be all bad..."),
3932 _("なんて退屈なところだ...", "What a boring place...")
3937 * Note that "feeling" is set to zero unless some time has passed.
3938 * Note that this is done when the level is GENERATED, not entered.
3940 void do_cmd_feeling(void)
3942 /* No useful feeling in quests */
3943 if (p_ptr->inside_quest && !random_quest_number(dun_level))
3945 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
3949 /* No useful feeling in town */
3950 else if (p_ptr->town_num && !dun_level)
3952 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
3954 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
3959 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
3964 /* No useful feeling in the wilderness */
3965 else if (!dun_level)
3967 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
3971 /* Display the feeling */
3972 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
3973 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
3974 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
3975 inventory[INVEN_BOW].name1 == ART_CRIMSON)
3976 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
3978 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
3984 * Description of each monster group.
3986 static cptr monster_group_text[] =
3989 "ユニーク", /* "Uniques" */
3990 "乗馬可能なモンスター", /* "Riding" */
3991 "賞金首", /* "Wanted */
3992 "アンバーの王族", /* "Ambertite" */
4021 /* "古代ドラゴン/ワイアーム", */
4082 /* "Ancient Dragon/Wyrm", */
4091 "Multi-Headed Reptile",
4096 "Reptile/Amphibian",
4097 "Spider/Scorpion/Tick",
4099 /* "Major Demon", */
4116 * Symbols of monsters in each group. Note the "Uniques" group
4117 * is handled differently.
4119 static cptr monster_group_char[] =
4176 "!$&()+./=>?[\\]`{|~",
4186 * hook function to sort monsters by level
4188 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4190 u16b *who = (u16b*)(u);
4195 monster_race *r_ptr1 = &r_info[w1];
4196 monster_race *r_ptr2 = &r_info[w2];
4201 if (r_ptr2->level > r_ptr1->level) return TRUE;
4202 if (r_ptr1->level > r_ptr2->level) return FALSE;
4204 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4205 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4210 * Build a list of monster indexes in the given group. Return the number
4211 * of monsters in the group.
4213 * mode & 0x01 : check for non-empty group
4214 * mode & 0x02 : visual operation only
4216 static IDX collect_monsters(IDX grp_cur, IDX mon_idx[], BIT_FLAGS8 mode)
4222 /* Get a list of x_char in this group */
4223 cptr group_char = monster_group_char[grp_cur];
4225 /* XXX Hack -- Check if this is the "Uniques" group */
4226 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4228 /* XXX Hack -- Check if this is the "Riding" group */
4229 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4231 /* XXX Hack -- Check if this is the "Wanted" group */
4232 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4234 /* XXX Hack -- Check if this is the "Amberite" group */
4235 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4238 /* Check every race */
4239 for (i = 0; i < max_r_idx; i++)
4241 /* Access the race */
4242 monster_race *r_ptr = &r_info[i];
4244 /* Skip empty race */
4245 if (!r_ptr->name) continue ;
4247 /* Require known monsters */
4248 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4252 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4255 else if (grp_riding)
4257 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4260 else if (grp_wanted)
4262 bool wanted = FALSE;
4264 for (j = 0; j < MAX_KUBI; j++)
4266 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4267 (p_ptr->today_mon && p_ptr->today_mon == i))
4273 if (!wanted) continue;
4276 else if (grp_amberite)
4278 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4283 /* Check for race in the group */
4284 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4288 mon_idx[mon_cnt++] = i;
4290 /* XXX Hack -- Just checking for non-empty group */
4291 if (mode & 0x01) break;
4294 /* Terminate the list */
4295 mon_idx[mon_cnt] = -1;
4297 /* Select the sort method */
4298 ang_sort_comp = ang_sort_comp_monster_level;
4299 ang_sort_swap = ang_sort_swap_hook;
4301 /* Sort by monster level */
4302 ang_sort(mon_idx, &dummy_why, mon_cnt);
4304 /* Return the number of races */
4310 * Description of each monster group.
4312 static cptr object_group_text[] =
4315 "キノコ", /* "Mushrooms" */
4316 "薬", /* "Potions" */
4317 "油つぼ", /* "Flasks" */
4318 "巻物", /* "Scrolls" */
4320 "アミュレット", /* "Amulets" */
4321 "笛", /* "Whistle" */
4322 "光源", /* "Lanterns" */
4323 "魔法棒", /* "Wands" */
4326 "カード", /* "Cards" */
4337 "刀剣類", /* "Swords" */
4338 "鈍器", /* "Blunt Weapons" */
4339 "長柄武器", /* "Polearms" */
4340 "採掘道具", /* "Diggers" */
4341 "飛び道具", /* "Bows" */
4345 "軽装鎧", /* "Soft Armor" */
4346 "重装鎧", /* "Hard Armor" */
4347 "ドラゴン鎧", /* "Dragon Armor" */
4348 "盾", /* "Shields" */
4349 "クローク", /* "Cloaks" */
4350 "籠手", /* "Gloves" */
4351 "ヘルメット", /* "Helms" */
4353 "ブーツ", /* "Boots" */
4406 * TVALs of items in each group
4408 static byte object_group_tval[] =
4449 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4457 * Build a list of object indexes in the given group. Return the number
4458 * of objects in the group.
4460 * mode & 0x01 : check for non-empty group
4461 * mode & 0x02 : visual operation only
4463 static int collect_objects(int grp_cur, IDX object_idx[], BIT_FLAGS8 mode)
4466 int j, k, object_cnt = 0;
4468 /* Get a list of x_char in this group */
4469 byte group_tval = object_group_tval[grp_cur];
4471 /* Check every object */
4472 for (i = 0; i < max_k_idx; i++)
4474 /* Access the object */
4475 object_kind *k_ptr = &k_info[i];
4477 /* Skip empty objects */
4478 if (!k_ptr->name) continue;
4482 /* Any objects will be displayed */
4488 /* Skip non-flavoured objects */
4489 if (!k_ptr->flavor) continue;
4491 /* Require objects ever seen */
4492 if (!k_ptr->aware) continue;
4495 /* Skip items with no distribution (special artifacts) */
4496 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4500 /* Check for objects in the group */
4501 if (TV_LIFE_BOOK == group_tval)
4503 /* Hack -- All spell books */
4504 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4506 /* Add the object */
4507 object_idx[object_cnt++] = i;
4511 else if (k_ptr->tval == group_tval)
4513 /* Add the object */
4514 object_idx[object_cnt++] = i;
4518 /* XXX Hack -- Just checking for non-empty group */
4519 if (mode & 0x01) break;
4522 /* Terminate the list */
4523 object_idx[object_cnt] = -1;
4525 /* Return the number of objects */
4531 * Description of each feature group.
4533 static cptr feature_group_text[] =
4541 * Build a list of feature indexes in the given group. Return the number
4542 * of features in the group.
4544 * mode & 0x01 : check for non-empty group
4546 static int collect_features(int grp_cur, IDX *feat_idx, BIT_FLAGS8 mode)
4551 /* Unused; There is a single group. */
4554 /* Check every feature */
4555 for (i = 0; i < max_f_idx; i++)
4557 /* Access the index */
4558 feature_type *f_ptr = &f_info[i];
4560 /* Skip empty index */
4561 if (!f_ptr->name) continue;
4563 /* Skip mimiccing features */
4564 if (f_ptr->mimic != i) continue;
4567 feat_idx[feat_cnt++] = i;
4569 /* XXX Hack -- Just checking for non-empty group */
4570 if (mode & 0x01) break;
4573 /* Terminate the list */
4574 feat_idx[feat_cnt] = -1;
4576 /* Return the number of races */
4583 * Build a list of monster indexes in the given group. Return the number
4584 * of monsters in the group.
4586 static int collect_artifacts(int grp_cur, int object_idx[])
4588 int i, object_cnt = 0;
4590 /* Get a list of x_char in this group */
4591 byte group_tval = object_group_tval[grp_cur];
4593 /* Check every object */
4594 for (i = 0; i < max_a_idx; i++)
4596 /* Access the artifact */
4597 artifact_type *a_ptr = &a_info[i];
4599 /* Skip empty artifacts */
4600 if (!a_ptr->name) continue;
4602 /* Skip "uncreated" artifacts */
4603 if (!a_ptr->cur_num) continue;
4605 /* Check for race in the group */
4606 if (a_ptr->tval == group_tval)
4609 object_idx[object_cnt++] = i;
4613 /* Terminate the list */
4614 object_idx[object_cnt] = 0;
4616 /* Return the number of races */
4623 * Encode the screen colors
4625 static char hack[17] = "dwsorgbuDWvyRGBU";
4629 * Hack -- load a screen dump from a file
4631 void do_cmd_load_screen(void)
4646 Term_get_size(&wid, &hgt);
4648 /* Build the filename */
4649 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4651 /* Append to the file */
4652 fff = my_fopen(buf, "r");
4655 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4661 /* Save the screen */
4664 /* Clear the screen */
4668 /* Load the screen */
4669 for (y = 0; okay; y++)
4671 /* Get a line of data including control code */
4672 if (!fgets(buf, 1024, fff)) okay = FALSE;
4674 /* Get the blank line */
4675 if (buf[0] == '\n' || buf[0] == '\0') break;
4677 /* Ignore too large screen image */
4678 if (y >= hgt) continue;
4681 for (x = 0; x < wid - 1; x++)
4684 if (buf[x] == '\n' || buf[x] == '\0') break;
4686 /* Put the attr/char */
4687 Term_draw(x, y, TERM_WHITE, buf[x]);
4691 /* Dump the screen */
4692 for (y = 0; okay; y++)
4694 /* Get a line of data including control code */
4695 if (!fgets(buf, 1024, fff)) okay = FALSE;
4697 /* Get the blank line */
4698 if (buf[0] == '\n' || buf[0] == '\0') break;
4700 /* Ignore too large screen image */
4701 if (y >= hgt) continue;
4704 for (x = 0; x < wid - 1; x++)
4707 if (buf[x] == '\n' || buf[x] == '\0') break;
4709 /* Get the attr/char */
4710 (void)(Term_what(x, y, &a, &c));
4712 /* Look up the attr */
4713 for (i = 0; i < 16; i++)
4715 /* Use attr matches */
4716 if (hack[i] == buf[x]) a = (byte_hack)i;
4719 /* Put the attr/char */
4720 Term_draw(x, y, a, c);
4729 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4735 /* Restore the screen */
4742 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4743 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4746 #define IM_FLAG_STR _("*", "* ")
4747 #define HAS_FLAG_STR _("+", "+ ")
4748 #define NO_FLAG_STR _("・", ". ")
4750 #define print_im_or_res_flag(IM, RES) \
4752 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4753 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4756 #define print_flag(TR) \
4758 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4762 /* XTRA HACK RESLIST */
4763 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, OBJECT_TYPE_VALUE tval, char *where)
4765 char o_name[MAX_NLEN];
4766 BIT_FLAGS flgs[TR_FLAG_SIZE];
4768 if (!o_ptr->k_idx) return;
4769 if (o_ptr->tval != tval) return;
4771 /* Identified items only */
4772 if (!object_is_known(o_ptr)) return;
4775 * HACK:Ring of Lordly protection and Dragon equipment
4776 * have random resistances.
4778 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4779 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4780 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4781 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4782 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4783 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4784 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4785 || object_is_artifact(o_ptr))
4788 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4790 while (o_name[i] && (i < 26))
4793 if (iskanji(o_name[i])) i++;
4802 o_name[i] = ' '; i++;
4807 fprintf(fff, "%s %s", where, o_name);
4809 if (!(o_ptr->ident & (IDENT_MENTAL)))
4811 fputs(_("-------不明--------------- -------不明---------\n",
4812 "-------unknown------------ -------unknown------\n"), fff);
4816 object_flags_known(o_ptr, flgs);
4818 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4819 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4820 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4821 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4822 print_flag(TR_RES_POIS);
4823 print_flag(TR_RES_LITE);
4824 print_flag(TR_RES_DARK);
4825 print_flag(TR_RES_SHARDS);
4826 print_flag(TR_RES_SOUND);
4827 print_flag(TR_RES_NETHER);
4828 print_flag(TR_RES_NEXUS);
4829 print_flag(TR_RES_CHAOS);
4830 print_flag(TR_RES_DISEN);
4834 print_flag(TR_RES_BLIND);
4835 print_flag(TR_RES_FEAR);
4836 print_flag(TR_RES_CONF);
4837 print_flag(TR_FREE_ACT);
4838 print_flag(TR_SEE_INVIS);
4839 print_flag(TR_HOLD_EXP);
4840 print_flag(TR_TELEPATHY);
4841 print_flag(TR_SLOW_DIGEST);
4842 print_flag(TR_REGEN);
4843 print_flag(TR_LEVITATION);
4851 fprintf(fff, "%s\n", inven_res_label);
4857 * Display *ID* ed weapons/armors's resistances
4859 static void do_cmd_knowledge_inven(void)
4863 char file_name[1024];
4867 OBJECT_TYPE_VALUE tval;
4873 /* Open a new file */
4874 fff = my_fopen_temp(file_name, 1024);
4877 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4881 fprintf(fff, "%s\n", inven_res_label);
4883 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4887 for (; j < 9; j++) fputc('\n', fff);
4889 fprintf(fff, "%s\n", inven_res_label);
4891 strcpy(where, _("装", "E "));
4892 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4894 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4896 strcpy(where, _("持", "I "));
4897 for (i = 0; i < INVEN_PACK; i++)
4899 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4902 st_ptr = &town[1].store[STORE_HOME];
4903 strcpy(where, _("家", "H "));
4904 for (i = 0; i < st_ptr->stock_num; i++)
4906 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
4910 /* Close the file */
4913 /* Display the file contents */
4914 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
4916 /* Remove the file */
4921 void do_cmd_save_screen_html_aux(char *filename, int message)
4925 TERM_COLOR a = 0, old_a = 0;
4939 cptr html_head[] = {
4940 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
4944 cptr html_foot[] = {
4946 "</body>\n</html>\n",
4952 Term_get_size(&wid, &hgt);
4954 /* File type is "TEXT" */
4955 FILE_TYPE(FILE_TYPE_TEXT);
4957 /* Append to the file */
4958 fff = my_fopen(filename, "w");
4962 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
4969 /* Save the screen */
4973 /* Build the filename */
4974 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
4975 tmpfff = my_fopen(buf, "r");
4977 for (i = 0; html_head[i]; i++)
4978 fputs(html_head[i], fff);
4982 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
4984 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
4988 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
4990 fprintf(fff, "%s\n", buf);
4995 /* Dump the screen */
4996 for (y = 0; y < hgt; y++)
5003 for (x = 0; x < wid - 1; x++)
5007 /* Get the attr/char */
5008 (void)(Term_what(x, y, &a, &c));
5012 case '&': cc = "&"; break;
5013 case '<': cc = "<"; break;
5014 case '>': cc = ">"; break;
5016 case 0x1f: c = '.'; break;
5017 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5022 if ((y == 0 && x == 0) || a != old_a) {
5023 rv = angband_color_table[a][1];
5024 gv = angband_color_table[a][2];
5025 bv = angband_color_table[a][3];
5026 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5027 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5031 fprintf(fff, "%s", cc);
5033 fprintf(fff, "%c", c);
5036 fprintf(fff, "</font>");
5039 for (i = 0; html_foot[i]; i++)
5040 fputs(html_foot[i], fff);
5045 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5047 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5051 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5053 fprintf(fff, "%s\n", buf);
5066 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5070 /* Restore the screen */
5076 * Hack -- save a screen dump to a file
5078 static void do_cmd_save_screen_html(void)
5080 char buf[1024], tmp[256] = "screen.html";
5082 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5085 /* Build the filename */
5086 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5090 do_cmd_save_screen_html_aux(buf, 1);
5095 * Redefinable "save_screen" action
5097 void (*screendump_aux)(void) = NULL;
5101 * Hack -- save a screen dump to a file
5103 void do_cmd_save_screen(void)
5105 bool old_use_graphics = use_graphics;
5106 bool html_dump = FALSE;
5110 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5114 if (c == 'Y' || c == 'y')
5116 else if (c == 'H' || c == 'h')
5128 Term_get_size(&wid, &hgt);
5130 if (old_use_graphics)
5132 use_graphics = FALSE;
5135 /* Redraw everything */
5136 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5138 /* Hack -- update */
5144 do_cmd_save_screen_html();
5148 /* Do we use a special screendump function ? */
5149 else if (screendump_aux)
5151 /* Dump the screen to a graphics file */
5152 (*screendump_aux)();
5154 else /* Dump the screen as text */
5165 /* Build the filename */
5166 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5168 /* File type is "TEXT" */
5169 FILE_TYPE(FILE_TYPE_TEXT);
5171 /* Append to the file */
5172 fff = my_fopen(buf, "w");
5176 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5182 /* Save the screen */
5186 /* Dump the screen */
5187 for (y = 0; y < hgt; y++)
5190 for (x = 0; x < wid - 1; x++)
5192 /* Get the attr/char */
5193 (void)(Term_what(x, y, &a, &c));
5203 fprintf(fff, "%s\n", buf);
5210 /* Dump the screen */
5211 for (y = 0; y < hgt; y++)
5214 for (x = 0; x < wid - 1; x++)
5216 /* Get the attr/char */
5217 (void)(Term_what(x, y, &a, &c));
5220 buf[x] = hack[a&0x0F];
5227 fprintf(fff, "%s\n", buf);
5237 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5240 /* Restore the screen */
5244 if (old_use_graphics)
5246 use_graphics = TRUE;
5249 /* Redraw everything */
5250 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5252 /* Hack -- update */
5259 * Sorting hook -- Comp function -- see below
5261 * We use "u" to point to array of monster indexes,
5262 * and "v" to select the type of sorting to perform on "u".
5264 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5266 u16b *who = (u16b*)(u);
5268 u16b *why = (u16b*)(v);
5275 /* Sort by total kills */
5278 /* Extract total kills */
5279 z1 = a_info[w1].tval;
5280 z2 = a_info[w2].tval;
5282 /* Compare total kills */
5283 if (z1 < z2) return (TRUE);
5284 if (z1 > z2) return (FALSE);
5288 /* Sort by monster level */
5291 /* Extract levels */
5292 z1 = a_info[w1].sval;
5293 z2 = a_info[w2].sval;
5295 /* Compare levels */
5296 if (z1 < z2) return (TRUE);
5297 if (z1 > z2) return (FALSE);
5301 /* Sort by monster experience */
5304 /* Extract experience */
5305 z1 = a_info[w1].level;
5306 z2 = a_info[w2].level;
5308 /* Compare experience */
5309 if (z1 < z2) return (TRUE);
5310 if (z1 > z2) return (FALSE);
5314 /* Compare indexes */
5320 * Sorting hook -- Swap function -- see below
5322 * We use "u" to point to array of monster indexes,
5323 * and "v" to select the type of sorting to perform.
5325 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5327 u16b *who = (u16b*)(u);
5342 * Check the status of "artifacts"
5344 static void do_cmd_knowledge_artifacts(void)
5356 char file_name[1024];
5358 char base_name[MAX_NLEN];
5362 /* Open a new file */
5363 fff = my_fopen_temp(file_name, 1024);
5366 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5371 /* Allocate the "who" array */
5372 C_MAKE(who, max_a_idx, s16b);
5374 /* Allocate the "okay" array */
5375 C_MAKE(okay, max_a_idx, bool);
5377 /* Scan the artifacts */
5378 for (k = 0; k < max_a_idx; k++)
5380 artifact_type *a_ptr = &a_info[k];
5385 /* Skip "empty" artifacts */
5386 if (!a_ptr->name) continue;
5388 /* Skip "uncreated" artifacts */
5389 if (!a_ptr->cur_num) continue;
5395 /* Check the dungeon */
5396 for (y = 0; y < cur_hgt; y++)
5398 for (x = 0; x < cur_wid; x++)
5400 cave_type *c_ptr = &cave[y][x];
5402 OBJECT_IDX this_o_idx, next_o_idx = 0;
5404 /* Scan all objects in the grid */
5405 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5409 /* Acquire object */
5410 o_ptr = &o_list[this_o_idx];
5412 /* Acquire next object */
5413 next_o_idx = o_ptr->next_o_idx;
5415 /* Ignore non-artifacts */
5416 if (!object_is_fixed_artifact(o_ptr)) continue;
5418 /* Ignore known items */
5419 if (object_is_known(o_ptr)) continue;
5421 /* Note the artifact */
5422 okay[o_ptr->name1] = FALSE;
5427 /* Check the inventory and equipment */
5428 for (i = 0; i < INVEN_TOTAL; i++)
5430 object_type *o_ptr = &inventory[i];
5432 /* Ignore non-objects */
5433 if (!o_ptr->k_idx) continue;
5435 /* Ignore non-artifacts */
5436 if (!object_is_fixed_artifact(o_ptr)) continue;
5438 /* Ignore known items */
5439 if (object_is_known(o_ptr)) continue;
5441 /* Note the artifact */
5442 okay[o_ptr->name1] = FALSE;
5445 for (k = 0; k < max_a_idx; k++)
5447 if (okay[k]) who[n++] = k;
5450 /* Select the sort method */
5451 ang_sort_comp = ang_sort_art_comp;
5452 ang_sort_swap = ang_sort_art_swap;
5454 /* Sort the array by dungeon depth of monsters */
5455 ang_sort(who, &why, n);
5457 /* Scan the artifacts */
5458 for (k = 0; k < n; k++)
5460 artifact_type *a_ptr = &a_info[who[k]];
5463 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5465 /* Obtain the base object type */
5466 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5474 /* Get local object */
5477 /* Create fake object */
5478 object_prep(q_ptr, z);
5480 /* Make it an artifact */
5481 q_ptr->name1 = (byte)who[k];
5483 /* Display as if known */
5484 q_ptr->ident |= IDENT_STORE;
5486 /* Describe the artifact */
5487 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5490 /* Hack -- Build the artifact name */
5491 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5494 /* Free the "who" array */
5495 C_KILL(who, max_a_idx, s16b);
5497 /* Free the "okay" array */
5498 C_KILL(okay, max_a_idx, bool);
5500 /* Close the file */
5503 /* Display the file contents */
5504 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5506 /* Remove the file */
5512 * Display known uniques
5513 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5515 static void do_cmd_knowledge_uniques(void)
5524 char file_name[1024];
5527 int n_alive_surface = 0;
5528 int n_alive_over100 = 0;
5529 int n_alive_total = 0;
5532 for (i = 0; i < 10; i++) n_alive[i] = 0;
5534 /* Open a new file */
5535 fff = my_fopen_temp(file_name, 1024);
5539 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5544 /* Allocate the "who" array */
5545 C_MAKE(who, max_r_idx, s16b);
5547 /* Scan the monsters */
5548 for (i = 1; i < max_r_idx; i++)
5550 monster_race *r_ptr = &r_info[i];
5553 if (!r_ptr->name) continue;
5555 /* Require unique monsters */
5556 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5558 /* Only display "known" uniques */
5559 if (!cheat_know && !r_ptr->r_sights) continue;
5561 /* Only print rarity <= 100 uniques */
5562 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5564 /* Only "alive" uniques */
5565 if (r_ptr->max_num == 0) continue;
5569 lev = (r_ptr->level - 1) / 10;
5573 if (max_lev < lev) max_lev = lev;
5575 else n_alive_over100++;
5577 else n_alive_surface++;
5579 /* Collect "appropriate" monsters */
5583 /* Select the sort method */
5584 ang_sort_comp = ang_sort_comp_hook;
5585 ang_sort_swap = ang_sort_swap_hook;
5587 /* Sort the array by dungeon depth of monsters */
5588 ang_sort(who, &why, n);
5590 if (n_alive_surface)
5592 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5593 n_alive_total += n_alive_surface;
5595 for (i = 0; i <= max_lev; i++)
5597 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5598 n_alive_total += n_alive[i];
5600 if (n_alive_over100)
5602 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5603 n_alive_total += n_alive_over100;
5608 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5609 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5613 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5616 /* Scan the monster races */
5617 for (k = 0; k < n; k++)
5619 monster_race *r_ptr = &r_info[who[k]];
5621 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, (int)r_ptr->level);
5624 /* Free the "who" array */
5625 C_KILL(who, max_r_idx, s16b);
5627 /* Close the file */
5630 /* Display the file contents */
5631 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5633 /* Remove the file */
5639 * Display weapon-exp
5641 static void do_cmd_knowledge_weapon_exp(void)
5643 int i, num, weapon_exp;
5648 char file_name[1024];
5651 /* Open a new file */
5652 fff = my_fopen_temp(file_name, 1024);
5654 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5659 for (i = 0; i < 5; i++)
5661 for (num = 0; num < 64; num++)
5663 for (j = 0; j < max_k_idx; j++)
5665 object_kind *k_ptr = &k_info[j];
5667 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5669 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5671 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5673 fprintf(fff, "%-25s ", tmp);
5674 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5675 else fprintf(fff, " ");
5676 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5677 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5685 /* Close the file */
5688 /* Display the file contents */
5689 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5691 /* Remove the file */
5697 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5701 static void do_cmd_knowledge_spell_exp(void)
5704 int spell_exp, exp_level;
5707 const magic_type *s_ptr;
5709 char file_name[1024];
5711 /* Open a new file */
5712 fff = my_fopen_temp(file_name, 1024);
5714 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5719 if (p_ptr->realm1 != REALM_NONE)
5721 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5722 for (i = 0; i < 32; i++)
5724 if (!is_magic(p_ptr->realm1))
5726 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5730 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5732 if (s_ptr->slevel >= 99) continue;
5733 spell_exp = p_ptr->spell_exp[i];
5734 exp_level = spell_exp_level(spell_exp);
5735 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5736 if (p_ptr->realm1 == REALM_HISSATSU)
5737 fprintf(fff, "[--]");
5740 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5741 else fprintf(fff, " ");
5742 fprintf(fff, "%s", exp_level_str[exp_level]);
5744 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5749 if (p_ptr->realm2 != REALM_NONE)
5751 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5752 for (i = 0; i < 32; i++)
5754 if (!is_magic(p_ptr->realm1))
5756 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5760 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5762 if (s_ptr->slevel >= 99) continue;
5764 spell_exp = p_ptr->spell_exp[i + 32];
5765 exp_level = spell_exp_level(spell_exp);
5766 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5767 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5768 else fprintf(fff, " ");
5769 fprintf(fff, "%s", exp_level_str[exp_level]);
5770 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5775 /* Close the file */
5778 /* Display the file contents */
5779 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5781 /* Remove the file */
5787 * @brief スキル情報を表示するコマンドのメインルーチン /
5791 static void do_cmd_knowledge_skill_exp(void)
5793 int i = 0, skill_exp;
5797 char file_name[1024];
5798 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5799 _("二刀流 ", "Dual Wielding "),
5800 _("乗馬 ", "Riding ")};
5802 /* Open a new file */
5803 fff = my_fopen_temp(file_name, 1024);
5805 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5810 for (i = 0; i < 3; i++)
5812 skill_exp = p_ptr->skill_exp[i];
5813 fprintf(fff, "%-20s ", skill_name[i]);
5814 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5815 else fprintf(fff, " ");
5816 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5817 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5821 /* Close the file */
5824 /* Display the file contents */
5825 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5827 /* Remove the file */
5833 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5834 * @param Name 変換したい文字列の参照ポインタ
5837 void plural_aux(char *Name)
5839 int NameLen = strlen(Name);
5841 if (my_strstr(Name, "Disembodied hand"))
5843 strcpy(Name, "Disembodied hands that strangled people");
5845 else if (my_strstr(Name, "Colour out of space"))
5847 strcpy(Name, "Colours out of space");
5849 else if (my_strstr(Name, "stairway to hell"))
5851 strcpy(Name, "stairways to hell");
5853 else if (my_strstr(Name, "Dweller on the threshold"))
5855 strcpy(Name, "Dwellers on the threshold");
5857 else if (my_strstr(Name, " of "))
5859 cptr aider = my_strstr(Name, " of ");
5870 if (dummy[i-1] == 's')
5872 strcpy(&(dummy[i]), "es");
5877 strcpy(&(dummy[i]), "s");
5880 strcpy(&(dummy[i+1]), aider);
5881 strcpy(Name, dummy);
5883 else if (my_strstr(Name, "coins"))
5886 strcpy(dummy, "piles of ");
5887 strcat(dummy, Name);
5888 strcpy(Name, dummy);
5891 else if (my_strstr(Name, "Manes"))
5895 else if (streq(&(Name[NameLen - 2]), "ey"))
5897 strcpy(&(Name[NameLen - 2]), "eys");
5899 else if (Name[NameLen - 1] == 'y')
5901 strcpy(&(Name[NameLen - 1]), "ies");
5903 else if (streq(&(Name[NameLen - 4]), "ouse"))
5905 strcpy(&(Name[NameLen - 4]), "ice");
5907 else if (streq(&(Name[NameLen - 2]), "us"))
5909 strcpy(&(Name[NameLen - 2]), "i");
5911 else if (streq(&(Name[NameLen - 6]), "kelman"))
5913 strcpy(&(Name[NameLen - 6]), "kelmen");
5915 else if (streq(&(Name[NameLen - 8]), "wordsman"))
5917 strcpy(&(Name[NameLen - 8]), "wordsmen");
5919 else if (streq(&(Name[NameLen - 7]), "oodsman"))
5921 strcpy(&(Name[NameLen - 7]), "oodsmen");
5923 else if (streq(&(Name[NameLen - 7]), "eastman"))
5925 strcpy(&(Name[NameLen - 7]), "eastmen");
5927 else if (streq(&(Name[NameLen - 8]), "izardman"))
5929 strcpy(&(Name[NameLen - 8]), "izardmen");
5931 else if (streq(&(Name[NameLen - 5]), "geist"))
5933 strcpy(&(Name[NameLen - 5]), "geister");
5935 else if (streq(&(Name[NameLen - 2]), "ex"))
5937 strcpy(&(Name[NameLen - 2]), "ices");
5939 else if (streq(&(Name[NameLen - 2]), "lf"))
5941 strcpy(&(Name[NameLen - 2]), "lves");
5943 else if (suffix(Name, "ch") ||
5944 suffix(Name, "sh") ||
5945 suffix(Name, "nx") ||
5946 suffix(Name, "s") ||
5949 strcpy(&(Name[NameLen]), "es");
5953 strcpy(&(Name[NameLen]), "s");
5958 * @brief 現在のペットを表示するコマンドのメインルーチン /
5959 * Display current pets
5962 static void do_cmd_knowledge_pets(void)
5966 monster_type *m_ptr;
5969 int show_upkeep = 0;
5970 char file_name[1024];
5973 /* Open a new file */
5974 fff = my_fopen_temp(file_name, 1024);
5976 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5981 /* Process the monsters (backwards) */
5982 for (i = m_max - 1; i >= 1; i--)
5984 /* Access the monster */
5987 /* Ignore "dead" monsters */
5988 if (!m_ptr->r_idx) continue;
5990 /* Calculate "upkeep" for pets */
5994 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
5995 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
5999 show_upkeep = calculate_upkeep();
6001 fprintf(fff, "----------------------------------------------\n");
6003 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6004 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6006 fprintf(fff, " Total: %d pet%s.\n",
6007 t_friends, (t_friends == 1 ? "" : "s"));
6008 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6013 /* Close the file */
6016 /* Display the file contents */
6017 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6019 /* Remove the file */
6025 * @brief 現在のペットを表示するコマンドのメインルーチン /
6028 * @note the player ghosts are ignored.
6030 static void do_cmd_knowledge_kill_count(void)
6039 char file_name[1024];
6044 /* Open a new file */
6045 fff = my_fopen_temp(file_name, 1024);
6048 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6053 /* Allocate the "who" array */
6054 C_MAKE(who, max_r_idx, s16b);
6057 /* Monsters slain */
6060 for (kk = 1; kk < max_r_idx; kk++)
6062 monster_race *r_ptr = &r_info[kk];
6064 if (r_ptr->flags1 & (RF1_UNIQUE))
6066 bool dead = (r_ptr->max_num == 0);
6075 MONSTER_NUMBER This = r_ptr->r_pkills;
6085 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6088 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6090 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6096 /* Scan the monsters */
6097 for (i = 1; i < max_r_idx; i++)
6099 monster_race *r_ptr = &r_info[i];
6101 /* Use that monster */
6102 if (r_ptr->name) who[n++] = i;
6105 /* Select the sort method */
6106 ang_sort_comp = ang_sort_comp_hook;
6107 ang_sort_swap = ang_sort_swap_hook;
6109 /* Sort the array by dungeon depth of monsters */
6110 ang_sort(who, &why, n);
6112 /* Scan the monster races */
6113 for (k = 0; k < n; k++)
6115 monster_race *r_ptr = &r_info[who[k]];
6117 if (r_ptr->flags1 & (RF1_UNIQUE))
6119 bool dead = (r_ptr->max_num == 0);
6123 fprintf(fff, " %s\n", (r_name + r_ptr->name));
6129 MONSTER_NUMBER This = r_ptr->r_pkills;
6134 /* p,tは人と数える by ita */
6135 if (my_strchr("pt", r_ptr->d_char))
6136 fprintf(fff, " %3d 人の %s\n", (int)This, r_name + r_ptr->name);
6138 fprintf(fff, " %3d 体の %s\n", (int)This, r_name + r_ptr->name);
6142 if (my_strstr(r_name + r_ptr->name, "coins"))
6144 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6148 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6154 strcpy(ToPlural, (r_name + r_ptr->name));
6155 plural_aux(ToPlural);
6156 fprintf(fff, " %d %s\n", This, ToPlural);
6166 fprintf(fff,"----------------------------------------------\n");
6168 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6170 fprintf(fff," Total: %lu creature%s killed.\n", (unsigned long int)Total, (Total == 1 ? "" : "s"));
6174 /* Free the "who" array */
6175 C_KILL(who, max_r_idx, s16b);
6177 /* Close the file */
6180 /* Display the file contents */
6181 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6183 /* Remove the file */
6189 * @brief モンスター情報リスト中のグループを表示する /
6190 * Display the object groups.
6194 * @param per_page リストの表示行
6195 * @param grp_idx グループのID配列
6196 * @param group_text グループ名の文字列配列
6197 * @param grp_cur 現在の選択ID
6198 * @param grp_top 現在の選択リスト最上部ID
6201 static void display_group_list(int col, int row, int wid, int per_page, IDX grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6205 /* Display lines until done */
6206 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6208 /* Get the group index */
6209 int grp = grp_idx[grp_top + i];
6211 /* Choose a color */
6212 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6214 /* Erase the entire line */
6215 Term_erase(col, row + i, wid);
6217 /* Display the group label */
6218 c_put_str(attr, group_text[grp], row + i, col);
6224 * Move the cursor in a browser window
6226 static void browser_cursor(char ch, int *column, IDX *grp_cur, int grp_cnt,
6227 IDX *list_cur, int list_cnt)
6232 IDX list = *list_cur;
6234 /* Extract direction */
6237 /* Hack -- scroll up full screen */
6242 /* Hack -- scroll down full screen */
6247 d = get_keymap_dir(ch);
6252 /* Diagonals - hack */
6253 if ((ddx[d] > 0) && ddy[d])
6258 Term_get_size(&wid, &hgt);
6260 browser_rows = hgt - 8;
6262 /* Browse group list */
6267 /* Move up or down */
6268 grp += ddy[d] * (browser_rows - 1);
6271 if (grp >= grp_cnt) grp = grp_cnt - 1;
6272 if (grp < 0) grp = 0;
6273 if (grp != old_grp) list = 0;
6276 /* Browse sub-list list */
6279 /* Move up or down */
6280 list += ddy[d] * browser_rows;
6283 if (list >= list_cnt) list = list_cnt - 1;
6284 if (list < 0) list = 0;
6296 if (col < 0) col = 0;
6297 if (col > 1) col = 1;
6304 /* Browse group list */
6309 /* Move up or down */
6313 if (grp >= grp_cnt) grp = grp_cnt - 1;
6314 if (grp < 0) grp = 0;
6315 if (grp != old_grp) list = 0;
6318 /* Browse sub-list list */
6321 /* Move up or down */
6325 if (list >= list_cnt) list = list_cnt - 1;
6326 if (list < 0) list = 0;
6337 static void display_visual_list(int col, int row, int height, int width, TERM_COLOR attr_top, byte char_left)
6341 /* Clear the display lines */
6342 for (i = 0; i < height; i++)
6344 Term_erase(col, row + i, width);
6347 /* Bigtile mode uses double width */
6348 if (use_bigtile) width /= 2;
6350 /* Display lines until done */
6351 for (i = 0; i < height; i++)
6353 /* Display columns until done */
6354 for (j = 0; j < width; j++)
6358 TERM_LEN x = col + j;
6359 TERM_LEN y = row + i;
6362 /* Bigtile mode uses double width */
6363 if (use_bigtile) x += j;
6368 /* Ignore illegal characters */
6369 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6370 (!use_graphics && ic > 0x7f))
6376 /* Force correct code for both ASCII character and tile */
6377 if (c & 0x80) a |= 0x80;
6379 /* Display symbol */
6380 Term_queue_bigchar(x, y, a, c, 0, 0);
6387 * Place the cursor at the collect position for visual mode
6389 static void place_visual_list_cursor(TERM_LEN col, TERM_LEN row, TERM_COLOR a, byte c, TERM_COLOR attr_top, byte char_left)
6391 int i = (a & 0x7f) - attr_top;
6392 int j = c - char_left;
6394 TERM_LEN x = col + j;
6395 TERM_LEN y = row + i;
6397 /* Bigtile mode uses double width */
6398 if (use_bigtile) x += j;
6400 /* Place the cursor */
6406 * Clipboard variables for copy&paste in visual mode
6408 static TERM_COLOR attr_idx = 0;
6409 static byte char_idx = 0;
6411 /* Hack -- for feature lighting */
6412 static TERM_COLOR attr_idx_feat[F_LIT_MAX];
6413 static byte char_idx_feat[F_LIT_MAX];
6416 * Do visual mode command -- Change symbols
6418 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6419 int height, int width,
6420 TERM_COLOR *attr_top_ptr, byte *char_left_ptr,
6421 TERM_COLOR *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6423 static TERM_COLOR attr_old = 0;
6424 static byte char_old = 0;
6429 if (*visual_list_ptr)
6432 *cur_attr_ptr = attr_old;
6433 *cur_char_ptr = char_old;
6434 *visual_list_ptr = FALSE;
6442 if (*visual_list_ptr)
6445 *visual_list_ptr = FALSE;
6446 *need_redraw = TRUE;
6454 if (!*visual_list_ptr)
6456 *visual_list_ptr = TRUE;
6458 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6459 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6461 attr_old = *cur_attr_ptr;
6462 char_old = *cur_char_ptr;
6473 /* Set the visual */
6474 attr_idx = *cur_attr_ptr;
6475 char_idx = *cur_char_ptr;
6477 /* Hack -- for feature lighting */
6478 for (i = 0; i < F_LIT_MAX; i++)
6480 attr_idx_feat[i] = 0;
6481 char_idx_feat[i] = 0;
6488 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6491 *cur_attr_ptr = attr_idx;
6492 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6493 if (!*visual_list_ptr) *need_redraw = TRUE;
6499 *cur_char_ptr = char_idx;
6500 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6501 if (!*visual_list_ptr) *need_redraw = TRUE;
6507 if (*visual_list_ptr)
6510 int d = get_keymap_dir(ch);
6511 byte a = (*cur_attr_ptr & 0x7f);
6512 byte c = *cur_char_ptr;
6514 if (use_bigtile) eff_width = width / 2;
6515 else eff_width = width;
6517 /* Restrict direction */
6518 if ((a == 0) && (ddy[d] < 0)) d = 0;
6519 if ((c == 0) && (ddx[d] < 0)) d = 0;
6520 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6521 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6526 /* Force correct code for both ASCII character and tile */
6527 if (c & 0x80) a |= 0x80;
6529 /* Set the visual */
6534 /* Move the frame */
6535 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6536 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6537 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6538 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6544 /* Visual mode command is not used */
6550 * Display the monsters in a group.
6552 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6553 int mon_cur, int mon_top, bool visual_only)
6557 /* Display lines until done */
6558 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6562 /* Get the race index */
6563 MONRACE_IDX r_idx = mon_idx[mon_top + i] ;
6565 /* Access the race */
6566 monster_race *r_ptr = &r_info[r_idx];
6568 /* Choose a color */
6569 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6571 /* Display the name */
6572 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6574 /* Hack -- visual_list mode */
6577 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6579 if (p_ptr->wizard || visual_only)
6581 c_prt(attr, format("%d", r_idx), row + i, 62);
6584 /* Erase chars before overwritten by the race letter */
6585 Term_erase(69, row + i, 255);
6587 /* Display symbol */
6588 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6593 if (!(r_ptr->flags1 & RF1_UNIQUE))
6594 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6596 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6597 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6601 /* Clear remaining lines */
6602 for (; i < per_page; i++)
6604 Term_erase(col, row + i, 255);
6610 * Display known monsters.
6612 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx)
6616 IDX grp_cur, grp_top, old_grp_cur;
6617 IDX mon_cur, mon_top;
6618 IDX grp_cnt, grp_idx[100];
6626 bool visual_list = FALSE;
6627 TERM_COLOR attr_top = 0;
6635 Term_get_size(&wid, &hgt);
6637 browser_rows = hgt - 8;
6639 /* Allocate the "mon_idx" array */
6640 C_MAKE(mon_idx, max_r_idx, s16b);
6645 if (direct_r_idx < 0)
6647 mode = visual_only ? 0x03 : 0x01;
6649 /* Check every group */
6650 for (i = 0; monster_group_text[i] != NULL; i++)
6652 /* Measure the label */
6653 len = strlen(monster_group_text[i]);
6655 /* Save the maximum length */
6656 if (len > max) max = len;
6658 /* See if any monsters are known */
6659 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6661 /* Build a list of groups with known monsters */
6662 grp_idx[grp_cnt++] = i;
6670 mon_idx[0] = direct_r_idx;
6673 /* Terminate the list */
6676 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6677 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6680 /* Terminate the list */
6681 grp_idx[grp_cnt] = -1;
6684 grp_cur = grp_top = 0;
6685 mon_cur = mon_top = 0;
6690 mode = visual_only ? 0x02 : 0x00;
6695 monster_race *r_ptr;
6702 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6703 if (direct_r_idx < 0) prt("グループ", 4, 0);
6704 prt("名前", 4, max + 3);
6705 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6707 if (!visual_only) prt("殺害数", 4, 72);
6709 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6710 if (direct_r_idx < 0) prt("Group", 4, 0);
6711 prt("Name", 4, max + 3);
6712 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6714 if (!visual_only) prt("Kills", 4, 73);
6717 for (i = 0; i < 78; i++)
6719 Term_putch(i, 5, TERM_WHITE, '=');
6722 if (direct_r_idx < 0)
6724 for (i = 0; i < browser_rows; i++)
6726 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6733 if (direct_r_idx < 0)
6735 /* Scroll group list */
6736 if (grp_cur < grp_top) grp_top = grp_cur;
6737 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6739 /* Display a list of monster groups */
6740 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6742 if (old_grp_cur != grp_cur)
6744 old_grp_cur = grp_cur;
6746 /* Get a list of monsters in the current group */
6747 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6750 /* Scroll monster list */
6751 while (mon_cur < mon_top)
6752 mon_top = MAX(0, mon_top - browser_rows/2);
6753 while (mon_cur >= mon_top + browser_rows)
6754 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6759 /* Display a list of monsters in the current group */
6760 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6766 /* Display a monster name */
6767 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6769 /* Display visual list below first monster */
6770 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6775 prt(format("<方向>%s%s%s, ESC",
6776 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6777 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6778 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6781 prt(format("<dir>%s%s%s, ESC",
6782 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6783 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6784 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6788 /* Get the current monster */
6789 r_ptr = &r_info[mon_idx[mon_cur]];
6793 /* Mega Hack -- track this monster race */
6794 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6796 /* Hack -- handle stuff */
6802 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6806 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6810 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6815 /* Do visual mode command if needed */
6816 if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &r_ptr->x_attr, &r_ptr->x_char, need_redraw))
6818 if (direct_r_idx >= 0)
6843 /* Recall on screen */
6844 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6846 screen_roff(mon_idx[mon_cur], 0);
6857 /* Move the cursor */
6858 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6865 /* Free the "mon_idx" array */
6866 C_KILL(mon_idx, max_r_idx, s16b);
6871 * Display the objects in a group.
6873 static void display_object_list(int col, int row, int per_page, IDX object_idx[],
6874 int object_cur, int object_top, bool visual_only)
6878 /* Display lines until done */
6879 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6884 object_kind *flavor_k_ptr;
6886 /* Get the object index */
6887 KIND_OBJECT_IDX k_idx = object_idx[object_top + i];
6889 /* Access the object */
6890 object_kind *k_ptr = &k_info[k_idx];
6892 /* Choose a color */
6893 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6894 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6897 if (!visual_only && k_ptr->flavor)
6899 /* Appearance of this object is shuffled */
6900 flavor_k_ptr = &k_info[k_ptr->flavor];
6904 /* Appearance of this object is very normal */
6905 flavor_k_ptr = k_ptr;
6910 attr = ((i + object_top == object_cur) ? cursor : attr);
6912 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
6915 strip_name(o_name, k_idx);
6920 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
6923 /* Display the name */
6924 c_prt(attr, o_name, row + i, col);
6926 /* Hack -- visual_list mode */
6929 c_prt(attr, format("%02x/%02x", flavor_k_ptr->x_attr, flavor_k_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 64 : 68);
6931 if (p_ptr->wizard || visual_only)
6933 c_prt(attr, format("%d", k_idx), row + i, 70);
6936 a = flavor_k_ptr->x_attr;
6937 c = flavor_k_ptr->x_char;
6939 /* Display symbol */
6940 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
6943 /* Clear remaining lines */
6944 for (; i < per_page; i++)
6946 Term_erase(col, row + i, 255);
6951 * Describe fake object
6953 static void desc_obj_fake(KIND_OBJECT_IDX k_idx)
6956 object_type object_type_body;
6958 /* Get local object */
6959 o_ptr = &object_type_body;
6962 /* Create the artifact */
6963 object_prep(o_ptr, k_idx);
6965 /* It's fully know */
6966 o_ptr->ident |= IDENT_KNOWN;
6968 /* Track the object */
6969 /* object_actual_track(o_ptr); */
6971 /* Hack - mark as fake */
6972 /* term_obj_real = FALSE; */
6974 /* Hack -- Handle stuff */
6977 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
6979 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
6987 * Display known objects
6989 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx)
6993 IDX grp_cur, grp_top, old_grp_cur;
6994 IDX object_old, object_cur, object_top;
7004 bool visual_list = FALSE;
7005 TERM_COLOR attr_top = 0;
7013 Term_get_size(&wid, &hgt);
7015 browser_rows = hgt - 8;
7017 /* Allocate the "object_idx" array */
7018 C_MAKE(object_idx, max_k_idx, IDX);
7023 if (direct_k_idx < 0)
7025 mode = visual_only ? 0x03 : 0x01;
7027 /* Check every group */
7028 for (i = 0; object_group_text[i] != NULL; i++)
7030 /* Measure the label */
7031 len = strlen(object_group_text[i]);
7033 /* Save the maximum length */
7034 if (len > max) max = len;
7036 /* See if any monsters are known */
7037 if (collect_objects(i, object_idx, mode))
7039 /* Build a list of groups with known monsters */
7040 grp_idx[grp_cnt++] = i;
7049 object_kind *k_ptr = &k_info[direct_k_idx];
7050 object_kind *flavor_k_ptr;
7052 if (!visual_only && k_ptr->flavor)
7054 /* Appearance of this object is shuffled */
7055 flavor_k_ptr = &k_info[k_ptr->flavor];
7059 /* Appearance of this object is very normal */
7060 flavor_k_ptr = k_ptr;
7063 object_idx[0] = direct_k_idx;
7064 object_old = direct_k_idx;
7067 /* Terminate the list */
7070 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7071 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7074 /* Terminate the list */
7075 grp_idx[grp_cnt] = -1;
7078 grp_cur = grp_top = 0;
7079 object_cur = object_top = 0;
7084 mode = visual_only ? 0x02 : 0x00;
7089 object_kind *k_ptr, *flavor_k_ptr;
7096 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7097 if (direct_k_idx < 0) prt("グループ", 4, 0);
7098 prt("名前", 4, max + 3);
7099 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7102 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7103 if (direct_k_idx < 0) prt("Group", 4, 0);
7104 prt("Name", 4, max + 3);
7105 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7109 for (i = 0; i < 78; i++)
7111 Term_putch(i, 5, TERM_WHITE, '=');
7114 if (direct_k_idx < 0)
7116 for (i = 0; i < browser_rows; i++)
7118 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7125 if (direct_k_idx < 0)
7127 /* Scroll group list */
7128 if (grp_cur < grp_top) grp_top = grp_cur;
7129 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7131 /* Display a list of object groups */
7132 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7134 if (old_grp_cur != grp_cur)
7136 old_grp_cur = grp_cur;
7138 /* Get a list of objects in the current group */
7139 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7142 /* Scroll object list */
7143 while (object_cur < object_top)
7144 object_top = MAX(0, object_top - browser_rows/2);
7145 while (object_cur >= object_top + browser_rows)
7146 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7151 /* Display a list of objects in the current group */
7152 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7156 object_top = object_cur;
7158 /* Display a list of objects in the current group */
7159 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7161 /* Display visual list below first object */
7162 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7165 /* Get the current object */
7166 k_ptr = &k_info[object_idx[object_cur]];
7168 if (!visual_only && k_ptr->flavor)
7170 /* Appearance of this object is shuffled */
7171 flavor_k_ptr = &k_info[k_ptr->flavor];
7175 /* Appearance of this object is very normal */
7176 flavor_k_ptr = k_ptr;
7181 prt(format("<方向>%s%s%s, ESC",
7182 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7183 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7184 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7187 prt(format("<dir>%s%s%s, ESC",
7188 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7189 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7190 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7196 /* Mega Hack -- track this object */
7197 if (object_cnt) object_kind_track(object_idx[object_cur]);
7199 /* The "current" object changed */
7200 if (object_old != object_idx[object_cur])
7202 /* Hack -- handle stuff */
7205 /* Remember the "current" object */
7206 object_old = object_idx[object_cur];
7212 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7216 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7220 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7225 /* Do visual mode command if needed */
7226 if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw))
7228 if (direct_k_idx >= 0)
7253 /* Recall on screen */
7254 if (!visual_list && !visual_only && (grp_cnt > 0))
7256 desc_obj_fake(object_idx[object_cur]);
7264 /* Move the cursor */
7265 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7271 /* Free the "object_idx" array */
7272 C_KILL(object_idx, max_k_idx, IDX);
7277 * Display the features in a group.
7279 static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_idx,
7280 FEAT_IDX feat_cur, FEAT_IDX feat_top, bool visual_only, int lighting_level)
7282 int lit_col[F_LIT_MAX], i, j;
7283 int f_idx_col = use_bigtile ? 62 : 64;
7285 /* Correct columns 1 and 4 */
7286 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7287 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7288 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7290 /* Display lines until done */
7291 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7296 FEAT_IDX f_idx = feat_idx[feat_top + i];
7298 /* Access the index */
7299 feature_type *f_ptr = &f_info[f_idx];
7301 int row_i = row + i;
7303 /* Choose a color */
7304 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7306 /* Display the name */
7307 c_prt(attr, f_name + f_ptr->name, row_i, col);
7309 /* Hack -- visual_list mode */
7312 /* Display lighting level */
7313 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7315 c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row_i, f_idx_col - ((p_ptr->wizard || visual_only) ? 6 : 2));
7317 if (p_ptr->wizard || visual_only)
7319 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7322 /* Display symbol */
7323 Term_queue_bigchar(lit_col[F_LIT_STANDARD], row_i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0);
7325 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7326 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7328 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7330 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7332 /* Mega-hack -- Use non-standard colour */
7333 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7335 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7339 /* Clear remaining lines */
7340 for (; i < per_page; i++)
7342 Term_erase(col, row + i, 255);
7348 * Interact with feature visuals.
7350 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level)
7354 IDX grp_cur, grp_top, old_grp_cur;
7355 IDX feat_cur, feat_top;
7365 bool visual_list = FALSE;
7366 TERM_COLOR attr_top = 0;
7372 TERM_COLOR attr_old[F_LIT_MAX];
7373 byte char_old[F_LIT_MAX];
7374 TERM_COLOR *cur_attr_ptr;
7377 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7378 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7380 Term_get_size(&wid, &hgt);
7382 browser_rows = hgt - 8;
7384 /* Allocate the "feat_idx" array */
7385 C_MAKE(feat_idx, max_f_idx, IDX);
7390 if (direct_f_idx < 0)
7392 /* Check every group */
7393 for (i = 0; feature_group_text[i] != NULL; i++)
7395 /* Measure the label */
7396 len = strlen(feature_group_text[i]);
7398 /* Save the maximum length */
7399 if (len > max) max = len;
7401 /* See if any features are known */
7402 if (collect_features(i, feat_idx, 0x01))
7404 /* Build a list of groups with known features */
7405 grp_idx[grp_cnt++] = i;
7413 feature_type *f_ptr = &f_info[direct_f_idx];
7415 feat_idx[0] = direct_f_idx;
7418 /* Terminate the list */
7421 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7422 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7424 for (i = 0; i < F_LIT_MAX; i++)
7426 attr_old[i] = f_ptr->x_attr[i];
7427 char_old[i] = f_ptr->x_char[i];
7431 /* Terminate the list */
7432 grp_idx[grp_cnt] = -1;
7435 grp_cur = grp_top = 0;
7436 feat_cur = feat_top = 0;
7444 feature_type *f_ptr;
7451 prt("表示 - 地形", 2, 0);
7452 if (direct_f_idx < 0) prt("グループ", 4, 0);
7453 prt("名前", 4, max + 3);
7456 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7457 prt("文字 ( l/ d)", 4, 66);
7461 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7462 prt("文字 (l/d)", 4, 68);
7465 prt("Visuals - features", 2, 0);
7466 if (direct_f_idx < 0) prt("Group", 4, 0);
7467 prt("Name", 4, max + 3);
7470 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7471 prt("Sym ( l/ d)", 4, 67);
7475 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7476 prt("Sym (l/d)", 4, 69);
7480 for (i = 0; i < 78; i++)
7482 Term_putch(i, 5, TERM_WHITE, '=');
7485 if (direct_f_idx < 0)
7487 for (i = 0; i < browser_rows; i++)
7489 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7496 if (direct_f_idx < 0)
7498 /* Scroll group list */
7499 if (grp_cur < grp_top) grp_top = grp_cur;
7500 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7502 /* Display a list of feature groups */
7503 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7505 if (old_grp_cur != grp_cur)
7507 old_grp_cur = grp_cur;
7509 /* Get a list of features in the current group */
7510 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7513 /* Scroll feature list */
7514 while (feat_cur < feat_top)
7515 feat_top = MAX(0, feat_top - browser_rows/2);
7516 while (feat_cur >= feat_top + browser_rows)
7517 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7522 /* Display a list of features in the current group */
7523 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7527 feat_top = feat_cur;
7529 /* Display a list of features in the current group */
7530 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7532 /* Display visual list below first object */
7533 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7538 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7539 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7540 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7543 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7544 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7545 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7549 /* Get the current feature */
7550 f_ptr = &f_info[feat_idx[feat_cur]];
7551 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7552 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7556 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7560 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7564 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7569 if (visual_list && ((ch == 'A') || (ch == 'a')))
7571 int prev_lighting_level = *lighting_level;
7575 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7576 else (*lighting_level)--;
7580 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7581 else (*lighting_level)++;
7584 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7585 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7587 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7588 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7593 else if ((ch == 'D') || (ch == 'd'))
7595 TERM_COLOR prev_x_attr = f_ptr->x_attr[*lighting_level];
7596 byte prev_x_char = f_ptr->x_char[*lighting_level];
7598 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7602 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7603 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7605 if (prev_x_char != f_ptr->x_char[*lighting_level])
7606 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7608 else *need_redraw = TRUE;
7613 /* Do visual mode command if needed */
7614 else if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, cur_attr_ptr, cur_char_ptr, need_redraw))
7618 /* Restore previous visual settings */
7620 for (i = 0; i < F_LIT_MAX; i++)
7622 f_ptr->x_attr[i] = attr_old[i];
7623 f_ptr->x_char[i] = char_old[i];
7630 if (direct_f_idx >= 0) flag = TRUE;
7631 else *lighting_level = F_LIT_STANDARD;
7634 /* Preserve current visual settings */
7637 for (i = 0; i < F_LIT_MAX; i++)
7639 attr_old[i] = f_ptr->x_attr[i];
7640 char_old[i] = f_ptr->x_char[i];
7642 *lighting_level = F_LIT_STANDARD;
7649 for (i = 0; i < F_LIT_MAX; i++)
7651 attr_idx_feat[i] = f_ptr->x_attr[i];
7652 char_idx_feat[i] = f_ptr->x_char[i];
7661 /* Allow TERM_DARK text */
7662 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7664 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7665 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7683 /* Move the cursor */
7684 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7690 /* Free the "feat_idx" array */
7691 C_KILL(feat_idx, max_f_idx, IDX);
7696 * List wanted monsters
7698 static void do_cmd_knowledge_kubi(void)
7703 char file_name[1024];
7706 /* Open a new file */
7707 fff = my_fopen_temp(file_name, 1024);
7709 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7716 bool listed = FALSE;
7719 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7721 fprintf(fff, "賞金首リスト\n");
7723 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7725 fprintf(fff, "List of wanted monsters\n");
7727 fprintf(fff, "----------------------------------------------\n");
7729 for (i = 0; i < MAX_KUBI; i++)
7731 if (kubi_r_idx[i] <= 10000)
7733 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7741 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7745 /* Close the file */
7748 /* Display the file contents */
7749 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7751 /* Remove the file */
7756 * List virtues & status
7758 static void do_cmd_knowledge_virtues(void)
7762 char file_name[1024];
7765 /* Open a new file */
7766 fff = my_fopen_temp(file_name, 1024);
7768 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7775 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7779 /* Close the file */
7782 /* Display the file contents */
7783 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7785 /* Remove the file */
7793 static void do_cmd_knowledge_dungeon(void)
7797 char file_name[1024];
7801 /* Open a new file */
7802 fff = my_fopen_temp(file_name, 1024);
7804 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7811 for (i = 1; i < max_d_idx; i++)
7815 if (!d_info[i].maxdepth) continue;
7816 if (!max_dlv[i]) continue;
7817 if (d_info[i].final_guardian)
7819 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7821 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7823 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
7827 /* Close the file */
7830 /* Display the file contents */
7831 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7833 /* Remove the file */
7838 * List virtues & status
7841 static void do_cmd_knowledge_stat(void)
7845 char file_name[1024];
7848 /* Open a new file */
7849 fff = my_fopen_temp(file_name, 1024);
7851 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7858 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7859 (2 * p_ptr->hitdie +
7860 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7863 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7864 else fprintf(fff, "現在の体力ランク : ???\n\n");
7865 fprintf(fff, "能力の最大値\n\n");
7867 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7868 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7869 fprintf(fff, "Limits of maximum stats\n\n");
7871 for (v_nr = 0; v_nr < 6; v_nr++)
7873 if ((p_ptr->knowledge & KNOW_STAT) || p_ptr->stat_max[v_nr] == p_ptr->stat_max_max[v_nr]) fprintf(fff, "%s 18/%d\n", stat_names[v_nr], p_ptr->stat_max_max[v_nr]-18);
7874 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7880 /* Close the file */
7883 /* Display the file contents */
7884 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7886 /* Remove the file */
7892 * Print all active quests
7894 static void do_cmd_knowledge_quests_current(FILE *fff)
7897 char rand_tmp_str[120] = "\0";
7899 monster_race *r_ptr;
7901 int rand_level = 100;
7904 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7906 for (i = 1; i < max_q_idx; i++)
7908 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
7909 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
7910 (quest[i].status == QUEST_STATUS_COMPLETED))
7912 /* Set the quest number temporary */
7913 IDX old_quest = p_ptr->inside_quest;
7916 /* Clear the text */
7917 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
7918 quest_text_line = 0;
7920 p_ptr->inside_quest = i;
7922 /* Get the quest text */
7923 init_flags = INIT_SHOW_TEXT;
7925 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
7927 /* Reset the old quest number */
7928 p_ptr->inside_quest = old_quest;
7930 /* No info from "silent" quests */
7931 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7935 if (quest[i].type != QUEST_TYPE_RANDOM)
7937 char note[80] = "\0";
7939 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
7941 switch (quest[i].type)
7943 case QUEST_TYPE_KILL_LEVEL:
7944 case QUEST_TYPE_KILL_ANY_LEVEL:
7945 r_ptr = &r_info[quest[i].r_idx];
7946 strcpy(name, r_name + r_ptr->name);
7947 if (quest[i].max_num > 1)
7950 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
7951 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
7954 sprintf(note," - kill %d %s, have killed %d.",
7955 (int)quest[i].max_num, name, (int)quest[i].cur_num);
7959 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
7962 case QUEST_TYPE_FIND_ARTIFACT:
7965 artifact_type *a_ptr = &a_info[quest[i].k_idx];
7967 object_type *q_ptr = &forge;
7968 KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
7969 object_prep(q_ptr, k_idx);
7970 q_ptr->name1 = quest[i].k_idx;
7971 q_ptr->ident = IDENT_STORE;
7972 object_desc(name, q_ptr, OD_NAME_ONLY);
7974 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
7976 case QUEST_TYPE_FIND_EXIT:
7977 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
7980 case QUEST_TYPE_KILL_NUMBER:
7982 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
7983 (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num));
7985 sprintf(note," - Kill %d monsters, have killed %d.",
7986 (int)quest[i].max_num, (int)quest[i].cur_num);
7990 case QUEST_TYPE_KILL_ALL:
7991 case QUEST_TYPE_TOWER:
7992 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
7997 /* Print the quest info */
7998 sprintf(tmp_str, _(" %s (危険度:%d階相当)%s\n", " %s (Danger level: %d)%s\n"),
7999 quest[i].name, (int)quest[i].level, note);
8001 fputs(tmp_str, fff);
8003 if (quest[i].status == QUEST_STATUS_COMPLETED)
8005 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8006 fputs(tmp_str, fff);
8012 while (quest_text[j][0] && j < 10)
8014 fprintf(fff, " %s\n", quest_text[j]);
8019 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8022 rand_level = quest[i].level;
8024 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8026 /* Print the quest info */
8027 r_ptr = &r_info[quest[i].r_idx];
8028 strcpy(name, r_name + r_ptr->name);
8030 if (quest[i].max_num > 1)
8033 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8034 quest[i].name, (int)quest[i].level,
8035 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
8039 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8040 quest[i].name, (int)quest[i].level,
8041 (int)quest[i].max_num, name, (int)quest[i].cur_num);
8046 sprintf(rand_tmp_str,_(" %s (%d 階) - %sを倒す。\n", " %s (Dungeon level: %d)\n Kill %s.\n"),
8047 quest[i].name, (int)quest[i].level, name);
8054 /* Print the current random quest */
8055 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8057 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8061 static bool do_cmd_knowledge_quests_aux(FILE *fff, IDX q_idx)
8064 char playtime_str[16];
8065 quest_type* const q_ptr = &quest[q_idx];
8067 if (is_fixed_quest_idx(q_idx))
8069 /* Set the quest number temporary */
8070 IDX old_quest = p_ptr->inside_quest;
8072 p_ptr->inside_quest = q_idx;
8075 init_flags = INIT_NAME_ONLY;
8077 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8079 /* Reset the old quest number */
8080 p_ptr->inside_quest = old_quest;
8082 /* No info from "silent" quests */
8083 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8086 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8087 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8089 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8091 /* Print the quest info */
8092 if (q_ptr->complev == 0)
8095 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8096 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8097 r_name+r_info[q_ptr->r_idx].name,
8098 (int)q_ptr->level, playtime_str);
8103 _(" %-35s (%3d階) - レベル%2d - %s\n",
8104 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8105 r_name+r_info[q_ptr->r_idx].name,
8113 /* Print the quest info */
8115 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8116 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8117 q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str);
8120 fputs(tmp_str, fff);
8126 * Print all finished quests
8128 void do_cmd_knowledge_quests_completed(FILE *fff, IDX quest_num[])
8133 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8134 for (i = 1; i < max_q_idx; i++)
8136 IDX q_idx = quest_num[i];
8137 quest_type* const q_ptr = &quest[q_idx];
8139 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8140 do_cmd_knowledge_quests_aux(fff, q_idx))
8145 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8150 * Print all failed quests
8152 void do_cmd_knowledge_quests_failed(FILE *fff, IDX quest_num[])
8157 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8158 for (i = 1; i < max_q_idx; i++)
8160 IDX q_idx = quest_num[i];
8161 quest_type* const q_ptr = &quest[q_idx];
8163 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8164 do_cmd_knowledge_quests_aux(fff, q_idx))
8169 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8174 * Print all random quests
8176 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8182 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8183 for (i = 1; i < max_q_idx; i++)
8185 /* No info from "silent" quests */
8186 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8188 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8192 /* Print the quest info */
8193 sprintf(tmp_str, _(" %s (%d階, %s)\n", " %s (%d, %s)\n"),
8194 quest[i].name, (int)quest[i].level, r_name+r_info[quest[i].r_idx].name);
8195 fputs(tmp_str, fff);
8198 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8202 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8204 QUEST_IDX *q_num = (QUEST_IDX *)u;
8205 quest_type *qa = &quest[q_num[a]];
8206 quest_type *qb = &quest[q_num[b]];
8211 return (qa->comptime != qb->comptime) ?
8212 (qa->comptime < qb->comptime) :
8213 (qa->level <= qb->level);
8216 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8218 QUEST_IDX *q_num = (QUEST_IDX *)u;
8225 q_num[a] = q_num[b];
8231 * Print quest status of all active quests
8233 static void do_cmd_knowledge_quests(void)
8236 char file_name[1024];
8241 /* Open a new file */
8242 fff = my_fopen_temp(file_name, 1024);
8245 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8250 /* Allocate Memory */
8251 C_MAKE(quest_num, max_q_idx, IDX);
8253 /* Sort by compete level */
8254 for (i = 1; i < max_q_idx; i++) quest_num[i] = i;
8255 ang_sort_comp = ang_sort_comp_quest_num;
8256 ang_sort_swap = ang_sort_swap_quest_num;
8257 ang_sort(quest_num, &dummy, max_q_idx);
8259 /* Dump Quest Information */
8260 do_cmd_knowledge_quests_current(fff);
8262 do_cmd_knowledge_quests_completed(fff, quest_num);
8264 do_cmd_knowledge_quests_failed(fff, quest_num);
8268 do_cmd_knowledge_quests_wiz_random(fff);
8271 /* Close the file */
8274 /* Display the file contents */
8275 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8277 /* Remove the file */
8281 C_KILL(quest_num, max_q_idx, IDX);
8288 static void do_cmd_knowledge_home(void)
8293 char file_name[1024];
8295 char o_name[MAX_NLEN];
8298 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8300 /* Open a new file */
8301 fff = my_fopen_temp(file_name, 1024);
8303 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8310 /* Print all homes in the different towns */
8311 st_ptr = &town[1].store[STORE_HOME];
8313 /* Home -- if anything there */
8314 if (st_ptr->stock_num)
8319 /* Header with name of the town */
8320 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8322 /* Dump all available items */
8323 for (i = 0; i < st_ptr->stock_num; i++)
8326 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8327 object_desc(o_name, &st_ptr->stock[i], 0);
8328 if (strlen(o_name) <= 80-3)
8330 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8336 for (n = 0, t = o_name; n < 80-3; n++, t++)
8337 if(iskanji(*t)) {t++; n++;}
8338 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8340 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8341 fprintf(fff, " %.77s\n", o_name+n);
8344 object_desc(o_name, &st_ptr->stock[i], 0);
8345 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8350 /* Add an empty line */
8351 fprintf(fff, "\n\n");
8355 /* Close the file */
8358 /* Display the file contents */
8359 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8361 /* Remove the file */
8367 * Check the status of "autopick"
8369 static void do_cmd_knowledge_autopick(void)
8373 char file_name[1024];
8375 /* Open a new file */
8376 fff = my_fopen_temp(file_name, 1024);
8380 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8387 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8391 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8392 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8395 for (k = 0; k < max_autopick; k++)
8398 byte act = autopick_list[k].action;
8399 if (act & DONT_AUTOPICK)
8401 tmp = _("放置", "Leave");
8403 else if (act & DO_AUTODESTROY)
8405 tmp = _("破壊", "Destroy");
8407 else if (act & DO_AUTOPICK)
8409 tmp = _("拾う", "Pickup");
8413 tmp = _("確認", "Query");
8416 if (act & DO_DISPLAY)
8417 fprintf(fff, "%11s", format("[%s]", tmp));
8419 fprintf(fff, "%11s", format("(%s)", tmp));
8421 tmp = autopick_line_from_entry(&autopick_list[k]);
8422 fprintf(fff, " %s", tmp);
8426 /* Close the file */
8428 /* Display the file contents */
8429 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8431 /* Remove the file */
8437 * Interact with "knowledge"
8439 void do_cmd_knowledge(void)
8442 bool need_redraw = FALSE;
8444 /* File type is "TEXT" */
8445 FILE_TYPE(FILE_TYPE_TEXT);
8447 /* Save the screen */
8450 /* Interact until done */
8456 /* Ask for a choice */
8458 prt(format("%d/2 ページ", (p+1)), 2, 65);
8459 prt("現在の知識を確認する", 3, 0);
8461 prt(format("page %d/2", (p+1)), 2, 65);
8462 prt("Display current knowledge", 3, 0);
8465 /* Give some choices */
8469 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8470 prt("(2) 既知のアイテム の一覧", 7, 5);
8471 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8472 prt("(4) 既知のモンスター の一覧", 9, 5);
8473 prt("(5) 倒した敵の数 の一覧", 10, 5);
8474 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8475 prt("(7) 現在のペット の一覧", 12, 5);
8476 prt("(8) 我が家のアイテム の一覧", 13, 5);
8477 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8478 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8482 prt("(a) 自分に関する情報 の一覧", 6, 5);
8483 prt("(b) 突然変異 の一覧", 7, 5);
8484 prt("(c) 武器の経験値 の一覧", 8, 5);
8485 prt("(d) 魔法の経験値 の一覧", 9, 5);
8486 prt("(e) 技能の経験値 の一覧", 10, 5);
8487 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8488 prt("(g) 入ったダンジョン の一覧", 12, 5);
8489 prt("(h) 実行中のクエスト の一覧", 13, 5);
8490 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8495 prt("(1) Display known artifacts", 6, 5);
8496 prt("(2) Display known objects", 7, 5);
8497 prt("(3) Display remaining uniques", 8, 5);
8498 prt("(4) Display known monster", 9, 5);
8499 prt("(5) Display kill count", 10, 5);
8500 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8501 prt("(7) Display current pets", 12, 5);
8502 prt("(8) Display home inventory", 13, 5);
8503 prt("(9) Display *identified* equip.", 14, 5);
8504 prt("(0) Display terrain symbols.", 15, 5);
8508 prt("(a) Display about yourself", 6, 5);
8509 prt("(b) Display mutations", 7, 5);
8510 prt("(c) Display weapon proficiency", 8, 5);
8511 prt("(d) Display spell proficiency", 9, 5);
8512 prt("(e) Display misc. proficiency", 10, 5);
8513 prt("(f) Display virtues", 11, 5);
8514 prt("(g) Display dungeons", 12, 5);
8515 prt("(h) Display current quests", 13, 5);
8516 prt("(i) Display auto pick/destroy", 14, 5);
8522 prt("ESC) 抜ける", 21, 1);
8523 prt("SPACE) 次ページ", 21, 30);
8524 /*prt("-) 前ページ", 21, 60);*/
8525 prt("コマンド:", 20, 0);
8527 prt("-more-", 17, 8);
8528 prt("ESC) Exit menu", 21, 1);
8529 prt("SPACE) Next page", 21, 30);
8530 /*prt("-) Previous page", 21, 60);*/
8531 prt("Command: ", 20, 0);
8537 if (i == ESCAPE) break;
8540 case ' ': /* Page change */
8544 case '1': /* Artifacts */
8545 do_cmd_knowledge_artifacts();
8547 case '2': /* Objects */
8548 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8550 case '3': /* Uniques */
8551 do_cmd_knowledge_uniques();
8553 case '4': /* Monsters */
8554 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8556 case '5': /* Kill count */
8557 do_cmd_knowledge_kill_count();
8559 case '6': /* wanted */
8560 if (!vanilla_town) do_cmd_knowledge_kubi();
8562 case '7': /* Pets */
8563 do_cmd_knowledge_pets();
8565 case '8': /* Home */
8566 do_cmd_knowledge_home();
8568 case '9': /* Resist list */
8569 do_cmd_knowledge_inven();
8571 case '0': /* Feature list */
8573 IDX lighting_level = F_LIT_STANDARD;
8574 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8578 case 'a': /* Max stat */
8579 do_cmd_knowledge_stat();
8581 case 'b': /* Mutations */
8582 do_cmd_knowledge_mutations();
8584 case 'c': /* weapon-exp */
8585 do_cmd_knowledge_weapon_exp();
8587 case 'd': /* spell-exp */
8588 do_cmd_knowledge_spell_exp();
8590 case 'e': /* skill-exp */
8591 do_cmd_knowledge_skill_exp();
8593 case 'f': /* Virtues */
8594 do_cmd_knowledge_virtues();
8596 case 'g': /* Dungeon */
8597 do_cmd_knowledge_dungeon();
8599 case 'h': /* Quests */
8600 do_cmd_knowledge_quests();
8602 case 'i': /* Autopick */
8603 do_cmd_knowledge_autopick();
8605 default: /* Unknown option */
8609 /* Flush messages */
8613 /* Restore the screen */
8616 if (need_redraw) do_cmd_redraw();
8621 * Check on the status of an active quest
8623 void do_cmd_checkquest(void)
8625 /* File type is "TEXT" */
8626 FILE_TYPE(FILE_TYPE_TEXT);
8628 /* Save the screen */
8632 do_cmd_knowledge_quests();
8634 /* Restore the screen */
8640 * Display the time and date
8642 void do_cmd_time(void)
8644 int day, hour, min, full, start, end, num;
8652 extract_day_hour_min(&day, &hour, &min);
8654 full = hour * 100 + min;
8661 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8663 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8664 else strcpy(day_buf, "*****");
8667 msg_format("%s日目, 時刻は%d:%02d %sです。",
8668 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8669 min, (hour < 12) ? "AM" : "PM");
8671 msg_format("This is day %s. The time is %d:%02d %s.",
8672 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8673 min, (hour < 12) ? "AM" : "PM");
8678 if (!randint0(10) || p_ptr->image)
8680 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8684 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8687 /* Open this file */
8688 fff = my_fopen(buf, "rt");
8692 /* Find this time */
8693 while (!my_fgets(fff, buf, sizeof(buf)))
8695 /* Ignore comments */
8696 if (!buf[0] || (buf[0] == '#')) continue;
8698 /* Ignore invalid lines */
8699 if (buf[1] != ':') continue;
8701 /* Process 'Start' */
8704 /* Extract the starting time */
8705 start = atoi(buf + 2);
8707 /* Assume valid for an hour */
8717 /* Extract the ending time */
8718 end = atoi(buf + 2);
8724 /* Ignore incorrect range */
8725 if ((start > full) || (full > end)) continue;
8727 /* Process 'Description' */
8732 /* Apply the randomizer */
8733 if (!randint0(num)) strcpy(desc, buf + 2);
8742 /* Close the file */