3 * @brief プレイヤーのインターフェイスに関するコマンドの実装 / Interface commands
7 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
8 * This software may be copied and distributed for educational, research,
9 * and not for profit purposes provided that this copyright and statement
10 * are included in all such copies. Other copyrights may also apply.
14 * A set of functions to maintain automatic dumps of various kinds.
16 * remove_auto_dump(orig_file, mark)
17 * Remove the old automatic dump of type "mark".
18 * auto_dump_printf(fmt, ...)
19 * Dump a formatted string using fprintf().
20 * open_auto_dump(buf, mark)
21 * Open a file, remove old dump, and add new header.
22 * close_auto_dump(void)
23 * Add a footer, and close the file.
24 * The dump commands of original Angband simply add new lines to
25 * existing files; these files will become bigger and bigger unless
26 * an user deletes some or all of these files by hand at some
28 * These three functions automatically delete old dumped lines
29 * before adding new ones. Since there are various kinds of automatic
30 * dumps in a single file, we add a header and a footer with a type
31 * name for every automatic dump, and kill old lines only when the
32 * lines have the correct type of header and footer.
33 * We need to be quite paranoid about correctness; the user might
34 * (mistakenly) edit the file by hand, and see all their work come
35 * to nothing on the next auto dump otherwise. The current code only
36 * detects changes by noting inconsistencies between the actual number
37 * of lines and the number written in the footer. Note that this will
38 * not catch single-line edits.
50 * Mark strings for auto dump
52 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
53 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
56 * Variables for auto dump
58 static FILE *auto_dump_stream;
59 static cptr auto_dump_mark;
60 static int auto_dump_line_num;
64 * @brief prf出力内容を消去する /
65 * Remove old lines automatically generated before.
66 * @param orig_file 消去を行うファイル名
68 static void remove_auto_dump(cptr orig_file)
70 FILE *tmp_fff, *orig_fff;
74 bool between_mark = FALSE;
77 long header_location = 0;
78 char header_mark_str[80];
79 char footer_mark_str[80];
82 /* Prepare a header/footer mark string */
83 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
84 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
86 mark_len = strlen(footer_mark_str);
88 /* Open an old dump file in read-only mode */
89 orig_fff = my_fopen(orig_file, "r");
91 /* If original file does not exist, nothing to do */
92 if (!orig_fff) return;
94 /* Open a new (temporary) file */
95 tmp_fff = my_fopen_temp(tmp_file, 1024);
99 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), tmp_file);
104 /* Loop for every line */
108 if (my_fgets(orig_fff, buf, sizeof(buf)))
110 /* Read error: Assume End of File */
113 * Was looking for the footer, but not found.
115 * Since automatic dump might be edited by hand,
116 * it's dangerous to kill these lines.
117 * Seek back to the next line of the (pseudo) header,
122 fseek(orig_fff, header_location, SEEK_SET);
123 between_mark = FALSE;
127 /* Success -- End the loop */
134 /* We are looking for the header mark of automatic dump */
137 /* Is this line a header? */
138 if (!strcmp(buf, header_mark_str))
140 /* Memorise seek point of this line */
141 header_location = ftell(orig_fff);
143 /* Initialize counter for number of lines */
146 /* Look for the footer from now */
149 /* There are some changes */
156 /* Copy orginally lines */
157 fprintf(tmp_fff, "%s\n", buf);
161 /* We are looking for the footer mark of automatic dump */
164 /* Is this line a footer? */
165 if (!strncmp(buf, footer_mark_str, mark_len))
170 * Compare the number of lines
172 * If there is an inconsistency between
173 * actual number of lines and the
174 * number here, the automatic dump
175 * might be edited by hand. So it's
176 * dangerous to kill these lines.
177 * Seek back to the next line of the
178 * (pseudo) header, and read again.
180 if (!sscanf(buf + mark_len, " (%d)", &tmp)
183 fseek(orig_fff, header_location, SEEK_SET);
186 /* Look for another header */
187 between_mark = FALSE;
193 /* Ignore old line, and count number of lines */
203 /* If there are some changes, overwrite the original file with new one */
206 /* Copy contents of temporary file */
208 tmp_fff = my_fopen(tmp_file, "r");
209 orig_fff = my_fopen(orig_file, "w");
211 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
212 fprintf(orig_fff, "%s\n", buf);
218 /* Kill the temporary file */
226 * @brief prfファイルのフォーマットに従った内容を出力する /
227 * Dump a formatted line, using "vstrnfmt()".
230 static void auto_dump_printf(cptr fmt, ...)
237 /* Begin the Varargs Stuff */
240 /* Format the args, save the length */
241 (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
243 /* End the Varargs Stuff */
246 /* Count number of lines */
247 for (p = buf; *p; p++)
249 if (*p == '\n') auto_dump_line_num++;
253 fprintf(auto_dump_stream, "%s", buf);
258 * @brief prfファイルをファイルオープンする /
259 * Open file to append auto dump.
261 * @param mark 出力するヘッダマーク
262 * @return ファイルポインタを取得できたらTRUEを返す
264 static bool open_auto_dump(cptr buf, cptr mark)
267 char header_mark_str[80];
269 /* Save the mark string */
270 auto_dump_mark = mark;
272 /* Prepare a header mark string */
273 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
275 /* Remove old macro dumps */
276 remove_auto_dump(buf);
278 /* Append to the file */
279 auto_dump_stream = my_fopen(buf, "a");
282 if (!auto_dump_stream) {
283 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
291 fprintf(auto_dump_stream, "%s\n", header_mark_str);
293 /* Initialize counter */
294 auto_dump_line_num = 0;
296 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
297 "# *Warning!* The lines below are an automatic dump.\n"));
298 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
299 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
305 * @brief prfファイルをファイルクローズする /
306 * Append foot part and close auto dump.
309 static void close_auto_dump(void)
311 char footer_mark_str[80];
313 /* Prepare a footer mark string */
314 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
316 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
317 "# *Warning!* The lines below are an automatic dump.\n"));
318 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
319 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
321 fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
324 my_fclose(auto_dump_stream);
333 * @brief Return suffix of ordinal number
335 * @return pointer of suffix string.
337 cptr get_ordinal_number_suffix(int num)
339 num = ABS(num) % 100;
343 return (num == 11) ? "th" : "st";
345 return (num == 12) ? "th" : "nd";
347 return (num == 13) ? "th" : "rd";
356 * @brief 日記にメッセージを追加する /
357 * Take note to the diary.
358 * @param type 日記内容のID
359 * @param num 日記内容のIDに応じた数値
360 * @param note 日記内容のIDに応じた文字列参照ポインタ
363 errr do_cmd_write_nikki(int type, int num, cptr note)
369 cptr note_level = "";
370 bool do_level = TRUE;
371 char note_level_buf[40];
374 static bool disable_nikki = FALSE;
376 extract_day_hour_min(&day, &hour, &min);
378 if (disable_nikki) return(-1);
380 if (type == NIKKI_FIX_QUEST_C ||
381 type == NIKKI_FIX_QUEST_F ||
382 type == NIKKI_RAND_QUEST_C ||
383 type == NIKKI_RAND_QUEST_F ||
384 type == NIKKI_TO_QUEST)
388 old_quest = p_ptr->inside_quest;
389 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
391 /* Get the quest text */
392 init_flags = INIT_NAME_ONLY;
394 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
396 /* Reset the old quest number */
397 p_ptr->inside_quest = old_quest;
400 /* different filne name to avoid mixing */
401 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
403 /* Build the filename */
404 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
406 /* File type is "TEXT" */
407 FILE_TYPE(FILE_TYPE_TEXT);
409 fff = my_fopen(buf, "a");
414 msg_format(_("%s を開くことができませんでした。プレイ記録を一時停止します。", "Failed to open %s. Play-Record is disabled temporally."), buf);
420 q_idx = quest_number(dun_level);
424 if (p_ptr->inside_arena)
425 note_level = _("アリーナ:", "Arane:");
427 note_level = _("地上:", "Surface:");
428 else if (q_idx && (is_fixed_quest_idx(q_idx)
429 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
430 note_level = _("クエスト:", "Quest:");
434 sprintf(note_level_buf, "%d階(%s):", (int)dun_level, d_name+d_info[dungeon_type].name);
436 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, (int)dun_level);
438 note_level = note_level_buf;
446 if (day < MAX_DAYS) fprintf(fff, _("%d日目\n", "Day %d\n"), day);
447 else fputs(_("*****日目\n", "Day *****\n"), fff);
455 fprintf(fff, "%s\n",note);
459 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
464 fprintf(fff, _(" %2d:%02d %20s %sを発見した。\n", " %2d:%02d %20s discovered %s.\n"), hour, min, note_level, note);
467 case NIKKI_ART_SCROLL:
469 fprintf(fff, _(" %2d:%02d %20s 巻物によって%sを生成した。\n", " %2d:%02d %20s created %s by scroll.\n"), hour, min, note_level, note);
474 fprintf(fff, _(" %2d:%02d %20s %sを倒した。\n", " %2d:%02d %20s defeated %s.\n"), hour, min, note_level, note);
477 case NIKKI_FIX_QUEST_C:
479 if (quest[num].flags & QUEST_FLAG_SILENT) break;
480 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」を達成した。\n",
481 " %2d:%02d %20s completed quest '%s'.\n"), hour, min, note_level, quest[num].name);
484 case NIKKI_FIX_QUEST_F:
486 if (quest[num].flags & QUEST_FLAG_SILENT) break;
487 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」から命からがら逃げ帰った。\n",
488 " %2d:%02d %20s run away from quest '%s'.\n"), hour, min, note_level, quest[num].name);
491 case NIKKI_RAND_QUEST_C:
494 strcpy(name, r_name+r_info[quest[num].r_idx].name);
495 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)を達成した。\n",
496 " %2d:%02d %20s completed random quest '%s'\n"), hour, min, note_level, name);
499 case NIKKI_RAND_QUEST_F:
502 strcpy(name, r_name+r_info[quest[num].r_idx].name);
503 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)から逃げ出した。\n",
504 " %2d:%02d %20s ran away from quest '%s'.\n"), hour, min, note_level, name);
507 case NIKKI_MAXDEAPTH:
509 fprintf(fff, _(" %2d:%02d %20s %sの最深階%d階に到達した。\n",
510 " %2d:%02d %20s reached level %d of %s for the first time.\n"), hour, min, note_level,
511 _(d_name+d_info[dungeon_type].name, num),
512 _(num, d_name+d_info[dungeon_type].name));
517 fprintf(fff, _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n",
518 " %2d:%02d %20s reset recall level of %s to %d %s.\n"), hour, min, note_level, note,
519 _(d_name + d_info[num].name, (int)max_dlv[num]),
520 _((int)max_dlv[num], d_name + d_info[num].name));
526 if (q_idx && (is_fixed_quest_idx(q_idx)
527 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
529 to = _("地上", "the surface");
533 if (!(dun_level+num)) to = _("地上", "the surface");
534 else to = format(_("%d階", "level %d"), dun_level+num);
536 fprintf(fff, _(" %2d:%02d %20s %sへ%s。\n", " %2d:%02d %20s %s %s.\n"), hour, min, note_level, _(to, note), _(note, to));
542 fprintf(fff, _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n"),
543 hour, min, note_level, _(d_name+d_info[dungeon_type].name, (int)max_dlv[dungeon_type]),
544 _((int)max_dlv[dungeon_type], d_name+d_info[dungeon_type].name));
546 fprintf(fff, _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n"), hour, min, note_level);
551 if (quest[num].flags & QUEST_FLAG_SILENT) break;
552 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」へと突入した。\n", " %2d:%02d %20s entered the quest '%s'.\n"),
553 hour, min, note_level, quest[num].name);
558 fprintf(fff, _(" %2d:%02d %20s レベル・テレポートで脱出した。\n", " %2d:%02d %20s Got out using teleport level.\n"),
559 hour, min, note_level);
564 fprintf(fff, _(" %2d:%02d %20s %sを購入した。\n", " %2d:%02d %20s bought %s.\n"), hour, min, note_level, note);
569 fprintf(fff, _(" %2d:%02d %20s %sを売却した。\n", " %2d:%02d %20s sold %s.\n"), hour, min, note_level, note);
577 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦で、%sの前に敗れ去った。\n", " %2d:%02d %20s beaten by %s in the %d%s fight.\n"),
578 hour, min, note_level, _(n, note), _("", n), _(note, get_ordinal_number_suffix(n)));
581 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦(%s)に勝利した。\n", " %2d:%02d %20s won the %d%s fight (%s).\n"),
582 hour, min, note_level, num, _("", get_ordinal_number_suffix(num)), note);
584 if (num == MAX_ARENA_MONS)
586 fprintf(fff, _(" 闘技場のすべての敵に勝利し、チャンピオンとなった。\n",
587 " won all fight to become a Chanpion.\n"));
594 fprintf(fff, _(" %2d:%02d %20s %sを識別した。\n", " %2d:%02d %20s identified %s.\n"), hour, min, note_level, note);
601 to = _("地上", "the surface");
603 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
605 fprintf(fff, _(" %2d:%02d %20s %sへとウィザード・テレポートで移動した。\n",
606 " %2d:%02d %20s wizard-teleport to %s.\n"), hour, min, note_level, to);
613 to = _("地上", "the surface");
615 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
617 fprintf(fff, _(" %2d:%02d %20s %sへとパターンの力で移動した。\n",
618 " %2d:%02d %20s used Pattern to teleport to %s.\n"), hour, min, note_level, to);
623 fprintf(fff, _(" %2d:%02d %20s レベルが%dに上がった。\n", " %2d:%02d %20s reached player level %d.\n"), hour, min, note_level, num);
626 case NIKKI_GAMESTART:
628 time_t ct = time((time_t*)0);
632 fprintf(fff, "%s %s",note, ctime(&ct));
635 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
638 case NIKKI_NAMED_PET:
640 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
643 case RECORD_NAMED_PET_NAME:
644 fprintf(fff, _("%sを旅の友にすることに決めた。\n", "decided to travel together with %s.\n"), note);
646 case RECORD_NAMED_PET_UNNAME:
647 fprintf(fff, _("%sの名前を消した。\n", "unnamed %s.\n"), note);
649 case RECORD_NAMED_PET_DISMISS:
650 fprintf(fff, _("%sを解放した。\n", "dismissed %s.\n"), note);
652 case RECORD_NAMED_PET_DEATH:
653 fprintf(fff, _("%sが死んでしまった。\n", "%s died.\n"), note);
655 case RECORD_NAMED_PET_MOVED:
656 fprintf(fff, _("%sをおいて別のマップへ移動した。\n", "moved to another map leaving %s behind.\n"), note);
658 case RECORD_NAMED_PET_LOST_SIGHT:
659 fprintf(fff, _("%sとはぐれてしまった。\n", "lost sight of %s.\n"), note);
661 case RECORD_NAMED_PET_DESTROY:
662 fprintf(fff, _("%sが*破壊*によって消え去った。\n", "%s was made disappeared by *destruction*.\n"), note);
664 case RECORD_NAMED_PET_EARTHQUAKE:
665 fprintf(fff, _("%sが岩石に押し潰された。\n", "%s was crushed by falling rocks.\n"), note);
667 case RECORD_NAMED_PET_GENOCIDE:
668 fprintf(fff, _("%sが抹殺によって消え去った。\n", "%s was made disappeared by genocide.\n"), note);
670 case RECORD_NAMED_PET_WIZ_ZAP:
671 fprintf(fff, _("%sがデバッグコマンドによって消え去った。\n", "%s was removed by debug command.\n"), note);
673 case RECORD_NAMED_PET_TELE_LEVEL:
674 fprintf(fff, _("%sがテレポート・レベルによって消え去った。\n", "%s was made disappeared by teleport level.\n"), note);
676 case RECORD_NAMED_PET_BLAST:
677 fprintf(fff, _("%sを爆破した。\n", "blasted %s.\n"), note);
679 case RECORD_NAMED_PET_HEAL_LEPER:
680 fprintf(fff, _("%sの病気が治り旅から外れた。\n", "%s was healed and left.\n"), note);
682 case RECORD_NAMED_PET_COMPACT:
683 fprintf(fff, _("%sがモンスター情報圧縮によって消え去った。\n", "%s was made disappeared by compacting monsters.\n"), note);
685 case RECORD_NAMED_PET_LOSE_PARENT:
686 fprintf(fff, _("%sの召喚者が既にいないため消え去った。\n", "%s disappeared because there does not exist summoner.\n"), note);
697 case NIKKI_WIZARD_LOG:
698 fprintf(fff, "%s\n", note);
707 if (do_level) write_level = FALSE;
713 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
716 * @brief 日記のタイトル表記と内容出力 /
719 * 日記のタイトルは本関数の subtitle ローカル変数で定義されている。
721 static void do_cmd_disp_nikki(void)
723 char nikki_title[256];
729 static const char subtitle[][30] = {"最強の肉体を求めて",
760 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
761 "Attack is the best form of defence.",
763 "An unexpected windfall",
764 "A drowning man will catch at a straw",
765 "Don't count your chickens before they are hatched.",
766 "It is no use crying over spilt milk.",
767 "Seeing is believing.",
768 "Strike the iron while it is hot.",
769 "I don't care what follows.",
770 "To dig a well to put out a house on fire.",
771 "Tomorrow is another day.",
772 "Easy come, easy go.",
773 "The more haste, the less speed.",
774 "Where there is life, there is hope.",
775 "There is no royal road to *WINNER*.",
776 "Danger past, God forgotten.",
777 "The best thing to do now is to run away.",
778 "Life is but an empty dream.",
779 "Dead men tell no tales.",
780 "A book that remains shut is but a block.",
781 "Misfortunes never come singly.",
782 "A little knowledge is a dangerous thing.",
783 "History repeats itself.",
784 "*WINNER* was not built in a day.",
785 "Ignorance is bliss.",
786 "To lose is to win?",
787 "No medicine can cure folly.",
788 "All good things come to an end.",
789 "M$ Empire strikes back.",
790 "To see is to believe",
792 "Quest of The World's Greatest Brain"};
794 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
796 /* Build the filename */
797 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
799 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
800 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
801 else if (IS_WIZARD_CLASS())
802 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
803 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
806 sprintf(nikki_title, "「%s%s%sの伝説 -%s-」",
807 ap_ptr->title, ap_ptr->no ? "の" : "", p_ptr->name, tmp);
809 sprintf(nikki_title, "Legend of %s %s '%s'",
810 ap_ptr->title, p_ptr->name, tmp);
813 /* Display the file contents */
814 show_file(FALSE, buf, nikki_title, -1, 0);
818 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
821 static void do_cmd_bunshou(void)
824 char bunshou[80] = "\0";
826 if (get_string(_("内容: ", "diary note: "), tmp, 79))
828 strcpy(bunshou, tmp);
830 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
835 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
838 static void do_cmd_last_get(void)
843 if (record_o_name[0] == '\0') return;
845 sprintf(buf,_("%sの入手を記録します。", "Do you really want to record getting %s? "),record_o_name);
846 if (!get_check(buf)) return;
850 sprintf(buf,_("%sを手に入れた。", "descover %s."), record_o_name);
851 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
856 * @brief ファイル中の全日記記録を消去する /
859 static void do_cmd_erase_nikki(void)
865 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your record? "))) return;
866 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
868 /* Build the filename */
869 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
871 /* Remove the file */
874 fff = my_fopen(buf, "w");
877 msg_format(_("記録を消去しました。", "deleted record."));
879 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
888 void do_cmd_nikki(void)
892 /* File type is "TEXT" */
893 FILE_TYPE(FILE_TYPE_TEXT);
895 /* Save the screen */
898 /* Interact until done */
904 /* Ask for a choice */
905 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
907 /* Give some choices */
908 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
909 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
910 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record item you last get/identify"), 6, 5);
911 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
913 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
916 prt(_("コマンド:", "Command: "), 18, 0);
921 if (i == ESCAPE) break;
935 do_cmd_erase_nikki();
939 prepare_movie_hooks();
941 default: /* Unknown option */
949 /* Restore the screen */
954 * @brief 画面を再描画するコマンドのメインルーチン
955 * Hack -- redraw the screen
959 * This command performs various low level updates, clears all the "extra"
960 * windows, does a total redraw of the main window, and requests all of the
961 * interesting updates and redraws that I can think of.
963 * This command is also used to "instantiate" the results of the user
964 * selecting various things, such as graphics mode, so it must call
965 * the "TERM_XTRA_REACT" hook before redrawing the windows.
968 void do_cmd_redraw(void)
975 /* Hack -- react to changes */
976 Term_xtra(TERM_XTRA_REACT, 0);
979 /* Combine and Reorder the pack (later) */
980 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
984 p_ptr->update |= (PU_TORCH);
986 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
988 /* Forget lite/view */
989 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
991 /* Update lite/view */
992 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
994 /* Update monsters */
995 p_ptr->update |= (PU_MONSTERS);
997 /* Redraw everything */
998 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1000 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1002 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1006 /* Hack -- update */
1009 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1012 /* Redraw every window */
1013 for (j = 0; j < 8; j++)
1016 if (!angband_term[j]) continue;
1019 Term_activate(angband_term[j]);
1034 * @brief 名前を変更するコマンドのメインルーチン
1035 * Hack -- change name
1038 void do_cmd_change_name(void)
1047 /* Save the screen */
1055 /* Display the player */
1056 display_player(mode);
1061 display_player(mode);
1066 Term_putstr(2, 23, -1, TERM_WHITE,
1067 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1069 Term_putstr(2, 23, -1, TERM_WHITE,
1070 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1078 if (c == ESCAPE) break;
1085 /* Process the player name */
1086 process_player_name(FALSE);
1092 sprintf(tmp, "%s.txt", player_base);
1093 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1095 if (tmp[0] && (tmp[0] != ' '))
1097 file_character(tmp);
1113 /* Flush messages */
1117 /* Restore the screen */
1120 /* Redraw everything */
1121 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1128 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1129 * Recall the most recent message
1132 void do_cmd_message_one(void)
1134 /* Recall one message */
1135 prt(format("> %s", message_str(0)), 0, 0);
1140 * @brief メッセージのログを表示するコマンドのメインルーチン
1141 * Recall the most recent message
1145 * Show previous messages to the user -BEN-
1147 * The screen format uses line 0 and 23 for headers and prompts,
1148 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1150 * This command shows you which commands you are viewing, and allows
1151 * you to "search" for strings in the recall.
1153 * Note that messages may be longer than 80 characters, but they are
1154 * displayed using "infinite" length, with a special sub-command to
1155 * "slide" the virtual display to the left or right.
1157 * Attempt to only hilite the matching portions of the string.
1160 void do_cmd_messages(int num_now)
1164 char shower_str[81];
1165 char finder_str[81];
1171 Term_get_size(&wid, &hgt);
1173 /* Number of message lines in a screen */
1174 num_lines = hgt - 4;
1177 strcpy(finder_str, "");
1180 strcpy(shower_str, "");
1182 /* Total messages */
1185 /* Start on first message */
1188 /* Save the screen */
1194 /* Process requests until done */
1200 /* Dump up to 20 lines of messages */
1201 for (j = 0; (j < num_lines) && (i + j < n); j++)
1203 cptr msg = message_str(i+j);
1205 /* Dump the messages, bottom to top */
1206 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1208 /* Hilite "shower" */
1209 if (shower && shower[0])
1213 /* Display matches */
1214 while ((str = my_strstr(str, shower)) != NULL)
1216 int len = strlen(shower);
1218 /* Display the match */
1219 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1227 /* Erase remaining lines */
1228 for (; j < num_lines; j++)
1230 Term_erase(0, num_lines + 1 - j, 255);
1233 /* Display header */
1235 prt(format(_("以前のメッセージ %d-%d 全部で(%d)", "Message Recall (%d-%d of %d)"),
1236 i, i + j - 1, n), 0, 0);
1238 /* Display prompt (not very informative) */
1239 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1240 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1243 skey = inkey_special(TRUE);
1245 /* Exit on Escape */
1246 if (skey == ESCAPE) break;
1248 /* Hack -- Save the old index */
1253 /* Hack -- handle show */
1256 prt(_("強調: ", "Show: "), hgt - 1, 0);
1258 /* Get a "shower" string, or continue */
1259 strcpy(back_str, shower_str);
1260 if (askfor(shower_str, 80))
1263 shower = shower_str[0] ? shower_str : NULL;
1265 else strcpy(shower_str, back_str);
1269 /* Hack -- handle find */
1276 prt(_("検索: ", "Find: "), hgt - 1, 0);
1278 /* Get a "finder" string, or continue */
1279 strcpy(back_str, finder_str);
1280 if (!askfor(finder_str, 80))
1282 strcpy(finder_str, back_str);
1285 else if (!finder_str[0])
1287 shower = NULL; /* Stop showing */
1292 shower = finder_str;
1295 for (z = i + 1; z < n; z++)
1297 cptr msg = message_str(z);
1300 if (my_strstr(msg, finder_str))
1311 /* Recall 1 older message */
1313 /* Go to the oldest line */
1317 /* Recall 1 newer message */
1319 /* Go to the newest line */
1323 /* Recall 1 older message */
1328 /* Go older if legal */
1329 i = MIN(i + 1, n - num_lines);
1332 /* Recall 10 older messages */
1334 /* Go older if legal */
1335 i = MIN(i + 10, n - num_lines);
1338 /* Recall 20 older messages */
1343 /* Go older if legal */
1344 i = MIN(i + num_lines, n - num_lines);
1347 /* Recall 20 newer messages */
1351 /* Go newer (if able) */
1352 i = MAX(0, i - num_lines);
1355 /* Recall 10 newer messages */
1357 /* Go newer (if able) */
1361 /* Recall 1 newer messages */
1364 /* Go newer (if able) */
1369 /* Hack -- Error of some kind */
1373 /* Restore the screen */
1379 * @brief チートオプションを変更するコマンドのメインルーチン
1380 * Interact with some options for cheating
1381 * @param info 表示メッセージ
1384 static void do_cmd_options_cheat(cptr info)
1387 int i, k = 0, n = CHEAT_MAX;
1393 /* Interact with the player */
1399 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1404 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1405 prt(" << 注意 >>", 11, 0);
1406 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1407 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1408 prt(" じらないようにして下さい。", 14, 0);
1410 /* Display the options */
1411 for (i = 0; i < n; i++)
1413 byte a = TERM_WHITE;
1415 /* Color current option */
1416 if (i == k) a = TERM_L_BLUE;
1418 /* Display the option text */
1419 sprintf(buf, "%-48s: %s (%s)",
1420 cheat_info[i].o_desc,
1421 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1422 cheat_info[i].o_text);
1423 c_prt(a, buf, i + 2, 0);
1426 /* Hilite current option */
1427 move_cursor(k + 2, 50);
1433 * HACK - Try to translate the key into a direction
1434 * to allow using the roguelike keys for navigation.
1436 dir = get_keymap_dir(ch);
1437 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1451 k = (n + k - 1) % n;
1469 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1470 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1471 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1472 (*cheat_info[k].o_var) = TRUE;
1481 (*cheat_info[k].o_var) = FALSE;
1488 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1489 /* Peruse the help file */
1490 (void)show_file(TRUE, buf, NULL, 0, 0);
1507 * @brief セーブ頻度ターンの次の値を返す
1508 * @param current 現在のセーブ頻度ターン値
1509 * @return 次のセーブ頻度ターン値
1511 static s16b toggle_frequency(s16b current)
1516 case 50: return 100;
1517 case 100: return 250;
1518 case 250: return 500;
1519 case 500: return 1000;
1520 case 1000: return 2500;
1521 case 2500: return 5000;
1522 case 5000: return 10000;
1523 case 10000: return 25000;
1530 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1531 * @param info 表示メッセージ
1534 static void do_cmd_options_autosave(cptr info)
1538 int i, k = 0, n = 2;
1546 /* Interact with the player */
1550 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1551 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1555 /* Display the options */
1556 for (i = 0; i < n; i++)
1558 byte a = TERM_WHITE;
1560 /* Color current option */
1561 if (i == k) a = TERM_L_BLUE;
1563 /* Display the option text */
1564 sprintf(buf, "%-48s: %s (%s)",
1565 autosave_info[i].o_desc,
1566 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1567 autosave_info[i].o_text);
1568 c_prt(a, buf, i + 2, 0);
1570 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1572 /* Hilite current option */
1573 move_cursor(k + 2, 50);
1589 k = (n + k - 1) % n;
1607 (*autosave_info[k].o_var) = TRUE;
1616 (*autosave_info[k].o_var) = FALSE;
1624 autosave_freq = toggle_frequency(autosave_freq);
1625 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1631 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1647 * @brief 標準オプションを変更するコマンドのサブルーチン /
1648 * Interact with some options
1649 * @param page オプションページ番号
1650 * @param info 表示メッセージ
1653 void do_cmd_options_aux(int page, cptr info)
1656 int i, k = 0, n = 0, l;
1659 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1660 (!p_ptr->wizard || !allow_debug_opts);
1663 /* Lookup the options */
1664 for (i = 0; i < 24; i++) opt[i] = 0;
1666 /* Scan the options */
1667 for (i = 0; option_info[i].o_desc; i++)
1669 /* Notice options on this "page" */
1670 if (option_info[i].o_page == page) opt[n++] = i;
1677 /* Interact with the player */
1683 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1684 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1687 /* HACK -- description for easy-auto-destroy options */
1688 if (page == OPT_PAGE_AUTODESTROY)
1689 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1690 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1692 /* Display the options */
1693 for (i = 0; i < n; i++)
1695 byte a = TERM_WHITE;
1697 /* Color current option */
1698 if (i == k) a = TERM_L_BLUE;
1700 /* Display the option text */
1701 sprintf(buf, "%-48s: %s (%.19s)",
1702 option_info[opt[i]].o_desc,
1703 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1704 option_info[opt[i]].o_text);
1705 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1706 else c_prt(a, buf, i + 2, 0);
1709 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1712 /* Hilite current option */
1713 move_cursor(k + 2 + l, 50);
1719 * HACK - Try to translate the key into a direction
1720 * to allow using the roguelike keys for navigation.
1722 dir = get_keymap_dir(ch);
1723 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1737 k = (n + k - 1) % n;
1754 if (browse_only) break;
1755 (*option_info[opt[k]].o_var) = TRUE;
1764 if (browse_only) break;
1765 (*option_info[opt[k]].o_var) = FALSE;
1773 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1779 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1780 /* Peruse the help file */
1781 (void)show_file(TRUE, buf, NULL, 0, 0);
1798 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1799 * Modify the "window" options
1802 static void do_cmd_options_win(void)
1812 /* Memorize old flags */
1813 for (j = 0; j < 8; j++)
1815 /* Acquire current flags */
1816 old_flag[j] = window_flag[j];
1827 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1829 /* Display the windows */
1830 for (j = 0; j < 8; j++)
1832 byte a = TERM_WHITE;
1834 cptr s = angband_term_name[j];
1837 if (j == x) a = TERM_L_BLUE;
1839 /* Window name, staggered, centered */
1840 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1843 /* Display the options */
1844 for (i = 0; i < 16; i++)
1846 byte a = TERM_WHITE;
1848 cptr str = window_flag_desc[i];
1851 if (i == y) a = TERM_L_BLUE;
1854 if (!str) str = _("(未使用)", "(Unused option)");
1857 Term_putstr(0, i + 5, -1, a, str);
1859 /* Display the windows */
1860 for (j = 0; j < 8; j++)
1866 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1869 if (window_flag[j] & (1L << i)) c = 'X';
1872 Term_putch(35 + j * 5, i + 5, a, c);
1877 Term_gotoxy(35 + x * 5, y + 5);
1895 for (j = 0; j < 8; j++)
1897 window_flag[j] &= ~(1L << y);
1901 for (i = 0; i < 16; i++)
1903 window_flag[x] &= ~(1L << i);
1916 window_flag[x] |= (1L << y);
1924 window_flag[x] &= ~(1L << y);
1930 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
1938 d = get_keymap_dir(ch);
1940 x = (x + ddx[d] + 8) % 8;
1941 y = (y + ddy[d] + 16) % 16;
1948 /* Notice changes */
1949 for (j = 0; j < 8; j++)
1954 if (!angband_term[j]) continue;
1956 /* Ignore non-changes */
1957 if (window_flag[j] == old_flag[j]) continue;
1960 Term_activate(angband_term[j]);
1983 option_fields[OPT_NUM] =
1986 { '1', " キー入力 オプション", 3 },
1987 { '2', " マップ画面 オプション", 4 },
1988 { '3', " テキスト表示 オプション", 5 },
1989 { '4', " ゲームプレイ オプション", 6 },
1990 { '5', " 行動中止関係 オプション", 7 },
1991 { '6', " 簡易自動破壊 オプション", 8 },
1992 { 'r', " プレイ記録 オプション", 9 },
1994 { 'p', "自動拾いエディタ", 11 },
1995 { 'd', " 基本ウェイト量 ", 12 },
1996 { 'h', "低ヒットポイント", 13 },
1997 { 'm', " 低魔力色閾値 ", 14 },
1998 { 'a', " 自動セーブ オプション", 15 },
1999 { 'w', "ウインドウフラグ", 16 },
2001 { 'b', " 初期 オプション (参照のみ)", 18 },
2002 { 'c', " 詐欺 オプション", 19 },
2004 { '1', "Input Options", 3 },
2005 { '2', "Map Screen Options", 4 },
2006 { '3', "Text Display Options", 5 },
2007 { '4', "Game-Play Options", 6 },
2008 { '5', "Disturbance Options", 7 },
2009 { '6', "Easy Auto-Destroyer Options", 8 },
2010 { 'r', "Play record Options", 9 },
2012 { 'p', "Auto-picker/destroyer editor", 11 },
2013 { 'd', "Base Delay Factor", 12 },
2014 { 'h', "Hitpoint Warning", 13 },
2015 { 'm', "Mana Color Threshold", 14 },
2016 { 'a', "Autosave Options", 15 },
2017 { 'w', "Window Flags", 16 },
2019 { 'b', "Birth Options (Browse Only)", 18 },
2020 { 'c', "Cheat Options", 19 },
2026 * @brief 標準オプションを変更するコマンドのメインルーチン /
2027 * Set or unset various options.
2031 * The user must use the "Ctrl-R" command to "adapt" to changes
2032 * in any options which control "visual" aspects of the game.
2035 void do_cmd_options(void)
2041 /* Save the screen */
2049 /* Does not list cheat option when cheat option is off */
2050 if (!p_ptr->noscore && !allow_debug_opts) n--;
2055 /* Why are we here */
2056 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2060 /* Give some choices */
2061 for (i = 0; i < n; i++)
2063 byte a = TERM_WHITE;
2064 if (i == y) a = TERM_L_BLUE;
2065 Term_putstr(5, option_fields[i].row, -1, a,
2066 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2069 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2072 skey = inkey_special(TRUE);
2073 if (!(skey & SKEY_MASK)) k = (char)skey;
2077 if (k == ESCAPE) break;
2079 if (my_strchr("\n\r ", k))
2081 k = option_fields[y].key;
2085 for (i = 0; i < n; i++)
2087 if (tolower(k) == option_fields[i].key) break;
2090 /* Command is found */
2093 /* Hack -- browse help */
2094 if (k == '?') break;
2098 if (skey == SKEY_UP) d = 8;
2099 if (skey == SKEY_DOWN) d = 2;
2100 y = (y + ddy[d] + n) % n;
2105 if (k == ESCAPE) break;
2112 /* Process the general options */
2113 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2119 /* Process the general options */
2120 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2127 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2134 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2141 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2148 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2152 /* Play-record Options */
2157 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2166 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2167 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2168 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2172 /* Cheating Options */
2175 if (!p_ptr->noscore && !allow_debug_opts)
2177 /* Cheat options are not permitted */
2183 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2190 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2199 do_cmd_options_win();
2200 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2201 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2202 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2203 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2208 /* Auto-picker/destroyer editor */
2212 do_cmd_edit_autopick();
2216 /* Hack -- Delay Speed */
2222 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2224 /* Get a new value */
2227 int msec = delay_factor * delay_factor * delay_factor;
2228 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2229 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2231 if (k == ESCAPE) break;
2234 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2237 else if (isdigit(k)) delay_factor = D2I(k);
2244 /* Hack -- hitpoint warning factor */
2250 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2252 /* Get a new value */
2255 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2256 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2258 if (k == ESCAPE) break;
2261 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2264 else if (isdigit(k)) hitpoint_warn = D2I(k);
2271 /* Hack -- mana color factor */
2277 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2279 /* Get a new value */
2282 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2283 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2285 if (k == ESCAPE) break;
2288 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2291 else if (isdigit(k)) mana_warn = D2I(k);
2299 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2303 /* Unknown option */
2311 /* Flush messages */
2316 /* Restore the screen */
2319 /* Hack - Redraw equippy chars */
2320 p_ptr->redraw |= (PR_EQUIPPY);
2326 * @brief prefファイルを選択して処理する /
2327 * Ask for a "user pref line" and process it
2330 * Allow absolute file names?
2332 void do_cmd_pref(void)
2339 /* Ask for a "user pref command" */
2340 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2342 /* Process that pref command */
2343 (void)process_pref_file_command(buf);
2347 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2350 void do_cmd_reload_autopick(void)
2352 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2353 /* Load the file with messages */
2354 autopick_load_pref(TRUE);
2360 * @brief マクロ情報をprefファイルに保存する /
2361 * @param fname ファイル名
2364 static errr macro_dump(cptr fname)
2366 static cptr mark = "Macro Dump";
2372 /* Build the filename */
2373 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2375 /* File type is "TEXT" */
2376 FILE_TYPE(FILE_TYPE_TEXT);
2378 /* Append to the file */
2379 if (!open_auto_dump(buf, mark)) return (-1);
2382 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2385 for (i = 0; i < macro__num; i++)
2387 /* Extract the action */
2388 ascii_to_text(buf, macro__act[i]);
2390 /* Dump the macro */
2391 auto_dump_printf("A:%s\n", buf);
2393 /* Extract the action */
2394 ascii_to_text(buf, macro__pat[i]);
2396 /* Dump normal macros */
2397 auto_dump_printf("P:%s\n", buf);
2400 auto_dump_printf("\n");
2412 * @brief マクロのトリガーキーを取得する /
2413 * Hack -- ask for a "trigger" (see below)
2414 * @param buf キー表記を保管するバッファ
2418 * Note the complex use of the "inkey()" function from "util.c".
2420 * Note that both "flush()" calls are extremely important.
2423 static void do_cmd_macro_aux(char *buf)
2432 /* Do not process macros */
2438 /* Read the pattern */
2444 /* Do not process macros */
2447 /* Do not wait for keys */
2450 /* Attempt to read a key */
2461 /* Convert the trigger */
2462 ascii_to_text(tmp, buf);
2464 /* Hack -- display the trigger */
2465 Term_addstr(-1, TERM_WHITE, tmp);
2471 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2472 * Hack -- ask for a keymap "trigger" (see below)
2473 * @param buf キー表記を取得するバッファ
2477 * Note that both "flush()" calls are extremely important. This may
2478 * no longer be true, since "util.c" is much simpler now.
2481 static void do_cmd_macro_aux_keymap(char *buf)
2495 /* Convert to ascii */
2496 ascii_to_text(tmp, buf);
2498 /* Hack -- display the trigger */
2499 Term_addstr(-1, TERM_WHITE, tmp);
2508 * @brief キーマップをprefファイルにダンプする /
2509 * Hack -- append all keymaps to the given file
2510 * @param fname ファイルネーム
2514 static errr keymap_dump(cptr fname)
2516 static cptr mark = "Keymap Dump";
2525 if (rogue_like_commands)
2527 mode = KEYMAP_MODE_ROGUE;
2533 mode = KEYMAP_MODE_ORIG;
2537 /* Build the filename */
2538 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2540 /* File type is "TEXT" */
2541 FILE_TYPE(FILE_TYPE_TEXT);
2543 /* Append to the file */
2544 if (!open_auto_dump(buf, mark)) return -1;
2547 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2550 for (i = 0; i < 256; i++)
2554 /* Loop up the keymap */
2555 act = keymap_act[mode][i];
2557 /* Skip empty keymaps */
2560 /* Encode the key */
2563 ascii_to_text(key, buf);
2565 /* Encode the action */
2566 ascii_to_text(buf, act);
2568 /* Dump the macro */
2569 auto_dump_printf("A:%s\n", buf);
2570 auto_dump_printf("C:%d:%s\n", mode, key);
2582 * @brief マクロを設定するコマンドのメインルーチン /
2583 * Interact with "macros"
2587 * Note that the macro "action" must be defined before the trigger.
2589 * Could use some helpful instructions on this page.
2592 void do_cmd_macros(void)
2604 if (rogue_like_commands)
2606 mode = KEYMAP_MODE_ROGUE;
2612 mode = KEYMAP_MODE_ORIG;
2615 /* File type is "TEXT" */
2616 FILE_TYPE(FILE_TYPE_TEXT);
2623 /* Process requests until done */
2630 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2632 /* Describe that action */
2633 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2635 /* Analyze the current action */
2636 ascii_to_text(buf, macro__buf);
2638 /* Display the current action */
2643 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2645 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2646 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2647 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2648 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2649 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2650 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2651 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2652 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2653 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2654 #endif /* ALLOW_MACROS */
2657 prt(_("コマンド: ", "Command: "), 16, 0);
2663 if (i == ESCAPE) break;
2665 /* Load a 'macro' file */
2671 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2674 prt(_("ファイル: ", "File: "), 18, 0);
2676 /* Default filename */
2677 sprintf(tmp, "%s.prf", player_base);
2679 /* Ask for a file */
2680 if (!askfor(tmp, 80)) continue;
2682 /* Process the given filename */
2683 err = process_pref_file(tmp);
2686 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2691 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2695 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2705 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2708 prt(_("ファイル: ", "File: "), 18, 0);
2710 /* Default filename */
2711 sprintf(tmp, "%s.prf", player_base);
2713 /* Ask for a file */
2714 if (!askfor(tmp, 80)) continue;
2716 /* Dump the macros */
2717 (void)macro_dump(tmp);
2720 msg_print(_("マクロを追加しました。", "Appended macros."));
2729 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2733 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2735 /* Get a macro trigger */
2736 do_cmd_macro_aux(buf);
2738 /* Acquire action */
2739 k = macro_find_exact(buf);
2745 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2751 /* Obtain the action */
2752 strcpy(macro__buf, macro__act[k]);
2754 /* Analyze the current action */
2755 ascii_to_text(buf, macro__buf);
2757 /* Display the current action */
2761 msg_print(_("マクロを確認しました。", "Found a macro."));
2765 /* Create a macro */
2769 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2772 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2774 /* Get a macro trigger */
2775 do_cmd_macro_aux(buf);
2781 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2782 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2785 prt(_("マクロ行動: ", "Action: "), 20, 0);
2787 /* Convert to text */
2788 ascii_to_text(tmp, macro__buf);
2790 /* Get an encoded action */
2791 if (askfor(tmp, 80))
2793 /* Convert to ascii */
2794 text_to_ascii(macro__buf, tmp);
2796 /* Link the macro */
2797 macro_add(buf, macro__buf);
2800 msg_print(_("マクロを追加しました。", "Added a macro."));
2804 /* Remove a macro */
2808 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2811 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2813 /* Get a macro trigger */
2814 do_cmd_macro_aux(buf);
2816 /* Link the macro */
2817 macro_add(buf, buf);
2820 msg_print(_("マクロを削除しました。", "Removed a macro."));
2827 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2830 prt(_("ファイル: ", "File: "), 18, 0);
2832 /* Default filename */
2833 sprintf(tmp, "%s.prf", player_base);
2835 /* Ask for a file */
2836 if (!askfor(tmp, 80)) continue;
2838 /* Dump the macros */
2839 (void)keymap_dump(tmp);
2842 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2845 /* Query a keymap */
2851 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2854 prt(_("押すキー: ", "Keypress: "), 18, 0);
2856 /* Get a keymap trigger */
2857 do_cmd_macro_aux_keymap(buf);
2859 /* Look up the keymap */
2860 act = keymap_act[mode][(byte)(buf[0])];
2866 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2872 /* Obtain the action */
2873 strcpy(macro__buf, act);
2875 /* Analyze the current action */
2876 ascii_to_text(buf, macro__buf);
2878 /* Display the current action */
2882 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2886 /* Create a keymap */
2890 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2893 prt(_("押すキー: ", "Keypress: "), 18, 0);
2895 /* Get a keymap trigger */
2896 do_cmd_macro_aux_keymap(buf);
2902 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2903 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2906 prt(_("行動: ", "Action: "), 20, 0);
2908 /* Convert to text */
2909 ascii_to_text(tmp, macro__buf);
2911 /* Get an encoded action */
2912 if (askfor(tmp, 80))
2914 /* Convert to ascii */
2915 text_to_ascii(macro__buf, tmp);
2917 /* Free old keymap */
2918 string_free(keymap_act[mode][(byte)(buf[0])]);
2920 /* Make new keymap */
2921 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2924 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2928 /* Remove a keymap */
2932 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
2935 prt(_("押すキー: ", "Keypress: "), 18, 0);
2937 /* Get a keymap trigger */
2938 do_cmd_macro_aux_keymap(buf);
2940 /* Free old keymap */
2941 string_free(keymap_act[mode][(byte)(buf[0])]);
2943 /* Make new keymap */
2944 keymap_act[mode][(byte)(buf[0])] = NULL;
2947 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
2950 /* Enter a new action */
2954 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
2960 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2961 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2964 prt(_("マクロ行動: ", "Action: "), 20, 0);
2966 /* Hack -- limit the value */
2969 /* Get an encoded action */
2970 if (!askfor(buf, 80)) continue;
2972 /* Extract an action */
2973 text_to_ascii(macro__buf, buf);
2976 #endif /* ALLOW_MACROS */
2983 /* Flush messages */
2992 * @brief キャラクタ色の明暗表現
2994 static cptr lighting_level_str[F_LIT_MAX] =
3009 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
3010 * @param i 指定対象となるキャラクタコード
3011 * @param num 指定されたビジュアルIDを返す参照ポインタ
3012 * @param max ビジュアルIDの最大数
3013 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
3015 static bool cmd_visuals_aux(int i, IDX *num, IDX max)
3022 sprintf(str, "%d", *num);
3024 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3027 tmp = (IDX)strtol(str, NULL, 0);
3028 if (tmp >= 0 && tmp < max)
3031 else if (isupper(i))
3032 *num = (*num + max - 1) % max;
3034 *num = (*num + 1) % max;
3040 * @brief キャラクタの変更メニュー表示
3041 * @param choice_msg 選択メッセージ
3044 static void print_visuals_menu(cptr choice_msg)
3046 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3048 /* Give some choices */
3049 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3051 #ifdef ALLOW_VISUALS
3052 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3053 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3054 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3055 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3056 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3057 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3058 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3059 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3060 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3061 #endif /* ALLOW_VISUALS */
3063 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3066 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3069 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx);
3070 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx);
3071 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level);
3074 * Interact with "visuals"
3076 void do_cmd_visuals(void)
3081 bool need_redraw = FALSE;
3082 const char *empty_symbol = "<< ? >>";
3084 if (use_bigtile) empty_symbol = "<< ?? >>";
3086 /* File type is "TEXT" */
3087 FILE_TYPE(FILE_TYPE_TEXT);
3089 /* Save the screen */
3092 /* Interact until done */
3098 /* Ask for a choice */
3099 print_visuals_menu(NULL);
3104 if (i == ESCAPE) break;
3108 /* Load a 'pref' file */
3111 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3114 prt(_("ファイル: ", "File: "), 17, 0);
3116 /* Default filename */
3117 sprintf(tmp, "%s.prf", player_base);
3120 if (!askfor(tmp, 70)) continue;
3122 /* Process the given filename */
3123 (void)process_pref_file(tmp);
3128 #ifdef ALLOW_VISUALS
3130 /* Dump monster attr/chars */
3133 static cptr mark = "Monster attr/chars";
3136 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3139 prt(_("ファイル: ", "File: "), 17, 0);
3141 /* Default filename */
3142 sprintf(tmp, "%s.prf", player_base);
3144 /* Get a filename */
3145 if (!askfor(tmp, 70)) continue;
3147 /* Build the filename */
3148 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3150 /* Append to the file */
3151 if (!open_auto_dump(buf, mark)) continue;
3154 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3157 for (i = 0; i < max_r_idx; i++)
3159 monster_race *r_ptr = &r_info[i];
3161 /* Skip non-entries */
3162 if (!r_ptr->name) continue;
3164 /* Dump a comment */
3165 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3167 /* Dump the monster attr/char info */
3168 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3169 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3175 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3180 /* Dump object attr/chars */
3183 static cptr mark = "Object attr/chars";
3184 KIND_OBJECT_IDX k_idx;
3187 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3190 prt(_("ファイル: ", "File: "), 17, 0);
3192 /* Default filename */
3193 sprintf(tmp, "%s.prf", player_base);
3195 /* Get a filename */
3196 if (!askfor(tmp, 70)) continue;
3198 /* Build the filename */
3199 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3201 /* Append to the file */
3202 if (!open_auto_dump(buf, mark)) continue;
3205 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3208 for (k_idx = 0; k_idx < max_k_idx; k_idx++)
3211 object_kind *k_ptr = &k_info[k_idx];
3213 /* Skip non-entries */
3214 if (!k_ptr->name) continue;
3219 strip_name(o_name, k_idx);
3225 /* Prepare dummy object */
3226 object_prep(&forge, k_idx);
3228 /* Get un-shuffled flavor name */
3229 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3232 /* Dump a comment */
3233 auto_dump_printf("# %s\n", o_name);
3235 /* Dump the object attr/char info */
3236 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", (int)k_idx,
3237 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3243 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3248 /* Dump feature attr/chars */
3251 static cptr mark = "Feature attr/chars";
3254 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3257 prt(_("ファイル: ", "File: "), 17, 0);
3259 /* Default filename */
3260 sprintf(tmp, "%s.prf", player_base);
3262 /* Get a filename */
3263 if (!askfor(tmp, 70)) continue;
3265 /* Build the filename */
3266 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3268 /* Append to the file */
3269 if (!open_auto_dump(buf, mark)) continue;
3272 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3275 for (i = 0; i < max_f_idx; i++)
3277 feature_type *f_ptr = &f_info[i];
3279 /* Skip non-entries */
3280 if (!f_ptr->name) continue;
3282 /* Skip mimiccing features */
3283 if (f_ptr->mimic != i) continue;
3285 /* Dump a comment */
3286 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3288 /* Dump the feature attr/char info */
3289 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3290 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3291 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3292 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3298 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3303 /* Modify monster attr/chars (numeric operation) */
3306 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3309 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3311 /* Hack -- query until done */
3314 monster_race *r_ptr = &r_info[r];
3318 TERM_COLOR da = r_ptr->d_attr;
3319 byte dc = r_ptr->d_char;
3320 TERM_COLOR ca = r_ptr->x_attr;
3321 byte cc = r_ptr->x_char;
3323 /* Label the object */
3324 Term_putstr(5, 17, -1, TERM_WHITE,
3325 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3327 /* Label the Default values */
3328 Term_putstr(10, 19, -1, TERM_WHITE,
3329 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3331 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3332 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3334 /* Label the Current values */
3335 Term_putstr(10, 20, -1, TERM_WHITE,
3336 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3338 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3339 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3342 Term_putstr(0, 22, -1, TERM_WHITE,
3343 _("コマンド (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): "));
3349 if (i == ESCAPE) break;
3351 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3352 else if (isupper(i)) c = 'a' + i - 'A';
3362 if (!cmd_visuals_aux(i, &r, max_r_idx))
3368 while (!r_info[r].name);
3372 t = (int)r_ptr->x_attr;
3373 (void)cmd_visuals_aux(i, &t, 256);
3374 r_ptr->x_attr = (byte)t;
3378 t = (int)r_ptr->x_char;
3379 (void)cmd_visuals_aux(i, &t, 256);
3380 r_ptr->x_char = (byte)t;
3384 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3388 print_visuals_menu(choice_msg);
3396 /* Modify object attr/chars (numeric operation) */
3399 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3401 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3403 /* Hack -- query until done */
3406 object_kind *k_ptr = &k_info[k];
3410 TERM_COLOR da = k_ptr->d_attr;
3411 SYMBOL_CODE dc = k_ptr->d_char;
3412 TERM_COLOR ca = k_ptr->x_attr;
3413 SYMBOL_CODE cc = k_ptr->x_char;
3415 /* Label the object */
3416 Term_putstr(5, 17, -1, TERM_WHITE,
3417 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3418 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3420 /* Label the Default values */
3421 Term_putstr(10, 19, -1, TERM_WHITE,
3422 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3424 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3425 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3427 /* Label the Current values */
3428 Term_putstr(10, 20, -1, TERM_WHITE,
3429 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3431 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3432 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3435 Term_putstr(0, 22, -1, TERM_WHITE,
3436 _("コマンド (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): "));
3442 if (i == ESCAPE) break;
3444 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3445 else if (isupper(i)) c = 'a' + i - 'A';
3455 if (!cmd_visuals_aux(i, &k, max_k_idx))
3461 while (!k_info[k].name);
3465 t = (int)k_ptr->x_attr;
3466 (void)cmd_visuals_aux(i, &t, 256);
3467 k_ptr->x_attr = (byte)t;
3471 t = (int)k_ptr->x_char;
3472 (void)cmd_visuals_aux(i, &t, 256);
3473 k_ptr->x_char = (byte)t;
3477 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3481 print_visuals_menu(choice_msg);
3489 /* Modify feature attr/chars (numeric operation) */
3492 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3494 static IDX lighting_level = F_LIT_STANDARD;
3495 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3497 /* Hack -- query until done */
3500 feature_type *f_ptr = &f_info[f];
3504 TERM_COLOR da = f_ptr->d_attr[lighting_level];
3505 byte dc = f_ptr->d_char[lighting_level];
3506 TERM_COLOR ca = f_ptr->x_attr[lighting_level];
3507 byte cc = f_ptr->x_char[lighting_level];
3509 /* Label the object */
3511 Term_putstr(5, 17, -1, TERM_WHITE,
3512 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3513 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3515 /* Label the Default values */
3516 Term_putstr(10, 19, -1, TERM_WHITE,
3517 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3519 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3520 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3522 /* Label the Current values */
3524 Term_putstr(10, 20, -1, TERM_WHITE,
3525 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3527 Term_putstr(10, 20, -1, TERM_WHITE,
3528 format("Current attr/char = %3d / %3d", ca, cc));
3531 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3532 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3536 Term_putstr(0, 22, -1, TERM_WHITE,
3537 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3539 Term_putstr(0, 22, -1, TERM_WHITE,
3540 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3547 if (i == ESCAPE) break;
3549 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3550 else if (isupper(i)) c = 'a' + i - 'A';
3560 if (!cmd_visuals_aux(i, &f, max_f_idx))
3566 while (!f_info[f].name || (f_info[f].mimic != f));
3570 t = (int)f_ptr->x_attr[lighting_level];
3571 (void)cmd_visuals_aux(i, &t, 256);
3572 f_ptr->x_attr[lighting_level] = (byte)t;
3576 t = (int)f_ptr->x_char[lighting_level];
3577 (void)cmd_visuals_aux(i, &t, 256);
3578 f_ptr->x_char[lighting_level] = (byte)t;
3582 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3585 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3589 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3593 print_visuals_menu(choice_msg);
3601 /* Modify monster attr/chars (visual mode) */
3603 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3606 /* Modify object attr/chars (visual mode) */
3608 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3611 /* Modify feature attr/chars (visual mode) */
3614 IDX lighting_level = F_LIT_STANDARD;
3615 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3619 #endif /* ALLOW_VISUALS */
3627 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3631 /* Unknown option */
3637 /* Flush messages */
3641 /* Restore the screen */
3644 if (need_redraw) do_cmd_redraw();
3649 * Interact with "colors"
3651 void do_cmd_colors(void)
3660 /* File type is "TEXT" */
3661 FILE_TYPE(FILE_TYPE_TEXT);
3664 /* Save the screen */
3668 /* Interact until done */
3674 /* Ask for a choice */
3675 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3677 /* Give some choices */
3678 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3681 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3682 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3686 prt(_("コマンド: ", "Command: "), 8, 0);
3690 if (i == ESCAPE) break;
3692 /* Load a 'pref' file */
3696 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3699 prt(_("ファイル: ", "File: "), 10, 0);
3702 sprintf(tmp, "%s.prf", player_base);
3705 if (!askfor(tmp, 70)) continue;
3707 /* Process the given filename */
3708 (void)process_pref_file(tmp);
3710 /* Mega-Hack -- react to changes */
3711 Term_xtra(TERM_XTRA_REACT, 0);
3713 /* Mega-Hack -- redraw */
3722 static cptr mark = "Colors";
3725 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3728 prt(_("ファイル: ", "File: "), 10, 0);
3730 /* Default filename */
3731 sprintf(tmp, "%s.prf", player_base);
3733 /* Get a filename */
3734 if (!askfor(tmp, 70)) continue;
3736 /* Build the filename */
3737 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3739 /* Append to the file */
3740 if (!open_auto_dump(buf, mark)) continue;
3743 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3746 for (i = 0; i < 256; i++)
3748 int kv = angband_color_table[i][0];
3749 int rv = angband_color_table[i][1];
3750 int gv = angband_color_table[i][2];
3751 int bv = angband_color_table[i][3];
3753 cptr name = _("未知", "unknown");
3755 /* Skip non-entries */
3756 if (!kv && !rv && !gv && !bv) continue;
3758 /* Extract the color name */
3759 if (i < 16) name = color_names[i];
3761 /* Dump a comment */
3762 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3764 /* Dump the monster attr/char info */
3765 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3772 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3781 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3783 /* Hack -- query until done */
3792 /* Exhibit the normal colors */
3793 for (j = 0; j < 16; j++)
3795 /* Exhibit this color */
3796 Term_putstr(j*4, 20, -1, a, "###");
3798 /* Exhibit all colors */
3799 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3802 /* Describe the color */
3803 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3805 /* Describe the color */
3806 Term_putstr(5, 10, -1, TERM_WHITE,
3807 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3809 /* Label the Current values */
3810 Term_putstr(5, 12, -1, TERM_WHITE,
3811 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3812 angband_color_table[a][0],
3813 angband_color_table[a][1],
3814 angband_color_table[a][2],
3815 angband_color_table[a][3]));
3818 Term_putstr(0, 14, -1, TERM_WHITE,
3819 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3826 if (i == ESCAPE) break;
3829 if (i == 'n') a = (byte)(a + 1);
3830 if (i == 'N') a = (byte)(a - 1);
3831 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3832 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3833 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3834 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3835 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3836 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3837 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3838 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3840 /* Hack -- react to changes */
3841 Term_xtra(TERM_XTRA_REACT, 0);
3843 /* Hack -- redraw */
3850 /* Unknown option */
3856 /* Flush messages */
3861 /* Restore the screen */
3867 * Note something in the message recall
3869 void do_cmd_note(void)
3877 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3879 /* Ignore empty notes */
3880 if (!buf[0] || (buf[0] == ' ')) return;
3882 /* Add the note to the message recall */
3883 msg_format(_("メモ: %s", "Note: %s"), buf);
3888 * Mention the current version
3890 void do_cmd_version(void)
3894 #if FAKE_VER_EXTRA > 0
3895 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3896 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3898 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3899 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3906 * Array of feeling strings
3908 static cptr do_cmd_feeling_text[11] =
3910 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3911 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3912 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3913 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3914 _("とても悪い予感がする...", "You have a very bad feeling..."),
3915 _("悪い予感がする...", "You have a bad feeling..."),
3916 _("何か緊張する。", "You feel nervous."),
3917 _("少し不運な気がする...", "You feel your luck is turning..."),
3918 _("この場所は好きになれない。", "You don't like the look of this place."),
3919 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3920 _("なんて退屈なところだ...", "What a boring place...")
3923 static cptr do_cmd_feeling_text_combat[11] =
3925 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3926 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3927 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
3928 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3929 _("とても悪い予感がする...", "You have a very bad feeling..."),
3930 _("悪い予感がする...", "You have a bad feeling..."),
3931 _("何か緊張する。", "You feel nervous."),
3932 _("少し不運な気がする...", "You feel your luck is turning..."),
3933 _("この場所は好きになれない。", "You don't like the look of this place."),
3934 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3935 _("なんて退屈なところだ...", "What a boring place...")
3938 static cptr do_cmd_feeling_text_lucky[11] =
3940 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3941 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3942 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
3943 _("素晴らしい感じがする...", "You have an excellent feeling..."),
3944 _("とても良い感じがする...", "You have a very good feeling..."),
3945 _("良い感じがする...", "You have a good feeling..."),
3946 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
3947 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
3948 _("見た感じ悪くはない...", "You like the look of this place..."),
3949 _("全然駄目ということはないが...", "This level can't be all bad..."),
3950 _("なんて退屈なところだ...", "What a boring place...")
3955 * Note that "feeling" is set to zero unless some time has passed.
3956 * Note that this is done when the level is GENERATED, not entered.
3958 void do_cmd_feeling(void)
3960 /* No useful feeling in quests */
3961 if (p_ptr->inside_quest && !random_quest_number(dun_level))
3963 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
3967 /* No useful feeling in town */
3968 else if (p_ptr->town_num && !dun_level)
3970 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
3972 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
3977 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
3982 /* No useful feeling in the wilderness */
3983 else if (!dun_level)
3985 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
3989 /* Display the feeling */
3990 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
3991 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
3992 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
3993 inventory[INVEN_BOW].name1 == ART_CRIMSON)
3994 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
3996 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4002 * Description of each monster group.
4004 static cptr monster_group_text[] =
4007 "ユニーク", /* "Uniques" */
4008 "乗馬可能なモンスター", /* "Riding" */
4009 "賞金首", /* "Wanted */
4010 "アンバーの王族", /* "Ambertite" */
4039 /* "古代ドラゴン/ワイアーム", */
4100 /* "Ancient Dragon/Wyrm", */
4109 "Multi-Headed Reptile",
4114 "Reptile/Amphibian",
4115 "Spider/Scorpion/Tick",
4117 /* "Major Demon", */
4134 * Symbols of monsters in each group. Note the "Uniques" group
4135 * is handled differently.
4137 static cptr monster_group_char[] =
4194 "!$&()+./=>?[\\]`{|~",
4204 * hook function to sort monsters by level
4206 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4208 u16b *who = (u16b*)(u);
4213 monster_race *r_ptr1 = &r_info[w1];
4214 monster_race *r_ptr2 = &r_info[w2];
4219 if (r_ptr2->level > r_ptr1->level) return TRUE;
4220 if (r_ptr1->level > r_ptr2->level) return FALSE;
4222 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4223 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4228 * Build a list of monster indexes in the given group. Return the number
4229 * of monsters in the group.
4231 * mode & 0x01 : check for non-empty group
4232 * mode & 0x02 : visual operation only
4234 static IDX collect_monsters(IDX grp_cur, IDX mon_idx[], BIT_FLAGS8 mode)
4240 /* Get a list of x_char in this group */
4241 cptr group_char = monster_group_char[grp_cur];
4243 /* XXX Hack -- Check if this is the "Uniques" group */
4244 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4246 /* XXX Hack -- Check if this is the "Riding" group */
4247 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4249 /* XXX Hack -- Check if this is the "Wanted" group */
4250 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4252 /* XXX Hack -- Check if this is the "Amberite" group */
4253 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4256 /* Check every race */
4257 for (i = 0; i < max_r_idx; i++)
4259 /* Access the race */
4260 monster_race *r_ptr = &r_info[i];
4262 /* Skip empty race */
4263 if (!r_ptr->name) continue ;
4265 /* Require known monsters */
4266 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4270 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4273 else if (grp_riding)
4275 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4278 else if (grp_wanted)
4280 bool wanted = FALSE;
4282 for (j = 0; j < MAX_KUBI; j++)
4284 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4285 (p_ptr->today_mon && p_ptr->today_mon == i))
4291 if (!wanted) continue;
4294 else if (grp_amberite)
4296 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4301 /* Check for race in the group */
4302 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4306 mon_idx[mon_cnt++] = i;
4308 /* XXX Hack -- Just checking for non-empty group */
4309 if (mode & 0x01) break;
4312 /* Terminate the list */
4313 mon_idx[mon_cnt] = -1;
4315 /* Select the sort method */
4316 ang_sort_comp = ang_sort_comp_monster_level;
4317 ang_sort_swap = ang_sort_swap_hook;
4319 /* Sort by monster level */
4320 ang_sort(mon_idx, &dummy_why, mon_cnt);
4322 /* Return the number of races */
4328 * Description of each monster group.
4330 static cptr object_group_text[] =
4333 "キノコ", /* "Mushrooms" */
4334 "薬", /* "Potions" */
4335 "油つぼ", /* "Flasks" */
4336 "巻物", /* "Scrolls" */
4338 "アミュレット", /* "Amulets" */
4339 "笛", /* "Whistle" */
4340 "光源", /* "Lanterns" */
4341 "魔法棒", /* "Wands" */
4344 "カード", /* "Cards" */
4355 "刀剣類", /* "Swords" */
4356 "鈍器", /* "Blunt Weapons" */
4357 "長柄武器", /* "Polearms" */
4358 "採掘道具", /* "Diggers" */
4359 "飛び道具", /* "Bows" */
4363 "軽装鎧", /* "Soft Armor" */
4364 "重装鎧", /* "Hard Armor" */
4365 "ドラゴン鎧", /* "Dragon Armor" */
4366 "盾", /* "Shields" */
4367 "クローク", /* "Cloaks" */
4368 "籠手", /* "Gloves" */
4369 "ヘルメット", /* "Helms" */
4371 "ブーツ", /* "Boots" */
4424 * TVALs of items in each group
4426 static byte object_group_tval[] =
4467 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4475 * Build a list of object indexes in the given group. Return the number
4476 * of objects in the group.
4478 * mode & 0x01 : check for non-empty group
4479 * mode & 0x02 : visual operation only
4481 static int collect_objects(int grp_cur, IDX object_idx[], BIT_FLAGS8 mode)
4484 int j, k, object_cnt = 0;
4486 /* Get a list of x_char in this group */
4487 byte group_tval = object_group_tval[grp_cur];
4489 /* Check every object */
4490 for (i = 0; i < max_k_idx; i++)
4492 /* Access the object */
4493 object_kind *k_ptr = &k_info[i];
4495 /* Skip empty objects */
4496 if (!k_ptr->name) continue;
4500 /* Any objects will be displayed */
4506 /* Skip non-flavoured objects */
4507 if (!k_ptr->flavor) continue;
4509 /* Require objects ever seen */
4510 if (!k_ptr->aware) continue;
4513 /* Skip items with no distribution (special artifacts) */
4514 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4518 /* Check for objects in the group */
4519 if (TV_LIFE_BOOK == group_tval)
4521 /* Hack -- All spell books */
4522 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4524 /* Add the object */
4525 object_idx[object_cnt++] = i;
4529 else if (k_ptr->tval == group_tval)
4531 /* Add the object */
4532 object_idx[object_cnt++] = i;
4536 /* XXX Hack -- Just checking for non-empty group */
4537 if (mode & 0x01) break;
4540 /* Terminate the list */
4541 object_idx[object_cnt] = -1;
4543 /* Return the number of objects */
4549 * Description of each feature group.
4551 static cptr feature_group_text[] =
4559 * Build a list of feature indexes in the given group. Return the number
4560 * of features in the group.
4562 * mode & 0x01 : check for non-empty group
4564 static int collect_features(int grp_cur, IDX *feat_idx, BIT_FLAGS8 mode)
4569 /* Unused; There is a single group. */
4572 /* Check every feature */
4573 for (i = 0; i < max_f_idx; i++)
4575 /* Access the index */
4576 feature_type *f_ptr = &f_info[i];
4578 /* Skip empty index */
4579 if (!f_ptr->name) continue;
4581 /* Skip mimiccing features */
4582 if (f_ptr->mimic != i) continue;
4585 feat_idx[feat_cnt++] = i;
4587 /* XXX Hack -- Just checking for non-empty group */
4588 if (mode & 0x01) break;
4591 /* Terminate the list */
4592 feat_idx[feat_cnt] = -1;
4594 /* Return the number of races */
4601 * Build a list of monster indexes in the given group. Return the number
4602 * of monsters in the group.
4604 static int collect_artifacts(int grp_cur, int object_idx[])
4606 int i, object_cnt = 0;
4608 /* Get a list of x_char in this group */
4609 byte group_tval = object_group_tval[grp_cur];
4611 /* Check every object */
4612 for (i = 0; i < max_a_idx; i++)
4614 /* Access the artifact */
4615 artifact_type *a_ptr = &a_info[i];
4617 /* Skip empty artifacts */
4618 if (!a_ptr->name) continue;
4620 /* Skip "uncreated" artifacts */
4621 if (!a_ptr->cur_num) continue;
4623 /* Check for race in the group */
4624 if (a_ptr->tval == group_tval)
4627 object_idx[object_cnt++] = i;
4631 /* Terminate the list */
4632 object_idx[object_cnt] = 0;
4634 /* Return the number of races */
4641 * Encode the screen colors
4643 static char hack[17] = "dwsorgbuDWvyRGBU";
4647 * Hack -- load a screen dump from a file
4649 void do_cmd_load_screen(void)
4664 Term_get_size(&wid, &hgt);
4666 /* Build the filename */
4667 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4669 /* Append to the file */
4670 fff = my_fopen(buf, "r");
4673 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4679 /* Save the screen */
4682 /* Clear the screen */
4686 /* Load the screen */
4687 for (y = 0; okay; y++)
4689 /* Get a line of data including control code */
4690 if (!fgets(buf, 1024, fff)) okay = FALSE;
4692 /* Get the blank line */
4693 if (buf[0] == '\n' || buf[0] == '\0') break;
4695 /* Ignore too large screen image */
4696 if (y >= hgt) continue;
4699 for (x = 0; x < wid - 1; x++)
4702 if (buf[x] == '\n' || buf[x] == '\0') break;
4704 /* Put the attr/char */
4705 Term_draw(x, y, TERM_WHITE, buf[x]);
4709 /* Dump the screen */
4710 for (y = 0; okay; y++)
4712 /* Get a line of data including control code */
4713 if (!fgets(buf, 1024, fff)) okay = FALSE;
4715 /* Get the blank line */
4716 if (buf[0] == '\n' || buf[0] == '\0') break;
4718 /* Ignore too large screen image */
4719 if (y >= hgt) continue;
4722 for (x = 0; x < wid - 1; x++)
4725 if (buf[x] == '\n' || buf[x] == '\0') break;
4727 /* Get the attr/char */
4728 (void)(Term_what(x, y, &a, &c));
4730 /* Look up the attr */
4731 for (i = 0; i < 16; i++)
4733 /* Use attr matches */
4734 if (hack[i] == buf[x]) a = (byte_hack)i;
4737 /* Put the attr/char */
4738 Term_draw(x, y, a, c);
4747 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4753 /* Restore the screen */
4760 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4761 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4764 #define IM_FLAG_STR _("*", "* ")
4765 #define HAS_FLAG_STR _("+", "+ ")
4766 #define NO_FLAG_STR _("・", ". ")
4768 #define print_im_or_res_flag(IM, RES) \
4770 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4771 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4774 #define print_flag(TR) \
4776 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4780 /* XTRA HACK RESLIST */
4781 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, OBJECT_TYPE_VALUE tval, char *where)
4783 char o_name[MAX_NLEN];
4784 BIT_FLAGS flgs[TR_FLAG_SIZE];
4786 if (!o_ptr->k_idx) return;
4787 if (o_ptr->tval != tval) return;
4789 /* Identified items only */
4790 if (!object_is_known(o_ptr)) return;
4793 * HACK:Ring of Lordly protection and Dragon equipment
4794 * have random resistances.
4796 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4797 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4798 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4799 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4800 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4801 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4802 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4803 || object_is_artifact(o_ptr))
4806 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4808 while (o_name[i] && (i < 26))
4811 if (iskanji(o_name[i])) i++;
4820 o_name[i] = ' '; i++;
4825 fprintf(fff, "%s %s", where, o_name);
4827 if (!(o_ptr->ident & (IDENT_MENTAL)))
4829 fputs(_("-------不明--------------- -------不明---------\n",
4830 "-------unknown------------ -------unknown------\n"), fff);
4834 object_flags_known(o_ptr, flgs);
4836 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4837 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4838 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4839 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4840 print_flag(TR_RES_POIS);
4841 print_flag(TR_RES_LITE);
4842 print_flag(TR_RES_DARK);
4843 print_flag(TR_RES_SHARDS);
4844 print_flag(TR_RES_SOUND);
4845 print_flag(TR_RES_NETHER);
4846 print_flag(TR_RES_NEXUS);
4847 print_flag(TR_RES_CHAOS);
4848 print_flag(TR_RES_DISEN);
4852 print_flag(TR_RES_BLIND);
4853 print_flag(TR_RES_FEAR);
4854 print_flag(TR_RES_CONF);
4855 print_flag(TR_FREE_ACT);
4856 print_flag(TR_SEE_INVIS);
4857 print_flag(TR_HOLD_EXP);
4858 print_flag(TR_TELEPATHY);
4859 print_flag(TR_SLOW_DIGEST);
4860 print_flag(TR_REGEN);
4861 print_flag(TR_LEVITATION);
4869 fprintf(fff, "%s\n", inven_res_label);
4875 * Display *ID* ed weapons/armors's resistances
4877 static void do_cmd_knowledge_inven(void)
4881 char file_name[1024];
4885 OBJECT_TYPE_VALUE tval;
4891 /* Open a new file */
4892 fff = my_fopen_temp(file_name, 1024);
4895 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4899 fprintf(fff, "%s\n", inven_res_label);
4901 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4905 for (; j < 9; j++) fputc('\n', fff);
4907 fprintf(fff, "%s\n", inven_res_label);
4909 strcpy(where, _("装", "E "));
4910 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4912 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4914 strcpy(where, _("持", "I "));
4915 for (i = 0; i < INVEN_PACK; i++)
4917 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4920 st_ptr = &town[1].store[STORE_HOME];
4921 strcpy(where, _("家", "H "));
4922 for (i = 0; i < st_ptr->stock_num; i++)
4924 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
4928 /* Close the file */
4931 /* Display the file contents */
4932 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
4934 /* Remove the file */
4939 void do_cmd_save_screen_html_aux(char *filename, int message)
4943 TERM_COLOR a = 0, old_a = 0;
4957 cptr html_head[] = {
4958 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
4962 cptr html_foot[] = {
4964 "</body>\n</html>\n",
4970 Term_get_size(&wid, &hgt);
4972 /* File type is "TEXT" */
4973 FILE_TYPE(FILE_TYPE_TEXT);
4975 /* Append to the file */
4976 fff = my_fopen(filename, "w");
4980 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
4987 /* Save the screen */
4991 /* Build the filename */
4992 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
4993 tmpfff = my_fopen(buf, "r");
4995 for (i = 0; html_head[i]; i++)
4996 fputs(html_head[i], fff);
5000 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5002 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5006 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5008 fprintf(fff, "%s\n", buf);
5013 /* Dump the screen */
5014 for (y = 0; y < hgt; y++)
5021 for (x = 0; x < wid - 1; x++)
5025 /* Get the attr/char */
5026 (void)(Term_what(x, y, &a, &c));
5030 case '&': cc = "&"; break;
5031 case '<': cc = "<"; break;
5032 case '>': cc = ">"; break;
5034 case 0x1f: c = '.'; break;
5035 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5040 if ((y == 0 && x == 0) || a != old_a) {
5041 rv = angband_color_table[a][1];
5042 gv = angband_color_table[a][2];
5043 bv = angband_color_table[a][3];
5044 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5045 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5049 fprintf(fff, "%s", cc);
5051 fprintf(fff, "%c", c);
5054 fprintf(fff, "</font>");
5057 for (i = 0; html_foot[i]; i++)
5058 fputs(html_foot[i], fff);
5063 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5065 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5069 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5071 fprintf(fff, "%s\n", buf);
5084 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5088 /* Restore the screen */
5094 * Hack -- save a screen dump to a file
5096 static void do_cmd_save_screen_html(void)
5098 char buf[1024], tmp[256] = "screen.html";
5100 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5103 /* Build the filename */
5104 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5108 do_cmd_save_screen_html_aux(buf, 1);
5113 * Redefinable "save_screen" action
5115 void (*screendump_aux)(void) = NULL;
5119 * Hack -- save a screen dump to a file
5121 void do_cmd_save_screen(void)
5123 bool old_use_graphics = use_graphics;
5124 bool html_dump = FALSE;
5128 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5132 if (c == 'Y' || c == 'y')
5134 else if (c == 'H' || c == 'h')
5146 Term_get_size(&wid, &hgt);
5148 if (old_use_graphics)
5150 use_graphics = FALSE;
5153 /* Redraw everything */
5154 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5156 /* Hack -- update */
5162 do_cmd_save_screen_html();
5166 /* Do we use a special screendump function ? */
5167 else if (screendump_aux)
5169 /* Dump the screen to a graphics file */
5170 (*screendump_aux)();
5172 else /* Dump the screen as text */
5183 /* Build the filename */
5184 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5186 /* File type is "TEXT" */
5187 FILE_TYPE(FILE_TYPE_TEXT);
5189 /* Append to the file */
5190 fff = my_fopen(buf, "w");
5194 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5200 /* Save the screen */
5204 /* Dump the screen */
5205 for (y = 0; y < hgt; y++)
5208 for (x = 0; x < wid - 1; x++)
5210 /* Get the attr/char */
5211 (void)(Term_what(x, y, &a, &c));
5221 fprintf(fff, "%s\n", buf);
5228 /* Dump the screen */
5229 for (y = 0; y < hgt; y++)
5232 for (x = 0; x < wid - 1; x++)
5234 /* Get the attr/char */
5235 (void)(Term_what(x, y, &a, &c));
5238 buf[x] = hack[a&0x0F];
5245 fprintf(fff, "%s\n", buf);
5255 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5258 /* Restore the screen */
5262 if (old_use_graphics)
5264 use_graphics = TRUE;
5267 /* Redraw everything */
5268 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5270 /* Hack -- update */
5277 * Sorting hook -- Comp function -- see below
5279 * We use "u" to point to array of monster indexes,
5280 * and "v" to select the type of sorting to perform on "u".
5282 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5284 u16b *who = (u16b*)(u);
5286 u16b *why = (u16b*)(v);
5293 /* Sort by total kills */
5296 /* Extract total kills */
5297 z1 = a_info[w1].tval;
5298 z2 = a_info[w2].tval;
5300 /* Compare total kills */
5301 if (z1 < z2) return (TRUE);
5302 if (z1 > z2) return (FALSE);
5306 /* Sort by monster level */
5309 /* Extract levels */
5310 z1 = a_info[w1].sval;
5311 z2 = a_info[w2].sval;
5313 /* Compare levels */
5314 if (z1 < z2) return (TRUE);
5315 if (z1 > z2) return (FALSE);
5319 /* Sort by monster experience */
5322 /* Extract experience */
5323 z1 = a_info[w1].level;
5324 z2 = a_info[w2].level;
5326 /* Compare experience */
5327 if (z1 < z2) return (TRUE);
5328 if (z1 > z2) return (FALSE);
5332 /* Compare indexes */
5338 * Sorting hook -- Swap function -- see below
5340 * We use "u" to point to array of monster indexes,
5341 * and "v" to select the type of sorting to perform.
5343 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5345 u16b *who = (u16b*)(u);
5360 * Check the status of "artifacts"
5362 static void do_cmd_knowledge_artifacts(void)
5374 char file_name[1024];
5376 char base_name[MAX_NLEN];
5380 /* Open a new file */
5381 fff = my_fopen_temp(file_name, 1024);
5384 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5389 /* Allocate the "who" array */
5390 C_MAKE(who, max_a_idx, s16b);
5392 /* Allocate the "okay" array */
5393 C_MAKE(okay, max_a_idx, bool);
5395 /* Scan the artifacts */
5396 for (k = 0; k < max_a_idx; k++)
5398 artifact_type *a_ptr = &a_info[k];
5403 /* Skip "empty" artifacts */
5404 if (!a_ptr->name) continue;
5406 /* Skip "uncreated" artifacts */
5407 if (!a_ptr->cur_num) continue;
5413 /* Check the dungeon */
5414 for (y = 0; y < cur_hgt; y++)
5416 for (x = 0; x < cur_wid; x++)
5418 cave_type *c_ptr = &cave[y][x];
5420 OBJECT_IDX this_o_idx, next_o_idx = 0;
5422 /* Scan all objects in the grid */
5423 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5427 /* Acquire object */
5428 o_ptr = &o_list[this_o_idx];
5430 /* Acquire next object */
5431 next_o_idx = o_ptr->next_o_idx;
5433 /* Ignore non-artifacts */
5434 if (!object_is_fixed_artifact(o_ptr)) continue;
5436 /* Ignore known items */
5437 if (object_is_known(o_ptr)) continue;
5439 /* Note the artifact */
5440 okay[o_ptr->name1] = FALSE;
5445 /* Check the inventory and equipment */
5446 for (i = 0; i < INVEN_TOTAL; i++)
5448 object_type *o_ptr = &inventory[i];
5450 /* Ignore non-objects */
5451 if (!o_ptr->k_idx) continue;
5453 /* Ignore non-artifacts */
5454 if (!object_is_fixed_artifact(o_ptr)) continue;
5456 /* Ignore known items */
5457 if (object_is_known(o_ptr)) continue;
5459 /* Note the artifact */
5460 okay[o_ptr->name1] = FALSE;
5463 for (k = 0; k < max_a_idx; k++)
5465 if (okay[k]) who[n++] = k;
5468 /* Select the sort method */
5469 ang_sort_comp = ang_sort_art_comp;
5470 ang_sort_swap = ang_sort_art_swap;
5472 /* Sort the array by dungeon depth of monsters */
5473 ang_sort(who, &why, n);
5475 /* Scan the artifacts */
5476 for (k = 0; k < n; k++)
5478 artifact_type *a_ptr = &a_info[who[k]];
5481 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5483 /* Obtain the base object type */
5484 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5492 /* Get local object */
5495 /* Create fake object */
5496 object_prep(q_ptr, z);
5498 /* Make it an artifact */
5499 q_ptr->name1 = (byte)who[k];
5501 /* Display as if known */
5502 q_ptr->ident |= IDENT_STORE;
5504 /* Describe the artifact */
5505 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5508 /* Hack -- Build the artifact name */
5509 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5512 /* Free the "who" array */
5513 C_KILL(who, max_a_idx, s16b);
5515 /* Free the "okay" array */
5516 C_KILL(okay, max_a_idx, bool);
5518 /* Close the file */
5521 /* Display the file contents */
5522 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5524 /* Remove the file */
5530 * Display known uniques
5531 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5533 static void do_cmd_knowledge_uniques(void)
5542 char file_name[1024];
5545 int n_alive_surface = 0;
5546 int n_alive_over100 = 0;
5547 int n_alive_total = 0;
5550 for (i = 0; i < 10; i++) n_alive[i] = 0;
5552 /* Open a new file */
5553 fff = my_fopen_temp(file_name, 1024);
5557 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5562 /* Allocate the "who" array */
5563 C_MAKE(who, max_r_idx, s16b);
5565 /* Scan the monsters */
5566 for (i = 1; i < max_r_idx; i++)
5568 monster_race *r_ptr = &r_info[i];
5571 if (!r_ptr->name) continue;
5573 /* Require unique monsters */
5574 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5576 /* Only display "known" uniques */
5577 if (!cheat_know && !r_ptr->r_sights) continue;
5579 /* Only print rarity <= 100 uniques */
5580 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5582 /* Only "alive" uniques */
5583 if (r_ptr->max_num == 0) continue;
5587 lev = (r_ptr->level - 1) / 10;
5591 if (max_lev < lev) max_lev = lev;
5593 else n_alive_over100++;
5595 else n_alive_surface++;
5597 /* Collect "appropriate" monsters */
5601 /* Select the sort method */
5602 ang_sort_comp = ang_sort_comp_hook;
5603 ang_sort_swap = ang_sort_swap_hook;
5605 /* Sort the array by dungeon depth of monsters */
5606 ang_sort(who, &why, n);
5608 if (n_alive_surface)
5610 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5611 n_alive_total += n_alive_surface;
5613 for (i = 0; i <= max_lev; i++)
5615 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5616 n_alive_total += n_alive[i];
5618 if (n_alive_over100)
5620 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5621 n_alive_total += n_alive_over100;
5626 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5627 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5631 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5634 /* Scan the monster races */
5635 for (k = 0; k < n; k++)
5637 monster_race *r_ptr = &r_info[who[k]];
5639 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, (int)r_ptr->level);
5642 /* Free the "who" array */
5643 C_KILL(who, max_r_idx, s16b);
5645 /* Close the file */
5648 /* Display the file contents */
5649 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5651 /* Remove the file */
5657 * Display weapon-exp
5659 static void do_cmd_knowledge_weapon_exp(void)
5661 int i, num, weapon_exp;
5666 char file_name[1024];
5669 /* Open a new file */
5670 fff = my_fopen_temp(file_name, 1024);
5672 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5677 for (i = 0; i < 5; i++)
5679 for (num = 0; num < 64; num++)
5681 for (j = 0; j < max_k_idx; j++)
5683 object_kind *k_ptr = &k_info[j];
5685 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5687 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5689 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5691 fprintf(fff, "%-25s ", tmp);
5692 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5693 else fprintf(fff, " ");
5694 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5695 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5703 /* Close the file */
5706 /* Display the file contents */
5707 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5709 /* Remove the file */
5715 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5719 static void do_cmd_knowledge_spell_exp(void)
5722 int spell_exp, exp_level;
5725 const magic_type *s_ptr;
5727 char file_name[1024];
5729 /* Open a new file */
5730 fff = my_fopen_temp(file_name, 1024);
5732 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5737 if (p_ptr->realm1 != REALM_NONE)
5739 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5740 for (i = 0; i < 32; i++)
5742 if (!is_magic(p_ptr->realm1))
5744 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5748 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5750 if (s_ptr->slevel >= 99) continue;
5751 spell_exp = p_ptr->spell_exp[i];
5752 exp_level = spell_exp_level(spell_exp);
5753 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5754 if (p_ptr->realm1 == REALM_HISSATSU)
5755 fprintf(fff, "[--]");
5758 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5759 else fprintf(fff, " ");
5760 fprintf(fff, "%s", exp_level_str[exp_level]);
5762 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5767 if (p_ptr->realm2 != REALM_NONE)
5769 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5770 for (i = 0; i < 32; i++)
5772 if (!is_magic(p_ptr->realm1))
5774 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5778 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5780 if (s_ptr->slevel >= 99) continue;
5782 spell_exp = p_ptr->spell_exp[i + 32];
5783 exp_level = spell_exp_level(spell_exp);
5784 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5785 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5786 else fprintf(fff, " ");
5787 fprintf(fff, "%s", exp_level_str[exp_level]);
5788 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5793 /* Close the file */
5796 /* Display the file contents */
5797 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5799 /* Remove the file */
5805 * @brief スキル情報を表示するコマンドのメインルーチン /
5809 static void do_cmd_knowledge_skill_exp(void)
5811 int i = 0, skill_exp;
5815 char file_name[1024];
5816 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5817 _("二刀流 ", "Dual Wielding "),
5818 _("乗馬 ", "Riding ")};
5820 /* Open a new file */
5821 fff = my_fopen_temp(file_name, 1024);
5823 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5828 for (i = 0; i < 3; i++)
5830 skill_exp = p_ptr->skill_exp[i];
5831 fprintf(fff, "%-20s ", skill_name[i]);
5832 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5833 else fprintf(fff, " ");
5834 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5835 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5839 /* Close the file */
5842 /* Display the file contents */
5843 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5845 /* Remove the file */
5851 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5852 * @param Name 変換したい文字列の参照ポインタ
5855 void plural_aux(char *Name)
5857 int NameLen = strlen(Name);
5859 if (my_strstr(Name, "Disembodied hand"))
5861 strcpy(Name, "Disembodied hands that strangled people");
5863 else if (my_strstr(Name, "Colour out of space"))
5865 strcpy(Name, "Colours out of space");
5867 else if (my_strstr(Name, "stairway to hell"))
5869 strcpy(Name, "stairways to hell");
5871 else if (my_strstr(Name, "Dweller on the threshold"))
5873 strcpy(Name, "Dwellers on the threshold");
5875 else if (my_strstr(Name, " of "))
5877 cptr aider = my_strstr(Name, " of ");
5888 if (dummy[i-1] == 's')
5890 strcpy(&(dummy[i]), "es");
5895 strcpy(&(dummy[i]), "s");
5898 strcpy(&(dummy[i+1]), aider);
5899 strcpy(Name, dummy);
5901 else if (my_strstr(Name, "coins"))
5904 strcpy(dummy, "piles of ");
5905 strcat(dummy, Name);
5906 strcpy(Name, dummy);
5909 else if (my_strstr(Name, "Manes"))
5913 else if (streq(&(Name[NameLen - 2]), "ey"))
5915 strcpy(&(Name[NameLen - 2]), "eys");
5917 else if (Name[NameLen - 1] == 'y')
5919 strcpy(&(Name[NameLen - 1]), "ies");
5921 else if (streq(&(Name[NameLen - 4]), "ouse"))
5923 strcpy(&(Name[NameLen - 4]), "ice");
5925 else if (streq(&(Name[NameLen - 2]), "us"))
5927 strcpy(&(Name[NameLen - 2]), "i");
5929 else if (streq(&(Name[NameLen - 6]), "kelman"))
5931 strcpy(&(Name[NameLen - 6]), "kelmen");
5933 else if (streq(&(Name[NameLen - 8]), "wordsman"))
5935 strcpy(&(Name[NameLen - 8]), "wordsmen");
5937 else if (streq(&(Name[NameLen - 7]), "oodsman"))
5939 strcpy(&(Name[NameLen - 7]), "oodsmen");
5941 else if (streq(&(Name[NameLen - 7]), "eastman"))
5943 strcpy(&(Name[NameLen - 7]), "eastmen");
5945 else if (streq(&(Name[NameLen - 8]), "izardman"))
5947 strcpy(&(Name[NameLen - 8]), "izardmen");
5949 else if (streq(&(Name[NameLen - 5]), "geist"))
5951 strcpy(&(Name[NameLen - 5]), "geister");
5953 else if (streq(&(Name[NameLen - 2]), "ex"))
5955 strcpy(&(Name[NameLen - 2]), "ices");
5957 else if (streq(&(Name[NameLen - 2]), "lf"))
5959 strcpy(&(Name[NameLen - 2]), "lves");
5961 else if (suffix(Name, "ch") ||
5962 suffix(Name, "sh") ||
5963 suffix(Name, "nx") ||
5964 suffix(Name, "s") ||
5967 strcpy(&(Name[NameLen]), "es");
5971 strcpy(&(Name[NameLen]), "s");
5976 * @brief 現在のペットを表示するコマンドのメインルーチン /
5977 * Display current pets
5980 static void do_cmd_knowledge_pets(void)
5984 monster_type *m_ptr;
5987 int show_upkeep = 0;
5988 char file_name[1024];
5991 /* Open a new file */
5992 fff = my_fopen_temp(file_name, 1024);
5994 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5999 /* Process the monsters (backwards) */
6000 for (i = m_max - 1; i >= 1; i--)
6002 /* Access the monster */
6005 /* Ignore "dead" monsters */
6006 if (!m_ptr->r_idx) continue;
6008 /* Calculate "upkeep" for pets */
6012 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6013 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6017 show_upkeep = calculate_upkeep();
6019 fprintf(fff, "----------------------------------------------\n");
6021 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6022 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6024 fprintf(fff, " Total: %d pet%s.\n",
6025 t_friends, (t_friends == 1 ? "" : "s"));
6026 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6031 /* Close the file */
6034 /* Display the file contents */
6035 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6037 /* Remove the file */
6043 * @brief 現在のペットを表示するコマンドのメインルーチン /
6046 * @note the player ghosts are ignored.
6048 static void do_cmd_knowledge_kill_count(void)
6057 char file_name[1024];
6062 /* Open a new file */
6063 fff = my_fopen_temp(file_name, 1024);
6066 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6071 /* Allocate the "who" array */
6072 C_MAKE(who, max_r_idx, s16b);
6075 /* Monsters slain */
6078 for (kk = 1; kk < max_r_idx; kk++)
6080 monster_race *r_ptr = &r_info[kk];
6082 if (r_ptr->flags1 & (RF1_UNIQUE))
6084 bool dead = (r_ptr->max_num == 0);
6093 MONSTER_NUMBER This = r_ptr->r_pkills;
6103 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6106 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6108 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6114 /* Scan the monsters */
6115 for (i = 1; i < max_r_idx; i++)
6117 monster_race *r_ptr = &r_info[i];
6119 /* Use that monster */
6120 if (r_ptr->name) who[n++] = i;
6123 /* Select the sort method */
6124 ang_sort_comp = ang_sort_comp_hook;
6125 ang_sort_swap = ang_sort_swap_hook;
6127 /* Sort the array by dungeon depth of monsters */
6128 ang_sort(who, &why, n);
6130 /* Scan the monster races */
6131 for (k = 0; k < n; k++)
6133 monster_race *r_ptr = &r_info[who[k]];
6135 if (r_ptr->flags1 & (RF1_UNIQUE))
6137 bool dead = (r_ptr->max_num == 0);
6141 fprintf(fff, " %s\n", (r_name + r_ptr->name));
6147 MONSTER_NUMBER This = r_ptr->r_pkills;
6152 /* p,tは人と数える by ita */
6153 if (my_strchr("pt", r_ptr->d_char))
6154 fprintf(fff, " %3d 人の %s\n", (int)This, r_name + r_ptr->name);
6156 fprintf(fff, " %3d 体の %s\n", (int)This, r_name + r_ptr->name);
6160 if (my_strstr(r_name + r_ptr->name, "coins"))
6162 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6166 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6172 strcpy(ToPlural, (r_name + r_ptr->name));
6173 plural_aux(ToPlural);
6174 fprintf(fff, " %d %s\n", This, ToPlural);
6184 fprintf(fff,"----------------------------------------------\n");
6186 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6188 fprintf(fff," Total: %lu creature%s killed.\n", (unsigned long int)Total, (Total == 1 ? "" : "s"));
6192 /* Free the "who" array */
6193 C_KILL(who, max_r_idx, s16b);
6195 /* Close the file */
6198 /* Display the file contents */
6199 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6201 /* Remove the file */
6207 * @brief モンスター情報リスト中のグループを表示する /
6208 * Display the object groups.
6212 * @param per_page リストの表示行
6213 * @param grp_idx グループのID配列
6214 * @param group_text グループ名の文字列配列
6215 * @param grp_cur 現在の選択ID
6216 * @param grp_top 現在の選択リスト最上部ID
6219 static void display_group_list(int col, int row, int wid, int per_page, IDX grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6223 /* Display lines until done */
6224 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6226 /* Get the group index */
6227 int grp = grp_idx[grp_top + i];
6229 /* Choose a color */
6230 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6232 /* Erase the entire line */
6233 Term_erase(col, row + i, wid);
6235 /* Display the group label */
6236 c_put_str(attr, group_text[grp], row + i, col);
6242 * Move the cursor in a browser window
6244 static void browser_cursor(char ch, int *column, IDX *grp_cur, int grp_cnt,
6245 IDX *list_cur, int list_cnt)
6250 IDX list = *list_cur;
6252 /* Extract direction */
6255 /* Hack -- scroll up full screen */
6260 /* Hack -- scroll down full screen */
6265 d = get_keymap_dir(ch);
6270 /* Diagonals - hack */
6271 if ((ddx[d] > 0) && ddy[d])
6276 Term_get_size(&wid, &hgt);
6278 browser_rows = hgt - 8;
6280 /* Browse group list */
6285 /* Move up or down */
6286 grp += ddy[d] * (browser_rows - 1);
6289 if (grp >= grp_cnt) grp = grp_cnt - 1;
6290 if (grp < 0) grp = 0;
6291 if (grp != old_grp) list = 0;
6294 /* Browse sub-list list */
6297 /* Move up or down */
6298 list += ddy[d] * browser_rows;
6301 if (list >= list_cnt) list = list_cnt - 1;
6302 if (list < 0) list = 0;
6314 if (col < 0) col = 0;
6315 if (col > 1) col = 1;
6322 /* Browse group list */
6327 /* Move up or down */
6331 if (grp >= grp_cnt) grp = grp_cnt - 1;
6332 if (grp < 0) grp = 0;
6333 if (grp != old_grp) list = 0;
6336 /* Browse sub-list list */
6339 /* Move up or down */
6343 if (list >= list_cnt) list = list_cnt - 1;
6344 if (list < 0) list = 0;
6355 static void display_visual_list(int col, int row, int height, int width, TERM_COLOR attr_top, byte char_left)
6359 /* Clear the display lines */
6360 for (i = 0; i < height; i++)
6362 Term_erase(col, row + i, width);
6365 /* Bigtile mode uses double width */
6366 if (use_bigtile) width /= 2;
6368 /* Display lines until done */
6369 for (i = 0; i < height; i++)
6371 /* Display columns until done */
6372 for (j = 0; j < width; j++)
6376 TERM_LEN x = col + j;
6377 TERM_LEN y = row + i;
6380 /* Bigtile mode uses double width */
6381 if (use_bigtile) x += j;
6386 /* Ignore illegal characters */
6387 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6388 (!use_graphics && ic > 0x7f))
6394 /* Force correct code for both ASCII character and tile */
6395 if (c & 0x80) a |= 0x80;
6397 /* Display symbol */
6398 Term_queue_bigchar(x, y, a, c, 0, 0);
6405 * Place the cursor at the collect position for visual mode
6407 static void place_visual_list_cursor(TERM_LEN col, TERM_LEN row, TERM_COLOR a, byte c, TERM_COLOR attr_top, byte char_left)
6409 int i = (a & 0x7f) - attr_top;
6410 int j = c - char_left;
6412 TERM_LEN x = col + j;
6413 TERM_LEN y = row + i;
6415 /* Bigtile mode uses double width */
6416 if (use_bigtile) x += j;
6418 /* Place the cursor */
6424 * Clipboard variables for copy&paste in visual mode
6426 static TERM_COLOR attr_idx = 0;
6427 static byte char_idx = 0;
6429 /* Hack -- for feature lighting */
6430 static TERM_COLOR attr_idx_feat[F_LIT_MAX];
6431 static byte char_idx_feat[F_LIT_MAX];
6434 * Do visual mode command -- Change symbols
6436 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6437 int height, int width,
6438 TERM_COLOR *attr_top_ptr, byte *char_left_ptr,
6439 TERM_COLOR *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6441 static TERM_COLOR attr_old = 0;
6442 static byte char_old = 0;
6447 if (*visual_list_ptr)
6450 *cur_attr_ptr = attr_old;
6451 *cur_char_ptr = char_old;
6452 *visual_list_ptr = FALSE;
6460 if (*visual_list_ptr)
6463 *visual_list_ptr = FALSE;
6464 *need_redraw = TRUE;
6472 if (!*visual_list_ptr)
6474 *visual_list_ptr = TRUE;
6476 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6477 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6479 attr_old = *cur_attr_ptr;
6480 char_old = *cur_char_ptr;
6491 /* Set the visual */
6492 attr_idx = *cur_attr_ptr;
6493 char_idx = *cur_char_ptr;
6495 /* Hack -- for feature lighting */
6496 for (i = 0; i < F_LIT_MAX; i++)
6498 attr_idx_feat[i] = 0;
6499 char_idx_feat[i] = 0;
6506 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6509 *cur_attr_ptr = attr_idx;
6510 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6511 if (!*visual_list_ptr) *need_redraw = TRUE;
6517 *cur_char_ptr = char_idx;
6518 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6519 if (!*visual_list_ptr) *need_redraw = TRUE;
6525 if (*visual_list_ptr)
6528 int d = get_keymap_dir(ch);
6529 byte a = (*cur_attr_ptr & 0x7f);
6530 byte c = *cur_char_ptr;
6532 if (use_bigtile) eff_width = width / 2;
6533 else eff_width = width;
6535 /* Restrict direction */
6536 if ((a == 0) && (ddy[d] < 0)) d = 0;
6537 if ((c == 0) && (ddx[d] < 0)) d = 0;
6538 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6539 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6544 /* Force correct code for both ASCII character and tile */
6545 if (c & 0x80) a |= 0x80;
6547 /* Set the visual */
6552 /* Move the frame */
6553 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6554 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6555 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6556 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6562 /* Visual mode command is not used */
6568 * Display the monsters in a group.
6570 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6571 int mon_cur, int mon_top, bool visual_only)
6575 /* Display lines until done */
6576 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6580 /* Get the race index */
6581 MONRACE_IDX r_idx = mon_idx[mon_top + i] ;
6583 /* Access the race */
6584 monster_race *r_ptr = &r_info[r_idx];
6586 /* Choose a color */
6587 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6589 /* Display the name */
6590 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6592 /* Hack -- visual_list mode */
6595 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6597 if (p_ptr->wizard || visual_only)
6599 c_prt(attr, format("%d", r_idx), row + i, 62);
6602 /* Erase chars before overwritten by the race letter */
6603 Term_erase(69, row + i, 255);
6605 /* Display symbol */
6606 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6611 if (!(r_ptr->flags1 & RF1_UNIQUE))
6612 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6614 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6615 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6619 /* Clear remaining lines */
6620 for (; i < per_page; i++)
6622 Term_erase(col, row + i, 255);
6628 * Display known monsters.
6630 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx)
6634 IDX grp_cur, grp_top, old_grp_cur;
6635 IDX mon_cur, mon_top;
6636 IDX grp_cnt, grp_idx[100];
6644 bool visual_list = FALSE;
6645 TERM_COLOR attr_top = 0;
6653 Term_get_size(&wid, &hgt);
6655 browser_rows = hgt - 8;
6657 /* Allocate the "mon_idx" array */
6658 C_MAKE(mon_idx, max_r_idx, s16b);
6663 if (direct_r_idx < 0)
6665 mode = visual_only ? 0x03 : 0x01;
6667 /* Check every group */
6668 for (i = 0; monster_group_text[i] != NULL; i++)
6670 /* Measure the label */
6671 len = strlen(monster_group_text[i]);
6673 /* Save the maximum length */
6674 if (len > max) max = len;
6676 /* See if any monsters are known */
6677 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6679 /* Build a list of groups with known monsters */
6680 grp_idx[grp_cnt++] = i;
6688 mon_idx[0] = direct_r_idx;
6691 /* Terminate the list */
6694 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6695 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6698 /* Terminate the list */
6699 grp_idx[grp_cnt] = -1;
6702 grp_cur = grp_top = 0;
6703 mon_cur = mon_top = 0;
6708 mode = visual_only ? 0x02 : 0x00;
6713 monster_race *r_ptr;
6720 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6721 if (direct_r_idx < 0) prt("グループ", 4, 0);
6722 prt("名前", 4, max + 3);
6723 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6725 if (!visual_only) prt("殺害数", 4, 72);
6727 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6728 if (direct_r_idx < 0) prt("Group", 4, 0);
6729 prt("Name", 4, max + 3);
6730 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6732 if (!visual_only) prt("Kills", 4, 73);
6735 for (i = 0; i < 78; i++)
6737 Term_putch(i, 5, TERM_WHITE, '=');
6740 if (direct_r_idx < 0)
6742 for (i = 0; i < browser_rows; i++)
6744 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6751 if (direct_r_idx < 0)
6753 /* Scroll group list */
6754 if (grp_cur < grp_top) grp_top = grp_cur;
6755 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6757 /* Display a list of monster groups */
6758 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6760 if (old_grp_cur != grp_cur)
6762 old_grp_cur = grp_cur;
6764 /* Get a list of monsters in the current group */
6765 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6768 /* Scroll monster list */
6769 while (mon_cur < mon_top)
6770 mon_top = MAX(0, mon_top - browser_rows/2);
6771 while (mon_cur >= mon_top + browser_rows)
6772 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6777 /* Display a list of monsters in the current group */
6778 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6784 /* Display a monster name */
6785 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6787 /* Display visual list below first monster */
6788 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6793 prt(format("<方向>%s%s%s, ESC",
6794 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6795 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6796 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6799 prt(format("<dir>%s%s%s, ESC",
6800 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6801 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6802 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6806 /* Get the current monster */
6807 r_ptr = &r_info[mon_idx[mon_cur]];
6811 /* Mega Hack -- track this monster race */
6812 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6814 /* Hack -- handle stuff */
6820 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6824 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6828 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6833 /* Do visual mode command if needed */
6834 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))
6836 if (direct_r_idx >= 0)
6861 /* Recall on screen */
6862 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6864 screen_roff(mon_idx[mon_cur], 0);
6875 /* Move the cursor */
6876 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6883 /* Free the "mon_idx" array */
6884 C_KILL(mon_idx, max_r_idx, s16b);
6889 * Display the objects in a group.
6891 static void display_object_list(int col, int row, int per_page, IDX object_idx[],
6892 int object_cur, int object_top, bool visual_only)
6896 /* Display lines until done */
6897 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6902 object_kind *flavor_k_ptr;
6904 /* Get the object index */
6905 KIND_OBJECT_IDX k_idx = object_idx[object_top + i];
6907 /* Access the object */
6908 object_kind *k_ptr = &k_info[k_idx];
6910 /* Choose a color */
6911 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6912 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6915 if (!visual_only && k_ptr->flavor)
6917 /* Appearance of this object is shuffled */
6918 flavor_k_ptr = &k_info[k_ptr->flavor];
6922 /* Appearance of this object is very normal */
6923 flavor_k_ptr = k_ptr;
6928 attr = ((i + object_top == object_cur) ? cursor : attr);
6930 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
6933 strip_name(o_name, k_idx);
6938 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
6941 /* Display the name */
6942 c_prt(attr, o_name, row + i, col);
6944 /* Hack -- visual_list mode */
6947 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);
6949 if (p_ptr->wizard || visual_only)
6951 c_prt(attr, format("%d", k_idx), row + i, 70);
6954 a = flavor_k_ptr->x_attr;
6955 c = flavor_k_ptr->x_char;
6957 /* Display symbol */
6958 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
6961 /* Clear remaining lines */
6962 for (; i < per_page; i++)
6964 Term_erase(col, row + i, 255);
6969 * Describe fake object
6971 static void desc_obj_fake(KIND_OBJECT_IDX k_idx)
6974 object_type object_type_body;
6976 /* Get local object */
6977 o_ptr = &object_type_body;
6979 /* Wipe the object */
6982 /* Create the artifact */
6983 object_prep(o_ptr, k_idx);
6985 /* It's fully know */
6986 o_ptr->ident |= IDENT_KNOWN;
6988 /* Track the object */
6989 /* object_actual_track(o_ptr); */
6991 /* Hack - mark as fake */
6992 /* term_obj_real = FALSE; */
6994 /* Hack -- Handle stuff */
6997 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
6999 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7007 * Display known objects
7009 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx)
7013 IDX grp_cur, grp_top, old_grp_cur;
7014 IDX object_old, object_cur, object_top;
7024 bool visual_list = FALSE;
7025 TERM_COLOR attr_top = 0;
7033 Term_get_size(&wid, &hgt);
7035 browser_rows = hgt - 8;
7037 /* Allocate the "object_idx" array */
7038 C_MAKE(object_idx, max_k_idx, IDX);
7043 if (direct_k_idx < 0)
7045 mode = visual_only ? 0x03 : 0x01;
7047 /* Check every group */
7048 for (i = 0; object_group_text[i] != NULL; i++)
7050 /* Measure the label */
7051 len = strlen(object_group_text[i]);
7053 /* Save the maximum length */
7054 if (len > max) max = len;
7056 /* See if any monsters are known */
7057 if (collect_objects(i, object_idx, mode))
7059 /* Build a list of groups with known monsters */
7060 grp_idx[grp_cnt++] = i;
7069 object_kind *k_ptr = &k_info[direct_k_idx];
7070 object_kind *flavor_k_ptr;
7072 if (!visual_only && k_ptr->flavor)
7074 /* Appearance of this object is shuffled */
7075 flavor_k_ptr = &k_info[k_ptr->flavor];
7079 /* Appearance of this object is very normal */
7080 flavor_k_ptr = k_ptr;
7083 object_idx[0] = direct_k_idx;
7084 object_old = direct_k_idx;
7087 /* Terminate the list */
7090 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7091 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7094 /* Terminate the list */
7095 grp_idx[grp_cnt] = -1;
7098 grp_cur = grp_top = 0;
7099 object_cur = object_top = 0;
7104 mode = visual_only ? 0x02 : 0x00;
7109 object_kind *k_ptr, *flavor_k_ptr;
7116 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7117 if (direct_k_idx < 0) prt("グループ", 4, 0);
7118 prt("名前", 4, max + 3);
7119 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7122 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7123 if (direct_k_idx < 0) prt("Group", 4, 0);
7124 prt("Name", 4, max + 3);
7125 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7129 for (i = 0; i < 78; i++)
7131 Term_putch(i, 5, TERM_WHITE, '=');
7134 if (direct_k_idx < 0)
7136 for (i = 0; i < browser_rows; i++)
7138 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7145 if (direct_k_idx < 0)
7147 /* Scroll group list */
7148 if (grp_cur < grp_top) grp_top = grp_cur;
7149 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7151 /* Display a list of object groups */
7152 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7154 if (old_grp_cur != grp_cur)
7156 old_grp_cur = grp_cur;
7158 /* Get a list of objects in the current group */
7159 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7162 /* Scroll object list */
7163 while (object_cur < object_top)
7164 object_top = MAX(0, object_top - browser_rows/2);
7165 while (object_cur >= object_top + browser_rows)
7166 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7171 /* Display a list of objects in the current group */
7172 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7176 object_top = object_cur;
7178 /* Display a list of objects in the current group */
7179 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7181 /* Display visual list below first object */
7182 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7185 /* Get the current object */
7186 k_ptr = &k_info[object_idx[object_cur]];
7188 if (!visual_only && k_ptr->flavor)
7190 /* Appearance of this object is shuffled */
7191 flavor_k_ptr = &k_info[k_ptr->flavor];
7195 /* Appearance of this object is very normal */
7196 flavor_k_ptr = k_ptr;
7201 prt(format("<方向>%s%s%s, ESC",
7202 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7203 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7204 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7207 prt(format("<dir>%s%s%s, ESC",
7208 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7209 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7210 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7216 /* Mega Hack -- track this object */
7217 if (object_cnt) object_kind_track(object_idx[object_cur]);
7219 /* The "current" object changed */
7220 if (object_old != object_idx[object_cur])
7222 /* Hack -- handle stuff */
7225 /* Remember the "current" object */
7226 object_old = object_idx[object_cur];
7232 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7236 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7240 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7245 /* Do visual mode command if needed */
7246 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))
7248 if (direct_k_idx >= 0)
7273 /* Recall on screen */
7274 if (!visual_list && !visual_only && (grp_cnt > 0))
7276 desc_obj_fake(object_idx[object_cur]);
7284 /* Move the cursor */
7285 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7291 /* Free the "object_idx" array */
7292 C_KILL(object_idx, max_k_idx, IDX);
7297 * Display the features in a group.
7299 static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_idx,
7300 FEAT_IDX feat_cur, FEAT_IDX feat_top, bool visual_only, int lighting_level)
7302 int lit_col[F_LIT_MAX], i, j;
7303 int f_idx_col = use_bigtile ? 62 : 64;
7305 /* Correct columns 1 and 4 */
7306 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7307 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7308 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7310 /* Display lines until done */
7311 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7316 FEAT_IDX f_idx = feat_idx[feat_top + i];
7318 /* Access the index */
7319 feature_type *f_ptr = &f_info[f_idx];
7321 int row_i = row + i;
7323 /* Choose a color */
7324 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7326 /* Display the name */
7327 c_prt(attr, f_name + f_ptr->name, row_i, col);
7329 /* Hack -- visual_list mode */
7332 /* Display lighting level */
7333 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7335 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));
7337 if (p_ptr->wizard || visual_only)
7339 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7342 /* Display symbol */
7343 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);
7345 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7346 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7348 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7350 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7352 /* Mega-hack -- Use non-standard colour */
7353 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7355 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7359 /* Clear remaining lines */
7360 for (; i < per_page; i++)
7362 Term_erase(col, row + i, 255);
7368 * Interact with feature visuals.
7370 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level)
7374 IDX grp_cur, grp_top, old_grp_cur;
7375 IDX feat_cur, feat_top;
7385 bool visual_list = FALSE;
7386 TERM_COLOR attr_top = 0;
7392 TERM_COLOR attr_old[F_LIT_MAX];
7393 byte char_old[F_LIT_MAX];
7394 TERM_COLOR *cur_attr_ptr;
7397 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7398 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7400 Term_get_size(&wid, &hgt);
7402 browser_rows = hgt - 8;
7404 /* Allocate the "feat_idx" array */
7405 C_MAKE(feat_idx, max_f_idx, IDX);
7410 if (direct_f_idx < 0)
7412 /* Check every group */
7413 for (i = 0; feature_group_text[i] != NULL; i++)
7415 /* Measure the label */
7416 len = strlen(feature_group_text[i]);
7418 /* Save the maximum length */
7419 if (len > max) max = len;
7421 /* See if any features are known */
7422 if (collect_features(i, feat_idx, 0x01))
7424 /* Build a list of groups with known features */
7425 grp_idx[grp_cnt++] = i;
7433 feature_type *f_ptr = &f_info[direct_f_idx];
7435 feat_idx[0] = direct_f_idx;
7438 /* Terminate the list */
7441 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7442 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7444 for (i = 0; i < F_LIT_MAX; i++)
7446 attr_old[i] = f_ptr->x_attr[i];
7447 char_old[i] = f_ptr->x_char[i];
7451 /* Terminate the list */
7452 grp_idx[grp_cnt] = -1;
7455 grp_cur = grp_top = 0;
7456 feat_cur = feat_top = 0;
7464 feature_type *f_ptr;
7471 prt("表示 - 地形", 2, 0);
7472 if (direct_f_idx < 0) prt("グループ", 4, 0);
7473 prt("名前", 4, max + 3);
7476 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7477 prt("文字 ( l/ d)", 4, 66);
7481 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7482 prt("文字 (l/d)", 4, 68);
7485 prt("Visuals - features", 2, 0);
7486 if (direct_f_idx < 0) prt("Group", 4, 0);
7487 prt("Name", 4, max + 3);
7490 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7491 prt("Sym ( l/ d)", 4, 67);
7495 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7496 prt("Sym (l/d)", 4, 69);
7500 for (i = 0; i < 78; i++)
7502 Term_putch(i, 5, TERM_WHITE, '=');
7505 if (direct_f_idx < 0)
7507 for (i = 0; i < browser_rows; i++)
7509 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7516 if (direct_f_idx < 0)
7518 /* Scroll group list */
7519 if (grp_cur < grp_top) grp_top = grp_cur;
7520 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7522 /* Display a list of feature groups */
7523 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7525 if (old_grp_cur != grp_cur)
7527 old_grp_cur = grp_cur;
7529 /* Get a list of features in the current group */
7530 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7533 /* Scroll feature list */
7534 while (feat_cur < feat_top)
7535 feat_top = MAX(0, feat_top - browser_rows/2);
7536 while (feat_cur >= feat_top + browser_rows)
7537 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7542 /* Display a list of features in the current group */
7543 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7547 feat_top = feat_cur;
7549 /* Display a list of features in the current group */
7550 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7552 /* Display visual list below first object */
7553 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7558 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7559 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7560 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7563 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7564 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7565 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7569 /* Get the current feature */
7570 f_ptr = &f_info[feat_idx[feat_cur]];
7571 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7572 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7576 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7580 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7584 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7589 if (visual_list && ((ch == 'A') || (ch == 'a')))
7591 int prev_lighting_level = *lighting_level;
7595 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7596 else (*lighting_level)--;
7600 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7601 else (*lighting_level)++;
7604 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7605 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7607 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7608 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7613 else if ((ch == 'D') || (ch == 'd'))
7615 TERM_COLOR prev_x_attr = f_ptr->x_attr[*lighting_level];
7616 byte prev_x_char = f_ptr->x_char[*lighting_level];
7618 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7622 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7623 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7625 if (prev_x_char != f_ptr->x_char[*lighting_level])
7626 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7628 else *need_redraw = TRUE;
7633 /* Do visual mode command if needed */
7634 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))
7638 /* Restore previous visual settings */
7640 for (i = 0; i < F_LIT_MAX; i++)
7642 f_ptr->x_attr[i] = attr_old[i];
7643 f_ptr->x_char[i] = char_old[i];
7650 if (direct_f_idx >= 0) flag = TRUE;
7651 else *lighting_level = F_LIT_STANDARD;
7654 /* Preserve current visual settings */
7657 for (i = 0; i < F_LIT_MAX; i++)
7659 attr_old[i] = f_ptr->x_attr[i];
7660 char_old[i] = f_ptr->x_char[i];
7662 *lighting_level = F_LIT_STANDARD;
7669 for (i = 0; i < F_LIT_MAX; i++)
7671 attr_idx_feat[i] = f_ptr->x_attr[i];
7672 char_idx_feat[i] = f_ptr->x_char[i];
7681 /* Allow TERM_DARK text */
7682 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7684 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7685 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7703 /* Move the cursor */
7704 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7710 /* Free the "feat_idx" array */
7711 C_KILL(feat_idx, max_f_idx, IDX);
7716 * List wanted monsters
7718 static void do_cmd_knowledge_kubi(void)
7723 char file_name[1024];
7726 /* Open a new file */
7727 fff = my_fopen_temp(file_name, 1024);
7729 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7736 bool listed = FALSE;
7739 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7741 fprintf(fff, "賞金首リスト\n");
7743 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7745 fprintf(fff, "List of wanted monsters\n");
7747 fprintf(fff, "----------------------------------------------\n");
7749 for (i = 0; i < MAX_KUBI; i++)
7751 if (kubi_r_idx[i] <= 10000)
7753 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7761 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7765 /* Close the file */
7768 /* Display the file contents */
7769 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7771 /* Remove the file */
7776 * List virtues & status
7778 static void do_cmd_knowledge_virtues(void)
7782 char file_name[1024];
7785 /* Open a new file */
7786 fff = my_fopen_temp(file_name, 1024);
7788 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7795 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7799 /* Close the file */
7802 /* Display the file contents */
7803 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7805 /* Remove the file */
7813 static void do_cmd_knowledge_dungeon(void)
7817 char file_name[1024];
7821 /* Open a new file */
7822 fff = my_fopen_temp(file_name, 1024);
7824 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7831 for (i = 1; i < max_d_idx; i++)
7835 if (!d_info[i].maxdepth) continue;
7836 if (!max_dlv[i]) continue;
7837 if (d_info[i].final_guardian)
7839 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7841 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7843 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
7847 /* Close the file */
7850 /* Display the file contents */
7851 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7853 /* Remove the file */
7858 * List virtues & status
7861 static void do_cmd_knowledge_stat(void)
7865 char file_name[1024];
7868 /* Open a new file */
7869 fff = my_fopen_temp(file_name, 1024);
7871 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7878 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7879 (2 * p_ptr->hitdie +
7880 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7883 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7884 else fprintf(fff, "現在の体力ランク : ???\n\n");
7885 fprintf(fff, "能力の最大値\n\n");
7887 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7888 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7889 fprintf(fff, "Limits of maximum stats\n\n");
7891 for (v_nr = 0; v_nr < 6; v_nr++)
7893 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);
7894 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7900 /* Close the file */
7903 /* Display the file contents */
7904 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7906 /* Remove the file */
7912 * Print all active quests
7914 static void do_cmd_knowledge_quests_current(FILE *fff)
7917 char rand_tmp_str[120] = "\0";
7919 monster_race *r_ptr;
7921 int rand_level = 100;
7924 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7926 for (i = 1; i < max_q_idx; i++)
7928 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
7929 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
7930 (quest[i].status == QUEST_STATUS_COMPLETED))
7932 /* Set the quest number temporary */
7933 IDX old_quest = p_ptr->inside_quest;
7936 /* Clear the text */
7937 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
7938 quest_text_line = 0;
7940 p_ptr->inside_quest = i;
7942 /* Get the quest text */
7943 init_flags = INIT_SHOW_TEXT;
7945 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
7947 /* Reset the old quest number */
7948 p_ptr->inside_quest = old_quest;
7950 /* No info from "silent" quests */
7951 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7955 if (quest[i].type != QUEST_TYPE_RANDOM)
7957 char note[80] = "\0";
7959 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
7961 switch (quest[i].type)
7963 case QUEST_TYPE_KILL_LEVEL:
7964 case QUEST_TYPE_KILL_ANY_LEVEL:
7965 r_ptr = &r_info[quest[i].r_idx];
7966 strcpy(name, r_name + r_ptr->name);
7967 if (quest[i].max_num > 1)
7970 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
7971 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
7974 sprintf(note," - kill %d %s, have killed %d.",
7975 (int)quest[i].max_num, name, (int)quest[i].cur_num);
7979 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
7982 case QUEST_TYPE_FIND_ARTIFACT:
7985 artifact_type *a_ptr = &a_info[quest[i].k_idx];
7987 object_type *q_ptr = &forge;
7988 KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
7989 object_prep(q_ptr, k_idx);
7990 q_ptr->name1 = quest[i].k_idx;
7991 q_ptr->ident = IDENT_STORE;
7992 object_desc(name, q_ptr, OD_NAME_ONLY);
7994 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
7996 case QUEST_TYPE_FIND_EXIT:
7997 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8000 case QUEST_TYPE_KILL_NUMBER:
8002 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8003 (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num));
8005 sprintf(note," - Kill %d monsters, have killed %d.",
8006 (int)quest[i].max_num, (int)quest[i].cur_num);
8010 case QUEST_TYPE_KILL_ALL:
8011 case QUEST_TYPE_TOWER:
8012 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8017 /* Print the quest info */
8018 sprintf(tmp_str, _(" %s (危険度:%d階相当)%s\n", " %s (Danger level: %d)%s\n"),
8019 quest[i].name, (int)quest[i].level, note);
8021 fputs(tmp_str, fff);
8023 if (quest[i].status == QUEST_STATUS_COMPLETED)
8025 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8026 fputs(tmp_str, fff);
8032 while (quest_text[j][0] && j < 10)
8034 fprintf(fff, " %s\n", quest_text[j]);
8039 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8042 rand_level = quest[i].level;
8044 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8046 /* Print the quest info */
8047 r_ptr = &r_info[quest[i].r_idx];
8048 strcpy(name, r_name + r_ptr->name);
8050 if (quest[i].max_num > 1)
8053 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8054 quest[i].name, (int)quest[i].level,
8055 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
8059 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8060 quest[i].name, (int)quest[i].level,
8061 (int)quest[i].max_num, name, (int)quest[i].cur_num);
8066 sprintf(rand_tmp_str,_(" %s (%d 階) - %sを倒す。\n", " %s (Dungeon level: %d)\n Kill %s.\n"),
8067 quest[i].name, (int)quest[i].level, name);
8074 /* Print the current random quest */
8075 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8077 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8081 static bool do_cmd_knowledge_quests_aux(FILE *fff, IDX q_idx)
8084 char playtime_str[16];
8085 quest_type* const q_ptr = &quest[q_idx];
8087 if (is_fixed_quest_idx(q_idx))
8089 /* Set the quest number temporary */
8090 IDX old_quest = p_ptr->inside_quest;
8092 p_ptr->inside_quest = q_idx;
8095 init_flags = INIT_NAME_ONLY;
8097 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8099 /* Reset the old quest number */
8100 p_ptr->inside_quest = old_quest;
8102 /* No info from "silent" quests */
8103 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8106 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8107 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8109 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8111 /* Print the quest info */
8112 if (q_ptr->complev == 0)
8115 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8116 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8117 r_name+r_info[q_ptr->r_idx].name,
8118 (int)q_ptr->level, playtime_str);
8123 _(" %-35s (%3d階) - レベル%2d - %s\n",
8124 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8125 r_name+r_info[q_ptr->r_idx].name,
8133 /* Print the quest info */
8135 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8136 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8137 q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str);
8140 fputs(tmp_str, fff);
8146 * Print all finished quests
8148 void do_cmd_knowledge_quests_completed(FILE *fff, IDX quest_num[])
8153 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8154 for (i = 1; i < max_q_idx; i++)
8156 IDX q_idx = quest_num[i];
8157 quest_type* const q_ptr = &quest[q_idx];
8159 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8160 do_cmd_knowledge_quests_aux(fff, q_idx))
8165 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8170 * Print all failed quests
8172 void do_cmd_knowledge_quests_failed(FILE *fff, IDX quest_num[])
8177 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8178 for (i = 1; i < max_q_idx; i++)
8180 IDX q_idx = quest_num[i];
8181 quest_type* const q_ptr = &quest[q_idx];
8183 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8184 do_cmd_knowledge_quests_aux(fff, q_idx))
8189 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8194 * Print all random quests
8196 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8202 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8203 for (i = 1; i < max_q_idx; i++)
8205 /* No info from "silent" quests */
8206 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8208 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8212 /* Print the quest info */
8213 sprintf(tmp_str, _(" %s (%d階, %s)\n", " %s (%d, %s)\n"),
8214 quest[i].name, (int)quest[i].level, r_name+r_info[quest[i].r_idx].name);
8215 fputs(tmp_str, fff);
8218 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8222 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8224 QUEST_IDX *q_num = (QUEST_IDX *)u;
8225 quest_type *qa = &quest[q_num[a]];
8226 quest_type *qb = &quest[q_num[b]];
8231 return (qa->comptime != qb->comptime) ?
8232 (qa->comptime < qb->comptime) :
8233 (qa->level <= qb->level);
8236 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8238 QUEST_IDX *q_num = (QUEST_IDX *)u;
8245 q_num[a] = q_num[b];
8251 * Print quest status of all active quests
8253 static void do_cmd_knowledge_quests(void)
8256 char file_name[1024];
8261 /* Open a new file */
8262 fff = my_fopen_temp(file_name, 1024);
8265 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8270 /* Allocate Memory */
8271 C_MAKE(quest_num, max_q_idx, IDX);
8273 /* Sort by compete level */
8274 for (i = 1; i < max_q_idx; i++) quest_num[i] = i;
8275 ang_sort_comp = ang_sort_comp_quest_num;
8276 ang_sort_swap = ang_sort_swap_quest_num;
8277 ang_sort(quest_num, &dummy, max_q_idx);
8279 /* Dump Quest Information */
8280 do_cmd_knowledge_quests_current(fff);
8282 do_cmd_knowledge_quests_completed(fff, quest_num);
8284 do_cmd_knowledge_quests_failed(fff, quest_num);
8288 do_cmd_knowledge_quests_wiz_random(fff);
8291 /* Close the file */
8294 /* Display the file contents */
8295 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8297 /* Remove the file */
8301 C_KILL(quest_num, max_q_idx, IDX);
8308 static void do_cmd_knowledge_home(void)
8313 char file_name[1024];
8315 char o_name[MAX_NLEN];
8318 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8320 /* Open a new file */
8321 fff = my_fopen_temp(file_name, 1024);
8323 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8330 /* Print all homes in the different towns */
8331 st_ptr = &town[1].store[STORE_HOME];
8333 /* Home -- if anything there */
8334 if (st_ptr->stock_num)
8339 /* Header with name of the town */
8340 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8342 /* Dump all available items */
8343 for (i = 0; i < st_ptr->stock_num; i++)
8346 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8347 object_desc(o_name, &st_ptr->stock[i], 0);
8348 if (strlen(o_name) <= 80-3)
8350 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8356 for (n = 0, t = o_name; n < 80-3; n++, t++)
8357 if(iskanji(*t)) {t++; n++;}
8358 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8360 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8361 fprintf(fff, " %.77s\n", o_name+n);
8364 object_desc(o_name, &st_ptr->stock[i], 0);
8365 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8370 /* Add an empty line */
8371 fprintf(fff, "\n\n");
8375 /* Close the file */
8378 /* Display the file contents */
8379 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8381 /* Remove the file */
8387 * Check the status of "autopick"
8389 static void do_cmd_knowledge_autopick(void)
8393 char file_name[1024];
8395 /* Open a new file */
8396 fff = my_fopen_temp(file_name, 1024);
8400 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8407 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8411 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8412 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8415 for (k = 0; k < max_autopick; k++)
8418 byte act = autopick_list[k].action;
8419 if (act & DONT_AUTOPICK)
8421 tmp = _("放置", "Leave");
8423 else if (act & DO_AUTODESTROY)
8425 tmp = _("破壊", "Destroy");
8427 else if (act & DO_AUTOPICK)
8429 tmp = _("拾う", "Pickup");
8433 tmp = _("確認", "Query");
8436 if (act & DO_DISPLAY)
8437 fprintf(fff, "%11s", format("[%s]", tmp));
8439 fprintf(fff, "%11s", format("(%s)", tmp));
8441 tmp = autopick_line_from_entry(&autopick_list[k]);
8442 fprintf(fff, " %s", tmp);
8446 /* Close the file */
8448 /* Display the file contents */
8449 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8451 /* Remove the file */
8457 * Interact with "knowledge"
8459 void do_cmd_knowledge(void)
8462 bool need_redraw = FALSE;
8464 /* File type is "TEXT" */
8465 FILE_TYPE(FILE_TYPE_TEXT);
8467 /* Save the screen */
8470 /* Interact until done */
8476 /* Ask for a choice */
8478 prt(format("%d/2 ページ", (p+1)), 2, 65);
8479 prt("現在の知識を確認する", 3, 0);
8481 prt(format("page %d/2", (p+1)), 2, 65);
8482 prt("Display current knowledge", 3, 0);
8485 /* Give some choices */
8489 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8490 prt("(2) 既知のアイテム の一覧", 7, 5);
8491 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8492 prt("(4) 既知のモンスター の一覧", 9, 5);
8493 prt("(5) 倒した敵の数 の一覧", 10, 5);
8494 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8495 prt("(7) 現在のペット の一覧", 12, 5);
8496 prt("(8) 我が家のアイテム の一覧", 13, 5);
8497 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8498 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8502 prt("(a) 自分に関する情報 の一覧", 6, 5);
8503 prt("(b) 突然変異 の一覧", 7, 5);
8504 prt("(c) 武器の経験値 の一覧", 8, 5);
8505 prt("(d) 魔法の経験値 の一覧", 9, 5);
8506 prt("(e) 技能の経験値 の一覧", 10, 5);
8507 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8508 prt("(g) 入ったダンジョン の一覧", 12, 5);
8509 prt("(h) 実行中のクエスト の一覧", 13, 5);
8510 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8515 prt("(1) Display known artifacts", 6, 5);
8516 prt("(2) Display known objects", 7, 5);
8517 prt("(3) Display remaining uniques", 8, 5);
8518 prt("(4) Display known monster", 9, 5);
8519 prt("(5) Display kill count", 10, 5);
8520 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8521 prt("(7) Display current pets", 12, 5);
8522 prt("(8) Display home inventory", 13, 5);
8523 prt("(9) Display *identified* equip.", 14, 5);
8524 prt("(0) Display terrain symbols.", 15, 5);
8528 prt("(a) Display about yourself", 6, 5);
8529 prt("(b) Display mutations", 7, 5);
8530 prt("(c) Display weapon proficiency", 8, 5);
8531 prt("(d) Display spell proficiency", 9, 5);
8532 prt("(e) Display misc. proficiency", 10, 5);
8533 prt("(f) Display virtues", 11, 5);
8534 prt("(g) Display dungeons", 12, 5);
8535 prt("(h) Display current quests", 13, 5);
8536 prt("(i) Display auto pick/destroy", 14, 5);
8542 prt("ESC) 抜ける", 21, 1);
8543 prt("SPACE) 次ページ", 21, 30);
8544 /*prt("-) 前ページ", 21, 60);*/
8545 prt("コマンド:", 20, 0);
8547 prt("-more-", 17, 8);
8548 prt("ESC) Exit menu", 21, 1);
8549 prt("SPACE) Next page", 21, 30);
8550 /*prt("-) Previous page", 21, 60);*/
8551 prt("Command: ", 20, 0);
8557 if (i == ESCAPE) break;
8560 case ' ': /* Page change */
8564 case '1': /* Artifacts */
8565 do_cmd_knowledge_artifacts();
8567 case '2': /* Objects */
8568 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8570 case '3': /* Uniques */
8571 do_cmd_knowledge_uniques();
8573 case '4': /* Monsters */
8574 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8576 case '5': /* Kill count */
8577 do_cmd_knowledge_kill_count();
8579 case '6': /* wanted */
8580 if (!vanilla_town) do_cmd_knowledge_kubi();
8582 case '7': /* Pets */
8583 do_cmd_knowledge_pets();
8585 case '8': /* Home */
8586 do_cmd_knowledge_home();
8588 case '9': /* Resist list */
8589 do_cmd_knowledge_inven();
8591 case '0': /* Feature list */
8593 IDX lighting_level = F_LIT_STANDARD;
8594 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8598 case 'a': /* Max stat */
8599 do_cmd_knowledge_stat();
8601 case 'b': /* Mutations */
8602 do_cmd_knowledge_mutations();
8604 case 'c': /* weapon-exp */
8605 do_cmd_knowledge_weapon_exp();
8607 case 'd': /* spell-exp */
8608 do_cmd_knowledge_spell_exp();
8610 case 'e': /* skill-exp */
8611 do_cmd_knowledge_skill_exp();
8613 case 'f': /* Virtues */
8614 do_cmd_knowledge_virtues();
8616 case 'g': /* Dungeon */
8617 do_cmd_knowledge_dungeon();
8619 case 'h': /* Quests */
8620 do_cmd_knowledge_quests();
8622 case 'i': /* Autopick */
8623 do_cmd_knowledge_autopick();
8625 default: /* Unknown option */
8629 /* Flush messages */
8633 /* Restore the screen */
8636 if (need_redraw) do_cmd_redraw();
8641 * Check on the status of an active quest
8643 void do_cmd_checkquest(void)
8645 /* File type is "TEXT" */
8646 FILE_TYPE(FILE_TYPE_TEXT);
8648 /* Save the screen */
8652 do_cmd_knowledge_quests();
8654 /* Restore the screen */
8660 * Display the time and date
8662 void do_cmd_time(void)
8664 int day, hour, min, full, start, end, num;
8672 extract_day_hour_min(&day, &hour, &min);
8674 full = hour * 100 + min;
8681 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8683 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8684 else strcpy(day_buf, "*****");
8687 msg_format("%s日目, 時刻は%d:%02d %sです。",
8688 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8689 min, (hour < 12) ? "AM" : "PM");
8691 msg_format("This is day %s. The time is %d:%02d %s.",
8692 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8693 min, (hour < 12) ? "AM" : "PM");
8698 if (!randint0(10) || p_ptr->image)
8700 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8704 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8707 /* Open this file */
8708 fff = my_fopen(buf, "rt");
8712 /* Find this time */
8713 while (!my_fgets(fff, buf, sizeof(buf)))
8715 /* Ignore comments */
8716 if (!buf[0] || (buf[0] == '#')) continue;
8718 /* Ignore invalid lines */
8719 if (buf[1] != ':') continue;
8721 /* Process 'Start' */
8724 /* Extract the starting time */
8725 start = atoi(buf + 2);
8727 /* Assume valid for an hour */
8737 /* Extract the ending time */
8738 end = atoi(buf + 2);
8744 /* Ignore incorrect range */
8745 if ((start > full) || (full > end)) continue;
8747 /* Process 'Description' */
8752 /* Apply the randomizer */
8753 if (!randint0(num)) strcpy(desc, buf + 2);
8762 /* Close the file */