3 * @brief プレイヤーのインターフェイスに関するコマンドの実装 / Interface commands
7 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
8 * This software may be copied and distributed for educational, research,
9 * and not for profit purposes provided that this copyright and statement
10 * are included in all such copies. Other copyrights may also apply.
14 * A set of functions to maintain automatic dumps of various kinds.
16 * remove_auto_dump(orig_file, mark)
17 * Remove the old automatic dump of type "mark".
18 * auto_dump_printf(fmt, ...)
19 * Dump a formatted string using fprintf().
20 * open_auto_dump(buf, mark)
21 * Open a file, remove old dump, and add new header.
22 * close_auto_dump(void)
23 * Add a footer, and close the file.
24 * The dump commands of original Angband simply add new lines to
25 * existing files; these files will become bigger and bigger unless
26 * an user deletes some or all of these files by hand at some
28 * These three functions automatically delete old dumped lines
29 * before adding new ones. Since there are various kinds of automatic
30 * dumps in a single file, we add a header and a footer with a type
31 * name for every automatic dump, and kill old lines only when the
32 * lines have the correct type of header and footer.
33 * We need to be quite paranoid about correctness; the user might
34 * (mistakenly) edit the file by hand, and see all their work come
35 * to nothing on the next auto dump otherwise. The current code only
36 * detects changes by noting inconsistencies between the actual number
37 * of lines and the number written in the footer. Note that this will
38 * not catch single-line edits.
50 * Mark strings for auto dump
52 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
53 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
56 * Variables for auto dump
58 static FILE *auto_dump_stream;
59 static cptr auto_dump_mark;
60 static int auto_dump_line_num;
64 * @brief prf出力内容を消去する /
65 * Remove old lines automatically generated before.
66 * @param orig_file 消去を行うファイル名
68 static void remove_auto_dump(cptr orig_file)
70 FILE *tmp_fff, *orig_fff;
74 bool between_mark = FALSE;
77 long header_location = 0;
78 char header_mark_str[80];
79 char footer_mark_str[80];
82 /* Prepare a header/footer mark string */
83 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
84 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
86 mark_len = strlen(footer_mark_str);
88 /* Open an old dump file in read-only mode */
89 orig_fff = my_fopen(orig_file, "r");
91 /* If original file does not exist, nothing to do */
92 if (!orig_fff) return;
94 /* Open a new (temporary) file */
95 tmp_fff = my_fopen_temp(tmp_file, 1024);
99 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), tmp_file);
104 /* Loop for every line */
108 if (my_fgets(orig_fff, buf, sizeof(buf)))
110 /* Read error: Assume End of File */
113 * Was looking for the footer, but not found.
115 * Since automatic dump might be edited by hand,
116 * it's dangerous to kill these lines.
117 * Seek back to the next line of the (pseudo) header,
122 fseek(orig_fff, header_location, SEEK_SET);
123 between_mark = FALSE;
127 /* Success -- End the loop */
134 /* We are looking for the header mark of automatic dump */
137 /* Is this line a header? */
138 if (!strcmp(buf, header_mark_str))
140 /* Memorise seek point of this line */
141 header_location = ftell(orig_fff);
143 /* Initialize counter for number of lines */
146 /* Look for the footer from now */
149 /* There are some changes */
156 /* Copy orginally lines */
157 fprintf(tmp_fff, "%s\n", buf);
161 /* We are looking for the footer mark of automatic dump */
164 /* Is this line a footer? */
165 if (!strncmp(buf, footer_mark_str, mark_len))
170 * Compare the number of lines
172 * If there is an inconsistency between
173 * actual number of lines and the
174 * number here, the automatic dump
175 * might be edited by hand. So it's
176 * dangerous to kill these lines.
177 * Seek back to the next line of the
178 * (pseudo) header, and read again.
180 if (!sscanf(buf + mark_len, " (%d)", &tmp)
183 fseek(orig_fff, header_location, SEEK_SET);
186 /* Look for another header */
187 between_mark = FALSE;
193 /* Ignore old line, and count number of lines */
203 /* If there are some changes, overwrite the original file with new one */
206 /* Copy contents of temporary file */
208 tmp_fff = my_fopen(tmp_file, "r");
209 orig_fff = my_fopen(orig_file, "w");
211 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
212 fprintf(orig_fff, "%s\n", buf);
218 /* Kill the temporary file */
226 * @brief prfファイルのフォーマットに従った内容を出力する /
227 * Dump a formatted line, using "vstrnfmt()".
230 static void auto_dump_printf(cptr fmt, ...)
237 /* Begin the Varargs Stuff */
240 /* Format the args, save the length */
241 (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
243 /* End the Varargs Stuff */
246 /* Count number of lines */
247 for (p = buf; *p; p++)
249 if (*p == '\n') auto_dump_line_num++;
253 fprintf(auto_dump_stream, "%s", buf);
258 * @brief prfファイルをファイルオープンする /
259 * Open file to append auto dump.
261 * @param mark 出力するヘッダマーク
262 * @return ファイルポインタを取得できたらTRUEを返す
264 static bool open_auto_dump(cptr buf, cptr mark)
267 char header_mark_str[80];
269 /* Save the mark string */
270 auto_dump_mark = mark;
272 /* Prepare a header mark string */
273 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
275 /* Remove old macro dumps */
276 remove_auto_dump(buf);
278 /* Append to the file */
279 auto_dump_stream = my_fopen(buf, "a");
282 if (!auto_dump_stream) {
283 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
291 fprintf(auto_dump_stream, "%s\n", header_mark_str);
293 /* Initialize counter */
294 auto_dump_line_num = 0;
296 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
297 "# *Warning!* The lines below are an automatic dump.\n"));
298 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
299 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
305 * @brief prfファイルをファイルクローズする /
306 * Append foot part and close auto dump.
309 static void close_auto_dump(void)
311 char footer_mark_str[80];
313 /* Prepare a footer mark string */
314 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
316 auto_dump_printf(_("# *警告!!* 以降の行は自動生成されたものです。\n",
317 "# *Warning!* The lines below are an automatic dump.\n"));
318 auto_dump_printf(_("# *警告!!* 後で自動的に削除されるので編集しないでください。\n",
319 "# Don't edit them; changes will be deleted and replaced automatically.\n"));
321 fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
324 my_fclose(auto_dump_stream);
333 * @brief Return suffix of ordinal number
335 * @return pointer of suffix string.
337 cptr get_ordinal_number_suffix(int num)
339 num = ABS(num) % 100;
343 return (num == 11) ? "th" : "st";
345 return (num == 12) ? "th" : "nd";
347 return (num == 13) ? "th" : "rd";
356 * @brief 日記にメッセージを追加する /
357 * Take note to the diary.
358 * @param type 日記内容のID
359 * @param num 日記内容のIDに応じた数値
360 * @param note 日記内容のIDに応じた文字列参照ポインタ
363 errr do_cmd_write_nikki(int type, int num, cptr note)
369 cptr note_level = "";
370 bool do_level = TRUE;
371 char note_level_buf[40];
374 static bool disable_nikki = FALSE;
376 extract_day_hour_min(&day, &hour, &min);
378 if (disable_nikki) return(-1);
380 if (type == NIKKI_FIX_QUEST_C ||
381 type == NIKKI_FIX_QUEST_F ||
382 type == NIKKI_RAND_QUEST_C ||
383 type == NIKKI_RAND_QUEST_F ||
384 type == NIKKI_TO_QUEST)
388 old_quest = p_ptr->inside_quest;
389 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
391 /* Get the quest text */
392 init_flags = INIT_NAME_ONLY;
394 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
396 /* Reset the old quest number */
397 p_ptr->inside_quest = old_quest;
400 /* different filne name to avoid mixing */
401 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
403 /* Build the filename */
404 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
406 /* File type is "TEXT" */
407 FILE_TYPE(FILE_TYPE_TEXT);
409 fff = my_fopen(buf, "a");
414 msg_format(_("%s を開くことができませんでした。プレイ記録を一時停止します。", "Failed to open %s. Play-Record is disabled temporally."), buf);
420 q_idx = quest_number(dun_level);
424 if (p_ptr->inside_arena)
425 note_level = _("アリーナ:", "Arane:");
427 note_level = _("地上:", "Surface:");
428 else if (q_idx && (is_fixed_quest_idx(q_idx)
429 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
430 note_level = _("クエスト:", "Quest:");
434 sprintf(note_level_buf, "%d階(%s):", (int)dun_level, d_name+d_info[dungeon_type].name);
436 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, (int)dun_level);
438 note_level = note_level_buf;
446 if (day < MAX_DAYS) fprintf(fff, _("%d日目\n", "Day %d\n"), day);
447 else fputs(_("*****日目\n", "Day *****\n"), fff);
455 fprintf(fff, "%s\n",note);
459 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
464 fprintf(fff, _(" %2d:%02d %20s %sを発見した。\n", " %2d:%02d %20s discovered %s.\n"), hour, min, note_level, note);
467 case NIKKI_ART_SCROLL:
469 fprintf(fff, _(" %2d:%02d %20s 巻物によって%sを生成した。\n", " %2d:%02d %20s created %s by scroll.\n"), hour, min, note_level, note);
474 fprintf(fff, _(" %2d:%02d %20s %sを倒した。\n", " %2d:%02d %20s defeated %s.\n"), hour, min, note_level, note);
477 case NIKKI_FIX_QUEST_C:
479 if (quest[num].flags & QUEST_FLAG_SILENT) break;
480 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」を達成した。\n",
481 " %2d:%02d %20s completed quest '%s'.\n"), hour, min, note_level, quest[num].name);
484 case NIKKI_FIX_QUEST_F:
486 if (quest[num].flags & QUEST_FLAG_SILENT) break;
487 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」から命からがら逃げ帰った。\n",
488 " %2d:%02d %20s run away from quest '%s'.\n"), hour, min, note_level, quest[num].name);
491 case NIKKI_RAND_QUEST_C:
494 strcpy(name, r_name+r_info[quest[num].r_idx].name);
495 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)を達成した。\n",
496 " %2d:%02d %20s completed random quest '%s'\n"), hour, min, note_level, name);
499 case NIKKI_RAND_QUEST_F:
502 strcpy(name, r_name+r_info[quest[num].r_idx].name);
503 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)から逃げ出した。\n",
504 " %2d:%02d %20s ran away from quest '%s'.\n"), hour, min, note_level, name);
507 case NIKKI_MAXDEAPTH:
509 fprintf(fff, _(" %2d:%02d %20s %sの最深階%d階に到達した。\n",
510 " %2d:%02d %20s reached level %d of %s for the first time.\n"), hour, min, note_level,
511 _(d_name+d_info[dungeon_type].name, num),
512 _(num, d_name+d_info[dungeon_type].name));
517 fprintf(fff, _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n",
518 " %2d:%02d %20s reset recall level of %s to %d %s.\n"), hour, min, note_level, note,
519 _(d_name + d_info[num].name, (int)max_dlv[num]),
520 _((int)max_dlv[num], d_name + d_info[num].name));
526 if (q_idx && (is_fixed_quest_idx(q_idx)
527 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
529 to = _("地上", "the surface");
533 if (!(dun_level+num)) to = _("地上", "the surface");
534 else to = format(_("%d階", "level %d"), dun_level+num);
536 fprintf(fff, _(" %2d:%02d %20s %sへ%s。\n", " %2d:%02d %20s %s %s.\n"), hour, min, note_level, _(to, note), _(note, to));
542 fprintf(fff, _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n"),
543 hour, min, note_level, _(d_name+d_info[dungeon_type].name, (int)max_dlv[dungeon_type]),
544 _((int)max_dlv[dungeon_type], d_name+d_info[dungeon_type].name));
546 fprintf(fff, _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n"), hour, min, note_level);
551 if (quest[num].flags & QUEST_FLAG_SILENT) break;
552 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」へと突入した。\n", " %2d:%02d %20s entered the quest '%s'.\n"),
553 hour, min, note_level, quest[num].name);
558 fprintf(fff, _(" %2d:%02d %20s レベル・テレポートで脱出した。\n", " %2d:%02d %20s Got out using teleport level.\n"),
559 hour, min, note_level);
564 fprintf(fff, _(" %2d:%02d %20s %sを購入した。\n", " %2d:%02d %20s bought %s.\n"), hour, min, note_level, note);
569 fprintf(fff, _(" %2d:%02d %20s %sを売却した。\n", " %2d:%02d %20s sold %s.\n"), hour, min, note_level, note);
577 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦で、%sの前に敗れ去った。\n", " %2d:%02d %20s beaten by %s in the %d%s fight.\n"),
578 hour, min, note_level, _(n, note), _("", n), _(note, get_ordinal_number_suffix(n)));
581 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d%s回戦(%s)に勝利した。\n", " %2d:%02d %20s won the %d%s fight (%s).\n"),
582 hour, min, note_level, num, _("", get_ordinal_number_suffix(num)), note);
584 if (num == MAX_ARENA_MONS)
586 fprintf(fff, _(" 闘技場のすべての敵に勝利し、チャンピオンとなった。\n",
587 " won all fight to become a Chanpion.\n"));
594 fprintf(fff, _(" %2d:%02d %20s %sを識別した。\n", " %2d:%02d %20s identified %s.\n"), hour, min, note_level, note);
601 to = _("地上", "the surface");
603 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
605 fprintf(fff, _(" %2d:%02d %20s %sへとウィザード・テレポートで移動した。\n",
606 " %2d:%02d %20s wizard-teleport to %s.\n"), hour, min, note_level, to);
613 to = _("地上", "the surface");
615 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
617 fprintf(fff, _(" %2d:%02d %20s %sへとパターンの力で移動した。\n",
618 " %2d:%02d %20s used Pattern to teleport to %s.\n"), hour, min, note_level, to);
623 fprintf(fff, _(" %2d:%02d %20s レベルが%dに上がった。\n", " %2d:%02d %20s reached player level %d.\n"), hour, min, note_level, num);
626 case NIKKI_GAMESTART:
628 time_t ct = time((time_t*)0);
632 fprintf(fff, "%s %s",note, ctime(&ct));
635 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
638 case NIKKI_NAMED_PET:
640 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
643 case RECORD_NAMED_PET_NAME:
644 fprintf(fff, _("%sを旅の友にすることに決めた。\n", "decided to travel together with %s.\n"), note);
646 case RECORD_NAMED_PET_UNNAME:
647 fprintf(fff, _("%sの名前を消した。\n", "unnamed %s.\n"), note);
649 case RECORD_NAMED_PET_DISMISS:
650 fprintf(fff, _("%sを解放した。\n", "dismissed %s.\n"), note);
652 case RECORD_NAMED_PET_DEATH:
653 fprintf(fff, _("%sが死んでしまった。\n", "%s died.\n"), note);
655 case RECORD_NAMED_PET_MOVED:
656 fprintf(fff, _("%sをおいて別のマップへ移動した。\n", "moved to another map leaving %s behind.\n"), note);
658 case RECORD_NAMED_PET_LOST_SIGHT:
659 fprintf(fff, _("%sとはぐれてしまった。\n", "lost sight of %s.\n"), note);
661 case RECORD_NAMED_PET_DESTROY:
662 fprintf(fff, _("%sが*破壊*によって消え去った。\n", "%s was made disappeared by *destruction*.\n"), note);
664 case RECORD_NAMED_PET_EARTHQUAKE:
665 fprintf(fff, _("%sが岩石に押し潰された。\n", "%s was crushed by falling rocks.\n"), note);
667 case RECORD_NAMED_PET_GENOCIDE:
668 fprintf(fff, _("%sが抹殺によって消え去った。\n", "%s was made disappeared by genocide.\n"), note);
670 case RECORD_NAMED_PET_WIZ_ZAP:
671 fprintf(fff, _("%sがデバッグコマンドによって消え去った。\n", "%s was removed by debug command.\n"), note);
673 case RECORD_NAMED_PET_TELE_LEVEL:
674 fprintf(fff, _("%sがテレポート・レベルによって消え去った。\n", "%s was made disappeared by teleport level.\n"), note);
676 case RECORD_NAMED_PET_BLAST:
677 fprintf(fff, _("%sを爆破した。\n", "blasted %s.\n"), note);
679 case RECORD_NAMED_PET_HEAL_LEPER:
680 fprintf(fff, _("%sの病気が治り旅から外れた。\n", "%s was healed and left.\n"), note);
682 case RECORD_NAMED_PET_COMPACT:
683 fprintf(fff, _("%sがモンスター情報圧縮によって消え去った。\n", "%s was made disappeared by compacting monsters.\n"), note);
685 case RECORD_NAMED_PET_LOSE_PARENT:
686 fprintf(fff, _("%sの召喚者が既にいないため消え去った。\n", "%s disappeared because there does not exist summoner.\n"), note);
697 case NIKKI_WIZARD_LOG:
698 fprintf(fff, "%s\n", note);
707 if (do_level) write_level = FALSE;
713 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
716 * @brief 日記のタイトル表記と内容出力 /
719 * 日記のタイトルは本関数の subtitle ローカル変数で定義されている。
721 static void do_cmd_disp_nikki(void)
723 char nikki_title[256];
729 static const char subtitle[][30] = {"最強の肉体を求めて",
760 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
761 "Attack is the best form of defence.",
763 "An unexpected windfall",
764 "A drowning man will catch at a straw",
765 "Don't count your chickens before they are hatched.",
766 "It is no use crying over spilt milk.",
767 "Seeing is believing.",
768 "Strike the iron while it is hot.",
769 "I don't care what follows.",
770 "To dig a well to put out a house on fire.",
771 "Tomorrow is another day.",
772 "Easy come, easy go.",
773 "The more haste, the less speed.",
774 "Where there is life, there is hope.",
775 "There is no royal road to *WINNER*.",
776 "Danger past, God forgotten.",
777 "The best thing to do now is to run away.",
778 "Life is but an empty dream.",
779 "Dead men tell no tales.",
780 "A book that remains shut is but a block.",
781 "Misfortunes never come singly.",
782 "A little knowledge is a dangerous thing.",
783 "History repeats itself.",
784 "*WINNER* was not built in a day.",
785 "Ignorance is bliss.",
786 "To lose is to win?",
787 "No medicine can cure folly.",
788 "All good things come to an end.",
789 "M$ Empire strikes back.",
790 "To see is to believe",
792 "Quest of The World's Greatest Brain"};
794 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
796 /* Build the filename */
797 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
799 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
800 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
801 else if (IS_WIZARD_CLASS())
802 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
803 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
806 sprintf(nikki_title, "「%s%s%sの伝説 -%s-」",
807 ap_ptr->title, ap_ptr->no ? "の" : "", p_ptr->name, tmp);
809 sprintf(nikki_title, "Legend of %s %s '%s'",
810 ap_ptr->title, p_ptr->name, tmp);
813 /* Display the file contents */
814 show_file(FALSE, buf, nikki_title, -1, 0);
818 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
821 static void do_cmd_bunshou(void)
824 char bunshou[80] = "\0";
826 if (get_string(_("内容: ", "diary note: "), tmp, 79))
828 strcpy(bunshou, tmp);
830 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
835 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
838 static void do_cmd_last_get(void)
843 if (record_o_name[0] == '\0') return;
845 sprintf(buf,_("%sの入手を記録します。", "Do you really want to record getting %s? "),record_o_name);
846 if (!get_check(buf)) return;
850 sprintf(buf,_("%sを手に入れた。", "descover %s."), record_o_name);
851 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
856 * @brief ファイル中の全日記記録を消去する /
859 static void do_cmd_erase_nikki(void)
865 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your record? "))) return;
866 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
868 /* Build the filename */
869 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
871 /* Remove the file */
874 fff = my_fopen(buf, "w");
877 msg_format(_("記録を消去しました。", "deleted record."));
879 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
888 void do_cmd_nikki(void)
892 /* File type is "TEXT" */
893 FILE_TYPE(FILE_TYPE_TEXT);
895 /* Save the screen */
898 /* Interact until done */
904 /* Ask for a choice */
905 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
907 /* Give some choices */
908 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
909 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
910 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record item you last get/identify"), 6, 5);
911 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
913 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
916 prt(_("コマンド:", "Command: "), 18, 0);
921 if (i == ESCAPE) break;
935 do_cmd_erase_nikki();
939 prepare_movie_hooks();
941 default: /* Unknown option */
949 /* Restore the screen */
954 * @brief 画面を再描画するコマンドのメインルーチン
955 * Hack -- redraw the screen
959 * This command performs various low level updates, clears all the "extra"
960 * windows, does a total redraw of the main window, and requests all of the
961 * interesting updates and redraws that I can think of.
963 * This command is also used to "instantiate" the results of the user
964 * selecting various things, such as graphics mode, so it must call
965 * the "TERM_XTRA_REACT" hook before redrawing the windows.
968 void do_cmd_redraw(void)
975 /* Hack -- react to changes */
976 Term_xtra(TERM_XTRA_REACT, 0);
979 /* Combine and Reorder the pack (later) */
980 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
984 p_ptr->update |= (PU_TORCH);
986 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
988 /* Forget lite/view */
989 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
991 /* Update lite/view */
992 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
994 /* Update monsters */
995 p_ptr->update |= (PU_MONSTERS);
997 /* Redraw everything */
998 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1000 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1002 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1006 /* Hack -- update */
1009 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1012 /* Redraw every window */
1013 for (j = 0; j < 8; j++)
1016 if (!angband_term[j]) continue;
1019 Term_activate(angband_term[j]);
1034 * @brief 名前を変更するコマンドのメインルーチン
1035 * Hack -- change name
1038 void do_cmd_change_name(void)
1047 /* Save the screen */
1055 /* Display the player */
1056 display_player(mode);
1061 display_player(mode);
1066 Term_putstr(2, 23, -1, TERM_WHITE,
1067 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1069 Term_putstr(2, 23, -1, TERM_WHITE,
1070 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1078 if (c == ESCAPE) break;
1085 /* Process the player name */
1086 process_player_name(FALSE);
1092 sprintf(tmp, "%s.txt", player_base);
1093 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1095 if (tmp[0] && (tmp[0] != ' '))
1097 file_character(tmp);
1113 /* Flush messages */
1117 /* Restore the screen */
1120 /* Redraw everything */
1121 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1128 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1129 * Recall the most recent message
1132 void do_cmd_message_one(void)
1134 /* Recall one message */
1135 prt(format("> %s", message_str(0)), 0, 0);
1140 * @brief メッセージのログを表示するコマンドのメインルーチン
1141 * Recall the most recent message
1145 * Show previous messages to the user -BEN-
1147 * The screen format uses line 0 and 23 for headers and prompts,
1148 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1150 * This command shows you which commands you are viewing, and allows
1151 * you to "search" for strings in the recall.
1153 * Note that messages may be longer than 80 characters, but they are
1154 * displayed using "infinite" length, with a special sub-command to
1155 * "slide" the virtual display to the left or right.
1157 * Attempt to only hilite the matching portions of the string.
1160 void do_cmd_messages(int num_now)
1164 char shower_str[81];
1165 char finder_str[81];
1172 Term_get_size(&wid, &hgt);
1174 /* Number of message lines in a screen */
1175 num_lines = hgt - 4;
1178 strcpy(finder_str, "");
1181 strcpy(shower_str, "");
1183 /* Total messages */
1186 /* Start on first message */
1189 /* Save the screen */
1195 /* Process requests until done */
1201 /* Dump up to 20 lines of messages */
1202 for (j = 0; (j < num_lines) && (i + j < n); j++)
1204 cptr msg = message_str(i+j);
1206 /* Dump the messages, bottom to top */
1207 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1209 /* Hilite "shower" */
1210 if (shower && shower[0])
1214 /* Display matches */
1215 while ((str = my_strstr(str, shower)) != NULL)
1217 int len = strlen(shower);
1219 /* Display the match */
1220 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1228 /* Erase remaining lines */
1229 for (; j < num_lines; j++)
1231 Term_erase(0, num_lines + 1 - j, 255);
1234 /* Display header */
1236 prt(format(_("以前のメッセージ %d-%d 全部で(%d)", "Message Recall (%d-%d of %d)"),
1237 i, i + j - 1, n), 0, 0);
1239 /* Display prompt (not very informative) */
1240 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1241 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1244 skey = inkey_special(TRUE);
1246 /* Exit on Escape */
1247 if (skey == ESCAPE) break;
1249 /* Hack -- Save the old index */
1254 /* Hack -- handle show */
1257 prt(_("強調: ", "Show: "), hgt - 1, 0);
1259 /* Get a "shower" string, or continue */
1260 strcpy(back_str, shower_str);
1261 if (askfor(shower_str, 80))
1264 shower = shower_str[0] ? shower_str : NULL;
1266 else strcpy(shower_str, back_str);
1270 /* Hack -- handle find */
1277 prt(_("検索: ", "Find: "), hgt - 1, 0);
1279 /* Get a "finder" string, or continue */
1280 strcpy(back_str, finder_str);
1281 if (!askfor(finder_str, 80))
1283 strcpy(finder_str, back_str);
1286 else if (!finder_str[0])
1288 shower = NULL; /* Stop showing */
1293 shower = finder_str;
1296 for (z = i + 1; z < n; z++)
1298 cptr msg = message_str(z);
1301 if (my_strstr(msg, finder_str))
1312 /* Recall 1 older message */
1314 /* Go to the oldest line */
1318 /* Recall 1 newer message */
1320 /* Go to the newest line */
1324 /* Recall 1 older message */
1329 /* Go older if legal */
1330 i = MIN(i + 1, n - num_lines);
1333 /* Recall 10 older messages */
1335 /* Go older if legal */
1336 i = MIN(i + 10, n - num_lines);
1339 /* Recall 20 older messages */
1344 /* Go older if legal */
1345 i = MIN(i + num_lines, n - num_lines);
1348 /* Recall 20 newer messages */
1352 /* Go newer (if able) */
1353 i = MAX(0, i - num_lines);
1356 /* Recall 10 newer messages */
1358 /* Go newer (if able) */
1362 /* Recall 1 newer messages */
1365 /* Go newer (if able) */
1370 /* Hack -- Error of some kind */
1374 /* Restore the screen */
1380 * @brief チートオプションを変更するコマンドのメインルーチン
1381 * Interact with some options for cheating
1382 * @param info 表示メッセージ
1385 static void do_cmd_options_cheat(cptr info)
1388 int i, k = 0, n = CHEAT_MAX;
1394 /* Interact with the player */
1400 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1405 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1406 prt(" << 注意 >>", 11, 0);
1407 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1408 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1409 prt(" じらないようにして下さい。", 14, 0);
1411 /* Display the options */
1412 for (i = 0; i < n; i++)
1414 byte a = TERM_WHITE;
1416 /* Color current option */
1417 if (i == k) a = TERM_L_BLUE;
1419 /* Display the option text */
1420 sprintf(buf, "%-48s: %s (%s)",
1421 cheat_info[i].o_desc,
1422 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1423 cheat_info[i].o_text);
1424 c_prt(a, buf, i + 2, 0);
1427 /* Hilite current option */
1428 move_cursor(k + 2, 50);
1434 * HACK - Try to translate the key into a direction
1435 * to allow using the roguelike keys for navigation.
1437 dir = get_keymap_dir(ch);
1438 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1452 k = (n + k - 1) % n;
1470 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1471 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1472 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1473 (*cheat_info[k].o_var) = TRUE;
1482 (*cheat_info[k].o_var) = FALSE;
1489 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1490 /* Peruse the help file */
1491 (void)show_file(TRUE, buf, NULL, 0, 0);
1508 * @brief セーブ頻度ターンの次の値を返す
1509 * @param current 現在のセーブ頻度ターン値
1510 * @return 次のセーブ頻度ターン値
1512 static s16b toggle_frequency(s16b current)
1517 case 50: return 100;
1518 case 100: return 250;
1519 case 250: return 500;
1520 case 500: return 1000;
1521 case 1000: return 2500;
1522 case 2500: return 5000;
1523 case 5000: return 10000;
1524 case 10000: return 25000;
1531 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1532 * @param info 表示メッセージ
1535 static void do_cmd_options_autosave(cptr info)
1539 int i, k = 0, n = 2;
1547 /* Interact with the player */
1551 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1552 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1556 /* Display the options */
1557 for (i = 0; i < n; i++)
1559 byte a = TERM_WHITE;
1561 /* Color current option */
1562 if (i == k) a = TERM_L_BLUE;
1564 /* Display the option text */
1565 sprintf(buf, "%-48s: %s (%s)",
1566 autosave_info[i].o_desc,
1567 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1568 autosave_info[i].o_text);
1569 c_prt(a, buf, i + 2, 0);
1571 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1573 /* Hilite current option */
1574 move_cursor(k + 2, 50);
1590 k = (n + k - 1) % n;
1608 (*autosave_info[k].o_var) = TRUE;
1617 (*autosave_info[k].o_var) = FALSE;
1625 autosave_freq = toggle_frequency(autosave_freq);
1626 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1632 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1648 * @brief 標準オプションを変更するコマンドのサブルーチン /
1649 * Interact with some options
1650 * @param page オプションページ番号
1651 * @param info 表示メッセージ
1654 void do_cmd_options_aux(int page, cptr info)
1657 int i, k = 0, n = 0, l;
1660 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1661 (!p_ptr->wizard || !allow_debug_opts);
1664 /* Lookup the options */
1665 for (i = 0; i < 24; i++) opt[i] = 0;
1667 /* Scan the options */
1668 for (i = 0; option_info[i].o_desc; i++)
1670 /* Notice options on this "page" */
1671 if (option_info[i].o_page == page) opt[n++] = i;
1678 /* Interact with the player */
1684 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1685 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1688 /* HACK -- description for easy-auto-destroy options */
1689 if (page == OPT_PAGE_AUTODESTROY)
1690 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1691 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1693 /* Display the options */
1694 for (i = 0; i < n; i++)
1696 byte a = TERM_WHITE;
1698 /* Color current option */
1699 if (i == k) a = TERM_L_BLUE;
1701 /* Display the option text */
1702 sprintf(buf, "%-48s: %s (%.19s)",
1703 option_info[opt[i]].o_desc,
1704 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1705 option_info[opt[i]].o_text);
1706 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1707 else c_prt(a, buf, i + 2, 0);
1710 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1713 /* Hilite current option */
1714 move_cursor(k + 2 + l, 50);
1720 * HACK - Try to translate the key into a direction
1721 * to allow using the roguelike keys for navigation.
1723 dir = get_keymap_dir(ch);
1724 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1738 k = (n + k - 1) % n;
1755 if (browse_only) break;
1756 (*option_info[opt[k]].o_var) = TRUE;
1765 if (browse_only) break;
1766 (*option_info[opt[k]].o_var) = FALSE;
1774 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1780 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1781 /* Peruse the help file */
1782 (void)show_file(TRUE, buf, NULL, 0, 0);
1799 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1800 * Modify the "window" options
1803 static void do_cmd_options_win(void)
1813 /* Memorize old flags */
1814 for (j = 0; j < 8; j++)
1816 /* Acquire current flags */
1817 old_flag[j] = window_flag[j];
1828 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1830 /* Display the windows */
1831 for (j = 0; j < 8; j++)
1833 byte a = TERM_WHITE;
1835 cptr s = angband_term_name[j];
1838 if (j == x) a = TERM_L_BLUE;
1840 /* Window name, staggered, centered */
1841 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1844 /* Display the options */
1845 for (i = 0; i < 16; i++)
1847 byte a = TERM_WHITE;
1849 cptr str = window_flag_desc[i];
1852 if (i == y) a = TERM_L_BLUE;
1855 if (!str) str = _("(未使用)", "(Unused option)");
1858 Term_putstr(0, i + 5, -1, a, str);
1860 /* Display the windows */
1861 for (j = 0; j < 8; j++)
1867 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1870 if (window_flag[j] & (1L << i)) c = 'X';
1873 Term_putch(35 + j * 5, i + 5, a, c);
1878 Term_gotoxy(35 + x * 5, y + 5);
1896 for (j = 0; j < 8; j++)
1898 window_flag[j] &= ~(1L << y);
1902 for (i = 0; i < 16; i++)
1904 window_flag[x] &= ~(1L << i);
1917 window_flag[x] |= (1L << y);
1925 window_flag[x] &= ~(1L << y);
1931 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
1939 d = get_keymap_dir(ch);
1941 x = (x + ddx[d] + 8) % 8;
1942 y = (y + ddy[d] + 16) % 16;
1949 /* Notice changes */
1950 for (j = 0; j < 8; j++)
1955 if (!angband_term[j]) continue;
1957 /* Ignore non-changes */
1958 if (window_flag[j] == old_flag[j]) continue;
1961 Term_activate(angband_term[j]);
1984 option_fields[OPT_NUM] =
1987 { '1', " キー入力 オプション", 3 },
1988 { '2', " マップ画面 オプション", 4 },
1989 { '3', " テキスト表示 オプション", 5 },
1990 { '4', " ゲームプレイ オプション", 6 },
1991 { '5', " 行動中止関係 オプション", 7 },
1992 { '6', " 簡易自動破壊 オプション", 8 },
1993 { 'r', " プレイ記録 オプション", 9 },
1995 { 'p', "自動拾いエディタ", 11 },
1996 { 'd', " 基本ウェイト量 ", 12 },
1997 { 'h', "低ヒットポイント", 13 },
1998 { 'm', " 低魔力色閾値 ", 14 },
1999 { 'a', " 自動セーブ オプション", 15 },
2000 { 'w', "ウインドウフラグ", 16 },
2002 { 'b', " 初期 オプション (参照のみ)", 18 },
2003 { 'c', " 詐欺 オプション", 19 },
2005 { '1', "Input Options", 3 },
2006 { '2', "Map Screen Options", 4 },
2007 { '3', "Text Display Options", 5 },
2008 { '4', "Game-Play Options", 6 },
2009 { '5', "Disturbance Options", 7 },
2010 { '6', "Easy Auto-Destroyer Options", 8 },
2011 { 'r', "Play record Options", 9 },
2013 { 'p', "Auto-picker/destroyer editor", 11 },
2014 { 'd', "Base Delay Factor", 12 },
2015 { 'h', "Hitpoint Warning", 13 },
2016 { 'm', "Mana Color Threshold", 14 },
2017 { 'a', "Autosave Options", 15 },
2018 { 'w', "Window Flags", 16 },
2020 { 'b', "Birth Options (Browse Only)", 18 },
2021 { 'c', "Cheat Options", 19 },
2027 * @brief 標準オプションを変更するコマンドのメインルーチン /
2028 * Set or unset various options.
2032 * The user must use the "Ctrl-R" command to "adapt" to changes
2033 * in any options which control "visual" aspects of the game.
2036 void do_cmd_options(void)
2042 /* Save the screen */
2050 /* Does not list cheat option when cheat option is off */
2051 if (!p_ptr->noscore && !allow_debug_opts) n--;
2056 /* Why are we here */
2057 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2061 /* Give some choices */
2062 for (i = 0; i < n; i++)
2064 byte a = TERM_WHITE;
2065 if (i == y) a = TERM_L_BLUE;
2066 Term_putstr(5, option_fields[i].row, -1, a,
2067 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2070 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2073 skey = inkey_special(TRUE);
2074 if (!(skey & SKEY_MASK)) k = (char)skey;
2078 if (k == ESCAPE) break;
2080 if (my_strchr("\n\r ", k))
2082 k = option_fields[y].key;
2086 for (i = 0; i < n; i++)
2088 if (tolower(k) == option_fields[i].key) break;
2091 /* Command is found */
2094 /* Hack -- browse help */
2095 if (k == '?') break;
2099 if (skey == SKEY_UP) d = 8;
2100 if (skey == SKEY_DOWN) d = 2;
2101 y = (y + ddy[d] + n) % n;
2106 if (k == ESCAPE) break;
2113 /* Process the general options */
2114 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2120 /* Process the general options */
2121 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2128 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2135 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2142 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2149 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2153 /* Play-record Options */
2158 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2167 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2168 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2169 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2173 /* Cheating Options */
2176 if (!p_ptr->noscore && !allow_debug_opts)
2178 /* Cheat options are not permitted */
2184 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2191 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2200 do_cmd_options_win();
2201 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2202 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2203 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2204 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2209 /* Auto-picker/destroyer editor */
2213 do_cmd_edit_autopick();
2217 /* Hack -- Delay Speed */
2223 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2225 /* Get a new value */
2228 int msec = delay_factor * delay_factor * delay_factor;
2229 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2230 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2232 if (k == ESCAPE) break;
2235 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2238 else if (isdigit(k)) delay_factor = D2I(k);
2245 /* Hack -- hitpoint warning factor */
2251 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2253 /* Get a new value */
2256 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2257 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2259 if (k == ESCAPE) break;
2262 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2265 else if (isdigit(k)) hitpoint_warn = D2I(k);
2272 /* Hack -- mana color factor */
2278 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2280 /* Get a new value */
2283 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2284 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2286 if (k == ESCAPE) break;
2289 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2292 else if (isdigit(k)) mana_warn = D2I(k);
2300 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2304 /* Unknown option */
2312 /* Flush messages */
2317 /* Restore the screen */
2320 /* Hack - Redraw equippy chars */
2321 p_ptr->redraw |= (PR_EQUIPPY);
2327 * @brief prefファイルを選択して処理する /
2328 * Ask for a "user pref line" and process it
2331 * Allow absolute file names?
2333 void do_cmd_pref(void)
2340 /* Ask for a "user pref command" */
2341 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2343 /* Process that pref command */
2344 (void)process_pref_file_command(buf);
2348 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2351 void do_cmd_reload_autopick(void)
2353 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2354 /* Load the file with messages */
2355 autopick_load_pref(TRUE);
2361 * @brief マクロ情報をprefファイルに保存する /
2362 * @param fname ファイル名
2365 static errr macro_dump(cptr fname)
2367 static cptr mark = "Macro Dump";
2373 /* Build the filename */
2374 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2376 /* File type is "TEXT" */
2377 FILE_TYPE(FILE_TYPE_TEXT);
2379 /* Append to the file */
2380 if (!open_auto_dump(buf, mark)) return (-1);
2383 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2386 for (i = 0; i < macro__num; i++)
2388 /* Extract the action */
2389 ascii_to_text(buf, macro__act[i]);
2391 /* Dump the macro */
2392 auto_dump_printf("A:%s\n", buf);
2394 /* Extract the action */
2395 ascii_to_text(buf, macro__pat[i]);
2397 /* Dump normal macros */
2398 auto_dump_printf("P:%s\n", buf);
2401 auto_dump_printf("\n");
2413 * @brief マクロのトリガーキーを取得する /
2414 * Hack -- ask for a "trigger" (see below)
2415 * @param buf キー表記を保管するバッファ
2419 * Note the complex use of the "inkey()" function from "util.c".
2421 * Note that both "flush()" calls are extremely important.
2424 static void do_cmd_macro_aux(char *buf)
2433 /* Do not process macros */
2439 /* Read the pattern */
2445 /* Do not process macros */
2448 /* Do not wait for keys */
2451 /* Attempt to read a key */
2462 /* Convert the trigger */
2463 ascii_to_text(tmp, buf);
2465 /* Hack -- display the trigger */
2466 Term_addstr(-1, TERM_WHITE, tmp);
2472 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2473 * Hack -- ask for a keymap "trigger" (see below)
2474 * @param buf キー表記を取得するバッファ
2478 * Note that both "flush()" calls are extremely important. This may
2479 * no longer be true, since "util.c" is much simpler now.
2482 static void do_cmd_macro_aux_keymap(char *buf)
2496 /* Convert to ascii */
2497 ascii_to_text(tmp, buf);
2499 /* Hack -- display the trigger */
2500 Term_addstr(-1, TERM_WHITE, tmp);
2509 * @brief キーマップをprefファイルにダンプする /
2510 * Hack -- append all keymaps to the given file
2511 * @param fname ファイルネーム
2515 static errr keymap_dump(cptr fname)
2517 static cptr mark = "Keymap Dump";
2526 if (rogue_like_commands)
2528 mode = KEYMAP_MODE_ROGUE;
2534 mode = KEYMAP_MODE_ORIG;
2538 /* Build the filename */
2539 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2541 /* File type is "TEXT" */
2542 FILE_TYPE(FILE_TYPE_TEXT);
2544 /* Append to the file */
2545 if (!open_auto_dump(buf, mark)) return -1;
2548 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2551 for (i = 0; i < 256; i++)
2555 /* Loop up the keymap */
2556 act = keymap_act[mode][i];
2558 /* Skip empty keymaps */
2561 /* Encode the key */
2564 ascii_to_text(key, buf);
2566 /* Encode the action */
2567 ascii_to_text(buf, act);
2569 /* Dump the macro */
2570 auto_dump_printf("A:%s\n", buf);
2571 auto_dump_printf("C:%d:%s\n", mode, key);
2583 * @brief マクロを設定するコマンドのメインルーチン /
2584 * Interact with "macros"
2588 * Note that the macro "action" must be defined before the trigger.
2590 * Could use some helpful instructions on this page.
2593 void do_cmd_macros(void)
2605 if (rogue_like_commands)
2607 mode = KEYMAP_MODE_ROGUE;
2613 mode = KEYMAP_MODE_ORIG;
2616 /* File type is "TEXT" */
2617 FILE_TYPE(FILE_TYPE_TEXT);
2624 /* Process requests until done */
2631 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2633 /* Describe that action */
2634 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2636 /* Analyze the current action */
2637 ascii_to_text(buf, macro__buf);
2639 /* Display the current action */
2644 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2646 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2647 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2648 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2649 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2650 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2651 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2652 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2653 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2654 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2655 #endif /* ALLOW_MACROS */
2658 prt(_("コマンド: ", "Command: "), 16, 0);
2664 if (i == ESCAPE) break;
2666 /* Load a 'macro' file */
2672 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2675 prt(_("ファイル: ", "File: "), 18, 0);
2677 /* Default filename */
2678 sprintf(tmp, "%s.prf", player_base);
2680 /* Ask for a file */
2681 if (!askfor(tmp, 80)) continue;
2683 /* Process the given filename */
2684 err = process_pref_file(tmp);
2687 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2692 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2696 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2706 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2709 prt(_("ファイル: ", "File: "), 18, 0);
2711 /* Default filename */
2712 sprintf(tmp, "%s.prf", player_base);
2714 /* Ask for a file */
2715 if (!askfor(tmp, 80)) continue;
2717 /* Dump the macros */
2718 (void)macro_dump(tmp);
2721 msg_print(_("マクロを追加しました。", "Appended macros."));
2730 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2734 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2736 /* Get a macro trigger */
2737 do_cmd_macro_aux(buf);
2739 /* Acquire action */
2740 k = macro_find_exact(buf);
2746 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2752 /* Obtain the action */
2753 strcpy(macro__buf, macro__act[k]);
2755 /* Analyze the current action */
2756 ascii_to_text(buf, macro__buf);
2758 /* Display the current action */
2762 msg_print(_("マクロを確認しました。", "Found a macro."));
2766 /* Create a macro */
2770 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2773 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2775 /* Get a macro trigger */
2776 do_cmd_macro_aux(buf);
2782 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2783 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2786 prt(_("マクロ行動: ", "Action: "), 20, 0);
2788 /* Convert to text */
2789 ascii_to_text(tmp, macro__buf);
2791 /* Get an encoded action */
2792 if (askfor(tmp, 80))
2794 /* Convert to ascii */
2795 text_to_ascii(macro__buf, tmp);
2797 /* Link the macro */
2798 macro_add(buf, macro__buf);
2801 msg_print(_("マクロを追加しました。", "Added a macro."));
2805 /* Remove a macro */
2809 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2812 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2814 /* Get a macro trigger */
2815 do_cmd_macro_aux(buf);
2817 /* Link the macro */
2818 macro_add(buf, buf);
2821 msg_print(_("マクロを削除しました。", "Removed a macro."));
2828 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2831 prt(_("ファイル: ", "File: "), 18, 0);
2833 /* Default filename */
2834 sprintf(tmp, "%s.prf", player_base);
2836 /* Ask for a file */
2837 if (!askfor(tmp, 80)) continue;
2839 /* Dump the macros */
2840 (void)keymap_dump(tmp);
2843 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2846 /* Query a keymap */
2852 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2855 prt(_("押すキー: ", "Keypress: "), 18, 0);
2857 /* Get a keymap trigger */
2858 do_cmd_macro_aux_keymap(buf);
2860 /* Look up the keymap */
2861 act = keymap_act[mode][(byte)(buf[0])];
2867 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2873 /* Obtain the action */
2874 strcpy(macro__buf, act);
2876 /* Analyze the current action */
2877 ascii_to_text(buf, macro__buf);
2879 /* Display the current action */
2883 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2887 /* Create a keymap */
2891 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2894 prt(_("押すキー: ", "Keypress: "), 18, 0);
2896 /* Get a keymap trigger */
2897 do_cmd_macro_aux_keymap(buf);
2903 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2904 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2907 prt(_("行動: ", "Action: "), 20, 0);
2909 /* Convert to text */
2910 ascii_to_text(tmp, macro__buf);
2912 /* Get an encoded action */
2913 if (askfor(tmp, 80))
2915 /* Convert to ascii */
2916 text_to_ascii(macro__buf, tmp);
2918 /* Free old keymap */
2919 string_free(keymap_act[mode][(byte)(buf[0])]);
2921 /* Make new keymap */
2922 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2925 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2929 /* Remove a keymap */
2933 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
2936 prt(_("押すキー: ", "Keypress: "), 18, 0);
2938 /* Get a keymap trigger */
2939 do_cmd_macro_aux_keymap(buf);
2941 /* Free old keymap */
2942 string_free(keymap_act[mode][(byte)(buf[0])]);
2944 /* Make new keymap */
2945 keymap_act[mode][(byte)(buf[0])] = NULL;
2948 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
2951 /* Enter a new action */
2955 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
2961 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2962 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2965 prt(_("マクロ行動: ", "Action: "), 20, 0);
2967 /* Hack -- limit the value */
2970 /* Get an encoded action */
2971 if (!askfor(buf, 80)) continue;
2973 /* Extract an action */
2974 text_to_ascii(macro__buf, buf);
2977 #endif /* ALLOW_MACROS */
2984 /* Flush messages */
2993 * @brief キャラクタ色の明暗表現
2995 static cptr lighting_level_str[F_LIT_MAX] =
3010 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
3011 * @param i 指定対象となるキャラクタコード
3012 * @param num 指定されたビジュアルIDを返す参照ポインタ
3013 * @param max ビジュアルIDの最大数
3014 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
3016 static bool cmd_visuals_aux(int i, IDX *num, IDX max)
3023 sprintf(str, "%d", *num);
3025 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3028 tmp = (IDX)strtol(str, NULL, 0);
3029 if (tmp >= 0 && tmp < max)
3032 else if (isupper(i))
3033 *num = (*num + max - 1) % max;
3035 *num = (*num + 1) % max;
3041 * @brief キャラクタの変更メニュー表示
3042 * @param choice_msg 選択メッセージ
3045 static void print_visuals_menu(cptr choice_msg)
3047 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3049 /* Give some choices */
3050 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3052 #ifdef ALLOW_VISUALS
3053 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3054 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3055 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3056 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3057 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3058 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3059 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3060 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3061 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3062 #endif /* ALLOW_VISUALS */
3064 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3067 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3070 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx);
3071 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx);
3072 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level);
3075 * Interact with "visuals"
3077 void do_cmd_visuals(void)
3082 bool need_redraw = FALSE;
3083 const char *empty_symbol = "<< ? >>";
3085 if (use_bigtile) empty_symbol = "<< ?? >>";
3087 /* File type is "TEXT" */
3088 FILE_TYPE(FILE_TYPE_TEXT);
3090 /* Save the screen */
3093 /* Interact until done */
3099 /* Ask for a choice */
3100 print_visuals_menu(NULL);
3105 if (i == ESCAPE) break;
3109 /* Load a 'pref' file */
3112 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3115 prt(_("ファイル: ", "File: "), 17, 0);
3117 /* Default filename */
3118 sprintf(tmp, "%s.prf", player_base);
3121 if (!askfor(tmp, 70)) continue;
3123 /* Process the given filename */
3124 (void)process_pref_file(tmp);
3129 #ifdef ALLOW_VISUALS
3131 /* Dump monster attr/chars */
3134 static cptr mark = "Monster attr/chars";
3137 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3140 prt(_("ファイル: ", "File: "), 17, 0);
3142 /* Default filename */
3143 sprintf(tmp, "%s.prf", player_base);
3145 /* Get a filename */
3146 if (!askfor(tmp, 70)) continue;
3148 /* Build the filename */
3149 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3151 /* Append to the file */
3152 if (!open_auto_dump(buf, mark)) continue;
3155 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3158 for (i = 0; i < max_r_idx; i++)
3160 monster_race *r_ptr = &r_info[i];
3162 /* Skip non-entries */
3163 if (!r_ptr->name) continue;
3165 /* Dump a comment */
3166 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3168 /* Dump the monster attr/char info */
3169 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3170 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3176 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3181 /* Dump object attr/chars */
3184 static cptr mark = "Object attr/chars";
3185 KIND_OBJECT_IDX k_idx;
3188 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3191 prt(_("ファイル: ", "File: "), 17, 0);
3193 /* Default filename */
3194 sprintf(tmp, "%s.prf", player_base);
3196 /* Get a filename */
3197 if (!askfor(tmp, 70)) continue;
3199 /* Build the filename */
3200 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3202 /* Append to the file */
3203 if (!open_auto_dump(buf, mark)) continue;
3206 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3209 for (k_idx = 0; k_idx < max_k_idx; k_idx++)
3212 object_kind *k_ptr = &k_info[k_idx];
3214 /* Skip non-entries */
3215 if (!k_ptr->name) continue;
3220 strip_name(o_name, k_idx);
3226 /* Prepare dummy object */
3227 object_prep(&forge, k_idx);
3229 /* Get un-shuffled flavor name */
3230 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3233 /* Dump a comment */
3234 auto_dump_printf("# %s\n", o_name);
3236 /* Dump the object attr/char info */
3237 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", (int)k_idx,
3238 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3244 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3249 /* Dump feature attr/chars */
3252 static cptr mark = "Feature attr/chars";
3255 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3258 prt(_("ファイル: ", "File: "), 17, 0);
3260 /* Default filename */
3261 sprintf(tmp, "%s.prf", player_base);
3263 /* Get a filename */
3264 if (!askfor(tmp, 70)) continue;
3266 /* Build the filename */
3267 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3269 /* Append to the file */
3270 if (!open_auto_dump(buf, mark)) continue;
3273 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3276 for (i = 0; i < max_f_idx; i++)
3278 feature_type *f_ptr = &f_info[i];
3280 /* Skip non-entries */
3281 if (!f_ptr->name) continue;
3283 /* Skip mimiccing features */
3284 if (f_ptr->mimic != i) continue;
3286 /* Dump a comment */
3287 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3289 /* Dump the feature attr/char info */
3290 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3291 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3292 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3293 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3299 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3304 /* Modify monster attr/chars (numeric operation) */
3307 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3310 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3312 /* Hack -- query until done */
3315 monster_race *r_ptr = &r_info[r];
3319 TERM_COLOR da = r_ptr->d_attr;
3320 byte dc = r_ptr->d_char;
3321 TERM_COLOR ca = r_ptr->x_attr;
3322 byte cc = r_ptr->x_char;
3324 /* Label the object */
3325 Term_putstr(5, 17, -1, TERM_WHITE,
3326 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3328 /* Label the Default values */
3329 Term_putstr(10, 19, -1, TERM_WHITE,
3330 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3332 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3333 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3335 /* Label the Current values */
3336 Term_putstr(10, 20, -1, TERM_WHITE,
3337 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3339 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3340 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3343 Term_putstr(0, 22, -1, TERM_WHITE,
3344 _("コマンド (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): "));
3350 if (i == ESCAPE) break;
3352 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3353 else if (isupper(i)) c = 'a' + i - 'A';
3363 if (!cmd_visuals_aux(i, &r, max_r_idx))
3369 while (!r_info[r].name);
3373 t = (int)r_ptr->x_attr;
3374 (void)cmd_visuals_aux(i, &t, 256);
3375 r_ptr->x_attr = (byte)t;
3379 t = (int)r_ptr->x_char;
3380 (void)cmd_visuals_aux(i, &t, 256);
3381 r_ptr->x_char = (byte)t;
3385 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3389 print_visuals_menu(choice_msg);
3397 /* Modify object attr/chars (numeric operation) */
3400 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3402 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3404 /* Hack -- query until done */
3407 object_kind *k_ptr = &k_info[k];
3411 TERM_COLOR da = k_ptr->d_attr;
3412 SYMBOL_CODE dc = k_ptr->d_char;
3413 TERM_COLOR ca = k_ptr->x_attr;
3414 SYMBOL_CODE cc = k_ptr->x_char;
3416 /* Label the object */
3417 Term_putstr(5, 17, -1, TERM_WHITE,
3418 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3419 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3421 /* Label the Default values */
3422 Term_putstr(10, 19, -1, TERM_WHITE,
3423 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3425 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3426 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3428 /* Label the Current values */
3429 Term_putstr(10, 20, -1, TERM_WHITE,
3430 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3432 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3433 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3436 Term_putstr(0, 22, -1, TERM_WHITE,
3437 _("コマンド (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): "));
3443 if (i == ESCAPE) break;
3445 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3446 else if (isupper(i)) c = 'a' + i - 'A';
3456 if (!cmd_visuals_aux(i, &k, max_k_idx))
3462 while (!k_info[k].name);
3466 t = (int)k_ptr->x_attr;
3467 (void)cmd_visuals_aux(i, &t, 256);
3468 k_ptr->x_attr = (byte)t;
3472 t = (int)k_ptr->x_char;
3473 (void)cmd_visuals_aux(i, &t, 256);
3474 k_ptr->x_char = (byte)t;
3478 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3482 print_visuals_menu(choice_msg);
3490 /* Modify feature attr/chars (numeric operation) */
3493 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3495 static IDX lighting_level = F_LIT_STANDARD;
3496 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3498 /* Hack -- query until done */
3501 feature_type *f_ptr = &f_info[f];
3505 TERM_COLOR da = f_ptr->d_attr[lighting_level];
3506 byte dc = f_ptr->d_char[lighting_level];
3507 TERM_COLOR ca = f_ptr->x_attr[lighting_level];
3508 byte cc = f_ptr->x_char[lighting_level];
3510 /* Label the object */
3512 Term_putstr(5, 17, -1, TERM_WHITE,
3513 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3514 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3516 /* Label the Default values */
3517 Term_putstr(10, 19, -1, TERM_WHITE,
3518 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3520 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3521 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3523 /* Label the Current values */
3525 Term_putstr(10, 20, -1, TERM_WHITE,
3526 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3528 Term_putstr(10, 20, -1, TERM_WHITE,
3529 format("Current attr/char = %3d / %3d", ca, cc));
3532 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3533 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3537 Term_putstr(0, 22, -1, TERM_WHITE,
3538 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3540 Term_putstr(0, 22, -1, TERM_WHITE,
3541 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3548 if (i == ESCAPE) break;
3550 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3551 else if (isupper(i)) c = 'a' + i - 'A';
3561 if (!cmd_visuals_aux(i, &f, max_f_idx))
3567 while (!f_info[f].name || (f_info[f].mimic != f));
3571 t = (int)f_ptr->x_attr[lighting_level];
3572 (void)cmd_visuals_aux(i, &t, 256);
3573 f_ptr->x_attr[lighting_level] = (byte)t;
3577 t = (int)f_ptr->x_char[lighting_level];
3578 (void)cmd_visuals_aux(i, &t, 256);
3579 f_ptr->x_char[lighting_level] = (byte)t;
3583 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3586 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3590 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3594 print_visuals_menu(choice_msg);
3602 /* Modify monster attr/chars (visual mode) */
3604 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3607 /* Modify object attr/chars (visual mode) */
3609 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3612 /* Modify feature attr/chars (visual mode) */
3615 IDX lighting_level = F_LIT_STANDARD;
3616 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3620 #endif /* ALLOW_VISUALS */
3628 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3632 /* Unknown option */
3638 /* Flush messages */
3642 /* Restore the screen */
3645 if (need_redraw) do_cmd_redraw();
3650 * Interact with "colors"
3652 void do_cmd_colors(void)
3661 /* File type is "TEXT" */
3662 FILE_TYPE(FILE_TYPE_TEXT);
3665 /* Save the screen */
3669 /* Interact until done */
3675 /* Ask for a choice */
3676 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3678 /* Give some choices */
3679 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3682 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3683 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3687 prt(_("コマンド: ", "Command: "), 8, 0);
3691 if (i == ESCAPE) break;
3693 /* Load a 'pref' file */
3697 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3700 prt(_("ファイル: ", "File: "), 10, 0);
3703 sprintf(tmp, "%s.prf", player_base);
3706 if (!askfor(tmp, 70)) continue;
3708 /* Process the given filename */
3709 (void)process_pref_file(tmp);
3711 /* Mega-Hack -- react to changes */
3712 Term_xtra(TERM_XTRA_REACT, 0);
3714 /* Mega-Hack -- redraw */
3723 static cptr mark = "Colors";
3726 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3729 prt(_("ファイル: ", "File: "), 10, 0);
3731 /* Default filename */
3732 sprintf(tmp, "%s.prf", player_base);
3734 /* Get a filename */
3735 if (!askfor(tmp, 70)) continue;
3737 /* Build the filename */
3738 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3740 /* Append to the file */
3741 if (!open_auto_dump(buf, mark)) continue;
3744 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3747 for (i = 0; i < 256; i++)
3749 int kv = angband_color_table[i][0];
3750 int rv = angband_color_table[i][1];
3751 int gv = angband_color_table[i][2];
3752 int bv = angband_color_table[i][3];
3754 cptr name = _("未知", "unknown");
3756 /* Skip non-entries */
3757 if (!kv && !rv && !gv && !bv) continue;
3759 /* Extract the color name */
3760 if (i < 16) name = color_names[i];
3762 /* Dump a comment */
3763 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3765 /* Dump the monster attr/char info */
3766 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3773 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3782 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3784 /* Hack -- query until done */
3793 /* Exhibit the normal colors */
3794 for (j = 0; j < 16; j++)
3796 /* Exhibit this color */
3797 Term_putstr(j*4, 20, -1, a, "###");
3799 /* Exhibit all colors */
3800 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3803 /* Describe the color */
3804 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3806 /* Describe the color */
3807 Term_putstr(5, 10, -1, TERM_WHITE,
3808 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3810 /* Label the Current values */
3811 Term_putstr(5, 12, -1, TERM_WHITE,
3812 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3813 angband_color_table[a][0],
3814 angband_color_table[a][1],
3815 angband_color_table[a][2],
3816 angband_color_table[a][3]));
3819 Term_putstr(0, 14, -1, TERM_WHITE,
3820 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3827 if (i == ESCAPE) break;
3830 if (i == 'n') a = (byte)(a + 1);
3831 if (i == 'N') a = (byte)(a - 1);
3832 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3833 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3834 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3835 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3836 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3837 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3838 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3839 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3841 /* Hack -- react to changes */
3842 Term_xtra(TERM_XTRA_REACT, 0);
3844 /* Hack -- redraw */
3851 /* Unknown option */
3857 /* Flush messages */
3862 /* Restore the screen */
3868 * Note something in the message recall
3870 void do_cmd_note(void)
3878 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3880 /* Ignore empty notes */
3881 if (!buf[0] || (buf[0] == ' ')) return;
3883 /* Add the note to the message recall */
3884 msg_format(_("メモ: %s", "Note: %s"), buf);
3889 * Mention the current version
3891 void do_cmd_version(void)
3895 #if FAKE_VER_EXTRA > 0
3896 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3897 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3899 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3900 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3907 * Array of feeling strings
3909 static cptr do_cmd_feeling_text[11] =
3911 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3912 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3913 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3914 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3915 _("とても悪い予感がする...", "You have a very bad feeling..."),
3916 _("悪い予感がする...", "You have a bad feeling..."),
3917 _("何か緊張する。", "You feel nervous."),
3918 _("少し不運な気がする...", "You feel your luck is turning..."),
3919 _("この場所は好きになれない。", "You don't like the look of this place."),
3920 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3921 _("なんて退屈なところだ...", "What a boring place...")
3924 static cptr do_cmd_feeling_text_combat[11] =
3926 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3927 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3928 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
3929 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3930 _("とても悪い予感がする...", "You have a very bad feeling..."),
3931 _("悪い予感がする...", "You have a bad feeling..."),
3932 _("何か緊張する。", "You feel nervous."),
3933 _("少し不運な気がする...", "You feel your luck is turning..."),
3934 _("この場所は好きになれない。", "You don't like the look of this place."),
3935 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3936 _("なんて退屈なところだ...", "What a boring place...")
3939 static cptr do_cmd_feeling_text_lucky[11] =
3941 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3942 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3943 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
3944 _("素晴らしい感じがする...", "You have an excellent feeling..."),
3945 _("とても良い感じがする...", "You have a very good feeling..."),
3946 _("良い感じがする...", "You have a good feeling..."),
3947 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
3948 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
3949 _("見た感じ悪くはない...", "You like the look of this place..."),
3950 _("全然駄目ということはないが...", "This level can't be all bad..."),
3951 _("なんて退屈なところだ...", "What a boring place...")
3956 * Note that "feeling" is set to zero unless some time has passed.
3957 * Note that this is done when the level is GENERATED, not entered.
3959 void do_cmd_feeling(void)
3961 /* No useful feeling in quests */
3962 if (p_ptr->inside_quest && !random_quest_number(dun_level))
3964 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
3968 /* No useful feeling in town */
3969 else if (p_ptr->town_num && !dun_level)
3971 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
3973 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
3978 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
3983 /* No useful feeling in the wilderness */
3984 else if (!dun_level)
3986 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
3990 /* Display the feeling */
3991 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
3992 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
3993 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
3994 inventory[INVEN_BOW].name1 == ART_CRIMSON)
3995 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
3997 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4003 * Description of each monster group.
4005 static cptr monster_group_text[] =
4008 "ユニーク", /* "Uniques" */
4009 "乗馬可能なモンスター", /* "Riding" */
4010 "賞金首", /* "Wanted */
4011 "アンバーの王族", /* "Ambertite" */
4040 /* "古代ドラゴン/ワイアーム", */
4101 /* "Ancient Dragon/Wyrm", */
4110 "Multi-Headed Reptile",
4115 "Reptile/Amphibian",
4116 "Spider/Scorpion/Tick",
4118 /* "Major Demon", */
4135 * Symbols of monsters in each group. Note the "Uniques" group
4136 * is handled differently.
4138 static cptr monster_group_char[] =
4195 "!$&()+./=>?[\\]`{|~",
4205 * hook function to sort monsters by level
4207 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4209 u16b *who = (u16b*)(u);
4214 monster_race *r_ptr1 = &r_info[w1];
4215 monster_race *r_ptr2 = &r_info[w2];
4220 if (r_ptr2->level > r_ptr1->level) return TRUE;
4221 if (r_ptr1->level > r_ptr2->level) return FALSE;
4223 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4224 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4229 * Build a list of monster indexes in the given group. Return the number
4230 * of monsters in the group.
4232 * mode & 0x01 : check for non-empty group
4233 * mode & 0x02 : visual operation only
4235 static IDX collect_monsters(IDX grp_cur, IDX mon_idx[], BIT_FLAGS8 mode)
4241 /* Get a list of x_char in this group */
4242 cptr group_char = monster_group_char[grp_cur];
4244 /* XXX Hack -- Check if this is the "Uniques" group */
4245 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4247 /* XXX Hack -- Check if this is the "Riding" group */
4248 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4250 /* XXX Hack -- Check if this is the "Wanted" group */
4251 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4253 /* XXX Hack -- Check if this is the "Amberite" group */
4254 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4257 /* Check every race */
4258 for (i = 0; i < max_r_idx; i++)
4260 /* Access the race */
4261 monster_race *r_ptr = &r_info[i];
4263 /* Skip empty race */
4264 if (!r_ptr->name) continue ;
4266 /* Require known monsters */
4267 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4271 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4274 else if (grp_riding)
4276 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4279 else if (grp_wanted)
4281 bool wanted = FALSE;
4283 for (j = 0; j < MAX_KUBI; j++)
4285 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4286 (p_ptr->today_mon && p_ptr->today_mon == i))
4292 if (!wanted) continue;
4295 else if (grp_amberite)
4297 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4302 /* Check for race in the group */
4303 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4307 mon_idx[mon_cnt++] = i;
4309 /* XXX Hack -- Just checking for non-empty group */
4310 if (mode & 0x01) break;
4313 /* Terminate the list */
4314 mon_idx[mon_cnt] = -1;
4316 /* Select the sort method */
4317 ang_sort_comp = ang_sort_comp_monster_level;
4318 ang_sort_swap = ang_sort_swap_hook;
4320 /* Sort by monster level */
4321 ang_sort(mon_idx, &dummy_why, mon_cnt);
4323 /* Return the number of races */
4329 * Description of each monster group.
4331 static cptr object_group_text[] =
4334 "キノコ", /* "Mushrooms" */
4335 "薬", /* "Potions" */
4336 "油つぼ", /* "Flasks" */
4337 "巻物", /* "Scrolls" */
4339 "アミュレット", /* "Amulets" */
4340 "笛", /* "Whistle" */
4341 "光源", /* "Lanterns" */
4342 "魔法棒", /* "Wands" */
4345 "カード", /* "Cards" */
4356 "刀剣類", /* "Swords" */
4357 "鈍器", /* "Blunt Weapons" */
4358 "長柄武器", /* "Polearms" */
4359 "採掘道具", /* "Diggers" */
4360 "飛び道具", /* "Bows" */
4364 "軽装鎧", /* "Soft Armor" */
4365 "重装鎧", /* "Hard Armor" */
4366 "ドラゴン鎧", /* "Dragon Armor" */
4367 "盾", /* "Shields" */
4368 "クローク", /* "Cloaks" */
4369 "籠手", /* "Gloves" */
4370 "ヘルメット", /* "Helms" */
4372 "ブーツ", /* "Boots" */
4425 * TVALs of items in each group
4427 static byte object_group_tval[] =
4468 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4476 * Build a list of object indexes in the given group. Return the number
4477 * of objects in the group.
4479 * mode & 0x01 : check for non-empty group
4480 * mode & 0x02 : visual operation only
4482 static int collect_objects(int grp_cur, IDX object_idx[], BIT_FLAGS8 mode)
4485 int j, k, object_cnt = 0;
4487 /* Get a list of x_char in this group */
4488 byte group_tval = object_group_tval[grp_cur];
4490 /* Check every object */
4491 for (i = 0; i < max_k_idx; i++)
4493 /* Access the object */
4494 object_kind *k_ptr = &k_info[i];
4496 /* Skip empty objects */
4497 if (!k_ptr->name) continue;
4501 /* Any objects will be displayed */
4507 /* Skip non-flavoured objects */
4508 if (!k_ptr->flavor) continue;
4510 /* Require objects ever seen */
4511 if (!k_ptr->aware) continue;
4514 /* Skip items with no distribution (special artifacts) */
4515 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4519 /* Check for objects in the group */
4520 if (TV_LIFE_BOOK == group_tval)
4522 /* Hack -- All spell books */
4523 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4525 /* Add the object */
4526 object_idx[object_cnt++] = i;
4530 else if (k_ptr->tval == group_tval)
4532 /* Add the object */
4533 object_idx[object_cnt++] = i;
4537 /* XXX Hack -- Just checking for non-empty group */
4538 if (mode & 0x01) break;
4541 /* Terminate the list */
4542 object_idx[object_cnt] = -1;
4544 /* Return the number of objects */
4550 * Description of each feature group.
4552 static cptr feature_group_text[] =
4560 * Build a list of feature indexes in the given group. Return the number
4561 * of features in the group.
4563 * mode & 0x01 : check for non-empty group
4565 static int collect_features(int grp_cur, IDX *feat_idx, BIT_FLAGS8 mode)
4570 /* Unused; There is a single group. */
4573 /* Check every feature */
4574 for (i = 0; i < max_f_idx; i++)
4576 /* Access the index */
4577 feature_type *f_ptr = &f_info[i];
4579 /* Skip empty index */
4580 if (!f_ptr->name) continue;
4582 /* Skip mimiccing features */
4583 if (f_ptr->mimic != i) continue;
4586 feat_idx[feat_cnt++] = i;
4588 /* XXX Hack -- Just checking for non-empty group */
4589 if (mode & 0x01) break;
4592 /* Terminate the list */
4593 feat_idx[feat_cnt] = -1;
4595 /* Return the number of races */
4602 * Build a list of monster indexes in the given group. Return the number
4603 * of monsters in the group.
4605 static int collect_artifacts(int grp_cur, int object_idx[])
4607 int i, object_cnt = 0;
4609 /* Get a list of x_char in this group */
4610 byte group_tval = object_group_tval[grp_cur];
4612 /* Check every object */
4613 for (i = 0; i < max_a_idx; i++)
4615 /* Access the artifact */
4616 artifact_type *a_ptr = &a_info[i];
4618 /* Skip empty artifacts */
4619 if (!a_ptr->name) continue;
4621 /* Skip "uncreated" artifacts */
4622 if (!a_ptr->cur_num) continue;
4624 /* Check for race in the group */
4625 if (a_ptr->tval == group_tval)
4628 object_idx[object_cnt++] = i;
4632 /* Terminate the list */
4633 object_idx[object_cnt] = 0;
4635 /* Return the number of races */
4642 * Encode the screen colors
4644 static char hack[17] = "dwsorgbuDWvyRGBU";
4648 * Hack -- load a screen dump from a file
4650 void do_cmd_load_screen(void)
4665 Term_get_size(&wid, &hgt);
4667 /* Build the filename */
4668 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4670 /* Append to the file */
4671 fff = my_fopen(buf, "r");
4674 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4680 /* Save the screen */
4683 /* Clear the screen */
4687 /* Load the screen */
4688 for (y = 0; okay; y++)
4690 /* Get a line of data including control code */
4691 if (!fgets(buf, 1024, fff)) okay = FALSE;
4693 /* Get the blank line */
4694 if (buf[0] == '\n' || buf[0] == '\0') break;
4696 /* Ignore too large screen image */
4697 if (y >= hgt) continue;
4700 for (x = 0; x < wid - 1; x++)
4703 if (buf[x] == '\n' || buf[x] == '\0') break;
4705 /* Put the attr/char */
4706 Term_draw(x, y, TERM_WHITE, buf[x]);
4710 /* Dump the screen */
4711 for (y = 0; okay; y++)
4713 /* Get a line of data including control code */
4714 if (!fgets(buf, 1024, fff)) okay = FALSE;
4716 /* Get the blank line */
4717 if (buf[0] == '\n' || buf[0] == '\0') break;
4719 /* Ignore too large screen image */
4720 if (y >= hgt) continue;
4723 for (x = 0; x < wid - 1; x++)
4726 if (buf[x] == '\n' || buf[x] == '\0') break;
4728 /* Get the attr/char */
4729 (void)(Term_what(x, y, &a, &c));
4731 /* Look up the attr */
4732 for (i = 0; i < 16; i++)
4734 /* Use attr matches */
4735 if (hack[i] == buf[x]) a = (byte_hack)i;
4738 /* Put the attr/char */
4739 Term_draw(x, y, a, c);
4748 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4754 /* Restore the screen */
4761 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4762 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4765 #define IM_FLAG_STR _("*", "* ")
4766 #define HAS_FLAG_STR _("+", "+ ")
4767 #define NO_FLAG_STR _("・", ". ")
4769 #define print_im_or_res_flag(IM, RES) \
4771 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4772 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4775 #define print_flag(TR) \
4777 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4781 /* XTRA HACK RESLIST */
4782 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, OBJECT_TYPE_VALUE tval, char *where)
4784 char o_name[MAX_NLEN];
4785 BIT_FLAGS flgs[TR_FLAG_SIZE];
4787 if (!o_ptr->k_idx) return;
4788 if (o_ptr->tval != tval) return;
4790 /* Identified items only */
4791 if (!object_is_known(o_ptr)) return;
4794 * HACK:Ring of Lordly protection and Dragon equipment
4795 * have random resistances.
4797 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4798 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4799 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4800 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4801 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4802 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4803 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4804 || object_is_artifact(o_ptr))
4807 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4809 while (o_name[i] && (i < 26))
4812 if (iskanji(o_name[i])) i++;
4821 o_name[i] = ' '; i++;
4826 fprintf(fff, "%s %s", where, o_name);
4828 if (!(o_ptr->ident & (IDENT_MENTAL)))
4830 fputs(_("-------不明--------------- -------不明---------\n",
4831 "-------unknown------------ -------unknown------\n"), fff);
4835 object_flags_known(o_ptr, flgs);
4837 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4838 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4839 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4840 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4841 print_flag(TR_RES_POIS);
4842 print_flag(TR_RES_LITE);
4843 print_flag(TR_RES_DARK);
4844 print_flag(TR_RES_SHARDS);
4845 print_flag(TR_RES_SOUND);
4846 print_flag(TR_RES_NETHER);
4847 print_flag(TR_RES_NEXUS);
4848 print_flag(TR_RES_CHAOS);
4849 print_flag(TR_RES_DISEN);
4853 print_flag(TR_RES_BLIND);
4854 print_flag(TR_RES_FEAR);
4855 print_flag(TR_RES_CONF);
4856 print_flag(TR_FREE_ACT);
4857 print_flag(TR_SEE_INVIS);
4858 print_flag(TR_HOLD_EXP);
4859 print_flag(TR_TELEPATHY);
4860 print_flag(TR_SLOW_DIGEST);
4861 print_flag(TR_REGEN);
4862 print_flag(TR_LEVITATION);
4870 fprintf(fff, "%s\n", inven_res_label);
4876 * Display *ID* ed weapons/armors's resistances
4878 static void do_cmd_knowledge_inven(void)
4882 char file_name[1024];
4886 OBJECT_TYPE_VALUE tval;
4892 /* Open a new file */
4893 fff = my_fopen_temp(file_name, 1024);
4896 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4900 fprintf(fff, "%s\n", inven_res_label);
4902 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4906 for (; j < 9; j++) fputc('\n', fff);
4908 fprintf(fff, "%s\n", inven_res_label);
4910 strcpy(where, _("装", "E "));
4911 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4913 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4915 strcpy(where, _("持", "I "));
4916 for (i = 0; i < INVEN_PACK; i++)
4918 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4921 st_ptr = &town[1].store[STORE_HOME];
4922 strcpy(where, _("家", "H "));
4923 for (i = 0; i < st_ptr->stock_num; i++)
4925 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
4929 /* Close the file */
4932 /* Display the file contents */
4933 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
4935 /* Remove the file */
4940 void do_cmd_save_screen_html_aux(char *filename, int message)
4944 TERM_COLOR a = 0, old_a = 0;
4958 cptr html_head[] = {
4959 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
4963 cptr html_foot[] = {
4965 "</body>\n</html>\n",
4971 Term_get_size(&wid, &hgt);
4973 /* File type is "TEXT" */
4974 FILE_TYPE(FILE_TYPE_TEXT);
4976 /* Append to the file */
4977 fff = my_fopen(filename, "w");
4981 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
4988 /* Save the screen */
4992 /* Build the filename */
4993 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
4994 tmpfff = my_fopen(buf, "r");
4996 for (i = 0; html_head[i]; i++)
4997 fputs(html_head[i], fff);
5001 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5003 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5007 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5009 fprintf(fff, "%s\n", buf);
5014 /* Dump the screen */
5015 for (y = 0; y < hgt; y++)
5022 for (x = 0; x < wid - 1; x++)
5026 /* Get the attr/char */
5027 (void)(Term_what(x, y, &a, &c));
5031 case '&': cc = "&"; break;
5032 case '<': cc = "<"; break;
5033 case '>': cc = ">"; break;
5035 case 0x1f: c = '.'; break;
5036 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5041 if ((y == 0 && x == 0) || a != old_a) {
5042 rv = angband_color_table[a][1];
5043 gv = angband_color_table[a][2];
5044 bv = angband_color_table[a][3];
5045 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5046 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5050 fprintf(fff, "%s", cc);
5052 fprintf(fff, "%c", c);
5055 fprintf(fff, "</font>");
5058 for (i = 0; html_foot[i]; i++)
5059 fputs(html_foot[i], fff);
5064 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5066 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5070 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5072 fprintf(fff, "%s\n", buf);
5085 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5089 /* Restore the screen */
5095 * Hack -- save a screen dump to a file
5097 static void do_cmd_save_screen_html(void)
5099 char buf[1024], tmp[256] = "screen.html";
5101 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5104 /* Build the filename */
5105 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5109 do_cmd_save_screen_html_aux(buf, 1);
5114 * Redefinable "save_screen" action
5116 void (*screendump_aux)(void) = NULL;
5120 * Hack -- save a screen dump to a file
5122 void do_cmd_save_screen(void)
5124 bool old_use_graphics = use_graphics;
5125 bool html_dump = FALSE;
5129 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5133 if (c == 'Y' || c == 'y')
5135 else if (c == 'H' || c == 'h')
5147 Term_get_size(&wid, &hgt);
5149 if (old_use_graphics)
5151 use_graphics = FALSE;
5154 /* Redraw everything */
5155 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5157 /* Hack -- update */
5163 do_cmd_save_screen_html();
5167 /* Do we use a special screendump function ? */
5168 else if (screendump_aux)
5170 /* Dump the screen to a graphics file */
5171 (*screendump_aux)();
5173 else /* Dump the screen as text */
5184 /* Build the filename */
5185 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5187 /* File type is "TEXT" */
5188 FILE_TYPE(FILE_TYPE_TEXT);
5190 /* Append to the file */
5191 fff = my_fopen(buf, "w");
5195 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5201 /* Save the screen */
5205 /* Dump the screen */
5206 for (y = 0; y < hgt; y++)
5209 for (x = 0; x < wid - 1; x++)
5211 /* Get the attr/char */
5212 (void)(Term_what(x, y, &a, &c));
5222 fprintf(fff, "%s\n", buf);
5229 /* Dump the screen */
5230 for (y = 0; y < hgt; y++)
5233 for (x = 0; x < wid - 1; x++)
5235 /* Get the attr/char */
5236 (void)(Term_what(x, y, &a, &c));
5239 buf[x] = hack[a&0x0F];
5246 fprintf(fff, "%s\n", buf);
5256 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5259 /* Restore the screen */
5263 if (old_use_graphics)
5265 use_graphics = TRUE;
5268 /* Redraw everything */
5269 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5271 /* Hack -- update */
5278 * Sorting hook -- Comp function -- see below
5280 * We use "u" to point to array of monster indexes,
5281 * and "v" to select the type of sorting to perform on "u".
5283 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5285 u16b *who = (u16b*)(u);
5287 u16b *why = (u16b*)(v);
5294 /* Sort by total kills */
5297 /* Extract total kills */
5298 z1 = a_info[w1].tval;
5299 z2 = a_info[w2].tval;
5301 /* Compare total kills */
5302 if (z1 < z2) return (TRUE);
5303 if (z1 > z2) return (FALSE);
5307 /* Sort by monster level */
5310 /* Extract levels */
5311 z1 = a_info[w1].sval;
5312 z2 = a_info[w2].sval;
5314 /* Compare levels */
5315 if (z1 < z2) return (TRUE);
5316 if (z1 > z2) return (FALSE);
5320 /* Sort by monster experience */
5323 /* Extract experience */
5324 z1 = a_info[w1].level;
5325 z2 = a_info[w2].level;
5327 /* Compare experience */
5328 if (z1 < z2) return (TRUE);
5329 if (z1 > z2) return (FALSE);
5333 /* Compare indexes */
5339 * Sorting hook -- Swap function -- see below
5341 * We use "u" to point to array of monster indexes,
5342 * and "v" to select the type of sorting to perform.
5344 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5346 u16b *who = (u16b*)(u);
5361 * Check the status of "artifacts"
5363 static void do_cmd_knowledge_artifacts(void)
5375 char file_name[1024];
5377 char base_name[MAX_NLEN];
5381 /* Open a new file */
5382 fff = my_fopen_temp(file_name, 1024);
5385 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5390 /* Allocate the "who" array */
5391 C_MAKE(who, max_a_idx, s16b);
5393 /* Allocate the "okay" array */
5394 C_MAKE(okay, max_a_idx, bool);
5396 /* Scan the artifacts */
5397 for (k = 0; k < max_a_idx; k++)
5399 artifact_type *a_ptr = &a_info[k];
5404 /* Skip "empty" artifacts */
5405 if (!a_ptr->name) continue;
5407 /* Skip "uncreated" artifacts */
5408 if (!a_ptr->cur_num) continue;
5414 /* Check the dungeon */
5415 for (y = 0; y < cur_hgt; y++)
5417 for (x = 0; x < cur_wid; x++)
5419 cave_type *c_ptr = &cave[y][x];
5421 OBJECT_IDX this_o_idx, next_o_idx = 0;
5423 /* Scan all objects in the grid */
5424 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5428 /* Acquire object */
5429 o_ptr = &o_list[this_o_idx];
5431 /* Acquire next object */
5432 next_o_idx = o_ptr->next_o_idx;
5434 /* Ignore non-artifacts */
5435 if (!object_is_fixed_artifact(o_ptr)) continue;
5437 /* Ignore known items */
5438 if (object_is_known(o_ptr)) continue;
5440 /* Note the artifact */
5441 okay[o_ptr->name1] = FALSE;
5446 /* Check the inventory and equipment */
5447 for (i = 0; i < INVEN_TOTAL; i++)
5449 object_type *o_ptr = &inventory[i];
5451 /* Ignore non-objects */
5452 if (!o_ptr->k_idx) continue;
5454 /* Ignore non-artifacts */
5455 if (!object_is_fixed_artifact(o_ptr)) continue;
5457 /* Ignore known items */
5458 if (object_is_known(o_ptr)) continue;
5460 /* Note the artifact */
5461 okay[o_ptr->name1] = FALSE;
5464 for (k = 0; k < max_a_idx; k++)
5466 if (okay[k]) who[n++] = k;
5469 /* Select the sort method */
5470 ang_sort_comp = ang_sort_art_comp;
5471 ang_sort_swap = ang_sort_art_swap;
5473 /* Sort the array by dungeon depth of monsters */
5474 ang_sort(who, &why, n);
5476 /* Scan the artifacts */
5477 for (k = 0; k < n; k++)
5479 artifact_type *a_ptr = &a_info[who[k]];
5482 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5484 /* Obtain the base object type */
5485 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5493 /* Get local object */
5496 /* Create fake object */
5497 object_prep(q_ptr, z);
5499 /* Make it an artifact */
5500 q_ptr->name1 = (byte)who[k];
5502 /* Display as if known */
5503 q_ptr->ident |= IDENT_STORE;
5505 /* Describe the artifact */
5506 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5509 /* Hack -- Build the artifact name */
5510 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5513 /* Free the "who" array */
5514 C_KILL(who, max_a_idx, s16b);
5516 /* Free the "okay" array */
5517 C_KILL(okay, max_a_idx, bool);
5519 /* Close the file */
5522 /* Display the file contents */
5523 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5525 /* Remove the file */
5531 * Display known uniques
5532 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5534 static void do_cmd_knowledge_uniques(void)
5543 char file_name[1024];
5546 int n_alive_surface = 0;
5547 int n_alive_over100 = 0;
5548 int n_alive_total = 0;
5551 for (i = 0; i < 10; i++) n_alive[i] = 0;
5553 /* Open a new file */
5554 fff = my_fopen_temp(file_name, 1024);
5558 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5563 /* Allocate the "who" array */
5564 C_MAKE(who, max_r_idx, s16b);
5566 /* Scan the monsters */
5567 for (i = 1; i < max_r_idx; i++)
5569 monster_race *r_ptr = &r_info[i];
5572 if (!r_ptr->name) continue;
5574 /* Require unique monsters */
5575 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5577 /* Only display "known" uniques */
5578 if (!cheat_know && !r_ptr->r_sights) continue;
5580 /* Only print rarity <= 100 uniques */
5581 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5583 /* Only "alive" uniques */
5584 if (r_ptr->max_num == 0) continue;
5588 lev = (r_ptr->level - 1) / 10;
5592 if (max_lev < lev) max_lev = lev;
5594 else n_alive_over100++;
5596 else n_alive_surface++;
5598 /* Collect "appropriate" monsters */
5602 /* Select the sort method */
5603 ang_sort_comp = ang_sort_comp_hook;
5604 ang_sort_swap = ang_sort_swap_hook;
5606 /* Sort the array by dungeon depth of monsters */
5607 ang_sort(who, &why, n);
5609 if (n_alive_surface)
5611 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5612 n_alive_total += n_alive_surface;
5614 for (i = 0; i <= max_lev; i++)
5616 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5617 n_alive_total += n_alive[i];
5619 if (n_alive_over100)
5621 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5622 n_alive_total += n_alive_over100;
5627 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5628 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5632 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5635 /* Scan the monster races */
5636 for (k = 0; k < n; k++)
5638 monster_race *r_ptr = &r_info[who[k]];
5640 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, (int)r_ptr->level);
5643 /* Free the "who" array */
5644 C_KILL(who, max_r_idx, s16b);
5646 /* Close the file */
5649 /* Display the file contents */
5650 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5652 /* Remove the file */
5658 * Display weapon-exp
5660 static void do_cmd_knowledge_weapon_exp(void)
5662 int i, num, weapon_exp;
5667 char file_name[1024];
5670 /* Open a new file */
5671 fff = my_fopen_temp(file_name, 1024);
5673 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5678 for (i = 0; i < 5; i++)
5680 for (num = 0; num < 64; num++)
5682 for (j = 0; j < max_k_idx; j++)
5684 object_kind *k_ptr = &k_info[j];
5686 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5688 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5690 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5692 fprintf(fff, "%-25s ", tmp);
5693 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5694 else fprintf(fff, " ");
5695 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5696 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5704 /* Close the file */
5707 /* Display the file contents */
5708 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5710 /* Remove the file */
5716 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5720 static void do_cmd_knowledge_spell_exp(void)
5723 int spell_exp, exp_level;
5726 const magic_type *s_ptr;
5728 char file_name[1024];
5730 /* Open a new file */
5731 fff = my_fopen_temp(file_name, 1024);
5733 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5738 if (p_ptr->realm1 != REALM_NONE)
5740 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5741 for (i = 0; i < 32; i++)
5743 if (!is_magic(p_ptr->realm1))
5745 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5749 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5751 if (s_ptr->slevel >= 99) continue;
5752 spell_exp = p_ptr->spell_exp[i];
5753 exp_level = spell_exp_level(spell_exp);
5754 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5755 if (p_ptr->realm1 == REALM_HISSATSU)
5756 fprintf(fff, "[--]");
5759 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5760 else fprintf(fff, " ");
5761 fprintf(fff, "%s", exp_level_str[exp_level]);
5763 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5768 if (p_ptr->realm2 != REALM_NONE)
5770 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5771 for (i = 0; i < 32; i++)
5773 if (!is_magic(p_ptr->realm1))
5775 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5779 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5781 if (s_ptr->slevel >= 99) continue;
5783 spell_exp = p_ptr->spell_exp[i + 32];
5784 exp_level = spell_exp_level(spell_exp);
5785 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5786 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5787 else fprintf(fff, " ");
5788 fprintf(fff, "%s", exp_level_str[exp_level]);
5789 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5794 /* Close the file */
5797 /* Display the file contents */
5798 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5800 /* Remove the file */
5806 * @brief スキル情報を表示するコマンドのメインルーチン /
5810 static void do_cmd_knowledge_skill_exp(void)
5812 int i = 0, skill_exp;
5816 char file_name[1024];
5817 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5818 _("二刀流 ", "Dual Wielding "),
5819 _("乗馬 ", "Riding ")};
5821 /* Open a new file */
5822 fff = my_fopen_temp(file_name, 1024);
5824 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5829 for (i = 0; i < 3; i++)
5831 skill_exp = p_ptr->skill_exp[i];
5832 fprintf(fff, "%-20s ", skill_name[i]);
5833 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5834 else fprintf(fff, " ");
5835 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5836 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5840 /* Close the file */
5843 /* Display the file contents */
5844 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5846 /* Remove the file */
5852 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5853 * @param Name 変換したい文字列の参照ポインタ
5856 void plural_aux(char *Name)
5858 int NameLen = strlen(Name);
5860 if (my_strstr(Name, "Disembodied hand"))
5862 strcpy(Name, "Disembodied hands that strangled people");
5864 else if (my_strstr(Name, "Colour out of space"))
5866 strcpy(Name, "Colours out of space");
5868 else if (my_strstr(Name, "stairway to hell"))
5870 strcpy(Name, "stairways to hell");
5872 else if (my_strstr(Name, "Dweller on the threshold"))
5874 strcpy(Name, "Dwellers on the threshold");
5876 else if (my_strstr(Name, " of "))
5878 cptr aider = my_strstr(Name, " of ");
5889 if (dummy[i-1] == 's')
5891 strcpy(&(dummy[i]), "es");
5896 strcpy(&(dummy[i]), "s");
5899 strcpy(&(dummy[i+1]), aider);
5900 strcpy(Name, dummy);
5902 else if (my_strstr(Name, "coins"))
5905 strcpy(dummy, "piles of ");
5906 strcat(dummy, Name);
5907 strcpy(Name, dummy);
5910 else if (my_strstr(Name, "Manes"))
5914 else if (streq(&(Name[NameLen - 2]), "ey"))
5916 strcpy(&(Name[NameLen - 2]), "eys");
5918 else if (Name[NameLen - 1] == 'y')
5920 strcpy(&(Name[NameLen - 1]), "ies");
5922 else if (streq(&(Name[NameLen - 4]), "ouse"))
5924 strcpy(&(Name[NameLen - 4]), "ice");
5926 else if (streq(&(Name[NameLen - 2]), "us"))
5928 strcpy(&(Name[NameLen - 2]), "i");
5930 else if (streq(&(Name[NameLen - 6]), "kelman"))
5932 strcpy(&(Name[NameLen - 6]), "kelmen");
5934 else if (streq(&(Name[NameLen - 8]), "wordsman"))
5936 strcpy(&(Name[NameLen - 8]), "wordsmen");
5938 else if (streq(&(Name[NameLen - 7]), "oodsman"))
5940 strcpy(&(Name[NameLen - 7]), "oodsmen");
5942 else if (streq(&(Name[NameLen - 7]), "eastman"))
5944 strcpy(&(Name[NameLen - 7]), "eastmen");
5946 else if (streq(&(Name[NameLen - 8]), "izardman"))
5948 strcpy(&(Name[NameLen - 8]), "izardmen");
5950 else if (streq(&(Name[NameLen - 5]), "geist"))
5952 strcpy(&(Name[NameLen - 5]), "geister");
5954 else if (streq(&(Name[NameLen - 2]), "ex"))
5956 strcpy(&(Name[NameLen - 2]), "ices");
5958 else if (streq(&(Name[NameLen - 2]), "lf"))
5960 strcpy(&(Name[NameLen - 2]), "lves");
5962 else if (suffix(Name, "ch") ||
5963 suffix(Name, "sh") ||
5964 suffix(Name, "nx") ||
5965 suffix(Name, "s") ||
5968 strcpy(&(Name[NameLen]), "es");
5972 strcpy(&(Name[NameLen]), "s");
5977 * @brief 現在のペットを表示するコマンドのメインルーチン /
5978 * Display current pets
5981 static void do_cmd_knowledge_pets(void)
5985 monster_type *m_ptr;
5988 int show_upkeep = 0;
5989 char file_name[1024];
5992 /* Open a new file */
5993 fff = my_fopen_temp(file_name, 1024);
5995 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6000 /* Process the monsters (backwards) */
6001 for (i = m_max - 1; i >= 1; i--)
6003 /* Access the monster */
6006 /* Ignore "dead" monsters */
6007 if (!m_ptr->r_idx) continue;
6009 /* Calculate "upkeep" for pets */
6013 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6014 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6018 show_upkeep = calculate_upkeep();
6020 fprintf(fff, "----------------------------------------------\n");
6022 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6023 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6025 fprintf(fff, " Total: %d pet%s.\n",
6026 t_friends, (t_friends == 1 ? "" : "s"));
6027 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6032 /* Close the file */
6035 /* Display the file contents */
6036 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6038 /* Remove the file */
6044 * @brief 現在のペットを表示するコマンドのメインルーチン /
6047 * @note the player ghosts are ignored.
6049 static void do_cmd_knowledge_kill_count(void)
6058 char file_name[1024];
6063 /* Open a new file */
6064 fff = my_fopen_temp(file_name, 1024);
6067 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6072 /* Allocate the "who" array */
6073 C_MAKE(who, max_r_idx, s16b);
6076 /* Monsters slain */
6079 for (kk = 1; kk < max_r_idx; kk++)
6081 monster_race *r_ptr = &r_info[kk];
6083 if (r_ptr->flags1 & (RF1_UNIQUE))
6085 bool dead = (r_ptr->max_num == 0);
6094 MONSTER_NUMBER This = r_ptr->r_pkills;
6104 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6107 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6109 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6115 /* Scan the monsters */
6116 for (i = 1; i < max_r_idx; i++)
6118 monster_race *r_ptr = &r_info[i];
6120 /* Use that monster */
6121 if (r_ptr->name) who[n++] = i;
6124 /* Select the sort method */
6125 ang_sort_comp = ang_sort_comp_hook;
6126 ang_sort_swap = ang_sort_swap_hook;
6128 /* Sort the array by dungeon depth of monsters */
6129 ang_sort(who, &why, n);
6131 /* Scan the monster races */
6132 for (k = 0; k < n; k++)
6134 monster_race *r_ptr = &r_info[who[k]];
6136 if (r_ptr->flags1 & (RF1_UNIQUE))
6138 bool dead = (r_ptr->max_num == 0);
6142 fprintf(fff, " %s\n", (r_name + r_ptr->name));
6148 MONSTER_NUMBER This = r_ptr->r_pkills;
6153 /* p,tは人と数える by ita */
6154 if (my_strchr("pt", r_ptr->d_char))
6155 fprintf(fff, " %3d 人の %s\n", (int)This, r_name + r_ptr->name);
6157 fprintf(fff, " %3d 体の %s\n", (int)This, r_name + r_ptr->name);
6161 if (my_strstr(r_name + r_ptr->name, "coins"))
6163 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6167 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6173 strcpy(ToPlural, (r_name + r_ptr->name));
6174 plural_aux(ToPlural);
6175 fprintf(fff, " %d %s\n", This, ToPlural);
6185 fprintf(fff,"----------------------------------------------\n");
6187 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6189 fprintf(fff," Total: %lu creature%s killed.\n",
6190 (unsigned long int)Total, (Total == 1 ? "" : "s"));
6194 /* Free the "who" array */
6195 C_KILL(who, max_r_idx, s16b);
6197 /* Close the file */
6200 /* Display the file contents */
6201 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6203 /* Remove the file */
6209 * @brief モンスター情報リスト中のグループを表示する /
6210 * Display the object groups.
6214 * @param per_page リストの表示行
6215 * @param grp_idx グループのID配列
6216 * @param group_text グループ名の文字列配列
6217 * @param grp_cur 現在の選択ID
6218 * @param grp_top 現在の選択リスト最上部ID
6221 static void display_group_list(int col, int row, int wid, int per_page,
6222 IDX grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6226 /* Display lines until done */
6227 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6229 /* Get the group index */
6230 int grp = grp_idx[grp_top + i];
6232 /* Choose a color */
6233 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6235 /* Erase the entire line */
6236 Term_erase(col, row + i, wid);
6238 /* Display the group label */
6239 c_put_str(attr, group_text[grp], row + i, col);
6245 * Move the cursor in a browser window
6247 static void browser_cursor(char ch, int *column, IDX *grp_cur, int grp_cnt,
6248 IDX *list_cur, int list_cnt)
6253 IDX list = *list_cur;
6255 /* Extract direction */
6258 /* Hack -- scroll up full screen */
6263 /* Hack -- scroll down full screen */
6268 d = get_keymap_dir(ch);
6273 /* Diagonals - hack */
6274 if ((ddx[d] > 0) && ddy[d])
6280 Term_get_size(&wid, &hgt);
6282 browser_rows = hgt - 8;
6284 /* Browse group list */
6289 /* Move up or down */
6290 grp += ddy[d] * (browser_rows - 1);
6293 if (grp >= grp_cnt) grp = grp_cnt - 1;
6294 if (grp < 0) grp = 0;
6295 if (grp != old_grp) list = 0;
6298 /* Browse sub-list list */
6301 /* Move up or down */
6302 list += ddy[d] * browser_rows;
6305 if (list >= list_cnt) list = list_cnt - 1;
6306 if (list < 0) list = 0;
6318 if (col < 0) col = 0;
6319 if (col > 1) col = 1;
6326 /* Browse group list */
6331 /* Move up or down */
6335 if (grp >= grp_cnt) grp = grp_cnt - 1;
6336 if (grp < 0) grp = 0;
6337 if (grp != old_grp) list = 0;
6340 /* Browse sub-list list */
6343 /* Move up or down */
6347 if (list >= list_cnt) list = list_cnt - 1;
6348 if (list < 0) list = 0;
6359 static void display_visual_list(int col, int row, int height, int width, TERM_COLOR attr_top, byte char_left)
6363 /* Clear the display lines */
6364 for (i = 0; i < height; i++)
6366 Term_erase(col, row + i, width);
6369 /* Bigtile mode uses double width */
6370 if (use_bigtile) width /= 2;
6372 /* Display lines until done */
6373 for (i = 0; i < height; i++)
6375 /* Display columns until done */
6376 for (j = 0; j < width; j++)
6380 TERM_LEN x = col + j;
6381 TERM_LEN y = row + i;
6384 /* Bigtile mode uses double width */
6385 if (use_bigtile) x += j;
6390 /* Ignore illegal characters */
6391 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6392 (!use_graphics && ic > 0x7f))
6398 /* Force correct code for both ASCII character and tile */
6399 if (c & 0x80) a |= 0x80;
6401 /* Display symbol */
6402 Term_queue_bigchar(x, y, a, c, 0, 0);
6409 * Place the cursor at the collect position for visual mode
6411 static void place_visual_list_cursor(TERM_LEN col, TERM_LEN row, TERM_COLOR a, byte c, TERM_COLOR attr_top, byte char_left)
6413 int i = (a & 0x7f) - attr_top;
6414 int j = c - char_left;
6416 TERM_LEN x = col + j;
6417 TERM_LEN y = row + i;
6419 /* Bigtile mode uses double width */
6420 if (use_bigtile) x += j;
6422 /* Place the cursor */
6428 * Clipboard variables for copy&paste in visual mode
6430 static TERM_COLOR attr_idx = 0;
6431 static byte char_idx = 0;
6433 /* Hack -- for feature lighting */
6434 static TERM_COLOR attr_idx_feat[F_LIT_MAX];
6435 static byte char_idx_feat[F_LIT_MAX];
6438 * Do visual mode command -- Change symbols
6440 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6441 int height, int width,
6442 TERM_COLOR *attr_top_ptr, byte *char_left_ptr,
6443 TERM_COLOR *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6445 static TERM_COLOR attr_old = 0;
6446 static byte char_old = 0;
6451 if (*visual_list_ptr)
6454 *cur_attr_ptr = attr_old;
6455 *cur_char_ptr = char_old;
6456 *visual_list_ptr = FALSE;
6464 if (*visual_list_ptr)
6467 *visual_list_ptr = FALSE;
6468 *need_redraw = TRUE;
6476 if (!*visual_list_ptr)
6478 *visual_list_ptr = TRUE;
6480 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6481 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6483 attr_old = *cur_attr_ptr;
6484 char_old = *cur_char_ptr;
6495 /* Set the visual */
6496 attr_idx = *cur_attr_ptr;
6497 char_idx = *cur_char_ptr;
6499 /* Hack -- for feature lighting */
6500 for (i = 0; i < F_LIT_MAX; i++)
6502 attr_idx_feat[i] = 0;
6503 char_idx_feat[i] = 0;
6510 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6513 *cur_attr_ptr = attr_idx;
6514 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6515 if (!*visual_list_ptr) *need_redraw = TRUE;
6521 *cur_char_ptr = char_idx;
6522 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6523 if (!*visual_list_ptr) *need_redraw = TRUE;
6529 if (*visual_list_ptr)
6532 int d = get_keymap_dir(ch);
6533 byte a = (*cur_attr_ptr & 0x7f);
6534 byte c = *cur_char_ptr;
6536 if (use_bigtile) eff_width = width / 2;
6537 else eff_width = width;
6539 /* Restrict direction */
6540 if ((a == 0) && (ddy[d] < 0)) d = 0;
6541 if ((c == 0) && (ddx[d] < 0)) d = 0;
6542 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6543 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6548 /* Force correct code for both ASCII character and tile */
6549 if (c & 0x80) a |= 0x80;
6551 /* Set the visual */
6556 /* Move the frame */
6557 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6558 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6559 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6560 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6566 /* Visual mode command is not used */
6572 * Display the monsters in a group.
6574 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6575 int mon_cur, int mon_top, bool visual_only)
6579 /* Display lines until done */
6580 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6584 /* Get the race index */
6585 MONRACE_IDX r_idx = mon_idx[mon_top + i] ;
6587 /* Access the race */
6588 monster_race *r_ptr = &r_info[r_idx];
6590 /* Choose a color */
6591 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6593 /* Display the name */
6594 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6596 /* Hack -- visual_list mode */
6599 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6601 if (p_ptr->wizard || visual_only)
6603 c_prt(attr, format("%d", r_idx), row + i, 62);
6606 /* Erase chars before overwritten by the race letter */
6607 Term_erase(69, row + i, 255);
6609 /* Display symbol */
6610 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6615 if (!(r_ptr->flags1 & RF1_UNIQUE))
6616 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6618 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6619 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6623 /* Clear remaining lines */
6624 for (; i < per_page; i++)
6626 Term_erase(col, row + i, 255);
6632 * Display known monsters.
6634 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, IDX direct_r_idx)
6638 IDX grp_cur, grp_top, old_grp_cur;
6639 IDX mon_cur, mon_top;
6640 IDX grp_cnt, grp_idx[100];
6648 bool visual_list = FALSE;
6649 TERM_COLOR attr_top = 0;
6658 Term_get_size(&wid, &hgt);
6660 browser_rows = hgt - 8;
6662 /* Allocate the "mon_idx" array */
6663 C_MAKE(mon_idx, max_r_idx, s16b);
6668 if (direct_r_idx < 0)
6670 mode = visual_only ? 0x03 : 0x01;
6672 /* Check every group */
6673 for (i = 0; monster_group_text[i] != NULL; i++)
6675 /* Measure the label */
6676 len = strlen(monster_group_text[i]);
6678 /* Save the maximum length */
6679 if (len > max) max = len;
6681 /* See if any monsters are known */
6682 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6684 /* Build a list of groups with known monsters */
6685 grp_idx[grp_cnt++] = i;
6693 mon_idx[0] = direct_r_idx;
6696 /* Terminate the list */
6699 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6700 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6703 /* Terminate the list */
6704 grp_idx[grp_cnt] = -1;
6707 grp_cur = grp_top = 0;
6708 mon_cur = mon_top = 0;
6713 mode = visual_only ? 0x02 : 0x00;
6718 monster_race *r_ptr;
6725 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6726 if (direct_r_idx < 0) prt("グループ", 4, 0);
6727 prt("名前", 4, max + 3);
6728 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6730 if (!visual_only) prt("殺害数", 4, 72);
6732 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6733 if (direct_r_idx < 0) prt("Group", 4, 0);
6734 prt("Name", 4, max + 3);
6735 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6737 if (!visual_only) prt("Kills", 4, 73);
6740 for (i = 0; i < 78; i++)
6742 Term_putch(i, 5, TERM_WHITE, '=');
6745 if (direct_r_idx < 0)
6747 for (i = 0; i < browser_rows; i++)
6749 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6756 if (direct_r_idx < 0)
6758 /* Scroll group list */
6759 if (grp_cur < grp_top) grp_top = grp_cur;
6760 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6762 /* Display a list of monster groups */
6763 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6765 if (old_grp_cur != grp_cur)
6767 old_grp_cur = grp_cur;
6769 /* Get a list of monsters in the current group */
6770 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6773 /* Scroll monster list */
6774 while (mon_cur < mon_top)
6775 mon_top = MAX(0, mon_top - browser_rows/2);
6776 while (mon_cur >= mon_top + browser_rows)
6777 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6782 /* Display a list of monsters in the current group */
6783 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6789 /* Display a monster name */
6790 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6792 /* Display visual list below first monster */
6793 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6798 prt(format("<方向>%s%s%s, ESC",
6799 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6800 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6801 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6804 prt(format("<dir>%s%s%s, ESC",
6805 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6806 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6807 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6811 /* Get the current monster */
6812 r_ptr = &r_info[mon_idx[mon_cur]];
6816 /* Mega Hack -- track this monster race */
6817 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6819 /* Hack -- handle stuff */
6825 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6829 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6833 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6838 /* Do visual mode command if needed */
6839 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))
6841 if (direct_r_idx >= 0)
6866 /* Recall on screen */
6867 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6869 screen_roff(mon_idx[mon_cur], 0);
6880 /* Move the cursor */
6881 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6888 /* Free the "mon_idx" array */
6889 C_KILL(mon_idx, max_r_idx, s16b);
6894 * Display the objects in a group.
6896 static void display_object_list(int col, int row, int per_page, IDX object_idx[],
6897 int object_cur, int object_top, bool visual_only)
6901 /* Display lines until done */
6902 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6907 object_kind *flavor_k_ptr;
6909 /* Get the object index */
6910 KIND_OBJECT_IDX k_idx = object_idx[object_top + i];
6912 /* Access the object */
6913 object_kind *k_ptr = &k_info[k_idx];
6915 /* Choose a color */
6916 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6917 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6920 if (!visual_only && k_ptr->flavor)
6922 /* Appearance of this object is shuffled */
6923 flavor_k_ptr = &k_info[k_ptr->flavor];
6927 /* Appearance of this object is very normal */
6928 flavor_k_ptr = k_ptr;
6933 attr = ((i + object_top == object_cur) ? cursor : attr);
6935 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
6938 strip_name(o_name, k_idx);
6943 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
6946 /* Display the name */
6947 c_prt(attr, o_name, row + i, col);
6949 /* Hack -- visual_list mode */
6952 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);
6954 if (p_ptr->wizard || visual_only)
6956 c_prt(attr, format("%d", k_idx), row + i, 70);
6959 a = flavor_k_ptr->x_attr;
6960 c = flavor_k_ptr->x_char;
6962 /* Display symbol */
6963 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
6966 /* Clear remaining lines */
6967 for (; i < per_page; i++)
6969 Term_erase(col, row + i, 255);
6974 * Describe fake object
6976 static void desc_obj_fake(KIND_OBJECT_IDX k_idx)
6979 object_type object_type_body;
6981 /* Get local object */
6982 o_ptr = &object_type_body;
6984 /* Wipe the object */
6987 /* Create the artifact */
6988 object_prep(o_ptr, k_idx);
6990 /* It's fully know */
6991 o_ptr->ident |= IDENT_KNOWN;
6993 /* Track the object */
6994 /* object_actual_track(o_ptr); */
6996 /* Hack - mark as fake */
6997 /* term_obj_real = FALSE; */
6999 /* Hack -- Handle stuff */
7002 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
7004 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7012 * Display known objects
7014 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, IDX direct_k_idx)
7018 IDX grp_cur, grp_top, old_grp_cur;
7019 IDX object_old, object_cur, object_top;
7029 bool visual_list = FALSE;
7030 TERM_COLOR attr_top = 0;
7039 Term_get_size(&wid, &hgt);
7041 browser_rows = hgt - 8;
7043 /* Allocate the "object_idx" array */
7044 C_MAKE(object_idx, max_k_idx, IDX);
7049 if (direct_k_idx < 0)
7051 mode = visual_only ? 0x03 : 0x01;
7053 /* Check every group */
7054 for (i = 0; object_group_text[i] != NULL; i++)
7056 /* Measure the label */
7057 len = strlen(object_group_text[i]);
7059 /* Save the maximum length */
7060 if (len > max) max = len;
7062 /* See if any monsters are known */
7063 if (collect_objects(i, object_idx, mode))
7065 /* Build a list of groups with known monsters */
7066 grp_idx[grp_cnt++] = i;
7075 object_kind *k_ptr = &k_info[direct_k_idx];
7076 object_kind *flavor_k_ptr;
7078 if (!visual_only && k_ptr->flavor)
7080 /* Appearance of this object is shuffled */
7081 flavor_k_ptr = &k_info[k_ptr->flavor];
7085 /* Appearance of this object is very normal */
7086 flavor_k_ptr = k_ptr;
7089 object_idx[0] = direct_k_idx;
7090 object_old = direct_k_idx;
7093 /* Terminate the list */
7096 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7097 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7100 /* Terminate the list */
7101 grp_idx[grp_cnt] = -1;
7104 grp_cur = grp_top = 0;
7105 object_cur = object_top = 0;
7110 mode = visual_only ? 0x02 : 0x00;
7115 object_kind *k_ptr, *flavor_k_ptr;
7122 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7123 if (direct_k_idx < 0) prt("グループ", 4, 0);
7124 prt("名前", 4, max + 3);
7125 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7128 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7129 if (direct_k_idx < 0) prt("Group", 4, 0);
7130 prt("Name", 4, max + 3);
7131 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7135 for (i = 0; i < 78; i++)
7137 Term_putch(i, 5, TERM_WHITE, '=');
7140 if (direct_k_idx < 0)
7142 for (i = 0; i < browser_rows; i++)
7144 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7151 if (direct_k_idx < 0)
7153 /* Scroll group list */
7154 if (grp_cur < grp_top) grp_top = grp_cur;
7155 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7157 /* Display a list of object groups */
7158 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7160 if (old_grp_cur != grp_cur)
7162 old_grp_cur = grp_cur;
7164 /* Get a list of objects in the current group */
7165 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7168 /* Scroll object list */
7169 while (object_cur < object_top)
7170 object_top = MAX(0, object_top - browser_rows/2);
7171 while (object_cur >= object_top + browser_rows)
7172 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7177 /* Display a list of objects in the current group */
7178 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7182 object_top = object_cur;
7184 /* Display a list of objects in the current group */
7185 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7187 /* Display visual list below first object */
7188 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7191 /* Get the current object */
7192 k_ptr = &k_info[object_idx[object_cur]];
7194 if (!visual_only && k_ptr->flavor)
7196 /* Appearance of this object is shuffled */
7197 flavor_k_ptr = &k_info[k_ptr->flavor];
7201 /* Appearance of this object is very normal */
7202 flavor_k_ptr = k_ptr;
7207 prt(format("<方向>%s%s%s, ESC",
7208 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7209 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7210 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7213 prt(format("<dir>%s%s%s, ESC",
7214 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7215 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7216 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7222 /* Mega Hack -- track this object */
7223 if (object_cnt) object_kind_track(object_idx[object_cur]);
7225 /* The "current" object changed */
7226 if (object_old != object_idx[object_cur])
7228 /* Hack -- handle stuff */
7231 /* Remember the "current" object */
7232 object_old = object_idx[object_cur];
7238 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7242 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7246 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7251 /* Do visual mode command if needed */
7252 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))
7254 if (direct_k_idx >= 0)
7279 /* Recall on screen */
7280 if (!visual_list && !visual_only && (grp_cnt > 0))
7282 desc_obj_fake(object_idx[object_cur]);
7290 /* Move the cursor */
7291 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7297 /* Free the "object_idx" array */
7298 C_KILL(object_idx, max_k_idx, IDX);
7303 * Display the features in a group.
7305 static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_idx,
7306 FEAT_IDX feat_cur, FEAT_IDX feat_top, bool visual_only, int lighting_level)
7308 int lit_col[F_LIT_MAX], i, j;
7309 int f_idx_col = use_bigtile ? 62 : 64;
7311 /* Correct columns 1 and 4 */
7312 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7313 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7314 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7316 /* Display lines until done */
7317 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7322 FEAT_IDX f_idx = feat_idx[feat_top + i];
7324 /* Access the index */
7325 feature_type *f_ptr = &f_info[f_idx];
7327 int row_i = row + i;
7329 /* Choose a color */
7330 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7332 /* Display the name */
7333 c_prt(attr, f_name + f_ptr->name, row_i, col);
7335 /* Hack -- visual_list mode */
7338 /* Display lighting level */
7339 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7341 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));
7343 if (p_ptr->wizard || visual_only)
7345 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7348 /* Display symbol */
7349 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);
7351 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7352 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7354 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7356 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7358 /* Mega-hack -- Use non-standard colour */
7359 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7361 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7365 /* Clear remaining lines */
7366 for (; i < per_page; i++)
7368 Term_erase(col, row + i, 255);
7374 * Interact with feature visuals.
7376 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level)
7380 IDX grp_cur, grp_top, old_grp_cur;
7381 IDX feat_cur, feat_top;
7391 bool visual_list = FALSE;
7392 TERM_COLOR attr_top = 0;
7398 TERM_COLOR attr_old[F_LIT_MAX];
7399 byte char_old[F_LIT_MAX];
7400 TERM_COLOR *cur_attr_ptr;
7403 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7404 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7407 Term_get_size(&wid, &hgt);
7409 browser_rows = hgt - 8;
7411 /* Allocate the "feat_idx" array */
7412 C_MAKE(feat_idx, max_f_idx, IDX);
7417 if (direct_f_idx < 0)
7419 /* Check every group */
7420 for (i = 0; feature_group_text[i] != NULL; i++)
7422 /* Measure the label */
7423 len = strlen(feature_group_text[i]);
7425 /* Save the maximum length */
7426 if (len > max) max = len;
7428 /* See if any features are known */
7429 if (collect_features(i, feat_idx, 0x01))
7431 /* Build a list of groups with known features */
7432 grp_idx[grp_cnt++] = i;
7440 feature_type *f_ptr = &f_info[direct_f_idx];
7442 feat_idx[0] = direct_f_idx;
7445 /* Terminate the list */
7448 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7449 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7451 for (i = 0; i < F_LIT_MAX; i++)
7453 attr_old[i] = f_ptr->x_attr[i];
7454 char_old[i] = f_ptr->x_char[i];
7458 /* Terminate the list */
7459 grp_idx[grp_cnt] = -1;
7462 grp_cur = grp_top = 0;
7463 feat_cur = feat_top = 0;
7471 feature_type *f_ptr;
7478 prt("表示 - 地形", 2, 0);
7479 if (direct_f_idx < 0) prt("グループ", 4, 0);
7480 prt("名前", 4, max + 3);
7483 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7484 prt("文字 ( l/ d)", 4, 66);
7488 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7489 prt("文字 (l/d)", 4, 68);
7492 prt("Visuals - features", 2, 0);
7493 if (direct_f_idx < 0) prt("Group", 4, 0);
7494 prt("Name", 4, max + 3);
7497 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7498 prt("Sym ( l/ d)", 4, 67);
7502 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7503 prt("Sym (l/d)", 4, 69);
7507 for (i = 0; i < 78; i++)
7509 Term_putch(i, 5, TERM_WHITE, '=');
7512 if (direct_f_idx < 0)
7514 for (i = 0; i < browser_rows; i++)
7516 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7523 if (direct_f_idx < 0)
7525 /* Scroll group list */
7526 if (grp_cur < grp_top) grp_top = grp_cur;
7527 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7529 /* Display a list of feature groups */
7530 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7532 if (old_grp_cur != grp_cur)
7534 old_grp_cur = grp_cur;
7536 /* Get a list of features in the current group */
7537 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7540 /* Scroll feature list */
7541 while (feat_cur < feat_top)
7542 feat_top = MAX(0, feat_top - browser_rows/2);
7543 while (feat_cur >= feat_top + browser_rows)
7544 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7549 /* Display a list of features in the current group */
7550 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7554 feat_top = feat_cur;
7556 /* Display a list of features in the current group */
7557 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7559 /* Display visual list below first object */
7560 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7565 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7566 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7567 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7570 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7571 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7572 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7576 /* Get the current feature */
7577 f_ptr = &f_info[feat_idx[feat_cur]];
7578 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7579 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7583 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7587 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7591 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7596 if (visual_list && ((ch == 'A') || (ch == 'a')))
7598 int prev_lighting_level = *lighting_level;
7602 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7603 else (*lighting_level)--;
7607 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7608 else (*lighting_level)++;
7611 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7612 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7614 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7615 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7620 else if ((ch == 'D') || (ch == 'd'))
7622 TERM_COLOR prev_x_attr = f_ptr->x_attr[*lighting_level];
7623 byte prev_x_char = f_ptr->x_char[*lighting_level];
7625 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7629 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7630 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7632 if (prev_x_char != f_ptr->x_char[*lighting_level])
7633 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7635 else *need_redraw = TRUE;
7640 /* Do visual mode command if needed */
7641 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))
7645 /* Restore previous visual settings */
7647 for (i = 0; i < F_LIT_MAX; i++)
7649 f_ptr->x_attr[i] = attr_old[i];
7650 f_ptr->x_char[i] = char_old[i];
7657 if (direct_f_idx >= 0) flag = TRUE;
7658 else *lighting_level = F_LIT_STANDARD;
7661 /* Preserve current visual settings */
7664 for (i = 0; i < F_LIT_MAX; i++)
7666 attr_old[i] = f_ptr->x_attr[i];
7667 char_old[i] = f_ptr->x_char[i];
7669 *lighting_level = F_LIT_STANDARD;
7676 for (i = 0; i < F_LIT_MAX; i++)
7678 attr_idx_feat[i] = f_ptr->x_attr[i];
7679 char_idx_feat[i] = f_ptr->x_char[i];
7688 /* Allow TERM_DARK text */
7689 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7691 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7692 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7710 /* Move the cursor */
7711 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7717 /* Free the "feat_idx" array */
7718 C_KILL(feat_idx, max_f_idx, IDX);
7723 * List wanted monsters
7725 static void do_cmd_knowledge_kubi(void)
7730 char file_name[1024];
7733 /* Open a new file */
7734 fff = my_fopen_temp(file_name, 1024);
7736 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7743 bool listed = FALSE;
7746 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7748 fprintf(fff, "賞金首リスト\n");
7750 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7752 fprintf(fff, "List of wanted monsters\n");
7754 fprintf(fff, "----------------------------------------------\n");
7756 for (i = 0; i < MAX_KUBI; i++)
7758 if (kubi_r_idx[i] <= 10000)
7760 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7768 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7772 /* Close the file */
7775 /* Display the file contents */
7776 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7778 /* Remove the file */
7783 * List virtues & status
7785 static void do_cmd_knowledge_virtues(void)
7789 char file_name[1024];
7792 /* Open a new file */
7793 fff = my_fopen_temp(file_name, 1024);
7795 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7802 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7806 /* Close the file */
7809 /* Display the file contents */
7810 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7812 /* Remove the file */
7820 static void do_cmd_knowledge_dungeon(void)
7824 char file_name[1024];
7828 /* Open a new file */
7829 fff = my_fopen_temp(file_name, 1024);
7831 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7838 for (i = 1; i < max_d_idx; i++)
7842 if (!d_info[i].maxdepth) continue;
7843 if (!max_dlv[i]) continue;
7844 if (d_info[i].final_guardian)
7846 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7848 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7850 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
7854 /* Close the file */
7857 /* Display the file contents */
7858 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7860 /* Remove the file */
7865 * List virtues & status
7868 static void do_cmd_knowledge_stat(void)
7872 char file_name[1024];
7875 /* Open a new file */
7876 fff = my_fopen_temp(file_name, 1024);
7878 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7885 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7886 (2 * p_ptr->hitdie +
7887 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7890 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7891 else fprintf(fff, "現在の体力ランク : ???\n\n");
7892 fprintf(fff, "能力の最大値\n\n");
7894 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7895 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7896 fprintf(fff, "Limits of maximum stats\n\n");
7898 for (v_nr = 0; v_nr < 6; v_nr++)
7900 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);
7901 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7907 /* Close the file */
7910 /* Display the file contents */
7911 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7913 /* Remove the file */
7919 * Print all active quests
7921 static void do_cmd_knowledge_quests_current(FILE *fff)
7924 char rand_tmp_str[120] = "\0";
7926 monster_race *r_ptr;
7928 int rand_level = 100;
7931 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7933 for (i = 1; i < max_q_idx; i++)
7935 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
7936 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
7937 (quest[i].status == QUEST_STATUS_COMPLETED))
7939 /* Set the quest number temporary */
7940 IDX old_quest = p_ptr->inside_quest;
7943 /* Clear the text */
7944 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
7945 quest_text_line = 0;
7947 p_ptr->inside_quest = i;
7949 /* Get the quest text */
7950 init_flags = INIT_SHOW_TEXT;
7952 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
7954 /* Reset the old quest number */
7955 p_ptr->inside_quest = old_quest;
7957 /* No info from "silent" quests */
7958 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7962 if (quest[i].type != QUEST_TYPE_RANDOM)
7964 char note[80] = "\0";
7966 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
7968 switch (quest[i].type)
7970 case QUEST_TYPE_KILL_LEVEL:
7971 case QUEST_TYPE_KILL_ANY_LEVEL:
7972 r_ptr = &r_info[quest[i].r_idx];
7973 strcpy(name, r_name + r_ptr->name);
7974 if (quest[i].max_num > 1)
7977 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
7978 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
7981 sprintf(note," - kill %d %s, have killed %d.",
7982 (int)quest[i].max_num, name, (int)quest[i].cur_num);
7986 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
7989 case QUEST_TYPE_FIND_ARTIFACT:
7992 artifact_type *a_ptr = &a_info[quest[i].k_idx];
7994 object_type *q_ptr = &forge;
7995 KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
7996 object_prep(q_ptr, k_idx);
7997 q_ptr->name1 = quest[i].k_idx;
7998 q_ptr->ident = IDENT_STORE;
7999 object_desc(name, q_ptr, OD_NAME_ONLY);
8001 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
8003 case QUEST_TYPE_FIND_EXIT:
8004 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8007 case QUEST_TYPE_KILL_NUMBER:
8009 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8010 (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num));
8012 sprintf(note," - Kill %d monsters, have killed %d.",
8013 (int)quest[i].max_num, (int)quest[i].cur_num);
8017 case QUEST_TYPE_KILL_ALL:
8018 case QUEST_TYPE_TOWER:
8019 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8024 /* Print the quest info */
8025 sprintf(tmp_str, _(" %s (危険度:%d階相当)%s\n", " %s (Danger level: %d)%s\n"),
8026 quest[i].name, (int)quest[i].level, note);
8028 fputs(tmp_str, fff);
8030 if (quest[i].status == QUEST_STATUS_COMPLETED)
8032 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8033 fputs(tmp_str, fff);
8039 while (quest_text[j][0] && j < 10)
8041 fprintf(fff, " %s\n", quest_text[j]);
8046 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8049 rand_level = quest[i].level;
8051 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8053 /* Print the quest info */
8054 r_ptr = &r_info[quest[i].r_idx];
8055 strcpy(name, r_name + r_ptr->name);
8057 if (quest[i].max_num > 1)
8060 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8061 quest[i].name, (int)quest[i].level,
8062 (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
8066 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8067 quest[i].name, (int)quest[i].level,
8068 (int)quest[i].max_num, name, (int)quest[i].cur_num);
8073 sprintf(rand_tmp_str,_(" %s (%d 階) - %sを倒す。\n", " %s (Dungeon level: %d)\n Kill %s.\n"),
8074 quest[i].name, (int)quest[i].level, name);
8081 /* Print the current random quest */
8082 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8084 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8088 static bool do_cmd_knowledge_quests_aux(FILE *fff, IDX q_idx)
8091 char playtime_str[16];
8092 quest_type* const q_ptr = &quest[q_idx];
8094 if (is_fixed_quest_idx(q_idx))
8096 /* Set the quest number temporary */
8097 IDX old_quest = p_ptr->inside_quest;
8099 p_ptr->inside_quest = q_idx;
8102 init_flags = INIT_NAME_ONLY;
8104 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8106 /* Reset the old quest number */
8107 p_ptr->inside_quest = old_quest;
8109 /* No info from "silent" quests */
8110 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8113 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8114 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8116 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8118 /* Print the quest info */
8119 if (q_ptr->complev == 0)
8122 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8123 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8124 r_name+r_info[q_ptr->r_idx].name,
8125 (int)q_ptr->level, playtime_str);
8130 _(" %-35s (%3d階) - レベル%2d - %s\n",
8131 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8132 r_name+r_info[q_ptr->r_idx].name,
8140 /* Print the quest info */
8142 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8143 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8144 q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str);
8147 fputs(tmp_str, fff);
8153 * Print all finished quests
8155 void do_cmd_knowledge_quests_completed(FILE *fff, IDX quest_num[])
8160 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8161 for (i = 1; i < max_q_idx; i++)
8163 IDX q_idx = quest_num[i];
8164 quest_type* const q_ptr = &quest[q_idx];
8166 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8167 do_cmd_knowledge_quests_aux(fff, q_idx))
8172 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8177 * Print all failed quests
8179 void do_cmd_knowledge_quests_failed(FILE *fff, IDX quest_num[])
8184 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8185 for (i = 1; i < max_q_idx; i++)
8187 IDX q_idx = quest_num[i];
8188 quest_type* const q_ptr = &quest[q_idx];
8190 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8191 do_cmd_knowledge_quests_aux(fff, q_idx))
8196 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8201 * Print all random quests
8203 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8209 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8210 for (i = 1; i < max_q_idx; i++)
8212 /* No info from "silent" quests */
8213 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8215 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8219 /* Print the quest info */
8220 sprintf(tmp_str, _(" %s (%d階, %s)\n", " %s (%d, %s)\n"),
8221 quest[i].name, (int)quest[i].level, r_name+r_info[quest[i].r_idx].name);
8222 fputs(tmp_str, fff);
8225 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8229 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8231 QUEST_IDX *q_num = (QUEST_IDX *)u;
8232 quest_type *qa = &quest[q_num[a]];
8233 quest_type *qb = &quest[q_num[b]];
8238 return (qa->comptime != qb->comptime) ?
8239 (qa->comptime < qb->comptime) :
8240 (qa->level <= qb->level);
8243 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8245 QUEST_IDX *q_num = (QUEST_IDX *)u;
8252 q_num[a] = q_num[b];
8258 * Print quest status of all active quests
8260 static void do_cmd_knowledge_quests(void)
8263 char file_name[1024];
8268 /* Open a new file */
8269 fff = my_fopen_temp(file_name, 1024);
8272 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8277 /* Allocate Memory */
8278 C_MAKE(quest_num, max_q_idx, IDX);
8280 /* Sort by compete level */
8281 for (i = 1; i < max_q_idx; i++) quest_num[i] = i;
8282 ang_sort_comp = ang_sort_comp_quest_num;
8283 ang_sort_swap = ang_sort_swap_quest_num;
8284 ang_sort(quest_num, &dummy, max_q_idx);
8286 /* Dump Quest Information */
8287 do_cmd_knowledge_quests_current(fff);
8289 do_cmd_knowledge_quests_completed(fff, quest_num);
8291 do_cmd_knowledge_quests_failed(fff, quest_num);
8295 do_cmd_knowledge_quests_wiz_random(fff);
8298 /* Close the file */
8301 /* Display the file contents */
8302 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8304 /* Remove the file */
8308 C_KILL(quest_num, max_q_idx, IDX);
8315 static void do_cmd_knowledge_home(void)
8320 char file_name[1024];
8322 char o_name[MAX_NLEN];
8325 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8327 /* Open a new file */
8328 fff = my_fopen_temp(file_name, 1024);
8330 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8337 /* Print all homes in the different towns */
8338 st_ptr = &town[1].store[STORE_HOME];
8340 /* Home -- if anything there */
8341 if (st_ptr->stock_num)
8346 /* Header with name of the town */
8347 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8349 /* Dump all available items */
8350 for (i = 0; i < st_ptr->stock_num; i++)
8353 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8354 object_desc(o_name, &st_ptr->stock[i], 0);
8355 if (strlen(o_name) <= 80-3)
8357 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8363 for (n = 0, t = o_name; n < 80-3; n++, t++)
8364 if(iskanji(*t)) {t++; n++;}
8365 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8367 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8368 fprintf(fff, " %.77s\n", o_name+n);
8371 object_desc(o_name, &st_ptr->stock[i], 0);
8372 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8377 /* Add an empty line */
8378 fprintf(fff, "\n\n");
8382 /* Close the file */
8385 /* Display the file contents */
8386 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8388 /* Remove the file */
8394 * Check the status of "autopick"
8396 static void do_cmd_knowledge_autopick(void)
8400 char file_name[1024];
8402 /* Open a new file */
8403 fff = my_fopen_temp(file_name, 1024);
8407 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8414 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8418 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8419 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8422 for (k = 0; k < max_autopick; k++)
8425 byte act = autopick_list[k].action;
8426 if (act & DONT_AUTOPICK)
8428 tmp = _("放置", "Leave");
8430 else if (act & DO_AUTODESTROY)
8432 tmp = _("破壊", "Destroy");
8434 else if (act & DO_AUTOPICK)
8436 tmp = _("拾う", "Pickup");
8438 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
8440 tmp = _("確認", "Query");
8443 if (act & DO_DISPLAY)
8444 fprintf(fff, "%11s", format("[%s]", tmp));
8446 fprintf(fff, "%11s", format("(%s)", tmp));
8448 tmp = autopick_line_from_entry(&autopick_list[k]);
8449 fprintf(fff, " %s", tmp);
8453 /* Close the file */
8455 /* Display the file contents */
8456 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8458 /* Remove the file */
8464 * Interact with "knowledge"
8466 void do_cmd_knowledge(void)
8469 bool need_redraw = FALSE;
8471 /* File type is "TEXT" */
8472 FILE_TYPE(FILE_TYPE_TEXT);
8474 /* Save the screen */
8477 /* Interact until done */
8483 /* Ask for a choice */
8485 prt(format("%d/2 ページ", (p+1)), 2, 65);
8486 prt("現在の知識を確認する", 3, 0);
8488 prt(format("page %d/2", (p+1)), 2, 65);
8489 prt("Display current knowledge", 3, 0);
8492 /* Give some choices */
8496 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8497 prt("(2) 既知のアイテム の一覧", 7, 5);
8498 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8499 prt("(4) 既知のモンスター の一覧", 9, 5);
8500 prt("(5) 倒した敵の数 の一覧", 10, 5);
8501 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8502 prt("(7) 現在のペット の一覧", 12, 5);
8503 prt("(8) 我が家のアイテム の一覧", 13, 5);
8504 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8505 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8509 prt("(a) 自分に関する情報 の一覧", 6, 5);
8510 prt("(b) 突然変異 の一覧", 7, 5);
8511 prt("(c) 武器の経験値 の一覧", 8, 5);
8512 prt("(d) 魔法の経験値 の一覧", 9, 5);
8513 prt("(e) 技能の経験値 の一覧", 10, 5);
8514 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8515 prt("(g) 入ったダンジョン の一覧", 12, 5);
8516 prt("(h) 実行中のクエスト の一覧", 13, 5);
8517 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8522 prt("(1) Display known artifacts", 6, 5);
8523 prt("(2) Display known objects", 7, 5);
8524 prt("(3) Display remaining uniques", 8, 5);
8525 prt("(4) Display known monster", 9, 5);
8526 prt("(5) Display kill count", 10, 5);
8527 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8528 prt("(7) Display current pets", 12, 5);
8529 prt("(8) Display home inventory", 13, 5);
8530 prt("(9) Display *identified* equip.", 14, 5);
8531 prt("(0) Display terrain symbols.", 15, 5);
8535 prt("(a) Display about yourself", 6, 5);
8536 prt("(b) Display mutations", 7, 5);
8537 prt("(c) Display weapon proficiency", 8, 5);
8538 prt("(d) Display spell proficiency", 9, 5);
8539 prt("(e) Display misc. proficiency", 10, 5);
8540 prt("(f) Display virtues", 11, 5);
8541 prt("(g) Display dungeons", 12, 5);
8542 prt("(h) Display current quests", 13, 5);
8543 prt("(i) Display auto pick/destroy", 14, 5);
8549 prt("ESC) 抜ける", 21, 1);
8550 prt("SPACE) 次ページ", 21, 30);
8551 /*prt("-) 前ページ", 21, 60);*/
8552 prt("コマンド:", 20, 0);
8554 prt("-more-", 17, 8);
8555 prt("ESC) Exit menu", 21, 1);
8556 prt("SPACE) Next page", 21, 30);
8557 /*prt("-) Previous page", 21, 60);*/
8558 prt("Command: ", 20, 0);
8564 if (i == ESCAPE) break;
8567 case ' ': /* Page change */
8571 case '1': /* Artifacts */
8572 do_cmd_knowledge_artifacts();
8574 case '2': /* Objects */
8575 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8577 case '3': /* Uniques */
8578 do_cmd_knowledge_uniques();
8580 case '4': /* Monsters */
8581 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8583 case '5': /* Kill count */
8584 do_cmd_knowledge_kill_count();
8586 case '6': /* wanted */
8587 if (!vanilla_town) do_cmd_knowledge_kubi();
8589 case '7': /* Pets */
8590 do_cmd_knowledge_pets();
8592 case '8': /* Home */
8593 do_cmd_knowledge_home();
8595 case '9': /* Resist list */
8596 do_cmd_knowledge_inven();
8598 case '0': /* Feature list */
8600 IDX lighting_level = F_LIT_STANDARD;
8601 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8605 case 'a': /* Max stat */
8606 do_cmd_knowledge_stat();
8608 case 'b': /* Mutations */
8609 do_cmd_knowledge_mutations();
8611 case 'c': /* weapon-exp */
8612 do_cmd_knowledge_weapon_exp();
8614 case 'd': /* spell-exp */
8615 do_cmd_knowledge_spell_exp();
8617 case 'e': /* skill-exp */
8618 do_cmd_knowledge_skill_exp();
8620 case 'f': /* Virtues */
8621 do_cmd_knowledge_virtues();
8623 case 'g': /* Dungeon */
8624 do_cmd_knowledge_dungeon();
8626 case 'h': /* Quests */
8627 do_cmd_knowledge_quests();
8629 case 'i': /* Autopick */
8630 do_cmd_knowledge_autopick();
8632 default: /* Unknown option */
8636 /* Flush messages */
8640 /* Restore the screen */
8643 if (need_redraw) do_cmd_redraw();
8648 * Check on the status of an active quest
8650 void do_cmd_checkquest(void)
8652 /* File type is "TEXT" */
8653 FILE_TYPE(FILE_TYPE_TEXT);
8655 /* Save the screen */
8659 do_cmd_knowledge_quests();
8661 /* Restore the screen */
8667 * Display the time and date
8669 void do_cmd_time(void)
8671 int day, hour, min, full, start, end, num;
8679 extract_day_hour_min(&day, &hour, &min);
8681 full = hour * 100 + min;
8688 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8690 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8691 else strcpy(day_buf, "*****");
8694 msg_format("%s日目, 時刻は%d:%02d %sです。",
8695 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8696 min, (hour < 12) ? "AM" : "PM");
8698 msg_format("This is day %s. The time is %d:%02d %s.",
8699 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8700 min, (hour < 12) ? "AM" : "PM");
8705 if (!randint0(10) || p_ptr->image)
8707 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8711 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8714 /* Open this file */
8715 fff = my_fopen(buf, "rt");
8719 /* Find this time */
8720 while (!my_fgets(fff, buf, sizeof(buf)))
8722 /* Ignore comments */
8723 if (!buf[0] || (buf[0] == '#')) continue;
8725 /* Ignore invalid lines */
8726 if (buf[1] != ':') continue;
8728 /* Process 'Start' */
8731 /* Extract the starting time */
8732 start = atoi(buf + 2);
8734 /* Assume valid for an hour */
8744 /* Extract the ending time */
8745 end = atoi(buf + 2);
8751 /* Ignore incorrect range */
8752 if ((start > full) || (full > end)) continue;
8754 /* Process 'Description' */
8759 /* Apply the randomizer */
8760 if (!randint0(num)) strcpy(desc, buf + 2);
8769 /* Close the file */