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_WIZ_ARTIFACT:
698 fprintf(fff, "WIZ/ARTIFACT_INFO: %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 */
1242 prt(format("以前のメッセージ %d-%d 全部で(%d)",
1243 i, i + j - 1, n), 0, 0);
1245 prt(format("Message Recall (%d-%d of %d)",
1246 i, i + j - 1, n), 0, 0);
1249 /* Display prompt (not very informative) */
1250 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1251 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1254 skey = inkey_special(TRUE);
1256 /* Exit on Escape */
1257 if (skey == ESCAPE) break;
1259 /* Hack -- Save the old index */
1264 /* Hack -- handle show */
1267 prt(_("強調: ", "Show: "), hgt - 1, 0);
1269 /* Get a "shower" string, or continue */
1270 strcpy(back_str, shower_str);
1271 if (askfor(shower_str, 80))
1274 shower = shower_str[0] ? shower_str : NULL;
1276 else strcpy(shower_str, back_str);
1281 /* Hack -- handle find */
1288 prt(_("検索: ", "Find: "), hgt - 1, 0);
1290 /* Get a "finder" string, or continue */
1291 strcpy(back_str, finder_str);
1292 if (!askfor(finder_str, 80))
1294 strcpy(finder_str, back_str);
1297 else if (!finder_str[0])
1299 shower = NULL; /* Stop showing */
1304 shower = finder_str;
1307 for (z = i + 1; z < n; z++)
1309 cptr msg = message_str(z);
1312 if (my_strstr(msg, finder_str))
1324 /* Recall 1 older message */
1326 /* Go to the oldest line */
1330 /* Recall 1 newer message */
1332 /* Go to the newest line */
1336 /* Recall 1 older message */
1341 /* Go older if legal */
1342 i = MIN(i + 1, n - num_lines);
1345 /* Recall 10 older messages */
1347 /* Go older if legal */
1348 i = MIN(i + 10, n - num_lines);
1351 /* Recall 20 older messages */
1356 /* Go older if legal */
1357 i = MIN(i + num_lines, n - num_lines);
1360 /* Recall 20 newer messages */
1364 /* Go newer (if able) */
1365 i = MAX(0, i - num_lines);
1368 /* Recall 10 newer messages */
1370 /* Go newer (if able) */
1374 /* Recall 1 newer messages */
1377 /* Go newer (if able) */
1382 /* Hack -- Error of some kind */
1386 /* Restore the screen */
1393 * チートオプションの最大数 / Number of cheating options
1398 * チーとオプションの定義テーブル / Cheating options
1400 static option_type cheat_info[CHEAT_MAX] =
1402 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1403 "cheat_peek", _("アイテムの生成をのぞき見る", "Peek into object creation")
1406 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1407 "cheat_hear", _("モンスターの生成をのぞき見る", "Peek into monster creation")
1410 { &cheat_room, FALSE, 255, 0x04, 0x00,
1411 "cheat_room", _("ダンジョンの生成をのぞき見る", "Peek into dungeon creation")
1414 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1415 "cheat_xtra", _("その他の事をのぞき見る", "Peek into something else")
1418 { &cheat_know, FALSE, 255, 0x10, 0x00,
1419 "cheat_know", _("完全なモンスターの思い出を知る", "Know complete monster info")
1422 { &cheat_live, FALSE, 255, 0x20, 0x00,
1423 "cheat_live", _("死を回避することを可能にする", "Allow player to avoid death")
1426 { &cheat_save, FALSE, 255, 0x40, 0x00,
1427 "cheat_save", _("死んだ時セーブするか確認する", "Ask for saving death")
1430 { &cheat_diary_output, FALSE, 255, 0x80, 0x00,
1431 "cheat_diary_output", _("詳細な情報を日記に出力する", "Output detailed infotmation to diary.")
1438 * @brief チートオプションを変更するコマンドのメインルーチン
1439 * Interact with some options for cheating
1440 * @param info 表示メッセージ
1443 static void do_cmd_options_cheat(cptr info)
1447 int i, k = 0, n = CHEAT_MAX;
1455 /* Interact with the player */
1460 /* Prompt XXX XXX XXX */
1461 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1466 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1467 prt(" << 注意 >>", 11, 0);
1468 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1469 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1470 prt(" じらないようにして下さい。", 14, 0);
1472 /* Display the options */
1473 for (i = 0; i < n; i++)
1475 byte a = TERM_WHITE;
1477 /* Color current option */
1478 if (i == k) a = TERM_L_BLUE;
1480 /* Display the option text */
1481 sprintf(buf, "%-48s: %s (%s)",
1482 cheat_info[i].o_desc,
1483 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1484 cheat_info[i].o_text);
1485 c_prt(a, buf, i + 2, 0);
1488 /* Hilite current option */
1489 move_cursor(k + 2, 50);
1495 * HACK - Try to translate the key into a direction
1496 * to allow using the roguelike keys for navigation.
1498 dir = get_keymap_dir(ch);
1499 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1513 k = (n + k - 1) % n;
1531 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1532 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1533 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1534 (*cheat_info[k].o_var) = TRUE;
1543 (*cheat_info[k].o_var) = FALSE;
1550 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1551 /* Peruse the help file */
1552 (void)show_file(TRUE, buf, NULL, 0, 0);
1571 static option_type autosave_info[2] =
1573 { &autosave_l, FALSE, 255, 0x01, 0x00,
1574 "autosave_l", _("新しい階に入る度に自動セーブする", "Autosave when entering new levels") },
1576 { &autosave_t, FALSE, 255, 0x02, 0x00,
1577 "autosave_t", _("一定ターン毎に自動セーブする", "Timed autosave") },
1581 * @brief セーブ頻度ターンの次の値を返す
1582 * @param current 現在のセーブ頻度ターン値
1583 * @return 次のセーブ頻度ターン値
1585 static s16b toggle_frequency(s16b current)
1590 case 50: return 100;
1591 case 100: return 250;
1592 case 250: return 500;
1593 case 500: return 1000;
1594 case 1000: return 2500;
1595 case 2500: return 5000;
1596 case 5000: return 10000;
1597 case 10000: return 25000;
1604 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1605 * @param info 表示メッセージ
1608 static void do_cmd_options_autosave(cptr info)
1612 int i, k = 0, n = 2;
1620 /* Interact with the player */
1623 /* Prompt XXX XXX XXX */
1624 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1625 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1629 /* Display the options */
1630 for (i = 0; i < n; i++)
1632 byte a = TERM_WHITE;
1634 /* Color current option */
1635 if (i == k) a = TERM_L_BLUE;
1637 /* Display the option text */
1638 sprintf(buf, "%-48s: %s (%s)",
1639 autosave_info[i].o_desc,
1640 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1641 autosave_info[i].o_text);
1642 c_prt(a, buf, i + 2, 0);
1644 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1646 /* Hilite current option */
1647 move_cursor(k + 2, 50);
1663 k = (n + k - 1) % n;
1681 (*autosave_info[k].o_var) = TRUE;
1690 (*autosave_info[k].o_var) = FALSE;
1698 autosave_freq = toggle_frequency(autosave_freq);
1699 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1705 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1721 * @brief 標準オプションを変更するコマンドのサブルーチン /
1722 * Interact with some options
1723 * @param page オプションページ番号
1724 * @param info 表示メッセージ
1727 void do_cmd_options_aux(int page, cptr info)
1730 int i, k = 0, n = 0, l;
1733 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1734 (!p_ptr->wizard || !allow_debug_opts);
1737 /* Lookup the options */
1738 for (i = 0; i < 24; i++) opt[i] = 0;
1740 /* Scan the options */
1741 for (i = 0; option_info[i].o_desc; i++)
1743 /* Notice options on this "page" */
1744 if (option_info[i].o_page == page) opt[n++] = i;
1751 /* Interact with the player */
1756 /* Prompt XXX XXX XXX */
1757 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1758 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1761 /* HACK -- description for easy-auto-destroy options */
1762 if (page == OPT_PAGE_AUTODESTROY)
1763 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1764 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1766 /* Display the options */
1767 for (i = 0; i < n; i++)
1769 byte a = TERM_WHITE;
1771 /* Color current option */
1772 if (i == k) a = TERM_L_BLUE;
1774 /* Display the option text */
1775 sprintf(buf, "%-48s: %s (%.19s)",
1776 option_info[opt[i]].o_desc,
1777 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1778 option_info[opt[i]].o_text);
1779 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1780 else c_prt(a, buf, i + 2, 0);
1783 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1786 /* Hilite current option */
1787 move_cursor(k + 2 + l, 50);
1793 * HACK - Try to translate the key into a direction
1794 * to allow using the roguelike keys for navigation.
1796 dir = get_keymap_dir(ch);
1797 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1811 k = (n + k - 1) % n;
1828 if (browse_only) break;
1829 (*option_info[opt[k]].o_var) = TRUE;
1838 if (browse_only) break;
1839 (*option_info[opt[k]].o_var) = FALSE;
1847 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1853 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1854 /* Peruse the help file */
1855 (void)show_file(TRUE, buf, NULL, 0, 0);
1872 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1873 * Modify the "window" options
1876 static void do_cmd_options_win(void)
1886 /* Memorize old flags */
1887 for (j = 0; j < 8; j++)
1889 /* Acquire current flags */
1890 old_flag[j] = window_flag[j];
1900 /* Prompt XXX XXX XXX */
1901 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1903 /* Display the windows */
1904 for (j = 0; j < 8; j++)
1906 byte a = TERM_WHITE;
1908 cptr s = angband_term_name[j];
1911 if (j == x) a = TERM_L_BLUE;
1913 /* Window name, staggered, centered */
1914 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1917 /* Display the options */
1918 for (i = 0; i < 16; i++)
1920 byte a = TERM_WHITE;
1922 cptr str = window_flag_desc[i];
1925 if (i == y) a = TERM_L_BLUE;
1928 if (!str) str = _("(未使用)", "(Unused option)");
1931 Term_putstr(0, i + 5, -1, a, str);
1933 /* Display the windows */
1934 for (j = 0; j < 8; j++)
1940 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1943 if (window_flag[j] & (1L << i)) c = 'X';
1946 Term_putch(35 + j * 5, i + 5, a, c);
1951 Term_gotoxy(35 + x * 5, y + 5);
1969 for (j = 0; j < 8; j++)
1971 window_flag[j] &= ~(1L << y);
1975 for (i = 0; i < 16; i++)
1977 window_flag[x] &= ~(1L << i);
1990 window_flag[x] |= (1L << y);
1998 window_flag[x] &= ~(1L << y);
2004 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
2012 d = get_keymap_dir(ch);
2014 x = (x + ddx[d] + 8) % 8;
2015 y = (y + ddy[d] + 16) % 16;
2022 /* Notice changes */
2023 for (j = 0; j < 8; j++)
2028 if (!angband_term[j]) continue;
2030 /* Ignore non-changes */
2031 if (window_flag[j] == old_flag[j]) continue;
2034 Term_activate(angband_term[j]);
2057 option_fields[OPT_NUM] =
2060 { '1', " キー入力 オプション", 3 },
2061 { '2', " マップ画面 オプション", 4 },
2062 { '3', " テキスト表示 オプション", 5 },
2063 { '4', " ゲームプレイ オプション", 6 },
2064 { '5', " 行動中止関係 オプション", 7 },
2065 { '6', " 簡易自動破壊 オプション", 8 },
2066 { 'r', " プレイ記録 オプション", 9 },
2068 { 'p', "自動拾いエディタ", 11 },
2069 { 'd', " 基本ウェイト量 ", 12 },
2070 { 'h', "低ヒットポイント", 13 },
2071 { 'm', " 低魔力色閾値 ", 14 },
2072 { 'a', " 自動セーブ オプション", 15 },
2073 { 'w', "ウインドウフラグ", 16 },
2075 { 'b', " 初期 オプション (参照のみ)", 18 },
2076 { 'c', " 詐欺 オプション", 19 },
2078 { '1', "Input Options", 3 },
2079 { '2', "Map Screen Options", 4 },
2080 { '3', "Text Display Options", 5 },
2081 { '4', "Game-Play Options", 6 },
2082 { '5', "Disturbance Options", 7 },
2083 { '6', "Easy Auto-Destroyer Options", 8 },
2084 { 'r', "Play record Options", 9 },
2086 { 'p', "Auto-picker/destroyer editor", 11 },
2087 { 'd', "Base Delay Factor", 12 },
2088 { 'h', "Hitpoint Warning", 13 },
2089 { 'm', "Mana Color Threshold", 14 },
2090 { 'a', "Autosave Options", 15 },
2091 { 'w', "Window Flags", 16 },
2093 { 'b', "Birth Options (Browse Only)", 18 },
2094 { 'c', "Cheat Options", 19 },
2100 * @brief 標準オプションを変更するコマンドのメインルーチン /
2101 * Set or unset various options.
2105 * The user must use the "Ctrl-R" command to "adapt" to changes
2106 * in any options which control "visual" aspects of the game.
2109 void do_cmd_options(void)
2115 /* Save the screen */
2123 /* Does not list cheat option when cheat option is off */
2124 if (!p_ptr->noscore && !allow_debug_opts) n--;
2129 /* Why are we here */
2130 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2134 /* Give some choices */
2135 for (i = 0; i < n; i++)
2137 byte a = TERM_WHITE;
2138 if (i == y) a = TERM_L_BLUE;
2139 Term_putstr(5, option_fields[i].row, -1, a,
2140 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2143 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2146 skey = inkey_special(TRUE);
2147 if (!(skey & SKEY_MASK)) k = (char)skey;
2151 if (k == ESCAPE) break;
2153 if (my_strchr("\n\r ", k))
2155 k = option_fields[y].key;
2159 for (i = 0; i < n; i++)
2161 if (tolower(k) == option_fields[i].key) break;
2164 /* Command is found */
2167 /* Hack -- browse help */
2168 if (k == '?') break;
2172 if (skey == SKEY_UP) d = 8;
2173 if (skey == SKEY_DOWN) d = 2;
2174 y = (y + ddy[d] + n) % n;
2179 if (k == ESCAPE) break;
2186 /* Process the general options */
2187 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2193 /* Process the general options */
2194 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2201 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2208 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2215 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2222 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2226 /* Play-record Options */
2231 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2240 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2241 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2242 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2246 /* Cheating Options */
2249 if (!p_ptr->noscore && !allow_debug_opts)
2251 /* Cheat options are not permitted */
2257 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2264 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2273 do_cmd_options_win();
2274 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2275 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2276 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2277 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2282 /* Auto-picker/destroyer editor */
2286 do_cmd_edit_autopick();
2290 /* Hack -- Delay Speed */
2296 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2298 /* Get a new value */
2301 int msec = delay_factor * delay_factor * delay_factor;
2302 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2303 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2305 if (k == ESCAPE) break;
2308 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2311 else if (isdigit(k)) delay_factor = D2I(k);
2318 /* Hack -- hitpoint warning factor */
2324 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2326 /* Get a new value */
2329 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2330 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2332 if (k == ESCAPE) break;
2335 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2338 else if (isdigit(k)) hitpoint_warn = D2I(k);
2345 /* Hack -- mana color factor */
2351 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2353 /* Get a new value */
2356 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2357 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2359 if (k == ESCAPE) break;
2362 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2365 else if (isdigit(k)) mana_warn = D2I(k);
2373 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2377 /* Unknown option */
2386 /* Flush messages */
2391 /* Restore the screen */
2394 /* Hack - Redraw equippy chars */
2395 p_ptr->redraw |= (PR_EQUIPPY);
2401 * @brief prefファイルを選択して処理する /
2402 * Ask for a "user pref line" and process it
2405 * XXX XXX XXX Allow absolute file names?
2407 void do_cmd_pref(void)
2414 /* Ask for a "user pref command" */
2415 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2417 /* Process that pref command */
2418 (void)process_pref_file_command(buf);
2422 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2425 void do_cmd_reload_autopick(void)
2427 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2428 /* Load the file with messages */
2429 autopick_load_pref(TRUE);
2435 * @brief マクロ情報をprefファイルに保存する /
2436 * @param fname ファイル名
2439 static errr macro_dump(cptr fname)
2441 static cptr mark = "Macro Dump";
2447 /* Build the filename */
2448 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2450 /* File type is "TEXT" */
2451 FILE_TYPE(FILE_TYPE_TEXT);
2453 /* Append to the file */
2454 if (!open_auto_dump(buf, mark)) return (-1);
2457 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2460 for (i = 0; i < macro__num; i++)
2462 /* Extract the action */
2463 ascii_to_text(buf, macro__act[i]);
2465 /* Dump the macro */
2466 auto_dump_printf("A:%s\n", buf);
2468 /* Extract the action */
2469 ascii_to_text(buf, macro__pat[i]);
2471 /* Dump normal macros */
2472 auto_dump_printf("P:%s\n", buf);
2475 auto_dump_printf("\n");
2487 * @brief マクロのトリガーキーを取得する /
2488 * Hack -- ask for a "trigger" (see below)
2489 * @param buf キー表記を保管するバッファ
2493 * Note the complex use of the "inkey()" function from "util.c".
2495 * Note that both "flush()" calls are extremely important.
2498 static void do_cmd_macro_aux(char *buf)
2508 /* Do not process macros */
2514 /* Read the pattern */
2520 /* Do not process macros */
2523 /* Do not wait for keys */
2526 /* Attempt to read a key */
2537 /* Convert the trigger */
2538 ascii_to_text(tmp, buf);
2540 /* Hack -- display the trigger */
2541 Term_addstr(-1, TERM_WHITE, tmp);
2547 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2548 * Hack -- ask for a keymap "trigger" (see below)
2549 * @param buf キー表記を取得するバッファ
2553 * Note that both "flush()" calls are extremely important. This may
2554 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2557 static void do_cmd_macro_aux_keymap(char *buf)
2571 /* Convert to ascii */
2572 ascii_to_text(tmp, buf);
2574 /* Hack -- display the trigger */
2575 Term_addstr(-1, TERM_WHITE, tmp);
2584 * @brief キーマップをprefファイルにダンプする /
2585 * Hack -- append all keymaps to the given file
2586 * @param fname ファイルネーム
2590 static errr keymap_dump(cptr fname)
2592 static cptr mark = "Keymap Dump";
2601 if (rogue_like_commands)
2603 mode = KEYMAP_MODE_ROGUE;
2609 mode = KEYMAP_MODE_ORIG;
2613 /* Build the filename */
2614 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2616 /* File type is "TEXT" */
2617 FILE_TYPE(FILE_TYPE_TEXT);
2619 /* Append to the file */
2620 if (!open_auto_dump(buf, mark)) return -1;
2623 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2626 for (i = 0; i < 256; i++)
2630 /* Loop up the keymap */
2631 act = keymap_act[mode][i];
2633 /* Skip empty keymaps */
2636 /* Encode the key */
2639 ascii_to_text(key, buf);
2641 /* Encode the action */
2642 ascii_to_text(buf, act);
2644 /* Dump the macro */
2645 auto_dump_printf("A:%s\n", buf);
2646 auto_dump_printf("C:%d:%s\n", mode, key);
2658 * @brief マクロを設定するコマンドのメインルーチン /
2659 * Interact with "macros"
2663 * Note that the macro "action" must be defined before the trigger.
2665 * Could use some helpful instructions on this page. XXX XXX XXX
2668 void do_cmd_macros(void)
2680 if (rogue_like_commands)
2682 mode = KEYMAP_MODE_ROGUE;
2688 mode = KEYMAP_MODE_ORIG;
2691 /* File type is "TEXT" */
2692 FILE_TYPE(FILE_TYPE_TEXT);
2699 /* Process requests until done */
2706 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2708 /* Describe that action */
2709 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2711 /* Analyze the current action */
2712 ascii_to_text(buf, macro__buf);
2714 /* Display the current action */
2719 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2721 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2722 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2723 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2724 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2725 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2726 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2727 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2728 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2729 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2730 #endif /* ALLOW_MACROS */
2733 prt(_("コマンド: ", "Command: "), 16, 0);
2739 if (i == ESCAPE) break;
2741 /* Load a 'macro' file */
2747 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2750 prt(_("ファイル: ", "File: "), 18, 0);
2752 /* Default filename */
2753 sprintf(tmp, "%s.prf", player_base);
2755 /* Ask for a file */
2756 if (!askfor(tmp, 80)) continue;
2758 /* Process the given filename */
2759 err = process_pref_file(tmp);
2762 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2767 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2771 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2781 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2784 prt(_("ファイル: ", "File: "), 18, 0);
2786 /* Default filename */
2787 sprintf(tmp, "%s.prf", player_base);
2789 /* Ask for a file */
2790 if (!askfor(tmp, 80)) continue;
2792 /* Dump the macros */
2793 (void)macro_dump(tmp);
2796 msg_print(_("マクロを追加しました。", "Appended macros."));
2805 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2809 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2811 /* Get a macro trigger */
2812 do_cmd_macro_aux(buf);
2814 /* Acquire action */
2815 k = macro_find_exact(buf);
2821 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2827 /* Obtain the action */
2828 strcpy(macro__buf, macro__act[k]);
2830 /* Analyze the current action */
2831 ascii_to_text(buf, macro__buf);
2833 /* Display the current action */
2837 msg_print(_("マクロを確認しました。", "Found a macro."));
2841 /* Create a macro */
2845 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2848 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2850 /* Get a macro trigger */
2851 do_cmd_macro_aux(buf);
2857 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2858 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2861 prt(_("マクロ行動: ", "Action: "), 20, 0);
2863 /* Convert to text */
2864 ascii_to_text(tmp, macro__buf);
2866 /* Get an encoded action */
2867 if (askfor(tmp, 80))
2869 /* Convert to ascii */
2870 text_to_ascii(macro__buf, tmp);
2872 /* Link the macro */
2873 macro_add(buf, macro__buf);
2876 msg_print(_("マクロを追加しました。", "Added a macro."));
2880 /* Remove a macro */
2884 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2887 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2889 /* Get a macro trigger */
2890 do_cmd_macro_aux(buf);
2892 /* Link the macro */
2893 macro_add(buf, buf);
2896 msg_print(_("マクロを削除しました。", "Removed a macro."));
2903 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2906 prt(_("ファイル: ", "File: "), 18, 0);
2908 /* Default filename */
2909 sprintf(tmp, "%s.prf", player_base);
2911 /* Ask for a file */
2912 if (!askfor(tmp, 80)) continue;
2914 /* Dump the macros */
2915 (void)keymap_dump(tmp);
2918 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2921 /* Query a keymap */
2927 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2930 prt(_("押すキー: ", "Keypress: "), 18, 0);
2932 /* Get a keymap trigger */
2933 do_cmd_macro_aux_keymap(buf);
2935 /* Look up the keymap */
2936 act = keymap_act[mode][(byte)(buf[0])];
2942 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2948 /* Obtain the action */
2949 strcpy(macro__buf, act);
2951 /* Analyze the current action */
2952 ascii_to_text(buf, macro__buf);
2954 /* Display the current action */
2958 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2962 /* Create a keymap */
2966 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2969 prt(_("押すキー: ", "Keypress: "), 18, 0);
2971 /* Get a keymap trigger */
2972 do_cmd_macro_aux_keymap(buf);
2978 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2979 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2982 prt(_("行動: ", "Action: "), 20, 0);
2984 /* Convert to text */
2985 ascii_to_text(tmp, macro__buf);
2987 /* Get an encoded action */
2988 if (askfor(tmp, 80))
2990 /* Convert to ascii */
2991 text_to_ascii(macro__buf, tmp);
2993 /* Free old keymap */
2994 string_free(keymap_act[mode][(byte)(buf[0])]);
2996 /* Make new keymap */
2997 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3000 msg_print(_("キー配置を追加しました。", "Added a keymap."));
3004 /* Remove a keymap */
3008 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
3011 prt(_("押すキー: ", "Keypress: "), 18, 0);
3013 /* Get a keymap trigger */
3014 do_cmd_macro_aux_keymap(buf);
3016 /* Free old keymap */
3017 string_free(keymap_act[mode][(byte)(buf[0])]);
3019 /* Make new keymap */
3020 keymap_act[mode][(byte)(buf[0])] = NULL;
3023 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
3026 /* Enter a new action */
3030 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
3036 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
3037 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
3040 prt(_("マクロ行動: ", "Action: "), 20, 0);
3042 /* Hack -- limit the value */
3045 /* Get an encoded action */
3046 if (!askfor(buf, 80)) continue;
3048 /* Extract an action */
3049 text_to_ascii(macro__buf, buf);
3052 #endif /* ALLOW_MACROS */
3061 /* Flush messages */
3070 * @brief キャラクタ色の明暗表現
3072 static cptr lighting_level_str[F_LIT_MAX] =
3087 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
3088 * @param i 指定対象となるキャラクタコード
3089 * @param num 指定されたビジュアルIDを返す参照ポインタ
3090 * @param max ビジュアルIDの最大数
3091 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
3093 static bool cmd_visuals_aux(int i, int *num, int max)
3100 sprintf(str, "%d", *num);
3102 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3105 tmp = strtol(str, NULL, 0);
3106 if (tmp >= 0 && tmp < max)
3109 else if (isupper(i))
3110 *num = (*num + max - 1) % max;
3112 *num = (*num + 1) % max;
3118 * @brief キャラクタの変更メニュー表示
3119 * @param choice_msg 選択メッセージ
3122 static void print_visuals_menu(cptr choice_msg)
3124 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3126 /* Give some choices */
3127 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3129 #ifdef ALLOW_VISUALS
3130 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3131 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3132 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3133 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3134 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3135 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3136 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3137 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3138 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3139 #endif /* ALLOW_VISUALS */
3141 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3144 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3147 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx);
3148 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx);
3149 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level);
3152 * Interact with "visuals"
3154 void do_cmd_visuals(void)
3159 bool need_redraw = FALSE;
3160 const char *empty_symbol = "<< ? >>";
3162 if (use_bigtile) empty_symbol = "<< ?? >>";
3164 /* File type is "TEXT" */
3165 FILE_TYPE(FILE_TYPE_TEXT);
3167 /* Save the screen */
3170 /* Interact until done */
3176 /* Ask for a choice */
3177 print_visuals_menu(NULL);
3183 if (i == ESCAPE) break;
3187 /* Load a 'pref' file */
3190 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3193 prt(_("ファイル: ", "File: "), 17, 0);
3195 /* Default filename */
3196 sprintf(tmp, "%s.prf", player_base);
3199 if (!askfor(tmp, 70)) continue;
3201 /* Process the given filename */
3202 (void)process_pref_file(tmp);
3207 #ifdef ALLOW_VISUALS
3209 /* Dump monster attr/chars */
3212 static cptr mark = "Monster attr/chars";
3215 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3218 prt(_("ファイル: ", "File: "), 17, 0);
3220 /* Default filename */
3221 sprintf(tmp, "%s.prf", player_base);
3223 /* Get a filename */
3224 if (!askfor(tmp, 70)) continue;
3226 /* Build the filename */
3227 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3229 /* Append to the file */
3230 if (!open_auto_dump(buf, mark)) continue;
3233 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3236 for (i = 0; i < max_r_idx; i++)
3238 monster_race *r_ptr = &r_info[i];
3240 /* Skip non-entries */
3241 if (!r_ptr->name) continue;
3243 /* Dump a comment */
3244 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3246 /* Dump the monster attr/char info */
3247 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3248 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3255 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3260 /* Dump object attr/chars */
3263 static cptr mark = "Object attr/chars";
3266 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3269 prt(_("ファイル: ", "File: "), 17, 0);
3271 /* Default filename */
3272 sprintf(tmp, "%s.prf", player_base);
3274 /* Get a filename */
3275 if (!askfor(tmp, 70)) continue;
3277 /* Build the filename */
3278 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3280 /* Append to the file */
3281 if (!open_auto_dump(buf, mark)) continue;
3284 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3287 for (i = 0; i < max_k_idx; i++)
3290 object_kind *k_ptr = &k_info[i];
3292 /* Skip non-entries */
3293 if (!k_ptr->name) continue;
3298 strip_name(o_name, i);
3304 /* Prepare dummy object */
3305 object_prep(&forge, i);
3307 /* Get un-shuffled flavor name */
3308 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3311 /* Dump a comment */
3312 auto_dump_printf("# %s\n", o_name);
3314 /* Dump the object attr/char info */
3315 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3316 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3323 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3328 /* Dump feature attr/chars */
3331 static cptr mark = "Feature attr/chars";
3334 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3337 prt(_("ファイル: ", "File: "), 17, 0);
3339 /* Default filename */
3340 sprintf(tmp, "%s.prf", player_base);
3342 /* Get a filename */
3343 if (!askfor(tmp, 70)) continue;
3345 /* Build the filename */
3346 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3348 /* Append to the file */
3349 if (!open_auto_dump(buf, mark)) continue;
3352 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3355 for (i = 0; i < max_f_idx; i++)
3357 feature_type *f_ptr = &f_info[i];
3359 /* Skip non-entries */
3360 if (!f_ptr->name) continue;
3362 /* Skip mimiccing features */
3363 if (f_ptr->mimic != i) continue;
3365 /* Dump a comment */
3366 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3368 /* Dump the feature attr/char info */
3369 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3370 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3371 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3372 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3379 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3384 /* Modify monster attr/chars (numeric operation) */
3387 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3390 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3392 /* Hack -- query until done */
3395 monster_race *r_ptr = &r_info[r];
3399 byte da = r_ptr->d_attr;
3400 byte dc = r_ptr->d_char;
3401 byte ca = r_ptr->x_attr;
3402 byte cc = r_ptr->x_char;
3404 /* Label the object */
3405 Term_putstr(5, 17, -1, TERM_WHITE,
3406 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3408 /* Label the Default values */
3409 Term_putstr(10, 19, -1, TERM_WHITE,
3410 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3412 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3413 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3415 /* Label the Current values */
3416 Term_putstr(10, 20, -1, TERM_WHITE,
3417 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3419 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3420 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3423 Term_putstr(0, 22, -1, TERM_WHITE,
3424 _("コマンド (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): "));
3430 if (i == ESCAPE) break;
3432 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3433 else if (isupper(i)) c = 'a' + i - 'A';
3443 if (!cmd_visuals_aux(i, &r, max_r_idx))
3449 while (!r_info[r].name);
3453 t = (int)r_ptr->x_attr;
3454 (void)cmd_visuals_aux(i, &t, 256);
3455 r_ptr->x_attr = (byte)t;
3459 t = (int)r_ptr->x_char;
3460 (void)cmd_visuals_aux(i, &t, 256);
3461 r_ptr->x_char = (byte)t;
3465 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3469 print_visuals_menu(choice_msg);
3477 /* Modify object attr/chars (numeric operation) */
3480 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3482 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3484 /* Hack -- query until done */
3487 object_kind *k_ptr = &k_info[k];
3491 byte da = k_ptr->d_attr;
3492 byte dc = k_ptr->d_char;
3493 byte ca = k_ptr->x_attr;
3494 byte cc = k_ptr->x_char;
3496 /* Label the object */
3497 Term_putstr(5, 17, -1, TERM_WHITE,
3498 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3499 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3501 /* Label the Default values */
3502 Term_putstr(10, 19, -1, TERM_WHITE,
3503 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3505 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3506 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3508 /* Label the Current values */
3509 Term_putstr(10, 20, -1, TERM_WHITE,
3510 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3512 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3513 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3516 Term_putstr(0, 22, -1, TERM_WHITE,
3517 _("コマンド (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): "));
3523 if (i == ESCAPE) break;
3525 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3526 else if (isupper(i)) c = 'a' + i - 'A';
3536 if (!cmd_visuals_aux(i, &k, max_k_idx))
3542 while (!k_info[k].name);
3546 t = (int)k_ptr->x_attr;
3547 (void)cmd_visuals_aux(i, &t, 256);
3548 k_ptr->x_attr = (byte)t;
3552 t = (int)k_ptr->x_char;
3553 (void)cmd_visuals_aux(i, &t, 256);
3554 k_ptr->x_char = (byte)t;
3558 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3562 print_visuals_menu(choice_msg);
3570 /* Modify feature attr/chars (numeric operation) */
3573 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3575 static int lighting_level = F_LIT_STANDARD;
3576 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3578 /* Hack -- query until done */
3581 feature_type *f_ptr = &f_info[f];
3585 byte da = f_ptr->d_attr[lighting_level];
3586 byte dc = f_ptr->d_char[lighting_level];
3587 byte ca = f_ptr->x_attr[lighting_level];
3588 byte cc = f_ptr->x_char[lighting_level];
3590 /* Label the object */
3592 Term_putstr(5, 17, -1, TERM_WHITE,
3593 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3594 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3596 /* Label the Default values */
3597 Term_putstr(10, 19, -1, TERM_WHITE,
3598 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3600 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3601 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3603 /* Label the Current values */
3605 Term_putstr(10, 20, -1, TERM_WHITE,
3606 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3608 Term_putstr(10, 20, -1, TERM_WHITE,
3609 format("Current attr/char = %3d / %3d", ca, cc));
3612 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3613 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3617 Term_putstr(0, 22, -1, TERM_WHITE,
3618 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3620 Term_putstr(0, 22, -1, TERM_WHITE,
3621 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3628 if (i == ESCAPE) break;
3630 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3631 else if (isupper(i)) c = 'a' + i - 'A';
3641 if (!cmd_visuals_aux(i, &f, max_f_idx))
3647 while (!f_info[f].name || (f_info[f].mimic != f));
3651 t = (int)f_ptr->x_attr[lighting_level];
3652 (void)cmd_visuals_aux(i, &t, 256);
3653 f_ptr->x_attr[lighting_level] = (byte)t;
3657 t = (int)f_ptr->x_char[lighting_level];
3658 (void)cmd_visuals_aux(i, &t, 256);
3659 f_ptr->x_char[lighting_level] = (byte)t;
3663 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3666 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3670 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3674 print_visuals_menu(choice_msg);
3682 /* Modify monster attr/chars (visual mode) */
3684 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3687 /* Modify object attr/chars (visual mode) */
3689 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3692 /* Modify feature attr/chars (visual mode) */
3695 int lighting_level = F_LIT_STANDARD;
3696 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3700 #endif /* ALLOW_VISUALS */
3709 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3713 /* Unknown option */
3719 /* Flush messages */
3723 /* Restore the screen */
3726 if (need_redraw) do_cmd_redraw();
3731 * Interact with "colors"
3733 void do_cmd_colors(void)
3742 /* File type is "TEXT" */
3743 FILE_TYPE(FILE_TYPE_TEXT);
3746 /* Save the screen */
3750 /* Interact until done */
3756 /* Ask for a choice */
3757 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3759 /* Give some choices */
3760 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3763 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3764 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3768 prt(_("コマンド: ", "Command: "), 8, 0);
3773 if (i == ESCAPE) break;
3775 /* Load a 'pref' file */
3779 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3782 prt(_("ファイル: ", "File: "), 10, 0);
3785 sprintf(tmp, "%s.prf", player_base);
3788 if (!askfor(tmp, 70)) continue;
3790 /* Process the given filename */
3791 (void)process_pref_file(tmp);
3793 /* Mega-Hack -- react to changes */
3794 Term_xtra(TERM_XTRA_REACT, 0);
3796 /* Mega-Hack -- redraw */
3805 static cptr mark = "Colors";
3808 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3811 prt(_("ファイル: ", "File: "), 10, 0);
3813 /* Default filename */
3814 sprintf(tmp, "%s.prf", player_base);
3816 /* Get a filename */
3817 if (!askfor(tmp, 70)) continue;
3819 /* Build the filename */
3820 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3822 /* Append to the file */
3823 if (!open_auto_dump(buf, mark)) continue;
3826 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3829 for (i = 0; i < 256; i++)
3831 int kv = angband_color_table[i][0];
3832 int rv = angband_color_table[i][1];
3833 int gv = angband_color_table[i][2];
3834 int bv = angband_color_table[i][3];
3836 cptr name = _("未知", "unknown");
3838 /* Skip non-entries */
3839 if (!kv && !rv && !gv && !bv) continue;
3841 /* Extract the color name */
3842 if (i < 16) name = color_names[i];
3844 /* Dump a comment */
3845 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3847 /* Dump the monster attr/char info */
3848 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3856 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3865 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3867 /* Hack -- query until done */
3876 /* Exhibit the normal colors */
3877 for (j = 0; j < 16; j++)
3879 /* Exhibit this color */
3880 Term_putstr(j*4, 20, -1, a, "###");
3882 /* Exhibit all colors */
3883 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3886 /* Describe the color */
3887 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3889 /* Describe the color */
3890 Term_putstr(5, 10, -1, TERM_WHITE,
3891 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3893 /* Label the Current values */
3894 Term_putstr(5, 12, -1, TERM_WHITE,
3895 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3896 angband_color_table[a][0],
3897 angband_color_table[a][1],
3898 angband_color_table[a][2],
3899 angband_color_table[a][3]));
3902 Term_putstr(0, 14, -1, TERM_WHITE,
3903 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3910 if (i == ESCAPE) break;
3913 if (i == 'n') a = (byte)(a + 1);
3914 if (i == 'N') a = (byte)(a - 1);
3915 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3916 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3917 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3918 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3919 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3920 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3921 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3922 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3924 /* Hack -- react to changes */
3925 Term_xtra(TERM_XTRA_REACT, 0);
3927 /* Hack -- redraw */
3934 /* Unknown option */
3940 /* Flush messages */
3945 /* Restore the screen */
3951 * Note something in the message recall
3953 void do_cmd_note(void)
3961 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3963 /* Ignore empty notes */
3964 if (!buf[0] || (buf[0] == ' ')) return;
3966 /* Add the note to the message recall */
3967 msg_format(_("メモ: %s", "Note: %s"), buf);
3972 * Mention the current version
3974 void do_cmd_version(void)
3978 #if FAKE_VER_EXTRA > 0
3979 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3980 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3982 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3983 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3990 * Array of feeling strings
3992 static cptr do_cmd_feeling_text[11] =
3994 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3995 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3996 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3997 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3998 _("とても悪い予感がする...", "You have a very bad feeling..."),
3999 _("悪い予感がする...", "You have a bad feeling..."),
4000 _("何か緊張する。", "You feel nervous."),
4001 _("少し不運な気がする...", "You feel your luck is turning..."),
4002 _("この場所は好きになれない。", "You don't like the look of this place."),
4003 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
4004 _("なんて退屈なところだ...", "What a boring place...")
4007 static cptr do_cmd_feeling_text_combat[11] =
4009 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
4010 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
4011 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
4012 _("この階はとても危険なようだ。", "This level looks very dangerous."),
4013 _("とても悪い予感がする...", "You have a very bad feeling..."),
4014 _("悪い予感がする...", "You have a bad feeling..."),
4015 _("何か緊張する。", "You feel nervous."),
4016 _("少し不運な気がする...", "You feel your luck is turning..."),
4017 _("この場所は好きになれない。", "You don't like the look of this place."),
4018 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
4019 _("なんて退屈なところだ...", "What a boring place...")
4022 static cptr do_cmd_feeling_text_lucky[11] =
4024 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
4025 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
4026 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
4027 _("素晴らしい感じがする...", "You have an excellent feeling..."),
4028 _("とても良い感じがする...", "You have a very good feeling..."),
4029 _("良い感じがする...", "You have a good feeling..."),
4030 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
4031 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
4032 _("見た感じ悪くはない...", "You like the look of this place..."),
4033 _("全然駄目ということはないが...", "This level can't be all bad..."),
4034 _("なんて退屈なところだ...", "What a boring place...")
4039 * Note that "feeling" is set to zero unless some time has passed.
4040 * Note that this is done when the level is GENERATED, not entered.
4042 void do_cmd_feeling(void)
4044 /* No useful feeling in quests */
4045 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4047 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
4051 /* No useful feeling in town */
4052 else if (p_ptr->town_num && !dun_level)
4054 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
4056 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
4061 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
4066 /* No useful feeling in the wilderness */
4067 else if (!dun_level)
4069 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
4073 /* Display the feeling */
4074 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4075 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
4076 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
4077 inventory[INVEN_BOW].name1 == ART_CRIMSON)
4078 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
4080 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4086 * Description of each monster group.
4088 static cptr monster_group_text[] =
4091 "ユニーク", /* "Uniques" */
4092 "乗馬可能なモンスター", /* "Riding" */
4093 "賞金首", /* "Wanted */
4094 "アンバーの王族", /* "Ambertite" */
4123 /* "古代ドラゴン/ワイアーム", */
4184 /* "Ancient Dragon/Wyrm", */
4193 "Multi-Headed Reptile",
4198 "Reptile/Amphibian",
4199 "Spider/Scorpion/Tick",
4201 /* "Major Demon", */
4218 * Symbols of monsters in each group. Note the "Uniques" group
4219 * is handled differently.
4221 static cptr monster_group_char[] =
4278 "!$&()+./=>?[\\]`{|~",
4288 * hook function to sort monsters by level
4290 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4292 u16b *who = (u16b*)(u);
4297 monster_race *r_ptr1 = &r_info[w1];
4298 monster_race *r_ptr2 = &r_info[w2];
4303 if (r_ptr2->level > r_ptr1->level) return TRUE;
4304 if (r_ptr1->level > r_ptr2->level) return FALSE;
4306 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4307 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4312 * Build a list of monster indexes in the given group. Return the number
4313 * of monsters in the group.
4315 * mode & 0x01 : check for non-empty group
4316 * mode & 0x02 : visual operation only
4318 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
4323 /* Get a list of x_char in this group */
4324 cptr group_char = monster_group_char[grp_cur];
4326 /* XXX Hack -- Check if this is the "Uniques" group */
4327 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4329 /* XXX Hack -- Check if this is the "Riding" group */
4330 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4332 /* XXX Hack -- Check if this is the "Wanted" group */
4333 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4335 /* XXX Hack -- Check if this is the "Amberite" group */
4336 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4339 /* Check every race */
4340 for (i = 0; i < max_r_idx; i++)
4342 /* Access the race */
4343 monster_race *r_ptr = &r_info[i];
4345 /* Skip empty race */
4346 if (!r_ptr->name) continue ;
4348 /* Require known monsters */
4349 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4353 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4356 else if (grp_riding)
4358 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4361 else if (grp_wanted)
4363 bool wanted = FALSE;
4365 for (j = 0; j < MAX_KUBI; j++)
4367 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4368 (p_ptr->today_mon && p_ptr->today_mon == i))
4374 if (!wanted) continue;
4377 else if (grp_amberite)
4379 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4384 /* Check for race in the group */
4385 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4389 mon_idx[mon_cnt++] = i;
4391 /* XXX Hack -- Just checking for non-empty group */
4392 if (mode & 0x01) break;
4395 /* Terminate the list */
4396 mon_idx[mon_cnt] = -1;
4398 /* Select the sort method */
4399 ang_sort_comp = ang_sort_comp_monster_level;
4400 ang_sort_swap = ang_sort_swap_hook;
4402 /* Sort by monster level */
4403 ang_sort(mon_idx, &dummy_why, mon_cnt);
4405 /* Return the number of races */
4411 * Description of each monster group.
4413 static cptr object_group_text[] =
4416 "キノコ", /* "Mushrooms" */
4417 "薬", /* "Potions" */
4418 "油つぼ", /* "Flasks" */
4419 "巻物", /* "Scrolls" */
4421 "アミュレット", /* "Amulets" */
4422 "笛", /* "Whistle" */
4423 "光源", /* "Lanterns" */
4424 "魔法棒", /* "Wands" */
4427 "カード", /* "Cards" */
4438 "刀剣類", /* "Swords" */
4439 "鈍器", /* "Blunt Weapons" */
4440 "長柄武器", /* "Polearms" */
4441 "採掘道具", /* "Diggers" */
4442 "飛び道具", /* "Bows" */
4446 "軽装鎧", /* "Soft Armor" */
4447 "重装鎧", /* "Hard Armor" */
4448 "ドラゴン鎧", /* "Dragon Armor" */
4449 "盾", /* "Shields" */
4450 "クローク", /* "Cloaks" */
4451 "籠手", /* "Gloves" */
4452 "ヘルメット", /* "Helms" */
4454 "ブーツ", /* "Boots" */
4507 * TVALs of items in each group
4509 static byte object_group_tval[] =
4550 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4558 * Build a list of object indexes in the given group. Return the number
4559 * of objects in the group.
4561 * mode & 0x01 : check for non-empty group
4562 * mode & 0x02 : visual operation only
4564 static int collect_objects(int grp_cur, int object_idx[], byte mode)
4566 int i, j, k, object_cnt = 0;
4568 /* Get a list of x_char in this group */
4569 byte group_tval = object_group_tval[grp_cur];
4571 /* Check every object */
4572 for (i = 0; i < max_k_idx; i++)
4574 /* Access the object */
4575 object_kind *k_ptr = &k_info[i];
4577 /* Skip empty objects */
4578 if (!k_ptr->name) continue;
4582 /* Any objects will be displayed */
4588 /* Skip non-flavoured objects */
4589 if (!k_ptr->flavor) continue;
4591 /* Require objects ever seen */
4592 if (!k_ptr->aware) continue;
4595 /* Skip items with no distribution (special artifacts) */
4596 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4600 /* Check for objects in the group */
4601 if (TV_LIFE_BOOK == group_tval)
4603 /* Hack -- All spell books */
4604 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4606 /* Add the object */
4607 object_idx[object_cnt++] = i;
4611 else if (k_ptr->tval == group_tval)
4613 /* Add the object */
4614 object_idx[object_cnt++] = i;
4618 /* XXX Hack -- Just checking for non-empty group */
4619 if (mode & 0x01) break;
4622 /* Terminate the list */
4623 object_idx[object_cnt] = -1;
4625 /* Return the number of objects */
4631 * Description of each feature group.
4633 static cptr feature_group_text[] =
4641 * Build a list of feature indexes in the given group. Return the number
4642 * of features in the group.
4644 * mode & 0x01 : check for non-empty group
4646 static int collect_features(int grp_cur, int *feat_idx, byte mode)
4648 int i, feat_cnt = 0;
4650 /* Unused; There is a single group. */
4653 /* Check every feature */
4654 for (i = 0; i < max_f_idx; i++)
4656 /* Access the index */
4657 feature_type *f_ptr = &f_info[i];
4659 /* Skip empty index */
4660 if (!f_ptr->name) continue;
4662 /* Skip mimiccing features */
4663 if (f_ptr->mimic != i) continue;
4666 feat_idx[feat_cnt++] = i;
4668 /* XXX Hack -- Just checking for non-empty group */
4669 if (mode & 0x01) break;
4672 /* Terminate the list */
4673 feat_idx[feat_cnt] = -1;
4675 /* Return the number of races */
4682 * Build a list of monster indexes in the given group. Return the number
4683 * of monsters in the group.
4685 static int collect_artifacts(int grp_cur, int object_idx[])
4687 int i, object_cnt = 0;
4689 /* Get a list of x_char in this group */
4690 byte group_tval = object_group_tval[grp_cur];
4692 /* Check every object */
4693 for (i = 0; i < max_a_idx; i++)
4695 /* Access the artifact */
4696 artifact_type *a_ptr = &a_info[i];
4698 /* Skip empty artifacts */
4699 if (!a_ptr->name) continue;
4701 /* Skip "uncreated" artifacts */
4702 if (!a_ptr->cur_num) continue;
4704 /* Check for race in the group */
4705 if (a_ptr->tval == group_tval)
4708 object_idx[object_cnt++] = i;
4712 /* Terminate the list */
4713 object_idx[object_cnt] = 0;
4715 /* Return the number of races */
4722 * Encode the screen colors
4724 static char hack[17] = "dwsorgbuDWvyRGBU";
4728 * Hack -- load a screen dump from a file
4730 void do_cmd_load_screen(void)
4745 Term_get_size(&wid, &hgt);
4747 /* Build the filename */
4748 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4750 /* Append to the file */
4751 fff = my_fopen(buf, "r");
4755 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4761 /* Save the screen */
4764 /* Clear the screen */
4768 /* Load the screen */
4769 for (y = 0; okay; y++)
4771 /* Get a line of data including control code */
4772 if (!fgets(buf, 1024, fff)) okay = FALSE;
4774 /* Get the blank line */
4775 if (buf[0] == '\n' || buf[0] == '\0') break;
4777 /* Ignore too large screen image */
4778 if (y >= hgt) continue;
4781 for (x = 0; x < wid - 1; x++)
4784 if (buf[x] == '\n' || buf[x] == '\0') break;
4786 /* Put the attr/char */
4787 Term_draw(x, y, TERM_WHITE, buf[x]);
4791 /* Dump the screen */
4792 for (y = 0; okay; y++)
4794 /* Get a line of data including control code */
4795 if (!fgets(buf, 1024, fff)) okay = FALSE;
4797 /* Get the blank line */
4798 if (buf[0] == '\n' || buf[0] == '\0') break;
4800 /* Ignore too large screen image */
4801 if (y >= hgt) continue;
4804 for (x = 0; x < wid - 1; x++)
4807 if (buf[x] == '\n' || buf[x] == '\0') break;
4809 /* Get the attr/char */
4810 (void)(Term_what(x, y, &a, &c));
4812 /* Look up the attr */
4813 for (i = 0; i < 16; i++)
4815 /* Use attr matches */
4816 if (hack[i] == buf[x]) a = i;
4819 /* Put the attr/char */
4820 Term_draw(x, y, a, c);
4830 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4836 /* Restore the screen */
4843 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4844 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4847 #define IM_FLAG_STR _("*", "* ")
4848 #define HAS_FLAG_STR _("+", "+ ")
4849 #define NO_FLAG_STR _("・", ". ")
4851 #define print_im_or_res_flag(IM, RES) \
4853 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4854 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4857 #define print_flag(TR) \
4859 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4863 /* XTRA HACK RESLIST */
4864 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
4866 char o_name[MAX_NLEN];
4867 u32b flgs[TR_FLAG_SIZE];
4869 if (!o_ptr->k_idx) return;
4870 if (o_ptr->tval != tval) return;
4872 /* Identified items only */
4873 if (!object_is_known(o_ptr)) return;
4876 * HACK:Ring of Lordly protection and Dragon equipment
4877 * have random resistances.
4879 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4880 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4881 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4882 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4883 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4884 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4885 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4886 || object_is_artifact(o_ptr))
4889 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4891 while (o_name[i] && (i < 26))
4894 if (iskanji(o_name[i])) i++;
4903 o_name[i] = ' '; i++;
4908 fprintf(fff, "%s %s", where, o_name);
4910 if (!(o_ptr->ident & (IDENT_MENTAL)))
4912 fputs(_("-------不明--------------- -------不明---------\n",
4913 "-------unknown------------ -------unknown------\n"), fff);
4917 object_flags_known(o_ptr, flgs);
4919 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4920 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4921 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4922 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4923 print_flag(TR_RES_POIS);
4924 print_flag(TR_RES_LITE);
4925 print_flag(TR_RES_DARK);
4926 print_flag(TR_RES_SHARDS);
4927 print_flag(TR_RES_SOUND);
4928 print_flag(TR_RES_NETHER);
4929 print_flag(TR_RES_NEXUS);
4930 print_flag(TR_RES_CHAOS);
4931 print_flag(TR_RES_DISEN);
4935 print_flag(TR_RES_BLIND);
4936 print_flag(TR_RES_FEAR);
4937 print_flag(TR_RES_CONF);
4938 print_flag(TR_FREE_ACT);
4939 print_flag(TR_SEE_INVIS);
4940 print_flag(TR_HOLD_EXP);
4941 print_flag(TR_TELEPATHY);
4942 print_flag(TR_SLOW_DIGEST);
4943 print_flag(TR_REGEN);
4944 print_flag(TR_LEVITATION);
4952 fprintf(fff, "%s\n", inven_res_label);
4958 * Display *ID* ed weapons/armors's resistances
4960 static void do_cmd_knowledge_inven(void)
4964 char file_name[1024];
4974 /* Open a new file */
4975 fff = my_fopen_temp(file_name, 1024);
4978 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4982 fprintf(fff, "%s\n", inven_res_label);
4984 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4988 for (; j < 9; j++) fputc('\n', fff);
4990 fprintf(fff, "%s\n", inven_res_label);
4992 strcpy(where, _("装", "E "));
4993 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4995 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4997 strcpy(where, _("持", "I "));
4998 for (i = 0; i < INVEN_PACK; i++)
5000 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5003 st_ptr = &town[1].store[STORE_HOME];
5004 strcpy(where, _("家", "H "));
5005 for (i = 0; i < st_ptr->stock_num; i++)
5007 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5011 /* Close the file */
5014 /* Display the file contents */
5015 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
5017 /* Remove the file */
5022 void do_cmd_save_screen_html_aux(char *filename, int message)
5026 byte a = 0, old_a = 0;
5040 cptr html_head[] = {
5041 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5045 cptr html_foot[] = {
5047 "</body>\n</html>\n",
5053 Term_get_size(&wid, &hgt);
5055 /* File type is "TEXT" */
5056 FILE_TYPE(FILE_TYPE_TEXT);
5058 /* Append to the file */
5059 fff = my_fopen(filename, "w");
5064 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
5071 /* Save the screen */
5075 /* Build the filename */
5076 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5077 tmpfff = my_fopen(buf, "r");
5079 for (i = 0; html_head[i]; i++)
5080 fputs(html_head[i], fff);
5084 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5086 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5090 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5092 fprintf(fff, "%s\n", buf);
5097 /* Dump the screen */
5098 for (y = 0; y < hgt; y++)
5105 for (x = 0; x < wid - 1; x++)
5109 /* Get the attr/char */
5110 (void)(Term_what(x, y, &a, &c));
5114 case '&': cc = "&"; break;
5115 case '<': cc = "<"; break;
5116 case '>': cc = ">"; break;
5118 case 0x1f: c = '.'; break;
5119 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5124 if ((y == 0 && x == 0) || a != old_a) {
5125 rv = angband_color_table[a][1];
5126 gv = angband_color_table[a][2];
5127 bv = angband_color_table[a][3];
5128 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5129 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5133 fprintf(fff, "%s", cc);
5135 fprintf(fff, "%c", c);
5138 fprintf(fff, "</font>");
5141 for (i = 0; html_foot[i]; i++)
5142 fputs(html_foot[i], fff);
5147 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5149 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5153 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5155 fprintf(fff, "%s\n", buf);
5169 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5173 /* Restore the screen */
5179 * Hack -- save a screen dump to a file
5181 static void do_cmd_save_screen_html(void)
5183 char buf[1024], tmp[256] = "screen.html";
5185 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5188 /* Build the filename */
5189 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5193 do_cmd_save_screen_html_aux(buf, 1);
5198 * Redefinable "save_screen" action
5200 void (*screendump_aux)(void) = NULL;
5204 * Hack -- save a screen dump to a file
5206 void do_cmd_save_screen(void)
5208 bool old_use_graphics = use_graphics;
5209 bool html_dump = FALSE;
5213 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5217 if (c == 'Y' || c == 'y')
5219 else if (c == 'H' || c == 'h')
5231 Term_get_size(&wid, &hgt);
5233 if (old_use_graphics)
5235 use_graphics = FALSE;
5238 /* Redraw everything */
5239 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5241 /* Hack -- update */
5247 do_cmd_save_screen_html();
5251 /* Do we use a special screendump function ? */
5252 else if (screendump_aux)
5254 /* Dump the screen to a graphics file */
5255 (*screendump_aux)();
5257 else /* Dump the screen as text */
5268 /* Build the filename */
5269 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5271 /* File type is "TEXT" */
5272 FILE_TYPE(FILE_TYPE_TEXT);
5274 /* Append to the file */
5275 fff = my_fopen(buf, "w");
5280 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5286 /* Save the screen */
5290 /* Dump the screen */
5291 for (y = 0; y < hgt; y++)
5294 for (x = 0; x < wid - 1; x++)
5296 /* Get the attr/char */
5297 (void)(Term_what(x, y, &a, &c));
5307 fprintf(fff, "%s\n", buf);
5314 /* Dump the screen */
5315 for (y = 0; y < hgt; y++)
5318 for (x = 0; x < wid - 1; x++)
5320 /* Get the attr/char */
5321 (void)(Term_what(x, y, &a, &c));
5324 buf[x] = hack[a&0x0F];
5331 fprintf(fff, "%s\n", buf);
5342 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5345 /* Restore the screen */
5349 if (old_use_graphics)
5351 use_graphics = TRUE;
5354 /* Redraw everything */
5355 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5357 /* Hack -- update */
5364 * Sorting hook -- Comp function -- see below
5366 * We use "u" to point to array of monster indexes,
5367 * and "v" to select the type of sorting to perform on "u".
5369 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5371 u16b *who = (u16b*)(u);
5373 u16b *why = (u16b*)(v);
5380 /* Sort by total kills */
5383 /* Extract total kills */
5384 z1 = a_info[w1].tval;
5385 z2 = a_info[w2].tval;
5387 /* Compare total kills */
5388 if (z1 < z2) return (TRUE);
5389 if (z1 > z2) return (FALSE);
5393 /* Sort by monster level */
5396 /* Extract levels */
5397 z1 = a_info[w1].sval;
5398 z2 = a_info[w2].sval;
5400 /* Compare levels */
5401 if (z1 < z2) return (TRUE);
5402 if (z1 > z2) return (FALSE);
5406 /* Sort by monster experience */
5409 /* Extract experience */
5410 z1 = a_info[w1].level;
5411 z2 = a_info[w2].level;
5413 /* Compare experience */
5414 if (z1 < z2) return (TRUE);
5415 if (z1 > z2) return (FALSE);
5419 /* Compare indexes */
5425 * Sorting hook -- Swap function -- see below
5427 * We use "u" to point to array of monster indexes,
5428 * and "v" to select the type of sorting to perform.
5430 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5432 u16b *who = (u16b*)(u);
5447 * Check the status of "artifacts"
5449 static void do_cmd_knowledge_artifacts(void)
5451 int i, k, z, x, y, n = 0;
5457 char file_name[1024];
5459 char base_name[MAX_NLEN];
5463 /* Open a new file */
5464 fff = my_fopen_temp(file_name, 1024);
5467 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5472 /* Allocate the "who" array */
5473 C_MAKE(who, max_a_idx, s16b);
5475 /* Allocate the "okay" array */
5476 C_MAKE(okay, max_a_idx, bool);
5478 /* Scan the artifacts */
5479 for (k = 0; k < max_a_idx; k++)
5481 artifact_type *a_ptr = &a_info[k];
5486 /* Skip "empty" artifacts */
5487 if (!a_ptr->name) continue;
5489 /* Skip "uncreated" artifacts */
5490 if (!a_ptr->cur_num) continue;
5496 /* Check the dungeon */
5497 for (y = 0; y < cur_hgt; y++)
5499 for (x = 0; x < cur_wid; x++)
5501 cave_type *c_ptr = &cave[y][x];
5503 s16b this_o_idx, next_o_idx = 0;
5505 /* Scan all objects in the grid */
5506 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5510 /* Acquire object */
5511 o_ptr = &o_list[this_o_idx];
5513 /* Acquire next object */
5514 next_o_idx = o_ptr->next_o_idx;
5516 /* Ignore non-artifacts */
5517 if (!object_is_fixed_artifact(o_ptr)) continue;
5519 /* Ignore known items */
5520 if (object_is_known(o_ptr)) continue;
5522 /* Note the artifact */
5523 okay[o_ptr->name1] = FALSE;
5528 /* Check the inventory and equipment */
5529 for (i = 0; i < INVEN_TOTAL; i++)
5531 object_type *o_ptr = &inventory[i];
5533 /* Ignore non-objects */
5534 if (!o_ptr->k_idx) continue;
5536 /* Ignore non-artifacts */
5537 if (!object_is_fixed_artifact(o_ptr)) continue;
5539 /* Ignore known items */
5540 if (object_is_known(o_ptr)) continue;
5542 /* Note the artifact */
5543 okay[o_ptr->name1] = FALSE;
5546 for (k = 0; k < max_a_idx; k++)
5548 if (okay[k]) who[n++] = k;
5551 /* Select the sort method */
5552 ang_sort_comp = ang_sort_art_comp;
5553 ang_sort_swap = ang_sort_art_swap;
5555 /* Sort the array by dungeon depth of monsters */
5556 ang_sort(who, &why, n);
5558 /* Scan the artifacts */
5559 for (k = 0; k < n; k++)
5561 artifact_type *a_ptr = &a_info[who[k]];
5564 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5566 /* Obtain the base object type */
5567 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5575 /* Get local object */
5578 /* Create fake object */
5579 object_prep(q_ptr, z);
5581 /* Make it an artifact */
5582 q_ptr->name1 = (byte)who[k];
5584 /* Display as if known */
5585 q_ptr->ident |= IDENT_STORE;
5587 /* Describe the artifact */
5588 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5591 /* Hack -- Build the artifact name */
5592 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5595 /* Free the "who" array */
5596 C_KILL(who, max_a_idx, s16b);
5598 /* Free the "okay" array */
5599 C_KILL(okay, max_a_idx, bool);
5601 /* Close the file */
5604 /* Display the file contents */
5605 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5607 /* Remove the file */
5613 * Display known uniques
5614 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5616 static void do_cmd_knowledge_uniques(void)
5624 char file_name[1024];
5627 int n_alive_surface = 0;
5628 int n_alive_over100 = 0;
5629 int n_alive_total = 0;
5632 for (i = 0; i < 10; i++) n_alive[i] = 0;
5634 /* Open a new file */
5635 fff = my_fopen_temp(file_name, 1024);
5639 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5644 /* Allocate the "who" array */
5645 C_MAKE(who, max_r_idx, s16b);
5647 /* Scan the monsters */
5648 for (i = 1; i < max_r_idx; i++)
5650 monster_race *r_ptr = &r_info[i];
5653 if (!r_ptr->name) continue;
5655 /* Require unique monsters */
5656 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5658 /* Only display "known" uniques */
5659 if (!cheat_know && !r_ptr->r_sights) continue;
5661 /* Only print rarity <= 100 uniques */
5662 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5664 /* Only "alive" uniques */
5665 if (r_ptr->max_num == 0) continue;
5669 lev = (r_ptr->level - 1) / 10;
5673 if (max_lev < lev) max_lev = lev;
5675 else n_alive_over100++;
5677 else n_alive_surface++;
5679 /* Collect "appropriate" monsters */
5683 /* Select the sort method */
5684 ang_sort_comp = ang_sort_comp_hook;
5685 ang_sort_swap = ang_sort_swap_hook;
5687 /* Sort the array by dungeon depth of monsters */
5688 ang_sort(who, &why, n);
5690 if (n_alive_surface)
5692 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5693 n_alive_total += n_alive_surface;
5695 for (i = 0; i <= max_lev; i++)
5697 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5698 n_alive_total += n_alive[i];
5700 if (n_alive_over100)
5702 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5703 n_alive_total += n_alive_over100;
5708 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5709 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5713 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5716 /* Scan the monster races */
5717 for (k = 0; k < n; k++)
5719 monster_race *r_ptr = &r_info[who[k]];
5721 /* Print a message */
5722 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, r_ptr->level);
5725 /* Free the "who" array */
5726 C_KILL(who, max_r_idx, s16b);
5728 /* Close the file */
5731 /* Display the file contents */
5732 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5734 /* Remove the file */
5740 * Display weapon-exp
5742 static void do_cmd_knowledge_weapon_exp(void)
5744 int i, j, num, weapon_exp;
5748 char file_name[1024];
5751 /* Open a new file */
5752 fff = my_fopen_temp(file_name, 1024);
5754 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5759 for (i = 0; i < 5; i++)
5761 for (num = 0; num < 64; num++)
5763 for (j = 0; j < max_k_idx; j++)
5765 object_kind *k_ptr = &k_info[j];
5767 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5769 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5771 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5773 fprintf(fff, "%-25s ", tmp);
5774 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5775 else fprintf(fff, " ");
5776 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5777 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5785 /* Close the file */
5788 /* Display the file contents */
5789 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5791 /* Remove the file */
5797 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5801 static void do_cmd_knowledge_spell_exp(void)
5803 int i = 0, spell_exp, exp_level;
5806 const magic_type *s_ptr;
5808 char file_name[1024];
5810 /* Open a new file */
5811 fff = my_fopen_temp(file_name, 1024);
5813 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5818 if (p_ptr->realm1 != REALM_NONE)
5820 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5821 for (i = 0; i < 32; i++)
5823 if (!is_magic(p_ptr->realm1))
5825 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5829 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5831 if (s_ptr->slevel >= 99) continue;
5832 spell_exp = p_ptr->spell_exp[i];
5833 exp_level = spell_exp_level(spell_exp);
5834 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5835 if (p_ptr->realm1 == REALM_HISSATSU)
5836 fprintf(fff, "[--]");
5839 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5840 else fprintf(fff, " ");
5841 fprintf(fff, "%s", exp_level_str[exp_level]);
5843 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5848 if (p_ptr->realm2 != REALM_NONE)
5850 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5851 for (i = 0; i < 32; i++)
5853 if (!is_magic(p_ptr->realm1))
5855 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5859 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5861 if (s_ptr->slevel >= 99) continue;
5863 spell_exp = p_ptr->spell_exp[i + 32];
5864 exp_level = spell_exp_level(spell_exp);
5865 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5866 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5867 else fprintf(fff, " ");
5868 fprintf(fff, "%s", exp_level_str[exp_level]);
5869 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5874 /* Close the file */
5877 /* Display the file contents */
5878 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5880 /* Remove the file */
5886 * @brief スキル情報を表示するコマンドのメインルーチン /
5890 static void do_cmd_knowledge_skill_exp(void)
5892 int i = 0, skill_exp;
5896 char file_name[1024];
5897 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5898 _("二刀流 ", "Dual Wielding "),
5899 _("乗馬 ", "Riding ")};
5901 /* Open a new file */
5902 fff = my_fopen_temp(file_name, 1024);
5904 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5909 for (i = 0; i < 3; i++)
5911 skill_exp = p_ptr->skill_exp[i];
5912 fprintf(fff, "%-20s ", skill_name[i]);
5913 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5914 else fprintf(fff, " ");
5915 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5916 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5920 /* Close the file */
5923 /* Display the file contents */
5924 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5926 /* Remove the file */
5932 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5933 * @param Name 変換したい文字列の参照ポインタ
5936 void plural_aux(char *Name)
5938 int NameLen = strlen(Name);
5940 if (my_strstr(Name, "Disembodied hand"))
5942 strcpy(Name, "Disembodied hands that strangled people");
5944 else if (my_strstr(Name, "Colour out of space"))
5946 strcpy(Name, "Colours out of space");
5948 else if (my_strstr(Name, "stairway to hell"))
5950 strcpy(Name, "stairways to hell");
5952 else if (my_strstr(Name, "Dweller on the threshold"))
5954 strcpy(Name, "Dwellers on the threshold");
5956 else if (my_strstr(Name, " of "))
5958 cptr aider = my_strstr(Name, " of ");
5969 if (dummy[i-1] == 's')
5971 strcpy(&(dummy[i]), "es");
5976 strcpy(&(dummy[i]), "s");
5979 strcpy(&(dummy[i+1]), aider);
5980 strcpy(Name, dummy);
5982 else if (my_strstr(Name, "coins"))
5985 strcpy(dummy, "piles of ");
5986 strcat(dummy, Name);
5987 strcpy(Name, dummy);
5990 else if (my_strstr(Name, "Manes"))
5994 else if (streq(&(Name[NameLen - 2]), "ey"))
5996 strcpy(&(Name[NameLen - 2]), "eys");
5998 else if (Name[NameLen - 1] == 'y')
6000 strcpy(&(Name[NameLen - 1]), "ies");
6002 else if (streq(&(Name[NameLen - 4]), "ouse"))
6004 strcpy(&(Name[NameLen - 4]), "ice");
6006 else if (streq(&(Name[NameLen - 2]), "us"))
6008 strcpy(&(Name[NameLen - 2]), "i");
6010 else if (streq(&(Name[NameLen - 6]), "kelman"))
6012 strcpy(&(Name[NameLen - 6]), "kelmen");
6014 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6016 strcpy(&(Name[NameLen - 8]), "wordsmen");
6018 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6020 strcpy(&(Name[NameLen - 7]), "oodsmen");
6022 else if (streq(&(Name[NameLen - 7]), "eastman"))
6024 strcpy(&(Name[NameLen - 7]), "eastmen");
6026 else if (streq(&(Name[NameLen - 8]), "izardman"))
6028 strcpy(&(Name[NameLen - 8]), "izardmen");
6030 else if (streq(&(Name[NameLen - 5]), "geist"))
6032 strcpy(&(Name[NameLen - 5]), "geister");
6034 else if (streq(&(Name[NameLen - 2]), "ex"))
6036 strcpy(&(Name[NameLen - 2]), "ices");
6038 else if (streq(&(Name[NameLen - 2]), "lf"))
6040 strcpy(&(Name[NameLen - 2]), "lves");
6042 else if (suffix(Name, "ch") ||
6043 suffix(Name, "sh") ||
6044 suffix(Name, "nx") ||
6045 suffix(Name, "s") ||
6048 strcpy(&(Name[NameLen]), "es");
6052 strcpy(&(Name[NameLen]), "s");
6057 * @brief 現在のペットを表示するコマンドのメインルーチン /
6058 * Display current pets
6061 static void do_cmd_knowledge_pets(void)
6065 monster_type *m_ptr;
6068 int show_upkeep = 0;
6069 char file_name[1024];
6072 /* Open a new file */
6073 fff = my_fopen_temp(file_name, 1024);
6075 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6080 /* Process the monsters (backwards) */
6081 for (i = m_max - 1; i >= 1; i--)
6083 /* Access the monster */
6086 /* Ignore "dead" monsters */
6087 if (!m_ptr->r_idx) continue;
6089 /* Calculate "upkeep" for pets */
6093 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6094 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6098 show_upkeep = calculate_upkeep();
6100 fprintf(fff, "----------------------------------------------\n");
6102 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6103 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6105 fprintf(fff, " Total: %d pet%s.\n",
6106 t_friends, (t_friends == 1 ? "" : "s"));
6107 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6112 /* Close the file */
6115 /* Display the file contents */
6116 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6118 /* Remove the file */
6124 * @brief 現在のペットを表示するコマンドのメインルーチン /
6127 * @note the player ghosts are ignored. XXX XXX XXX
6129 static void do_cmd_knowledge_kill_count(void)
6137 char file_name[1024];
6142 /* Open a new file */
6143 fff = my_fopen_temp(file_name, 1024);
6146 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6151 /* Allocate the "who" array */
6152 C_MAKE(who, max_r_idx, s16b);
6155 /* Monsters slain */
6158 for (kk = 1; kk < max_r_idx; kk++)
6160 monster_race *r_ptr = &r_info[kk];
6162 if (r_ptr->flags1 & (RF1_UNIQUE))
6164 bool dead = (r_ptr->max_num == 0);
6173 s16b This = r_ptr->r_pkills;
6183 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6186 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6188 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6194 /* Scan the monsters */
6195 for (i = 1; i < max_r_idx; i++)
6197 monster_race *r_ptr = &r_info[i];
6199 /* Use that monster */
6200 if (r_ptr->name) who[n++] = i;
6203 /* Select the sort method */
6204 ang_sort_comp = ang_sort_comp_hook;
6205 ang_sort_swap = ang_sort_swap_hook;
6207 /* Sort the array by dungeon depth of monsters */
6208 ang_sort(who, &why, n);
6210 /* Scan the monster races */
6211 for (k = 0; k < n; k++)
6213 monster_race *r_ptr = &r_info[who[k]];
6215 if (r_ptr->flags1 & (RF1_UNIQUE))
6217 bool dead = (r_ptr->max_num == 0);
6221 /* Print a message */
6222 fprintf(fff, " %s\n",
6223 (r_name + r_ptr->name));
6229 s16b This = r_ptr->r_pkills;
6234 /* p,tは人と数える by ita */
6235 if (my_strchr("pt", r_ptr->d_char))
6236 fprintf(fff, " %3d 人の %s\n", This, r_name + r_ptr->name);
6238 fprintf(fff, " %3d 体の %s\n", This, r_name + r_ptr->name);
6242 if (my_strstr(r_name + r_ptr->name, "coins"))
6244 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6248 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6254 strcpy(ToPlural, (r_name + r_ptr->name));
6255 plural_aux(ToPlural);
6256 fprintf(fff, " %d %s\n", This, ToPlural);
6266 fprintf(fff,"----------------------------------------------\n");
6268 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6270 fprintf(fff," Total: %lu creature%s killed.\n",
6271 (unsigned long int)Total, (Total == 1 ? "" : "s"));
6275 /* Free the "who" array */
6276 C_KILL(who, max_r_idx, s16b);
6278 /* Close the file */
6281 /* Display the file contents */
6282 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6284 /* Remove the file */
6290 * @brief モンスター情報リスト中のグループを表示する /
6291 * Display the object groups.
6295 * @param per_page リストの表示行
6296 * @param grp_idx グループのID配列
6297 * @param group_text グループ名の文字列配列
6298 * @param grp_cur 現在の選択ID
6299 * @param grp_top 現在の選択リスト最上部ID
6302 static void display_group_list(int col, int row, int wid, int per_page,
6303 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6307 /* Display lines until done */
6308 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6310 /* Get the group index */
6311 int grp = grp_idx[grp_top + i];
6313 /* Choose a color */
6314 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6316 /* Erase the entire line */
6317 Term_erase(col, row + i, wid);
6319 /* Display the group label */
6320 c_put_str(attr, group_text[grp], row + i, col);
6326 * Move the cursor in a browser window
6328 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
6329 int *list_cur, int list_cnt)
6334 int list = *list_cur;
6336 /* Extract direction */
6339 /* Hack -- scroll up full screen */
6344 /* Hack -- scroll down full screen */
6349 d = get_keymap_dir(ch);
6354 /* Diagonals - hack */
6355 if ((ddx[d] > 0) && ddy[d])
6361 Term_get_size(&wid, &hgt);
6363 browser_rows = hgt - 8;
6365 /* Browse group list */
6370 /* Move up or down */
6371 grp += ddy[d] * (browser_rows - 1);
6374 if (grp >= grp_cnt) grp = grp_cnt - 1;
6375 if (grp < 0) grp = 0;
6376 if (grp != old_grp) list = 0;
6379 /* Browse sub-list list */
6382 /* Move up or down */
6383 list += ddy[d] * browser_rows;
6386 if (list >= list_cnt) list = list_cnt - 1;
6387 if (list < 0) list = 0;
6399 if (col < 0) col = 0;
6400 if (col > 1) col = 1;
6407 /* Browse group list */
6412 /* Move up or down */
6416 if (grp >= grp_cnt) grp = grp_cnt - 1;
6417 if (grp < 0) grp = 0;
6418 if (grp != old_grp) list = 0;
6421 /* Browse sub-list list */
6424 /* Move up or down */
6428 if (list >= list_cnt) list = list_cnt - 1;
6429 if (list < 0) list = 0;
6440 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
6444 /* Clear the display lines */
6445 for (i = 0; i < height; i++)
6447 Term_erase(col, row + i, width);
6450 /* Bigtile mode uses double width */
6451 if (use_bigtile) width /= 2;
6453 /* Display lines until done */
6454 for (i = 0; i < height; i++)
6456 /* Display columns until done */
6457 for (j = 0; j < width; j++)
6465 /* Bigtile mode uses double width */
6466 if (use_bigtile) x += j;
6471 /* Ignore illegal characters */
6472 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6473 (!use_graphics && ic > 0x7f))
6479 /* Force correct code for both ASCII character and tile */
6480 if (c & 0x80) a |= 0x80;
6482 /* Display symbol */
6483 Term_queue_bigchar(x, y, a, c, 0, 0);
6490 * Place the cursor at the collect position for visual mode
6492 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
6494 int i = (a & 0x7f) - attr_top;
6495 int j = c - char_left;
6500 /* Bigtile mode uses double width */
6501 if (use_bigtile) x += j;
6503 /* Place the cursor */
6509 * Clipboard variables for copy&paste in visual mode
6511 static byte attr_idx = 0;
6512 static byte char_idx = 0;
6514 /* Hack -- for feature lighting */
6515 static byte attr_idx_feat[F_LIT_MAX];
6516 static byte char_idx_feat[F_LIT_MAX];
6519 * Do visual mode command -- Change symbols
6521 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6522 int height, int width,
6523 byte *attr_top_ptr, byte *char_left_ptr,
6524 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6526 static byte attr_old = 0, char_old = 0;
6531 if (*visual_list_ptr)
6534 *cur_attr_ptr = attr_old;
6535 *cur_char_ptr = char_old;
6536 *visual_list_ptr = FALSE;
6544 if (*visual_list_ptr)
6547 *visual_list_ptr = FALSE;
6548 *need_redraw = TRUE;
6556 if (!*visual_list_ptr)
6558 *visual_list_ptr = TRUE;
6560 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6561 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6563 attr_old = *cur_attr_ptr;
6564 char_old = *cur_char_ptr;
6575 /* Set the visual */
6576 attr_idx = *cur_attr_ptr;
6577 char_idx = *cur_char_ptr;
6579 /* Hack -- for feature lighting */
6580 for (i = 0; i < F_LIT_MAX; i++)
6582 attr_idx_feat[i] = 0;
6583 char_idx_feat[i] = 0;
6590 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6593 *cur_attr_ptr = attr_idx;
6594 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6595 if (!*visual_list_ptr) *need_redraw = TRUE;
6601 *cur_char_ptr = char_idx;
6602 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6603 if (!*visual_list_ptr) *need_redraw = TRUE;
6609 if (*visual_list_ptr)
6612 int d = get_keymap_dir(ch);
6613 byte a = (*cur_attr_ptr & 0x7f);
6614 byte c = *cur_char_ptr;
6616 if (use_bigtile) eff_width = width / 2;
6617 else eff_width = width;
6619 /* Restrict direction */
6620 if ((a == 0) && (ddy[d] < 0)) d = 0;
6621 if ((c == 0) && (ddx[d] < 0)) d = 0;
6622 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6623 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6628 /* Force correct code for both ASCII character and tile */
6629 if (c & 0x80) a |= 0x80;
6631 /* Set the visual */
6636 /* Move the frame */
6637 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6638 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6639 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6640 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6646 /* Visual mode command is not used */
6652 * Display the monsters in a group.
6654 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6655 int mon_cur, int mon_top, bool visual_only)
6659 /* Display lines until done */
6660 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6664 /* Get the race index */
6665 int r_idx = mon_idx[mon_top + i] ;
6667 /* Access the race */
6668 monster_race *r_ptr = &r_info[r_idx];
6670 /* Choose a color */
6671 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6673 /* Display the name */
6674 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6676 /* Hack -- visual_list mode */
6679 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6681 if (p_ptr->wizard || visual_only)
6683 c_prt(attr, format("%d", r_idx), row + i, 62);
6686 /* Erase chars before overwritten by the race letter */
6687 Term_erase(69, row + i, 255);
6689 /* Display symbol */
6690 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6695 if (!(r_ptr->flags1 & RF1_UNIQUE))
6696 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6698 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6699 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6703 /* Clear remaining lines */
6704 for (; i < per_page; i++)
6706 Term_erase(col, row + i, 255);
6712 * Display known monsters.
6714 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx)
6717 int grp_cur, grp_top, old_grp_cur;
6718 int mon_cur, mon_top;
6719 int grp_cnt, grp_idx[100];
6727 bool visual_list = FALSE;
6728 byte attr_top = 0, char_left = 0;
6736 Term_get_size(&wid, &hgt);
6738 browser_rows = hgt - 8;
6740 /* Allocate the "mon_idx" array */
6741 C_MAKE(mon_idx, max_r_idx, s16b);
6746 if (direct_r_idx < 0)
6748 mode = visual_only ? 0x03 : 0x01;
6750 /* Check every group */
6751 for (i = 0; monster_group_text[i] != NULL; i++)
6753 /* Measure the label */
6754 len = strlen(monster_group_text[i]);
6756 /* Save the maximum length */
6757 if (len > max) max = len;
6759 /* See if any monsters are known */
6760 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6762 /* Build a list of groups with known monsters */
6763 grp_idx[grp_cnt++] = i;
6771 mon_idx[0] = direct_r_idx;
6774 /* Terminate the list */
6777 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6778 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6781 /* Terminate the list */
6782 grp_idx[grp_cnt] = -1;
6785 grp_cur = grp_top = 0;
6786 mon_cur = mon_top = 0;
6791 mode = visual_only ? 0x02 : 0x00;
6796 monster_race *r_ptr;
6803 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6804 if (direct_r_idx < 0) prt("グループ", 4, 0);
6805 prt("名前", 4, max + 3);
6806 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6808 if (!visual_only) prt("殺害数", 4, 72);
6810 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6811 if (direct_r_idx < 0) prt("Group", 4, 0);
6812 prt("Name", 4, max + 3);
6813 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6815 if (!visual_only) prt("Kills", 4, 73);
6818 for (i = 0; i < 78; i++)
6820 Term_putch(i, 5, TERM_WHITE, '=');
6823 if (direct_r_idx < 0)
6825 for (i = 0; i < browser_rows; i++)
6827 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6834 if (direct_r_idx < 0)
6836 /* Scroll group list */
6837 if (grp_cur < grp_top) grp_top = grp_cur;
6838 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6840 /* Display a list of monster groups */
6841 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6843 if (old_grp_cur != grp_cur)
6845 old_grp_cur = grp_cur;
6847 /* Get a list of monsters in the current group */
6848 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6851 /* Scroll monster list */
6852 while (mon_cur < mon_top)
6853 mon_top = MAX(0, mon_top - browser_rows/2);
6854 while (mon_cur >= mon_top + browser_rows)
6855 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6860 /* Display a list of monsters in the current group */
6861 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6867 /* Display a monster name */
6868 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6870 /* Display visual list below first monster */
6871 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6876 prt(format("<方向>%s%s%s, ESC",
6877 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6878 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6879 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6882 prt(format("<dir>%s%s%s, ESC",
6883 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6884 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6885 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6889 /* Get the current monster */
6890 r_ptr = &r_info[mon_idx[mon_cur]];
6894 /* Mega Hack -- track this monster race */
6895 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6897 /* Hack -- handle stuff */
6903 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6907 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6911 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6916 /* Do visual mode command if needed */
6917 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))
6919 if (direct_r_idx >= 0)
6944 /* Recall on screen */
6945 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6947 screen_roff(mon_idx[mon_cur], 0);
6958 /* Move the cursor */
6959 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6966 /* Free the "mon_idx" array */
6967 C_KILL(mon_idx, max_r_idx, s16b);
6972 * Display the objects in a group.
6974 static void display_object_list(int col, int row, int per_page, int object_idx[],
6975 int object_cur, int object_top, bool visual_only)
6979 /* Display lines until done */
6980 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6984 object_kind *flavor_k_ptr;
6986 /* Get the object index */
6987 int k_idx = object_idx[object_top + i];
6989 /* Access the object */
6990 object_kind *k_ptr = &k_info[k_idx];
6992 /* Choose a color */
6993 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6994 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6997 if (!visual_only && k_ptr->flavor)
6999 /* Appearance of this object is shuffled */
7000 flavor_k_ptr = &k_info[k_ptr->flavor];
7004 /* Appearance of this object is very normal */
7005 flavor_k_ptr = k_ptr;
7010 attr = ((i + object_top == object_cur) ? cursor : attr);
7012 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
7015 strip_name(o_name, k_idx);
7020 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
7023 /* Display the name */
7024 c_prt(attr, o_name, row + i, col);
7026 /* Hack -- visual_list mode */
7029 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);
7031 if (p_ptr->wizard || visual_only)
7033 c_prt(attr, format("%d", k_idx), row + i, 70);
7036 a = flavor_k_ptr->x_attr;
7037 c = flavor_k_ptr->x_char;
7039 /* Display symbol */
7040 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
7043 /* Clear remaining lines */
7044 for (; i < per_page; i++)
7046 Term_erase(col, row + i, 255);
7051 * Describe fake object
7053 static void desc_obj_fake(int k_idx)
7056 object_type object_type_body;
7058 /* Get local object */
7059 o_ptr = &object_type_body;
7061 /* Wipe the object */
7064 /* Create the artifact */
7065 object_prep(o_ptr, k_idx);
7067 /* It's fully know */
7068 o_ptr->ident |= IDENT_KNOWN;
7070 /* Track the object */
7071 /* object_actual_track(o_ptr); */
7073 /* Hack - mark as fake */
7074 /* term_obj_real = FALSE; */
7076 /* Hack -- Handle stuff */
7079 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
7081 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7089 * Display known objects
7091 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx)
7094 int grp_cur, grp_top, old_grp_cur;
7095 int object_old, object_cur, object_top;
7096 int grp_cnt, grp_idx[100];
7104 bool visual_list = FALSE;
7105 byte attr_top = 0, char_left = 0;
7113 Term_get_size(&wid, &hgt);
7115 browser_rows = hgt - 8;
7117 /* Allocate the "object_idx" array */
7118 C_MAKE(object_idx, max_k_idx, int);
7123 if (direct_k_idx < 0)
7125 mode = visual_only ? 0x03 : 0x01;
7127 /* Check every group */
7128 for (i = 0; object_group_text[i] != NULL; i++)
7130 /* Measure the label */
7131 len = strlen(object_group_text[i]);
7133 /* Save the maximum length */
7134 if (len > max) max = len;
7136 /* See if any monsters are known */
7137 if (collect_objects(i, object_idx, mode))
7139 /* Build a list of groups with known monsters */
7140 grp_idx[grp_cnt++] = i;
7149 object_kind *k_ptr = &k_info[direct_k_idx];
7150 object_kind *flavor_k_ptr;
7152 if (!visual_only && k_ptr->flavor)
7154 /* Appearance of this object is shuffled */
7155 flavor_k_ptr = &k_info[k_ptr->flavor];
7159 /* Appearance of this object is very normal */
7160 flavor_k_ptr = k_ptr;
7163 object_idx[0] = direct_k_idx;
7164 object_old = direct_k_idx;
7167 /* Terminate the list */
7170 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7171 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7174 /* Terminate the list */
7175 grp_idx[grp_cnt] = -1;
7178 grp_cur = grp_top = 0;
7179 object_cur = object_top = 0;
7184 mode = visual_only ? 0x02 : 0x00;
7189 object_kind *k_ptr, *flavor_k_ptr;
7196 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7197 if (direct_k_idx < 0) prt("グループ", 4, 0);
7198 prt("名前", 4, max + 3);
7199 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7202 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7203 if (direct_k_idx < 0) prt("Group", 4, 0);
7204 prt("Name", 4, max + 3);
7205 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7209 for (i = 0; i < 78; i++)
7211 Term_putch(i, 5, TERM_WHITE, '=');
7214 if (direct_k_idx < 0)
7216 for (i = 0; i < browser_rows; i++)
7218 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7225 if (direct_k_idx < 0)
7227 /* Scroll group list */
7228 if (grp_cur < grp_top) grp_top = grp_cur;
7229 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7231 /* Display a list of object groups */
7232 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7234 if (old_grp_cur != grp_cur)
7236 old_grp_cur = grp_cur;
7238 /* Get a list of objects in the current group */
7239 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7242 /* Scroll object list */
7243 while (object_cur < object_top)
7244 object_top = MAX(0, object_top - browser_rows/2);
7245 while (object_cur >= object_top + browser_rows)
7246 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7251 /* Display a list of objects in the current group */
7252 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7256 object_top = object_cur;
7258 /* Display a list of objects in the current group */
7259 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7261 /* Display visual list below first object */
7262 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7265 /* Get the current object */
7266 k_ptr = &k_info[object_idx[object_cur]];
7268 if (!visual_only && k_ptr->flavor)
7270 /* Appearance of this object is shuffled */
7271 flavor_k_ptr = &k_info[k_ptr->flavor];
7275 /* Appearance of this object is very normal */
7276 flavor_k_ptr = k_ptr;
7281 prt(format("<方向>%s%s%s, ESC",
7282 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7283 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7284 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7287 prt(format("<dir>%s%s%s, ESC",
7288 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7289 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7290 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7296 /* Mega Hack -- track this object */
7297 if (object_cnt) object_kind_track(object_idx[object_cur]);
7299 /* The "current" object changed */
7300 if (object_old != object_idx[object_cur])
7302 /* Hack -- handle stuff */
7305 /* Remember the "current" object */
7306 object_old = object_idx[object_cur];
7312 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7316 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7320 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7325 /* Do visual mode command if needed */
7326 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))
7328 if (direct_k_idx >= 0)
7353 /* Recall on screen */
7354 if (!visual_list && !visual_only && (grp_cnt > 0))
7356 desc_obj_fake(object_idx[object_cur]);
7364 /* Move the cursor */
7365 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7371 /* Free the "object_idx" array */
7372 C_KILL(object_idx, max_k_idx, int);
7377 * Display the features in a group.
7379 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
7380 int feat_cur, int feat_top, bool visual_only, int lighting_level)
7382 int lit_col[F_LIT_MAX], i, j;
7383 int f_idx_col = use_bigtile ? 62 : 64;
7385 /* Correct columns 1 and 4 */
7386 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7387 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7388 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7390 /* Display lines until done */
7391 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7396 int f_idx = feat_idx[feat_top + i];
7398 /* Access the index */
7399 feature_type *f_ptr = &f_info[f_idx];
7401 int row_i = row + i;
7403 /* Choose a color */
7404 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7406 /* Display the name */
7407 c_prt(attr, f_name + f_ptr->name, row_i, col);
7409 /* Hack -- visual_list mode */
7412 /* Display lighting level */
7413 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7415 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));
7417 if (p_ptr->wizard || visual_only)
7419 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7422 /* Display symbol */
7423 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);
7425 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7426 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7428 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7430 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7432 /* Mega-hack -- Use non-standard colour */
7433 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7435 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7439 /* Clear remaining lines */
7440 for (; i < per_page; i++)
7442 Term_erase(col, row + i, 255);
7448 * Interact with feature visuals.
7450 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level)
7453 int grp_cur, grp_top, old_grp_cur;
7454 int feat_cur, feat_top;
7455 int grp_cnt, grp_idx[100];
7463 bool visual_list = FALSE;
7464 byte attr_top = 0, char_left = 0;
7469 byte attr_old[F_LIT_MAX];
7470 byte char_old[F_LIT_MAX];
7471 byte *cur_attr_ptr, *cur_char_ptr;
7473 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7474 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7477 Term_get_size(&wid, &hgt);
7479 browser_rows = hgt - 8;
7481 /* Allocate the "feat_idx" array */
7482 C_MAKE(feat_idx, max_f_idx, int);
7487 if (direct_f_idx < 0)
7489 /* Check every group */
7490 for (i = 0; feature_group_text[i] != NULL; i++)
7492 /* Measure the label */
7493 len = strlen(feature_group_text[i]);
7495 /* Save the maximum length */
7496 if (len > max) max = len;
7498 /* See if any features are known */
7499 if (collect_features(i, feat_idx, 0x01))
7501 /* Build a list of groups with known features */
7502 grp_idx[grp_cnt++] = i;
7510 feature_type *f_ptr = &f_info[direct_f_idx];
7512 feat_idx[0] = direct_f_idx;
7515 /* Terminate the list */
7518 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7519 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7521 for (i = 0; i < F_LIT_MAX; i++)
7523 attr_old[i] = f_ptr->x_attr[i];
7524 char_old[i] = f_ptr->x_char[i];
7528 /* Terminate the list */
7529 grp_idx[grp_cnt] = -1;
7532 grp_cur = grp_top = 0;
7533 feat_cur = feat_top = 0;
7541 feature_type *f_ptr;
7548 prt("表示 - 地形", 2, 0);
7549 if (direct_f_idx < 0) prt("グループ", 4, 0);
7550 prt("名前", 4, max + 3);
7553 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7554 prt("文字 ( l/ d)", 4, 66);
7558 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7559 prt("文字 (l/d)", 4, 68);
7562 prt("Visuals - features", 2, 0);
7563 if (direct_f_idx < 0) prt("Group", 4, 0);
7564 prt("Name", 4, max + 3);
7567 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7568 prt("Sym ( l/ d)", 4, 67);
7572 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7573 prt("Sym (l/d)", 4, 69);
7577 for (i = 0; i < 78; i++)
7579 Term_putch(i, 5, TERM_WHITE, '=');
7582 if (direct_f_idx < 0)
7584 for (i = 0; i < browser_rows; i++)
7586 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7593 if (direct_f_idx < 0)
7595 /* Scroll group list */
7596 if (grp_cur < grp_top) grp_top = grp_cur;
7597 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7599 /* Display a list of feature groups */
7600 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7602 if (old_grp_cur != grp_cur)
7604 old_grp_cur = grp_cur;
7606 /* Get a list of features in the current group */
7607 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7610 /* Scroll feature list */
7611 while (feat_cur < feat_top)
7612 feat_top = MAX(0, feat_top - browser_rows/2);
7613 while (feat_cur >= feat_top + browser_rows)
7614 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7619 /* Display a list of features in the current group */
7620 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7624 feat_top = feat_cur;
7626 /* Display a list of features in the current group */
7627 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7629 /* Display visual list below first object */
7630 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7635 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7636 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7637 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7640 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7641 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7642 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7646 /* Get the current feature */
7647 f_ptr = &f_info[feat_idx[feat_cur]];
7648 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7649 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7653 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7657 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7661 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7666 if (visual_list && ((ch == 'A') || (ch == 'a')))
7668 int prev_lighting_level = *lighting_level;
7672 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7673 else (*lighting_level)--;
7677 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7678 else (*lighting_level)++;
7681 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7682 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7684 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7685 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7690 else if ((ch == 'D') || (ch == 'd'))
7692 byte prev_x_attr = f_ptr->x_attr[*lighting_level];
7693 byte prev_x_char = f_ptr->x_char[*lighting_level];
7695 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7699 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7700 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7702 if (prev_x_char != f_ptr->x_char[*lighting_level])
7703 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7705 else *need_redraw = TRUE;
7710 /* Do visual mode command if needed */
7711 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))
7715 /* Restore previous visual settings */
7717 for (i = 0; i < F_LIT_MAX; i++)
7719 f_ptr->x_attr[i] = attr_old[i];
7720 f_ptr->x_char[i] = char_old[i];
7727 if (direct_f_idx >= 0) flag = TRUE;
7728 else *lighting_level = F_LIT_STANDARD;
7731 /* Preserve current visual settings */
7734 for (i = 0; i < F_LIT_MAX; i++)
7736 attr_old[i] = f_ptr->x_attr[i];
7737 char_old[i] = f_ptr->x_char[i];
7739 *lighting_level = F_LIT_STANDARD;
7746 for (i = 0; i < F_LIT_MAX; i++)
7748 attr_idx_feat[i] = f_ptr->x_attr[i];
7749 char_idx_feat[i] = f_ptr->x_char[i];
7758 /* Allow TERM_DARK text */
7759 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7761 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7762 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7780 /* Move the cursor */
7781 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7787 /* Free the "feat_idx" array */
7788 C_KILL(feat_idx, max_f_idx, int);
7793 * List wanted monsters
7795 static void do_cmd_knowledge_kubi(void)
7800 char file_name[1024];
7803 /* Open a new file */
7804 fff = my_fopen_temp(file_name, 1024);
7806 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7813 bool listed = FALSE;
7816 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7818 fprintf(fff, "賞金首リスト\n");
7820 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7822 fprintf(fff, "List of wanted monsters\n");
7824 fprintf(fff, "----------------------------------------------\n");
7826 for (i = 0; i < MAX_KUBI; i++)
7828 if (kubi_r_idx[i] <= 10000)
7830 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7838 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7842 /* Close the file */
7845 /* Display the file contents */
7846 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7848 /* Remove the file */
7853 * List virtues & status
7855 static void do_cmd_knowledge_virtues(void)
7859 char file_name[1024];
7862 /* Open a new file */
7863 fff = my_fopen_temp(file_name, 1024);
7865 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7872 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7876 /* Close the file */
7879 /* Display the file contents */
7880 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7882 /* Remove the file */
7890 static void do_cmd_knowledge_dungeon(void)
7894 char file_name[1024];
7898 /* Open a new file */
7899 fff = my_fopen_temp(file_name, 1024);
7901 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7908 for (i = 1; i < max_d_idx; i++)
7912 if (!d_info[i].maxdepth) continue;
7913 if (!max_dlv[i]) continue;
7914 if (d_info[i].final_guardian)
7916 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7918 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7920 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
7924 /* Close the file */
7927 /* Display the file contents */
7928 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7930 /* Remove the file */
7935 * List virtues & status
7938 static void do_cmd_knowledge_stat(void)
7942 char file_name[1024];
7945 /* Open a new file */
7946 fff = my_fopen_temp(file_name, 1024);
7948 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7955 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7956 (2 * p_ptr->hitdie +
7957 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7960 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7961 else fprintf(fff, "現在の体力ランク : ???\n\n");
7962 fprintf(fff, "能力の最大値\n\n");
7964 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7965 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7966 fprintf(fff, "Limits of maximum stats\n\n");
7968 for (v_nr = 0; v_nr < 6; v_nr++)
7970 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);
7971 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7977 /* Close the file */
7980 /* Display the file contents */
7981 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7983 /* Remove the file */
7989 * Print all active quests
7991 static void do_cmd_knowledge_quests_current(FILE *fff)
7994 char rand_tmp_str[120] = "\0";
7996 monster_race *r_ptr;
7998 int rand_level = 100;
8001 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
8003 for (i = 1; i < max_quests; i++)
8005 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
8006 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
8007 (quest[i].status == QUEST_STATUS_COMPLETED))
8009 /* Set the quest number temporary */
8010 int old_quest = p_ptr->inside_quest;
8013 /* Clear the text */
8014 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8015 quest_text_line = 0;
8017 p_ptr->inside_quest = i;
8019 /* Get the quest text */
8020 init_flags = INIT_SHOW_TEXT;
8022 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8024 /* Reset the old quest number */
8025 p_ptr->inside_quest = old_quest;
8027 /* No info from "silent" quests */
8028 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8032 if (quest[i].type != QUEST_TYPE_RANDOM)
8034 char note[80] = "\0";
8036 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
8038 switch (quest[i].type)
8040 case QUEST_TYPE_KILL_LEVEL:
8041 case QUEST_TYPE_KILL_ANY_LEVEL:
8042 r_ptr = &r_info[quest[i].r_idx];
8043 strcpy(name, r_name + r_ptr->name);
8044 if (quest[i].max_num > 1)
8047 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
8048 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8051 sprintf(note," - kill %d %s, have killed %d.",
8052 quest[i].max_num, name, quest[i].cur_num);
8056 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
8059 case QUEST_TYPE_FIND_ARTIFACT:
8062 artifact_type *a_ptr = &a_info[quest[i].k_idx];
8064 object_type *q_ptr = &forge;
8065 int k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
8066 object_prep(q_ptr, k_idx);
8067 q_ptr->name1 = quest[i].k_idx;
8068 q_ptr->ident = IDENT_STORE;
8069 object_desc(name, q_ptr, OD_NAME_ONLY);
8071 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
8073 case QUEST_TYPE_FIND_EXIT:
8074 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8077 case QUEST_TYPE_KILL_NUMBER:
8079 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8080 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8082 sprintf(note," - Kill %d monsters, have killed %d.",
8083 quest[i].max_num, quest[i].cur_num);
8087 case QUEST_TYPE_KILL_ALL:
8088 case QUEST_TYPE_TOWER:
8089 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8094 /* Print the quest info */
8096 sprintf(tmp_str, " %s (危険度:%d階相当)%s\n",
8097 quest[i].name, quest[i].level, note);
8099 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8100 quest[i].name, quest[i].level, note);
8103 fputs(tmp_str, fff);
8105 if (quest[i].status == QUEST_STATUS_COMPLETED)
8107 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8108 fputs(tmp_str, fff);
8114 while (quest_text[j][0] && j < 10)
8116 fprintf(fff, " %s\n", quest_text[j]);
8121 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8124 rand_level = quest[i].level;
8126 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8128 /* Print the quest info */
8129 r_ptr = &r_info[quest[i].r_idx];
8130 strcpy(name, r_name + r_ptr->name);
8132 if (quest[i].max_num > 1)
8135 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8136 quest[i].name, quest[i].level,
8137 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8141 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8142 quest[i].name, quest[i].level,
8143 quest[i].max_num, name, quest[i].cur_num);
8149 sprintf(rand_tmp_str," %s (%d 階) - %sを倒す。\n",
8150 quest[i].name, quest[i].level, name);
8152 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8153 quest[i].name, quest[i].level, name);
8161 /* Print the current random quest */
8162 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8164 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8168 static bool do_cmd_knowledge_quests_aux(FILE *fff, int q_idx)
8171 char playtime_str[16];
8172 quest_type* const q_ptr = &quest[q_idx];
8174 if (is_fixed_quest_idx(q_idx))
8176 /* Set the quest number temporary */
8177 int old_quest = p_ptr->inside_quest;
8179 p_ptr->inside_quest = q_idx;
8182 init_flags = INIT_NAME_ONLY;
8184 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8186 /* Reset the old quest number */
8187 p_ptr->inside_quest = old_quest;
8189 /* No info from "silent" quests */
8190 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8193 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8194 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8196 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8198 /* Print the quest info */
8199 if (q_ptr->complev == 0)
8202 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8203 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8204 r_name+r_info[q_ptr->r_idx].name,
8205 q_ptr->level, playtime_str);
8210 _(" %-35s (%3d階) - レベル%2d - %s\n",
8211 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8212 r_name+r_info[q_ptr->r_idx].name,
8220 /* Print the quest info */
8222 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8223 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8224 q_ptr->name, q_ptr->level, q_ptr->complev, playtime_str);
8227 fputs(tmp_str, fff);
8233 * Print all finished quests
8235 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8240 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8241 for (i = 1; i < max_quests; i++)
8243 int q_idx = quest_num[i];
8244 quest_type* const q_ptr = &quest[q_idx];
8246 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8247 do_cmd_knowledge_quests_aux(fff, q_idx))
8252 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8257 * Print all failed quests
8259 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8264 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8265 for (i = 1; i < max_quests; i++)
8267 int q_idx = quest_num[i];
8268 quest_type* const q_ptr = &quest[q_idx];
8270 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8271 do_cmd_knowledge_quests_aux(fff, q_idx))
8276 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8281 * Print all random quests
8283 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8289 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8290 for (i = 1; i < max_quests; i++)
8292 /* No info from "silent" quests */
8293 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8295 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8299 /* Print the quest info */
8301 sprintf(tmp_str, " %s (%d階, %s)\n",
8302 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8304 sprintf(tmp_str, " %s (%d, %s)\n",
8305 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8307 fputs(tmp_str, fff);
8310 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8314 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8316 int *q_num = (int *)u;
8317 quest_type *qa = &quest[q_num[a]];
8318 quest_type *qb = &quest[q_num[b]];
8323 return (qa->comptime <= qb->comptime);
8326 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8328 int *q_num = (int *)u;
8335 q_num[a] = q_num[b];
8341 * Print quest status of all active quests
8343 static void do_cmd_knowledge_quests(void)
8346 char file_name[1024];
8347 int *quest_num, dummy, i;
8349 /* Open a new file */
8350 fff = my_fopen_temp(file_name, 1024);
8353 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8358 /* Allocate Memory */
8359 C_MAKE(quest_num, max_quests, int);
8361 /* Sort by compete level */
8362 for (i = 1; i < max_quests; i++) quest_num[i] = i;
8363 ang_sort_comp = ang_sort_comp_quest_num;
8364 ang_sort_swap = ang_sort_swap_quest_num;
8365 ang_sort(quest_num, &dummy, max_quests);
8367 /* Dump Quest Information */
8368 do_cmd_knowledge_quests_current(fff);
8370 do_cmd_knowledge_quests_completed(fff, quest_num);
8372 do_cmd_knowledge_quests_failed(fff, quest_num);
8376 do_cmd_knowledge_quests_wiz_random(fff);
8379 /* Close the file */
8382 /* Display the file contents */
8383 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8385 /* Remove the file */
8389 C_KILL(quest_num, max_quests, int);
8396 static void do_cmd_knowledge_home(void)
8401 char file_name[1024];
8403 char o_name[MAX_NLEN];
8406 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8408 /* Open a new file */
8409 fff = my_fopen_temp(file_name, 1024);
8411 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8418 /* Print all homes in the different towns */
8419 st_ptr = &town[1].store[STORE_HOME];
8421 /* Home -- if anything there */
8422 if (st_ptr->stock_num)
8427 /* Header with name of the town */
8428 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8430 /* Dump all available items */
8431 for (i = 0; i < st_ptr->stock_num; i++)
8434 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8435 object_desc(o_name, &st_ptr->stock[i], 0);
8436 if (strlen(o_name) <= 80-3)
8438 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8444 for (n = 0, t = o_name; n < 80-3; n++, t++)
8445 if(iskanji(*t)) {t++; n++;}
8446 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8448 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8449 fprintf(fff, " %.77s\n", o_name+n);
8452 object_desc(o_name, &st_ptr->stock[i], 0);
8453 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8458 /* Add an empty line */
8459 fprintf(fff, "\n\n");
8463 /* Close the file */
8466 /* Display the file contents */
8467 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8469 /* Remove the file */
8475 * Check the status of "autopick"
8477 static void do_cmd_knowledge_autopick(void)
8481 char file_name[1024];
8483 /* Open a new file */
8484 fff = my_fopen_temp(file_name, 1024);
8488 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8495 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8499 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8500 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8503 for (k = 0; k < max_autopick; k++)
8506 byte act = autopick_list[k].action;
8507 if (act & DONT_AUTOPICK)
8509 tmp = _("放置", "Leave");
8511 else if (act & DO_AUTODESTROY)
8513 tmp = _("破壊", "Destroy");
8515 else if (act & DO_AUTOPICK)
8517 tmp = _("拾う", "Pickup");
8519 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
8521 tmp = _("確認", "Query");
8524 if (act & DO_DISPLAY)
8525 fprintf(fff, "%11s", format("[%s]", tmp));
8527 fprintf(fff, "%11s", format("(%s)", tmp));
8529 tmp = autopick_line_from_entry(&autopick_list[k]);
8530 fprintf(fff, " %s", tmp);
8534 /* Close the file */
8536 /* Display the file contents */
8537 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8539 /* Remove the file */
8545 * Interact with "knowledge"
8547 void do_cmd_knowledge(void)
8550 bool need_redraw = FALSE;
8552 /* File type is "TEXT" */
8553 FILE_TYPE(FILE_TYPE_TEXT);
8555 /* Save the screen */
8558 /* Interact until done */
8564 /* Ask for a choice */
8566 prt(format("%d/2 ページ", (p+1)), 2, 65);
8567 prt("現在の知識を確認する", 3, 0);
8569 prt(format("page %d/2", (p+1)), 2, 65);
8570 prt("Display current knowledge", 3, 0);
8573 /* Give some choices */
8577 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8578 prt("(2) 既知のアイテム の一覧", 7, 5);
8579 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8580 prt("(4) 既知のモンスター の一覧", 9, 5);
8581 prt("(5) 倒した敵の数 の一覧", 10, 5);
8582 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8583 prt("(7) 現在のペット の一覧", 12, 5);
8584 prt("(8) 我が家のアイテム の一覧", 13, 5);
8585 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8586 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8590 prt("(a) 自分に関する情報 の一覧", 6, 5);
8591 prt("(b) 突然変異 の一覧", 7, 5);
8592 prt("(c) 武器の経験値 の一覧", 8, 5);
8593 prt("(d) 魔法の経験値 の一覧", 9, 5);
8594 prt("(e) 技能の経験値 の一覧", 10, 5);
8595 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8596 prt("(g) 入ったダンジョン の一覧", 12, 5);
8597 prt("(h) 実行中のクエスト の一覧", 13, 5);
8598 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8603 prt("(1) Display known artifacts", 6, 5);
8604 prt("(2) Display known objects", 7, 5);
8605 prt("(3) Display remaining uniques", 8, 5);
8606 prt("(4) Display known monster", 9, 5);
8607 prt("(5) Display kill count", 10, 5);
8608 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8609 prt("(7) Display current pets", 12, 5);
8610 prt("(8) Display home inventory", 13, 5);
8611 prt("(9) Display *identified* equip.", 14, 5);
8612 prt("(0) Display terrain symbols.", 15, 5);
8616 prt("(a) Display about yourself", 6, 5);
8617 prt("(b) Display mutations", 7, 5);
8618 prt("(c) Display weapon proficiency", 8, 5);
8619 prt("(d) Display spell proficiency", 9, 5);
8620 prt("(e) Display misc. proficiency", 10, 5);
8621 prt("(f) Display virtues", 11, 5);
8622 prt("(g) Display dungeons", 12, 5);
8623 prt("(h) Display current quests", 13, 5);
8624 prt("(i) Display auto pick/destroy", 14, 5);
8630 prt("ESC) 抜ける", 21, 1);
8631 prt("SPACE) 次ページ", 21, 30);
8632 /*prt("-) 前ページ", 21, 60);*/
8633 prt("コマンド:", 20, 0);
8635 prt("-more-", 17, 8);
8636 prt("ESC) Exit menu", 21, 1);
8637 prt("SPACE) Next page", 21, 30);
8638 /*prt("-) Previous page", 21, 60);*/
8639 prt("Command: ", 20, 0);
8646 if (i == ESCAPE) break;
8649 case ' ': /* Page change */
8653 case '1': /* Artifacts */
8654 do_cmd_knowledge_artifacts();
8656 case '2': /* Objects */
8657 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8659 case '3': /* Uniques */
8660 do_cmd_knowledge_uniques();
8662 case '4': /* Monsters */
8663 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8665 case '5': /* Kill count */
8666 do_cmd_knowledge_kill_count();
8668 case '6': /* wanted */
8669 if (!vanilla_town) do_cmd_knowledge_kubi();
8671 case '7': /* Pets */
8672 do_cmd_knowledge_pets();
8674 case '8': /* Home */
8675 do_cmd_knowledge_home();
8677 case '9': /* Resist list */
8678 do_cmd_knowledge_inven();
8680 case '0': /* Feature list */
8682 int lighting_level = F_LIT_STANDARD;
8683 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8687 case 'a': /* Max stat */
8688 do_cmd_knowledge_stat();
8690 case 'b': /* Mutations */
8691 do_cmd_knowledge_mutations();
8693 case 'c': /* weapon-exp */
8694 do_cmd_knowledge_weapon_exp();
8696 case 'd': /* spell-exp */
8697 do_cmd_knowledge_spell_exp();
8699 case 'e': /* skill-exp */
8700 do_cmd_knowledge_skill_exp();
8702 case 'f': /* Virtues */
8703 do_cmd_knowledge_virtues();
8705 case 'g': /* Dungeon */
8706 do_cmd_knowledge_dungeon();
8708 case 'h': /* Quests */
8709 do_cmd_knowledge_quests();
8711 case 'i': /* Autopick */
8712 do_cmd_knowledge_autopick();
8714 default: /* Unknown option */
8718 /* Flush messages */
8722 /* Restore the screen */
8725 if (need_redraw) do_cmd_redraw();
8730 * Check on the status of an active quest
8732 void do_cmd_checkquest(void)
8734 /* File type is "TEXT" */
8735 FILE_TYPE(FILE_TYPE_TEXT);
8737 /* Save the screen */
8741 do_cmd_knowledge_quests();
8743 /* Restore the screen */
8749 * Display the time and date
8751 void do_cmd_time(void)
8753 int day, hour, min, full, start, end, num;
8761 extract_day_hour_min(&day, &hour, &min);
8763 full = hour * 100 + min;
8770 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8772 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8773 else strcpy(day_buf, "*****");
8777 msg_format("%s日目, 時刻は%d:%02d %sです。",
8778 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8779 min, (hour < 12) ? "AM" : "PM");
8781 msg_format("This is day %s. The time is %d:%02d %s.",
8782 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8783 min, (hour < 12) ? "AM" : "PM");
8788 if (!randint0(10) || p_ptr->image)
8790 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8794 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8797 /* Open this file */
8798 fff = my_fopen(buf, "rt");
8803 /* Find this time */
8804 while (!my_fgets(fff, buf, sizeof(buf)))
8806 /* Ignore comments */
8807 if (!buf[0] || (buf[0] == '#')) continue;
8809 /* Ignore invalid lines */
8810 if (buf[1] != ':') continue;
8812 /* Process 'Start' */
8815 /* Extract the starting time */
8816 start = atoi(buf + 2);
8818 /* Assume valid for an hour */
8828 /* Extract the ending time */
8829 end = atoi(buf + 2);
8835 /* Ignore incorrect range */
8836 if ((start > full) || (full > end)) continue;
8838 /* Process 'Description' */
8843 /* Apply the randomizer */
8844 if (!randint0(num)) strcpy(desc, buf + 2);
8854 /* Close the file */