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);
922 if (i == ESCAPE) break;
936 do_cmd_erase_nikki();
940 prepare_movie_hooks();
942 default: /* Unknown option */
950 /* Restore the screen */
955 * @brief 画面を再描画するコマンドのメインルーチン
956 * Hack -- redraw the screen
960 * This command performs various low level updates, clears all the "extra"
961 * windows, does a total redraw of the main window, and requests all of the
962 * interesting updates and redraws that I can think of.
964 * This command is also used to "instantiate" the results of the user
965 * selecting various things, such as graphics mode, so it must call
966 * the "TERM_XTRA_REACT" hook before redrawing the windows.
969 void do_cmd_redraw(void)
976 /* Hack -- react to changes */
977 Term_xtra(TERM_XTRA_REACT, 0);
980 /* Combine and Reorder the pack (later) */
981 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
985 p_ptr->update |= (PU_TORCH);
988 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
990 /* Forget lite/view */
991 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
993 /* Update lite/view */
994 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
996 /* Update monsters */
997 p_ptr->update |= (PU_MONSTERS);
999 /* Redraw everything */
1000 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1003 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1006 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1010 /* Hack -- update */
1013 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1016 /* Redraw every window */
1017 for (j = 0; j < 8; j++)
1020 if (!angband_term[j]) continue;
1023 Term_activate(angband_term[j]);
1038 * @brief 名前を変更するコマンドのメインルーチン
1039 * Hack -- change name
1042 void do_cmd_change_name(void)
1051 /* Save the screen */
1059 /* Display the player */
1060 display_player(mode);
1065 display_player(mode);
1070 Term_putstr(2, 23, -1, TERM_WHITE,
1071 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1073 Term_putstr(2, 23, -1, TERM_WHITE,
1074 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1082 if (c == ESCAPE) break;
1089 /* Process the player name */
1090 process_player_name(FALSE);
1096 sprintf(tmp, "%s.txt", player_base);
1097 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1099 if (tmp[0] && (tmp[0] != ' '))
1101 file_character(tmp);
1118 /* Flush messages */
1122 /* Restore the screen */
1125 /* Redraw everything */
1126 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1133 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1134 * Recall the most recent message
1137 void do_cmd_message_one(void)
1139 /* Recall one message XXX XXX XXX */
1140 prt(format("> %s", message_str(0)), 0, 0);
1145 * @brief メッセージのログを表示するコマンドのメインルーチン
1146 * Recall the most recent message
1150 * Show previous messages to the user -BEN-
1152 * The screen format uses line 0 and 23 for headers and prompts,
1153 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1155 * This command shows you which commands you are viewing, and allows
1156 * you to "search" for strings in the recall.
1158 * Note that messages may be longer than 80 characters, but they are
1159 * displayed using "infinite" length, with a special sub-command to
1160 * "slide" the virtual display to the left or right.
1162 * Attempt to only hilite the matching portions of the string.
1165 void do_cmd_messages(int num_now)
1169 char shower_str[81];
1170 char finder_str[81];
1177 Term_get_size(&wid, &hgt);
1179 /* Number of message lines in a screen */
1180 num_lines = hgt - 4;
1183 strcpy(finder_str, "");
1186 strcpy(shower_str, "");
1188 /* Total messages */
1191 /* Start on first message */
1194 /* Save the screen */
1200 /* Process requests until done */
1206 /* Dump up to 20 lines of messages */
1207 for (j = 0; (j < num_lines) && (i + j < n); j++)
1209 cptr msg = message_str(i+j);
1211 /* Dump the messages, bottom to top */
1212 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1214 /* Hilite "shower" */
1215 if (shower && shower[0])
1219 /* Display matches */
1220 while ((str = my_strstr(str, shower)) != NULL)
1222 int len = strlen(shower);
1224 /* Display the match */
1225 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1233 /* Erase remaining lines */
1234 for (; j < num_lines; j++)
1236 Term_erase(0, num_lines + 1 - j, 255);
1239 /* Display header XXX XXX XXX */
1241 prt(format(_("以前のメッセージ %d-%d 全部で(%d)", "Message Recall (%d-%d of %d)"),
1242 i, i + j - 1, n), 0, 0);
1244 /* Display prompt (not very informative) */
1245 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1246 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1249 skey = inkey_special(TRUE);
1251 /* Exit on Escape */
1252 if (skey == ESCAPE) break;
1254 /* Hack -- Save the old index */
1259 /* Hack -- handle show */
1262 prt(_("強調: ", "Show: "), hgt - 1, 0);
1264 /* Get a "shower" string, or continue */
1265 strcpy(back_str, shower_str);
1266 if (askfor(shower_str, 80))
1269 shower = shower_str[0] ? shower_str : NULL;
1271 else strcpy(shower_str, back_str);
1276 /* Hack -- handle find */
1283 prt(_("検索: ", "Find: "), hgt - 1, 0);
1285 /* Get a "finder" string, or continue */
1286 strcpy(back_str, finder_str);
1287 if (!askfor(finder_str, 80))
1289 strcpy(finder_str, back_str);
1292 else if (!finder_str[0])
1294 shower = NULL; /* Stop showing */
1299 shower = finder_str;
1302 for (z = i + 1; z < n; z++)
1304 cptr msg = message_str(z);
1307 if (my_strstr(msg, finder_str))
1319 /* Recall 1 older message */
1321 /* Go to the oldest line */
1325 /* Recall 1 newer message */
1327 /* Go to the newest line */
1331 /* Recall 1 older message */
1336 /* Go older if legal */
1337 i = MIN(i + 1, n - num_lines);
1340 /* Recall 10 older messages */
1342 /* Go older if legal */
1343 i = MIN(i + 10, n - num_lines);
1346 /* Recall 20 older messages */
1351 /* Go older if legal */
1352 i = MIN(i + num_lines, n - num_lines);
1355 /* Recall 20 newer messages */
1359 /* Go newer (if able) */
1360 i = MAX(0, i - num_lines);
1363 /* Recall 10 newer messages */
1365 /* Go newer (if able) */
1369 /* Recall 1 newer messages */
1372 /* Go newer (if able) */
1377 /* Hack -- Error of some kind */
1381 /* Restore the screen */
1387 * @brief チートオプションを変更するコマンドのメインルーチン
1388 * Interact with some options for cheating
1389 * @param info 表示メッセージ
1392 static void do_cmd_options_cheat(cptr info)
1395 int i, k = 0, n = CHEAT_MAX;
1401 /* Interact with the player */
1406 /* Prompt XXX XXX XXX */
1407 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1412 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1413 prt(" << 注意 >>", 11, 0);
1414 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1415 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1416 prt(" じらないようにして下さい。", 14, 0);
1418 /* Display the options */
1419 for (i = 0; i < n; i++)
1421 byte a = TERM_WHITE;
1423 /* Color current option */
1424 if (i == k) a = TERM_L_BLUE;
1426 /* Display the option text */
1427 sprintf(buf, "%-48s: %s (%s)",
1428 cheat_info[i].o_desc,
1429 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1430 cheat_info[i].o_text);
1431 c_prt(a, buf, i + 2, 0);
1434 /* Hilite current option */
1435 move_cursor(k + 2, 50);
1441 * HACK - Try to translate the key into a direction
1442 * to allow using the roguelike keys for navigation.
1444 dir = get_keymap_dir(ch);
1445 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1459 k = (n + k - 1) % n;
1477 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1478 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1479 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1480 (*cheat_info[k].o_var) = TRUE;
1489 (*cheat_info[k].o_var) = FALSE;
1496 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1497 /* Peruse the help file */
1498 (void)show_file(TRUE, buf, NULL, 0, 0);
1515 * @brief セーブ頻度ターンの次の値を返す
1516 * @param current 現在のセーブ頻度ターン値
1517 * @return 次のセーブ頻度ターン値
1519 static s16b toggle_frequency(s16b current)
1524 case 50: return 100;
1525 case 100: return 250;
1526 case 250: return 500;
1527 case 500: return 1000;
1528 case 1000: return 2500;
1529 case 2500: return 5000;
1530 case 5000: return 10000;
1531 case 10000: return 25000;
1538 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1539 * @param info 表示メッセージ
1542 static void do_cmd_options_autosave(cptr info)
1546 int i, k = 0, n = 2;
1554 /* Interact with the player */
1557 /* Prompt XXX XXX XXX */
1558 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1559 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1563 /* Display the options */
1564 for (i = 0; i < n; i++)
1566 byte a = TERM_WHITE;
1568 /* Color current option */
1569 if (i == k) a = TERM_L_BLUE;
1571 /* Display the option text */
1572 sprintf(buf, "%-48s: %s (%s)",
1573 autosave_info[i].o_desc,
1574 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1575 autosave_info[i].o_text);
1576 c_prt(a, buf, i + 2, 0);
1578 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1580 /* Hilite current option */
1581 move_cursor(k + 2, 50);
1597 k = (n + k - 1) % n;
1615 (*autosave_info[k].o_var) = TRUE;
1624 (*autosave_info[k].o_var) = FALSE;
1632 autosave_freq = toggle_frequency(autosave_freq);
1633 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1639 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1655 * @brief 標準オプションを変更するコマンドのサブルーチン /
1656 * Interact with some options
1657 * @param page オプションページ番号
1658 * @param info 表示メッセージ
1661 void do_cmd_options_aux(int page, cptr info)
1664 int i, k = 0, n = 0, l;
1667 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1668 (!p_ptr->wizard || !allow_debug_opts);
1671 /* Lookup the options */
1672 for (i = 0; i < 24; i++) opt[i] = 0;
1674 /* Scan the options */
1675 for (i = 0; option_info[i].o_desc; i++)
1677 /* Notice options on this "page" */
1678 if (option_info[i].o_page == page) opt[n++] = i;
1685 /* Interact with the player */
1690 /* Prompt XXX XXX XXX */
1691 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1692 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1695 /* HACK -- description for easy-auto-destroy options */
1696 if (page == OPT_PAGE_AUTODESTROY)
1697 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1698 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1700 /* Display the options */
1701 for (i = 0; i < n; i++)
1703 byte a = TERM_WHITE;
1705 /* Color current option */
1706 if (i == k) a = TERM_L_BLUE;
1708 /* Display the option text */
1709 sprintf(buf, "%-48s: %s (%.19s)",
1710 option_info[opt[i]].o_desc,
1711 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1712 option_info[opt[i]].o_text);
1713 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1714 else c_prt(a, buf, i + 2, 0);
1717 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1720 /* Hilite current option */
1721 move_cursor(k + 2 + l, 50);
1727 * HACK - Try to translate the key into a direction
1728 * to allow using the roguelike keys for navigation.
1730 dir = get_keymap_dir(ch);
1731 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1745 k = (n + k - 1) % n;
1762 if (browse_only) break;
1763 (*option_info[opt[k]].o_var) = TRUE;
1772 if (browse_only) break;
1773 (*option_info[opt[k]].o_var) = FALSE;
1781 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1787 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1788 /* Peruse the help file */
1789 (void)show_file(TRUE, buf, NULL, 0, 0);
1806 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1807 * Modify the "window" options
1810 static void do_cmd_options_win(void)
1820 /* Memorize old flags */
1821 for (j = 0; j < 8; j++)
1823 /* Acquire current flags */
1824 old_flag[j] = window_flag[j];
1834 /* Prompt XXX XXX XXX */
1835 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1837 /* Display the windows */
1838 for (j = 0; j < 8; j++)
1840 byte a = TERM_WHITE;
1842 cptr s = angband_term_name[j];
1845 if (j == x) a = TERM_L_BLUE;
1847 /* Window name, staggered, centered */
1848 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1851 /* Display the options */
1852 for (i = 0; i < 16; i++)
1854 byte a = TERM_WHITE;
1856 cptr str = window_flag_desc[i];
1859 if (i == y) a = TERM_L_BLUE;
1862 if (!str) str = _("(未使用)", "(Unused option)");
1865 Term_putstr(0, i + 5, -1, a, str);
1867 /* Display the windows */
1868 for (j = 0; j < 8; j++)
1874 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1877 if (window_flag[j] & (1L << i)) c = 'X';
1880 Term_putch(35 + j * 5, i + 5, a, c);
1885 Term_gotoxy(35 + x * 5, y + 5);
1903 for (j = 0; j < 8; j++)
1905 window_flag[j] &= ~(1L << y);
1909 for (i = 0; i < 16; i++)
1911 window_flag[x] &= ~(1L << i);
1924 window_flag[x] |= (1L << y);
1932 window_flag[x] &= ~(1L << y);
1938 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
1946 d = get_keymap_dir(ch);
1948 x = (x + ddx[d] + 8) % 8;
1949 y = (y + ddy[d] + 16) % 16;
1956 /* Notice changes */
1957 for (j = 0; j < 8; j++)
1962 if (!angband_term[j]) continue;
1964 /* Ignore non-changes */
1965 if (window_flag[j] == old_flag[j]) continue;
1968 Term_activate(angband_term[j]);
1991 option_fields[OPT_NUM] =
1994 { '1', " キー入力 オプション", 3 },
1995 { '2', " マップ画面 オプション", 4 },
1996 { '3', " テキスト表示 オプション", 5 },
1997 { '4', " ゲームプレイ オプション", 6 },
1998 { '5', " 行動中止関係 オプション", 7 },
1999 { '6', " 簡易自動破壊 オプション", 8 },
2000 { 'r', " プレイ記録 オプション", 9 },
2002 { 'p', "自動拾いエディタ", 11 },
2003 { 'd', " 基本ウェイト量 ", 12 },
2004 { 'h', "低ヒットポイント", 13 },
2005 { 'm', " 低魔力色閾値 ", 14 },
2006 { 'a', " 自動セーブ オプション", 15 },
2007 { 'w', "ウインドウフラグ", 16 },
2009 { 'b', " 初期 オプション (参照のみ)", 18 },
2010 { 'c', " 詐欺 オプション", 19 },
2012 { '1', "Input Options", 3 },
2013 { '2', "Map Screen Options", 4 },
2014 { '3', "Text Display Options", 5 },
2015 { '4', "Game-Play Options", 6 },
2016 { '5', "Disturbance Options", 7 },
2017 { '6', "Easy Auto-Destroyer Options", 8 },
2018 { 'r', "Play record Options", 9 },
2020 { 'p', "Auto-picker/destroyer editor", 11 },
2021 { 'd', "Base Delay Factor", 12 },
2022 { 'h', "Hitpoint Warning", 13 },
2023 { 'm', "Mana Color Threshold", 14 },
2024 { 'a', "Autosave Options", 15 },
2025 { 'w', "Window Flags", 16 },
2027 { 'b', "Birth Options (Browse Only)", 18 },
2028 { 'c', "Cheat Options", 19 },
2034 * @brief 標準オプションを変更するコマンドのメインルーチン /
2035 * Set or unset various options.
2039 * The user must use the "Ctrl-R" command to "adapt" to changes
2040 * in any options which control "visual" aspects of the game.
2043 void do_cmd_options(void)
2049 /* Save the screen */
2057 /* Does not list cheat option when cheat option is off */
2058 if (!p_ptr->noscore && !allow_debug_opts) n--;
2063 /* Why are we here */
2064 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2068 /* Give some choices */
2069 for (i = 0; i < n; i++)
2071 byte a = TERM_WHITE;
2072 if (i == y) a = TERM_L_BLUE;
2073 Term_putstr(5, option_fields[i].row, -1, a,
2074 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2077 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2080 skey = inkey_special(TRUE);
2081 if (!(skey & SKEY_MASK)) k = (char)skey;
2085 if (k == ESCAPE) break;
2087 if (my_strchr("\n\r ", k))
2089 k = option_fields[y].key;
2093 for (i = 0; i < n; i++)
2095 if (tolower(k) == option_fields[i].key) break;
2098 /* Command is found */
2101 /* Hack -- browse help */
2102 if (k == '?') break;
2106 if (skey == SKEY_UP) d = 8;
2107 if (skey == SKEY_DOWN) d = 2;
2108 y = (y + ddy[d] + n) % n;
2113 if (k == ESCAPE) break;
2120 /* Process the general options */
2121 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2127 /* Process the general options */
2128 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2135 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2142 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2149 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2156 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2160 /* Play-record Options */
2165 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2174 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2175 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2176 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2180 /* Cheating Options */
2183 if (!p_ptr->noscore && !allow_debug_opts)
2185 /* Cheat options are not permitted */
2191 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2198 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2207 do_cmd_options_win();
2208 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2209 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2210 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2211 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2216 /* Auto-picker/destroyer editor */
2220 do_cmd_edit_autopick();
2224 /* Hack -- Delay Speed */
2230 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2232 /* Get a new value */
2235 int msec = delay_factor * delay_factor * delay_factor;
2236 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2237 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2239 if (k == ESCAPE) break;
2242 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2245 else if (isdigit(k)) delay_factor = D2I(k);
2252 /* Hack -- hitpoint warning factor */
2258 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2260 /* Get a new value */
2263 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2264 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2266 if (k == ESCAPE) break;
2269 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2272 else if (isdigit(k)) hitpoint_warn = D2I(k);
2279 /* Hack -- mana color factor */
2285 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2287 /* Get a new value */
2290 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2291 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2293 if (k == ESCAPE) break;
2296 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2299 else if (isdigit(k)) mana_warn = D2I(k);
2307 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2311 /* Unknown option */
2320 /* Flush messages */
2325 /* Restore the screen */
2328 /* Hack - Redraw equippy chars */
2329 p_ptr->redraw |= (PR_EQUIPPY);
2335 * @brief prefファイルを選択して処理する /
2336 * Ask for a "user pref line" and process it
2339 * XXX XXX XXX Allow absolute file names?
2341 void do_cmd_pref(void)
2348 /* Ask for a "user pref command" */
2349 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2351 /* Process that pref command */
2352 (void)process_pref_file_command(buf);
2356 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2359 void do_cmd_reload_autopick(void)
2361 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2362 /* Load the file with messages */
2363 autopick_load_pref(TRUE);
2369 * @brief マクロ情報をprefファイルに保存する /
2370 * @param fname ファイル名
2373 static errr macro_dump(cptr fname)
2375 static cptr mark = "Macro Dump";
2381 /* Build the filename */
2382 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2384 /* File type is "TEXT" */
2385 FILE_TYPE(FILE_TYPE_TEXT);
2387 /* Append to the file */
2388 if (!open_auto_dump(buf, mark)) return (-1);
2391 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2394 for (i = 0; i < macro__num; i++)
2396 /* Extract the action */
2397 ascii_to_text(buf, macro__act[i]);
2399 /* Dump the macro */
2400 auto_dump_printf("A:%s\n", buf);
2402 /* Extract the action */
2403 ascii_to_text(buf, macro__pat[i]);
2405 /* Dump normal macros */
2406 auto_dump_printf("P:%s\n", buf);
2409 auto_dump_printf("\n");
2421 * @brief マクロのトリガーキーを取得する /
2422 * Hack -- ask for a "trigger" (see below)
2423 * @param buf キー表記を保管するバッファ
2427 * Note the complex use of the "inkey()" function from "util.c".
2429 * Note that both "flush()" calls are extremely important.
2432 static void do_cmd_macro_aux(char *buf)
2441 /* Do not process macros */
2447 /* Read the pattern */
2453 /* Do not process macros */
2456 /* Do not wait for keys */
2459 /* Attempt to read a key */
2470 /* Convert the trigger */
2471 ascii_to_text(tmp, buf);
2473 /* Hack -- display the trigger */
2474 Term_addstr(-1, TERM_WHITE, tmp);
2480 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2481 * Hack -- ask for a keymap "trigger" (see below)
2482 * @param buf キー表記を取得するバッファ
2486 * Note that both "flush()" calls are extremely important. This may
2487 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2490 static void do_cmd_macro_aux_keymap(char *buf)
2504 /* Convert to ascii */
2505 ascii_to_text(tmp, buf);
2507 /* Hack -- display the trigger */
2508 Term_addstr(-1, TERM_WHITE, tmp);
2517 * @brief キーマップをprefファイルにダンプする /
2518 * Hack -- append all keymaps to the given file
2519 * @param fname ファイルネーム
2523 static errr keymap_dump(cptr fname)
2525 static cptr mark = "Keymap Dump";
2534 if (rogue_like_commands)
2536 mode = KEYMAP_MODE_ROGUE;
2542 mode = KEYMAP_MODE_ORIG;
2546 /* Build the filename */
2547 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2549 /* File type is "TEXT" */
2550 FILE_TYPE(FILE_TYPE_TEXT);
2552 /* Append to the file */
2553 if (!open_auto_dump(buf, mark)) return -1;
2556 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2559 for (i = 0; i < 256; i++)
2563 /* Loop up the keymap */
2564 act = keymap_act[mode][i];
2566 /* Skip empty keymaps */
2569 /* Encode the key */
2572 ascii_to_text(key, buf);
2574 /* Encode the action */
2575 ascii_to_text(buf, act);
2577 /* Dump the macro */
2578 auto_dump_printf("A:%s\n", buf);
2579 auto_dump_printf("C:%d:%s\n", mode, key);
2591 * @brief マクロを設定するコマンドのメインルーチン /
2592 * Interact with "macros"
2596 * Note that the macro "action" must be defined before the trigger.
2598 * Could use some helpful instructions on this page. XXX XXX XXX
2601 void do_cmd_macros(void)
2613 if (rogue_like_commands)
2615 mode = KEYMAP_MODE_ROGUE;
2621 mode = KEYMAP_MODE_ORIG;
2624 /* File type is "TEXT" */
2625 FILE_TYPE(FILE_TYPE_TEXT);
2632 /* Process requests until done */
2639 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2641 /* Describe that action */
2642 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2644 /* Analyze the current action */
2645 ascii_to_text(buf, macro__buf);
2647 /* Display the current action */
2652 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2654 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2655 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2656 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2657 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2658 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2659 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2660 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2661 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2662 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2663 #endif /* ALLOW_MACROS */
2666 prt(_("コマンド: ", "Command: "), 16, 0);
2672 if (i == ESCAPE) break;
2674 /* Load a 'macro' file */
2680 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2683 prt(_("ファイル: ", "File: "), 18, 0);
2685 /* Default filename */
2686 sprintf(tmp, "%s.prf", player_base);
2688 /* Ask for a file */
2689 if (!askfor(tmp, 80)) continue;
2691 /* Process the given filename */
2692 err = process_pref_file(tmp);
2695 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2700 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2704 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2714 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2717 prt(_("ファイル: ", "File: "), 18, 0);
2719 /* Default filename */
2720 sprintf(tmp, "%s.prf", player_base);
2722 /* Ask for a file */
2723 if (!askfor(tmp, 80)) continue;
2725 /* Dump the macros */
2726 (void)macro_dump(tmp);
2729 msg_print(_("マクロを追加しました。", "Appended macros."));
2738 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2742 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2744 /* Get a macro trigger */
2745 do_cmd_macro_aux(buf);
2747 /* Acquire action */
2748 k = macro_find_exact(buf);
2754 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2760 /* Obtain the action */
2761 strcpy(macro__buf, macro__act[k]);
2763 /* Analyze the current action */
2764 ascii_to_text(buf, macro__buf);
2766 /* Display the current action */
2770 msg_print(_("マクロを確認しました。", "Found a macro."));
2774 /* Create a macro */
2778 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2781 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2783 /* Get a macro trigger */
2784 do_cmd_macro_aux(buf);
2790 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2791 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2794 prt(_("マクロ行動: ", "Action: "), 20, 0);
2796 /* Convert to text */
2797 ascii_to_text(tmp, macro__buf);
2799 /* Get an encoded action */
2800 if (askfor(tmp, 80))
2802 /* Convert to ascii */
2803 text_to_ascii(macro__buf, tmp);
2805 /* Link the macro */
2806 macro_add(buf, macro__buf);
2809 msg_print(_("マクロを追加しました。", "Added a macro."));
2813 /* Remove a macro */
2817 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2820 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2822 /* Get a macro trigger */
2823 do_cmd_macro_aux(buf);
2825 /* Link the macro */
2826 macro_add(buf, buf);
2829 msg_print(_("マクロを削除しました。", "Removed a macro."));
2836 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2839 prt(_("ファイル: ", "File: "), 18, 0);
2841 /* Default filename */
2842 sprintf(tmp, "%s.prf", player_base);
2844 /* Ask for a file */
2845 if (!askfor(tmp, 80)) continue;
2847 /* Dump the macros */
2848 (void)keymap_dump(tmp);
2851 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2854 /* Query a keymap */
2860 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2863 prt(_("押すキー: ", "Keypress: "), 18, 0);
2865 /* Get a keymap trigger */
2866 do_cmd_macro_aux_keymap(buf);
2868 /* Look up the keymap */
2869 act = keymap_act[mode][(byte)(buf[0])];
2875 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2881 /* Obtain the action */
2882 strcpy(macro__buf, act);
2884 /* Analyze the current action */
2885 ascii_to_text(buf, macro__buf);
2887 /* Display the current action */
2891 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2895 /* Create a keymap */
2899 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2902 prt(_("押すキー: ", "Keypress: "), 18, 0);
2904 /* Get a keymap trigger */
2905 do_cmd_macro_aux_keymap(buf);
2911 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2912 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2915 prt(_("行動: ", "Action: "), 20, 0);
2917 /* Convert to text */
2918 ascii_to_text(tmp, macro__buf);
2920 /* Get an encoded action */
2921 if (askfor(tmp, 80))
2923 /* Convert to ascii */
2924 text_to_ascii(macro__buf, tmp);
2926 /* Free old keymap */
2927 string_free(keymap_act[mode][(byte)(buf[0])]);
2929 /* Make new keymap */
2930 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2933 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2937 /* Remove a keymap */
2941 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
2944 prt(_("押すキー: ", "Keypress: "), 18, 0);
2946 /* Get a keymap trigger */
2947 do_cmd_macro_aux_keymap(buf);
2949 /* Free old keymap */
2950 string_free(keymap_act[mode][(byte)(buf[0])]);
2952 /* Make new keymap */
2953 keymap_act[mode][(byte)(buf[0])] = NULL;
2956 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
2959 /* Enter a new action */
2963 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
2969 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2970 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2973 prt(_("マクロ行動: ", "Action: "), 20, 0);
2975 /* Hack -- limit the value */
2978 /* Get an encoded action */
2979 if (!askfor(buf, 80)) continue;
2981 /* Extract an action */
2982 text_to_ascii(macro__buf, buf);
2985 #endif /* ALLOW_MACROS */
2994 /* Flush messages */
3003 * @brief キャラクタ色の明暗表現
3005 static cptr lighting_level_str[F_LIT_MAX] =
3020 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
3021 * @param i 指定対象となるキャラクタコード
3022 * @param num 指定されたビジュアルIDを返す参照ポインタ
3023 * @param max ビジュアルIDの最大数
3024 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
3026 static bool cmd_visuals_aux(int i, IDX *num, IDX max)
3033 sprintf(str, "%d", *num);
3035 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3038 tmp = (IDX)strtol(str, NULL, 0);
3039 if (tmp >= 0 && tmp < max)
3042 else if (isupper(i))
3043 *num = (*num + max - 1) % max;
3045 *num = (*num + 1) % max;
3051 * @brief キャラクタの変更メニュー表示
3052 * @param choice_msg 選択メッセージ
3055 static void print_visuals_menu(cptr choice_msg)
3057 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3059 /* Give some choices */
3060 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3062 #ifdef ALLOW_VISUALS
3063 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3064 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3065 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3066 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3067 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3068 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3069 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3070 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3071 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3072 #endif /* ALLOW_VISUALS */
3074 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3077 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3080 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx);
3081 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx);
3082 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level);
3085 * Interact with "visuals"
3087 void do_cmd_visuals(void)
3092 bool need_redraw = FALSE;
3093 const char *empty_symbol = "<< ? >>";
3095 if (use_bigtile) empty_symbol = "<< ?? >>";
3097 /* File type is "TEXT" */
3098 FILE_TYPE(FILE_TYPE_TEXT);
3100 /* Save the screen */
3103 /* Interact until done */
3109 /* Ask for a choice */
3110 print_visuals_menu(NULL);
3116 if (i == ESCAPE) break;
3120 /* Load a 'pref' file */
3123 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3126 prt(_("ファイル: ", "File: "), 17, 0);
3128 /* Default filename */
3129 sprintf(tmp, "%s.prf", player_base);
3132 if (!askfor(tmp, 70)) continue;
3134 /* Process the given filename */
3135 (void)process_pref_file(tmp);
3140 #ifdef ALLOW_VISUALS
3142 /* Dump monster attr/chars */
3145 static cptr mark = "Monster attr/chars";
3148 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3151 prt(_("ファイル: ", "File: "), 17, 0);
3153 /* Default filename */
3154 sprintf(tmp, "%s.prf", player_base);
3156 /* Get a filename */
3157 if (!askfor(tmp, 70)) continue;
3159 /* Build the filename */
3160 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3162 /* Append to the file */
3163 if (!open_auto_dump(buf, mark)) continue;
3166 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3169 for (i = 0; i < max_r_idx; i++)
3171 monster_race *r_ptr = &r_info[i];
3173 /* Skip non-entries */
3174 if (!r_ptr->name) continue;
3176 /* Dump a comment */
3177 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3179 /* Dump the monster attr/char info */
3180 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3181 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3188 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3193 /* Dump object attr/chars */
3196 static cptr mark = "Object attr/chars";
3200 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3203 prt(_("ファイル: ", "File: "), 17, 0);
3205 /* Default filename */
3206 sprintf(tmp, "%s.prf", player_base);
3208 /* Get a filename */
3209 if (!askfor(tmp, 70)) continue;
3211 /* Build the filename */
3212 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3214 /* Append to the file */
3215 if (!open_auto_dump(buf, mark)) continue;
3218 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3221 for (k_idx = 0; k_idx < max_k_idx; k_idx++)
3224 object_kind *k_ptr = &k_info[k_idx];
3226 /* Skip non-entries */
3227 if (!k_ptr->name) continue;
3232 strip_name(o_name, k_idx);
3238 /* Prepare dummy object */
3239 object_prep(&forge, k_idx);
3241 /* Get un-shuffled flavor name */
3242 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3245 /* Dump a comment */
3246 auto_dump_printf("# %s\n", o_name);
3248 /* Dump the object attr/char info */
3249 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", (int)k_idx,
3250 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3257 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3262 /* Dump feature attr/chars */
3265 static cptr mark = "Feature attr/chars";
3268 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3271 prt(_("ファイル: ", "File: "), 17, 0);
3273 /* Default filename */
3274 sprintf(tmp, "%s.prf", player_base);
3276 /* Get a filename */
3277 if (!askfor(tmp, 70)) continue;
3279 /* Build the filename */
3280 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3282 /* Append to the file */
3283 if (!open_auto_dump(buf, mark)) continue;
3286 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3289 for (i = 0; i < max_f_idx; i++)
3291 feature_type *f_ptr = &f_info[i];
3293 /* Skip non-entries */
3294 if (!f_ptr->name) continue;
3296 /* Skip mimiccing features */
3297 if (f_ptr->mimic != i) continue;
3299 /* Dump a comment */
3300 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3302 /* Dump the feature attr/char info */
3303 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3304 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3305 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3306 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3313 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3318 /* Modify monster attr/chars (numeric operation) */
3321 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3324 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3326 /* Hack -- query until done */
3329 monster_race *r_ptr = &r_info[r];
3333 TERM_COLOR da = r_ptr->d_attr;
3334 byte dc = r_ptr->d_char;
3335 TERM_COLOR ca = r_ptr->x_attr;
3336 byte cc = r_ptr->x_char;
3338 /* Label the object */
3339 Term_putstr(5, 17, -1, TERM_WHITE,
3340 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3342 /* Label the Default values */
3343 Term_putstr(10, 19, -1, TERM_WHITE,
3344 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3346 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3347 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3349 /* Label the Current values */
3350 Term_putstr(10, 20, -1, TERM_WHITE,
3351 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3353 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3354 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3357 Term_putstr(0, 22, -1, TERM_WHITE,
3358 _("コマンド (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): "));
3364 if (i == ESCAPE) break;
3366 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3367 else if (isupper(i)) c = 'a' + i - 'A';
3377 if (!cmd_visuals_aux(i, &r, max_r_idx))
3383 while (!r_info[r].name);
3387 t = (int)r_ptr->x_attr;
3388 (void)cmd_visuals_aux(i, &t, 256);
3389 r_ptr->x_attr = (byte)t;
3393 t = (int)r_ptr->x_char;
3394 (void)cmd_visuals_aux(i, &t, 256);
3395 r_ptr->x_char = (byte)t;
3399 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3403 print_visuals_menu(choice_msg);
3411 /* Modify object attr/chars (numeric operation) */
3414 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3416 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3418 /* Hack -- query until done */
3421 object_kind *k_ptr = &k_info[k];
3425 TERM_COLOR da = k_ptr->d_attr;
3426 SYMBOL_CODE dc = k_ptr->d_char;
3427 TERM_COLOR ca = k_ptr->x_attr;
3428 SYMBOL_CODE cc = k_ptr->x_char;
3430 /* Label the object */
3431 Term_putstr(5, 17, -1, TERM_WHITE,
3432 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3433 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3435 /* Label the Default values */
3436 Term_putstr(10, 19, -1, TERM_WHITE,
3437 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3439 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3440 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3442 /* Label the Current values */
3443 Term_putstr(10, 20, -1, TERM_WHITE,
3444 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3446 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3447 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3450 Term_putstr(0, 22, -1, TERM_WHITE,
3451 _("コマンド (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): "));
3457 if (i == ESCAPE) break;
3459 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3460 else if (isupper(i)) c = 'a' + i - 'A';
3470 if (!cmd_visuals_aux(i, &k, max_k_idx))
3476 while (!k_info[k].name);
3480 t = (int)k_ptr->x_attr;
3481 (void)cmd_visuals_aux(i, &t, 256);
3482 k_ptr->x_attr = (byte)t;
3486 t = (int)k_ptr->x_char;
3487 (void)cmd_visuals_aux(i, &t, 256);
3488 k_ptr->x_char = (byte)t;
3492 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3496 print_visuals_menu(choice_msg);
3504 /* Modify feature attr/chars (numeric operation) */
3507 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3509 static IDX lighting_level = F_LIT_STANDARD;
3510 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3512 /* Hack -- query until done */
3515 feature_type *f_ptr = &f_info[f];
3519 TERM_COLOR da = f_ptr->d_attr[lighting_level];
3520 byte dc = f_ptr->d_char[lighting_level];
3521 TERM_COLOR ca = f_ptr->x_attr[lighting_level];
3522 byte cc = f_ptr->x_char[lighting_level];
3524 /* Label the object */
3526 Term_putstr(5, 17, -1, TERM_WHITE,
3527 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3528 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3530 /* Label the Default values */
3531 Term_putstr(10, 19, -1, TERM_WHITE,
3532 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3534 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3535 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3537 /* Label the Current values */
3539 Term_putstr(10, 20, -1, TERM_WHITE,
3540 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3542 Term_putstr(10, 20, -1, TERM_WHITE,
3543 format("Current attr/char = %3d / %3d", ca, cc));
3546 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3547 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3551 Term_putstr(0, 22, -1, TERM_WHITE,
3552 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3554 Term_putstr(0, 22, -1, TERM_WHITE,
3555 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3562 if (i == ESCAPE) break;
3564 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3565 else if (isupper(i)) c = 'a' + i - 'A';
3575 if (!cmd_visuals_aux(i, &f, max_f_idx))
3581 while (!f_info[f].name || (f_info[f].mimic != f));
3585 t = (int)f_ptr->x_attr[lighting_level];
3586 (void)cmd_visuals_aux(i, &t, 256);
3587 f_ptr->x_attr[lighting_level] = (byte)t;
3591 t = (int)f_ptr->x_char[lighting_level];
3592 (void)cmd_visuals_aux(i, &t, 256);
3593 f_ptr->x_char[lighting_level] = (byte)t;
3597 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3600 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3604 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3608 print_visuals_menu(choice_msg);
3616 /* Modify monster attr/chars (visual mode) */
3618 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3621 /* Modify object attr/chars (visual mode) */
3623 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3626 /* Modify feature attr/chars (visual mode) */
3629 IDX lighting_level = F_LIT_STANDARD;
3630 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3634 #endif /* ALLOW_VISUALS */
3643 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3647 /* Unknown option */
3653 /* Flush messages */
3657 /* Restore the screen */
3660 if (need_redraw) do_cmd_redraw();
3665 * Interact with "colors"
3667 void do_cmd_colors(void)
3676 /* File type is "TEXT" */
3677 FILE_TYPE(FILE_TYPE_TEXT);
3680 /* Save the screen */
3684 /* Interact until done */
3690 /* Ask for a choice */
3691 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3693 /* Give some choices */
3694 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3697 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3698 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3702 prt(_("コマンド: ", "Command: "), 8, 0);
3707 if (i == ESCAPE) break;
3709 /* Load a 'pref' file */
3713 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3716 prt(_("ファイル: ", "File: "), 10, 0);
3719 sprintf(tmp, "%s.prf", player_base);
3722 if (!askfor(tmp, 70)) continue;
3724 /* Process the given filename */
3725 (void)process_pref_file(tmp);
3727 /* Mega-Hack -- react to changes */
3728 Term_xtra(TERM_XTRA_REACT, 0);
3730 /* Mega-Hack -- redraw */
3739 static cptr mark = "Colors";
3742 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3745 prt(_("ファイル: ", "File: "), 10, 0);
3747 /* Default filename */
3748 sprintf(tmp, "%s.prf", player_base);
3750 /* Get a filename */
3751 if (!askfor(tmp, 70)) continue;
3753 /* Build the filename */
3754 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3756 /* Append to the file */
3757 if (!open_auto_dump(buf, mark)) continue;
3760 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3763 for (i = 0; i < 256; i++)
3765 int kv = angband_color_table[i][0];
3766 int rv = angband_color_table[i][1];
3767 int gv = angband_color_table[i][2];
3768 int bv = angband_color_table[i][3];
3770 cptr name = _("未知", "unknown");
3772 /* Skip non-entries */
3773 if (!kv && !rv && !gv && !bv) continue;
3775 /* Extract the color name */
3776 if (i < 16) name = color_names[i];
3778 /* Dump a comment */
3779 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3781 /* Dump the monster attr/char info */
3782 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3790 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3799 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3801 /* Hack -- query until done */
3810 /* Exhibit the normal colors */
3811 for (j = 0; j < 16; j++)
3813 /* Exhibit this color */
3814 Term_putstr(j*4, 20, -1, a, "###");
3816 /* Exhibit all colors */
3817 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3820 /* Describe the color */
3821 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3823 /* Describe the color */
3824 Term_putstr(5, 10, -1, TERM_WHITE,
3825 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3827 /* Label the Current values */
3828 Term_putstr(5, 12, -1, TERM_WHITE,
3829 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3830 angband_color_table[a][0],
3831 angband_color_table[a][1],
3832 angband_color_table[a][2],
3833 angband_color_table[a][3]));
3836 Term_putstr(0, 14, -1, TERM_WHITE,
3837 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3844 if (i == ESCAPE) break;
3847 if (i == 'n') a = (byte)(a + 1);
3848 if (i == 'N') a = (byte)(a - 1);
3849 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3850 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3851 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3852 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3853 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3854 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3855 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3856 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3858 /* Hack -- react to changes */
3859 Term_xtra(TERM_XTRA_REACT, 0);
3861 /* Hack -- redraw */
3868 /* Unknown option */
3874 /* Flush messages */
3879 /* Restore the screen */
3885 * Note something in the message recall
3887 void do_cmd_note(void)
3895 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3897 /* Ignore empty notes */
3898 if (!buf[0] || (buf[0] == ' ')) return;
3900 /* Add the note to the message recall */
3901 msg_format(_("メモ: %s", "Note: %s"), buf);
3906 * Mention the current version
3908 void do_cmd_version(void)
3912 #if FAKE_VER_EXTRA > 0
3913 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3914 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3916 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3917 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3924 * Array of feeling strings
3926 static cptr do_cmd_feeling_text[11] =
3928 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3929 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3930 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3931 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3932 _("とても悪い予感がする...", "You have a very bad feeling..."),
3933 _("悪い予感がする...", "You have a bad feeling..."),
3934 _("何か緊張する。", "You feel nervous."),
3935 _("少し不運な気がする...", "You feel your luck is turning..."),
3936 _("この場所は好きになれない。", "You don't like the look of this place."),
3937 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3938 _("なんて退屈なところだ...", "What a boring place...")
3941 static cptr do_cmd_feeling_text_combat[11] =
3943 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3944 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3945 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
3946 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3947 _("とても悪い予感がする...", "You have a very bad feeling..."),
3948 _("悪い予感がする...", "You have a bad feeling..."),
3949 _("何か緊張する。", "You feel nervous."),
3950 _("少し不運な気がする...", "You feel your luck is turning..."),
3951 _("この場所は好きになれない。", "You don't like the look of this place."),
3952 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3953 _("なんて退屈なところだ...", "What a boring place...")
3956 static cptr do_cmd_feeling_text_lucky[11] =
3958 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3959 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3960 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
3961 _("素晴らしい感じがする...", "You have an excellent feeling..."),
3962 _("とても良い感じがする...", "You have a very good feeling..."),
3963 _("良い感じがする...", "You have a good feeling..."),
3964 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
3965 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
3966 _("見た感じ悪くはない...", "You like the look of this place..."),
3967 _("全然駄目ということはないが...", "This level can't be all bad..."),
3968 _("なんて退屈なところだ...", "What a boring place...")
3973 * Note that "feeling" is set to zero unless some time has passed.
3974 * Note that this is done when the level is GENERATED, not entered.
3976 void do_cmd_feeling(void)
3978 /* No useful feeling in quests */
3979 if (p_ptr->inside_quest && !random_quest_number(dun_level))
3981 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
3985 /* No useful feeling in town */
3986 else if (p_ptr->town_num && !dun_level)
3988 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
3990 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
3995 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
4000 /* No useful feeling in the wilderness */
4001 else if (!dun_level)
4003 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
4007 /* Display the feeling */
4008 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4009 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
4010 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
4011 inventory[INVEN_BOW].name1 == ART_CRIMSON)
4012 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
4014 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4020 * Description of each monster group.
4022 static cptr monster_group_text[] =
4025 "ユニーク", /* "Uniques" */
4026 "乗馬可能なモンスター", /* "Riding" */
4027 "賞金首", /* "Wanted */
4028 "アンバーの王族", /* "Ambertite" */
4057 /* "古代ドラゴン/ワイアーム", */
4118 /* "Ancient Dragon/Wyrm", */
4127 "Multi-Headed Reptile",
4132 "Reptile/Amphibian",
4133 "Spider/Scorpion/Tick",
4135 /* "Major Demon", */
4152 * Symbols of monsters in each group. Note the "Uniques" group
4153 * is handled differently.
4155 static cptr monster_group_char[] =
4212 "!$&()+./=>?[\\]`{|~",
4222 * hook function to sort monsters by level
4224 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4226 u16b *who = (u16b*)(u);
4231 monster_race *r_ptr1 = &r_info[w1];
4232 monster_race *r_ptr2 = &r_info[w2];
4237 if (r_ptr2->level > r_ptr1->level) return TRUE;
4238 if (r_ptr1->level > r_ptr2->level) return FALSE;
4240 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4241 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4246 * Build a list of monster indexes in the given group. Return the number
4247 * of monsters in the group.
4249 * mode & 0x01 : check for non-empty group
4250 * mode & 0x02 : visual operation only
4252 static IDX collect_monsters(IDX grp_cur, IDX mon_idx[], BIT_FLAGS8 mode)
4258 /* Get a list of x_char in this group */
4259 cptr group_char = monster_group_char[grp_cur];
4261 /* XXX Hack -- Check if this is the "Uniques" group */
4262 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4264 /* XXX Hack -- Check if this is the "Riding" group */
4265 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4267 /* XXX Hack -- Check if this is the "Wanted" group */
4268 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4270 /* XXX Hack -- Check if this is the "Amberite" group */
4271 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4274 /* Check every race */
4275 for (i = 0; i < max_r_idx; i++)
4277 /* Access the race */
4278 monster_race *r_ptr = &r_info[i];
4280 /* Skip empty race */
4281 if (!r_ptr->name) continue ;
4283 /* Require known monsters */
4284 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4288 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4291 else if (grp_riding)
4293 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4296 else if (grp_wanted)
4298 bool wanted = FALSE;
4300 for (j = 0; j < MAX_KUBI; j++)
4302 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4303 (p_ptr->today_mon && p_ptr->today_mon == i))
4309 if (!wanted) continue;
4312 else if (grp_amberite)
4314 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4319 /* Check for race in the group */
4320 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4324 mon_idx[mon_cnt++] = i;
4326 /* XXX Hack -- Just checking for non-empty group */
4327 if (mode & 0x01) break;
4330 /* Terminate the list */
4331 mon_idx[mon_cnt] = -1;
4333 /* Select the sort method */
4334 ang_sort_comp = ang_sort_comp_monster_level;
4335 ang_sort_swap = ang_sort_swap_hook;
4337 /* Sort by monster level */
4338 ang_sort(mon_idx, &dummy_why, mon_cnt);
4340 /* Return the number of races */
4346 * Description of each monster group.
4348 static cptr object_group_text[] =
4351 "キノコ", /* "Mushrooms" */
4352 "薬", /* "Potions" */
4353 "油つぼ", /* "Flasks" */
4354 "巻物", /* "Scrolls" */
4356 "アミュレット", /* "Amulets" */
4357 "笛", /* "Whistle" */
4358 "光源", /* "Lanterns" */
4359 "魔法棒", /* "Wands" */
4362 "カード", /* "Cards" */
4373 "刀剣類", /* "Swords" */
4374 "鈍器", /* "Blunt Weapons" */
4375 "長柄武器", /* "Polearms" */
4376 "採掘道具", /* "Diggers" */
4377 "飛び道具", /* "Bows" */
4381 "軽装鎧", /* "Soft Armor" */
4382 "重装鎧", /* "Hard Armor" */
4383 "ドラゴン鎧", /* "Dragon Armor" */
4384 "盾", /* "Shields" */
4385 "クローク", /* "Cloaks" */
4386 "籠手", /* "Gloves" */
4387 "ヘルメット", /* "Helms" */
4389 "ブーツ", /* "Boots" */
4442 * TVALs of items in each group
4444 static byte object_group_tval[] =
4485 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4493 * Build a list of object indexes in the given group. Return the number
4494 * of objects in the group.
4496 * mode & 0x01 : check for non-empty group
4497 * mode & 0x02 : visual operation only
4499 static int collect_objects(int grp_cur, IDX object_idx[], BIT_FLAGS8 mode)
4502 int j, k, object_cnt = 0;
4504 /* Get a list of x_char in this group */
4505 byte group_tval = object_group_tval[grp_cur];
4507 /* Check every object */
4508 for (i = 0; i < max_k_idx; i++)
4510 /* Access the object */
4511 object_kind *k_ptr = &k_info[i];
4513 /* Skip empty objects */
4514 if (!k_ptr->name) continue;
4518 /* Any objects will be displayed */
4524 /* Skip non-flavoured objects */
4525 if (!k_ptr->flavor) continue;
4527 /* Require objects ever seen */
4528 if (!k_ptr->aware) continue;
4531 /* Skip items with no distribution (special artifacts) */
4532 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4536 /* Check for objects in the group */
4537 if (TV_LIFE_BOOK == group_tval)
4539 /* Hack -- All spell books */
4540 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4542 /* Add the object */
4543 object_idx[object_cnt++] = i;
4547 else if (k_ptr->tval == group_tval)
4549 /* Add the object */
4550 object_idx[object_cnt++] = i;
4554 /* XXX Hack -- Just checking for non-empty group */
4555 if (mode & 0x01) break;
4558 /* Terminate the list */
4559 object_idx[object_cnt] = -1;
4561 /* Return the number of objects */
4567 * Description of each feature group.
4569 static cptr feature_group_text[] =
4577 * Build a list of feature indexes in the given group. Return the number
4578 * of features in the group.
4580 * mode & 0x01 : check for non-empty group
4582 static int collect_features(int grp_cur, IDX *feat_idx, BIT_FLAGS8 mode)
4587 /* Unused; There is a single group. */
4590 /* Check every feature */
4591 for (i = 0; i < max_f_idx; i++)
4593 /* Access the index */
4594 feature_type *f_ptr = &f_info[i];
4596 /* Skip empty index */
4597 if (!f_ptr->name) continue;
4599 /* Skip mimiccing features */
4600 if (f_ptr->mimic != i) continue;
4603 feat_idx[feat_cnt++] = i;
4605 /* XXX Hack -- Just checking for non-empty group */
4606 if (mode & 0x01) break;
4609 /* Terminate the list */
4610 feat_idx[feat_cnt] = -1;
4612 /* Return the number of races */
4619 * Build a list of monster indexes in the given group. Return the number
4620 * of monsters in the group.
4622 static int collect_artifacts(int grp_cur, int object_idx[])
4624 int i, object_cnt = 0;
4626 /* Get a list of x_char in this group */
4627 byte group_tval = object_group_tval[grp_cur];
4629 /* Check every object */
4630 for (i = 0; i < max_a_idx; i++)
4632 /* Access the artifact */
4633 artifact_type *a_ptr = &a_info[i];
4635 /* Skip empty artifacts */
4636 if (!a_ptr->name) continue;
4638 /* Skip "uncreated" artifacts */
4639 if (!a_ptr->cur_num) continue;
4641 /* Check for race in the group */
4642 if (a_ptr->tval == group_tval)
4645 object_idx[object_cnt++] = i;
4649 /* Terminate the list */
4650 object_idx[object_cnt] = 0;
4652 /* Return the number of races */
4659 * Encode the screen colors
4661 static char hack[17] = "dwsorgbuDWvyRGBU";
4665 * Hack -- load a screen dump from a file
4667 void do_cmd_load_screen(void)
4682 Term_get_size(&wid, &hgt);
4684 /* Build the filename */
4685 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4687 /* Append to the file */
4688 fff = my_fopen(buf, "r");
4692 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4698 /* Save the screen */
4701 /* Clear the screen */
4705 /* Load the screen */
4706 for (y = 0; okay; y++)
4708 /* Get a line of data including control code */
4709 if (!fgets(buf, 1024, fff)) okay = FALSE;
4711 /* Get the blank line */
4712 if (buf[0] == '\n' || buf[0] == '\0') break;
4714 /* Ignore too large screen image */
4715 if (y >= hgt) continue;
4718 for (x = 0; x < wid - 1; x++)
4721 if (buf[x] == '\n' || buf[x] == '\0') break;
4723 /* Put the attr/char */
4724 Term_draw(x, y, TERM_WHITE, buf[x]);
4728 /* Dump the screen */
4729 for (y = 0; okay; y++)
4731 /* Get a line of data including control code */
4732 if (!fgets(buf, 1024, fff)) okay = FALSE;
4734 /* Get the blank line */
4735 if (buf[0] == '\n' || buf[0] == '\0') break;
4737 /* Ignore too large screen image */
4738 if (y >= hgt) continue;
4741 for (x = 0; x < wid - 1; x++)
4744 if (buf[x] == '\n' || buf[x] == '\0') break;
4746 /* Get the attr/char */
4747 (void)(Term_what(x, y, &a, &c));
4749 /* Look up the attr */
4750 for (i = 0; i < 16; i++)
4752 /* Use attr matches */
4753 if (hack[i] == buf[x]) a = (byte_hack)i;
4756 /* Put the attr/char */
4757 Term_draw(x, y, a, c);
4767 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4773 /* Restore the screen */
4780 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4781 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4784 #define IM_FLAG_STR _("*", "* ")
4785 #define HAS_FLAG_STR _("+", "+ ")
4786 #define NO_FLAG_STR _("・", ". ")
4788 #define print_im_or_res_flag(IM, RES) \
4790 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4791 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4794 #define print_flag(TR) \
4796 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4800 /* XTRA HACK RESLIST */
4801 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
4803 char o_name[MAX_NLEN];
4804 BIT_FLAGS flgs[TR_FLAG_SIZE];
4806 if (!o_ptr->k_idx) return;
4807 if (o_ptr->tval != tval) return;
4809 /* Identified items only */
4810 if (!object_is_known(o_ptr)) return;
4813 * HACK:Ring of Lordly protection and Dragon equipment
4814 * have random resistances.
4816 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4817 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4818 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4819 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4820 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4821 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4822 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4823 || object_is_artifact(o_ptr))
4826 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4828 while (o_name[i] && (i < 26))
4831 if (iskanji(o_name[i])) i++;
4840 o_name[i] = ' '; i++;
4845 fprintf(fff, "%s %s", where, o_name);
4847 if (!(o_ptr->ident & (IDENT_MENTAL)))
4849 fputs(_("-------不明--------------- -------不明---------\n",
4850 "-------unknown------------ -------unknown------\n"), fff);
4854 object_flags_known(o_ptr, flgs);
4856 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4857 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4858 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4859 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4860 print_flag(TR_RES_POIS);
4861 print_flag(TR_RES_LITE);
4862 print_flag(TR_RES_DARK);
4863 print_flag(TR_RES_SHARDS);
4864 print_flag(TR_RES_SOUND);
4865 print_flag(TR_RES_NETHER);
4866 print_flag(TR_RES_NEXUS);
4867 print_flag(TR_RES_CHAOS);
4868 print_flag(TR_RES_DISEN);
4872 print_flag(TR_RES_BLIND);
4873 print_flag(TR_RES_FEAR);
4874 print_flag(TR_RES_CONF);
4875 print_flag(TR_FREE_ACT);
4876 print_flag(TR_SEE_INVIS);
4877 print_flag(TR_HOLD_EXP);
4878 print_flag(TR_TELEPATHY);
4879 print_flag(TR_SLOW_DIGEST);
4880 print_flag(TR_REGEN);
4881 print_flag(TR_LEVITATION);
4889 fprintf(fff, "%s\n", inven_res_label);
4895 * Display *ID* ed weapons/armors's resistances
4897 static void do_cmd_knowledge_inven(void)
4901 char file_name[1024];
4911 /* Open a new file */
4912 fff = my_fopen_temp(file_name, 1024);
4915 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4919 fprintf(fff, "%s\n", inven_res_label);
4921 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4925 for (; j < 9; j++) fputc('\n', fff);
4927 fprintf(fff, "%s\n", inven_res_label);
4929 strcpy(where, _("装", "E "));
4930 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4932 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4934 strcpy(where, _("持", "I "));
4935 for (i = 0; i < INVEN_PACK; i++)
4937 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4940 st_ptr = &town[1].store[STORE_HOME];
4941 strcpy(where, _("家", "H "));
4942 for (i = 0; i < st_ptr->stock_num; i++)
4944 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
4948 /* Close the file */
4951 /* Display the file contents */
4952 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
4954 /* Remove the file */
4959 void do_cmd_save_screen_html_aux(char *filename, int message)
4963 TERM_COLOR a = 0, old_a = 0;
4977 cptr html_head[] = {
4978 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
4982 cptr html_foot[] = {
4984 "</body>\n</html>\n",
4990 Term_get_size(&wid, &hgt);
4992 /* File type is "TEXT" */
4993 FILE_TYPE(FILE_TYPE_TEXT);
4995 /* Append to the file */
4996 fff = my_fopen(filename, "w");
5001 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
5008 /* Save the screen */
5012 /* Build the filename */
5013 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5014 tmpfff = my_fopen(buf, "r");
5016 for (i = 0; html_head[i]; i++)
5017 fputs(html_head[i], fff);
5021 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5023 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5027 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5029 fprintf(fff, "%s\n", buf);
5034 /* Dump the screen */
5035 for (y = 0; y < hgt; y++)
5042 for (x = 0; x < wid - 1; x++)
5046 /* Get the attr/char */
5047 (void)(Term_what(x, y, &a, &c));
5051 case '&': cc = "&"; break;
5052 case '<': cc = "<"; break;
5053 case '>': cc = ">"; break;
5055 case 0x1f: c = '.'; break;
5056 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5061 if ((y == 0 && x == 0) || a != old_a) {
5062 rv = angband_color_table[a][1];
5063 gv = angband_color_table[a][2];
5064 bv = angband_color_table[a][3];
5065 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5066 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5070 fprintf(fff, "%s", cc);
5072 fprintf(fff, "%c", c);
5075 fprintf(fff, "</font>");
5078 for (i = 0; html_foot[i]; i++)
5079 fputs(html_foot[i], fff);
5084 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5086 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5090 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5092 fprintf(fff, "%s\n", buf);
5106 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5110 /* Restore the screen */
5116 * Hack -- save a screen dump to a file
5118 static void do_cmd_save_screen_html(void)
5120 char buf[1024], tmp[256] = "screen.html";
5122 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5125 /* Build the filename */
5126 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5130 do_cmd_save_screen_html_aux(buf, 1);
5135 * Redefinable "save_screen" action
5137 void (*screendump_aux)(void) = NULL;
5141 * Hack -- save a screen dump to a file
5143 void do_cmd_save_screen(void)
5145 bool old_use_graphics = use_graphics;
5146 bool html_dump = FALSE;
5150 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5154 if (c == 'Y' || c == 'y')
5156 else if (c == 'H' || c == 'h')
5168 Term_get_size(&wid, &hgt);
5170 if (old_use_graphics)
5172 use_graphics = FALSE;
5175 /* Redraw everything */
5176 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5178 /* Hack -- update */
5184 do_cmd_save_screen_html();
5188 /* Do we use a special screendump function ? */
5189 else if (screendump_aux)
5191 /* Dump the screen to a graphics file */
5192 (*screendump_aux)();
5194 else /* Dump the screen as text */
5205 /* Build the filename */
5206 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5208 /* File type is "TEXT" */
5209 FILE_TYPE(FILE_TYPE_TEXT);
5211 /* Append to the file */
5212 fff = my_fopen(buf, "w");
5217 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5223 /* Save the screen */
5227 /* Dump the screen */
5228 for (y = 0; y < hgt; y++)
5231 for (x = 0; x < wid - 1; x++)
5233 /* Get the attr/char */
5234 (void)(Term_what(x, y, &a, &c));
5244 fprintf(fff, "%s\n", buf);
5251 /* Dump the screen */
5252 for (y = 0; y < hgt; y++)
5255 for (x = 0; x < wid - 1; x++)
5257 /* Get the attr/char */
5258 (void)(Term_what(x, y, &a, &c));
5261 buf[x] = hack[a&0x0F];
5268 fprintf(fff, "%s\n", buf);
5279 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5282 /* Restore the screen */
5286 if (old_use_graphics)
5288 use_graphics = TRUE;
5291 /* Redraw everything */
5292 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5294 /* Hack -- update */
5301 * Sorting hook -- Comp function -- see below
5303 * We use "u" to point to array of monster indexes,
5304 * and "v" to select the type of sorting to perform on "u".
5306 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5308 u16b *who = (u16b*)(u);
5310 u16b *why = (u16b*)(v);
5317 /* Sort by total kills */
5320 /* Extract total kills */
5321 z1 = a_info[w1].tval;
5322 z2 = a_info[w2].tval;
5324 /* Compare total kills */
5325 if (z1 < z2) return (TRUE);
5326 if (z1 > z2) return (FALSE);
5330 /* Sort by monster level */
5333 /* Extract levels */
5334 z1 = a_info[w1].sval;
5335 z2 = a_info[w2].sval;
5337 /* Compare levels */
5338 if (z1 < z2) return (TRUE);
5339 if (z1 > z2) return (FALSE);
5343 /* Sort by monster experience */
5346 /* Extract experience */
5347 z1 = a_info[w1].level;
5348 z2 = a_info[w2].level;
5350 /* Compare experience */
5351 if (z1 < z2) return (TRUE);
5352 if (z1 > z2) return (FALSE);
5356 /* Compare indexes */
5362 * Sorting hook -- Swap function -- see below
5364 * We use "u" to point to array of monster indexes,
5365 * and "v" to select the type of sorting to perform.
5367 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5369 u16b *who = (u16b*)(u);
5384 * Check the status of "artifacts"
5386 static void do_cmd_knowledge_artifacts(void)
5398 char file_name[1024];
5400 char base_name[MAX_NLEN];
5404 /* Open a new file */
5405 fff = my_fopen_temp(file_name, 1024);
5408 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5413 /* Allocate the "who" array */
5414 C_MAKE(who, max_a_idx, s16b);
5416 /* Allocate the "okay" array */
5417 C_MAKE(okay, max_a_idx, bool);
5419 /* Scan the artifacts */
5420 for (k = 0; k < max_a_idx; k++)
5422 artifact_type *a_ptr = &a_info[k];
5427 /* Skip "empty" artifacts */
5428 if (!a_ptr->name) continue;
5430 /* Skip "uncreated" artifacts */
5431 if (!a_ptr->cur_num) continue;
5437 /* Check the dungeon */
5438 for (y = 0; y < cur_hgt; y++)
5440 for (x = 0; x < cur_wid; x++)
5442 cave_type *c_ptr = &cave[y][x];
5444 s16b this_o_idx, next_o_idx = 0;
5446 /* Scan all objects in the grid */
5447 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5451 /* Acquire object */
5452 o_ptr = &o_list[this_o_idx];
5454 /* Acquire next object */
5455 next_o_idx = o_ptr->next_o_idx;
5457 /* Ignore non-artifacts */
5458 if (!object_is_fixed_artifact(o_ptr)) continue;
5460 /* Ignore known items */
5461 if (object_is_known(o_ptr)) continue;
5463 /* Note the artifact */
5464 okay[o_ptr->name1] = FALSE;
5469 /* Check the inventory and equipment */
5470 for (i = 0; i < INVEN_TOTAL; i++)
5472 object_type *o_ptr = &inventory[i];
5474 /* Ignore non-objects */
5475 if (!o_ptr->k_idx) continue;
5477 /* Ignore non-artifacts */
5478 if (!object_is_fixed_artifact(o_ptr)) continue;
5480 /* Ignore known items */
5481 if (object_is_known(o_ptr)) continue;
5483 /* Note the artifact */
5484 okay[o_ptr->name1] = FALSE;
5487 for (k = 0; k < max_a_idx; k++)
5489 if (okay[k]) who[n++] = k;
5492 /* Select the sort method */
5493 ang_sort_comp = ang_sort_art_comp;
5494 ang_sort_swap = ang_sort_art_swap;
5496 /* Sort the array by dungeon depth of monsters */
5497 ang_sort(who, &why, n);
5499 /* Scan the artifacts */
5500 for (k = 0; k < n; k++)
5502 artifact_type *a_ptr = &a_info[who[k]];
5505 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5507 /* Obtain the base object type */
5508 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5516 /* Get local object */
5519 /* Create fake object */
5520 object_prep(q_ptr, z);
5522 /* Make it an artifact */
5523 q_ptr->name1 = (byte)who[k];
5525 /* Display as if known */
5526 q_ptr->ident |= IDENT_STORE;
5528 /* Describe the artifact */
5529 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5532 /* Hack -- Build the artifact name */
5533 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5536 /* Free the "who" array */
5537 C_KILL(who, max_a_idx, s16b);
5539 /* Free the "okay" array */
5540 C_KILL(okay, max_a_idx, bool);
5542 /* Close the file */
5545 /* Display the file contents */
5546 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5548 /* Remove the file */
5554 * Display known uniques
5555 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5557 static void do_cmd_knowledge_uniques(void)
5566 char file_name[1024];
5569 int n_alive_surface = 0;
5570 int n_alive_over100 = 0;
5571 int n_alive_total = 0;
5574 for (i = 0; i < 10; i++) n_alive[i] = 0;
5576 /* Open a new file */
5577 fff = my_fopen_temp(file_name, 1024);
5581 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5586 /* Allocate the "who" array */
5587 C_MAKE(who, max_r_idx, s16b);
5589 /* Scan the monsters */
5590 for (i = 1; i < max_r_idx; i++)
5592 monster_race *r_ptr = &r_info[i];
5595 if (!r_ptr->name) continue;
5597 /* Require unique monsters */
5598 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5600 /* Only display "known" uniques */
5601 if (!cheat_know && !r_ptr->r_sights) continue;
5603 /* Only print rarity <= 100 uniques */
5604 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5606 /* Only "alive" uniques */
5607 if (r_ptr->max_num == 0) continue;
5611 lev = (r_ptr->level - 1) / 10;
5615 if (max_lev < lev) max_lev = lev;
5617 else n_alive_over100++;
5619 else n_alive_surface++;
5621 /* Collect "appropriate" monsters */
5625 /* Select the sort method */
5626 ang_sort_comp = ang_sort_comp_hook;
5627 ang_sort_swap = ang_sort_swap_hook;
5629 /* Sort the array by dungeon depth of monsters */
5630 ang_sort(who, &why, n);
5632 if (n_alive_surface)
5634 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5635 n_alive_total += n_alive_surface;
5637 for (i = 0; i <= max_lev; i++)
5639 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5640 n_alive_total += n_alive[i];
5642 if (n_alive_over100)
5644 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5645 n_alive_total += n_alive_over100;
5650 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5651 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5655 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5658 /* Scan the monster races */
5659 for (k = 0; k < n; k++)
5661 monster_race *r_ptr = &r_info[who[k]];
5663 /* Print a message */
5664 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, (int)r_ptr->level);
5667 /* Free the "who" array */
5668 C_KILL(who, max_r_idx, s16b);
5670 /* Close the file */
5673 /* Display the file contents */
5674 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5676 /* Remove the file */
5682 * Display weapon-exp
5684 static void do_cmd_knowledge_weapon_exp(void)
5686 int i, num, weapon_exp;
5691 char file_name[1024];
5694 /* Open a new file */
5695 fff = my_fopen_temp(file_name, 1024);
5697 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5702 for (i = 0; i < 5; i++)
5704 for (num = 0; num < 64; num++)
5706 for (j = 0; j < max_k_idx; j++)
5708 object_kind *k_ptr = &k_info[j];
5710 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5712 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5714 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5716 fprintf(fff, "%-25s ", tmp);
5717 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5718 else fprintf(fff, " ");
5719 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5720 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5728 /* Close the file */
5731 /* Display the file contents */
5732 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5734 /* Remove the file */
5740 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5744 static void do_cmd_knowledge_spell_exp(void)
5747 int spell_exp, exp_level;
5750 const magic_type *s_ptr;
5752 char file_name[1024];
5754 /* Open a new file */
5755 fff = my_fopen_temp(file_name, 1024);
5757 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5762 if (p_ptr->realm1 != REALM_NONE)
5764 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5765 for (i = 0; i < 32; i++)
5767 if (!is_magic(p_ptr->realm1))
5769 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5773 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5775 if (s_ptr->slevel >= 99) continue;
5776 spell_exp = p_ptr->spell_exp[i];
5777 exp_level = spell_exp_level(spell_exp);
5778 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5779 if (p_ptr->realm1 == REALM_HISSATSU)
5780 fprintf(fff, "[--]");
5783 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5784 else fprintf(fff, " ");
5785 fprintf(fff, "%s", exp_level_str[exp_level]);
5787 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5792 if (p_ptr->realm2 != REALM_NONE)
5794 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5795 for (i = 0; i < 32; i++)
5797 if (!is_magic(p_ptr->realm1))
5799 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5803 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5805 if (s_ptr->slevel >= 99) continue;
5807 spell_exp = p_ptr->spell_exp[i + 32];
5808 exp_level = spell_exp_level(spell_exp);
5809 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5810 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5811 else fprintf(fff, " ");
5812 fprintf(fff, "%s", exp_level_str[exp_level]);
5813 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5818 /* Close the file */
5821 /* Display the file contents */
5822 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5824 /* Remove the file */
5830 * @brief スキル情報を表示するコマンドのメインルーチン /
5834 static void do_cmd_knowledge_skill_exp(void)
5836 int i = 0, skill_exp;
5840 char file_name[1024];
5841 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5842 _("二刀流 ", "Dual Wielding "),
5843 _("乗馬 ", "Riding ")};
5845 /* Open a new file */
5846 fff = my_fopen_temp(file_name, 1024);
5848 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5853 for (i = 0; i < 3; i++)
5855 skill_exp = p_ptr->skill_exp[i];
5856 fprintf(fff, "%-20s ", skill_name[i]);
5857 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5858 else fprintf(fff, " ");
5859 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5860 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5864 /* Close the file */
5867 /* Display the file contents */
5868 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5870 /* Remove the file */
5876 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5877 * @param Name 変換したい文字列の参照ポインタ
5880 void plural_aux(char *Name)
5882 int NameLen = strlen(Name);
5884 if (my_strstr(Name, "Disembodied hand"))
5886 strcpy(Name, "Disembodied hands that strangled people");
5888 else if (my_strstr(Name, "Colour out of space"))
5890 strcpy(Name, "Colours out of space");
5892 else if (my_strstr(Name, "stairway to hell"))
5894 strcpy(Name, "stairways to hell");
5896 else if (my_strstr(Name, "Dweller on the threshold"))
5898 strcpy(Name, "Dwellers on the threshold");
5900 else if (my_strstr(Name, " of "))
5902 cptr aider = my_strstr(Name, " of ");
5913 if (dummy[i-1] == 's')
5915 strcpy(&(dummy[i]), "es");
5920 strcpy(&(dummy[i]), "s");
5923 strcpy(&(dummy[i+1]), aider);
5924 strcpy(Name, dummy);
5926 else if (my_strstr(Name, "coins"))
5929 strcpy(dummy, "piles of ");
5930 strcat(dummy, Name);
5931 strcpy(Name, dummy);
5934 else if (my_strstr(Name, "Manes"))
5938 else if (streq(&(Name[NameLen - 2]), "ey"))
5940 strcpy(&(Name[NameLen - 2]), "eys");
5942 else if (Name[NameLen - 1] == 'y')
5944 strcpy(&(Name[NameLen - 1]), "ies");
5946 else if (streq(&(Name[NameLen - 4]), "ouse"))
5948 strcpy(&(Name[NameLen - 4]), "ice");
5950 else if (streq(&(Name[NameLen - 2]), "us"))
5952 strcpy(&(Name[NameLen - 2]), "i");
5954 else if (streq(&(Name[NameLen - 6]), "kelman"))
5956 strcpy(&(Name[NameLen - 6]), "kelmen");
5958 else if (streq(&(Name[NameLen - 8]), "wordsman"))
5960 strcpy(&(Name[NameLen - 8]), "wordsmen");
5962 else if (streq(&(Name[NameLen - 7]), "oodsman"))
5964 strcpy(&(Name[NameLen - 7]), "oodsmen");
5966 else if (streq(&(Name[NameLen - 7]), "eastman"))
5968 strcpy(&(Name[NameLen - 7]), "eastmen");
5970 else if (streq(&(Name[NameLen - 8]), "izardman"))
5972 strcpy(&(Name[NameLen - 8]), "izardmen");
5974 else if (streq(&(Name[NameLen - 5]), "geist"))
5976 strcpy(&(Name[NameLen - 5]), "geister");
5978 else if (streq(&(Name[NameLen - 2]), "ex"))
5980 strcpy(&(Name[NameLen - 2]), "ices");
5982 else if (streq(&(Name[NameLen - 2]), "lf"))
5984 strcpy(&(Name[NameLen - 2]), "lves");
5986 else if (suffix(Name, "ch") ||
5987 suffix(Name, "sh") ||
5988 suffix(Name, "nx") ||
5989 suffix(Name, "s") ||
5992 strcpy(&(Name[NameLen]), "es");
5996 strcpy(&(Name[NameLen]), "s");
6001 * @brief 現在のペットを表示するコマンドのメインルーチン /
6002 * Display current pets
6005 static void do_cmd_knowledge_pets(void)
6009 monster_type *m_ptr;
6012 int show_upkeep = 0;
6013 char file_name[1024];
6016 /* Open a new file */
6017 fff = my_fopen_temp(file_name, 1024);
6019 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6024 /* Process the monsters (backwards) */
6025 for (i = m_max - 1; i >= 1; i--)
6027 /* Access the monster */
6030 /* Ignore "dead" monsters */
6031 if (!m_ptr->r_idx) continue;
6033 /* Calculate "upkeep" for pets */
6037 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6038 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6042 show_upkeep = calculate_upkeep();
6044 fprintf(fff, "----------------------------------------------\n");
6046 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6047 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6049 fprintf(fff, " Total: %d pet%s.\n",
6050 t_friends, (t_friends == 1 ? "" : "s"));
6051 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6056 /* Close the file */
6059 /* Display the file contents */
6060 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6062 /* Remove the file */
6068 * @brief 現在のペットを表示するコマンドのメインルーチン /
6071 * @note the player ghosts are ignored. XXX XXX XXX
6073 static void do_cmd_knowledge_kill_count(void)
6082 char file_name[1024];
6087 /* Open a new file */
6088 fff = my_fopen_temp(file_name, 1024);
6091 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6096 /* Allocate the "who" array */
6097 C_MAKE(who, max_r_idx, s16b);
6100 /* Monsters slain */
6103 for (kk = 1; kk < max_r_idx; kk++)
6105 monster_race *r_ptr = &r_info[kk];
6107 if (r_ptr->flags1 & (RF1_UNIQUE))
6109 bool dead = (r_ptr->max_num == 0);
6118 MONSTER_NUMBER This = r_ptr->r_pkills;
6128 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6131 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6133 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6139 /* Scan the monsters */
6140 for (i = 1; i < max_r_idx; i++)
6142 monster_race *r_ptr = &r_info[i];
6144 /* Use that monster */
6145 if (r_ptr->name) who[n++] = i;
6148 /* Select the sort method */
6149 ang_sort_comp = ang_sort_comp_hook;
6150 ang_sort_swap = ang_sort_swap_hook;
6152 /* Sort the array by dungeon depth of monsters */
6153 ang_sort(who, &why, n);
6155 /* Scan the monster races */
6156 for (k = 0; k < n; k++)
6158 monster_race *r_ptr = &r_info[who[k]];
6160 if (r_ptr->flags1 & (RF1_UNIQUE))
6162 bool dead = (r_ptr->max_num == 0);
6166 /* Print a message */
6167 fprintf(fff, " %s\n",
6168 (r_name + r_ptr->name));
6174 MONSTER_NUMBER This = r_ptr->r_pkills;
6179 /* p,tは人と数える by ita */
6180 if (my_strchr("pt", r_ptr->d_char))
6181 fprintf(fff, " %3d 人の %s\n", (int)This, r_name + r_ptr->name);
6183 fprintf(fff, " %3d 体の %s\n", (int)This, r_name + r_ptr->name);
6187 if (my_strstr(r_name + r_ptr->name, "coins"))
6189 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6193 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6199 strcpy(ToPlural, (r_name + r_ptr->name));
6200 plural_aux(ToPlural);
6201 fprintf(fff, " %d %s\n", This, ToPlural);
6211 fprintf(fff,"----------------------------------------------\n");
6213 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6215 fprintf(fff," Total: %lu creature%s killed.\n",
6216 (unsigned long int)Total, (Total == 1 ? "" : "s"));
6220 /* Free the "who" array */
6221 C_KILL(who, max_r_idx, s16b);
6223 /* Close the file */
6226 /* Display the file contents */
6227 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6229 /* Remove the file */
6235 * @brief モンスター情報リスト中のグループを表示する /
6236 * Display the object groups.
6240 * @param per_page リストの表示行
6241 * @param grp_idx グループのID配列
6242 * @param group_text グループ名の文字列配列
6243 * @param grp_cur 現在の選択ID
6244 * @param grp_top 現在の選択リスト最上部ID
6247 static void display_group_list(int col, int row, int wid, int per_page,
6248 IDX grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6252 /* Display lines until done */
6253 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6255 /* Get the group index */
6256 int grp = grp_idx[grp_top + i];
6258 /* Choose a color */
6259 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6261 /* Erase the entire line */
6262 Term_erase(col, row + i, wid);
6264 /* Display the group label */
6265 c_put_str(attr, group_text[grp], row + i, col);
6271 * Move the cursor in a browser window
6273 static void browser_cursor(char ch, int *column, IDX *grp_cur, int grp_cnt,
6274 IDX *list_cur, int list_cnt)
6279 IDX list = *list_cur;
6281 /* Extract direction */
6284 /* Hack -- scroll up full screen */
6289 /* Hack -- scroll down full screen */
6294 d = get_keymap_dir(ch);
6299 /* Diagonals - hack */
6300 if ((ddx[d] > 0) && ddy[d])
6306 Term_get_size(&wid, &hgt);
6308 browser_rows = hgt - 8;
6310 /* Browse group list */
6315 /* Move up or down */
6316 grp += ddy[d] * (browser_rows - 1);
6319 if (grp >= grp_cnt) grp = grp_cnt - 1;
6320 if (grp < 0) grp = 0;
6321 if (grp != old_grp) list = 0;
6324 /* Browse sub-list list */
6327 /* Move up or down */
6328 list += ddy[d] * browser_rows;
6331 if (list >= list_cnt) list = list_cnt - 1;
6332 if (list < 0) list = 0;
6344 if (col < 0) col = 0;
6345 if (col > 1) col = 1;
6352 /* Browse group list */
6357 /* Move up or down */
6361 if (grp >= grp_cnt) grp = grp_cnt - 1;
6362 if (grp < 0) grp = 0;
6363 if (grp != old_grp) list = 0;
6366 /* Browse sub-list list */
6369 /* Move up or down */
6373 if (list >= list_cnt) list = list_cnt - 1;
6374 if (list < 0) list = 0;
6385 static void display_visual_list(int col, int row, int height, int width, TERM_COLOR attr_top, byte char_left)
6389 /* Clear the display lines */
6390 for (i = 0; i < height; i++)
6392 Term_erase(col, row + i, width);
6395 /* Bigtile mode uses double width */
6396 if (use_bigtile) width /= 2;
6398 /* Display lines until done */
6399 for (i = 0; i < height; i++)
6401 /* Display columns until done */
6402 for (j = 0; j < width; j++)
6406 TERM_LEN x = col + j;
6407 TERM_LEN y = row + i;
6410 /* Bigtile mode uses double width */
6411 if (use_bigtile) x += j;
6416 /* Ignore illegal characters */
6417 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6418 (!use_graphics && ic > 0x7f))
6424 /* Force correct code for both ASCII character and tile */
6425 if (c & 0x80) a |= 0x80;
6427 /* Display symbol */
6428 Term_queue_bigchar(x, y, a, c, 0, 0);
6435 * Place the cursor at the collect position for visual mode
6437 static void place_visual_list_cursor(TERM_LEN col, TERM_LEN row, TERM_COLOR a, byte c, TERM_COLOR attr_top, byte char_left)
6439 int i = (a & 0x7f) - attr_top;
6440 int j = c - char_left;
6442 TERM_LEN x = col + j;
6443 TERM_LEN y = row + i;
6445 /* Bigtile mode uses double width */
6446 if (use_bigtile) x += j;
6448 /* Place the cursor */
6454 * Clipboard variables for copy&paste in visual mode
6456 static TERM_COLOR attr_idx = 0;
6457 static byte char_idx = 0;
6459 /* Hack -- for feature lighting */
6460 static TERM_COLOR attr_idx_feat[F_LIT_MAX];
6461 static byte char_idx_feat[F_LIT_MAX];
6464 * Do visual mode command -- Change symbols
6466 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6467 int height, int width,
6468 TERM_COLOR *attr_top_ptr, byte *char_left_ptr,
6469 TERM_COLOR *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6471 static TERM_COLOR attr_old = 0;
6472 static byte char_old = 0;
6477 if (*visual_list_ptr)
6480 *cur_attr_ptr = attr_old;
6481 *cur_char_ptr = char_old;
6482 *visual_list_ptr = FALSE;
6490 if (*visual_list_ptr)
6493 *visual_list_ptr = FALSE;
6494 *need_redraw = TRUE;
6502 if (!*visual_list_ptr)
6504 *visual_list_ptr = TRUE;
6506 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6507 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6509 attr_old = *cur_attr_ptr;
6510 char_old = *cur_char_ptr;
6521 /* Set the visual */
6522 attr_idx = *cur_attr_ptr;
6523 char_idx = *cur_char_ptr;
6525 /* Hack -- for feature lighting */
6526 for (i = 0; i < F_LIT_MAX; i++)
6528 attr_idx_feat[i] = 0;
6529 char_idx_feat[i] = 0;
6536 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6539 *cur_attr_ptr = attr_idx;
6540 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6541 if (!*visual_list_ptr) *need_redraw = TRUE;
6547 *cur_char_ptr = char_idx;
6548 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6549 if (!*visual_list_ptr) *need_redraw = TRUE;
6555 if (*visual_list_ptr)
6558 int d = get_keymap_dir(ch);
6559 byte a = (*cur_attr_ptr & 0x7f);
6560 byte c = *cur_char_ptr;
6562 if (use_bigtile) eff_width = width / 2;
6563 else eff_width = width;
6565 /* Restrict direction */
6566 if ((a == 0) && (ddy[d] < 0)) d = 0;
6567 if ((c == 0) && (ddx[d] < 0)) d = 0;
6568 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6569 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6574 /* Force correct code for both ASCII character and tile */
6575 if (c & 0x80) a |= 0x80;
6577 /* Set the visual */
6582 /* Move the frame */
6583 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6584 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6585 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6586 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6592 /* Visual mode command is not used */
6598 * Display the monsters in a group.
6600 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6601 int mon_cur, int mon_top, bool visual_only)
6605 /* Display lines until done */
6606 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6610 /* Get the race index */
6611 MONRACE_IDX r_idx = mon_idx[mon_top + i] ;
6613 /* Access the race */
6614 monster_race *r_ptr = &r_info[r_idx];
6616 /* Choose a color */
6617 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6619 /* Display the name */
6620 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6622 /* Hack -- visual_list mode */
6625 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6627 if (p_ptr->wizard || visual_only)
6629 c_prt(attr, format("%d", r_idx), row + i, 62);
6632 /* Erase chars before overwritten by the race letter */
6633 Term_erase(69, row + i, 255);
6635 /* Display symbol */
6636 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6641 if (!(r_ptr->flags1 & RF1_UNIQUE))
6642 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6644 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6645 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6649 /* Clear remaining lines */
6650 for (; i < per_page; i++)
6652 Term_erase(col, row + i, 255);
6658 * Display known monsters.
6660 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx)
6664 IDX grp_cur, grp_top, old_grp_cur;
6665 IDX mon_cur, mon_top;
6666 IDX grp_cnt, grp_idx[100];
6674 bool visual_list = FALSE;
6675 TERM_COLOR attr_top = 0;
6684 Term_get_size(&wid, &hgt);
6686 browser_rows = hgt - 8;
6688 /* Allocate the "mon_idx" array */
6689 C_MAKE(mon_idx, max_r_idx, s16b);
6694 if (direct_r_idx < 0)
6696 mode = visual_only ? 0x03 : 0x01;
6698 /* Check every group */
6699 for (i = 0; monster_group_text[i] != NULL; i++)
6701 /* Measure the label */
6702 len = strlen(monster_group_text[i]);
6704 /* Save the maximum length */
6705 if (len > max) max = len;
6707 /* See if any monsters are known */
6708 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6710 /* Build a list of groups with known monsters */
6711 grp_idx[grp_cnt++] = i;
6719 mon_idx[0] = direct_r_idx;
6722 /* Terminate the list */
6725 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6726 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6729 /* Terminate the list */
6730 grp_idx[grp_cnt] = -1;
6733 grp_cur = grp_top = 0;
6734 mon_cur = mon_top = 0;
6739 mode = visual_only ? 0x02 : 0x00;
6744 monster_race *r_ptr;
6751 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6752 if (direct_r_idx < 0) prt("グループ", 4, 0);
6753 prt("名前", 4, max + 3);
6754 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6756 if (!visual_only) prt("殺害数", 4, 72);
6758 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6759 if (direct_r_idx < 0) prt("Group", 4, 0);
6760 prt("Name", 4, max + 3);
6761 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6763 if (!visual_only) prt("Kills", 4, 73);
6766 for (i = 0; i < 78; i++)
6768 Term_putch(i, 5, TERM_WHITE, '=');
6771 if (direct_r_idx < 0)
6773 for (i = 0; i < browser_rows; i++)
6775 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6782 if (direct_r_idx < 0)
6784 /* Scroll group list */
6785 if (grp_cur < grp_top) grp_top = grp_cur;
6786 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6788 /* Display a list of monster groups */
6789 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6791 if (old_grp_cur != grp_cur)
6793 old_grp_cur = grp_cur;
6795 /* Get a list of monsters in the current group */
6796 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6799 /* Scroll monster list */
6800 while (mon_cur < mon_top)
6801 mon_top = MAX(0, mon_top - browser_rows/2);
6802 while (mon_cur >= mon_top + browser_rows)
6803 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6808 /* Display a list of monsters in the current group */
6809 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6815 /* Display a monster name */
6816 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6818 /* Display visual list below first monster */
6819 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6824 prt(format("<方向>%s%s%s, ESC",
6825 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6826 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6827 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6830 prt(format("<dir>%s%s%s, ESC",
6831 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6832 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6833 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6837 /* Get the current monster */
6838 r_ptr = &r_info[mon_idx[mon_cur]];
6842 /* Mega Hack -- track this monster race */
6843 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6845 /* Hack -- handle stuff */
6851 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6855 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6859 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6864 /* Do visual mode command if needed */
6865 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))
6867 if (direct_r_idx >= 0)
6892 /* Recall on screen */
6893 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6895 screen_roff(mon_idx[mon_cur], 0);
6906 /* Move the cursor */
6907 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6914 /* Free the "mon_idx" array */
6915 C_KILL(mon_idx, max_r_idx, s16b);
6920 * Display the objects in a group.
6922 static void display_object_list(int col, int row, int per_page, IDX object_idx[],
6923 int object_cur, int object_top, bool visual_only)
6927 /* Display lines until done */
6928 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6933 object_kind *flavor_k_ptr;
6935 /* Get the object index */
6936 KIND_OBJECT_IDX k_idx = object_idx[object_top + i];
6938 /* Access the object */
6939 object_kind *k_ptr = &k_info[k_idx];
6941 /* Choose a color */
6942 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6943 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6946 if (!visual_only && k_ptr->flavor)
6948 /* Appearance of this object is shuffled */
6949 flavor_k_ptr = &k_info[k_ptr->flavor];
6953 /* Appearance of this object is very normal */
6954 flavor_k_ptr = k_ptr;
6959 attr = ((i + object_top == object_cur) ? cursor : attr);
6961 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
6964 strip_name(o_name, k_idx);
6969 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
6972 /* Display the name */
6973 c_prt(attr, o_name, row + i, col);
6975 /* Hack -- visual_list mode */
6978 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);
6980 if (p_ptr->wizard || visual_only)
6982 c_prt(attr, format("%d", k_idx), row + i, 70);
6985 a = flavor_k_ptr->x_attr;
6986 c = flavor_k_ptr->x_char;
6988 /* Display symbol */
6989 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
6992 /* Clear remaining lines */
6993 for (; i < per_page; i++)
6995 Term_erase(col, row + i, 255);
7000 * Describe fake object
7002 static void desc_obj_fake(IDX k_idx)
7005 object_type object_type_body;
7007 /* Get local object */
7008 o_ptr = &object_type_body;
7010 /* Wipe the object */
7013 /* Create the artifact */
7014 object_prep(o_ptr, k_idx);
7016 /* It's fully know */
7017 o_ptr->ident |= IDENT_KNOWN;
7019 /* Track the object */
7020 /* object_actual_track(o_ptr); */
7022 /* Hack - mark as fake */
7023 /* term_obj_real = FALSE; */
7025 /* Hack -- Handle stuff */
7028 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
7030 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7038 * Display known objects
7040 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx)
7044 IDX grp_cur, grp_top, old_grp_cur;
7045 IDX object_old, object_cur, object_top;
7055 bool visual_list = FALSE;
7056 TERM_COLOR attr_top = 0;
7065 Term_get_size(&wid, &hgt);
7067 browser_rows = hgt - 8;
7069 /* Allocate the "object_idx" array */
7070 C_MAKE(object_idx, max_k_idx, IDX);
7075 if (direct_k_idx < 0)
7077 mode = visual_only ? 0x03 : 0x01;
7079 /* Check every group */
7080 for (i = 0; object_group_text[i] != NULL; i++)
7082 /* Measure the label */
7083 len = strlen(object_group_text[i]);
7085 /* Save the maximum length */
7086 if (len > max) max = len;
7088 /* See if any monsters are known */
7089 if (collect_objects(i, object_idx, mode))
7091 /* Build a list of groups with known monsters */
7092 grp_idx[grp_cnt++] = i;
7101 object_kind *k_ptr = &k_info[direct_k_idx];
7102 object_kind *flavor_k_ptr;
7104 if (!visual_only && k_ptr->flavor)
7106 /* Appearance of this object is shuffled */
7107 flavor_k_ptr = &k_info[k_ptr->flavor];
7111 /* Appearance of this object is very normal */
7112 flavor_k_ptr = k_ptr;
7115 object_idx[0] = direct_k_idx;
7116 object_old = direct_k_idx;
7119 /* Terminate the list */
7122 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7123 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7126 /* Terminate the list */
7127 grp_idx[grp_cnt] = -1;
7130 grp_cur = grp_top = 0;
7131 object_cur = object_top = 0;
7136 mode = visual_only ? 0x02 : 0x00;
7141 object_kind *k_ptr, *flavor_k_ptr;
7148 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7149 if (direct_k_idx < 0) prt("グループ", 4, 0);
7150 prt("名前", 4, max + 3);
7151 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7154 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7155 if (direct_k_idx < 0) prt("Group", 4, 0);
7156 prt("Name", 4, max + 3);
7157 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7161 for (i = 0; i < 78; i++)
7163 Term_putch(i, 5, TERM_WHITE, '=');
7166 if (direct_k_idx < 0)
7168 for (i = 0; i < browser_rows; i++)
7170 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7177 if (direct_k_idx < 0)
7179 /* Scroll group list */
7180 if (grp_cur < grp_top) grp_top = grp_cur;
7181 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7183 /* Display a list of object groups */
7184 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7186 if (old_grp_cur != grp_cur)
7188 old_grp_cur = grp_cur;
7190 /* Get a list of objects in the current group */
7191 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7194 /* Scroll object list */
7195 while (object_cur < object_top)
7196 object_top = MAX(0, object_top - browser_rows/2);
7197 while (object_cur >= object_top + browser_rows)
7198 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7203 /* Display a list of objects in the current group */
7204 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7208 object_top = object_cur;
7210 /* Display a list of objects in the current group */
7211 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7213 /* Display visual list below first object */
7214 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7217 /* Get the current object */
7218 k_ptr = &k_info[object_idx[object_cur]];
7220 if (!visual_only && k_ptr->flavor)
7222 /* Appearance of this object is shuffled */
7223 flavor_k_ptr = &k_info[k_ptr->flavor];
7227 /* Appearance of this object is very normal */
7228 flavor_k_ptr = k_ptr;
7233 prt(format("<方向>%s%s%s, ESC",
7234 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7235 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7236 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7239 prt(format("<dir>%s%s%s, ESC",
7240 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7241 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7242 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7248 /* Mega Hack -- track this object */
7249 if (object_cnt) object_kind_track(object_idx[object_cur]);
7251 /* The "current" object changed */
7252 if (object_old != object_idx[object_cur])
7254 /* Hack -- handle stuff */
7257 /* Remember the "current" object */
7258 object_old = object_idx[object_cur];
7264 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7268 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7272 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7277 /* Do visual mode command if needed */
7278 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))
7280 if (direct_k_idx >= 0)
7305 /* Recall on screen */
7306 if (!visual_list && !visual_only && (grp_cnt > 0))
7308 desc_obj_fake(object_idx[object_cur]);
7316 /* Move the cursor */
7317 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7323 /* Free the "object_idx" array */
7324 C_KILL(object_idx, max_k_idx, IDX);
7329 * Display the features in a group.
7331 static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_idx,
7332 FEAT_IDX feat_cur, FEAT_IDX feat_top, bool visual_only, int lighting_level)
7334 int lit_col[F_LIT_MAX], i, j;
7335 int f_idx_col = use_bigtile ? 62 : 64;
7337 /* Correct columns 1 and 4 */
7338 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7339 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7340 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7342 /* Display lines until done */
7343 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7348 FEAT_IDX f_idx = feat_idx[feat_top + i];
7350 /* Access the index */
7351 feature_type *f_ptr = &f_info[f_idx];
7353 int row_i = row + i;
7355 /* Choose a color */
7356 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7358 /* Display the name */
7359 c_prt(attr, f_name + f_ptr->name, row_i, col);
7361 /* Hack -- visual_list mode */
7364 /* Display lighting level */
7365 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7367 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));
7369 if (p_ptr->wizard || visual_only)
7371 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7374 /* Display symbol */
7375 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);
7377 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7378 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7380 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7382 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7384 /* Mega-hack -- Use non-standard colour */
7385 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7387 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7391 /* Clear remaining lines */
7392 for (; i < per_page; i++)
7394 Term_erase(col, row + i, 255);
7400 * Interact with feature visuals.
7402 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level)
7406 IDX grp_cur, grp_top, old_grp_cur;
7407 IDX feat_cur, feat_top;
7417 bool visual_list = FALSE;
7418 TERM_COLOR attr_top = 0;
7424 TERM_COLOR attr_old[F_LIT_MAX];
7425 byte char_old[F_LIT_MAX];
7426 TERM_COLOR *cur_attr_ptr;
7429 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7430 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7433 Term_get_size(&wid, &hgt);
7435 browser_rows = hgt - 8;
7437 /* Allocate the "feat_idx" array */
7438 C_MAKE(feat_idx, max_f_idx, IDX);
7443 if (direct_f_idx < 0)
7445 /* Check every group */
7446 for (i = 0; feature_group_text[i] != NULL; i++)
7448 /* Measure the label */
7449 len = strlen(feature_group_text[i]);
7451 /* Save the maximum length */
7452 if (len > max) max = len;
7454 /* See if any features are known */
7455 if (collect_features(i, feat_idx, 0x01))
7457 /* Build a list of groups with known features */
7458 grp_idx[grp_cnt++] = i;
7466 feature_type *f_ptr = &f_info[direct_f_idx];
7468 feat_idx[0] = direct_f_idx;
7471 /* Terminate the list */
7474 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7475 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7477 for (i = 0; i < F_LIT_MAX; i++)
7479 attr_old[i] = f_ptr->x_attr[i];
7480 char_old[i] = f_ptr->x_char[i];
7484 /* Terminate the list */
7485 grp_idx[grp_cnt] = -1;
7488 grp_cur = grp_top = 0;
7489 feat_cur = feat_top = 0;
7497 feature_type *f_ptr;
7504 prt("表示 - 地形", 2, 0);
7505 if (direct_f_idx < 0) prt("グループ", 4, 0);
7506 prt("名前", 4, max + 3);
7509 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7510 prt("文字 ( l/ d)", 4, 66);
7514 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7515 prt("文字 (l/d)", 4, 68);
7518 prt("Visuals - features", 2, 0);
7519 if (direct_f_idx < 0) prt("Group", 4, 0);
7520 prt("Name", 4, max + 3);
7523 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7524 prt("Sym ( l/ d)", 4, 67);
7528 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7529 prt("Sym (l/d)", 4, 69);
7533 for (i = 0; i < 78; i++)
7535 Term_putch(i, 5, TERM_WHITE, '=');
7538 if (direct_f_idx < 0)
7540 for (i = 0; i < browser_rows; i++)
7542 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7549 if (direct_f_idx < 0)
7551 /* Scroll group list */
7552 if (grp_cur < grp_top) grp_top = grp_cur;
7553 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7555 /* Display a list of feature groups */
7556 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7558 if (old_grp_cur != grp_cur)
7560 old_grp_cur = grp_cur;
7562 /* Get a list of features in the current group */
7563 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7566 /* Scroll feature list */
7567 while (feat_cur < feat_top)
7568 feat_top = MAX(0, feat_top - browser_rows/2);
7569 while (feat_cur >= feat_top + browser_rows)
7570 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7575 /* Display a list of features in the current group */
7576 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7580 feat_top = feat_cur;
7582 /* Display a list of features in the current group */
7583 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7585 /* Display visual list below first object */
7586 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7591 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7592 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7593 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7596 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7597 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7598 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7602 /* Get the current feature */
7603 f_ptr = &f_info[feat_idx[feat_cur]];
7604 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7605 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7609 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7613 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7617 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7622 if (visual_list && ((ch == 'A') || (ch == 'a')))
7624 int prev_lighting_level = *lighting_level;
7628 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7629 else (*lighting_level)--;
7633 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7634 else (*lighting_level)++;
7637 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7638 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7640 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7641 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7646 else if ((ch == 'D') || (ch == 'd'))
7648 TERM_COLOR prev_x_attr = f_ptr->x_attr[*lighting_level];
7649 byte prev_x_char = f_ptr->x_char[*lighting_level];
7651 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7655 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7656 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7658 if (prev_x_char != f_ptr->x_char[*lighting_level])
7659 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7661 else *need_redraw = TRUE;
7666 /* Do visual mode command if needed */
7667 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))
7671 /* Restore previous visual settings */
7673 for (i = 0; i < F_LIT_MAX; i++)
7675 f_ptr->x_attr[i] = attr_old[i];
7676 f_ptr->x_char[i] = char_old[i];
7683 if (direct_f_idx >= 0) flag = TRUE;
7684 else *lighting_level = F_LIT_STANDARD;
7687 /* Preserve current visual settings */
7690 for (i = 0; i < F_LIT_MAX; i++)
7692 attr_old[i] = f_ptr->x_attr[i];
7693 char_old[i] = f_ptr->x_char[i];
7695 *lighting_level = F_LIT_STANDARD;
7702 for (i = 0; i < F_LIT_MAX; i++)
7704 attr_idx_feat[i] = f_ptr->x_attr[i];
7705 char_idx_feat[i] = f_ptr->x_char[i];
7714 /* Allow TERM_DARK text */
7715 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7717 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7718 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7736 /* Move the cursor */
7737 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7743 /* Free the "feat_idx" array */
7744 C_KILL(feat_idx, max_f_idx, IDX);
7749 * List wanted monsters
7751 static void do_cmd_knowledge_kubi(void)
7756 char file_name[1024];
7759 /* Open a new file */
7760 fff = my_fopen_temp(file_name, 1024);
7762 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7769 bool listed = FALSE;
7772 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7774 fprintf(fff, "賞金首リスト\n");
7776 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7778 fprintf(fff, "List of wanted monsters\n");
7780 fprintf(fff, "----------------------------------------------\n");
7782 for (i = 0; i < MAX_KUBI; i++)
7784 if (kubi_r_idx[i] <= 10000)
7786 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7794 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7798 /* Close the file */
7801 /* Display the file contents */
7802 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7804 /* Remove the file */
7809 * List virtues & status
7811 static void do_cmd_knowledge_virtues(void)
7815 char file_name[1024];
7818 /* Open a new file */
7819 fff = my_fopen_temp(file_name, 1024);
7821 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7828 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7832 /* Close the file */
7835 /* Display the file contents */
7836 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7838 /* Remove the file */
7846 static void do_cmd_knowledge_dungeon(void)
7850 char file_name[1024];
7854 /* Open a new file */
7855 fff = my_fopen_temp(file_name, 1024);
7857 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7864 for (i = 1; i < max_d_idx; i++)
7868 if (!d_info[i].maxdepth) continue;
7869 if (!max_dlv[i]) continue;
7870 if (d_info[i].final_guardian)
7872 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7874 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7876 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
7880 /* Close the file */
7883 /* Display the file contents */
7884 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7886 /* Remove the file */
7891 * List virtues & status
7894 static void do_cmd_knowledge_stat(void)
7898 char file_name[1024];
7901 /* Open a new file */
7902 fff = my_fopen_temp(file_name, 1024);
7904 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7911 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7912 (2 * p_ptr->hitdie +
7913 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7916 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7917 else fprintf(fff, "現在の体力ランク : ???\n\n");
7918 fprintf(fff, "能力の最大値\n\n");
7920 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7921 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7922 fprintf(fff, "Limits of maximum stats\n\n");
7924 for (v_nr = 0; v_nr < 6; v_nr++)
7926 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);
7927 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7933 /* Close the file */
7936 /* Display the file contents */
7937 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7939 /* Remove the file */
7945 * Print all active quests
7947 static void do_cmd_knowledge_quests_current(FILE *fff)
7950 char rand_tmp_str[120] = "\0";
7952 monster_race *r_ptr;
7954 int rand_level = 100;
7957 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7959 for (i = 1; i < max_q_idx; i++)
7961 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
7962 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
7963 (quest[i].status == QUEST_STATUS_COMPLETED))
7965 /* Set the quest number temporary */
7966 IDX old_quest = p_ptr->inside_quest;
7969 /* Clear the text */
7970 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
7971 quest_text_line = 0;
7973 p_ptr->inside_quest = i;
7975 /* Get the quest text */
7976 init_flags = INIT_SHOW_TEXT;
7978 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
7980 /* Reset the old quest number */
7981 p_ptr->inside_quest = old_quest;
7983 /* No info from "silent" quests */
7984 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7988 if (quest[i].type != QUEST_TYPE_RANDOM)
7990 char note[80] = "\0";
7992 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
7994 switch (quest[i].type)
7996 case QUEST_TYPE_KILL_LEVEL:
7997 case QUEST_TYPE_KILL_ANY_LEVEL:
7998 r_ptr = &r_info[quest[i].r_idx];
7999 strcpy(name, r_name + r_ptr->name);
8000 if (quest[i].max_num > 1)
8003 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
8004 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
8007 sprintf(note," - kill %d %s, have killed %d.",
8008 (int)quest[i].max_num, name, (int)quest[i].cur_num);
8012 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
8015 case QUEST_TYPE_FIND_ARTIFACT:
8018 artifact_type *a_ptr = &a_info[quest[i].k_idx];
8020 object_type *q_ptr = &forge;
8021 IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
8022 object_prep(q_ptr, k_idx);
8023 q_ptr->name1 = quest[i].k_idx;
8024 q_ptr->ident = IDENT_STORE;
8025 object_desc(name, q_ptr, OD_NAME_ONLY);
8027 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
8029 case QUEST_TYPE_FIND_EXIT:
8030 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8033 case QUEST_TYPE_KILL_NUMBER:
8035 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8036 (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num));
8038 sprintf(note," - Kill %d monsters, have killed %d.",
8039 (int)quest[i].max_num, (int)quest[i].cur_num);
8043 case QUEST_TYPE_KILL_ALL:
8044 case QUEST_TYPE_TOWER:
8045 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8050 /* Print the quest info */
8051 sprintf(tmp_str, _(" %s (危険度:%d階相当)%s\n", " %s (Danger level: %d)%s\n"),
8052 quest[i].name, (int)quest[i].level, note);
8054 fputs(tmp_str, fff);
8056 if (quest[i].status == QUEST_STATUS_COMPLETED)
8058 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8059 fputs(tmp_str, fff);
8065 while (quest_text[j][0] && j < 10)
8067 fprintf(fff, " %s\n", quest_text[j]);
8072 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8075 rand_level = quest[i].level;
8077 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8079 /* Print the quest info */
8080 r_ptr = &r_info[quest[i].r_idx];
8081 strcpy(name, r_name + r_ptr->name);
8083 if (quest[i].max_num > 1)
8086 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8087 quest[i].name, (int)quest[i].level,
8088 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
8092 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8093 quest[i].name, (int)quest[i].level,
8094 (int)quest[i].max_num, name, (int)quest[i].cur_num);
8099 sprintf(rand_tmp_str,_(" %s (%d 階) - %sを倒す。\n", " %s (Dungeon level: %d)\n Kill %s.\n"),
8100 quest[i].name, (int)quest[i].level, name);
8107 /* Print the current random quest */
8108 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8110 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8114 static bool do_cmd_knowledge_quests_aux(FILE *fff, IDX q_idx)
8117 char playtime_str[16];
8118 quest_type* const q_ptr = &quest[q_idx];
8120 if (is_fixed_quest_idx(q_idx))
8122 /* Set the quest number temporary */
8123 IDX old_quest = p_ptr->inside_quest;
8125 p_ptr->inside_quest = q_idx;
8128 init_flags = INIT_NAME_ONLY;
8130 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8132 /* Reset the old quest number */
8133 p_ptr->inside_quest = old_quest;
8135 /* No info from "silent" quests */
8136 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8139 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8140 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8142 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8144 /* Print the quest info */
8145 if (q_ptr->complev == 0)
8148 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8149 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8150 r_name+r_info[q_ptr->r_idx].name,
8151 (int)q_ptr->level, playtime_str);
8156 _(" %-35s (%3d階) - レベル%2d - %s\n",
8157 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8158 r_name+r_info[q_ptr->r_idx].name,
8166 /* Print the quest info */
8168 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8169 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8170 q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str);
8173 fputs(tmp_str, fff);
8179 * Print all finished quests
8181 void do_cmd_knowledge_quests_completed(FILE *fff, IDX quest_num[])
8186 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8187 for (i = 1; i < max_q_idx; i++)
8189 IDX q_idx = quest_num[i];
8190 quest_type* const q_ptr = &quest[q_idx];
8192 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8193 do_cmd_knowledge_quests_aux(fff, q_idx))
8198 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8203 * Print all failed quests
8205 void do_cmd_knowledge_quests_failed(FILE *fff, IDX quest_num[])
8210 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8211 for (i = 1; i < max_q_idx; i++)
8213 IDX q_idx = quest_num[i];
8214 quest_type* const q_ptr = &quest[q_idx];
8216 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8217 do_cmd_knowledge_quests_aux(fff, q_idx))
8222 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8227 * Print all random quests
8229 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8235 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8236 for (i = 1; i < max_q_idx; i++)
8238 /* No info from "silent" quests */
8239 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8241 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8245 /* Print the quest info */
8246 sprintf(tmp_str, _(" %s (%d階, %s)\n", " %s (%d, %s)\n"),
8247 quest[i].name, (int)quest[i].level, r_name+r_info[quest[i].r_idx].name);
8248 fputs(tmp_str, fff);
8251 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8255 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8257 QUEST_IDX *q_num = (QUEST_IDX *)u;
8258 quest_type *qa = &quest[q_num[a]];
8259 quest_type *qb = &quest[q_num[b]];
8264 return (qa->comptime != qb->comptime) ?
8265 (qa->comptime < qb->comptime) :
8266 (qa->level <= qb->level);
8269 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8271 QUEST_IDX *q_num = (QUEST_IDX *)u;
8278 q_num[a] = q_num[b];
8284 * Print quest status of all active quests
8286 static void do_cmd_knowledge_quests(void)
8289 char file_name[1024];
8294 /* Open a new file */
8295 fff = my_fopen_temp(file_name, 1024);
8298 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8303 /* Allocate Memory */
8304 C_MAKE(quest_num, max_q_idx, IDX);
8306 /* Sort by compete level */
8307 for (i = 1; i < max_q_idx; i++) quest_num[i] = i;
8308 ang_sort_comp = ang_sort_comp_quest_num;
8309 ang_sort_swap = ang_sort_swap_quest_num;
8310 ang_sort(quest_num, &dummy, max_q_idx);
8312 /* Dump Quest Information */
8313 do_cmd_knowledge_quests_current(fff);
8315 do_cmd_knowledge_quests_completed(fff, quest_num);
8317 do_cmd_knowledge_quests_failed(fff, quest_num);
8321 do_cmd_knowledge_quests_wiz_random(fff);
8324 /* Close the file */
8327 /* Display the file contents */
8328 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8330 /* Remove the file */
8334 C_KILL(quest_num, max_q_idx, IDX);
8341 static void do_cmd_knowledge_home(void)
8346 char file_name[1024];
8348 char o_name[MAX_NLEN];
8351 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8353 /* Open a new file */
8354 fff = my_fopen_temp(file_name, 1024);
8356 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8363 /* Print all homes in the different towns */
8364 st_ptr = &town[1].store[STORE_HOME];
8366 /* Home -- if anything there */
8367 if (st_ptr->stock_num)
8372 /* Header with name of the town */
8373 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8375 /* Dump all available items */
8376 for (i = 0; i < st_ptr->stock_num; i++)
8379 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8380 object_desc(o_name, &st_ptr->stock[i], 0);
8381 if (strlen(o_name) <= 80-3)
8383 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8389 for (n = 0, t = o_name; n < 80-3; n++, t++)
8390 if(iskanji(*t)) {t++; n++;}
8391 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8393 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8394 fprintf(fff, " %.77s\n", o_name+n);
8397 object_desc(o_name, &st_ptr->stock[i], 0);
8398 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8403 /* Add an empty line */
8404 fprintf(fff, "\n\n");
8408 /* Close the file */
8411 /* Display the file contents */
8412 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8414 /* Remove the file */
8420 * Check the status of "autopick"
8422 static void do_cmd_knowledge_autopick(void)
8426 char file_name[1024];
8428 /* Open a new file */
8429 fff = my_fopen_temp(file_name, 1024);
8433 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8440 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8444 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8445 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8448 for (k = 0; k < max_autopick; k++)
8451 byte act = autopick_list[k].action;
8452 if (act & DONT_AUTOPICK)
8454 tmp = _("放置", "Leave");
8456 else if (act & DO_AUTODESTROY)
8458 tmp = _("破壊", "Destroy");
8460 else if (act & DO_AUTOPICK)
8462 tmp = _("拾う", "Pickup");
8464 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
8466 tmp = _("確認", "Query");
8469 if (act & DO_DISPLAY)
8470 fprintf(fff, "%11s", format("[%s]", tmp));
8472 fprintf(fff, "%11s", format("(%s)", tmp));
8474 tmp = autopick_line_from_entry(&autopick_list[k]);
8475 fprintf(fff, " %s", tmp);
8479 /* Close the file */
8481 /* Display the file contents */
8482 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8484 /* Remove the file */
8490 * Interact with "knowledge"
8492 void do_cmd_knowledge(void)
8495 bool need_redraw = FALSE;
8497 /* File type is "TEXT" */
8498 FILE_TYPE(FILE_TYPE_TEXT);
8500 /* Save the screen */
8503 /* Interact until done */
8509 /* Ask for a choice */
8511 prt(format("%d/2 ページ", (p+1)), 2, 65);
8512 prt("現在の知識を確認する", 3, 0);
8514 prt(format("page %d/2", (p+1)), 2, 65);
8515 prt("Display current knowledge", 3, 0);
8518 /* Give some choices */
8522 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8523 prt("(2) 既知のアイテム の一覧", 7, 5);
8524 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8525 prt("(4) 既知のモンスター の一覧", 9, 5);
8526 prt("(5) 倒した敵の数 の一覧", 10, 5);
8527 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8528 prt("(7) 現在のペット の一覧", 12, 5);
8529 prt("(8) 我が家のアイテム の一覧", 13, 5);
8530 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8531 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8535 prt("(a) 自分に関する情報 の一覧", 6, 5);
8536 prt("(b) 突然変異 の一覧", 7, 5);
8537 prt("(c) 武器の経験値 の一覧", 8, 5);
8538 prt("(d) 魔法の経験値 の一覧", 9, 5);
8539 prt("(e) 技能の経験値 の一覧", 10, 5);
8540 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8541 prt("(g) 入ったダンジョン の一覧", 12, 5);
8542 prt("(h) 実行中のクエスト の一覧", 13, 5);
8543 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8548 prt("(1) Display known artifacts", 6, 5);
8549 prt("(2) Display known objects", 7, 5);
8550 prt("(3) Display remaining uniques", 8, 5);
8551 prt("(4) Display known monster", 9, 5);
8552 prt("(5) Display kill count", 10, 5);
8553 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8554 prt("(7) Display current pets", 12, 5);
8555 prt("(8) Display home inventory", 13, 5);
8556 prt("(9) Display *identified* equip.", 14, 5);
8557 prt("(0) Display terrain symbols.", 15, 5);
8561 prt("(a) Display about yourself", 6, 5);
8562 prt("(b) Display mutations", 7, 5);
8563 prt("(c) Display weapon proficiency", 8, 5);
8564 prt("(d) Display spell proficiency", 9, 5);
8565 prt("(e) Display misc. proficiency", 10, 5);
8566 prt("(f) Display virtues", 11, 5);
8567 prt("(g) Display dungeons", 12, 5);
8568 prt("(h) Display current quests", 13, 5);
8569 prt("(i) Display auto pick/destroy", 14, 5);
8575 prt("ESC) 抜ける", 21, 1);
8576 prt("SPACE) 次ページ", 21, 30);
8577 /*prt("-) 前ページ", 21, 60);*/
8578 prt("コマンド:", 20, 0);
8580 prt("-more-", 17, 8);
8581 prt("ESC) Exit menu", 21, 1);
8582 prt("SPACE) Next page", 21, 30);
8583 /*prt("-) Previous page", 21, 60);*/
8584 prt("Command: ", 20, 0);
8591 if (i == ESCAPE) break;
8594 case ' ': /* Page change */
8598 case '1': /* Artifacts */
8599 do_cmd_knowledge_artifacts();
8601 case '2': /* Objects */
8602 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8604 case '3': /* Uniques */
8605 do_cmd_knowledge_uniques();
8607 case '4': /* Monsters */
8608 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8610 case '5': /* Kill count */
8611 do_cmd_knowledge_kill_count();
8613 case '6': /* wanted */
8614 if (!vanilla_town) do_cmd_knowledge_kubi();
8616 case '7': /* Pets */
8617 do_cmd_knowledge_pets();
8619 case '8': /* Home */
8620 do_cmd_knowledge_home();
8622 case '9': /* Resist list */
8623 do_cmd_knowledge_inven();
8625 case '0': /* Feature list */
8627 IDX lighting_level = F_LIT_STANDARD;
8628 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8632 case 'a': /* Max stat */
8633 do_cmd_knowledge_stat();
8635 case 'b': /* Mutations */
8636 do_cmd_knowledge_mutations();
8638 case 'c': /* weapon-exp */
8639 do_cmd_knowledge_weapon_exp();
8641 case 'd': /* spell-exp */
8642 do_cmd_knowledge_spell_exp();
8644 case 'e': /* skill-exp */
8645 do_cmd_knowledge_skill_exp();
8647 case 'f': /* Virtues */
8648 do_cmd_knowledge_virtues();
8650 case 'g': /* Dungeon */
8651 do_cmd_knowledge_dungeon();
8653 case 'h': /* Quests */
8654 do_cmd_knowledge_quests();
8656 case 'i': /* Autopick */
8657 do_cmd_knowledge_autopick();
8659 default: /* Unknown option */
8663 /* Flush messages */
8667 /* Restore the screen */
8670 if (need_redraw) do_cmd_redraw();
8675 * Check on the status of an active quest
8677 void do_cmd_checkquest(void)
8679 /* File type is "TEXT" */
8680 FILE_TYPE(FILE_TYPE_TEXT);
8682 /* Save the screen */
8686 do_cmd_knowledge_quests();
8688 /* Restore the screen */
8694 * Display the time and date
8696 void do_cmd_time(void)
8698 int day, hour, min, full, start, end, num;
8706 extract_day_hour_min(&day, &hour, &min);
8708 full = hour * 100 + min;
8715 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8717 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8718 else strcpy(day_buf, "*****");
8722 msg_format("%s日目, 時刻は%d:%02d %sです。",
8723 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8724 min, (hour < 12) ? "AM" : "PM");
8726 msg_format("This is day %s. The time is %d:%02d %s.",
8727 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8728 min, (hour < 12) ? "AM" : "PM");
8733 if (!randint0(10) || p_ptr->image)
8735 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8739 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8742 /* Open this file */
8743 fff = my_fopen(buf, "rt");
8748 /* Find this time */
8749 while (!my_fgets(fff, buf, sizeof(buf)))
8751 /* Ignore comments */
8752 if (!buf[0] || (buf[0] == '#')) continue;
8754 /* Ignore invalid lines */
8755 if (buf[1] != ':') continue;
8757 /* Process 'Start' */
8760 /* Extract the starting time */
8761 start = atoi(buf + 2);
8763 /* Assume valid for an hour */
8773 /* Extract the ending time */
8774 end = atoi(buf + 2);
8780 /* Ignore incorrect range */
8781 if ((start > full) || (full > end)) continue;
8783 /* Process 'Description' */
8788 /* Apply the randomizer */
8789 if (!randint0(num)) strcpy(desc, buf + 2);
8799 /* Close the file */