3 * @brief プレイヤーのインターフェイスに関するコマンドの実装 / Interface commands
7 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
8 * This software may be copied and distributed for educational, research,
9 * and not for profit purposes provided that this copyright and statement
10 * are included in all such copies. Other copyrights may also apply.
14 * A set of functions to maintain automatic dumps of various kinds.
16 * remove_auto_dump(orig_file, mark)
17 * Remove the old automatic dump of type "mark".
18 * auto_dump_printf(fmt, ...)
19 * Dump a formatted string using fprintf().
20 * open_auto_dump(buf, mark)
21 * Open a file, remove old dump, and add new header.
22 * close_auto_dump(void)
23 * Add a footer, and close the file.
24 * The dump commands of original Angband simply add new lines to
25 * existing files; these files will become bigger and bigger unless
26 * an user deletes some or all of these files by hand at some
28 * These three functions automatically delete old dumped lines
29 * before adding new ones. Since there are various kinds of automatic
30 * dumps in a single file, we add a header and a footer with a type
31 * name for every automatic dump, and kill old lines only when the
32 * lines have the correct type of header and footer.
33 * We need to be quite paranoid about correctness; the user might
34 * (mistakenly) edit the file by hand, and see all their work come
35 * to nothing on the next auto dump otherwise. The current code only
36 * detects changes by noting inconsistencies between the actual number
37 * of lines and the number written in the footer. Note that this will
38 * not catch single-line edits.
50 * Mark strings for auto dump
52 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
53 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
56 * Variables for auto dump
58 static FILE *auto_dump_stream;
59 static cptr auto_dump_mark;
60 static int auto_dump_line_num;
64 * @brief prf出力内容を消去する /
65 * Remove old lines automatically generated before.
66 * @param orig_file 消去を行うファイル名
68 static void remove_auto_dump(cptr orig_file)
70 FILE *tmp_fff, *orig_fff;
74 bool between_mark = FALSE;
77 long header_location = 0;
78 char header_mark_str[80];
79 char footer_mark_str[80];
82 /* Prepare a header/footer mark string */
83 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
84 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
86 mark_len = strlen(footer_mark_str);
88 /* Open an old dump file in read-only mode */
89 orig_fff = my_fopen(orig_file, "r");
91 /* If original file does not exist, nothing to do */
92 if (!orig_fff) return;
94 /* Open a new (temporary) file */
95 tmp_fff = my_fopen_temp(tmp_file, 1024);
99 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), tmp_file);
104 /* Loop for every line */
108 if (my_fgets(orig_fff, buf, sizeof(buf)))
110 /* Read error: Assume End of File */
113 * Was looking for the footer, but not found.
115 * Since automatic dump might be edited by hand,
116 * it's dangerous to kill these lines.
117 * Seek back to the next line of the (pseudo) header,
122 fseek(orig_fff, header_location, SEEK_SET);
123 between_mark = FALSE;
127 /* Success -- End the loop */
134 /* We are looking for the header mark of automatic dump */
137 /* Is this line a header? */
138 if (!strcmp(buf, header_mark_str))
140 /* Memorise seek point of this line */
141 header_location = ftell(orig_fff);
143 /* Initialize counter for number of lines */
146 /* Look for the footer from now */
149 /* There are some changes */
156 /* Copy orginally lines */
157 fprintf(tmp_fff, "%s\n", buf);
161 /* We are looking for the footer mark of automatic dump */
164 /* Is this line a footer? */
165 if (!strncmp(buf, footer_mark_str, mark_len))
170 * Compare the number of lines
172 * If there is an inconsistency between
173 * actual number of lines and the
174 * number here, the automatic dump
175 * might be edited by hand. So it's
176 * dangerous to kill these lines.
177 * Seek back to the next line of the
178 * (pseudo) header, and read again.
180 if (!sscanf(buf + mark_len, " (%d)", &tmp)
183 fseek(orig_fff, header_location, SEEK_SET);
186 /* Look for another header */
187 between_mark = FALSE;
193 /* Ignore old line, and count number of lines */
203 /* If there are some changes, overwrite the original file with new one */
206 /* Copy contents of temporary file */
208 tmp_fff = my_fopen(tmp_file, "r");
209 orig_fff = my_fopen(orig_file, "w");
211 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
212 fprintf(orig_fff, "%s\n", buf);
218 /* Kill the temporary file */
226 * @brief prfファイルのフォーマットに従った内容を出力する /
227 * Dump a formatted line, using "vstrnfmt()".
230 static void auto_dump_printf(cptr fmt, ...)
237 /* Begin the Varargs Stuff */
240 /* Format the args, save the length */
241 (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
243 /* End the Varargs Stuff */
246 /* Count number of lines */
247 for (p = buf; *p; p++)
249 if (*p == '\n') auto_dump_line_num++;
253 fprintf(auto_dump_stream, "%s", buf);
258 * @brief prfファイルをファイルオープンする /
259 * Open file to append auto dump.
261 * @param mark 出力するヘッダマーク
262 * @return ファイルポインタを取得できたらTRUEを返す
264 static bool open_auto_dump(cptr buf, cptr mark)
267 char header_mark_str[80];
269 /* Save the mark string */
270 auto_dump_mark = mark;
272 /* Prepare a header mark string */
273 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
275 /* Remove old macro dumps */
276 remove_auto_dump(buf);
278 /* Append to the file */
279 auto_dump_stream = my_fopen(buf, "a");
282 if (!auto_dump_stream) {
283 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
291 fprintf(auto_dump_stream, "%s\n", header_mark_str);
293 /* Initialize counter */
294 auto_dump_line_num = 0;
296 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
297 "# *Warning!* The lines below are an automatic dump.\n"));
298 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
299 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
305 * @brief prfファイルをファイルクローズする /
306 * Append foot part and close auto dump.
309 static void close_auto_dump(void)
311 char footer_mark_str[80];
313 /* Prepare a footer mark string */
314 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
316 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
317 "# *Warning!* The lines below are an automatic dump.\n"));
318 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
319 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
321 fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
324 my_fclose(auto_dump_stream);
333 * @brief Return suffix of ordinal number
335 * @return pointer of suffix string.
337 cptr get_ordinal_number_suffix(int num)
339 num = ABS(num) % 100;
343 return (num == 11) ? "th" : "st";
345 return (num == 12) ? "th" : "nd";
347 return (num == 13) ? "th" : "rd";
356 * @brief 日記にメッセージを追加する /
357 * Take note to the diary.
358 * @param type 日記内容のID
359 * @param num 日記内容のIDに応じた数値
360 * @param note 日記内容のIDに応じた文字列参照ポインタ
363 errr do_cmd_write_nikki(int type, int num, cptr note)
369 cptr note_level = "";
370 bool do_level = TRUE;
371 char note_level_buf[40];
374 static bool disable_nikki = FALSE;
376 extract_day_hour_min(&day, &hour, &min);
378 if (disable_nikki) return(-1);
380 if (type == NIKKI_FIX_QUEST_C ||
381 type == NIKKI_FIX_QUEST_F ||
382 type == NIKKI_RAND_QUEST_C ||
383 type == NIKKI_RAND_QUEST_F ||
384 type == NIKKI_TO_QUEST)
388 old_quest = p_ptr->inside_quest;
389 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
391 /* Get the quest text */
392 init_flags = INIT_NAME_ONLY;
394 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
396 /* Reset the old quest number */
397 p_ptr->inside_quest = old_quest;
400 /* different filne name to avoid mixing */
401 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
403 /* Build the filename */
404 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
406 /* File type is "TEXT" */
407 FILE_TYPE(FILE_TYPE_TEXT);
409 fff = my_fopen(buf, "a");
414 msg_format(_("%s を開くことができませんでした。プレイ記録を一時停止します。", "Failed to open %s. Play-Record is disabled temporally."), buf);
420 q_idx = quest_number(dun_level);
424 if (p_ptr->inside_arena)
425 note_level = _("アリーナ:", "Arane:");
427 note_level = _("地上:", "Surface:");
428 else if (q_idx && (is_fixed_quest_idx(q_idx)
429 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
430 note_level = _("クエスト:", "Quest:");
434 sprintf(note_level_buf, "%d階(%s):", (int)dun_level, d_name+d_info[dungeon_type].name);
436 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, (int)dun_level);
438 note_level = note_level_buf;
446 if (day < MAX_DAYS) fprintf(fff, _("%d日目\n", "Day %d\n"), day);
447 else fputs(_("*****日目\n", "Day *****\n"), fff);
455 fprintf(fff, "%s\n",note);
459 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
464 fprintf(fff, _(" %2d:%02d %20s %sを発見した。\n", " %2d:%02d %20s discovered %s.\n"), hour, min, note_level, note);
467 case NIKKI_ART_SCROLL:
469 fprintf(fff, _(" %2d:%02d %20s 巻物によって%sを生成した。\n", " %2d:%02d %20s created %s by scroll.\n"), hour, min, note_level, note);
474 fprintf(fff, _(" %2d:%02d %20s %sを倒した。\n", " %2d:%02d %20s defeated %s.\n"), hour, min, note_level, note);
477 case NIKKI_FIX_QUEST_C:
479 if (quest[num].flags & QUEST_FLAG_SILENT) break;
480 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」を達成した。\n",
481 " %2d:%02d %20s completed quest '%s'.\n"), hour, min, note_level, quest[num].name);
484 case NIKKI_FIX_QUEST_F:
486 if (quest[num].flags & QUEST_FLAG_SILENT) break;
487 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」から命からがら逃げ帰った。\n",
488 " %2d:%02d %20s run away from quest '%s'.\n"), hour, min, note_level, quest[num].name);
491 case NIKKI_RAND_QUEST_C:
494 strcpy(name, r_name+r_info[quest[num].r_idx].name);
495 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)を達成した。\n",
496 " %2d:%02d %20s completed random quest '%s'\n"), hour, min, note_level, name);
499 case NIKKI_RAND_QUEST_F:
502 strcpy(name, r_name+r_info[quest[num].r_idx].name);
503 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)から逃げ出した。\n",
504 " %2d:%02d %20s ran away from quest '%s'.\n"), hour, min, note_level, name);
507 case NIKKI_MAXDEAPTH:
509 fprintf(fff, _(" %2d:%02d %20s %sの最深階%d階に到達した。\n",
510 " %2d:%02d %20s reached level %d of %s for the first time.\n"), hour, min, note_level,
511 _(d_name+d_info[dungeon_type].name, num),
512 _(num, d_name+d_info[dungeon_type].name));
517 fprintf(fff, _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n",
518 " %2d:%02d %20s reset recall level of %s to %d %s.\n"), hour, min, note_level, note,
519 _(d_name + d_info[num].name, (int)max_dlv[num]),
520 _((int)max_dlv[num], d_name + d_info[num].name));
526 if (q_idx && (is_fixed_quest_idx(q_idx)
527 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
529 to = _("地上", "the surface");
533 if (!(dun_level+num)) to = _("地上", "the surface");
534 else to = format(_("%d階", "level %d"), dun_level+num);
536 fprintf(fff, _(" %2d:%02d %20s %sへ%s。\n", " %2d:%02d %20s %s %s.\n"), hour, min, note_level, _(to, note), _(note, to));
542 fprintf(fff, _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n"),
543 hour, min, note_level, _(d_name+d_info[dungeon_type].name, (int)max_dlv[dungeon_type]),
544 _((int)max_dlv[dungeon_type], d_name+d_info[dungeon_type].name));
546 fprintf(fff, _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n"), hour, min, note_level);
551 if (quest[num].flags & QUEST_FLAG_SILENT) break;
552 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」へと突入した。\n", " %2d:%02d %20s entered the quest '%s'.\n"),
553 hour, min, note_level, quest[num].name);
558 fprintf(fff, _(" %2d:%02d %20s レベル・テレポートで脱出した。\n", " %2d:%02d %20s Got out using teleport level.\n"),
559 hour, min, note_level);
564 fprintf(fff, _(" %2d:%02d %20s %sを購入した。\n", " %2d:%02d %20s bought %s.\n"), hour, min, note_level, note);
569 fprintf(fff, _(" %2d:%02d %20s %sを売却した。\n", " %2d:%02d %20s sold %s.\n"), hour, min, note_level, note);
577 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦で、%sの前に敗れ去った。\n", " %2d:%02d %20s beaten by %s in the %d%s fight.\n"),
578 hour, min, note_level, _(n, note), _("", n), _(note, get_ordinal_number_suffix(n)));
581 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦(%s)に勝利した。\n", " %2d:%02d %20s won the %d%s fight (%s).\n"),
582 hour, min, note_level, num, _("", get_ordinal_number_suffix(num)), note);
584 if (num == MAX_ARENA_MONS)
586 fprintf(fff, _(" 闘技場のすべての敵に勝利し、チャンピオンとなった。\n",
587 " won all fight to become a Chanpion.\n"));
594 fprintf(fff, _(" %2d:%02d %20s %sを識別した。\n", " %2d:%02d %20s identified %s.\n"), hour, min, note_level, note);
601 to = _("地上", "the surface");
603 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
605 fprintf(fff, _(" %2d:%02d %20s %sへとウィザード・テレポートで移動した。\n",
606 " %2d:%02d %20s wizard-teleport to %s.\n"), hour, min, note_level, to);
613 to = _("地上", "the surface");
615 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
617 fprintf(fff, _(" %2d:%02d %20s %sへとパターンの力で移動した。\n",
618 " %2d:%02d %20s used Pattern to teleport to %s.\n"), hour, min, note_level, to);
623 fprintf(fff, _(" %2d:%02d %20s レベルが%dに上がった。\n", " %2d:%02d %20s reached player level %d.\n"), hour, min, note_level, num);
626 case NIKKI_GAMESTART:
628 time_t ct = time((time_t*)0);
632 fprintf(fff, "%s %s",note, ctime(&ct));
635 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
638 case NIKKI_NAMED_PET:
640 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
643 case RECORD_NAMED_PET_NAME:
644 fprintf(fff, _("%sを旅の友にすることに決めた。\n", "decided to travel together with %s.\n"), note);
646 case RECORD_NAMED_PET_UNNAME:
647 fprintf(fff, _("%sの名前を消した。\n", "unnamed %s.\n"), note);
649 case RECORD_NAMED_PET_DISMISS:
650 fprintf(fff, _("%sを解放した。\n", "dismissed %s.\n"), note);
652 case RECORD_NAMED_PET_DEATH:
653 fprintf(fff, _("%sが死んでしまった。\n", "%s died.\n"), note);
655 case RECORD_NAMED_PET_MOVED:
656 fprintf(fff, _("%sをおいて別のマップへ移動した。\n", "moved to another map leaving %s behind.\n"), note);
658 case RECORD_NAMED_PET_LOST_SIGHT:
659 fprintf(fff, _("%sとはぐれてしまった。\n", "lost sight of %s.\n"), note);
661 case RECORD_NAMED_PET_DESTROY:
662 fprintf(fff, _("%sが*破壊*によって消え去った。\n", "%s was made disappeared by *destruction*.\n"), note);
664 case RECORD_NAMED_PET_EARTHQUAKE:
665 fprintf(fff, _("%sが岩石に押し潰された。\n", "%s was crushed by falling rocks.\n"), note);
667 case RECORD_NAMED_PET_GENOCIDE:
668 fprintf(fff, _("%sが抹殺によって消え去った。\n", "%s was made disappeared by genocide.\n"), note);
670 case RECORD_NAMED_PET_WIZ_ZAP:
671 fprintf(fff, _("%sがデバッグコマンドによって消え去った。\n", "%s was removed by debug command.\n"), note);
673 case RECORD_NAMED_PET_TELE_LEVEL:
674 fprintf(fff, _("%sがテレポート・レベルによって消え去った。\n", "%s was made disappeared by teleport level.\n"), note);
676 case RECORD_NAMED_PET_BLAST:
677 fprintf(fff, _("%sを爆破した。\n", "blasted %s.\n"), note);
679 case RECORD_NAMED_PET_HEAL_LEPER:
680 fprintf(fff, _("%sの病気が治り旅から外れた。\n", "%s was healed and left.\n"), note);
682 case RECORD_NAMED_PET_COMPACT:
683 fprintf(fff, _("%sがモンスター情報圧縮によって消え去った。\n", "%s was made disappeared by compacting monsters.\n"), note);
685 case RECORD_NAMED_PET_LOSE_PARENT:
686 fprintf(fff, _("%sの召喚者が既にいないため消え去った。\n", "%s disappeared because there does not exist summoner.\n"), note);
697 case NIKKI_WIZARD_LOG:
698 fprintf(fff, "%s\n", note);
707 if (do_level) write_level = FALSE;
713 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
716 * @brief 日記のタイトル表記と内容出力 /
719 * 日記のタイトルは本関数の subtitle ローカル変数で定義されている。
721 static void do_cmd_disp_nikki(void)
723 char nikki_title[256];
729 static const char subtitle[][30] = {"最強の肉体を求めて",
760 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
761 "Attack is the best form of defence.",
763 "An unexpected windfall",
764 "A drowning man will catch at a straw",
765 "Don't count your chickens before they are hatched.",
766 "It is no use crying over spilt milk.",
767 "Seeing is believing.",
768 "Strike the iron while it is hot.",
769 "I don't care what follows.",
770 "To dig a well to put out a house on fire.",
771 "Tomorrow is another day.",
772 "Easy come, easy go.",
773 "The more haste, the less speed.",
774 "Where there is life, there is hope.",
775 "There is no royal road to *WINNER*.",
776 "Danger past, God forgotten.",
777 "The best thing to do now is to run away.",
778 "Life is but an empty dream.",
779 "Dead men tell no tales.",
780 "A book that remains shut is but a block.",
781 "Misfortunes never come singly.",
782 "A little knowledge is a dangerous thing.",
783 "History repeats itself.",
784 "*WINNER* was not built in a day.",
785 "Ignorance is bliss.",
786 "To lose is to win?",
787 "No medicine can cure folly.",
788 "All good things come to an end.",
789 "M$ Empire strikes back.",
790 "To see is to believe",
792 "Quest of The World's Greatest Brain"};
794 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
796 /* Build the filename */
797 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
799 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
800 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
801 else if (IS_WIZARD_CLASS())
802 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
803 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
806 sprintf(nikki_title, "「%s%s%sの伝説 -%s-」",
807 ap_ptr->title, ap_ptr->no ? "の" : "", p_ptr->name, tmp);
809 sprintf(nikki_title, "Legend of %s %s '%s'",
810 ap_ptr->title, p_ptr->name, tmp);
813 /* Display the file contents */
814 show_file(FALSE, buf, nikki_title, -1, 0);
818 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
821 static void do_cmd_bunshou(void)
824 char bunshou[80] = "\0";
826 if (get_string(_("内容: ", "diary note: "), tmp, 79))
828 strcpy(bunshou, tmp);
830 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
835 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
838 static void do_cmd_last_get(void)
843 if (record_o_name[0] == '\0') return;
845 sprintf(buf,_("%sの入手を記録します。", "Do you really want to record getting %s? "),record_o_name);
846 if (!get_check(buf)) return;
850 sprintf(buf,_("%sを手に入れた。", "descover %s."), record_o_name);
851 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
856 * @brief ファイル中の全日記記録を消去する /
859 static void do_cmd_erase_nikki(void)
865 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your record? "))) return;
866 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
868 /* Build the filename */
869 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
871 /* Remove the file */
874 fff = my_fopen(buf, "w");
877 msg_format(_("記録を消去しました。", "deleted record."));
879 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
888 void do_cmd_nikki(void)
892 /* File type is "TEXT" */
893 FILE_TYPE(FILE_TYPE_TEXT);
895 /* Save the screen */
898 /* Interact until done */
904 /* Ask for a choice */
905 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
907 /* Give some choices */
908 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
909 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
910 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record item you last get/identify"), 6, 5);
911 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
913 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
916 prt(_("コマンド:", "Command: "), 18, 0);
922 if (i == ESCAPE) break;
936 do_cmd_erase_nikki();
940 prepare_movie_hooks();
942 default: /* Unknown option */
950 /* Restore the screen */
955 * @brief 画面を再描画するコマンドのメインルーチン
956 * Hack -- redraw the screen
960 * This command performs various low level updates, clears all the "extra"
961 * windows, does a total redraw of the main window, and requests all of the
962 * interesting updates and redraws that I can think of.
964 * This command is also used to "instantiate" the results of the user
965 * selecting various things, such as graphics mode, so it must call
966 * the "TERM_XTRA_REACT" hook before redrawing the windows.
969 void do_cmd_redraw(void)
976 /* Hack -- react to changes */
977 Term_xtra(TERM_XTRA_REACT, 0);
980 /* Combine and Reorder the pack (later) */
981 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
985 p_ptr->update |= (PU_TORCH);
988 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
990 /* Forget lite/view */
991 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
993 /* Update lite/view */
994 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
996 /* Update monsters */
997 p_ptr->update |= (PU_MONSTERS);
999 /* Redraw everything */
1000 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1003 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1006 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1010 /* Hack -- update */
1013 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1016 /* Redraw every window */
1017 for (j = 0; j < 8; j++)
1020 if (!angband_term[j]) continue;
1023 Term_activate(angband_term[j]);
1038 * @brief 名前を変更するコマンドのメインルーチン
1039 * Hack -- change name
1042 void do_cmd_change_name(void)
1051 /* Save the screen */
1059 /* Display the player */
1060 display_player(mode);
1065 display_player(mode);
1070 Term_putstr(2, 23, -1, TERM_WHITE,
1071 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1073 Term_putstr(2, 23, -1, TERM_WHITE,
1074 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1082 if (c == ESCAPE) break;
1089 /* Process the player name */
1090 process_player_name(FALSE);
1096 sprintf(tmp, "%s.txt", player_base);
1097 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1099 if (tmp[0] && (tmp[0] != ' '))
1101 file_character(tmp);
1118 /* Flush messages */
1122 /* Restore the screen */
1125 /* Redraw everything */
1126 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1133 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1134 * Recall the most recent message
1137 void do_cmd_message_one(void)
1139 /* Recall one message XXX XXX XXX */
1140 prt(format("> %s", message_str(0)), 0, 0);
1145 * @brief メッセージのログを表示するコマンドのメインルーチン
1146 * Recall the most recent message
1150 * Show previous messages to the user -BEN-
1152 * The screen format uses line 0 and 23 for headers and prompts,
1153 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1155 * This command shows you which commands you are viewing, and allows
1156 * you to "search" for strings in the recall.
1158 * Note that messages may be longer than 80 characters, but they are
1159 * displayed using "infinite" length, with a special sub-command to
1160 * "slide" the virtual display to the left or right.
1162 * Attempt to only hilite the matching portions of the string.
1165 void do_cmd_messages(int num_now)
1169 char shower_str[81];
1170 char finder_str[81];
1177 Term_get_size(&wid, &hgt);
1179 /* Number of message lines in a screen */
1180 num_lines = hgt - 4;
1183 strcpy(finder_str, "");
1186 strcpy(shower_str, "");
1188 /* Total messages */
1191 /* Start on first message */
1194 /* Save the screen */
1200 /* Process requests until done */
1206 /* Dump up to 20 lines of messages */
1207 for (j = 0; (j < num_lines) && (i + j < n); j++)
1209 cptr msg = message_str(i+j);
1211 /* Dump the messages, bottom to top */
1212 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1214 /* Hilite "shower" */
1215 if (shower && shower[0])
1219 /* Display matches */
1220 while ((str = my_strstr(str, shower)) != NULL)
1222 int len = strlen(shower);
1224 /* Display the match */
1225 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1233 /* Erase remaining lines */
1234 for (; j < num_lines; j++)
1236 Term_erase(0, num_lines + 1 - j, 255);
1239 /* Display header XXX XXX XXX */
1241 prt(format(_("以前のメッセージ %d-%d 全部で(%d)", "Message Recall (%d-%d of %d)"),
1242 i, i + j - 1, n), 0, 0);
1244 /* Display prompt (not very informative) */
1245 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1246 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1249 skey = inkey_special(TRUE);
1251 /* Exit on Escape */
1252 if (skey == ESCAPE) break;
1254 /* Hack -- Save the old index */
1259 /* Hack -- handle show */
1262 prt(_("強調: ", "Show: "), hgt - 1, 0);
1264 /* Get a "shower" string, or continue */
1265 strcpy(back_str, shower_str);
1266 if (askfor(shower_str, 80))
1269 shower = shower_str[0] ? shower_str : NULL;
1271 else strcpy(shower_str, back_str);
1276 /* Hack -- handle find */
1283 prt(_("検索: ", "Find: "), hgt - 1, 0);
1285 /* Get a "finder" string, or continue */
1286 strcpy(back_str, finder_str);
1287 if (!askfor(finder_str, 80))
1289 strcpy(finder_str, back_str);
1292 else if (!finder_str[0])
1294 shower = NULL; /* Stop showing */
1299 shower = finder_str;
1302 for (z = i + 1; z < n; z++)
1304 cptr msg = message_str(z);
1307 if (my_strstr(msg, finder_str))
1319 /* Recall 1 older message */
1321 /* Go to the oldest line */
1325 /* Recall 1 newer message */
1327 /* Go to the newest line */
1331 /* Recall 1 older message */
1336 /* Go older if legal */
1337 i = MIN(i + 1, n - num_lines);
1340 /* Recall 10 older messages */
1342 /* Go older if legal */
1343 i = MIN(i + 10, n - num_lines);
1346 /* Recall 20 older messages */
1351 /* Go older if legal */
1352 i = MIN(i + num_lines, n - num_lines);
1355 /* Recall 20 newer messages */
1359 /* Go newer (if able) */
1360 i = MAX(0, i - num_lines);
1363 /* Recall 10 newer messages */
1365 /* Go newer (if able) */
1369 /* Recall 1 newer messages */
1372 /* Go newer (if able) */
1377 /* Hack -- Error of some kind */
1381 /* Restore the screen */
1387 * @brief チートオプションを変更するコマンドのメインルーチン
1388 * Interact with some options for cheating
1389 * @param info 表示メッセージ
1392 static void do_cmd_options_cheat(cptr info)
1395 int i, k = 0, n = CHEAT_MAX;
1401 /* Interact with the player */
1406 /* Prompt XXX XXX XXX */
1407 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1412 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1413 prt(" << 注意 >>", 11, 0);
1414 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1415 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1416 prt(" じらないようにして下さい。", 14, 0);
1418 /* Display the options */
1419 for (i = 0; i < n; i++)
1421 byte a = TERM_WHITE;
1423 /* Color current option */
1424 if (i == k) a = TERM_L_BLUE;
1426 /* Display the option text */
1427 sprintf(buf, "%-48s: %s (%s)",
1428 cheat_info[i].o_desc,
1429 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1430 cheat_info[i].o_text);
1431 c_prt(a, buf, i + 2, 0);
1434 /* Hilite current option */
1435 move_cursor(k + 2, 50);
1441 * HACK - Try to translate the key into a direction
1442 * to allow using the roguelike keys for navigation.
1444 dir = get_keymap_dir(ch);
1445 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1459 k = (n + k - 1) % n;
1477 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1478 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1479 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1480 (*cheat_info[k].o_var) = TRUE;
1489 (*cheat_info[k].o_var) = FALSE;
1496 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1497 /* Peruse the help file */
1498 (void)show_file(TRUE, buf, NULL, 0, 0);
1515 * @brief セーブ頻度ターンの次の値を返す
1516 * @param current 現在のセーブ頻度ターン値
1517 * @return 次のセーブ頻度ターン値
1519 static s16b toggle_frequency(s16b current)
1524 case 50: return 100;
1525 case 100: return 250;
1526 case 250: return 500;
1527 case 500: return 1000;
1528 case 1000: return 2500;
1529 case 2500: return 5000;
1530 case 5000: return 10000;
1531 case 10000: return 25000;
1538 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1539 * @param info 表示メッセージ
1542 static void do_cmd_options_autosave(cptr info)
1546 int i, k = 0, n = 2;
1554 /* Interact with the player */
1557 /* Prompt XXX XXX XXX */
1558 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1559 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1563 /* Display the options */
1564 for (i = 0; i < n; i++)
1566 byte a = TERM_WHITE;
1568 /* Color current option */
1569 if (i == k) a = TERM_L_BLUE;
1571 /* Display the option text */
1572 sprintf(buf, "%-48s: %s (%s)",
1573 autosave_info[i].o_desc,
1574 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1575 autosave_info[i].o_text);
1576 c_prt(a, buf, i + 2, 0);
1578 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1580 /* Hilite current option */
1581 move_cursor(k + 2, 50);
1597 k = (n + k - 1) % n;
1615 (*autosave_info[k].o_var) = TRUE;
1624 (*autosave_info[k].o_var) = FALSE;
1632 autosave_freq = toggle_frequency(autosave_freq);
1633 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1639 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1655 * @brief 標準オプションを変更するコマンドのサブルーチン /
1656 * Interact with some options
1657 * @param page オプションページ番号
1658 * @param info 表示メッセージ
1661 void do_cmd_options_aux(int page, cptr info)
1664 int i, k = 0, n = 0, l;
1667 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1668 (!p_ptr->wizard || !allow_debug_opts);
1671 /* Lookup the options */
1672 for (i = 0; i < 24; i++) opt[i] = 0;
1674 /* Scan the options */
1675 for (i = 0; option_info[i].o_desc; i++)
1677 /* Notice options on this "page" */
1678 if (option_info[i].o_page == page) opt[n++] = i;
1685 /* Interact with the player */
1690 /* Prompt XXX XXX XXX */
1691 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1692 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1695 /* HACK -- description for easy-auto-destroy options */
1696 if (page == OPT_PAGE_AUTODESTROY)
1697 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1698 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1700 /* Display the options */
1701 for (i = 0; i < n; i++)
1703 byte a = TERM_WHITE;
1705 /* Color current option */
1706 if (i == k) a = TERM_L_BLUE;
1708 /* Display the option text */
1709 sprintf(buf, "%-48s: %s (%.19s)",
1710 option_info[opt[i]].o_desc,
1711 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1712 option_info[opt[i]].o_text);
1713 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1714 else c_prt(a, buf, i + 2, 0);
1717 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1720 /* Hilite current option */
1721 move_cursor(k + 2 + l, 50);
1727 * HACK - Try to translate the key into a direction
1728 * to allow using the roguelike keys for navigation.
1730 dir = get_keymap_dir(ch);
1731 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1745 k = (n + k - 1) % n;
1762 if (browse_only) break;
1763 (*option_info[opt[k]].o_var) = TRUE;
1772 if (browse_only) break;
1773 (*option_info[opt[k]].o_var) = FALSE;
1781 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1787 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1788 /* Peruse the help file */
1789 (void)show_file(TRUE, buf, NULL, 0, 0);
1806 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1807 * Modify the "window" options
1810 static void do_cmd_options_win(void)
1813 TERM_POSITION y = 0;
1814 TERM_POSITION x = 0;
1820 /* Memorize old flags */
1821 for (j = 0; j < 8; j++)
1823 /* Acquire current flags */
1824 old_flag[j] = window_flag[j];
1834 /* Prompt XXX XXX XXX */
1835 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1837 /* Display the windows */
1838 for (j = 0; j < 8; j++)
1840 byte a = TERM_WHITE;
1842 cptr s = angband_term_name[j];
1845 if (j == x) a = TERM_L_BLUE;
1847 /* Window name, staggered, centered */
1848 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1851 /* Display the options */
1852 for (i = 0; i < 16; i++)
1854 byte a = TERM_WHITE;
1856 cptr str = window_flag_desc[i];
1859 if (i == y) a = TERM_L_BLUE;
1862 if (!str) str = _("(未使用)", "(Unused option)");
1865 Term_putstr(0, i + 5, -1, a, str);
1867 /* Display the windows */
1868 for (j = 0; j < 8; j++)
1874 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1877 if (window_flag[j] & (1L << i)) c = 'X';
1880 Term_putch(35 + j * 5, i + 5, a, c);
1885 Term_gotoxy(35 + x * 5, y + 5);
1903 for (j = 0; j < 8; j++)
1905 window_flag[j] &= ~(1L << y);
1909 for (i = 0; i < 16; i++)
1911 window_flag[x] &= ~(1L << i);
1924 window_flag[x] |= (1L << y);
1932 window_flag[x] &= ~(1L << y);
1938 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
1946 d = get_keymap_dir(ch);
1948 x = (x + ddx[d] + 8) % 8;
1949 y = (y + ddy[d] + 16) % 16;
1956 /* Notice changes */
1957 for (j = 0; j < 8; j++)
1962 if (!angband_term[j]) continue;
1964 /* Ignore non-changes */
1965 if (window_flag[j] == old_flag[j]) continue;
1968 Term_activate(angband_term[j]);
1991 option_fields[OPT_NUM] =
1994 { '1', " キー入力 オプション", 3 },
1995 { '2', " マップ画面 オプション", 4 },
1996 { '3', " テキスト表示 オプション", 5 },
1997 { '4', " ゲームプレイ オプション", 6 },
1998 { '5', " 行動中止関係 オプション", 7 },
1999 { '6', " 簡易自動破壊 オプション", 8 },
2000 { 'r', " プレイ記録 オプション", 9 },
2002 { 'p', "自動拾いエディタ", 11 },
2003 { 'd', " 基本ウェイト量 ", 12 },
2004 { 'h', "低ヒットポイント", 13 },
2005 { 'm', " 低魔力色閾値 ", 14 },
2006 { 'a', " 自動セーブ オプション", 15 },
2007 { 'w', "ウインドウフラグ", 16 },
2009 { 'b', " 初期 オプション (参照のみ)", 18 },
2010 { 'c', " 詐欺 オプション", 19 },
2012 { '1', "Input Options", 3 },
2013 { '2', "Map Screen Options", 4 },
2014 { '3', "Text Display Options", 5 },
2015 { '4', "Game-Play Options", 6 },
2016 { '5', "Disturbance Options", 7 },
2017 { '6', "Easy Auto-Destroyer Options", 8 },
2018 { 'r', "Play record Options", 9 },
2020 { 'p', "Auto-picker/destroyer editor", 11 },
2021 { 'd', "Base Delay Factor", 12 },
2022 { 'h', "Hitpoint Warning", 13 },
2023 { 'm', "Mana Color Threshold", 14 },
2024 { 'a', "Autosave Options", 15 },
2025 { 'w', "Window Flags", 16 },
2027 { 'b', "Birth Options (Browse Only)", 18 },
2028 { 'c', "Cheat Options", 19 },
2034 * @brief 標準オプションを変更するコマンドのメインルーチン /
2035 * Set or unset various options.
2039 * The user must use the "Ctrl-R" command to "adapt" to changes
2040 * in any options which control "visual" aspects of the game.
2043 void do_cmd_options(void)
2049 /* Save the screen */
2057 /* Does not list cheat option when cheat option is off */
2058 if (!p_ptr->noscore && !allow_debug_opts) n--;
2063 /* Why are we here */
2064 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2068 /* Give some choices */
2069 for (i = 0; i < n; i++)
2071 byte a = TERM_WHITE;
2072 if (i == y) a = TERM_L_BLUE;
2073 Term_putstr(5, option_fields[i].row, -1, a,
2074 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2077 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2080 skey = inkey_special(TRUE);
2081 if (!(skey & SKEY_MASK)) k = (char)skey;
2085 if (k == ESCAPE) break;
2087 if (my_strchr("\n\r ", k))
2089 k = option_fields[y].key;
2093 for (i = 0; i < n; i++)
2095 if (tolower(k) == option_fields[i].key) break;
2098 /* Command is found */
2101 /* Hack -- browse help */
2102 if (k == '?') break;
2106 if (skey == SKEY_UP) d = 8;
2107 if (skey == SKEY_DOWN) d = 2;
2108 y = (y + ddy[d] + n) % n;
2113 if (k == ESCAPE) break;
2120 /* Process the general options */
2121 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2127 /* Process the general options */
2128 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2135 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2142 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2149 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2156 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2160 /* Play-record Options */
2165 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2174 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2175 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2176 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2180 /* Cheating Options */
2183 if (!p_ptr->noscore && !allow_debug_opts)
2185 /* Cheat options are not permitted */
2191 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2198 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2207 do_cmd_options_win();
2208 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2209 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2210 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2211 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2216 /* Auto-picker/destroyer editor */
2220 do_cmd_edit_autopick();
2224 /* Hack -- Delay Speed */
2230 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2232 /* Get a new value */
2235 int msec = delay_factor * delay_factor * delay_factor;
2236 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2237 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2239 if (k == ESCAPE) break;
2242 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2245 else if (isdigit(k)) delay_factor = D2I(k);
2252 /* Hack -- hitpoint warning factor */
2258 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2260 /* Get a new value */
2263 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2264 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2266 if (k == ESCAPE) break;
2269 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2272 else if (isdigit(k)) hitpoint_warn = D2I(k);
2279 /* Hack -- mana color factor */
2285 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2287 /* Get a new value */
2290 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2291 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2293 if (k == ESCAPE) break;
2296 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2299 else if (isdigit(k)) mana_warn = D2I(k);
2307 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2311 /* Unknown option */
2320 /* Flush messages */
2325 /* Restore the screen */
2328 /* Hack - Redraw equippy chars */
2329 p_ptr->redraw |= (PR_EQUIPPY);
2335 * @brief prefファイルを選択して処理する /
2336 * Ask for a "user pref line" and process it
2339 * XXX XXX XXX Allow absolute file names?
2341 void do_cmd_pref(void)
2348 /* Ask for a "user pref command" */
2349 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2351 /* Process that pref command */
2352 (void)process_pref_file_command(buf);
2356 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2359 void do_cmd_reload_autopick(void)
2361 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2362 /* Load the file with messages */
2363 autopick_load_pref(TRUE);
2369 * @brief マクロ情報をprefファイルに保存する /
2370 * @param fname ファイル名
2373 static errr macro_dump(cptr fname)
2375 static cptr mark = "Macro Dump";
2381 /* Build the filename */
2382 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2384 /* File type is "TEXT" */
2385 FILE_TYPE(FILE_TYPE_TEXT);
2387 /* Append to the file */
2388 if (!open_auto_dump(buf, mark)) return (-1);
2391 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2394 for (i = 0; i < macro__num; i++)
2396 /* Extract the action */
2397 ascii_to_text(buf, macro__act[i]);
2399 /* Dump the macro */
2400 auto_dump_printf("A:%s\n", buf);
2402 /* Extract the action */
2403 ascii_to_text(buf, macro__pat[i]);
2405 /* Dump normal macros */
2406 auto_dump_printf("P:%s\n", buf);
2409 auto_dump_printf("\n");
2421 * @brief マクロのトリガーキーを取得する /
2422 * Hack -- ask for a "trigger" (see below)
2423 * @param buf キー表記を保管するバッファ
2427 * Note the complex use of the "inkey()" function from "util.c".
2429 * Note that both "flush()" calls are extremely important.
2432 static void do_cmd_macro_aux(char *buf)
2441 /* Do not process macros */
2447 /* Read the pattern */
2453 /* Do not process macros */
2456 /* Do not wait for keys */
2459 /* Attempt to read a key */
2470 /* Convert the trigger */
2471 ascii_to_text(tmp, buf);
2473 /* Hack -- display the trigger */
2474 Term_addstr(-1, TERM_WHITE, tmp);
2480 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2481 * Hack -- ask for a keymap "trigger" (see below)
2482 * @param buf キー表記を取得するバッファ
2486 * Note that both "flush()" calls are extremely important. This may
2487 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2490 static void do_cmd_macro_aux_keymap(char *buf)
2504 /* Convert to ascii */
2505 ascii_to_text(tmp, buf);
2507 /* Hack -- display the trigger */
2508 Term_addstr(-1, TERM_WHITE, tmp);
2517 * @brief キーマップをprefファイルにダンプする /
2518 * Hack -- append all keymaps to the given file
2519 * @param fname ファイルネーム
2523 static errr keymap_dump(cptr fname)
2525 static cptr mark = "Keymap Dump";
2534 if (rogue_like_commands)
2536 mode = KEYMAP_MODE_ROGUE;
2542 mode = KEYMAP_MODE_ORIG;
2546 /* Build the filename */
2547 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2549 /* File type is "TEXT" */
2550 FILE_TYPE(FILE_TYPE_TEXT);
2552 /* Append to the file */
2553 if (!open_auto_dump(buf, mark)) return -1;
2556 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2559 for (i = 0; i < 256; i++)
2563 /* Loop up the keymap */
2564 act = keymap_act[mode][i];
2566 /* Skip empty keymaps */
2569 /* Encode the key */
2572 ascii_to_text(key, buf);
2574 /* Encode the action */
2575 ascii_to_text(buf, act);
2577 /* Dump the macro */
2578 auto_dump_printf("A:%s\n", buf);
2579 auto_dump_printf("C:%d:%s\n", mode, key);
2591 * @brief マクロを設定するコマンドのメインルーチン /
2592 * Interact with "macros"
2596 * Note that the macro "action" must be defined before the trigger.
2598 * Could use some helpful instructions on this page. XXX XXX XXX
2601 void do_cmd_macros(void)
2613 if (rogue_like_commands)
2615 mode = KEYMAP_MODE_ROGUE;
2621 mode = KEYMAP_MODE_ORIG;
2624 /* File type is "TEXT" */
2625 FILE_TYPE(FILE_TYPE_TEXT);
2632 /* Process requests until done */
2639 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2641 /* Describe that action */
2642 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2644 /* Analyze the current action */
2645 ascii_to_text(buf, macro__buf);
2647 /* Display the current action */
2652 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2654 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2655 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2656 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2657 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2658 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2659 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2660 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2661 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2662 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2663 #endif /* ALLOW_MACROS */
2666 prt(_("コマンド: ", "Command: "), 16, 0);
2672 if (i == ESCAPE) break;
2674 /* Load a 'macro' file */
2680 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2683 prt(_("ファイル: ", "File: "), 18, 0);
2685 /* Default filename */
2686 sprintf(tmp, "%s.prf", player_base);
2688 /* Ask for a file */
2689 if (!askfor(tmp, 80)) continue;
2691 /* Process the given filename */
2692 err = process_pref_file(tmp);
2695 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2700 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2704 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2714 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2717 prt(_("ファイル: ", "File: "), 18, 0);
2719 /* Default filename */
2720 sprintf(tmp, "%s.prf", player_base);
2722 /* Ask for a file */
2723 if (!askfor(tmp, 80)) continue;
2725 /* Dump the macros */
2726 (void)macro_dump(tmp);
2729 msg_print(_("マクロを追加しました。", "Appended macros."));
2738 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2742 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2744 /* Get a macro trigger */
2745 do_cmd_macro_aux(buf);
2747 /* Acquire action */
2748 k = macro_find_exact(buf);
2754 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2760 /* Obtain the action */
2761 strcpy(macro__buf, macro__act[k]);
2763 /* Analyze the current action */
2764 ascii_to_text(buf, macro__buf);
2766 /* Display the current action */
2770 msg_print(_("マクロを確認しました。", "Found a macro."));
2774 /* Create a macro */
2778 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2781 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2783 /* Get a macro trigger */
2784 do_cmd_macro_aux(buf);
2790 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2791 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2794 prt(_("マクロ行動: ", "Action: "), 20, 0);
2796 /* Convert to text */
2797 ascii_to_text(tmp, macro__buf);
2799 /* Get an encoded action */
2800 if (askfor(tmp, 80))
2802 /* Convert to ascii */
2803 text_to_ascii(macro__buf, tmp);
2805 /* Link the macro */
2806 macro_add(buf, macro__buf);
2809 msg_print(_("マクロを追加しました。", "Added a macro."));
2813 /* Remove a macro */
2817 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2820 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2822 /* Get a macro trigger */
2823 do_cmd_macro_aux(buf);
2825 /* Link the macro */
2826 macro_add(buf, buf);
2829 msg_print(_("マクロを削除しました。", "Removed a macro."));
2836 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2839 prt(_("ファイル: ", "File: "), 18, 0);
2841 /* Default filename */
2842 sprintf(tmp, "%s.prf", player_base);
2844 /* Ask for a file */
2845 if (!askfor(tmp, 80)) continue;
2847 /* Dump the macros */
2848 (void)keymap_dump(tmp);
2851 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2854 /* Query a keymap */
2860 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2863 prt(_("押すキー: ", "Keypress: "), 18, 0);
2865 /* Get a keymap trigger */
2866 do_cmd_macro_aux_keymap(buf);
2868 /* Look up the keymap */
2869 act = keymap_act[mode][(byte)(buf[0])];
2875 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2881 /* Obtain the action */
2882 strcpy(macro__buf, act);
2884 /* Analyze the current action */
2885 ascii_to_text(buf, macro__buf);
2887 /* Display the current action */
2891 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2895 /* Create a keymap */
2899 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2902 prt(_("押すキー: ", "Keypress: "), 18, 0);
2904 /* Get a keymap trigger */
2905 do_cmd_macro_aux_keymap(buf);
2911 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2912 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2915 prt(_("行動: ", "Action: "), 20, 0);
2917 /* Convert to text */
2918 ascii_to_text(tmp, macro__buf);
2920 /* Get an encoded action */
2921 if (askfor(tmp, 80))
2923 /* Convert to ascii */
2924 text_to_ascii(macro__buf, tmp);
2926 /* Free old keymap */
2927 string_free(keymap_act[mode][(byte)(buf[0])]);
2929 /* Make new keymap */
2930 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2933 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2937 /* Remove a keymap */
2941 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
2944 prt(_("押すキー: ", "Keypress: "), 18, 0);
2946 /* Get a keymap trigger */
2947 do_cmd_macro_aux_keymap(buf);
2949 /* Free old keymap */
2950 string_free(keymap_act[mode][(byte)(buf[0])]);
2952 /* Make new keymap */
2953 keymap_act[mode][(byte)(buf[0])] = NULL;
2956 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
2959 /* Enter a new action */
2963 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
2969 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2970 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2973 prt(_("マクロ行動: ", "Action: "), 20, 0);
2975 /* Hack -- limit the value */
2978 /* Get an encoded action */
2979 if (!askfor(buf, 80)) continue;
2981 /* Extract an action */
2982 text_to_ascii(macro__buf, buf);
2985 #endif /* ALLOW_MACROS */
2994 /* Flush messages */
3003 * @brief キャラクタ色の明暗表現
3005 static cptr lighting_level_str[F_LIT_MAX] =
3020 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
3021 * @param i 指定対象となるキャラクタコード
3022 * @param num 指定されたビジュアルIDを返す参照ポインタ
3023 * @param max ビジュアルIDの最大数
3024 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
3026 static bool cmd_visuals_aux(int i, IDX *num, IDX max)
3033 sprintf(str, "%d", *num);
3035 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3038 tmp = (IDX)strtol(str, NULL, 0);
3039 if (tmp >= 0 && tmp < max)
3042 else if (isupper(i))
3043 *num = (*num + max - 1) % max;
3045 *num = (*num + 1) % max;
3051 * @brief キャラクタの変更メニュー表示
3052 * @param choice_msg 選択メッセージ
3055 static void print_visuals_menu(cptr choice_msg)
3057 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3059 /* Give some choices */
3060 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3062 #ifdef ALLOW_VISUALS
3063 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3064 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3065 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3066 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3067 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3068 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3069 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3070 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3071 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3072 #endif /* ALLOW_VISUALS */
3074 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3077 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3080 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx);
3081 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx);
3082 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level);
3085 * Interact with "visuals"
3087 void do_cmd_visuals(void)
3092 bool need_redraw = FALSE;
3093 const char *empty_symbol = "<< ? >>";
3095 if (use_bigtile) empty_symbol = "<< ?? >>";
3097 /* File type is "TEXT" */
3098 FILE_TYPE(FILE_TYPE_TEXT);
3100 /* Save the screen */
3103 /* Interact until done */
3109 /* Ask for a choice */
3110 print_visuals_menu(NULL);
3116 if (i == ESCAPE) break;
3120 /* Load a 'pref' file */
3123 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3126 prt(_("ファイル: ", "File: "), 17, 0);
3128 /* Default filename */
3129 sprintf(tmp, "%s.prf", player_base);
3132 if (!askfor(tmp, 70)) continue;
3134 /* Process the given filename */
3135 (void)process_pref_file(tmp);
3140 #ifdef ALLOW_VISUALS
3142 /* Dump monster attr/chars */
3145 static cptr mark = "Monster attr/chars";
3148 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3151 prt(_("ファイル: ", "File: "), 17, 0);
3153 /* Default filename */
3154 sprintf(tmp, "%s.prf", player_base);
3156 /* Get a filename */
3157 if (!askfor(tmp, 70)) continue;
3159 /* Build the filename */
3160 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3162 /* Append to the file */
3163 if (!open_auto_dump(buf, mark)) continue;
3166 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3169 for (i = 0; i < max_r_idx; i++)
3171 monster_race *r_ptr = &r_info[i];
3173 /* Skip non-entries */
3174 if (!r_ptr->name) continue;
3176 /* Dump a comment */
3177 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3179 /* Dump the monster attr/char info */
3180 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3181 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3188 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3193 /* Dump object attr/chars */
3196 static cptr mark = "Object attr/chars";
3200 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3203 prt(_("ファイル: ", "File: "), 17, 0);
3205 /* Default filename */
3206 sprintf(tmp, "%s.prf", player_base);
3208 /* Get a filename */
3209 if (!askfor(tmp, 70)) continue;
3211 /* Build the filename */
3212 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3214 /* Append to the file */
3215 if (!open_auto_dump(buf, mark)) continue;
3218 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3221 for (k_idx = 0; k_idx < max_k_idx; k_idx++)
3224 object_kind *k_ptr = &k_info[k_idx];
3226 /* Skip non-entries */
3227 if (!k_ptr->name) continue;
3232 strip_name(o_name, k_idx);
3238 /* Prepare dummy object */
3239 object_prep(&forge, k_idx);
3241 /* Get un-shuffled flavor name */
3242 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3245 /* Dump a comment */
3246 auto_dump_printf("# %s\n", o_name);
3248 /* Dump the object attr/char info */
3249 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", (int)k_idx,
3250 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3257 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3262 /* Dump feature attr/chars */
3265 static cptr mark = "Feature attr/chars";
3268 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3271 prt(_("ファイル: ", "File: "), 17, 0);
3273 /* Default filename */
3274 sprintf(tmp, "%s.prf", player_base);
3276 /* Get a filename */
3277 if (!askfor(tmp, 70)) continue;
3279 /* Build the filename */
3280 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3282 /* Append to the file */
3283 if (!open_auto_dump(buf, mark)) continue;
3286 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3289 for (i = 0; i < max_f_idx; i++)
3291 feature_type *f_ptr = &f_info[i];
3293 /* Skip non-entries */
3294 if (!f_ptr->name) continue;
3296 /* Skip mimiccing features */
3297 if (f_ptr->mimic != i) continue;
3299 /* Dump a comment */
3300 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3302 /* Dump the feature attr/char info */
3303 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3304 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3305 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3306 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3313 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3318 /* Modify monster attr/chars (numeric operation) */
3321 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3324 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3326 /* Hack -- query until done */
3329 monster_race *r_ptr = &r_info[r];
3333 byte da = r_ptr->d_attr;
3334 byte dc = r_ptr->d_char;
3335 byte ca = r_ptr->x_attr;
3336 byte cc = r_ptr->x_char;
3338 /* Label the object */
3339 Term_putstr(5, 17, -1, TERM_WHITE,
3340 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3342 /* Label the Default values */
3343 Term_putstr(10, 19, -1, TERM_WHITE,
3344 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3346 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3347 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3349 /* Label the Current values */
3350 Term_putstr(10, 20, -1, TERM_WHITE,
3351 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3353 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3354 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3357 Term_putstr(0, 22, -1, TERM_WHITE,
3358 _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "));
3364 if (i == ESCAPE) break;
3366 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3367 else if (isupper(i)) c = 'a' + i - 'A';
3377 if (!cmd_visuals_aux(i, &r, max_r_idx))
3383 while (!r_info[r].name);
3387 t = (int)r_ptr->x_attr;
3388 (void)cmd_visuals_aux(i, &t, 256);
3389 r_ptr->x_attr = (byte)t;
3393 t = (int)r_ptr->x_char;
3394 (void)cmd_visuals_aux(i, &t, 256);
3395 r_ptr->x_char = (byte)t;
3399 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3403 print_visuals_menu(choice_msg);
3411 /* Modify object attr/chars (numeric operation) */
3414 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3416 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3418 /* Hack -- query until done */
3421 object_kind *k_ptr = &k_info[k];
3425 SYMBOL_COLOR da = k_ptr->d_attr;
3426 SYMBOL_CODE dc = k_ptr->d_char;
3427 SYMBOL_COLOR ca = k_ptr->x_attr;
3428 SYMBOL_CODE cc = k_ptr->x_char;
3430 /* Label the object */
3431 Term_putstr(5, 17, -1, TERM_WHITE,
3432 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3433 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3435 /* Label the Default values */
3436 Term_putstr(10, 19, -1, TERM_WHITE,
3437 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3439 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3440 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3442 /* Label the Current values */
3443 Term_putstr(10, 20, -1, TERM_WHITE,
3444 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3446 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3447 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3450 Term_putstr(0, 22, -1, TERM_WHITE,
3451 _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "));
3457 if (i == ESCAPE) break;
3459 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3460 else if (isupper(i)) c = 'a' + i - 'A';
3470 if (!cmd_visuals_aux(i, &k, max_k_idx))
3476 while (!k_info[k].name);
3480 t = (int)k_ptr->x_attr;
3481 (void)cmd_visuals_aux(i, &t, 256);
3482 k_ptr->x_attr = (byte)t;
3486 t = (int)k_ptr->x_char;
3487 (void)cmd_visuals_aux(i, &t, 256);
3488 k_ptr->x_char = (byte)t;
3492 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3496 print_visuals_menu(choice_msg);
3504 /* Modify feature attr/chars (numeric operation) */
3507 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3509 static IDX lighting_level = F_LIT_STANDARD;
3510 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3512 /* Hack -- query until done */
3515 feature_type *f_ptr = &f_info[f];
3519 byte da = f_ptr->d_attr[lighting_level];
3520 byte dc = f_ptr->d_char[lighting_level];
3521 byte ca = f_ptr->x_attr[lighting_level];
3522 byte cc = f_ptr->x_char[lighting_level];
3524 /* Label the object */
3526 Term_putstr(5, 17, -1, TERM_WHITE,
3527 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3528 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3530 /* Label the Default values */
3531 Term_putstr(10, 19, -1, TERM_WHITE,
3532 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3534 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3535 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3537 /* Label the Current values */
3539 Term_putstr(10, 20, -1, TERM_WHITE,
3540 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3542 Term_putstr(10, 20, -1, TERM_WHITE,
3543 format("Current attr/char = %3d / %3d", ca, cc));
3546 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3547 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3551 Term_putstr(0, 22, -1, TERM_WHITE,
3552 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3554 Term_putstr(0, 22, -1, TERM_WHITE,
3555 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3562 if (i == ESCAPE) break;
3564 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3565 else if (isupper(i)) c = 'a' + i - 'A';
3575 if (!cmd_visuals_aux(i, &f, max_f_idx))
3581 while (!f_info[f].name || (f_info[f].mimic != f));
3585 t = (int)f_ptr->x_attr[lighting_level];
3586 (void)cmd_visuals_aux(i, &t, 256);
3587 f_ptr->x_attr[lighting_level] = (byte)t;
3591 t = (int)f_ptr->x_char[lighting_level];
3592 (void)cmd_visuals_aux(i, &t, 256);
3593 f_ptr->x_char[lighting_level] = (byte)t;
3597 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3600 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3604 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3608 print_visuals_menu(choice_msg);
3616 /* Modify monster attr/chars (visual mode) */
3618 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3621 /* Modify object attr/chars (visual mode) */
3623 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3626 /* Modify feature attr/chars (visual mode) */
3629 IDX lighting_level = F_LIT_STANDARD;
3630 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3634 #endif /* ALLOW_VISUALS */
3643 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3647 /* Unknown option */
3653 /* Flush messages */
3657 /* Restore the screen */
3660 if (need_redraw) do_cmd_redraw();
3665 * Interact with "colors"
3667 void do_cmd_colors(void)
3676 /* File type is "TEXT" */
3677 FILE_TYPE(FILE_TYPE_TEXT);
3680 /* Save the screen */
3684 /* Interact until done */
3690 /* Ask for a choice */
3691 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3693 /* Give some choices */
3694 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3697 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3698 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3702 prt(_("コマンド: ", "Command: "), 8, 0);
3707 if (i == ESCAPE) break;
3709 /* Load a 'pref' file */
3713 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3716 prt(_("ファイル: ", "File: "), 10, 0);
3719 sprintf(tmp, "%s.prf", player_base);
3722 if (!askfor(tmp, 70)) continue;
3724 /* Process the given filename */
3725 (void)process_pref_file(tmp);
3727 /* Mega-Hack -- react to changes */
3728 Term_xtra(TERM_XTRA_REACT, 0);
3730 /* Mega-Hack -- redraw */
3739 static cptr mark = "Colors";
3742 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3745 prt(_("ファイル: ", "File: "), 10, 0);
3747 /* Default filename */
3748 sprintf(tmp, "%s.prf", player_base);
3750 /* Get a filename */
3751 if (!askfor(tmp, 70)) continue;
3753 /* Build the filename */
3754 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3756 /* Append to the file */
3757 if (!open_auto_dump(buf, mark)) continue;
3760 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3763 for (i = 0; i < 256; i++)
3765 int kv = angband_color_table[i][0];
3766 int rv = angband_color_table[i][1];
3767 int gv = angband_color_table[i][2];
3768 int bv = angband_color_table[i][3];
3770 cptr name = _("未知", "unknown");
3772 /* Skip non-entries */
3773 if (!kv && !rv && !gv && !bv) continue;
3775 /* Extract the color name */
3776 if (i < 16) name = color_names[i];
3778 /* Dump a comment */
3779 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3781 /* Dump the monster attr/char info */
3782 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3790 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3799 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3801 /* Hack -- query until done */
3810 /* Exhibit the normal colors */
3811 for (j = 0; j < 16; j++)
3813 /* Exhibit this color */
3814 Term_putstr(j*4, 20, -1, a, "###");
3816 /* Exhibit all colors */
3817 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3820 /* Describe the color */
3821 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3823 /* Describe the color */
3824 Term_putstr(5, 10, -1, TERM_WHITE,
3825 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3827 /* Label the Current values */
3828 Term_putstr(5, 12, -1, TERM_WHITE,
3829 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3830 angband_color_table[a][0],
3831 angband_color_table[a][1],
3832 angband_color_table[a][2],
3833 angband_color_table[a][3]));
3836 Term_putstr(0, 14, -1, TERM_WHITE,
3837 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3844 if (i == ESCAPE) break;
3847 if (i == 'n') a = (byte)(a + 1);
3848 if (i == 'N') a = (byte)(a - 1);
3849 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3850 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3851 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3852 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3853 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3854 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3855 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3856 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3858 /* Hack -- react to changes */
3859 Term_xtra(TERM_XTRA_REACT, 0);
3861 /* Hack -- redraw */
3868 /* Unknown option */
3874 /* Flush messages */
3879 /* Restore the screen */
3885 * Note something in the message recall
3887 void do_cmd_note(void)
3895 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3897 /* Ignore empty notes */
3898 if (!buf[0] || (buf[0] == ' ')) return;
3900 /* Add the note to the message recall */
3901 msg_format(_("メモ: %s", "Note: %s"), buf);
3906 * Mention the current version
3908 void do_cmd_version(void)
3912 #if FAKE_VER_EXTRA > 0
3913 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3914 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3916 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3917 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3924 * Array of feeling strings
3926 static cptr do_cmd_feeling_text[11] =
3928 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3929 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3930 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3931 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3932 _("とても悪い予感がする...", "You have a very bad feeling..."),
3933 _("悪い予感がする...", "You have a bad feeling..."),
3934 _("何か緊張する。", "You feel nervous."),
3935 _("少し不運な気がする...", "You feel your luck is turning..."),
3936 _("この場所は好きになれない。", "You don't like the look of this place."),
3937 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3938 _("なんて退屈なところだ...", "What a boring place...")
3941 static cptr do_cmd_feeling_text_combat[11] =
3943 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3944 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3945 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
3946 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3947 _("とても悪い予感がする...", "You have a very bad feeling..."),
3948 _("悪い予感がする...", "You have a bad feeling..."),
3949 _("何か緊張する。", "You feel nervous."),
3950 _("少し不運な気がする...", "You feel your luck is turning..."),
3951 _("この場所は好きになれない。", "You don't like the look of this place."),
3952 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3953 _("なんて退屈なところだ...", "What a boring place...")
3956 static cptr do_cmd_feeling_text_lucky[11] =
3958 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3959 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3960 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
3961 _("素晴らしい感じがする...", "You have an excellent feeling..."),
3962 _("とても良い感じがする...", "You have a very good feeling..."),
3963 _("良い感じがする...", "You have a good feeling..."),
3964 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
3965 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
3966 _("見た感じ悪くはない...", "You like the look of this place..."),
3967 _("全然駄目ということはないが...", "This level can't be all bad..."),
3968 _("なんて退屈なところだ...", "What a boring place...")
3973 * Note that "feeling" is set to zero unless some time has passed.
3974 * Note that this is done when the level is GENERATED, not entered.
3976 void do_cmd_feeling(void)
3978 /* No useful feeling in quests */
3979 if (p_ptr->inside_quest && !random_quest_number(dun_level))
3981 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
3985 /* No useful feeling in town */
3986 else if (p_ptr->town_num && !dun_level)
3988 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
3990 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
3995 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
4000 /* No useful feeling in the wilderness */
4001 else if (!dun_level)
4003 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
4007 /* Display the feeling */
4008 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4009 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
4010 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
4011 inventory[INVEN_BOW].name1 == ART_CRIMSON)
4012 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
4014 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4020 * Description of each monster group.
4022 static cptr monster_group_text[] =
4025 "ユニーク", /* "Uniques" */
4026 "乗馬可能なモンスター", /* "Riding" */
4027 "賞金首", /* "Wanted */
4028 "アンバーの王族", /* "Ambertite" */
4057 /* "古代ドラゴン/ワイアーム", */
4118 /* "Ancient Dragon/Wyrm", */
4127 "Multi-Headed Reptile",
4132 "Reptile/Amphibian",
4133 "Spider/Scorpion/Tick",
4135 /* "Major Demon", */
4152 * Symbols of monsters in each group. Note the "Uniques" group
4153 * is handled differently.
4155 static cptr monster_group_char[] =
4212 "!$&()+./=>?[\\]`{|~",
4222 * hook function to sort monsters by level
4224 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4226 u16b *who = (u16b*)(u);
4231 monster_race *r_ptr1 = &r_info[w1];
4232 monster_race *r_ptr2 = &r_info[w2];
4237 if (r_ptr2->level > r_ptr1->level) return TRUE;
4238 if (r_ptr1->level > r_ptr2->level) return FALSE;
4240 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4241 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4246 * Build a list of monster indexes in the given group. Return the number
4247 * of monsters in the group.
4249 * mode & 0x01 : check for non-empty group
4250 * mode & 0x02 : visual operation only
4252 static IDX collect_monsters(IDX grp_cur, IDX mon_idx[], BIT_FLAGS8 mode)
4258 /* Get a list of x_char in this group */
4259 cptr group_char = monster_group_char[grp_cur];
4261 /* XXX Hack -- Check if this is the "Uniques" group */
4262 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4264 /* XXX Hack -- Check if this is the "Riding" group */
4265 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4267 /* XXX Hack -- Check if this is the "Wanted" group */
4268 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4270 /* XXX Hack -- Check if this is the "Amberite" group */
4271 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4274 /* Check every race */
4275 for (i = 0; i < max_r_idx; i++)
4277 /* Access the race */
4278 monster_race *r_ptr = &r_info[i];
4280 /* Skip empty race */
4281 if (!r_ptr->name) continue ;
4283 /* Require known monsters */
4284 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4288 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4291 else if (grp_riding)
4293 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4296 else if (grp_wanted)
4298 bool wanted = FALSE;
4300 for (j = 0; j < MAX_KUBI; j++)
4302 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4303 (p_ptr->today_mon && p_ptr->today_mon == i))
4309 if (!wanted) continue;
4312 else if (grp_amberite)
4314 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4319 /* Check for race in the group */
4320 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4324 mon_idx[mon_cnt++] = i;
4326 /* XXX Hack -- Just checking for non-empty group */
4327 if (mode & 0x01) break;
4330 /* Terminate the list */
4331 mon_idx[mon_cnt] = -1;
4333 /* Select the sort method */
4334 ang_sort_comp = ang_sort_comp_monster_level;
4335 ang_sort_swap = ang_sort_swap_hook;
4337 /* Sort by monster level */
4338 ang_sort(mon_idx, &dummy_why, mon_cnt);
4340 /* Return the number of races */
4346 * Description of each monster group.
4348 static cptr object_group_text[] =
4351 "キノコ", /* "Mushrooms" */
4352 "薬", /* "Potions" */
4353 "油つぼ", /* "Flasks" */
4354 "巻物", /* "Scrolls" */
4356 "アミュレット", /* "Amulets" */
4357 "笛", /* "Whistle" */
4358 "光源", /* "Lanterns" */
4359 "魔法棒", /* "Wands" */
4362 "カード", /* "Cards" */
4373 "刀剣類", /* "Swords" */
4374 "鈍器", /* "Blunt Weapons" */
4375 "長柄武器", /* "Polearms" */
4376 "採掘道具", /* "Diggers" */
4377 "飛び道具", /* "Bows" */
4381 "軽装鎧", /* "Soft Armor" */
4382 "重装鎧", /* "Hard Armor" */
4383 "ドラゴン鎧", /* "Dragon Armor" */
4384 "盾", /* "Shields" */
4385 "クローク", /* "Cloaks" */
4386 "籠手", /* "Gloves" */
4387 "ヘルメット", /* "Helms" */
4389 "ブーツ", /* "Boots" */
4442 * TVALs of items in each group
4444 static byte object_group_tval[] =
4485 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4493 * Build a list of object indexes in the given group. Return the number
4494 * of objects in the group.
4496 * mode & 0x01 : check for non-empty group
4497 * mode & 0x02 : visual operation only
4499 static int collect_objects(int grp_cur, IDX object_idx[], BIT_FLAGS8 mode)
4502 int j, k, object_cnt = 0;
4504 /* Get a list of x_char in this group */
4505 byte group_tval = object_group_tval[grp_cur];
4507 /* Check every object */
4508 for (i = 0; i < max_k_idx; i++)
4510 /* Access the object */
4511 object_kind *k_ptr = &k_info[i];
4513 /* Skip empty objects */
4514 if (!k_ptr->name) continue;
4518 /* Any objects will be displayed */
4524 /* Skip non-flavoured objects */
4525 if (!k_ptr->flavor) continue;
4527 /* Require objects ever seen */
4528 if (!k_ptr->aware) continue;
4531 /* Skip items with no distribution (special artifacts) */
4532 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4536 /* Check for objects in the group */
4537 if (TV_LIFE_BOOK == group_tval)
4539 /* Hack -- All spell books */
4540 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4542 /* Add the object */
4543 object_idx[object_cnt++] = i;
4547 else if (k_ptr->tval == group_tval)
4549 /* Add the object */
4550 object_idx[object_cnt++] = i;
4554 /* XXX Hack -- Just checking for non-empty group */
4555 if (mode & 0x01) break;
4558 /* Terminate the list */
4559 object_idx[object_cnt] = -1;
4561 /* Return the number of objects */
4567 * Description of each feature group.
4569 static cptr feature_group_text[] =
4577 * Build a list of feature indexes in the given group. Return the number
4578 * of features in the group.
4580 * mode & 0x01 : check for non-empty group
4582 static int collect_features(int grp_cur, IDX *feat_idx, BIT_FLAGS8 mode)
4587 /* Unused; There is a single group. */
4590 /* Check every feature */
4591 for (i = 0; i < max_f_idx; i++)
4593 /* Access the index */
4594 feature_type *f_ptr = &f_info[i];
4596 /* Skip empty index */
4597 if (!f_ptr->name) continue;
4599 /* Skip mimiccing features */
4600 if (f_ptr->mimic != i) continue;
4603 feat_idx[feat_cnt++] = i;
4605 /* XXX Hack -- Just checking for non-empty group */
4606 if (mode & 0x01) break;
4609 /* Terminate the list */
4610 feat_idx[feat_cnt] = -1;
4612 /* Return the number of races */
4619 * Build a list of monster indexes in the given group. Return the number
4620 * of monsters in the group.
4622 static int collect_artifacts(int grp_cur, int object_idx[])
4624 int i, object_cnt = 0;
4626 /* Get a list of x_char in this group */
4627 byte group_tval = object_group_tval[grp_cur];
4629 /* Check every object */
4630 for (i = 0; i < max_a_idx; i++)
4632 /* Access the artifact */
4633 artifact_type *a_ptr = &a_info[i];
4635 /* Skip empty artifacts */
4636 if (!a_ptr->name) continue;
4638 /* Skip "uncreated" artifacts */
4639 if (!a_ptr->cur_num) continue;
4641 /* Check for race in the group */
4642 if (a_ptr->tval == group_tval)
4645 object_idx[object_cnt++] = i;
4649 /* Terminate the list */
4650 object_idx[object_cnt] = 0;
4652 /* Return the number of races */
4659 * Encode the screen colors
4661 static char hack[17] = "dwsorgbuDWvyRGBU";
4665 * Hack -- load a screen dump from a file
4667 void do_cmd_load_screen(void)
4682 Term_get_size(&wid, &hgt);
4684 /* Build the filename */
4685 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4687 /* Append to the file */
4688 fff = my_fopen(buf, "r");
4692 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4698 /* Save the screen */
4701 /* Clear the screen */
4705 /* Load the screen */
4706 for (y = 0; okay; y++)
4708 /* Get a line of data including control code */
4709 if (!fgets(buf, 1024, fff)) okay = FALSE;
4711 /* Get the blank line */
4712 if (buf[0] == '\n' || buf[0] == '\0') break;
4714 /* Ignore too large screen image */
4715 if (y >= hgt) continue;
4718 for (x = 0; x < wid - 1; x++)
4721 if (buf[x] == '\n' || buf[x] == '\0') break;
4723 /* Put the attr/char */
4724 Term_draw(x, y, TERM_WHITE, buf[x]);
4728 /* Dump the screen */
4729 for (y = 0; okay; y++)
4731 /* Get a line of data including control code */
4732 if (!fgets(buf, 1024, fff)) okay = FALSE;
4734 /* Get the blank line */
4735 if (buf[0] == '\n' || buf[0] == '\0') break;
4737 /* Ignore too large screen image */
4738 if (y >= hgt) continue;
4741 for (x = 0; x < wid - 1; x++)
4744 if (buf[x] == '\n' || buf[x] == '\0') break;
4746 /* Get the attr/char */
4747 (void)(Term_what(x, y, &a, &c));
4749 /* Look up the attr */
4750 for (i = 0; i < 16; i++)
4752 /* Use attr matches */
4753 if (hack[i] == buf[x]) a = (byte_hack)i;
4756 /* Put the attr/char */
4757 Term_draw(x, y, a, c);
4767 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4773 /* Restore the screen */
4780 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4781 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4784 #define IM_FLAG_STR _("*", "* ")
4785 #define HAS_FLAG_STR _("+", "+ ")
4786 #define NO_FLAG_STR _("・", ". ")
4788 #define print_im_or_res_flag(IM, RES) \
4790 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4791 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4794 #define print_flag(TR) \
4796 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4800 /* XTRA HACK RESLIST */
4801 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
4803 char o_name[MAX_NLEN];
4804 u32b flgs[TR_FLAG_SIZE];
4806 if (!o_ptr->k_idx) return;
4807 if (o_ptr->tval != tval) return;
4809 /* Identified items only */
4810 if (!object_is_known(o_ptr)) return;
4813 * HACK:Ring of Lordly protection and Dragon equipment
4814 * have random resistances.
4816 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4817 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4818 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4819 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4820 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4821 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4822 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4823 || object_is_artifact(o_ptr))
4826 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4828 while (o_name[i] && (i < 26))
4831 if (iskanji(o_name[i])) i++;
4840 o_name[i] = ' '; i++;
4845 fprintf(fff, "%s %s", where, o_name);
4847 if (!(o_ptr->ident & (IDENT_MENTAL)))
4849 fputs(_("-------不明--------------- -------不明---------\n",
4850 "-------unknown------------ -------unknown------\n"), fff);
4854 object_flags_known(o_ptr, flgs);
4856 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4857 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4858 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4859 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4860 print_flag(TR_RES_POIS);
4861 print_flag(TR_RES_LITE);
4862 print_flag(TR_RES_DARK);
4863 print_flag(TR_RES_SHARDS);
4864 print_flag(TR_RES_SOUND);
4865 print_flag(TR_RES_NETHER);
4866 print_flag(TR_RES_NEXUS);
4867 print_flag(TR_RES_CHAOS);
4868 print_flag(TR_RES_DISEN);
4872 print_flag(TR_RES_BLIND);
4873 print_flag(TR_RES_FEAR);
4874 print_flag(TR_RES_CONF);
4875 print_flag(TR_FREE_ACT);
4876 print_flag(TR_SEE_INVIS);
4877 print_flag(TR_HOLD_EXP);
4878 print_flag(TR_TELEPATHY);
4879 print_flag(TR_SLOW_DIGEST);
4880 print_flag(TR_REGEN);
4881 print_flag(TR_LEVITATION);
4889 fprintf(fff, "%s\n", inven_res_label);
4895 * Display *ID* ed weapons/armors's resistances
4897 static void do_cmd_knowledge_inven(void)
4901 char file_name[1024];
4911 /* Open a new file */
4912 fff = my_fopen_temp(file_name, 1024);
4915 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4919 fprintf(fff, "%s\n", inven_res_label);
4921 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4925 for (; j < 9; j++) fputc('\n', fff);
4927 fprintf(fff, "%s\n", inven_res_label);
4929 strcpy(where, _("装", "E "));
4930 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4932 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4934 strcpy(where, _("持", "I "));
4935 for (i = 0; i < INVEN_PACK; i++)
4937 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4940 st_ptr = &town[1].store[STORE_HOME];
4941 strcpy(where, _("家", "H "));
4942 for (i = 0; i < st_ptr->stock_num; i++)
4944 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
4948 /* Close the file */
4951 /* Display the file contents */
4952 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
4954 /* Remove the file */
4959 void do_cmd_save_screen_html_aux(char *filename, int message)
4963 byte a = 0, old_a = 0;
4977 cptr html_head[] = {
4978 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
4982 cptr html_foot[] = {
4984 "</body>\n</html>\n",
4990 Term_get_size(&wid, &hgt);
4992 /* File type is "TEXT" */
4993 FILE_TYPE(FILE_TYPE_TEXT);
4995 /* Append to the file */
4996 fff = my_fopen(filename, "w");
5001 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
5008 /* Save the screen */
5012 /* Build the filename */
5013 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5014 tmpfff = my_fopen(buf, "r");
5016 for (i = 0; html_head[i]; i++)
5017 fputs(html_head[i], fff);
5021 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5023 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5027 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5029 fprintf(fff, "%s\n", buf);
5034 /* Dump the screen */
5035 for (y = 0; y < hgt; y++)
5042 for (x = 0; x < wid - 1; x++)
5046 /* Get the attr/char */
5047 (void)(Term_what(x, y, &a, &c));
5051 case '&': cc = "&"; break;
5052 case '<': cc = "<"; break;
5053 case '>': cc = ">"; break;
5055 case 0x1f: c = '.'; break;
5056 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5061 if ((y == 0 && x == 0) || a != old_a) {
5062 rv = angband_color_table[a][1];
5063 gv = angband_color_table[a][2];
5064 bv = angband_color_table[a][3];
5065 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5066 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5070 fprintf(fff, "%s", cc);
5072 fprintf(fff, "%c", c);
5075 fprintf(fff, "</font>");
5078 for (i = 0; html_foot[i]; i++)
5079 fputs(html_foot[i], fff);
5084 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5086 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5090 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5092 fprintf(fff, "%s\n", buf);
5106 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5110 /* Restore the screen */
5116 * Hack -- save a screen dump to a file
5118 static void do_cmd_save_screen_html(void)
5120 char buf[1024], tmp[256] = "screen.html";
5122 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5125 /* Build the filename */
5126 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5130 do_cmd_save_screen_html_aux(buf, 1);
5135 * Redefinable "save_screen" action
5137 void (*screendump_aux)(void) = NULL;
5141 * Hack -- save a screen dump to a file
5143 void do_cmd_save_screen(void)
5145 bool old_use_graphics = use_graphics;
5146 bool html_dump = FALSE;
5150 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5154 if (c == 'Y' || c == 'y')
5156 else if (c == 'H' || c == 'h')
5168 Term_get_size(&wid, &hgt);
5170 if (old_use_graphics)
5172 use_graphics = FALSE;
5175 /* Redraw everything */
5176 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5178 /* Hack -- update */
5184 do_cmd_save_screen_html();
5188 /* Do we use a special screendump function ? */
5189 else if (screendump_aux)
5191 /* Dump the screen to a graphics file */
5192 (*screendump_aux)();
5194 else /* Dump the screen as text */
5205 /* Build the filename */
5206 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5208 /* File type is "TEXT" */
5209 FILE_TYPE(FILE_TYPE_TEXT);
5211 /* Append to the file */
5212 fff = my_fopen(buf, "w");
5217 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5223 /* Save the screen */
5227 /* Dump the screen */
5228 for (y = 0; y < hgt; y++)
5231 for (x = 0; x < wid - 1; x++)
5233 /* Get the attr/char */
5234 (void)(Term_what(x, y, &a, &c));
5244 fprintf(fff, "%s\n", buf);
5251 /* Dump the screen */
5252 for (y = 0; y < hgt; y++)
5255 for (x = 0; x < wid - 1; x++)
5257 /* Get the attr/char */
5258 (void)(Term_what(x, y, &a, &c));
5261 buf[x] = hack[a&0x0F];
5268 fprintf(fff, "%s\n", buf);
5279 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5282 /* Restore the screen */
5286 if (old_use_graphics)
5288 use_graphics = TRUE;
5291 /* Redraw everything */
5292 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5294 /* Hack -- update */
5301 * Sorting hook -- Comp function -- see below
5303 * We use "u" to point to array of monster indexes,
5304 * and "v" to select the type of sorting to perform on "u".
5306 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5308 u16b *who = (u16b*)(u);
5310 u16b *why = (u16b*)(v);
5317 /* Sort by total kills */
5320 /* Extract total kills */
5321 z1 = a_info[w1].tval;
5322 z2 = a_info[w2].tval;
5324 /* Compare total kills */
5325 if (z1 < z2) return (TRUE);
5326 if (z1 > z2) return (FALSE);
5330 /* Sort by monster level */
5333 /* Extract levels */
5334 z1 = a_info[w1].sval;
5335 z2 = a_info[w2].sval;
5337 /* Compare levels */
5338 if (z1 < z2) return (TRUE);
5339 if (z1 > z2) return (FALSE);
5343 /* Sort by monster experience */
5346 /* Extract experience */
5347 z1 = a_info[w1].level;
5348 z2 = a_info[w2].level;
5350 /* Compare experience */
5351 if (z1 < z2) return (TRUE);
5352 if (z1 > z2) return (FALSE);
5356 /* Compare indexes */
5362 * Sorting hook -- Swap function -- see below
5364 * We use "u" to point to array of monster indexes,
5365 * and "v" to select the type of sorting to perform.
5367 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5369 u16b *who = (u16b*)(u);
5384 * Check the status of "artifacts"
5386 static void do_cmd_knowledge_artifacts(void)
5398 char file_name[1024];
5400 char base_name[MAX_NLEN];
5404 /* Open a new file */
5405 fff = my_fopen_temp(file_name, 1024);
5408 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5413 /* Allocate the "who" array */
5414 C_MAKE(who, max_a_idx, s16b);
5416 /* Allocate the "okay" array */
5417 C_MAKE(okay, max_a_idx, bool);
5419 /* Scan the artifacts */
5420 for (k = 0; k < max_a_idx; k++)
5422 artifact_type *a_ptr = &a_info[k];
5427 /* Skip "empty" artifacts */
5428 if (!a_ptr->name) continue;
5430 /* Skip "uncreated" artifacts */
5431 if (!a_ptr->cur_num) continue;
5437 /* Check the dungeon */
5438 for (y = 0; y < cur_hgt; y++)
5440 for (x = 0; x < cur_wid; x++)
5442 cave_type *c_ptr = &cave[y][x];
5444 s16b this_o_idx, next_o_idx = 0;
5446 /* Scan all objects in the grid */
5447 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5451 /* Acquire object */
5452 o_ptr = &o_list[this_o_idx];
5454 /* Acquire next object */
5455 next_o_idx = o_ptr->next_o_idx;
5457 /* Ignore non-artifacts */
5458 if (!object_is_fixed_artifact(o_ptr)) continue;
5460 /* Ignore known items */
5461 if (object_is_known(o_ptr)) continue;
5463 /* Note the artifact */
5464 okay[o_ptr->name1] = FALSE;
5469 /* Check the inventory and equipment */
5470 for (i = 0; i < INVEN_TOTAL; i++)
5472 object_type *o_ptr = &inventory[i];
5474 /* Ignore non-objects */
5475 if (!o_ptr->k_idx) continue;
5477 /* Ignore non-artifacts */
5478 if (!object_is_fixed_artifact(o_ptr)) continue;
5480 /* Ignore known items */
5481 if (object_is_known(o_ptr)) continue;
5483 /* Note the artifact */
5484 okay[o_ptr->name1] = FALSE;
5487 for (k = 0; k < max_a_idx; k++)
5489 if (okay[k]) who[n++] = k;
5492 /* Select the sort method */
5493 ang_sort_comp = ang_sort_art_comp;
5494 ang_sort_swap = ang_sort_art_swap;
5496 /* Sort the array by dungeon depth of monsters */
5497 ang_sort(who, &why, n);
5499 /* Scan the artifacts */
5500 for (k = 0; k < n; k++)
5502 artifact_type *a_ptr = &a_info[who[k]];
5505 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5507 /* Obtain the base object type */
5508 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5516 /* Get local object */
5519 /* Create fake object */
5520 object_prep(q_ptr, z);
5522 /* Make it an artifact */
5523 q_ptr->name1 = (byte)who[k];
5525 /* Display as if known */
5526 q_ptr->ident |= IDENT_STORE;
5528 /* Describe the artifact */
5529 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5532 /* Hack -- Build the artifact name */
5533 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5536 /* Free the "who" array */
5537 C_KILL(who, max_a_idx, s16b);
5539 /* Free the "okay" array */
5540 C_KILL(okay, max_a_idx, bool);
5542 /* Close the file */
5545 /* Display the file contents */
5546 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5548 /* Remove the file */
5554 * Display known uniques
5555 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5557 static void do_cmd_knowledge_uniques(void)
5566 char file_name[1024];
5569 int n_alive_surface = 0;
5570 int n_alive_over100 = 0;
5571 int n_alive_total = 0;
5574 for (i = 0; i < 10; i++) n_alive[i] = 0;
5576 /* Open a new file */
5577 fff = my_fopen_temp(file_name, 1024);
5581 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5586 /* Allocate the "who" array */
5587 C_MAKE(who, max_r_idx, s16b);
5589 /* Scan the monsters */
5590 for (i = 1; i < max_r_idx; i++)
5592 monster_race *r_ptr = &r_info[i];
5595 if (!r_ptr->name) continue;
5597 /* Require unique monsters */
5598 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5600 /* Only display "known" uniques */
5601 if (!cheat_know && !r_ptr->r_sights) continue;
5603 /* Only print rarity <= 100 uniques */
5604 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5606 /* Only "alive" uniques */
5607 if (r_ptr->max_num == 0) continue;
5611 lev = (r_ptr->level - 1) / 10;
5615 if (max_lev < lev) max_lev = lev;
5617 else n_alive_over100++;
5619 else n_alive_surface++;
5621 /* Collect "appropriate" monsters */
5625 /* Select the sort method */
5626 ang_sort_comp = ang_sort_comp_hook;
5627 ang_sort_swap = ang_sort_swap_hook;
5629 /* Sort the array by dungeon depth of monsters */
5630 ang_sort(who, &why, n);
5632 if (n_alive_surface)
5634 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5635 n_alive_total += n_alive_surface;
5637 for (i = 0; i <= max_lev; i++)
5639 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5640 n_alive_total += n_alive[i];
5642 if (n_alive_over100)
5644 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5645 n_alive_total += n_alive_over100;
5650 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5651 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5655 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5658 /* Scan the monster races */
5659 for (k = 0; k < n; k++)
5661 monster_race *r_ptr = &r_info[who[k]];
5663 /* Print a message */
5664 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, (int)r_ptr->level);
5667 /* Free the "who" array */
5668 C_KILL(who, max_r_idx, s16b);
5670 /* Close the file */
5673 /* Display the file contents */
5674 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5676 /* Remove the file */
5682 * Display weapon-exp
5684 static void do_cmd_knowledge_weapon_exp(void)
5686 int i, num, weapon_exp;
5691 char file_name[1024];
5694 /* Open a new file */
5695 fff = my_fopen_temp(file_name, 1024);
5697 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5702 for (i = 0; i < 5; i++)
5704 for (num = 0; num < 64; num++)
5706 for (j = 0; j < max_k_idx; j++)
5708 object_kind *k_ptr = &k_info[j];
5710 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5712 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5714 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5716 fprintf(fff, "%-25s ", tmp);
5717 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5718 else fprintf(fff, " ");
5719 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5720 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5728 /* Close the file */
5731 /* Display the file contents */
5732 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5734 /* Remove the file */
5740 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5744 static void do_cmd_knowledge_spell_exp(void)
5747 int spell_exp, exp_level;
5750 const magic_type *s_ptr;
5752 char file_name[1024];
5754 /* Open a new file */
5755 fff = my_fopen_temp(file_name, 1024);
5757 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5762 if (p_ptr->realm1 != REALM_NONE)
5764 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5765 for (i = 0; i < 32; i++)
5767 if (!is_magic(p_ptr->realm1))
5769 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5773 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5775 if (s_ptr->slevel >= 99) continue;
5776 spell_exp = p_ptr->spell_exp[i];
5777 exp_level = spell_exp_level(spell_exp);
5778 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5779 if (p_ptr->realm1 == REALM_HISSATSU)
5780 fprintf(fff, "[--]");
5783 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5784 else fprintf(fff, " ");
5785 fprintf(fff, "%s", exp_level_str[exp_level]);
5787 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5792 if (p_ptr->realm2 != REALM_NONE)
5794 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5795 for (i = 0; i < 32; i++)
5797 if (!is_magic(p_ptr->realm1))
5799 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5803 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5805 if (s_ptr->slevel >= 99) continue;
5807 spell_exp = p_ptr->spell_exp[i + 32];
5808 exp_level = spell_exp_level(spell_exp);
5809 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5810 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5811 else fprintf(fff, " ");
5812 fprintf(fff, "%s", exp_level_str[exp_level]);
5813 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5818 /* Close the file */
5821 /* Display the file contents */
5822 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5824 /* Remove the file */
5830 * @brief スキル情報を表示するコマンドのメインルーチン /
5834 static void do_cmd_knowledge_skill_exp(void)
5836 int i = 0, skill_exp;
5840 char file_name[1024];
5841 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5842 _("二刀流 ", "Dual Wielding "),
5843 _("乗馬 ", "Riding ")};
5845 /* Open a new file */
5846 fff = my_fopen_temp(file_name, 1024);
5848 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5853 for (i = 0; i < 3; i++)
5855 skill_exp = p_ptr->skill_exp[i];
5856 fprintf(fff, "%-20s ", skill_name[i]);
5857 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5858 else fprintf(fff, " ");
5859 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5860 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5864 /* Close the file */
5867 /* Display the file contents */
5868 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5870 /* Remove the file */
5876 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5877 * @param Name 変換したい文字列の参照ポインタ
5880 void plural_aux(char *Name)
5882 int NameLen = strlen(Name);
5884 if (my_strstr(Name, "Disembodied hand"))
5886 strcpy(Name, "Disembodied hands that strangled people");
5888 else if (my_strstr(Name, "Colour out of space"))
5890 strcpy(Name, "Colours out of space");
5892 else if (my_strstr(Name, "stairway to hell"))
5894 strcpy(Name, "stairways to hell");
5896 else if (my_strstr(Name, "Dweller on the threshold"))
5898 strcpy(Name, "Dwellers on the threshold");
5900 else if (my_strstr(Name, " of "))
5902 cptr aider = my_strstr(Name, " of ");
5913 if (dummy[i-1] == 's')
5915 strcpy(&(dummy[i]), "es");
5920 strcpy(&(dummy[i]), "s");
5923 strcpy(&(dummy[i+1]), aider);
5924 strcpy(Name, dummy);
5926 else if (my_strstr(Name, "coins"))
5929 strcpy(dummy, "piles of ");
5930 strcat(dummy, Name);
5931 strcpy(Name, dummy);
5934 else if (my_strstr(Name, "Manes"))
5938 else if (streq(&(Name[NameLen - 2]), "ey"))
5940 strcpy(&(Name[NameLen - 2]), "eys");
5942 else if (Name[NameLen - 1] == 'y')
5944 strcpy(&(Name[NameLen - 1]), "ies");
5946 else if (streq(&(Name[NameLen - 4]), "ouse"))
5948 strcpy(&(Name[NameLen - 4]), "ice");
5950 else if (streq(&(Name[NameLen - 2]), "us"))
5952 strcpy(&(Name[NameLen - 2]), "i");
5954 else if (streq(&(Name[NameLen - 6]), "kelman"))
5956 strcpy(&(Name[NameLen - 6]), "kelmen");
5958 else if (streq(&(Name[NameLen - 8]), "wordsman"))
5960 strcpy(&(Name[NameLen - 8]), "wordsmen");
5962 else if (streq(&(Name[NameLen - 7]), "oodsman"))
5964 strcpy(&(Name[NameLen - 7]), "oodsmen");
5966 else if (streq(&(Name[NameLen - 7]), "eastman"))
5968 strcpy(&(Name[NameLen - 7]), "eastmen");
5970 else if (streq(&(Name[NameLen - 8]), "izardman"))
5972 strcpy(&(Name[NameLen - 8]), "izardmen");
5974 else if (streq(&(Name[NameLen - 5]), "geist"))
5976 strcpy(&(Name[NameLen - 5]), "geister");
5978 else if (streq(&(Name[NameLen - 2]), "ex"))
5980 strcpy(&(Name[NameLen - 2]), "ices");
5982 else if (streq(&(Name[NameLen - 2]), "lf"))
5984 strcpy(&(Name[NameLen - 2]), "lves");
5986 else if (suffix(Name, "ch") ||
5987 suffix(Name, "sh") ||
5988 suffix(Name, "nx") ||
5989 suffix(Name, "s") ||
5992 strcpy(&(Name[NameLen]), "es");
5996 strcpy(&(Name[NameLen]), "s");
6001 * @brief 現在のペットを表示するコマンドのメインルーチン /
6002 * Display current pets
6005 static void do_cmd_knowledge_pets(void)
6009 monster_type *m_ptr;
6012 int show_upkeep = 0;
6013 char file_name[1024];
6016 /* Open a new file */
6017 fff = my_fopen_temp(file_name, 1024);
6019 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6024 /* Process the monsters (backwards) */
6025 for (i = m_max - 1; i >= 1; i--)
6027 /* Access the monster */
6030 /* Ignore "dead" monsters */
6031 if (!m_ptr->r_idx) continue;
6033 /* Calculate "upkeep" for pets */
6037 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6038 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6042 show_upkeep = calculate_upkeep();
6044 fprintf(fff, "----------------------------------------------\n");
6046 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6047 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6049 fprintf(fff, " Total: %d pet%s.\n",
6050 t_friends, (t_friends == 1 ? "" : "s"));
6051 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6056 /* Close the file */
6059 /* Display the file contents */
6060 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6062 /* Remove the file */
6068 * @brief 現在のペットを表示するコマンドのメインルーチン /
6071 * @note the player ghosts are ignored. XXX XXX XXX
6073 static void do_cmd_knowledge_kill_count(void)
6082 char file_name[1024];
6087 /* Open a new file */
6088 fff = my_fopen_temp(file_name, 1024);
6091 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6096 /* Allocate the "who" array */
6097 C_MAKE(who, max_r_idx, s16b);
6100 /* Monsters slain */
6103 for (kk = 1; kk < max_r_idx; kk++)
6105 monster_race *r_ptr = &r_info[kk];
6107 if (r_ptr->flags1 & (RF1_UNIQUE))
6109 bool dead = (r_ptr->max_num == 0);
6118 MONSTER_NUMBER This = r_ptr->r_pkills;
6128 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6131 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6133 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6139 /* Scan the monsters */
6140 for (i = 1; i < max_r_idx; i++)
6142 monster_race *r_ptr = &r_info[i];
6144 /* Use that monster */
6145 if (r_ptr->name) who[n++] = i;
6148 /* Select the sort method */
6149 ang_sort_comp = ang_sort_comp_hook;
6150 ang_sort_swap = ang_sort_swap_hook;
6152 /* Sort the array by dungeon depth of monsters */
6153 ang_sort(who, &why, n);
6155 /* Scan the monster races */
6156 for (k = 0; k < n; k++)
6158 monster_race *r_ptr = &r_info[who[k]];
6160 if (r_ptr->flags1 & (RF1_UNIQUE))
6162 bool dead = (r_ptr->max_num == 0);
6166 /* Print a message */
6167 fprintf(fff, " %s\n",
6168 (r_name + r_ptr->name));
6174 MONSTER_NUMBER This = r_ptr->r_pkills;
6179 /* p,tは人と数える by ita */
6180 if (my_strchr("pt", r_ptr->d_char))
6181 fprintf(fff, " %3d 人の %s\n", (int)This, r_name + r_ptr->name);
6183 fprintf(fff, " %3d 体の %s\n", (int)This, r_name + r_ptr->name);
6187 if (my_strstr(r_name + r_ptr->name, "coins"))
6189 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6193 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6199 strcpy(ToPlural, (r_name + r_ptr->name));
6200 plural_aux(ToPlural);
6201 fprintf(fff, " %d %s\n", This, ToPlural);
6211 fprintf(fff,"----------------------------------------------\n");
6213 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6215 fprintf(fff," Total: %lu creature%s killed.\n",
6216 (unsigned long int)Total, (Total == 1 ? "" : "s"));
6220 /* Free the "who" array */
6221 C_KILL(who, max_r_idx, s16b);
6223 /* Close the file */
6226 /* Display the file contents */
6227 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6229 /* Remove the file */
6235 * @brief モンスター情報リスト中のグループを表示する /
6236 * Display the object groups.
6240 * @param per_page リストの表示行
6241 * @param grp_idx グループのID配列
6242 * @param group_text グループ名の文字列配列
6243 * @param grp_cur 現在の選択ID
6244 * @param grp_top 現在の選択リスト最上部ID
6247 static void display_group_list(int col, int row, int wid, int per_page,
6248 IDX grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6252 /* Display lines until done */
6253 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6255 /* Get the group index */
6256 int grp = grp_idx[grp_top + i];
6258 /* Choose a color */
6259 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6261 /* Erase the entire line */
6262 Term_erase(col, row + i, wid);
6264 /* Display the group label */
6265 c_put_str(attr, group_text[grp], row + i, col);
6271 * Move the cursor in a browser window
6273 static void browser_cursor(char ch, int *column, IDX *grp_cur, int grp_cnt,
6274 IDX *list_cur, int list_cnt)
6279 IDX list = *list_cur;
6281 /* Extract direction */
6284 /* Hack -- scroll up full screen */
6289 /* Hack -- scroll down full screen */
6294 d = get_keymap_dir(ch);
6299 /* Diagonals - hack */
6300 if ((ddx[d] > 0) && ddy[d])
6306 Term_get_size(&wid, &hgt);
6308 browser_rows = hgt - 8;
6310 /* Browse group list */
6315 /* Move up or down */
6316 grp += ddy[d] * (browser_rows - 1);
6319 if (grp >= grp_cnt) grp = grp_cnt - 1;
6320 if (grp < 0) grp = 0;
6321 if (grp != old_grp) list = 0;
6324 /* Browse sub-list list */
6327 /* Move up or down */
6328 list += ddy[d] * browser_rows;
6331 if (list >= list_cnt) list = list_cnt - 1;
6332 if (list < 0) list = 0;
6344 if (col < 0) col = 0;
6345 if (col > 1) col = 1;
6352 /* Browse group list */
6357 /* Move up or down */
6361 if (grp >= grp_cnt) grp = grp_cnt - 1;
6362 if (grp < 0) grp = 0;
6363 if (grp != old_grp) list = 0;
6366 /* Browse sub-list list */
6369 /* Move up or down */
6373 if (list >= list_cnt) list = list_cnt - 1;
6374 if (list < 0) list = 0;
6385 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
6389 /* Clear the display lines */
6390 for (i = 0; i < height; i++)
6392 Term_erase(col, row + i, width);
6395 /* Bigtile mode uses double width */
6396 if (use_bigtile) width /= 2;
6398 /* Display lines until done */
6399 for (i = 0; i < height; i++)
6401 /* Display columns until done */
6402 for (j = 0; j < width; j++)
6406 TERM_POSITION x = col + j;
6407 TERM_POSITION y = row + i;
6410 /* Bigtile mode uses double width */
6411 if (use_bigtile) x += j;
6416 /* Ignore illegal characters */
6417 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6418 (!use_graphics && ic > 0x7f))
6424 /* Force correct code for both ASCII character and tile */
6425 if (c & 0x80) a |= 0x80;
6427 /* Display symbol */
6428 Term_queue_bigchar(x, y, a, c, 0, 0);
6435 * Place the cursor at the collect position for visual mode
6437 static void place_visual_list_cursor(TERM_POSITION col, TERM_POSITION row, byte a, byte c, byte attr_top, byte char_left)
6439 int i = (a & 0x7f) - attr_top;
6440 int j = c - char_left;
6442 TERM_POSITION x = col + j;
6443 TERM_POSITION y = row + i;
6445 /* Bigtile mode uses double width */
6446 if (use_bigtile) x += j;
6448 /* Place the cursor */
6454 * Clipboard variables for copy&paste in visual mode
6456 static byte attr_idx = 0;
6457 static byte char_idx = 0;
6459 /* Hack -- for feature lighting */
6460 static byte attr_idx_feat[F_LIT_MAX];
6461 static byte char_idx_feat[F_LIT_MAX];
6464 * Do visual mode command -- Change symbols
6466 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6467 int height, int width,
6468 byte *attr_top_ptr, byte *char_left_ptr,
6469 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6471 static byte attr_old = 0, char_old = 0;
6476 if (*visual_list_ptr)
6479 *cur_attr_ptr = attr_old;
6480 *cur_char_ptr = char_old;
6481 *visual_list_ptr = FALSE;
6489 if (*visual_list_ptr)
6492 *visual_list_ptr = FALSE;
6493 *need_redraw = TRUE;
6501 if (!*visual_list_ptr)
6503 *visual_list_ptr = TRUE;
6505 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6506 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6508 attr_old = *cur_attr_ptr;
6509 char_old = *cur_char_ptr;
6520 /* Set the visual */
6521 attr_idx = *cur_attr_ptr;
6522 char_idx = *cur_char_ptr;
6524 /* Hack -- for feature lighting */
6525 for (i = 0; i < F_LIT_MAX; i++)
6527 attr_idx_feat[i] = 0;
6528 char_idx_feat[i] = 0;
6535 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6538 *cur_attr_ptr = attr_idx;
6539 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6540 if (!*visual_list_ptr) *need_redraw = TRUE;
6546 *cur_char_ptr = char_idx;
6547 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6548 if (!*visual_list_ptr) *need_redraw = TRUE;
6554 if (*visual_list_ptr)
6557 int d = get_keymap_dir(ch);
6558 byte a = (*cur_attr_ptr & 0x7f);
6559 byte c = *cur_char_ptr;
6561 if (use_bigtile) eff_width = width / 2;
6562 else eff_width = width;
6564 /* Restrict direction */
6565 if ((a == 0) && (ddy[d] < 0)) d = 0;
6566 if ((c == 0) && (ddx[d] < 0)) d = 0;
6567 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6568 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6573 /* Force correct code for both ASCII character and tile */
6574 if (c & 0x80) a |= 0x80;
6576 /* Set the visual */
6581 /* Move the frame */
6582 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6583 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6584 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6585 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6591 /* Visual mode command is not used */
6597 * Display the monsters in a group.
6599 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6600 int mon_cur, int mon_top, bool visual_only)
6604 /* Display lines until done */
6605 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6609 /* Get the race index */
6610 MONRACE_IDX r_idx = mon_idx[mon_top + i] ;
6612 /* Access the race */
6613 monster_race *r_ptr = &r_info[r_idx];
6615 /* Choose a color */
6616 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6618 /* Display the name */
6619 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6621 /* Hack -- visual_list mode */
6624 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6626 if (p_ptr->wizard || visual_only)
6628 c_prt(attr, format("%d", r_idx), row + i, 62);
6631 /* Erase chars before overwritten by the race letter */
6632 Term_erase(69, row + i, 255);
6634 /* Display symbol */
6635 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6640 if (!(r_ptr->flags1 & RF1_UNIQUE))
6641 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6643 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6644 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6648 /* Clear remaining lines */
6649 for (; i < per_page; i++)
6651 Term_erase(col, row + i, 255);
6657 * Display known monsters.
6659 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx)
6663 IDX grp_cur, grp_top, old_grp_cur;
6664 IDX mon_cur, mon_top;
6665 IDX grp_cnt, grp_idx[100];
6673 bool visual_list = FALSE;
6674 byte attr_top = 0, char_left = 0;
6677 TERM_POSITION wid, hgt;
6682 Term_get_size(&wid, &hgt);
6684 browser_rows = hgt - 8;
6686 /* Allocate the "mon_idx" array */
6687 C_MAKE(mon_idx, max_r_idx, s16b);
6692 if (direct_r_idx < 0)
6694 mode = visual_only ? 0x03 : 0x01;
6696 /* Check every group */
6697 for (i = 0; monster_group_text[i] != NULL; i++)
6699 /* Measure the label */
6700 len = strlen(monster_group_text[i]);
6702 /* Save the maximum length */
6703 if (len > max) max = len;
6705 /* See if any monsters are known */
6706 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6708 /* Build a list of groups with known monsters */
6709 grp_idx[grp_cnt++] = i;
6717 mon_idx[0] = direct_r_idx;
6720 /* Terminate the list */
6723 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6724 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6727 /* Terminate the list */
6728 grp_idx[grp_cnt] = -1;
6731 grp_cur = grp_top = 0;
6732 mon_cur = mon_top = 0;
6737 mode = visual_only ? 0x02 : 0x00;
6742 monster_race *r_ptr;
6749 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6750 if (direct_r_idx < 0) prt("グループ", 4, 0);
6751 prt("名前", 4, max + 3);
6752 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6754 if (!visual_only) prt("殺害数", 4, 72);
6756 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6757 if (direct_r_idx < 0) prt("Group", 4, 0);
6758 prt("Name", 4, max + 3);
6759 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6761 if (!visual_only) prt("Kills", 4, 73);
6764 for (i = 0; i < 78; i++)
6766 Term_putch(i, 5, TERM_WHITE, '=');
6769 if (direct_r_idx < 0)
6771 for (i = 0; i < browser_rows; i++)
6773 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6780 if (direct_r_idx < 0)
6782 /* Scroll group list */
6783 if (grp_cur < grp_top) grp_top = grp_cur;
6784 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6786 /* Display a list of monster groups */
6787 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6789 if (old_grp_cur != grp_cur)
6791 old_grp_cur = grp_cur;
6793 /* Get a list of monsters in the current group */
6794 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6797 /* Scroll monster list */
6798 while (mon_cur < mon_top)
6799 mon_top = MAX(0, mon_top - browser_rows/2);
6800 while (mon_cur >= mon_top + browser_rows)
6801 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6806 /* Display a list of monsters in the current group */
6807 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6813 /* Display a monster name */
6814 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6816 /* Display visual list below first monster */
6817 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6822 prt(format("<方向>%s%s%s, ESC",
6823 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6824 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6825 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6828 prt(format("<dir>%s%s%s, ESC",
6829 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6830 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6831 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6835 /* Get the current monster */
6836 r_ptr = &r_info[mon_idx[mon_cur]];
6840 /* Mega Hack -- track this monster race */
6841 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6843 /* Hack -- handle stuff */
6849 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6853 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6857 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6862 /* Do visual mode command if needed */
6863 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))
6865 if (direct_r_idx >= 0)
6890 /* Recall on screen */
6891 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6893 screen_roff(mon_idx[mon_cur], 0);
6904 /* Move the cursor */
6905 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6912 /* Free the "mon_idx" array */
6913 C_KILL(mon_idx, max_r_idx, s16b);
6918 * Display the objects in a group.
6920 static void display_object_list(int col, int row, int per_page, IDX object_idx[],
6921 int object_cur, int object_top, bool visual_only)
6925 /* Display lines until done */
6926 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6930 object_kind *flavor_k_ptr;
6932 /* Get the object index */
6933 KIND_OBJECT_IDX k_idx = object_idx[object_top + i];
6935 /* Access the object */
6936 object_kind *k_ptr = &k_info[k_idx];
6938 /* Choose a color */
6939 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6940 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6943 if (!visual_only && k_ptr->flavor)
6945 /* Appearance of this object is shuffled */
6946 flavor_k_ptr = &k_info[k_ptr->flavor];
6950 /* Appearance of this object is very normal */
6951 flavor_k_ptr = k_ptr;
6956 attr = ((i + object_top == object_cur) ? cursor : attr);
6958 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
6961 strip_name(o_name, k_idx);
6966 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
6969 /* Display the name */
6970 c_prt(attr, o_name, row + i, col);
6972 /* Hack -- visual_list mode */
6975 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);
6977 if (p_ptr->wizard || visual_only)
6979 c_prt(attr, format("%d", k_idx), row + i, 70);
6982 a = flavor_k_ptr->x_attr;
6983 c = flavor_k_ptr->x_char;
6985 /* Display symbol */
6986 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
6989 /* Clear remaining lines */
6990 for (; i < per_page; i++)
6992 Term_erase(col, row + i, 255);
6997 * Describe fake object
6999 static void desc_obj_fake(IDX k_idx)
7002 object_type object_type_body;
7004 /* Get local object */
7005 o_ptr = &object_type_body;
7007 /* Wipe the object */
7010 /* Create the artifact */
7011 object_prep(o_ptr, k_idx);
7013 /* It's fully know */
7014 o_ptr->ident |= IDENT_KNOWN;
7016 /* Track the object */
7017 /* object_actual_track(o_ptr); */
7019 /* Hack - mark as fake */
7020 /* term_obj_real = FALSE; */
7022 /* Hack -- Handle stuff */
7025 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
7027 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7035 * Display known objects
7037 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx)
7041 IDX grp_cur, grp_top, old_grp_cur;
7042 IDX object_old, object_cur, object_top;
7052 bool visual_list = FALSE;
7053 byte attr_top = 0, char_left = 0;
7061 Term_get_size(&wid, &hgt);
7063 browser_rows = hgt - 8;
7065 /* Allocate the "object_idx" array */
7066 C_MAKE(object_idx, max_k_idx, IDX);
7071 if (direct_k_idx < 0)
7073 mode = visual_only ? 0x03 : 0x01;
7075 /* Check every group */
7076 for (i = 0; object_group_text[i] != NULL; i++)
7078 /* Measure the label */
7079 len = strlen(object_group_text[i]);
7081 /* Save the maximum length */
7082 if (len > max) max = len;
7084 /* See if any monsters are known */
7085 if (collect_objects(i, object_idx, mode))
7087 /* Build a list of groups with known monsters */
7088 grp_idx[grp_cnt++] = i;
7097 object_kind *k_ptr = &k_info[direct_k_idx];
7098 object_kind *flavor_k_ptr;
7100 if (!visual_only && k_ptr->flavor)
7102 /* Appearance of this object is shuffled */
7103 flavor_k_ptr = &k_info[k_ptr->flavor];
7107 /* Appearance of this object is very normal */
7108 flavor_k_ptr = k_ptr;
7111 object_idx[0] = direct_k_idx;
7112 object_old = direct_k_idx;
7115 /* Terminate the list */
7118 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7119 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7122 /* Terminate the list */
7123 grp_idx[grp_cnt] = -1;
7126 grp_cur = grp_top = 0;
7127 object_cur = object_top = 0;
7132 mode = visual_only ? 0x02 : 0x00;
7137 object_kind *k_ptr, *flavor_k_ptr;
7144 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7145 if (direct_k_idx < 0) prt("グループ", 4, 0);
7146 prt("名前", 4, max + 3);
7147 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7150 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7151 if (direct_k_idx < 0) prt("Group", 4, 0);
7152 prt("Name", 4, max + 3);
7153 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7157 for (i = 0; i < 78; i++)
7159 Term_putch(i, 5, TERM_WHITE, '=');
7162 if (direct_k_idx < 0)
7164 for (i = 0; i < browser_rows; i++)
7166 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7173 if (direct_k_idx < 0)
7175 /* Scroll group list */
7176 if (grp_cur < grp_top) grp_top = grp_cur;
7177 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7179 /* Display a list of object groups */
7180 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7182 if (old_grp_cur != grp_cur)
7184 old_grp_cur = grp_cur;
7186 /* Get a list of objects in the current group */
7187 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7190 /* Scroll object list */
7191 while (object_cur < object_top)
7192 object_top = MAX(0, object_top - browser_rows/2);
7193 while (object_cur >= object_top + browser_rows)
7194 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7199 /* Display a list of objects in the current group */
7200 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7204 object_top = object_cur;
7206 /* Display a list of objects in the current group */
7207 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7209 /* Display visual list below first object */
7210 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7213 /* Get the current object */
7214 k_ptr = &k_info[object_idx[object_cur]];
7216 if (!visual_only && k_ptr->flavor)
7218 /* Appearance of this object is shuffled */
7219 flavor_k_ptr = &k_info[k_ptr->flavor];
7223 /* Appearance of this object is very normal */
7224 flavor_k_ptr = k_ptr;
7229 prt(format("<方向>%s%s%s, ESC",
7230 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7231 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7232 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7235 prt(format("<dir>%s%s%s, ESC",
7236 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7237 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7238 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7244 /* Mega Hack -- track this object */
7245 if (object_cnt) object_kind_track(object_idx[object_cur]);
7247 /* The "current" object changed */
7248 if (object_old != object_idx[object_cur])
7250 /* Hack -- handle stuff */
7253 /* Remember the "current" object */
7254 object_old = object_idx[object_cur];
7260 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7264 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7268 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7273 /* Do visual mode command if needed */
7274 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))
7276 if (direct_k_idx >= 0)
7301 /* Recall on screen */
7302 if (!visual_list && !visual_only && (grp_cnt > 0))
7304 desc_obj_fake(object_idx[object_cur]);
7312 /* Move the cursor */
7313 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7319 /* Free the "object_idx" array */
7320 C_KILL(object_idx, max_k_idx, IDX);
7325 * Display the features in a group.
7327 static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_idx,
7328 FEAT_IDX feat_cur, FEAT_IDX feat_top, bool visual_only, int lighting_level)
7330 int lit_col[F_LIT_MAX], i, j;
7331 int f_idx_col = use_bigtile ? 62 : 64;
7333 /* Correct columns 1 and 4 */
7334 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7335 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7336 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7338 /* Display lines until done */
7339 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7344 FEAT_IDX f_idx = feat_idx[feat_top + i];
7346 /* Access the index */
7347 feature_type *f_ptr = &f_info[f_idx];
7349 int row_i = row + i;
7351 /* Choose a color */
7352 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7354 /* Display the name */
7355 c_prt(attr, f_name + f_ptr->name, row_i, col);
7357 /* Hack -- visual_list mode */
7360 /* Display lighting level */
7361 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7363 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));
7365 if (p_ptr->wizard || visual_only)
7367 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7370 /* Display symbol */
7371 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);
7373 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7374 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7376 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7378 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7380 /* Mega-hack -- Use non-standard colour */
7381 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7383 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7387 /* Clear remaining lines */
7388 for (; i < per_page; i++)
7390 Term_erase(col, row + i, 255);
7396 * Interact with feature visuals.
7398 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level)
7402 IDX grp_cur, grp_top, old_grp_cur;
7403 IDX feat_cur, feat_top;
7413 bool visual_list = FALSE;
7414 byte attr_top = 0, char_left = 0;
7419 byte attr_old[F_LIT_MAX];
7420 byte char_old[F_LIT_MAX];
7421 byte *cur_attr_ptr, *cur_char_ptr;
7423 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7424 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7427 Term_get_size(&wid, &hgt);
7429 browser_rows = hgt - 8;
7431 /* Allocate the "feat_idx" array */
7432 C_MAKE(feat_idx, max_f_idx, IDX);
7437 if (direct_f_idx < 0)
7439 /* Check every group */
7440 for (i = 0; feature_group_text[i] != NULL; i++)
7442 /* Measure the label */
7443 len = strlen(feature_group_text[i]);
7445 /* Save the maximum length */
7446 if (len > max) max = len;
7448 /* See if any features are known */
7449 if (collect_features(i, feat_idx, 0x01))
7451 /* Build a list of groups with known features */
7452 grp_idx[grp_cnt++] = i;
7460 feature_type *f_ptr = &f_info[direct_f_idx];
7462 feat_idx[0] = direct_f_idx;
7465 /* Terminate the list */
7468 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7469 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7471 for (i = 0; i < F_LIT_MAX; i++)
7473 attr_old[i] = f_ptr->x_attr[i];
7474 char_old[i] = f_ptr->x_char[i];
7478 /* Terminate the list */
7479 grp_idx[grp_cnt] = -1;
7482 grp_cur = grp_top = 0;
7483 feat_cur = feat_top = 0;
7491 feature_type *f_ptr;
7498 prt("表示 - 地形", 2, 0);
7499 if (direct_f_idx < 0) prt("グループ", 4, 0);
7500 prt("名前", 4, max + 3);
7503 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7504 prt("文字 ( l/ d)", 4, 66);
7508 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7509 prt("文字 (l/d)", 4, 68);
7512 prt("Visuals - features", 2, 0);
7513 if (direct_f_idx < 0) prt("Group", 4, 0);
7514 prt("Name", 4, max + 3);
7517 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7518 prt("Sym ( l/ d)", 4, 67);
7522 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7523 prt("Sym (l/d)", 4, 69);
7527 for (i = 0; i < 78; i++)
7529 Term_putch(i, 5, TERM_WHITE, '=');
7532 if (direct_f_idx < 0)
7534 for (i = 0; i < browser_rows; i++)
7536 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7543 if (direct_f_idx < 0)
7545 /* Scroll group list */
7546 if (grp_cur < grp_top) grp_top = grp_cur;
7547 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7549 /* Display a list of feature groups */
7550 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7552 if (old_grp_cur != grp_cur)
7554 old_grp_cur = grp_cur;
7556 /* Get a list of features in the current group */
7557 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7560 /* Scroll feature list */
7561 while (feat_cur < feat_top)
7562 feat_top = MAX(0, feat_top - browser_rows/2);
7563 while (feat_cur >= feat_top + browser_rows)
7564 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7569 /* Display a list of features in the current group */
7570 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7574 feat_top = feat_cur;
7576 /* Display a list of features in the current group */
7577 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7579 /* Display visual list below first object */
7580 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7585 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7586 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7587 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7590 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7591 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7592 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7596 /* Get the current feature */
7597 f_ptr = &f_info[feat_idx[feat_cur]];
7598 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7599 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7603 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7607 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7611 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7616 if (visual_list && ((ch == 'A') || (ch == 'a')))
7618 int prev_lighting_level = *lighting_level;
7622 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7623 else (*lighting_level)--;
7627 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7628 else (*lighting_level)++;
7631 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7632 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7634 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7635 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7640 else if ((ch == 'D') || (ch == 'd'))
7642 byte prev_x_attr = f_ptr->x_attr[*lighting_level];
7643 byte prev_x_char = f_ptr->x_char[*lighting_level];
7645 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7649 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7650 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7652 if (prev_x_char != f_ptr->x_char[*lighting_level])
7653 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7655 else *need_redraw = TRUE;
7660 /* Do visual mode command if needed */
7661 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))
7665 /* Restore previous visual settings */
7667 for (i = 0; i < F_LIT_MAX; i++)
7669 f_ptr->x_attr[i] = attr_old[i];
7670 f_ptr->x_char[i] = char_old[i];
7677 if (direct_f_idx >= 0) flag = TRUE;
7678 else *lighting_level = F_LIT_STANDARD;
7681 /* Preserve current visual settings */
7684 for (i = 0; i < F_LIT_MAX; i++)
7686 attr_old[i] = f_ptr->x_attr[i];
7687 char_old[i] = f_ptr->x_char[i];
7689 *lighting_level = F_LIT_STANDARD;
7696 for (i = 0; i < F_LIT_MAX; i++)
7698 attr_idx_feat[i] = f_ptr->x_attr[i];
7699 char_idx_feat[i] = f_ptr->x_char[i];
7708 /* Allow TERM_DARK text */
7709 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7711 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7712 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7730 /* Move the cursor */
7731 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7737 /* Free the "feat_idx" array */
7738 C_KILL(feat_idx, max_f_idx, IDX);
7743 * List wanted monsters
7745 static void do_cmd_knowledge_kubi(void)
7750 char file_name[1024];
7753 /* Open a new file */
7754 fff = my_fopen_temp(file_name, 1024);
7756 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7763 bool listed = FALSE;
7766 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7768 fprintf(fff, "賞金首リスト\n");
7770 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7772 fprintf(fff, "List of wanted monsters\n");
7774 fprintf(fff, "----------------------------------------------\n");
7776 for (i = 0; i < MAX_KUBI; i++)
7778 if (kubi_r_idx[i] <= 10000)
7780 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7788 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7792 /* Close the file */
7795 /* Display the file contents */
7796 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7798 /* Remove the file */
7803 * List virtues & status
7805 static void do_cmd_knowledge_virtues(void)
7809 char file_name[1024];
7812 /* Open a new file */
7813 fff = my_fopen_temp(file_name, 1024);
7815 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7822 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7826 /* Close the file */
7829 /* Display the file contents */
7830 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7832 /* Remove the file */
7840 static void do_cmd_knowledge_dungeon(void)
7844 char file_name[1024];
7848 /* Open a new file */
7849 fff = my_fopen_temp(file_name, 1024);
7851 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7858 for (i = 1; i < max_d_idx; i++)
7862 if (!d_info[i].maxdepth) continue;
7863 if (!max_dlv[i]) continue;
7864 if (d_info[i].final_guardian)
7866 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7868 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7870 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
7874 /* Close the file */
7877 /* Display the file contents */
7878 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7880 /* Remove the file */
7885 * List virtues & status
7888 static void do_cmd_knowledge_stat(void)
7892 char file_name[1024];
7895 /* Open a new file */
7896 fff = my_fopen_temp(file_name, 1024);
7898 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7905 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7906 (2 * p_ptr->hitdie +
7907 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7910 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7911 else fprintf(fff, "現在の体力ランク : ???\n\n");
7912 fprintf(fff, "能力の最大値\n\n");
7914 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7915 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7916 fprintf(fff, "Limits of maximum stats\n\n");
7918 for (v_nr = 0; v_nr < 6; v_nr++)
7920 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);
7921 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7927 /* Close the file */
7930 /* Display the file contents */
7931 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7933 /* Remove the file */
7939 * Print all active quests
7941 static void do_cmd_knowledge_quests_current(FILE *fff)
7944 char rand_tmp_str[120] = "\0";
7946 monster_race *r_ptr;
7948 int rand_level = 100;
7951 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7953 for (i = 1; i < max_q_idx; i++)
7955 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
7956 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
7957 (quest[i].status == QUEST_STATUS_COMPLETED))
7959 /* Set the quest number temporary */
7960 IDX old_quest = p_ptr->inside_quest;
7963 /* Clear the text */
7964 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
7965 quest_text_line = 0;
7967 p_ptr->inside_quest = i;
7969 /* Get the quest text */
7970 init_flags = INIT_SHOW_TEXT;
7972 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
7974 /* Reset the old quest number */
7975 p_ptr->inside_quest = old_quest;
7977 /* No info from "silent" quests */
7978 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7982 if (quest[i].type != QUEST_TYPE_RANDOM)
7984 char note[80] = "\0";
7986 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
7988 switch (quest[i].type)
7990 case QUEST_TYPE_KILL_LEVEL:
7991 case QUEST_TYPE_KILL_ANY_LEVEL:
7992 r_ptr = &r_info[quest[i].r_idx];
7993 strcpy(name, r_name + r_ptr->name);
7994 if (quest[i].max_num > 1)
7997 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
7998 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
8001 sprintf(note," - kill %d %s, have killed %d.",
8002 (int)quest[i].max_num, name, (int)quest[i].cur_num);
8006 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
8009 case QUEST_TYPE_FIND_ARTIFACT:
8012 artifact_type *a_ptr = &a_info[quest[i].k_idx];
8014 object_type *q_ptr = &forge;
8015 IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
8016 object_prep(q_ptr, k_idx);
8017 q_ptr->name1 = quest[i].k_idx;
8018 q_ptr->ident = IDENT_STORE;
8019 object_desc(name, q_ptr, OD_NAME_ONLY);
8021 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
8023 case QUEST_TYPE_FIND_EXIT:
8024 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8027 case QUEST_TYPE_KILL_NUMBER:
8029 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8030 (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num));
8032 sprintf(note," - Kill %d monsters, have killed %d.",
8033 (int)quest[i].max_num, (int)quest[i].cur_num);
8037 case QUEST_TYPE_KILL_ALL:
8038 case QUEST_TYPE_TOWER:
8039 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8044 /* Print the quest info */
8045 sprintf(tmp_str, _(" %s (危険度:%d階相当)%s\n", " %s (Danger level: %d)%s\n"),
8046 quest[i].name, (int)quest[i].level, note);
8048 fputs(tmp_str, fff);
8050 if (quest[i].status == QUEST_STATUS_COMPLETED)
8052 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8053 fputs(tmp_str, fff);
8059 while (quest_text[j][0] && j < 10)
8061 fprintf(fff, " %s\n", quest_text[j]);
8066 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8069 rand_level = quest[i].level;
8071 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8073 /* Print the quest info */
8074 r_ptr = &r_info[quest[i].r_idx];
8075 strcpy(name, r_name + r_ptr->name);
8077 if (quest[i].max_num > 1)
8080 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8081 quest[i].name, (int)quest[i].level,
8082 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
8086 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8087 quest[i].name, (int)quest[i].level,
8088 (int)quest[i].max_num, name, (int)quest[i].cur_num);
8093 sprintf(rand_tmp_str,_(" %s (%d 階) - %sを倒す。\n", " %s (Dungeon level: %d)\n Kill %s.\n"),
8094 quest[i].name, (int)quest[i].level, name);
8101 /* Print the current random quest */
8102 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8104 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8108 static bool do_cmd_knowledge_quests_aux(FILE *fff, IDX q_idx)
8111 char playtime_str[16];
8112 quest_type* const q_ptr = &quest[q_idx];
8114 if (is_fixed_quest_idx(q_idx))
8116 /* Set the quest number temporary */
8117 IDX old_quest = p_ptr->inside_quest;
8119 p_ptr->inside_quest = q_idx;
8122 init_flags = INIT_NAME_ONLY;
8124 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8126 /* Reset the old quest number */
8127 p_ptr->inside_quest = old_quest;
8129 /* No info from "silent" quests */
8130 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8133 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8134 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8136 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8138 /* Print the quest info */
8139 if (q_ptr->complev == 0)
8142 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8143 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8144 r_name+r_info[q_ptr->r_idx].name,
8145 (int)q_ptr->level, playtime_str);
8150 _(" %-35s (%3d階) - レベル%2d - %s\n",
8151 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8152 r_name+r_info[q_ptr->r_idx].name,
8160 /* Print the quest info */
8162 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8163 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8164 q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str);
8167 fputs(tmp_str, fff);
8173 * Print all finished quests
8175 void do_cmd_knowledge_quests_completed(FILE *fff, IDX quest_num[])
8180 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8181 for (i = 1; i < max_q_idx; i++)
8183 IDX q_idx = quest_num[i];
8184 quest_type* const q_ptr = &quest[q_idx];
8186 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8187 do_cmd_knowledge_quests_aux(fff, q_idx))
8192 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8197 * Print all failed quests
8199 void do_cmd_knowledge_quests_failed(FILE *fff, IDX quest_num[])
8204 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8205 for (i = 1; i < max_q_idx; i++)
8207 IDX q_idx = quest_num[i];
8208 quest_type* const q_ptr = &quest[q_idx];
8210 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8211 do_cmd_knowledge_quests_aux(fff, q_idx))
8216 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8221 * Print all random quests
8223 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8229 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8230 for (i = 1; i < max_q_idx; i++)
8232 /* No info from "silent" quests */
8233 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8235 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8239 /* Print the quest info */
8240 sprintf(tmp_str, _(" %s (%d階, %s)\n", " %s (%d, %s)\n"),
8241 quest[i].name, (int)quest[i].level, r_name+r_info[quest[i].r_idx].name);
8242 fputs(tmp_str, fff);
8245 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8249 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8251 QUEST_IDX *q_num = (QUEST_IDX *)u;
8252 quest_type *qa = &quest[q_num[a]];
8253 quest_type *qb = &quest[q_num[b]];
8258 return (qa->comptime != qb->comptime) ?
8259 (qa->comptime < qb->comptime) :
8260 (qa->level <= qb->level);
8263 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8265 QUEST_IDX *q_num = (QUEST_IDX *)u;
8272 q_num[a] = q_num[b];
8278 * Print quest status of all active quests
8280 static void do_cmd_knowledge_quests(void)
8283 char file_name[1024];
8288 /* Open a new file */
8289 fff = my_fopen_temp(file_name, 1024);
8292 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8297 /* Allocate Memory */
8298 C_MAKE(quest_num, max_q_idx, IDX);
8300 /* Sort by compete level */
8301 for (i = 1; i < max_q_idx; i++) quest_num[i] = i;
8302 ang_sort_comp = ang_sort_comp_quest_num;
8303 ang_sort_swap = ang_sort_swap_quest_num;
8304 ang_sort(quest_num, &dummy, max_q_idx);
8306 /* Dump Quest Information */
8307 do_cmd_knowledge_quests_current(fff);
8309 do_cmd_knowledge_quests_completed(fff, quest_num);
8311 do_cmd_knowledge_quests_failed(fff, quest_num);
8315 do_cmd_knowledge_quests_wiz_random(fff);
8318 /* Close the file */
8321 /* Display the file contents */
8322 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8324 /* Remove the file */
8328 C_KILL(quest_num, max_q_idx, IDX);
8335 static void do_cmd_knowledge_home(void)
8340 char file_name[1024];
8342 char o_name[MAX_NLEN];
8345 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8347 /* Open a new file */
8348 fff = my_fopen_temp(file_name, 1024);
8350 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8357 /* Print all homes in the different towns */
8358 st_ptr = &town[1].store[STORE_HOME];
8360 /* Home -- if anything there */
8361 if (st_ptr->stock_num)
8364 TERM_POSITION x = 1;
8366 /* Header with name of the town */
8367 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8369 /* Dump all available items */
8370 for (i = 0; i < st_ptr->stock_num; i++)
8373 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8374 object_desc(o_name, &st_ptr->stock[i], 0);
8375 if (strlen(o_name) <= 80-3)
8377 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8383 for (n = 0, t = o_name; n < 80-3; n++, t++)
8384 if(iskanji(*t)) {t++; n++;}
8385 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8387 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8388 fprintf(fff, " %.77s\n", o_name+n);
8391 object_desc(o_name, &st_ptr->stock[i], 0);
8392 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8397 /* Add an empty line */
8398 fprintf(fff, "\n\n");
8402 /* Close the file */
8405 /* Display the file contents */
8406 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8408 /* Remove the file */
8414 * Check the status of "autopick"
8416 static void do_cmd_knowledge_autopick(void)
8420 char file_name[1024];
8422 /* Open a new file */
8423 fff = my_fopen_temp(file_name, 1024);
8427 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8434 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8438 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8439 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8442 for (k = 0; k < max_autopick; k++)
8445 byte act = autopick_list[k].action;
8446 if (act & DONT_AUTOPICK)
8448 tmp = _("放置", "Leave");
8450 else if (act & DO_AUTODESTROY)
8452 tmp = _("破壊", "Destroy");
8454 else if (act & DO_AUTOPICK)
8456 tmp = _("拾う", "Pickup");
8458 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
8460 tmp = _("確認", "Query");
8463 if (act & DO_DISPLAY)
8464 fprintf(fff, "%11s", format("[%s]", tmp));
8466 fprintf(fff, "%11s", format("(%s)", tmp));
8468 tmp = autopick_line_from_entry(&autopick_list[k]);
8469 fprintf(fff, " %s", tmp);
8473 /* Close the file */
8475 /* Display the file contents */
8476 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8478 /* Remove the file */
8484 * Interact with "knowledge"
8486 void do_cmd_knowledge(void)
8489 bool need_redraw = FALSE;
8491 /* File type is "TEXT" */
8492 FILE_TYPE(FILE_TYPE_TEXT);
8494 /* Save the screen */
8497 /* Interact until done */
8503 /* Ask for a choice */
8505 prt(format("%d/2 ページ", (p+1)), 2, 65);
8506 prt("現在の知識を確認する", 3, 0);
8508 prt(format("page %d/2", (p+1)), 2, 65);
8509 prt("Display current knowledge", 3, 0);
8512 /* Give some choices */
8516 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8517 prt("(2) 既知のアイテム の一覧", 7, 5);
8518 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8519 prt("(4) 既知のモンスター の一覧", 9, 5);
8520 prt("(5) 倒した敵の数 の一覧", 10, 5);
8521 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8522 prt("(7) 現在のペット の一覧", 12, 5);
8523 prt("(8) 我が家のアイテム の一覧", 13, 5);
8524 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8525 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8529 prt("(a) 自分に関する情報 の一覧", 6, 5);
8530 prt("(b) 突然変異 の一覧", 7, 5);
8531 prt("(c) 武器の経験値 の一覧", 8, 5);
8532 prt("(d) 魔法の経験値 の一覧", 9, 5);
8533 prt("(e) 技能の経験値 の一覧", 10, 5);
8534 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8535 prt("(g) 入ったダンジョン の一覧", 12, 5);
8536 prt("(h) 実行中のクエスト の一覧", 13, 5);
8537 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8542 prt("(1) Display known artifacts", 6, 5);
8543 prt("(2) Display known objects", 7, 5);
8544 prt("(3) Display remaining uniques", 8, 5);
8545 prt("(4) Display known monster", 9, 5);
8546 prt("(5) Display kill count", 10, 5);
8547 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8548 prt("(7) Display current pets", 12, 5);
8549 prt("(8) Display home inventory", 13, 5);
8550 prt("(9) Display *identified* equip.", 14, 5);
8551 prt("(0) Display terrain symbols.", 15, 5);
8555 prt("(a) Display about yourself", 6, 5);
8556 prt("(b) Display mutations", 7, 5);
8557 prt("(c) Display weapon proficiency", 8, 5);
8558 prt("(d) Display spell proficiency", 9, 5);
8559 prt("(e) Display misc. proficiency", 10, 5);
8560 prt("(f) Display virtues", 11, 5);
8561 prt("(g) Display dungeons", 12, 5);
8562 prt("(h) Display current quests", 13, 5);
8563 prt("(i) Display auto pick/destroy", 14, 5);
8569 prt("ESC) 抜ける", 21, 1);
8570 prt("SPACE) 次ページ", 21, 30);
8571 /*prt("-) 前ページ", 21, 60);*/
8572 prt("コマンド:", 20, 0);
8574 prt("-more-", 17, 8);
8575 prt("ESC) Exit menu", 21, 1);
8576 prt("SPACE) Next page", 21, 30);
8577 /*prt("-) Previous page", 21, 60);*/
8578 prt("Command: ", 20, 0);
8585 if (i == ESCAPE) break;
8588 case ' ': /* Page change */
8592 case '1': /* Artifacts */
8593 do_cmd_knowledge_artifacts();
8595 case '2': /* Objects */
8596 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8598 case '3': /* Uniques */
8599 do_cmd_knowledge_uniques();
8601 case '4': /* Monsters */
8602 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8604 case '5': /* Kill count */
8605 do_cmd_knowledge_kill_count();
8607 case '6': /* wanted */
8608 if (!vanilla_town) do_cmd_knowledge_kubi();
8610 case '7': /* Pets */
8611 do_cmd_knowledge_pets();
8613 case '8': /* Home */
8614 do_cmd_knowledge_home();
8616 case '9': /* Resist list */
8617 do_cmd_knowledge_inven();
8619 case '0': /* Feature list */
8621 IDX lighting_level = F_LIT_STANDARD;
8622 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8626 case 'a': /* Max stat */
8627 do_cmd_knowledge_stat();
8629 case 'b': /* Mutations */
8630 do_cmd_knowledge_mutations();
8632 case 'c': /* weapon-exp */
8633 do_cmd_knowledge_weapon_exp();
8635 case 'd': /* spell-exp */
8636 do_cmd_knowledge_spell_exp();
8638 case 'e': /* skill-exp */
8639 do_cmd_knowledge_skill_exp();
8641 case 'f': /* Virtues */
8642 do_cmd_knowledge_virtues();
8644 case 'g': /* Dungeon */
8645 do_cmd_knowledge_dungeon();
8647 case 'h': /* Quests */
8648 do_cmd_knowledge_quests();
8650 case 'i': /* Autopick */
8651 do_cmd_knowledge_autopick();
8653 default: /* Unknown option */
8657 /* Flush messages */
8661 /* Restore the screen */
8664 if (need_redraw) do_cmd_redraw();
8669 * Check on the status of an active quest
8671 void do_cmd_checkquest(void)
8673 /* File type is "TEXT" */
8674 FILE_TYPE(FILE_TYPE_TEXT);
8676 /* Save the screen */
8680 do_cmd_knowledge_quests();
8682 /* Restore the screen */
8688 * Display the time and date
8690 void do_cmd_time(void)
8692 int day, hour, min, full, start, end, num;
8700 extract_day_hour_min(&day, &hour, &min);
8702 full = hour * 100 + min;
8709 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8711 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8712 else strcpy(day_buf, "*****");
8716 msg_format("%s日目, 時刻は%d:%02d %sです。",
8717 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8718 min, (hour < 12) ? "AM" : "PM");
8720 msg_format("This is day %s. The time is %d:%02d %s.",
8721 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8722 min, (hour < 12) ? "AM" : "PM");
8727 if (!randint0(10) || p_ptr->image)
8729 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8733 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8736 /* Open this file */
8737 fff = my_fopen(buf, "rt");
8742 /* Find this time */
8743 while (!my_fgets(fff, buf, sizeof(buf)))
8745 /* Ignore comments */
8746 if (!buf[0] || (buf[0] == '#')) continue;
8748 /* Ignore invalid lines */
8749 if (buf[1] != ':') continue;
8751 /* Process 'Start' */
8754 /* Extract the starting time */
8755 start = atoi(buf + 2);
8757 /* Assume valid for an hour */
8767 /* Extract the ending time */
8768 end = atoi(buf + 2);
8774 /* Ignore incorrect range */
8775 if ((start > full) || (full > end)) continue;
8777 /* Process 'Description' */
8782 /* Apply the randomizer */
8783 if (!randint0(num)) strcpy(desc, buf + 2);
8793 /* Close the file */