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):", dun_level, d_name+d_info[dungeon_type].name);
436 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, 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, max_dlv[num]),
520 _(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, max_dlv[dungeon_type]),
544 _(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 (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
802 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
803 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
806 sprintf(nikki_title, "「%s%s%sの伝説 -%s-」",
807 ap_ptr->title, ap_ptr->no ? "の" : "", p_ptr->name, tmp);
809 sprintf(nikki_title, "Legend of %s %s '%s'",
810 ap_ptr->title, p_ptr->name, tmp);
813 /* Display the file contents */
814 show_file(FALSE, buf, nikki_title, -1, 0);
818 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
821 static void do_cmd_bunshou(void)
824 char bunshou[80] = "\0";
826 if (get_string(_("内容: ", "diary note: "), tmp, 79))
828 strcpy(bunshou, tmp);
830 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
835 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
838 static void do_cmd_last_get(void)
843 if (record_o_name[0] == '\0') return;
845 sprintf(buf,_("%sの入手を記録します。", "Do you really want to record getting %s? "),record_o_name);
846 if (!get_check(buf)) return;
850 sprintf(buf,_("%sを手に入れた。", "descover %s."), record_o_name);
851 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
856 * @brief ファイル中の全日記記録を消去する /
859 static void do_cmd_erase_nikki(void)
865 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your record? "))) return;
866 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
868 /* Build the filename */
869 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
871 /* Remove the file */
874 fff = my_fopen(buf, "w");
877 msg_format(_("記録を消去しました。", "deleted record."));
879 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
888 void do_cmd_nikki(void)
892 /* File type is "TEXT" */
893 FILE_TYPE(FILE_TYPE_TEXT);
895 /* Save the screen */
898 /* Interact until done */
904 /* Ask for a choice */
905 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
907 /* Give some choices */
908 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
909 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
910 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record item you last get/identify"), 6, 5);
911 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
913 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
916 prt(_("コマンド:", "Command: "), 18, 0);
922 if (i == ESCAPE) break;
936 do_cmd_erase_nikki();
940 prepare_movie_hooks();
942 default: /* Unknown option */
950 /* Restore the screen */
955 * @brief 画面を再描画するコマンドのメインルーチン
956 * Hack -- redraw the screen
960 * This command performs various low level updates, clears all the "extra"
961 * windows, does a total redraw of the main window, and requests all of the
962 * interesting updates and redraws that I can think of.
964 * This command is also used to "instantiate" the results of the user
965 * selecting various things, such as graphics mode, so it must call
966 * the "TERM_XTRA_REACT" hook before redrawing the windows.
969 void do_cmd_redraw(void)
976 /* Hack -- react to changes */
977 Term_xtra(TERM_XTRA_REACT, 0);
980 /* Combine and Reorder the pack (later) */
981 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
985 p_ptr->update |= (PU_TORCH);
988 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
990 /* Forget lite/view */
991 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
993 /* Update lite/view */
994 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
996 /* Update monsters */
997 p_ptr->update |= (PU_MONSTERS);
999 /* Redraw everything */
1000 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1003 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1006 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1010 /* Hack -- update */
1013 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1016 /* Redraw every window */
1017 for (j = 0; j < 8; j++)
1020 if (!angband_term[j]) continue;
1023 Term_activate(angband_term[j]);
1038 * @brief 名前を変更するコマンドのメインルーチン
1039 * Hack -- change name
1042 void do_cmd_change_name(void)
1051 /* Save the screen */
1059 /* Display the player */
1060 display_player(mode);
1065 display_player(mode);
1070 Term_putstr(2, 23, -1, TERM_WHITE,
1071 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1073 Term_putstr(2, 23, -1, TERM_WHITE,
1074 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1082 if (c == ESCAPE) break;
1089 /* Process the player name */
1090 process_player_name(FALSE);
1096 sprintf(tmp, "%s.txt", player_base);
1097 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1099 if (tmp[0] && (tmp[0] != ' '))
1101 file_character(tmp);
1118 /* Flush messages */
1122 /* Restore the screen */
1125 /* Redraw everything */
1126 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1133 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1134 * Recall the most recent message
1137 void do_cmd_message_one(void)
1139 /* Recall one message XXX XXX XXX */
1140 prt(format("> %s", message_str(0)), 0, 0);
1145 * @brief メッセージのログを表示するコマンドのメインルーチン
1146 * Recall the most recent message
1150 * Show previous messages to the user -BEN-
1152 * The screen format uses line 0 and 23 for headers and prompts,
1153 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1155 * This command shows you which commands you are viewing, and allows
1156 * you to "search" for strings in the recall.
1158 * Note that messages may be longer than 80 characters, but they are
1159 * displayed using "infinite" length, with a special sub-command to
1160 * "slide" the virtual display to the left or right.
1162 * Attempt to only hilite the matching portions of the string.
1165 void do_cmd_messages(int num_now)
1169 char shower_str[81];
1170 char finder_str[81];
1177 Term_get_size(&wid, &hgt);
1179 /* Number of message lines in a screen */
1180 num_lines = hgt - 4;
1183 strcpy(finder_str, "");
1186 strcpy(shower_str, "");
1188 /* Total messages */
1191 /* Start on first message */
1194 /* Save the screen */
1200 /* Process requests until done */
1206 /* Dump up to 20 lines of messages */
1207 for (j = 0; (j < num_lines) && (i + j < n); j++)
1209 cptr msg = message_str(i+j);
1211 /* Dump the messages, bottom to top */
1212 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1214 /* Hilite "shower" */
1215 if (shower && shower[0])
1219 /* Display matches */
1220 while ((str = my_strstr(str, shower)) != NULL)
1222 int len = strlen(shower);
1224 /* Display the match */
1225 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1233 /* Erase remaining lines */
1234 for (; j < num_lines; j++)
1236 Term_erase(0, num_lines + 1 - j, 255);
1239 /* Display header XXX XXX XXX */
1241 prt(format(_("以前のメッセージ %d-%d 全部で(%d)", "Message Recall (%d-%d of %d)"),
1242 i, i + j - 1, n), 0, 0);
1244 /* Display prompt (not very informative) */
1245 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1246 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1249 skey = inkey_special(TRUE);
1251 /* Exit on Escape */
1252 if (skey == ESCAPE) break;
1254 /* Hack -- Save the old index */
1259 /* Hack -- handle show */
1262 prt(_("強調: ", "Show: "), hgt - 1, 0);
1264 /* Get a "shower" string, or continue */
1265 strcpy(back_str, shower_str);
1266 if (askfor(shower_str, 80))
1269 shower = shower_str[0] ? shower_str : NULL;
1271 else strcpy(shower_str, back_str);
1276 /* Hack -- handle find */
1283 prt(_("検索: ", "Find: "), hgt - 1, 0);
1285 /* Get a "finder" string, or continue */
1286 strcpy(back_str, finder_str);
1287 if (!askfor(finder_str, 80))
1289 strcpy(finder_str, back_str);
1292 else if (!finder_str[0])
1294 shower = NULL; /* Stop showing */
1299 shower = finder_str;
1302 for (z = i + 1; z < n; z++)
1304 cptr msg = message_str(z);
1307 if (my_strstr(msg, finder_str))
1319 /* Recall 1 older message */
1321 /* Go to the oldest line */
1325 /* Recall 1 newer message */
1327 /* Go to the newest line */
1331 /* Recall 1 older message */
1336 /* Go older if legal */
1337 i = MIN(i + 1, n - num_lines);
1340 /* Recall 10 older messages */
1342 /* Go older if legal */
1343 i = MIN(i + 10, n - num_lines);
1346 /* Recall 20 older messages */
1351 /* Go older if legal */
1352 i = MIN(i + num_lines, n - num_lines);
1355 /* Recall 20 newer messages */
1359 /* Go newer (if able) */
1360 i = MAX(0, i - num_lines);
1363 /* Recall 10 newer messages */
1365 /* Go newer (if able) */
1369 /* Recall 1 newer messages */
1372 /* Go newer (if able) */
1377 /* Hack -- Error of some kind */
1381 /* Restore the screen */
1388 * チートオプションの最大数 / Number of cheating options
1393 * チーとオプションの定義テーブル / Cheating options
1395 static option_type cheat_info[CHEAT_MAX] =
1397 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1398 "cheat_peek", _("アイテムの生成をのぞき見る", "Peek into object creation")
1401 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1402 "cheat_hear", _("モンスターの生成をのぞき見る", "Peek into monster creation")
1405 { &cheat_room, FALSE, 255, 0x04, 0x00,
1406 "cheat_room", _("ダンジョンの生成をのぞき見る", "Peek into dungeon creation")
1409 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1410 "cheat_xtra", _("その他の事をのぞき見る", "Peek into something else")
1413 { &cheat_know, FALSE, 255, 0x10, 0x00,
1414 "cheat_know", _("完全なモンスターの思い出を知る", "Know complete monster info")
1417 { &cheat_live, FALSE, 255, 0x20, 0x00,
1418 "cheat_live", _("死を回避することを可能にする", "Allow player to avoid death")
1421 { &cheat_save, FALSE, 255, 0x40, 0x00,
1422 "cheat_save", _("死んだ時セーブするか確認する", "Ask for saving death")
1425 { &cheat_diary_output, FALSE, 255, 0x80, 0x00,
1426 "cheat_diary_output", _("ウィザードログを日記に出力する", "Output wizard log to diary.")
1433 * @brief チートオプションを変更するコマンドのメインルーチン
1434 * Interact with some options for cheating
1435 * @param info 表示メッセージ
1438 static void do_cmd_options_cheat(cptr info)
1442 int i, k = 0, n = CHEAT_MAX;
1450 /* Interact with the player */
1455 /* Prompt XXX XXX XXX */
1456 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1461 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1462 prt(" << 注意 >>", 11, 0);
1463 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1464 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1465 prt(" じらないようにして下さい。", 14, 0);
1467 /* Display the options */
1468 for (i = 0; i < n; i++)
1470 byte a = TERM_WHITE;
1472 /* Color current option */
1473 if (i == k) a = TERM_L_BLUE;
1475 /* Display the option text */
1476 sprintf(buf, "%-48s: %s (%s)",
1477 cheat_info[i].o_desc,
1478 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1479 cheat_info[i].o_text);
1480 c_prt(a, buf, i + 2, 0);
1483 /* Hilite current option */
1484 move_cursor(k + 2, 50);
1490 * HACK - Try to translate the key into a direction
1491 * to allow using the roguelike keys for navigation.
1493 dir = get_keymap_dir(ch);
1494 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1508 k = (n + k - 1) % n;
1526 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1527 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1528 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1529 (*cheat_info[k].o_var) = TRUE;
1538 (*cheat_info[k].o_var) = FALSE;
1545 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1546 /* Peruse the help file */
1547 (void)show_file(TRUE, buf, NULL, 0, 0);
1566 static option_type autosave_info[2] =
1568 { &autosave_l, FALSE, 255, 0x01, 0x00,
1569 "autosave_l", _("新しい階に入る度に自動セーブする", "Autosave when entering new levels") },
1571 { &autosave_t, FALSE, 255, 0x02, 0x00,
1572 "autosave_t", _("一定ターン毎に自動セーブする", "Timed autosave") },
1576 * @brief セーブ頻度ターンの次の値を返す
1577 * @param current 現在のセーブ頻度ターン値
1578 * @return 次のセーブ頻度ターン値
1580 static s16b toggle_frequency(s16b current)
1585 case 50: return 100;
1586 case 100: return 250;
1587 case 250: return 500;
1588 case 500: return 1000;
1589 case 1000: return 2500;
1590 case 2500: return 5000;
1591 case 5000: return 10000;
1592 case 10000: return 25000;
1599 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1600 * @param info 表示メッセージ
1603 static void do_cmd_options_autosave(cptr info)
1607 int i, k = 0, n = 2;
1615 /* Interact with the player */
1618 /* Prompt XXX XXX XXX */
1619 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1620 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1624 /* Display the options */
1625 for (i = 0; i < n; i++)
1627 byte a = TERM_WHITE;
1629 /* Color current option */
1630 if (i == k) a = TERM_L_BLUE;
1632 /* Display the option text */
1633 sprintf(buf, "%-48s: %s (%s)",
1634 autosave_info[i].o_desc,
1635 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1636 autosave_info[i].o_text);
1637 c_prt(a, buf, i + 2, 0);
1639 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1641 /* Hilite current option */
1642 move_cursor(k + 2, 50);
1658 k = (n + k - 1) % n;
1676 (*autosave_info[k].o_var) = TRUE;
1685 (*autosave_info[k].o_var) = FALSE;
1693 autosave_freq = toggle_frequency(autosave_freq);
1694 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1700 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1716 * @brief 標準オプションを変更するコマンドのサブルーチン /
1717 * Interact with some options
1718 * @param page オプションページ番号
1719 * @param info 表示メッセージ
1722 void do_cmd_options_aux(int page, cptr info)
1725 int i, k = 0, n = 0, l;
1728 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1729 (!p_ptr->wizard || !allow_debug_opts);
1732 /* Lookup the options */
1733 for (i = 0; i < 24; i++) opt[i] = 0;
1735 /* Scan the options */
1736 for (i = 0; option_info[i].o_desc; i++)
1738 /* Notice options on this "page" */
1739 if (option_info[i].o_page == page) opt[n++] = i;
1746 /* Interact with the player */
1751 /* Prompt XXX XXX XXX */
1752 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1753 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1756 /* HACK -- description for easy-auto-destroy options */
1757 if (page == OPT_PAGE_AUTODESTROY)
1758 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1759 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1761 /* Display the options */
1762 for (i = 0; i < n; i++)
1764 byte a = TERM_WHITE;
1766 /* Color current option */
1767 if (i == k) a = TERM_L_BLUE;
1769 /* Display the option text */
1770 sprintf(buf, "%-48s: %s (%.19s)",
1771 option_info[opt[i]].o_desc,
1772 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1773 option_info[opt[i]].o_text);
1774 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1775 else c_prt(a, buf, i + 2, 0);
1778 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1781 /* Hilite current option */
1782 move_cursor(k + 2 + l, 50);
1788 * HACK - Try to translate the key into a direction
1789 * to allow using the roguelike keys for navigation.
1791 dir = get_keymap_dir(ch);
1792 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1806 k = (n + k - 1) % n;
1823 if (browse_only) break;
1824 (*option_info[opt[k]].o_var) = TRUE;
1833 if (browse_only) break;
1834 (*option_info[opt[k]].o_var) = FALSE;
1842 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1848 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1849 /* Peruse the help file */
1850 (void)show_file(TRUE, buf, NULL, 0, 0);
1867 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1868 * Modify the "window" options
1871 static void do_cmd_options_win(void)
1881 /* Memorize old flags */
1882 for (j = 0; j < 8; j++)
1884 /* Acquire current flags */
1885 old_flag[j] = window_flag[j];
1895 /* Prompt XXX XXX XXX */
1896 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1898 /* Display the windows */
1899 for (j = 0; j < 8; j++)
1901 byte a = TERM_WHITE;
1903 cptr s = angband_term_name[j];
1906 if (j == x) a = TERM_L_BLUE;
1908 /* Window name, staggered, centered */
1909 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1912 /* Display the options */
1913 for (i = 0; i < 16; i++)
1915 byte a = TERM_WHITE;
1917 cptr str = window_flag_desc[i];
1920 if (i == y) a = TERM_L_BLUE;
1923 if (!str) str = _("(未使用)", "(Unused option)");
1926 Term_putstr(0, i + 5, -1, a, str);
1928 /* Display the windows */
1929 for (j = 0; j < 8; j++)
1935 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1938 if (window_flag[j] & (1L << i)) c = 'X';
1941 Term_putch(35 + j * 5, i + 5, a, c);
1946 Term_gotoxy(35 + x * 5, y + 5);
1964 for (j = 0; j < 8; j++)
1966 window_flag[j] &= ~(1L << y);
1970 for (i = 0; i < 16; i++)
1972 window_flag[x] &= ~(1L << i);
1985 window_flag[x] |= (1L << y);
1993 window_flag[x] &= ~(1L << y);
1999 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
2007 d = get_keymap_dir(ch);
2009 x = (x + ddx[d] + 8) % 8;
2010 y = (y + ddy[d] + 16) % 16;
2017 /* Notice changes */
2018 for (j = 0; j < 8; j++)
2023 if (!angband_term[j]) continue;
2025 /* Ignore non-changes */
2026 if (window_flag[j] == old_flag[j]) continue;
2029 Term_activate(angband_term[j]);
2052 option_fields[OPT_NUM] =
2055 { '1', " キー入力 オプション", 3 },
2056 { '2', " マップ画面 オプション", 4 },
2057 { '3', " テキスト表示 オプション", 5 },
2058 { '4', " ゲームプレイ オプション", 6 },
2059 { '5', " 行動中止関係 オプション", 7 },
2060 { '6', " 簡易自動破壊 オプション", 8 },
2061 { 'r', " プレイ記録 オプション", 9 },
2063 { 'p', "自動拾いエディタ", 11 },
2064 { 'd', " 基本ウェイト量 ", 12 },
2065 { 'h', "低ヒットポイント", 13 },
2066 { 'm', " 低魔力色閾値 ", 14 },
2067 { 'a', " 自動セーブ オプション", 15 },
2068 { 'w', "ウインドウフラグ", 16 },
2070 { 'b', " 初期 オプション (参照のみ)", 18 },
2071 { 'c', " 詐欺 オプション", 19 },
2073 { '1', "Input Options", 3 },
2074 { '2', "Map Screen Options", 4 },
2075 { '3', "Text Display Options", 5 },
2076 { '4', "Game-Play Options", 6 },
2077 { '5', "Disturbance Options", 7 },
2078 { '6', "Easy Auto-Destroyer Options", 8 },
2079 { 'r', "Play record Options", 9 },
2081 { 'p', "Auto-picker/destroyer editor", 11 },
2082 { 'd', "Base Delay Factor", 12 },
2083 { 'h', "Hitpoint Warning", 13 },
2084 { 'm', "Mana Color Threshold", 14 },
2085 { 'a', "Autosave Options", 15 },
2086 { 'w', "Window Flags", 16 },
2088 { 'b', "Birth Options (Browse Only)", 18 },
2089 { 'c', "Cheat Options", 19 },
2095 * @brief 標準オプションを変更するコマンドのメインルーチン /
2096 * Set or unset various options.
2100 * The user must use the "Ctrl-R" command to "adapt" to changes
2101 * in any options which control "visual" aspects of the game.
2104 void do_cmd_options(void)
2110 /* Save the screen */
2118 /* Does not list cheat option when cheat option is off */
2119 if (!p_ptr->noscore && !allow_debug_opts) n--;
2124 /* Why are we here */
2125 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2129 /* Give some choices */
2130 for (i = 0; i < n; i++)
2132 byte a = TERM_WHITE;
2133 if (i == y) a = TERM_L_BLUE;
2134 Term_putstr(5, option_fields[i].row, -1, a,
2135 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2138 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2141 skey = inkey_special(TRUE);
2142 if (!(skey & SKEY_MASK)) k = (char)skey;
2146 if (k == ESCAPE) break;
2148 if (my_strchr("\n\r ", k))
2150 k = option_fields[y].key;
2154 for (i = 0; i < n; i++)
2156 if (tolower(k) == option_fields[i].key) break;
2159 /* Command is found */
2162 /* Hack -- browse help */
2163 if (k == '?') break;
2167 if (skey == SKEY_UP) d = 8;
2168 if (skey == SKEY_DOWN) d = 2;
2169 y = (y + ddy[d] + n) % n;
2174 if (k == ESCAPE) break;
2181 /* Process the general options */
2182 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2188 /* Process the general options */
2189 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2196 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2203 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2210 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2217 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2221 /* Play-record Options */
2226 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2235 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2236 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2237 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2241 /* Cheating Options */
2244 if (!p_ptr->noscore && !allow_debug_opts)
2246 /* Cheat options are not permitted */
2252 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2259 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2268 do_cmd_options_win();
2269 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2270 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2271 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2272 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2277 /* Auto-picker/destroyer editor */
2281 do_cmd_edit_autopick();
2285 /* Hack -- Delay Speed */
2291 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2293 /* Get a new value */
2296 int msec = delay_factor * delay_factor * delay_factor;
2297 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2298 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2300 if (k == ESCAPE) break;
2303 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2306 else if (isdigit(k)) delay_factor = D2I(k);
2313 /* Hack -- hitpoint warning factor */
2319 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2321 /* Get a new value */
2324 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2325 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2327 if (k == ESCAPE) break;
2330 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2333 else if (isdigit(k)) hitpoint_warn = D2I(k);
2340 /* Hack -- mana color factor */
2346 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2348 /* Get a new value */
2351 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2352 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2354 if (k == ESCAPE) break;
2357 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2360 else if (isdigit(k)) mana_warn = D2I(k);
2368 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2372 /* Unknown option */
2381 /* Flush messages */
2386 /* Restore the screen */
2389 /* Hack - Redraw equippy chars */
2390 p_ptr->redraw |= (PR_EQUIPPY);
2396 * @brief prefファイルを選択して処理する /
2397 * Ask for a "user pref line" and process it
2400 * XXX XXX XXX Allow absolute file names?
2402 void do_cmd_pref(void)
2409 /* Ask for a "user pref command" */
2410 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2412 /* Process that pref command */
2413 (void)process_pref_file_command(buf);
2417 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2420 void do_cmd_reload_autopick(void)
2422 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2423 /* Load the file with messages */
2424 autopick_load_pref(TRUE);
2430 * @brief マクロ情報をprefファイルに保存する /
2431 * @param fname ファイル名
2434 static errr macro_dump(cptr fname)
2436 static cptr mark = "Macro Dump";
2442 /* Build the filename */
2443 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2445 /* File type is "TEXT" */
2446 FILE_TYPE(FILE_TYPE_TEXT);
2448 /* Append to the file */
2449 if (!open_auto_dump(buf, mark)) return (-1);
2452 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2455 for (i = 0; i < macro__num; i++)
2457 /* Extract the action */
2458 ascii_to_text(buf, macro__act[i]);
2460 /* Dump the macro */
2461 auto_dump_printf("A:%s\n", buf);
2463 /* Extract the action */
2464 ascii_to_text(buf, macro__pat[i]);
2466 /* Dump normal macros */
2467 auto_dump_printf("P:%s\n", buf);
2470 auto_dump_printf("\n");
2482 * @brief マクロのトリガーキーを取得する /
2483 * Hack -- ask for a "trigger" (see below)
2484 * @param buf キー表記を保管するバッファ
2488 * Note the complex use of the "inkey()" function from "util.c".
2490 * Note that both "flush()" calls are extremely important.
2493 static void do_cmd_macro_aux(char *buf)
2503 /* Do not process macros */
2509 /* Read the pattern */
2515 /* Do not process macros */
2518 /* Do not wait for keys */
2521 /* Attempt to read a key */
2532 /* Convert the trigger */
2533 ascii_to_text(tmp, buf);
2535 /* Hack -- display the trigger */
2536 Term_addstr(-1, TERM_WHITE, tmp);
2542 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2543 * Hack -- ask for a keymap "trigger" (see below)
2544 * @param buf キー表記を取得するバッファ
2548 * Note that both "flush()" calls are extremely important. This may
2549 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2552 static void do_cmd_macro_aux_keymap(char *buf)
2566 /* Convert to ascii */
2567 ascii_to_text(tmp, buf);
2569 /* Hack -- display the trigger */
2570 Term_addstr(-1, TERM_WHITE, tmp);
2579 * @brief キーマップをprefファイルにダンプする /
2580 * Hack -- append all keymaps to the given file
2581 * @param fname ファイルネーム
2585 static errr keymap_dump(cptr fname)
2587 static cptr mark = "Keymap Dump";
2596 if (rogue_like_commands)
2598 mode = KEYMAP_MODE_ROGUE;
2604 mode = KEYMAP_MODE_ORIG;
2608 /* Build the filename */
2609 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2611 /* File type is "TEXT" */
2612 FILE_TYPE(FILE_TYPE_TEXT);
2614 /* Append to the file */
2615 if (!open_auto_dump(buf, mark)) return -1;
2618 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2621 for (i = 0; i < 256; i++)
2625 /* Loop up the keymap */
2626 act = keymap_act[mode][i];
2628 /* Skip empty keymaps */
2631 /* Encode the key */
2634 ascii_to_text(key, buf);
2636 /* Encode the action */
2637 ascii_to_text(buf, act);
2639 /* Dump the macro */
2640 auto_dump_printf("A:%s\n", buf);
2641 auto_dump_printf("C:%d:%s\n", mode, key);
2653 * @brief マクロを設定するコマンドのメインルーチン /
2654 * Interact with "macros"
2658 * Note that the macro "action" must be defined before the trigger.
2660 * Could use some helpful instructions on this page. XXX XXX XXX
2663 void do_cmd_macros(void)
2675 if (rogue_like_commands)
2677 mode = KEYMAP_MODE_ROGUE;
2683 mode = KEYMAP_MODE_ORIG;
2686 /* File type is "TEXT" */
2687 FILE_TYPE(FILE_TYPE_TEXT);
2694 /* Process requests until done */
2701 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2703 /* Describe that action */
2704 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2706 /* Analyze the current action */
2707 ascii_to_text(buf, macro__buf);
2709 /* Display the current action */
2714 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2716 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2717 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2718 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2719 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2720 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2721 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2722 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2723 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2724 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2725 #endif /* ALLOW_MACROS */
2728 prt(_("コマンド: ", "Command: "), 16, 0);
2734 if (i == ESCAPE) break;
2736 /* Load a 'macro' file */
2742 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2745 prt(_("ファイル: ", "File: "), 18, 0);
2747 /* Default filename */
2748 sprintf(tmp, "%s.prf", player_base);
2750 /* Ask for a file */
2751 if (!askfor(tmp, 80)) continue;
2753 /* Process the given filename */
2754 err = process_pref_file(tmp);
2757 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2762 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2766 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2776 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2779 prt(_("ファイル: ", "File: "), 18, 0);
2781 /* Default filename */
2782 sprintf(tmp, "%s.prf", player_base);
2784 /* Ask for a file */
2785 if (!askfor(tmp, 80)) continue;
2787 /* Dump the macros */
2788 (void)macro_dump(tmp);
2791 msg_print(_("マクロを追加しました。", "Appended macros."));
2800 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2804 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2806 /* Get a macro trigger */
2807 do_cmd_macro_aux(buf);
2809 /* Acquire action */
2810 k = macro_find_exact(buf);
2816 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2822 /* Obtain the action */
2823 strcpy(macro__buf, macro__act[k]);
2825 /* Analyze the current action */
2826 ascii_to_text(buf, macro__buf);
2828 /* Display the current action */
2832 msg_print(_("マクロを確認しました。", "Found a macro."));
2836 /* Create a macro */
2840 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2843 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2845 /* Get a macro trigger */
2846 do_cmd_macro_aux(buf);
2852 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2853 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2856 prt(_("マクロ行動: ", "Action: "), 20, 0);
2858 /* Convert to text */
2859 ascii_to_text(tmp, macro__buf);
2861 /* Get an encoded action */
2862 if (askfor(tmp, 80))
2864 /* Convert to ascii */
2865 text_to_ascii(macro__buf, tmp);
2867 /* Link the macro */
2868 macro_add(buf, macro__buf);
2871 msg_print(_("マクロを追加しました。", "Added a macro."));
2875 /* Remove a macro */
2879 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2882 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2884 /* Get a macro trigger */
2885 do_cmd_macro_aux(buf);
2887 /* Link the macro */
2888 macro_add(buf, buf);
2891 msg_print(_("マクロを削除しました。", "Removed a macro."));
2898 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2901 prt(_("ファイル: ", "File: "), 18, 0);
2903 /* Default filename */
2904 sprintf(tmp, "%s.prf", player_base);
2906 /* Ask for a file */
2907 if (!askfor(tmp, 80)) continue;
2909 /* Dump the macros */
2910 (void)keymap_dump(tmp);
2913 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2916 /* Query a keymap */
2922 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2925 prt(_("押すキー: ", "Keypress: "), 18, 0);
2927 /* Get a keymap trigger */
2928 do_cmd_macro_aux_keymap(buf);
2930 /* Look up the keymap */
2931 act = keymap_act[mode][(byte)(buf[0])];
2937 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2943 /* Obtain the action */
2944 strcpy(macro__buf, act);
2946 /* Analyze the current action */
2947 ascii_to_text(buf, macro__buf);
2949 /* Display the current action */
2953 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2957 /* Create a keymap */
2961 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2964 prt(_("押すキー: ", "Keypress: "), 18, 0);
2966 /* Get a keymap trigger */
2967 do_cmd_macro_aux_keymap(buf);
2973 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2974 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2977 prt(_("行動: ", "Action: "), 20, 0);
2979 /* Convert to text */
2980 ascii_to_text(tmp, macro__buf);
2982 /* Get an encoded action */
2983 if (askfor(tmp, 80))
2985 /* Convert to ascii */
2986 text_to_ascii(macro__buf, tmp);
2988 /* Free old keymap */
2989 string_free(keymap_act[mode][(byte)(buf[0])]);
2991 /* Make new keymap */
2992 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2995 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2999 /* Remove a keymap */
3003 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
3006 prt(_("押すキー: ", "Keypress: "), 18, 0);
3008 /* Get a keymap trigger */
3009 do_cmd_macro_aux_keymap(buf);
3011 /* Free old keymap */
3012 string_free(keymap_act[mode][(byte)(buf[0])]);
3014 /* Make new keymap */
3015 keymap_act[mode][(byte)(buf[0])] = NULL;
3018 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
3021 /* Enter a new action */
3025 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
3031 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
3032 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
3035 prt(_("マクロ行動: ", "Action: "), 20, 0);
3037 /* Hack -- limit the value */
3040 /* Get an encoded action */
3041 if (!askfor(buf, 80)) continue;
3043 /* Extract an action */
3044 text_to_ascii(macro__buf, buf);
3047 #endif /* ALLOW_MACROS */
3056 /* Flush messages */
3065 * @brief キャラクタ色の明暗表現
3067 static cptr lighting_level_str[F_LIT_MAX] =
3082 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
3083 * @param i 指定対象となるキャラクタコード
3084 * @param num 指定されたビジュアルIDを返す参照ポインタ
3085 * @param max ビジュアルIDの最大数
3086 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
3088 static bool cmd_visuals_aux(int i, int *num, int max)
3095 sprintf(str, "%d", *num);
3097 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3100 tmp = strtol(str, NULL, 0);
3101 if (tmp >= 0 && tmp < max)
3104 else if (isupper(i))
3105 *num = (*num + max - 1) % max;
3107 *num = (*num + 1) % max;
3113 * @brief キャラクタの変更メニュー表示
3114 * @param choice_msg 選択メッセージ
3117 static void print_visuals_menu(cptr choice_msg)
3119 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3121 /* Give some choices */
3122 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3124 #ifdef ALLOW_VISUALS
3125 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3126 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3127 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3128 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3129 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3130 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3131 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3132 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3133 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3134 #endif /* ALLOW_VISUALS */
3136 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3139 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3142 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx);
3143 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx);
3144 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level);
3147 * Interact with "visuals"
3149 void do_cmd_visuals(void)
3154 bool need_redraw = FALSE;
3155 const char *empty_symbol = "<< ? >>";
3157 if (use_bigtile) empty_symbol = "<< ?? >>";
3159 /* File type is "TEXT" */
3160 FILE_TYPE(FILE_TYPE_TEXT);
3162 /* Save the screen */
3165 /* Interact until done */
3171 /* Ask for a choice */
3172 print_visuals_menu(NULL);
3178 if (i == ESCAPE) break;
3182 /* Load a 'pref' file */
3185 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3188 prt(_("ファイル: ", "File: "), 17, 0);
3190 /* Default filename */
3191 sprintf(tmp, "%s.prf", player_base);
3194 if (!askfor(tmp, 70)) continue;
3196 /* Process the given filename */
3197 (void)process_pref_file(tmp);
3202 #ifdef ALLOW_VISUALS
3204 /* Dump monster attr/chars */
3207 static cptr mark = "Monster attr/chars";
3210 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3213 prt(_("ファイル: ", "File: "), 17, 0);
3215 /* Default filename */
3216 sprintf(tmp, "%s.prf", player_base);
3218 /* Get a filename */
3219 if (!askfor(tmp, 70)) continue;
3221 /* Build the filename */
3222 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3224 /* Append to the file */
3225 if (!open_auto_dump(buf, mark)) continue;
3228 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3231 for (i = 0; i < max_r_idx; i++)
3233 monster_race *r_ptr = &r_info[i];
3235 /* Skip non-entries */
3236 if (!r_ptr->name) continue;
3238 /* Dump a comment */
3239 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3241 /* Dump the monster attr/char info */
3242 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3243 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3250 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3255 /* Dump object attr/chars */
3258 static cptr mark = "Object attr/chars";
3261 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3264 prt(_("ファイル: ", "File: "), 17, 0);
3266 /* Default filename */
3267 sprintf(tmp, "%s.prf", player_base);
3269 /* Get a filename */
3270 if (!askfor(tmp, 70)) continue;
3272 /* Build the filename */
3273 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3275 /* Append to the file */
3276 if (!open_auto_dump(buf, mark)) continue;
3279 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3282 for (i = 0; i < max_k_idx; i++)
3285 object_kind *k_ptr = &k_info[i];
3287 /* Skip non-entries */
3288 if (!k_ptr->name) continue;
3293 strip_name(o_name, i);
3299 /* Prepare dummy object */
3300 object_prep(&forge, i);
3302 /* Get un-shuffled flavor name */
3303 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3306 /* Dump a comment */
3307 auto_dump_printf("# %s\n", o_name);
3309 /* Dump the object attr/char info */
3310 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3311 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3318 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3323 /* Dump feature attr/chars */
3326 static cptr mark = "Feature attr/chars";
3329 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3332 prt(_("ファイル: ", "File: "), 17, 0);
3334 /* Default filename */
3335 sprintf(tmp, "%s.prf", player_base);
3337 /* Get a filename */
3338 if (!askfor(tmp, 70)) continue;
3340 /* Build the filename */
3341 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3343 /* Append to the file */
3344 if (!open_auto_dump(buf, mark)) continue;
3347 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3350 for (i = 0; i < max_f_idx; i++)
3352 feature_type *f_ptr = &f_info[i];
3354 /* Skip non-entries */
3355 if (!f_ptr->name) continue;
3357 /* Skip mimiccing features */
3358 if (f_ptr->mimic != i) continue;
3360 /* Dump a comment */
3361 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3363 /* Dump the feature attr/char info */
3364 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3365 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3366 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3367 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3374 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3379 /* Modify monster attr/chars (numeric operation) */
3382 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3385 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3387 /* Hack -- query until done */
3390 monster_race *r_ptr = &r_info[r];
3394 byte da = r_ptr->d_attr;
3395 byte dc = r_ptr->d_char;
3396 byte ca = r_ptr->x_attr;
3397 byte cc = r_ptr->x_char;
3399 /* Label the object */
3400 Term_putstr(5, 17, -1, TERM_WHITE,
3401 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3403 /* Label the Default values */
3404 Term_putstr(10, 19, -1, TERM_WHITE,
3405 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3407 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3408 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3410 /* Label the Current values */
3411 Term_putstr(10, 20, -1, TERM_WHITE,
3412 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3414 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3415 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3418 Term_putstr(0, 22, -1, TERM_WHITE,
3419 _("コマンド (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): "));
3425 if (i == ESCAPE) break;
3427 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3428 else if (isupper(i)) c = 'a' + i - 'A';
3438 if (!cmd_visuals_aux(i, &r, max_r_idx))
3444 while (!r_info[r].name);
3448 t = (int)r_ptr->x_attr;
3449 (void)cmd_visuals_aux(i, &t, 256);
3450 r_ptr->x_attr = (byte)t;
3454 t = (int)r_ptr->x_char;
3455 (void)cmd_visuals_aux(i, &t, 256);
3456 r_ptr->x_char = (byte)t;
3460 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3464 print_visuals_menu(choice_msg);
3472 /* Modify object attr/chars (numeric operation) */
3475 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3477 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3479 /* Hack -- query until done */
3482 object_kind *k_ptr = &k_info[k];
3486 byte da = k_ptr->d_attr;
3487 byte dc = k_ptr->d_char;
3488 byte ca = k_ptr->x_attr;
3489 byte cc = k_ptr->x_char;
3491 /* Label the object */
3492 Term_putstr(5, 17, -1, TERM_WHITE,
3493 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3494 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3496 /* Label the Default values */
3497 Term_putstr(10, 19, -1, TERM_WHITE,
3498 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3500 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3501 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3503 /* Label the Current values */
3504 Term_putstr(10, 20, -1, TERM_WHITE,
3505 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3507 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3508 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3511 Term_putstr(0, 22, -1, TERM_WHITE,
3512 _("コマンド (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): "));
3518 if (i == ESCAPE) break;
3520 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3521 else if (isupper(i)) c = 'a' + i - 'A';
3531 if (!cmd_visuals_aux(i, &k, max_k_idx))
3537 while (!k_info[k].name);
3541 t = (int)k_ptr->x_attr;
3542 (void)cmd_visuals_aux(i, &t, 256);
3543 k_ptr->x_attr = (byte)t;
3547 t = (int)k_ptr->x_char;
3548 (void)cmd_visuals_aux(i, &t, 256);
3549 k_ptr->x_char = (byte)t;
3553 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3557 print_visuals_menu(choice_msg);
3565 /* Modify feature attr/chars (numeric operation) */
3568 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3570 static int lighting_level = F_LIT_STANDARD;
3571 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3573 /* Hack -- query until done */
3576 feature_type *f_ptr = &f_info[f];
3580 byte da = f_ptr->d_attr[lighting_level];
3581 byte dc = f_ptr->d_char[lighting_level];
3582 byte ca = f_ptr->x_attr[lighting_level];
3583 byte cc = f_ptr->x_char[lighting_level];
3585 /* Label the object */
3587 Term_putstr(5, 17, -1, TERM_WHITE,
3588 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3589 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3591 /* Label the Default values */
3592 Term_putstr(10, 19, -1, TERM_WHITE,
3593 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3595 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3596 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3598 /* Label the Current values */
3600 Term_putstr(10, 20, -1, TERM_WHITE,
3601 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3603 Term_putstr(10, 20, -1, TERM_WHITE,
3604 format("Current attr/char = %3d / %3d", ca, cc));
3607 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3608 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3612 Term_putstr(0, 22, -1, TERM_WHITE,
3613 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3615 Term_putstr(0, 22, -1, TERM_WHITE,
3616 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3623 if (i == ESCAPE) break;
3625 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3626 else if (isupper(i)) c = 'a' + i - 'A';
3636 if (!cmd_visuals_aux(i, &f, max_f_idx))
3642 while (!f_info[f].name || (f_info[f].mimic != f));
3646 t = (int)f_ptr->x_attr[lighting_level];
3647 (void)cmd_visuals_aux(i, &t, 256);
3648 f_ptr->x_attr[lighting_level] = (byte)t;
3652 t = (int)f_ptr->x_char[lighting_level];
3653 (void)cmd_visuals_aux(i, &t, 256);
3654 f_ptr->x_char[lighting_level] = (byte)t;
3658 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3661 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3665 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3669 print_visuals_menu(choice_msg);
3677 /* Modify monster attr/chars (visual mode) */
3679 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3682 /* Modify object attr/chars (visual mode) */
3684 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3687 /* Modify feature attr/chars (visual mode) */
3690 int lighting_level = F_LIT_STANDARD;
3691 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3695 #endif /* ALLOW_VISUALS */
3704 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3708 /* Unknown option */
3714 /* Flush messages */
3718 /* Restore the screen */
3721 if (need_redraw) do_cmd_redraw();
3726 * Interact with "colors"
3728 void do_cmd_colors(void)
3737 /* File type is "TEXT" */
3738 FILE_TYPE(FILE_TYPE_TEXT);
3741 /* Save the screen */
3745 /* Interact until done */
3751 /* Ask for a choice */
3752 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3754 /* Give some choices */
3755 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3758 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3759 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3763 prt(_("コマンド: ", "Command: "), 8, 0);
3768 if (i == ESCAPE) break;
3770 /* Load a 'pref' file */
3774 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3777 prt(_("ファイル: ", "File: "), 10, 0);
3780 sprintf(tmp, "%s.prf", player_base);
3783 if (!askfor(tmp, 70)) continue;
3785 /* Process the given filename */
3786 (void)process_pref_file(tmp);
3788 /* Mega-Hack -- react to changes */
3789 Term_xtra(TERM_XTRA_REACT, 0);
3791 /* Mega-Hack -- redraw */
3800 static cptr mark = "Colors";
3803 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3806 prt(_("ファイル: ", "File: "), 10, 0);
3808 /* Default filename */
3809 sprintf(tmp, "%s.prf", player_base);
3811 /* Get a filename */
3812 if (!askfor(tmp, 70)) continue;
3814 /* Build the filename */
3815 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3817 /* Append to the file */
3818 if (!open_auto_dump(buf, mark)) continue;
3821 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3824 for (i = 0; i < 256; i++)
3826 int kv = angband_color_table[i][0];
3827 int rv = angband_color_table[i][1];
3828 int gv = angband_color_table[i][2];
3829 int bv = angband_color_table[i][3];
3831 cptr name = _("未知", "unknown");
3833 /* Skip non-entries */
3834 if (!kv && !rv && !gv && !bv) continue;
3836 /* Extract the color name */
3837 if (i < 16) name = color_names[i];
3839 /* Dump a comment */
3840 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3842 /* Dump the monster attr/char info */
3843 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3851 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3860 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3862 /* Hack -- query until done */
3871 /* Exhibit the normal colors */
3872 for (j = 0; j < 16; j++)
3874 /* Exhibit this color */
3875 Term_putstr(j*4, 20, -1, a, "###");
3877 /* Exhibit all colors */
3878 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3881 /* Describe the color */
3882 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3884 /* Describe the color */
3885 Term_putstr(5, 10, -1, TERM_WHITE,
3886 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3888 /* Label the Current values */
3889 Term_putstr(5, 12, -1, TERM_WHITE,
3890 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3891 angband_color_table[a][0],
3892 angband_color_table[a][1],
3893 angband_color_table[a][2],
3894 angband_color_table[a][3]));
3897 Term_putstr(0, 14, -1, TERM_WHITE,
3898 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3905 if (i == ESCAPE) break;
3908 if (i == 'n') a = (byte)(a + 1);
3909 if (i == 'N') a = (byte)(a - 1);
3910 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3911 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3912 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3913 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3914 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3915 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3916 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3917 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3919 /* Hack -- react to changes */
3920 Term_xtra(TERM_XTRA_REACT, 0);
3922 /* Hack -- redraw */
3929 /* Unknown option */
3935 /* Flush messages */
3940 /* Restore the screen */
3946 * Note something in the message recall
3948 void do_cmd_note(void)
3956 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3958 /* Ignore empty notes */
3959 if (!buf[0] || (buf[0] == ' ')) return;
3961 /* Add the note to the message recall */
3962 msg_format(_("メモ: %s", "Note: %s"), buf);
3967 * Mention the current version
3969 void do_cmd_version(void)
3973 #if FAKE_VER_EXTRA > 0
3974 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3975 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3977 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3978 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3985 * Array of feeling strings
3987 static cptr do_cmd_feeling_text[11] =
3989 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3990 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3991 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3992 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3993 _("とても悪い予感がする...", "You have a very bad feeling..."),
3994 _("悪い予感がする...", "You have a bad feeling..."),
3995 _("何か緊張する。", "You feel nervous."),
3996 _("少し不運な気がする...", "You feel your luck is turning..."),
3997 _("この場所は好きになれない。", "You don't like the look of this place."),
3998 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3999 _("なんて退屈なところだ...", "What a boring place...")
4002 static cptr do_cmd_feeling_text_combat[11] =
4004 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
4005 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
4006 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
4007 _("この階はとても危険なようだ。", "This level looks very dangerous."),
4008 _("とても悪い予感がする...", "You have a very bad feeling..."),
4009 _("悪い予感がする...", "You have a bad feeling..."),
4010 _("何か緊張する。", "You feel nervous."),
4011 _("少し不運な気がする...", "You feel your luck is turning..."),
4012 _("この場所は好きになれない。", "You don't like the look of this place."),
4013 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
4014 _("なんて退屈なところだ...", "What a boring place...")
4017 static cptr do_cmd_feeling_text_lucky[11] =
4019 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
4020 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
4021 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
4022 _("素晴らしい感じがする...", "You have an excellent feeling..."),
4023 _("とても良い感じがする...", "You have a very good feeling..."),
4024 _("良い感じがする...", "You have a good feeling..."),
4025 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
4026 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
4027 _("見た感じ悪くはない...", "You like the look of this place..."),
4028 _("全然駄目ということはないが...", "This level can't be all bad..."),
4029 _("なんて退屈なところだ...", "What a boring place...")
4034 * Note that "feeling" is set to zero unless some time has passed.
4035 * Note that this is done when the level is GENERATED, not entered.
4037 void do_cmd_feeling(void)
4039 /* No useful feeling in quests */
4040 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4042 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
4046 /* No useful feeling in town */
4047 else if (p_ptr->town_num && !dun_level)
4049 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
4051 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
4056 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
4061 /* No useful feeling in the wilderness */
4062 else if (!dun_level)
4064 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
4068 /* Display the feeling */
4069 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4070 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
4071 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
4072 inventory[INVEN_BOW].name1 == ART_CRIMSON)
4073 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
4075 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4081 * Description of each monster group.
4083 static cptr monster_group_text[] =
4086 "ユニーク", /* "Uniques" */
4087 "乗馬可能なモンスター", /* "Riding" */
4088 "賞金首", /* "Wanted */
4089 "アンバーの王族", /* "Ambertite" */
4118 /* "古代ドラゴン/ワイアーム", */
4179 /* "Ancient Dragon/Wyrm", */
4188 "Multi-Headed Reptile",
4193 "Reptile/Amphibian",
4194 "Spider/Scorpion/Tick",
4196 /* "Major Demon", */
4213 * Symbols of monsters in each group. Note the "Uniques" group
4214 * is handled differently.
4216 static cptr monster_group_char[] =
4273 "!$&()+./=>?[\\]`{|~",
4283 * hook function to sort monsters by level
4285 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4287 u16b *who = (u16b*)(u);
4292 monster_race *r_ptr1 = &r_info[w1];
4293 monster_race *r_ptr2 = &r_info[w2];
4298 if (r_ptr2->level > r_ptr1->level) return TRUE;
4299 if (r_ptr1->level > r_ptr2->level) return FALSE;
4301 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4302 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4307 * Build a list of monster indexes in the given group. Return the number
4308 * of monsters in the group.
4310 * mode & 0x01 : check for non-empty group
4311 * mode & 0x02 : visual operation only
4313 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
4318 /* Get a list of x_char in this group */
4319 cptr group_char = monster_group_char[grp_cur];
4321 /* XXX Hack -- Check if this is the "Uniques" group */
4322 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4324 /* XXX Hack -- Check if this is the "Riding" group */
4325 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4327 /* XXX Hack -- Check if this is the "Wanted" group */
4328 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4330 /* XXX Hack -- Check if this is the "Amberite" group */
4331 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4334 /* Check every race */
4335 for (i = 0; i < max_r_idx; i++)
4337 /* Access the race */
4338 monster_race *r_ptr = &r_info[i];
4340 /* Skip empty race */
4341 if (!r_ptr->name) continue ;
4343 /* Require known monsters */
4344 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4348 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4351 else if (grp_riding)
4353 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4356 else if (grp_wanted)
4358 bool wanted = FALSE;
4360 for (j = 0; j < MAX_KUBI; j++)
4362 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4363 (p_ptr->today_mon && p_ptr->today_mon == i))
4369 if (!wanted) continue;
4372 else if (grp_amberite)
4374 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4379 /* Check for race in the group */
4380 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4384 mon_idx[mon_cnt++] = i;
4386 /* XXX Hack -- Just checking for non-empty group */
4387 if (mode & 0x01) break;
4390 /* Terminate the list */
4391 mon_idx[mon_cnt] = -1;
4393 /* Select the sort method */
4394 ang_sort_comp = ang_sort_comp_monster_level;
4395 ang_sort_swap = ang_sort_swap_hook;
4397 /* Sort by monster level */
4398 ang_sort(mon_idx, &dummy_why, mon_cnt);
4400 /* Return the number of races */
4406 * Description of each monster group.
4408 static cptr object_group_text[] =
4411 "キノコ", /* "Mushrooms" */
4412 "薬", /* "Potions" */
4413 "油つぼ", /* "Flasks" */
4414 "巻物", /* "Scrolls" */
4416 "アミュレット", /* "Amulets" */
4417 "笛", /* "Whistle" */
4418 "光源", /* "Lanterns" */
4419 "魔法棒", /* "Wands" */
4422 "カード", /* "Cards" */
4433 "刀剣類", /* "Swords" */
4434 "鈍器", /* "Blunt Weapons" */
4435 "長柄武器", /* "Polearms" */
4436 "採掘道具", /* "Diggers" */
4437 "飛び道具", /* "Bows" */
4441 "軽装鎧", /* "Soft Armor" */
4442 "重装鎧", /* "Hard Armor" */
4443 "ドラゴン鎧", /* "Dragon Armor" */
4444 "盾", /* "Shields" */
4445 "クローク", /* "Cloaks" */
4446 "籠手", /* "Gloves" */
4447 "ヘルメット", /* "Helms" */
4449 "ブーツ", /* "Boots" */
4502 * TVALs of items in each group
4504 static byte object_group_tval[] =
4545 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4553 * Build a list of object indexes in the given group. Return the number
4554 * of objects in the group.
4556 * mode & 0x01 : check for non-empty group
4557 * mode & 0x02 : visual operation only
4559 static int collect_objects(int grp_cur, int object_idx[], byte mode)
4561 int i, j, k, object_cnt = 0;
4563 /* Get a list of x_char in this group */
4564 byte group_tval = object_group_tval[grp_cur];
4566 /* Check every object */
4567 for (i = 0; i < max_k_idx; i++)
4569 /* Access the object */
4570 object_kind *k_ptr = &k_info[i];
4572 /* Skip empty objects */
4573 if (!k_ptr->name) continue;
4577 /* Any objects will be displayed */
4583 /* Skip non-flavoured objects */
4584 if (!k_ptr->flavor) continue;
4586 /* Require objects ever seen */
4587 if (!k_ptr->aware) continue;
4590 /* Skip items with no distribution (special artifacts) */
4591 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4595 /* Check for objects in the group */
4596 if (TV_LIFE_BOOK == group_tval)
4598 /* Hack -- All spell books */
4599 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4601 /* Add the object */
4602 object_idx[object_cnt++] = i;
4606 else if (k_ptr->tval == group_tval)
4608 /* Add the object */
4609 object_idx[object_cnt++] = i;
4613 /* XXX Hack -- Just checking for non-empty group */
4614 if (mode & 0x01) break;
4617 /* Terminate the list */
4618 object_idx[object_cnt] = -1;
4620 /* Return the number of objects */
4626 * Description of each feature group.
4628 static cptr feature_group_text[] =
4636 * Build a list of feature indexes in the given group. Return the number
4637 * of features in the group.
4639 * mode & 0x01 : check for non-empty group
4641 static int collect_features(int grp_cur, int *feat_idx, byte mode)
4643 int i, feat_cnt = 0;
4645 /* Unused; There is a single group. */
4648 /* Check every feature */
4649 for (i = 0; i < max_f_idx; i++)
4651 /* Access the index */
4652 feature_type *f_ptr = &f_info[i];
4654 /* Skip empty index */
4655 if (!f_ptr->name) continue;
4657 /* Skip mimiccing features */
4658 if (f_ptr->mimic != i) continue;
4661 feat_idx[feat_cnt++] = i;
4663 /* XXX Hack -- Just checking for non-empty group */
4664 if (mode & 0x01) break;
4667 /* Terminate the list */
4668 feat_idx[feat_cnt] = -1;
4670 /* Return the number of races */
4677 * Build a list of monster indexes in the given group. Return the number
4678 * of monsters in the group.
4680 static int collect_artifacts(int grp_cur, int object_idx[])
4682 int i, object_cnt = 0;
4684 /* Get a list of x_char in this group */
4685 byte group_tval = object_group_tval[grp_cur];
4687 /* Check every object */
4688 for (i = 0; i < max_a_idx; i++)
4690 /* Access the artifact */
4691 artifact_type *a_ptr = &a_info[i];
4693 /* Skip empty artifacts */
4694 if (!a_ptr->name) continue;
4696 /* Skip "uncreated" artifacts */
4697 if (!a_ptr->cur_num) continue;
4699 /* Check for race in the group */
4700 if (a_ptr->tval == group_tval)
4703 object_idx[object_cnt++] = i;
4707 /* Terminate the list */
4708 object_idx[object_cnt] = 0;
4710 /* Return the number of races */
4717 * Encode the screen colors
4719 static char hack[17] = "dwsorgbuDWvyRGBU";
4723 * Hack -- load a screen dump from a file
4725 void do_cmd_load_screen(void)
4740 Term_get_size(&wid, &hgt);
4742 /* Build the filename */
4743 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4745 /* Append to the file */
4746 fff = my_fopen(buf, "r");
4750 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4756 /* Save the screen */
4759 /* Clear the screen */
4763 /* Load the screen */
4764 for (y = 0; okay; y++)
4766 /* Get a line of data including control code */
4767 if (!fgets(buf, 1024, fff)) okay = FALSE;
4769 /* Get the blank line */
4770 if (buf[0] == '\n' || buf[0] == '\0') break;
4772 /* Ignore too large screen image */
4773 if (y >= hgt) continue;
4776 for (x = 0; x < wid - 1; x++)
4779 if (buf[x] == '\n' || buf[x] == '\0') break;
4781 /* Put the attr/char */
4782 Term_draw(x, y, TERM_WHITE, buf[x]);
4786 /* Dump the screen */
4787 for (y = 0; okay; y++)
4789 /* Get a line of data including control code */
4790 if (!fgets(buf, 1024, fff)) okay = FALSE;
4792 /* Get the blank line */
4793 if (buf[0] == '\n' || buf[0] == '\0') break;
4795 /* Ignore too large screen image */
4796 if (y >= hgt) continue;
4799 for (x = 0; x < wid - 1; x++)
4802 if (buf[x] == '\n' || buf[x] == '\0') break;
4804 /* Get the attr/char */
4805 (void)(Term_what(x, y, &a, &c));
4807 /* Look up the attr */
4808 for (i = 0; i < 16; i++)
4810 /* Use attr matches */
4811 if (hack[i] == buf[x]) a = i;
4814 /* Put the attr/char */
4815 Term_draw(x, y, a, c);
4825 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4831 /* Restore the screen */
4838 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4839 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4842 #define IM_FLAG_STR _("*", "* ")
4843 #define HAS_FLAG_STR _("+", "+ ")
4844 #define NO_FLAG_STR _("・", ". ")
4846 #define print_im_or_res_flag(IM, RES) \
4848 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4849 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4852 #define print_flag(TR) \
4854 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4858 /* XTRA HACK RESLIST */
4859 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
4861 char o_name[MAX_NLEN];
4862 u32b flgs[TR_FLAG_SIZE];
4864 if (!o_ptr->k_idx) return;
4865 if (o_ptr->tval != tval) return;
4867 /* Identified items only */
4868 if (!object_is_known(o_ptr)) return;
4871 * HACK:Ring of Lordly protection and Dragon equipment
4872 * have random resistances.
4874 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4875 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4876 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4877 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4878 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4879 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4880 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4881 || object_is_artifact(o_ptr))
4884 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4886 while (o_name[i] && (i < 26))
4889 if (iskanji(o_name[i])) i++;
4898 o_name[i] = ' '; i++;
4903 fprintf(fff, "%s %s", where, o_name);
4905 if (!(o_ptr->ident & (IDENT_MENTAL)))
4907 fputs(_("-------不明--------------- -------不明---------\n",
4908 "-------unknown------------ -------unknown------\n"), fff);
4912 object_flags_known(o_ptr, flgs);
4914 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4915 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4916 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4917 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4918 print_flag(TR_RES_POIS);
4919 print_flag(TR_RES_LITE);
4920 print_flag(TR_RES_DARK);
4921 print_flag(TR_RES_SHARDS);
4922 print_flag(TR_RES_SOUND);
4923 print_flag(TR_RES_NETHER);
4924 print_flag(TR_RES_NEXUS);
4925 print_flag(TR_RES_CHAOS);
4926 print_flag(TR_RES_DISEN);
4930 print_flag(TR_RES_BLIND);
4931 print_flag(TR_RES_FEAR);
4932 print_flag(TR_RES_CONF);
4933 print_flag(TR_FREE_ACT);
4934 print_flag(TR_SEE_INVIS);
4935 print_flag(TR_HOLD_EXP);
4936 print_flag(TR_TELEPATHY);
4937 print_flag(TR_SLOW_DIGEST);
4938 print_flag(TR_REGEN);
4939 print_flag(TR_LEVITATION);
4947 fprintf(fff, "%s\n", inven_res_label);
4953 * Display *ID* ed weapons/armors's resistances
4955 static void do_cmd_knowledge_inven(void)
4959 char file_name[1024];
4969 /* Open a new file */
4970 fff = my_fopen_temp(file_name, 1024);
4973 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4977 fprintf(fff, "%s\n", inven_res_label);
4979 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4983 for (; j < 9; j++) fputc('\n', fff);
4985 fprintf(fff, "%s\n", inven_res_label);
4987 strcpy(where, _("装", "E "));
4988 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4990 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4992 strcpy(where, _("持", "I "));
4993 for (i = 0; i < INVEN_PACK; i++)
4995 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4998 st_ptr = &town[1].store[STORE_HOME];
4999 strcpy(where, _("家", "H "));
5000 for (i = 0; i < st_ptr->stock_num; i++)
5002 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5006 /* Close the file */
5009 /* Display the file contents */
5010 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
5012 /* Remove the file */
5017 void do_cmd_save_screen_html_aux(char *filename, int message)
5021 byte a = 0, old_a = 0;
5035 cptr html_head[] = {
5036 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5040 cptr html_foot[] = {
5042 "</body>\n</html>\n",
5048 Term_get_size(&wid, &hgt);
5050 /* File type is "TEXT" */
5051 FILE_TYPE(FILE_TYPE_TEXT);
5053 /* Append to the file */
5054 fff = my_fopen(filename, "w");
5059 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
5066 /* Save the screen */
5070 /* Build the filename */
5071 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5072 tmpfff = my_fopen(buf, "r");
5074 for (i = 0; html_head[i]; i++)
5075 fputs(html_head[i], fff);
5079 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5081 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5085 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5087 fprintf(fff, "%s\n", buf);
5092 /* Dump the screen */
5093 for (y = 0; y < hgt; y++)
5100 for (x = 0; x < wid - 1; x++)
5104 /* Get the attr/char */
5105 (void)(Term_what(x, y, &a, &c));
5109 case '&': cc = "&"; break;
5110 case '<': cc = "<"; break;
5111 case '>': cc = ">"; break;
5113 case 0x1f: c = '.'; break;
5114 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5119 if ((y == 0 && x == 0) || a != old_a) {
5120 rv = angband_color_table[a][1];
5121 gv = angband_color_table[a][2];
5122 bv = angband_color_table[a][3];
5123 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5124 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5128 fprintf(fff, "%s", cc);
5130 fprintf(fff, "%c", c);
5133 fprintf(fff, "</font>");
5136 for (i = 0; html_foot[i]; i++)
5137 fputs(html_foot[i], fff);
5142 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5144 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5148 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5150 fprintf(fff, "%s\n", buf);
5164 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5168 /* Restore the screen */
5174 * Hack -- save a screen dump to a file
5176 static void do_cmd_save_screen_html(void)
5178 char buf[1024], tmp[256] = "screen.html";
5180 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5183 /* Build the filename */
5184 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5188 do_cmd_save_screen_html_aux(buf, 1);
5193 * Redefinable "save_screen" action
5195 void (*screendump_aux)(void) = NULL;
5199 * Hack -- save a screen dump to a file
5201 void do_cmd_save_screen(void)
5203 bool old_use_graphics = use_graphics;
5204 bool html_dump = FALSE;
5208 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5212 if (c == 'Y' || c == 'y')
5214 else if (c == 'H' || c == 'h')
5226 Term_get_size(&wid, &hgt);
5228 if (old_use_graphics)
5230 use_graphics = FALSE;
5233 /* Redraw everything */
5234 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5236 /* Hack -- update */
5242 do_cmd_save_screen_html();
5246 /* Do we use a special screendump function ? */
5247 else if (screendump_aux)
5249 /* Dump the screen to a graphics file */
5250 (*screendump_aux)();
5252 else /* Dump the screen as text */
5263 /* Build the filename */
5264 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5266 /* File type is "TEXT" */
5267 FILE_TYPE(FILE_TYPE_TEXT);
5269 /* Append to the file */
5270 fff = my_fopen(buf, "w");
5275 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5281 /* Save the screen */
5285 /* Dump the screen */
5286 for (y = 0; y < hgt; y++)
5289 for (x = 0; x < wid - 1; x++)
5291 /* Get the attr/char */
5292 (void)(Term_what(x, y, &a, &c));
5302 fprintf(fff, "%s\n", buf);
5309 /* Dump the screen */
5310 for (y = 0; y < hgt; y++)
5313 for (x = 0; x < wid - 1; x++)
5315 /* Get the attr/char */
5316 (void)(Term_what(x, y, &a, &c));
5319 buf[x] = hack[a&0x0F];
5326 fprintf(fff, "%s\n", buf);
5337 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5340 /* Restore the screen */
5344 if (old_use_graphics)
5346 use_graphics = TRUE;
5349 /* Redraw everything */
5350 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5352 /* Hack -- update */
5359 * Sorting hook -- Comp function -- see below
5361 * We use "u" to point to array of monster indexes,
5362 * and "v" to select the type of sorting to perform on "u".
5364 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5366 u16b *who = (u16b*)(u);
5368 u16b *why = (u16b*)(v);
5375 /* Sort by total kills */
5378 /* Extract total kills */
5379 z1 = a_info[w1].tval;
5380 z2 = a_info[w2].tval;
5382 /* Compare total kills */
5383 if (z1 < z2) return (TRUE);
5384 if (z1 > z2) return (FALSE);
5388 /* Sort by monster level */
5391 /* Extract levels */
5392 z1 = a_info[w1].sval;
5393 z2 = a_info[w2].sval;
5395 /* Compare levels */
5396 if (z1 < z2) return (TRUE);
5397 if (z1 > z2) return (FALSE);
5401 /* Sort by monster experience */
5404 /* Extract experience */
5405 z1 = a_info[w1].level;
5406 z2 = a_info[w2].level;
5408 /* Compare experience */
5409 if (z1 < z2) return (TRUE);
5410 if (z1 > z2) return (FALSE);
5414 /* Compare indexes */
5420 * Sorting hook -- Swap function -- see below
5422 * We use "u" to point to array of monster indexes,
5423 * and "v" to select the type of sorting to perform.
5425 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5427 u16b *who = (u16b*)(u);
5442 * Check the status of "artifacts"
5444 static void do_cmd_knowledge_artifacts(void)
5446 int i, k, z, x, y, n = 0;
5452 char file_name[1024];
5454 char base_name[MAX_NLEN];
5458 /* Open a new file */
5459 fff = my_fopen_temp(file_name, 1024);
5462 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5467 /* Allocate the "who" array */
5468 C_MAKE(who, max_a_idx, s16b);
5470 /* Allocate the "okay" array */
5471 C_MAKE(okay, max_a_idx, bool);
5473 /* Scan the artifacts */
5474 for (k = 0; k < max_a_idx; k++)
5476 artifact_type *a_ptr = &a_info[k];
5481 /* Skip "empty" artifacts */
5482 if (!a_ptr->name) continue;
5484 /* Skip "uncreated" artifacts */
5485 if (!a_ptr->cur_num) continue;
5491 /* Check the dungeon */
5492 for (y = 0; y < cur_hgt; y++)
5494 for (x = 0; x < cur_wid; x++)
5496 cave_type *c_ptr = &cave[y][x];
5498 s16b this_o_idx, next_o_idx = 0;
5500 /* Scan all objects in the grid */
5501 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5505 /* Acquire object */
5506 o_ptr = &o_list[this_o_idx];
5508 /* Acquire next object */
5509 next_o_idx = o_ptr->next_o_idx;
5511 /* Ignore non-artifacts */
5512 if (!object_is_fixed_artifact(o_ptr)) continue;
5514 /* Ignore known items */
5515 if (object_is_known(o_ptr)) continue;
5517 /* Note the artifact */
5518 okay[o_ptr->name1] = FALSE;
5523 /* Check the inventory and equipment */
5524 for (i = 0; i < INVEN_TOTAL; i++)
5526 object_type *o_ptr = &inventory[i];
5528 /* Ignore non-objects */
5529 if (!o_ptr->k_idx) continue;
5531 /* Ignore non-artifacts */
5532 if (!object_is_fixed_artifact(o_ptr)) continue;
5534 /* Ignore known items */
5535 if (object_is_known(o_ptr)) continue;
5537 /* Note the artifact */
5538 okay[o_ptr->name1] = FALSE;
5541 for (k = 0; k < max_a_idx; k++)
5543 if (okay[k]) who[n++] = k;
5546 /* Select the sort method */
5547 ang_sort_comp = ang_sort_art_comp;
5548 ang_sort_swap = ang_sort_art_swap;
5550 /* Sort the array by dungeon depth of monsters */
5551 ang_sort(who, &why, n);
5553 /* Scan the artifacts */
5554 for (k = 0; k < n; k++)
5556 artifact_type *a_ptr = &a_info[who[k]];
5559 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5561 /* Obtain the base object type */
5562 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5570 /* Get local object */
5573 /* Create fake object */
5574 object_prep(q_ptr, z);
5576 /* Make it an artifact */
5577 q_ptr->name1 = (byte)who[k];
5579 /* Display as if known */
5580 q_ptr->ident |= IDENT_STORE;
5582 /* Describe the artifact */
5583 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5586 /* Hack -- Build the artifact name */
5587 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5590 /* Free the "who" array */
5591 C_KILL(who, max_a_idx, s16b);
5593 /* Free the "okay" array */
5594 C_KILL(okay, max_a_idx, bool);
5596 /* Close the file */
5599 /* Display the file contents */
5600 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5602 /* Remove the file */
5608 * Display known uniques
5609 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5611 static void do_cmd_knowledge_uniques(void)
5619 char file_name[1024];
5622 int n_alive_surface = 0;
5623 int n_alive_over100 = 0;
5624 int n_alive_total = 0;
5627 for (i = 0; i < 10; i++) n_alive[i] = 0;
5629 /* Open a new file */
5630 fff = my_fopen_temp(file_name, 1024);
5634 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5639 /* Allocate the "who" array */
5640 C_MAKE(who, max_r_idx, s16b);
5642 /* Scan the monsters */
5643 for (i = 1; i < max_r_idx; i++)
5645 monster_race *r_ptr = &r_info[i];
5648 if (!r_ptr->name) continue;
5650 /* Require unique monsters */
5651 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5653 /* Only display "known" uniques */
5654 if (!cheat_know && !r_ptr->r_sights) continue;
5656 /* Only print rarity <= 100 uniques */
5657 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5659 /* Only "alive" uniques */
5660 if (r_ptr->max_num == 0) continue;
5664 lev = (r_ptr->level - 1) / 10;
5668 if (max_lev < lev) max_lev = lev;
5670 else n_alive_over100++;
5672 else n_alive_surface++;
5674 /* Collect "appropriate" monsters */
5678 /* Select the sort method */
5679 ang_sort_comp = ang_sort_comp_hook;
5680 ang_sort_swap = ang_sort_swap_hook;
5682 /* Sort the array by dungeon depth of monsters */
5683 ang_sort(who, &why, n);
5685 if (n_alive_surface)
5687 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5688 n_alive_total += n_alive_surface;
5690 for (i = 0; i <= max_lev; i++)
5692 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5693 n_alive_total += n_alive[i];
5695 if (n_alive_over100)
5697 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5698 n_alive_total += n_alive_over100;
5703 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5704 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5708 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5711 /* Scan the monster races */
5712 for (k = 0; k < n; k++)
5714 monster_race *r_ptr = &r_info[who[k]];
5716 /* Print a message */
5717 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, r_ptr->level);
5720 /* Free the "who" array */
5721 C_KILL(who, max_r_idx, s16b);
5723 /* Close the file */
5726 /* Display the file contents */
5727 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5729 /* Remove the file */
5735 * Display weapon-exp
5737 static void do_cmd_knowledge_weapon_exp(void)
5739 int i, j, num, weapon_exp;
5743 char file_name[1024];
5746 /* Open a new file */
5747 fff = my_fopen_temp(file_name, 1024);
5749 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5754 for (i = 0; i < 5; i++)
5756 for (num = 0; num < 64; num++)
5758 for (j = 0; j < max_k_idx; j++)
5760 object_kind *k_ptr = &k_info[j];
5762 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5764 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5766 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5768 fprintf(fff, "%-25s ", tmp);
5769 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5770 else fprintf(fff, " ");
5771 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5772 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5780 /* Close the file */
5783 /* Display the file contents */
5784 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5786 /* Remove the file */
5792 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5796 static void do_cmd_knowledge_spell_exp(void)
5798 int i = 0, spell_exp, exp_level;
5801 const magic_type *s_ptr;
5803 char file_name[1024];
5805 /* Open a new file */
5806 fff = my_fopen_temp(file_name, 1024);
5808 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5813 if (p_ptr->realm1 != REALM_NONE)
5815 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5816 for (i = 0; i < 32; i++)
5818 if (!is_magic(p_ptr->realm1))
5820 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5824 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5826 if (s_ptr->slevel >= 99) continue;
5827 spell_exp = p_ptr->spell_exp[i];
5828 exp_level = spell_exp_level(spell_exp);
5829 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5830 if (p_ptr->realm1 == REALM_HISSATSU)
5831 fprintf(fff, "[--]");
5834 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5835 else fprintf(fff, " ");
5836 fprintf(fff, "%s", exp_level_str[exp_level]);
5838 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5843 if (p_ptr->realm2 != REALM_NONE)
5845 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5846 for (i = 0; i < 32; i++)
5848 if (!is_magic(p_ptr->realm1))
5850 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5854 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5856 if (s_ptr->slevel >= 99) continue;
5858 spell_exp = p_ptr->spell_exp[i + 32];
5859 exp_level = spell_exp_level(spell_exp);
5860 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5861 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5862 else fprintf(fff, " ");
5863 fprintf(fff, "%s", exp_level_str[exp_level]);
5864 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5869 /* Close the file */
5872 /* Display the file contents */
5873 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5875 /* Remove the file */
5881 * @brief スキル情報を表示するコマンドのメインルーチン /
5885 static void do_cmd_knowledge_skill_exp(void)
5887 int i = 0, skill_exp;
5891 char file_name[1024];
5892 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5893 _("二刀流 ", "Dual Wielding "),
5894 _("乗馬 ", "Riding ")};
5896 /* Open a new file */
5897 fff = my_fopen_temp(file_name, 1024);
5899 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5904 for (i = 0; i < 3; i++)
5906 skill_exp = p_ptr->skill_exp[i];
5907 fprintf(fff, "%-20s ", skill_name[i]);
5908 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5909 else fprintf(fff, " ");
5910 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5911 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5915 /* Close the file */
5918 /* Display the file contents */
5919 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5921 /* Remove the file */
5927 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5928 * @param Name 変換したい文字列の参照ポインタ
5931 void plural_aux(char *Name)
5933 int NameLen = strlen(Name);
5935 if (my_strstr(Name, "Disembodied hand"))
5937 strcpy(Name, "Disembodied hands that strangled people");
5939 else if (my_strstr(Name, "Colour out of space"))
5941 strcpy(Name, "Colours out of space");
5943 else if (my_strstr(Name, "stairway to hell"))
5945 strcpy(Name, "stairways to hell");
5947 else if (my_strstr(Name, "Dweller on the threshold"))
5949 strcpy(Name, "Dwellers on the threshold");
5951 else if (my_strstr(Name, " of "))
5953 cptr aider = my_strstr(Name, " of ");
5964 if (dummy[i-1] == 's')
5966 strcpy(&(dummy[i]), "es");
5971 strcpy(&(dummy[i]), "s");
5974 strcpy(&(dummy[i+1]), aider);
5975 strcpy(Name, dummy);
5977 else if (my_strstr(Name, "coins"))
5980 strcpy(dummy, "piles of ");
5981 strcat(dummy, Name);
5982 strcpy(Name, dummy);
5985 else if (my_strstr(Name, "Manes"))
5989 else if (streq(&(Name[NameLen - 2]), "ey"))
5991 strcpy(&(Name[NameLen - 2]), "eys");
5993 else if (Name[NameLen - 1] == 'y')
5995 strcpy(&(Name[NameLen - 1]), "ies");
5997 else if (streq(&(Name[NameLen - 4]), "ouse"))
5999 strcpy(&(Name[NameLen - 4]), "ice");
6001 else if (streq(&(Name[NameLen - 2]), "us"))
6003 strcpy(&(Name[NameLen - 2]), "i");
6005 else if (streq(&(Name[NameLen - 6]), "kelman"))
6007 strcpy(&(Name[NameLen - 6]), "kelmen");
6009 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6011 strcpy(&(Name[NameLen - 8]), "wordsmen");
6013 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6015 strcpy(&(Name[NameLen - 7]), "oodsmen");
6017 else if (streq(&(Name[NameLen - 7]), "eastman"))
6019 strcpy(&(Name[NameLen - 7]), "eastmen");
6021 else if (streq(&(Name[NameLen - 8]), "izardman"))
6023 strcpy(&(Name[NameLen - 8]), "izardmen");
6025 else if (streq(&(Name[NameLen - 5]), "geist"))
6027 strcpy(&(Name[NameLen - 5]), "geister");
6029 else if (streq(&(Name[NameLen - 2]), "ex"))
6031 strcpy(&(Name[NameLen - 2]), "ices");
6033 else if (streq(&(Name[NameLen - 2]), "lf"))
6035 strcpy(&(Name[NameLen - 2]), "lves");
6037 else if (suffix(Name, "ch") ||
6038 suffix(Name, "sh") ||
6039 suffix(Name, "nx") ||
6040 suffix(Name, "s") ||
6043 strcpy(&(Name[NameLen]), "es");
6047 strcpy(&(Name[NameLen]), "s");
6052 * @brief 現在のペットを表示するコマンドのメインルーチン /
6053 * Display current pets
6056 static void do_cmd_knowledge_pets(void)
6060 monster_type *m_ptr;
6063 int show_upkeep = 0;
6064 char file_name[1024];
6067 /* Open a new file */
6068 fff = my_fopen_temp(file_name, 1024);
6070 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6075 /* Process the monsters (backwards) */
6076 for (i = m_max - 1; i >= 1; i--)
6078 /* Access the monster */
6081 /* Ignore "dead" monsters */
6082 if (!m_ptr->r_idx) continue;
6084 /* Calculate "upkeep" for pets */
6088 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6089 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6093 show_upkeep = calculate_upkeep();
6095 fprintf(fff, "----------------------------------------------\n");
6097 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6098 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6100 fprintf(fff, " Total: %d pet%s.\n",
6101 t_friends, (t_friends == 1 ? "" : "s"));
6102 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6107 /* Close the file */
6110 /* Display the file contents */
6111 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6113 /* Remove the file */
6119 * @brief 現在のペットを表示するコマンドのメインルーチン /
6122 * @note the player ghosts are ignored. XXX XXX XXX
6124 static void do_cmd_knowledge_kill_count(void)
6132 char file_name[1024];
6137 /* Open a new file */
6138 fff = my_fopen_temp(file_name, 1024);
6141 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6146 /* Allocate the "who" array */
6147 C_MAKE(who, max_r_idx, s16b);
6150 /* Monsters slain */
6153 for (kk = 1; kk < max_r_idx; kk++)
6155 monster_race *r_ptr = &r_info[kk];
6157 if (r_ptr->flags1 & (RF1_UNIQUE))
6159 bool dead = (r_ptr->max_num == 0);
6168 s16b This = r_ptr->r_pkills;
6178 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6181 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6183 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6189 /* Scan the monsters */
6190 for (i = 1; i < max_r_idx; i++)
6192 monster_race *r_ptr = &r_info[i];
6194 /* Use that monster */
6195 if (r_ptr->name) who[n++] = i;
6198 /* Select the sort method */
6199 ang_sort_comp = ang_sort_comp_hook;
6200 ang_sort_swap = ang_sort_swap_hook;
6202 /* Sort the array by dungeon depth of monsters */
6203 ang_sort(who, &why, n);
6205 /* Scan the monster races */
6206 for (k = 0; k < n; k++)
6208 monster_race *r_ptr = &r_info[who[k]];
6210 if (r_ptr->flags1 & (RF1_UNIQUE))
6212 bool dead = (r_ptr->max_num == 0);
6216 /* Print a message */
6217 fprintf(fff, " %s\n",
6218 (r_name + r_ptr->name));
6224 s16b This = r_ptr->r_pkills;
6229 /* p,tは人と数える by ita */
6230 if (my_strchr("pt", r_ptr->d_char))
6231 fprintf(fff, " %3d 人の %s\n", This, r_name + r_ptr->name);
6233 fprintf(fff, " %3d 体の %s\n", This, r_name + r_ptr->name);
6237 if (my_strstr(r_name + r_ptr->name, "coins"))
6239 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6243 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6249 strcpy(ToPlural, (r_name + r_ptr->name));
6250 plural_aux(ToPlural);
6251 fprintf(fff, " %d %s\n", This, ToPlural);
6261 fprintf(fff,"----------------------------------------------\n");
6263 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6265 fprintf(fff," Total: %lu creature%s killed.\n",
6266 (unsigned long int)Total, (Total == 1 ? "" : "s"));
6270 /* Free the "who" array */
6271 C_KILL(who, max_r_idx, s16b);
6273 /* Close the file */
6276 /* Display the file contents */
6277 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6279 /* Remove the file */
6285 * @brief モンスター情報リスト中のグループを表示する /
6286 * Display the object groups.
6290 * @param per_page リストの表示行
6291 * @param grp_idx グループのID配列
6292 * @param group_text グループ名の文字列配列
6293 * @param grp_cur 現在の選択ID
6294 * @param grp_top 現在の選択リスト最上部ID
6297 static void display_group_list(int col, int row, int wid, int per_page,
6298 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6302 /* Display lines until done */
6303 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6305 /* Get the group index */
6306 int grp = grp_idx[grp_top + i];
6308 /* Choose a color */
6309 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6311 /* Erase the entire line */
6312 Term_erase(col, row + i, wid);
6314 /* Display the group label */
6315 c_put_str(attr, group_text[grp], row + i, col);
6321 * Move the cursor in a browser window
6323 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
6324 int *list_cur, int list_cnt)
6329 int list = *list_cur;
6331 /* Extract direction */
6334 /* Hack -- scroll up full screen */
6339 /* Hack -- scroll down full screen */
6344 d = get_keymap_dir(ch);
6349 /* Diagonals - hack */
6350 if ((ddx[d] > 0) && ddy[d])
6356 Term_get_size(&wid, &hgt);
6358 browser_rows = hgt - 8;
6360 /* Browse group list */
6365 /* Move up or down */
6366 grp += ddy[d] * (browser_rows - 1);
6369 if (grp >= grp_cnt) grp = grp_cnt - 1;
6370 if (grp < 0) grp = 0;
6371 if (grp != old_grp) list = 0;
6374 /* Browse sub-list list */
6377 /* Move up or down */
6378 list += ddy[d] * browser_rows;
6381 if (list >= list_cnt) list = list_cnt - 1;
6382 if (list < 0) list = 0;
6394 if (col < 0) col = 0;
6395 if (col > 1) col = 1;
6402 /* Browse group list */
6407 /* Move up or down */
6411 if (grp >= grp_cnt) grp = grp_cnt - 1;
6412 if (grp < 0) grp = 0;
6413 if (grp != old_grp) list = 0;
6416 /* Browse sub-list list */
6419 /* Move up or down */
6423 if (list >= list_cnt) list = list_cnt - 1;
6424 if (list < 0) list = 0;
6435 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
6439 /* Clear the display lines */
6440 for (i = 0; i < height; i++)
6442 Term_erase(col, row + i, width);
6445 /* Bigtile mode uses double width */
6446 if (use_bigtile) width /= 2;
6448 /* Display lines until done */
6449 for (i = 0; i < height; i++)
6451 /* Display columns until done */
6452 for (j = 0; j < width; j++)
6460 /* Bigtile mode uses double width */
6461 if (use_bigtile) x += j;
6466 /* Ignore illegal characters */
6467 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6468 (!use_graphics && ic > 0x7f))
6474 /* Force correct code for both ASCII character and tile */
6475 if (c & 0x80) a |= 0x80;
6477 /* Display symbol */
6478 Term_queue_bigchar(x, y, a, c, 0, 0);
6485 * Place the cursor at the collect position for visual mode
6487 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
6489 int i = (a & 0x7f) - attr_top;
6490 int j = c - char_left;
6495 /* Bigtile mode uses double width */
6496 if (use_bigtile) x += j;
6498 /* Place the cursor */
6504 * Clipboard variables for copy&paste in visual mode
6506 static byte attr_idx = 0;
6507 static byte char_idx = 0;
6509 /* Hack -- for feature lighting */
6510 static byte attr_idx_feat[F_LIT_MAX];
6511 static byte char_idx_feat[F_LIT_MAX];
6514 * Do visual mode command -- Change symbols
6516 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6517 int height, int width,
6518 byte *attr_top_ptr, byte *char_left_ptr,
6519 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6521 static byte attr_old = 0, char_old = 0;
6526 if (*visual_list_ptr)
6529 *cur_attr_ptr = attr_old;
6530 *cur_char_ptr = char_old;
6531 *visual_list_ptr = FALSE;
6539 if (*visual_list_ptr)
6542 *visual_list_ptr = FALSE;
6543 *need_redraw = TRUE;
6551 if (!*visual_list_ptr)
6553 *visual_list_ptr = TRUE;
6555 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6556 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6558 attr_old = *cur_attr_ptr;
6559 char_old = *cur_char_ptr;
6570 /* Set the visual */
6571 attr_idx = *cur_attr_ptr;
6572 char_idx = *cur_char_ptr;
6574 /* Hack -- for feature lighting */
6575 for (i = 0; i < F_LIT_MAX; i++)
6577 attr_idx_feat[i] = 0;
6578 char_idx_feat[i] = 0;
6585 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6588 *cur_attr_ptr = attr_idx;
6589 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6590 if (!*visual_list_ptr) *need_redraw = TRUE;
6596 *cur_char_ptr = char_idx;
6597 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6598 if (!*visual_list_ptr) *need_redraw = TRUE;
6604 if (*visual_list_ptr)
6607 int d = get_keymap_dir(ch);
6608 byte a = (*cur_attr_ptr & 0x7f);
6609 byte c = *cur_char_ptr;
6611 if (use_bigtile) eff_width = width / 2;
6612 else eff_width = width;
6614 /* Restrict direction */
6615 if ((a == 0) && (ddy[d] < 0)) d = 0;
6616 if ((c == 0) && (ddx[d] < 0)) d = 0;
6617 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6618 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6623 /* Force correct code for both ASCII character and tile */
6624 if (c & 0x80) a |= 0x80;
6626 /* Set the visual */
6631 /* Move the frame */
6632 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6633 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6634 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6635 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6641 /* Visual mode command is not used */
6647 * Display the monsters in a group.
6649 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6650 int mon_cur, int mon_top, bool visual_only)
6654 /* Display lines until done */
6655 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6659 /* Get the race index */
6660 int r_idx = mon_idx[mon_top + i] ;
6662 /* Access the race */
6663 monster_race *r_ptr = &r_info[r_idx];
6665 /* Choose a color */
6666 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6668 /* Display the name */
6669 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6671 /* Hack -- visual_list mode */
6674 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6676 if (p_ptr->wizard || visual_only)
6678 c_prt(attr, format("%d", r_idx), row + i, 62);
6681 /* Erase chars before overwritten by the race letter */
6682 Term_erase(69, row + i, 255);
6684 /* Display symbol */
6685 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6690 if (!(r_ptr->flags1 & RF1_UNIQUE))
6691 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6693 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6694 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6698 /* Clear remaining lines */
6699 for (; i < per_page; i++)
6701 Term_erase(col, row + i, 255);
6707 * Display known monsters.
6709 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx)
6712 int grp_cur, grp_top, old_grp_cur;
6713 int mon_cur, mon_top;
6714 int grp_cnt, grp_idx[100];
6722 bool visual_list = FALSE;
6723 byte attr_top = 0, char_left = 0;
6731 Term_get_size(&wid, &hgt);
6733 browser_rows = hgt - 8;
6735 /* Allocate the "mon_idx" array */
6736 C_MAKE(mon_idx, max_r_idx, s16b);
6741 if (direct_r_idx < 0)
6743 mode = visual_only ? 0x03 : 0x01;
6745 /* Check every group */
6746 for (i = 0; monster_group_text[i] != NULL; i++)
6748 /* Measure the label */
6749 len = strlen(monster_group_text[i]);
6751 /* Save the maximum length */
6752 if (len > max) max = len;
6754 /* See if any monsters are known */
6755 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6757 /* Build a list of groups with known monsters */
6758 grp_idx[grp_cnt++] = i;
6766 mon_idx[0] = direct_r_idx;
6769 /* Terminate the list */
6772 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6773 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6776 /* Terminate the list */
6777 grp_idx[grp_cnt] = -1;
6780 grp_cur = grp_top = 0;
6781 mon_cur = mon_top = 0;
6786 mode = visual_only ? 0x02 : 0x00;
6791 monster_race *r_ptr;
6798 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6799 if (direct_r_idx < 0) prt("グループ", 4, 0);
6800 prt("名前", 4, max + 3);
6801 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6803 if (!visual_only) prt("殺害数", 4, 72);
6805 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6806 if (direct_r_idx < 0) prt("Group", 4, 0);
6807 prt("Name", 4, max + 3);
6808 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6810 if (!visual_only) prt("Kills", 4, 73);
6813 for (i = 0; i < 78; i++)
6815 Term_putch(i, 5, TERM_WHITE, '=');
6818 if (direct_r_idx < 0)
6820 for (i = 0; i < browser_rows; i++)
6822 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6829 if (direct_r_idx < 0)
6831 /* Scroll group list */
6832 if (grp_cur < grp_top) grp_top = grp_cur;
6833 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6835 /* Display a list of monster groups */
6836 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6838 if (old_grp_cur != grp_cur)
6840 old_grp_cur = grp_cur;
6842 /* Get a list of monsters in the current group */
6843 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6846 /* Scroll monster list */
6847 while (mon_cur < mon_top)
6848 mon_top = MAX(0, mon_top - browser_rows/2);
6849 while (mon_cur >= mon_top + browser_rows)
6850 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6855 /* Display a list of monsters in the current group */
6856 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6862 /* Display a monster name */
6863 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6865 /* Display visual list below first monster */
6866 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6871 prt(format("<方向>%s%s%s, ESC",
6872 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6873 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6874 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6877 prt(format("<dir>%s%s%s, ESC",
6878 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6879 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6880 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6884 /* Get the current monster */
6885 r_ptr = &r_info[mon_idx[mon_cur]];
6889 /* Mega Hack -- track this monster race */
6890 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6892 /* Hack -- handle stuff */
6898 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6902 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6906 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6911 /* Do visual mode command if needed */
6912 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))
6914 if (direct_r_idx >= 0)
6939 /* Recall on screen */
6940 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6942 screen_roff(mon_idx[mon_cur], 0);
6953 /* Move the cursor */
6954 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6961 /* Free the "mon_idx" array */
6962 C_KILL(mon_idx, max_r_idx, s16b);
6967 * Display the objects in a group.
6969 static void display_object_list(int col, int row, int per_page, int object_idx[],
6970 int object_cur, int object_top, bool visual_only)
6974 /* Display lines until done */
6975 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6979 object_kind *flavor_k_ptr;
6981 /* Get the object index */
6982 int k_idx = object_idx[object_top + i];
6984 /* Access the object */
6985 object_kind *k_ptr = &k_info[k_idx];
6987 /* Choose a color */
6988 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6989 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6992 if (!visual_only && k_ptr->flavor)
6994 /* Appearance of this object is shuffled */
6995 flavor_k_ptr = &k_info[k_ptr->flavor];
6999 /* Appearance of this object is very normal */
7000 flavor_k_ptr = k_ptr;
7005 attr = ((i + object_top == object_cur) ? cursor : attr);
7007 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
7010 strip_name(o_name, k_idx);
7015 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
7018 /* Display the name */
7019 c_prt(attr, o_name, row + i, col);
7021 /* Hack -- visual_list mode */
7024 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);
7026 if (p_ptr->wizard || visual_only)
7028 c_prt(attr, format("%d", k_idx), row + i, 70);
7031 a = flavor_k_ptr->x_attr;
7032 c = flavor_k_ptr->x_char;
7034 /* Display symbol */
7035 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
7038 /* Clear remaining lines */
7039 for (; i < per_page; i++)
7041 Term_erase(col, row + i, 255);
7046 * Describe fake object
7048 static void desc_obj_fake(int k_idx)
7051 object_type object_type_body;
7053 /* Get local object */
7054 o_ptr = &object_type_body;
7056 /* Wipe the object */
7059 /* Create the artifact */
7060 object_prep(o_ptr, k_idx);
7062 /* It's fully know */
7063 o_ptr->ident |= IDENT_KNOWN;
7065 /* Track the object */
7066 /* object_actual_track(o_ptr); */
7068 /* Hack - mark as fake */
7069 /* term_obj_real = FALSE; */
7071 /* Hack -- Handle stuff */
7074 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
7076 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7084 * Display known objects
7086 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx)
7089 int grp_cur, grp_top, old_grp_cur;
7090 int object_old, object_cur, object_top;
7091 int grp_cnt, grp_idx[100];
7099 bool visual_list = FALSE;
7100 byte attr_top = 0, char_left = 0;
7108 Term_get_size(&wid, &hgt);
7110 browser_rows = hgt - 8;
7112 /* Allocate the "object_idx" array */
7113 C_MAKE(object_idx, max_k_idx, int);
7118 if (direct_k_idx < 0)
7120 mode = visual_only ? 0x03 : 0x01;
7122 /* Check every group */
7123 for (i = 0; object_group_text[i] != NULL; i++)
7125 /* Measure the label */
7126 len = strlen(object_group_text[i]);
7128 /* Save the maximum length */
7129 if (len > max) max = len;
7131 /* See if any monsters are known */
7132 if (collect_objects(i, object_idx, mode))
7134 /* Build a list of groups with known monsters */
7135 grp_idx[grp_cnt++] = i;
7144 object_kind *k_ptr = &k_info[direct_k_idx];
7145 object_kind *flavor_k_ptr;
7147 if (!visual_only && k_ptr->flavor)
7149 /* Appearance of this object is shuffled */
7150 flavor_k_ptr = &k_info[k_ptr->flavor];
7154 /* Appearance of this object is very normal */
7155 flavor_k_ptr = k_ptr;
7158 object_idx[0] = direct_k_idx;
7159 object_old = direct_k_idx;
7162 /* Terminate the list */
7165 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7166 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7169 /* Terminate the list */
7170 grp_idx[grp_cnt] = -1;
7173 grp_cur = grp_top = 0;
7174 object_cur = object_top = 0;
7179 mode = visual_only ? 0x02 : 0x00;
7184 object_kind *k_ptr, *flavor_k_ptr;
7191 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7192 if (direct_k_idx < 0) prt("グループ", 4, 0);
7193 prt("名前", 4, max + 3);
7194 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7197 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7198 if (direct_k_idx < 0) prt("Group", 4, 0);
7199 prt("Name", 4, max + 3);
7200 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7204 for (i = 0; i < 78; i++)
7206 Term_putch(i, 5, TERM_WHITE, '=');
7209 if (direct_k_idx < 0)
7211 for (i = 0; i < browser_rows; i++)
7213 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7220 if (direct_k_idx < 0)
7222 /* Scroll group list */
7223 if (grp_cur < grp_top) grp_top = grp_cur;
7224 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7226 /* Display a list of object groups */
7227 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7229 if (old_grp_cur != grp_cur)
7231 old_grp_cur = grp_cur;
7233 /* Get a list of objects in the current group */
7234 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7237 /* Scroll object list */
7238 while (object_cur < object_top)
7239 object_top = MAX(0, object_top - browser_rows/2);
7240 while (object_cur >= object_top + browser_rows)
7241 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7246 /* Display a list of objects in the current group */
7247 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7251 object_top = object_cur;
7253 /* Display a list of objects in the current group */
7254 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7256 /* Display visual list below first object */
7257 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7260 /* Get the current object */
7261 k_ptr = &k_info[object_idx[object_cur]];
7263 if (!visual_only && k_ptr->flavor)
7265 /* Appearance of this object is shuffled */
7266 flavor_k_ptr = &k_info[k_ptr->flavor];
7270 /* Appearance of this object is very normal */
7271 flavor_k_ptr = k_ptr;
7276 prt(format("<方向>%s%s%s, ESC",
7277 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7278 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7279 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7282 prt(format("<dir>%s%s%s, ESC",
7283 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7284 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7285 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7291 /* Mega Hack -- track this object */
7292 if (object_cnt) object_kind_track(object_idx[object_cur]);
7294 /* The "current" object changed */
7295 if (object_old != object_idx[object_cur])
7297 /* Hack -- handle stuff */
7300 /* Remember the "current" object */
7301 object_old = object_idx[object_cur];
7307 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7311 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7315 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7320 /* Do visual mode command if needed */
7321 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))
7323 if (direct_k_idx >= 0)
7348 /* Recall on screen */
7349 if (!visual_list && !visual_only && (grp_cnt > 0))
7351 desc_obj_fake(object_idx[object_cur]);
7359 /* Move the cursor */
7360 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7366 /* Free the "object_idx" array */
7367 C_KILL(object_idx, max_k_idx, int);
7372 * Display the features in a group.
7374 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
7375 int feat_cur, int feat_top, bool visual_only, int lighting_level)
7377 int lit_col[F_LIT_MAX], i, j;
7378 int f_idx_col = use_bigtile ? 62 : 64;
7380 /* Correct columns 1 and 4 */
7381 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7382 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7383 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7385 /* Display lines until done */
7386 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7391 int f_idx = feat_idx[feat_top + i];
7393 /* Access the index */
7394 feature_type *f_ptr = &f_info[f_idx];
7396 int row_i = row + i;
7398 /* Choose a color */
7399 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7401 /* Display the name */
7402 c_prt(attr, f_name + f_ptr->name, row_i, col);
7404 /* Hack -- visual_list mode */
7407 /* Display lighting level */
7408 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7410 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));
7412 if (p_ptr->wizard || visual_only)
7414 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7417 /* Display symbol */
7418 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);
7420 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7421 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7423 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7425 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7427 /* Mega-hack -- Use non-standard colour */
7428 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7430 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7434 /* Clear remaining lines */
7435 for (; i < per_page; i++)
7437 Term_erase(col, row + i, 255);
7443 * Interact with feature visuals.
7445 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level)
7448 int grp_cur, grp_top, old_grp_cur;
7449 int feat_cur, feat_top;
7450 int grp_cnt, grp_idx[100];
7458 bool visual_list = FALSE;
7459 byte attr_top = 0, char_left = 0;
7464 byte attr_old[F_LIT_MAX];
7465 byte char_old[F_LIT_MAX];
7466 byte *cur_attr_ptr, *cur_char_ptr;
7468 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7469 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7472 Term_get_size(&wid, &hgt);
7474 browser_rows = hgt - 8;
7476 /* Allocate the "feat_idx" array */
7477 C_MAKE(feat_idx, max_f_idx, int);
7482 if (direct_f_idx < 0)
7484 /* Check every group */
7485 for (i = 0; feature_group_text[i] != NULL; i++)
7487 /* Measure the label */
7488 len = strlen(feature_group_text[i]);
7490 /* Save the maximum length */
7491 if (len > max) max = len;
7493 /* See if any features are known */
7494 if (collect_features(i, feat_idx, 0x01))
7496 /* Build a list of groups with known features */
7497 grp_idx[grp_cnt++] = i;
7505 feature_type *f_ptr = &f_info[direct_f_idx];
7507 feat_idx[0] = direct_f_idx;
7510 /* Terminate the list */
7513 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7514 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7516 for (i = 0; i < F_LIT_MAX; i++)
7518 attr_old[i] = f_ptr->x_attr[i];
7519 char_old[i] = f_ptr->x_char[i];
7523 /* Terminate the list */
7524 grp_idx[grp_cnt] = -1;
7527 grp_cur = grp_top = 0;
7528 feat_cur = feat_top = 0;
7536 feature_type *f_ptr;
7543 prt("表示 - 地形", 2, 0);
7544 if (direct_f_idx < 0) prt("グループ", 4, 0);
7545 prt("名前", 4, max + 3);
7548 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7549 prt("文字 ( l/ d)", 4, 66);
7553 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7554 prt("文字 (l/d)", 4, 68);
7557 prt("Visuals - features", 2, 0);
7558 if (direct_f_idx < 0) prt("Group", 4, 0);
7559 prt("Name", 4, max + 3);
7562 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7563 prt("Sym ( l/ d)", 4, 67);
7567 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7568 prt("Sym (l/d)", 4, 69);
7572 for (i = 0; i < 78; i++)
7574 Term_putch(i, 5, TERM_WHITE, '=');
7577 if (direct_f_idx < 0)
7579 for (i = 0; i < browser_rows; i++)
7581 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7588 if (direct_f_idx < 0)
7590 /* Scroll group list */
7591 if (grp_cur < grp_top) grp_top = grp_cur;
7592 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7594 /* Display a list of feature groups */
7595 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7597 if (old_grp_cur != grp_cur)
7599 old_grp_cur = grp_cur;
7601 /* Get a list of features in the current group */
7602 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7605 /* Scroll feature list */
7606 while (feat_cur < feat_top)
7607 feat_top = MAX(0, feat_top - browser_rows/2);
7608 while (feat_cur >= feat_top + browser_rows)
7609 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7614 /* Display a list of features in the current group */
7615 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7619 feat_top = feat_cur;
7621 /* Display a list of features in the current group */
7622 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7624 /* Display visual list below first object */
7625 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7630 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7631 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7632 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7635 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7636 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7637 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7641 /* Get the current feature */
7642 f_ptr = &f_info[feat_idx[feat_cur]];
7643 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7644 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7648 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7652 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7656 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7661 if (visual_list && ((ch == 'A') || (ch == 'a')))
7663 int prev_lighting_level = *lighting_level;
7667 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7668 else (*lighting_level)--;
7672 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7673 else (*lighting_level)++;
7676 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7677 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7679 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7680 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7685 else if ((ch == 'D') || (ch == 'd'))
7687 byte prev_x_attr = f_ptr->x_attr[*lighting_level];
7688 byte prev_x_char = f_ptr->x_char[*lighting_level];
7690 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7694 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7695 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7697 if (prev_x_char != f_ptr->x_char[*lighting_level])
7698 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7700 else *need_redraw = TRUE;
7705 /* Do visual mode command if needed */
7706 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))
7710 /* Restore previous visual settings */
7712 for (i = 0; i < F_LIT_MAX; i++)
7714 f_ptr->x_attr[i] = attr_old[i];
7715 f_ptr->x_char[i] = char_old[i];
7722 if (direct_f_idx >= 0) flag = TRUE;
7723 else *lighting_level = F_LIT_STANDARD;
7726 /* Preserve current visual settings */
7729 for (i = 0; i < F_LIT_MAX; i++)
7731 attr_old[i] = f_ptr->x_attr[i];
7732 char_old[i] = f_ptr->x_char[i];
7734 *lighting_level = F_LIT_STANDARD;
7741 for (i = 0; i < F_LIT_MAX; i++)
7743 attr_idx_feat[i] = f_ptr->x_attr[i];
7744 char_idx_feat[i] = f_ptr->x_char[i];
7753 /* Allow TERM_DARK text */
7754 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7756 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7757 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7775 /* Move the cursor */
7776 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7782 /* Free the "feat_idx" array */
7783 C_KILL(feat_idx, max_f_idx, int);
7788 * List wanted monsters
7790 static void do_cmd_knowledge_kubi(void)
7795 char file_name[1024];
7798 /* Open a new file */
7799 fff = my_fopen_temp(file_name, 1024);
7801 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7808 bool listed = FALSE;
7811 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7813 fprintf(fff, "賞金首リスト\n");
7815 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7817 fprintf(fff, "List of wanted monsters\n");
7819 fprintf(fff, "----------------------------------------------\n");
7821 for (i = 0; i < MAX_KUBI; i++)
7823 if (kubi_r_idx[i] <= 10000)
7825 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7833 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7837 /* Close the file */
7840 /* Display the file contents */
7841 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7843 /* Remove the file */
7848 * List virtues & status
7850 static void do_cmd_knowledge_virtues(void)
7854 char file_name[1024];
7857 /* Open a new file */
7858 fff = my_fopen_temp(file_name, 1024);
7860 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7867 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7871 /* Close the file */
7874 /* Display the file contents */
7875 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7877 /* Remove the file */
7885 static void do_cmd_knowledge_dungeon(void)
7889 char file_name[1024];
7893 /* Open a new file */
7894 fff = my_fopen_temp(file_name, 1024);
7896 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7903 for (i = 1; i < max_d_idx; i++)
7907 if (!d_info[i].maxdepth) continue;
7908 if (!max_dlv[i]) continue;
7909 if (d_info[i].final_guardian)
7911 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7913 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7915 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
7919 /* Close the file */
7922 /* Display the file contents */
7923 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7925 /* Remove the file */
7930 * List virtues & status
7933 static void do_cmd_knowledge_stat(void)
7937 char file_name[1024];
7940 /* Open a new file */
7941 fff = my_fopen_temp(file_name, 1024);
7943 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7950 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7951 (2 * p_ptr->hitdie +
7952 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7955 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7956 else fprintf(fff, "現在の体力ランク : ???\n\n");
7957 fprintf(fff, "能力の最大値\n\n");
7959 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7960 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7961 fprintf(fff, "Limits of maximum stats\n\n");
7963 for (v_nr = 0; v_nr < 6; v_nr++)
7965 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);
7966 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7972 /* Close the file */
7975 /* Display the file contents */
7976 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7978 /* Remove the file */
7984 * Print all active quests
7986 static void do_cmd_knowledge_quests_current(FILE *fff)
7989 char rand_tmp_str[120] = "\0";
7991 monster_race *r_ptr;
7993 int rand_level = 100;
7996 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7998 for (i = 1; i < max_quests; i++)
8000 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
8001 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
8002 (quest[i].status == QUEST_STATUS_COMPLETED))
8004 /* Set the quest number temporary */
8005 int old_quest = p_ptr->inside_quest;
8008 /* Clear the text */
8009 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8010 quest_text_line = 0;
8012 p_ptr->inside_quest = i;
8014 /* Get the quest text */
8015 init_flags = INIT_SHOW_TEXT;
8017 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8019 /* Reset the old quest number */
8020 p_ptr->inside_quest = old_quest;
8022 /* No info from "silent" quests */
8023 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8027 if (quest[i].type != QUEST_TYPE_RANDOM)
8029 char note[80] = "\0";
8031 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
8033 switch (quest[i].type)
8035 case QUEST_TYPE_KILL_LEVEL:
8036 case QUEST_TYPE_KILL_ANY_LEVEL:
8037 r_ptr = &r_info[quest[i].r_idx];
8038 strcpy(name, r_name + r_ptr->name);
8039 if (quest[i].max_num > 1)
8042 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
8043 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8046 sprintf(note," - kill %d %s, have killed %d.",
8047 quest[i].max_num, name, quest[i].cur_num);
8051 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
8054 case QUEST_TYPE_FIND_ARTIFACT:
8057 artifact_type *a_ptr = &a_info[quest[i].k_idx];
8059 object_type *q_ptr = &forge;
8060 int k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
8061 object_prep(q_ptr, k_idx);
8062 q_ptr->name1 = quest[i].k_idx;
8063 q_ptr->ident = IDENT_STORE;
8064 object_desc(name, q_ptr, OD_NAME_ONLY);
8066 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
8068 case QUEST_TYPE_FIND_EXIT:
8069 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8072 case QUEST_TYPE_KILL_NUMBER:
8074 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8075 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8077 sprintf(note," - Kill %d monsters, have killed %d.",
8078 quest[i].max_num, quest[i].cur_num);
8082 case QUEST_TYPE_KILL_ALL:
8083 case QUEST_TYPE_TOWER:
8084 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8089 /* Print the quest info */
8091 sprintf(tmp_str, " %s (危険度:%d階相当)%s\n",
8092 quest[i].name, quest[i].level, note);
8094 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8095 quest[i].name, quest[i].level, note);
8098 fputs(tmp_str, fff);
8100 if (quest[i].status == QUEST_STATUS_COMPLETED)
8102 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8103 fputs(tmp_str, fff);
8109 while (quest_text[j][0] && j < 10)
8111 fprintf(fff, " %s\n", quest_text[j]);
8116 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8119 rand_level = quest[i].level;
8121 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8123 /* Print the quest info */
8124 r_ptr = &r_info[quest[i].r_idx];
8125 strcpy(name, r_name + r_ptr->name);
8127 if (quest[i].max_num > 1)
8130 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8131 quest[i].name, quest[i].level,
8132 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8136 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8137 quest[i].name, quest[i].level,
8138 quest[i].max_num, name, quest[i].cur_num);
8144 sprintf(rand_tmp_str," %s (%d 階) - %sを倒す。\n",
8145 quest[i].name, quest[i].level, name);
8147 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8148 quest[i].name, quest[i].level, name);
8156 /* Print the current random quest */
8157 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8159 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8163 static bool do_cmd_knowledge_quests_aux(FILE *fff, int q_idx)
8166 char playtime_str[16];
8167 quest_type* const q_ptr = &quest[q_idx];
8169 if (is_fixed_quest_idx(q_idx))
8171 /* Set the quest number temporary */
8172 int old_quest = p_ptr->inside_quest;
8174 p_ptr->inside_quest = q_idx;
8177 init_flags = INIT_NAME_ONLY;
8179 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8181 /* Reset the old quest number */
8182 p_ptr->inside_quest = old_quest;
8184 /* No info from "silent" quests */
8185 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8188 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8189 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8191 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8193 /* Print the quest info */
8194 if (q_ptr->complev == 0)
8197 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8198 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8199 r_name+r_info[q_ptr->r_idx].name,
8200 q_ptr->level, playtime_str);
8205 _(" %-35s (%3d階) - レベル%2d - %s\n",
8206 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8207 r_name+r_info[q_ptr->r_idx].name,
8215 /* Print the quest info */
8217 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8218 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8219 q_ptr->name, q_ptr->level, q_ptr->complev, playtime_str);
8222 fputs(tmp_str, fff);
8228 * Print all finished quests
8230 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8235 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8236 for (i = 1; i < max_quests; i++)
8238 int q_idx = quest_num[i];
8239 quest_type* const q_ptr = &quest[q_idx];
8241 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8242 do_cmd_knowledge_quests_aux(fff, q_idx))
8247 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8252 * Print all failed quests
8254 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8259 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8260 for (i = 1; i < max_quests; i++)
8262 int q_idx = quest_num[i];
8263 quest_type* const q_ptr = &quest[q_idx];
8265 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8266 do_cmd_knowledge_quests_aux(fff, q_idx))
8271 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8276 * Print all random quests
8278 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8284 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8285 for (i = 1; i < max_quests; i++)
8287 /* No info from "silent" quests */
8288 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8290 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8294 /* Print the quest info */
8296 sprintf(tmp_str, " %s (%d階, %s)\n",
8297 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8299 sprintf(tmp_str, " %s (%d, %s)\n",
8300 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8302 fputs(tmp_str, fff);
8305 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8309 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8311 int *q_num = (int *)u;
8312 quest_type *qa = &quest[q_num[a]];
8313 quest_type *qb = &quest[q_num[b]];
8318 return (qa->comptime <= qb->comptime);
8321 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8323 int *q_num = (int *)u;
8330 q_num[a] = q_num[b];
8336 * Print quest status of all active quests
8338 static void do_cmd_knowledge_quests(void)
8341 char file_name[1024];
8342 int *quest_num, dummy, i;
8344 /* Open a new file */
8345 fff = my_fopen_temp(file_name, 1024);
8348 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8353 /* Allocate Memory */
8354 C_MAKE(quest_num, max_quests, int);
8356 /* Sort by compete level */
8357 for (i = 1; i < max_quests; i++) quest_num[i] = i;
8358 ang_sort_comp = ang_sort_comp_quest_num;
8359 ang_sort_swap = ang_sort_swap_quest_num;
8360 ang_sort(quest_num, &dummy, max_quests);
8362 /* Dump Quest Information */
8363 do_cmd_knowledge_quests_current(fff);
8365 do_cmd_knowledge_quests_completed(fff, quest_num);
8367 do_cmd_knowledge_quests_failed(fff, quest_num);
8371 do_cmd_knowledge_quests_wiz_random(fff);
8374 /* Close the file */
8377 /* Display the file contents */
8378 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8380 /* Remove the file */
8384 C_KILL(quest_num, max_quests, int);
8391 static void do_cmd_knowledge_home(void)
8396 char file_name[1024];
8398 char o_name[MAX_NLEN];
8401 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8403 /* Open a new file */
8404 fff = my_fopen_temp(file_name, 1024);
8406 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8413 /* Print all homes in the different towns */
8414 st_ptr = &town[1].store[STORE_HOME];
8416 /* Home -- if anything there */
8417 if (st_ptr->stock_num)
8422 /* Header with name of the town */
8423 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8425 /* Dump all available items */
8426 for (i = 0; i < st_ptr->stock_num; i++)
8429 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8430 object_desc(o_name, &st_ptr->stock[i], 0);
8431 if (strlen(o_name) <= 80-3)
8433 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8439 for (n = 0, t = o_name; n < 80-3; n++, t++)
8440 if(iskanji(*t)) {t++; n++;}
8441 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8443 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8444 fprintf(fff, " %.77s\n", o_name+n);
8447 object_desc(o_name, &st_ptr->stock[i], 0);
8448 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8453 /* Add an empty line */
8454 fprintf(fff, "\n\n");
8458 /* Close the file */
8461 /* Display the file contents */
8462 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8464 /* Remove the file */
8470 * Check the status of "autopick"
8472 static void do_cmd_knowledge_autopick(void)
8476 char file_name[1024];
8478 /* Open a new file */
8479 fff = my_fopen_temp(file_name, 1024);
8483 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8490 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8494 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8495 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8498 for (k = 0; k < max_autopick; k++)
8501 byte act = autopick_list[k].action;
8502 if (act & DONT_AUTOPICK)
8504 tmp = _("放置", "Leave");
8506 else if (act & DO_AUTODESTROY)
8508 tmp = _("破壊", "Destroy");
8510 else if (act & DO_AUTOPICK)
8512 tmp = _("拾う", "Pickup");
8514 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
8516 tmp = _("確認", "Query");
8519 if (act & DO_DISPLAY)
8520 fprintf(fff, "%11s", format("[%s]", tmp));
8522 fprintf(fff, "%11s", format("(%s)", tmp));
8524 tmp = autopick_line_from_entry(&autopick_list[k]);
8525 fprintf(fff, " %s", tmp);
8529 /* Close the file */
8531 /* Display the file contents */
8532 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8534 /* Remove the file */
8540 * Interact with "knowledge"
8542 void do_cmd_knowledge(void)
8545 bool need_redraw = FALSE;
8547 /* File type is "TEXT" */
8548 FILE_TYPE(FILE_TYPE_TEXT);
8550 /* Save the screen */
8553 /* Interact until done */
8559 /* Ask for a choice */
8561 prt(format("%d/2 ページ", (p+1)), 2, 65);
8562 prt("現在の知識を確認する", 3, 0);
8564 prt(format("page %d/2", (p+1)), 2, 65);
8565 prt("Display current knowledge", 3, 0);
8568 /* Give some choices */
8572 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8573 prt("(2) 既知のアイテム の一覧", 7, 5);
8574 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8575 prt("(4) 既知のモンスター の一覧", 9, 5);
8576 prt("(5) 倒した敵の数 の一覧", 10, 5);
8577 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8578 prt("(7) 現在のペット の一覧", 12, 5);
8579 prt("(8) 我が家のアイテム の一覧", 13, 5);
8580 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8581 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8585 prt("(a) 自分に関する情報 の一覧", 6, 5);
8586 prt("(b) 突然変異 の一覧", 7, 5);
8587 prt("(c) 武器の経験値 の一覧", 8, 5);
8588 prt("(d) 魔法の経験値 の一覧", 9, 5);
8589 prt("(e) 技能の経験値 の一覧", 10, 5);
8590 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8591 prt("(g) 入ったダンジョン の一覧", 12, 5);
8592 prt("(h) 実行中のクエスト の一覧", 13, 5);
8593 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8598 prt("(1) Display known artifacts", 6, 5);
8599 prt("(2) Display known objects", 7, 5);
8600 prt("(3) Display remaining uniques", 8, 5);
8601 prt("(4) Display known monster", 9, 5);
8602 prt("(5) Display kill count", 10, 5);
8603 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8604 prt("(7) Display current pets", 12, 5);
8605 prt("(8) Display home inventory", 13, 5);
8606 prt("(9) Display *identified* equip.", 14, 5);
8607 prt("(0) Display terrain symbols.", 15, 5);
8611 prt("(a) Display about yourself", 6, 5);
8612 prt("(b) Display mutations", 7, 5);
8613 prt("(c) Display weapon proficiency", 8, 5);
8614 prt("(d) Display spell proficiency", 9, 5);
8615 prt("(e) Display misc. proficiency", 10, 5);
8616 prt("(f) Display virtues", 11, 5);
8617 prt("(g) Display dungeons", 12, 5);
8618 prt("(h) Display current quests", 13, 5);
8619 prt("(i) Display auto pick/destroy", 14, 5);
8625 prt("ESC) 抜ける", 21, 1);
8626 prt("SPACE) 次ページ", 21, 30);
8627 /*prt("-) 前ページ", 21, 60);*/
8628 prt("コマンド:", 20, 0);
8630 prt("-more-", 17, 8);
8631 prt("ESC) Exit menu", 21, 1);
8632 prt("SPACE) Next page", 21, 30);
8633 /*prt("-) Previous page", 21, 60);*/
8634 prt("Command: ", 20, 0);
8641 if (i == ESCAPE) break;
8644 case ' ': /* Page change */
8648 case '1': /* Artifacts */
8649 do_cmd_knowledge_artifacts();
8651 case '2': /* Objects */
8652 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8654 case '3': /* Uniques */
8655 do_cmd_knowledge_uniques();
8657 case '4': /* Monsters */
8658 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8660 case '5': /* Kill count */
8661 do_cmd_knowledge_kill_count();
8663 case '6': /* wanted */
8664 if (!vanilla_town) do_cmd_knowledge_kubi();
8666 case '7': /* Pets */
8667 do_cmd_knowledge_pets();
8669 case '8': /* Home */
8670 do_cmd_knowledge_home();
8672 case '9': /* Resist list */
8673 do_cmd_knowledge_inven();
8675 case '0': /* Feature list */
8677 int lighting_level = F_LIT_STANDARD;
8678 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8682 case 'a': /* Max stat */
8683 do_cmd_knowledge_stat();
8685 case 'b': /* Mutations */
8686 do_cmd_knowledge_mutations();
8688 case 'c': /* weapon-exp */
8689 do_cmd_knowledge_weapon_exp();
8691 case 'd': /* spell-exp */
8692 do_cmd_knowledge_spell_exp();
8694 case 'e': /* skill-exp */
8695 do_cmd_knowledge_skill_exp();
8697 case 'f': /* Virtues */
8698 do_cmd_knowledge_virtues();
8700 case 'g': /* Dungeon */
8701 do_cmd_knowledge_dungeon();
8703 case 'h': /* Quests */
8704 do_cmd_knowledge_quests();
8706 case 'i': /* Autopick */
8707 do_cmd_knowledge_autopick();
8709 default: /* Unknown option */
8713 /* Flush messages */
8717 /* Restore the screen */
8720 if (need_redraw) do_cmd_redraw();
8725 * Check on the status of an active quest
8727 void do_cmd_checkquest(void)
8729 /* File type is "TEXT" */
8730 FILE_TYPE(FILE_TYPE_TEXT);
8732 /* Save the screen */
8736 do_cmd_knowledge_quests();
8738 /* Restore the screen */
8744 * Display the time and date
8746 void do_cmd_time(void)
8748 int day, hour, min, full, start, end, num;
8756 extract_day_hour_min(&day, &hour, &min);
8758 full = hour * 100 + min;
8765 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8767 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8768 else strcpy(day_buf, "*****");
8772 msg_format("%s日目, 時刻は%d:%02d %sです。",
8773 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8774 min, (hour < 12) ? "AM" : "PM");
8776 msg_format("This is day %s. The time is %d:%02d %s.",
8777 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8778 min, (hour < 12) ? "AM" : "PM");
8783 if (!randint0(10) || p_ptr->image)
8785 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8789 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8792 /* Open this file */
8793 fff = my_fopen(buf, "rt");
8798 /* Find this time */
8799 while (!my_fgets(fff, buf, sizeof(buf)))
8801 /* Ignore comments */
8802 if (!buf[0] || (buf[0] == '#')) continue;
8804 /* Ignore invalid lines */
8805 if (buf[1] != ':') continue;
8807 /* Process 'Start' */
8810 /* Extract the starting time */
8811 start = atoi(buf + 2);
8813 /* Assume valid for an hour */
8823 /* Extract the ending time */
8824 end = atoi(buf + 2);
8830 /* Ignore incorrect range */
8831 if ((start > full) || (full > end)) continue;
8833 /* Process 'Description' */
8838 /* Apply the randomizer */
8839 if (!randint0(num)) strcpy(desc, buf + 2);
8849 /* Close the file */