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);
700 if (do_level) write_level = FALSE;
706 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
709 * @brief 日記のタイトル表記と内容出力 /
712 * 日記のタイトルは本関数の subtitle ローカル変数で定義されている。
714 static void do_cmd_disp_nikki(void)
716 char nikki_title[256];
722 static const char subtitle[][30] = {"最強の肉体を求めて",
753 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
754 "Attack is the best form of defence.",
756 "An unexpected windfall",
757 "A drowning man will catch at a straw",
758 "Don't count your chickens before they are hatched.",
759 "It is no use crying over spilt milk.",
760 "Seeing is believing.",
761 "Strike the iron while it is hot.",
762 "I don't care what follows.",
763 "To dig a well to put out a house on fire.",
764 "Tomorrow is another day.",
765 "Easy come, easy go.",
766 "The more haste, the less speed.",
767 "Where there is life, there is hope.",
768 "There is no royal road to *WINNER*.",
769 "Danger past, God forgotten.",
770 "The best thing to do now is to run away.",
771 "Life is but an empty dream.",
772 "Dead men tell no tales.",
773 "A book that remains shut is but a block.",
774 "Misfortunes never come singly.",
775 "A little knowledge is a dangerous thing.",
776 "History repeats itself.",
777 "*WINNER* was not built in a day.",
778 "Ignorance is bliss.",
779 "To lose is to win?",
780 "No medicine can cure folly.",
781 "All good things come to an end.",
782 "M$ Empire strikes back.",
783 "To see is to believe",
785 "Quest of The World's Greatest Brain"};
787 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
789 /* Build the filename */
790 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
792 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
793 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
794 else if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
795 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
796 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
799 sprintf(nikki_title, "「%s%s%sの伝説 -%s-」",
800 ap_ptr->title, ap_ptr->no ? "の" : "", p_ptr->name, tmp);
802 sprintf(nikki_title, "Legend of %s %s '%s'",
803 ap_ptr->title, p_ptr->name, tmp);
806 /* Display the file contents */
807 show_file(FALSE, buf, nikki_title, -1, 0);
811 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
814 static void do_cmd_bunshou(void)
817 char bunshou[80] = "\0";
819 if (get_string(_("内容: ", "diary note: "), tmp, 79))
821 strcpy(bunshou, tmp);
823 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
828 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
831 static void do_cmd_last_get(void)
836 if (record_o_name[0] == '\0') return;
838 sprintf(buf,_("%sの入手を記録します。", "Do you really want to record getting %s? "),record_o_name);
839 if (!get_check(buf)) return;
843 sprintf(buf,_("%sを手に入れた。", "descover %s."), record_o_name);
844 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
849 * @brief ファイル中の全日記記録を消去する /
852 static void do_cmd_erase_nikki(void)
858 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your record? "))) return;
859 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
861 /* Build the filename */
862 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
864 /* Remove the file */
867 fff = my_fopen(buf, "w");
870 msg_format(_("記録を消去しました。", "deleted record."));
872 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
881 void do_cmd_nikki(void)
885 /* File type is "TEXT" */
886 FILE_TYPE(FILE_TYPE_TEXT);
888 /* Save the screen */
891 /* Interact until done */
897 /* Ask for a choice */
898 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
900 /* Give some choices */
901 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
902 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
903 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record item you last get/identify"), 6, 5);
904 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
906 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
909 prt(_("コマンド:", "Command: "), 18, 0);
915 if (i == ESCAPE) break;
929 do_cmd_erase_nikki();
933 prepare_movie_hooks();
935 default: /* Unknown option */
943 /* Restore the screen */
948 * @brief 画面を再描画するコマンドのメインルーチン
949 * Hack -- redraw the screen
953 * This command performs various low level updates, clears all the "extra"
954 * windows, does a total redraw of the main window, and requests all of the
955 * interesting updates and redraws that I can think of.
957 * This command is also used to "instantiate" the results of the user
958 * selecting various things, such as graphics mode, so it must call
959 * the "TERM_XTRA_REACT" hook before redrawing the windows.
962 void do_cmd_redraw(void)
969 /* Hack -- react to changes */
970 Term_xtra(TERM_XTRA_REACT, 0);
973 /* Combine and Reorder the pack (later) */
974 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
978 p_ptr->update |= (PU_TORCH);
981 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
983 /* Forget lite/view */
984 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
986 /* Update lite/view */
987 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
989 /* Update monsters */
990 p_ptr->update |= (PU_MONSTERS);
992 /* Redraw everything */
993 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
996 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
999 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1003 /* Hack -- update */
1006 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1009 /* Redraw every window */
1010 for (j = 0; j < 8; j++)
1013 if (!angband_term[j]) continue;
1016 Term_activate(angband_term[j]);
1031 * @brief 名前を変更するコマンドのメインルーチン
1032 * Hack -- change name
1035 void do_cmd_change_name(void)
1044 /* Save the screen */
1052 /* Display the player */
1053 display_player(mode);
1058 display_player(mode);
1063 Term_putstr(2, 23, -1, TERM_WHITE,
1064 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1066 Term_putstr(2, 23, -1, TERM_WHITE,
1067 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1075 if (c == ESCAPE) break;
1082 /* Process the player name */
1083 process_player_name(FALSE);
1089 sprintf(tmp, "%s.txt", player_base);
1090 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1092 if (tmp[0] && (tmp[0] != ' '))
1094 file_character(tmp);
1111 /* Flush messages */
1115 /* Restore the screen */
1118 /* Redraw everything */
1119 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1126 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1127 * Recall the most recent message
1130 void do_cmd_message_one(void)
1132 /* Recall one message XXX XXX XXX */
1133 prt(format("> %s", message_str(0)), 0, 0);
1138 * @brief メッセージのログを表示するコマンドのメインルーチン
1139 * Recall the most recent message
1143 * Show previous messages to the user -BEN-
1145 * The screen format uses line 0 and 23 for headers and prompts,
1146 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1148 * This command shows you which commands you are viewing, and allows
1149 * you to "search" for strings in the recall.
1151 * Note that messages may be longer than 80 characters, but they are
1152 * displayed using "infinite" length, with a special sub-command to
1153 * "slide" the virtual display to the left or right.
1155 * Attempt to only hilite the matching portions of the string.
1158 void do_cmd_messages(int num_now)
1162 char shower_str[81];
1163 char finder_str[81];
1170 Term_get_size(&wid, &hgt);
1172 /* Number of message lines in a screen */
1173 num_lines = hgt - 4;
1176 strcpy(finder_str, "");
1179 strcpy(shower_str, "");
1181 /* Total messages */
1184 /* Start on first message */
1187 /* Save the screen */
1193 /* Process requests until done */
1199 /* Dump up to 20 lines of messages */
1200 for (j = 0; (j < num_lines) && (i + j < n); j++)
1202 cptr msg = message_str(i+j);
1204 /* Dump the messages, bottom to top */
1205 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1207 /* Hilite "shower" */
1208 if (shower && shower[0])
1212 /* Display matches */
1213 while ((str = my_strstr(str, shower)) != NULL)
1215 int len = strlen(shower);
1217 /* Display the match */
1218 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1226 /* Erase remaining lines */
1227 for (; j < num_lines; j++)
1229 Term_erase(0, num_lines + 1 - j, 255);
1232 /* Display header XXX XXX XXX */
1235 prt(format("以前のメッセージ %d-%d 全部で(%d)",
1236 i, i + j - 1, n), 0, 0);
1238 prt(format("Message Recall (%d-%d of %d)",
1239 i, i + j - 1, n), 0, 0);
1242 /* Display prompt (not very informative) */
1243 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1244 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1247 skey = inkey_special(TRUE);
1249 /* Exit on Escape */
1250 if (skey == ESCAPE) break;
1252 /* Hack -- Save the old index */
1257 /* Hack -- handle show */
1260 prt(_("強調: ", "Show: "), hgt - 1, 0);
1262 /* Get a "shower" string, or continue */
1263 strcpy(back_str, shower_str);
1264 if (askfor(shower_str, 80))
1267 shower = shower_str[0] ? shower_str : NULL;
1269 else strcpy(shower_str, back_str);
1274 /* Hack -- handle find */
1281 prt(_("検索: ", "Find: "), hgt - 1, 0);
1283 /* Get a "finder" string, or continue */
1284 strcpy(back_str, finder_str);
1285 if (!askfor(finder_str, 80))
1287 strcpy(finder_str, back_str);
1290 else if (!finder_str[0])
1292 shower = NULL; /* Stop showing */
1297 shower = finder_str;
1300 for (z = i + 1; z < n; z++)
1302 cptr msg = message_str(z);
1305 if (my_strstr(msg, finder_str))
1317 /* Recall 1 older message */
1319 /* Go to the oldest line */
1323 /* Recall 1 newer message */
1325 /* Go to the newest line */
1329 /* Recall 1 older message */
1334 /* Go older if legal */
1335 i = MIN(i + 1, n - num_lines);
1338 /* Recall 10 older messages */
1340 /* Go older if legal */
1341 i = MIN(i + 10, n - num_lines);
1344 /* Recall 20 older messages */
1349 /* Go older if legal */
1350 i = MIN(i + num_lines, n - num_lines);
1353 /* Recall 20 newer messages */
1357 /* Go newer (if able) */
1358 i = MAX(0, i - num_lines);
1361 /* Recall 10 newer messages */
1363 /* Go newer (if able) */
1367 /* Recall 1 newer messages */
1370 /* Go newer (if able) */
1375 /* Hack -- Error of some kind */
1379 /* Restore the screen */
1386 * チートオプションの最大数 / Number of cheating options
1391 * チーとオプションの定義テーブル / Cheating options
1393 static option_type cheat_info[CHEAT_MAX] =
1395 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1396 "cheat_peek", _("アイテムの生成をのぞき見る", "Peek into object creation")
1399 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1400 "cheat_hear", _("モンスターの生成をのぞき見る", "Peek into monster creation")
1403 { &cheat_room, FALSE, 255, 0x04, 0x00,
1404 "cheat_room", _("ダンジョンの生成をのぞき見る", "Peek into dungeon creation")
1407 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1408 "cheat_xtra", _("その他の事をのぞき見る", "Peek into something else")
1411 { &cheat_know, FALSE, 255, 0x10, 0x00,
1412 "cheat_know", _("完全なモンスターの思い出を知る", "Know complete monster info")
1415 { &cheat_live, FALSE, 255, 0x20, 0x00,
1416 "cheat_live", _("死を回避することを可能にする", "Allow player to avoid death")
1419 { &cheat_save, FALSE, 255, 0x40, 0x00,
1420 "cheat_save", _("死んだ時セーブするか確認する", "Ask for saving death")
1423 { &cheat_diary_output, FALSE, 255, 0x80, 0x00,
1424 "cheat_diary_output", _("詳細な情報を日記に出力する", "Output detailed infotmation to diary.")
1431 * @brief チートオプションを変更するコマンドのメインルーチン
1432 * Interact with some options for cheating
1433 * @param info 表示メッセージ
1436 static void do_cmd_options_cheat(cptr info)
1440 int i, k = 0, n = CHEAT_MAX;
1448 /* Interact with the player */
1453 /* Prompt XXX XXX XXX */
1454 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1459 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1460 prt(" << 注意 >>", 11, 0);
1461 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1462 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1463 prt(" じらないようにして下さい。", 14, 0);
1465 /* Display the options */
1466 for (i = 0; i < n; i++)
1468 byte a = TERM_WHITE;
1470 /* Color current option */
1471 if (i == k) a = TERM_L_BLUE;
1473 /* Display the option text */
1474 sprintf(buf, "%-48s: %s (%s)",
1475 cheat_info[i].o_desc,
1476 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1477 cheat_info[i].o_text);
1478 c_prt(a, buf, i + 2, 0);
1481 /* Hilite current option */
1482 move_cursor(k + 2, 50);
1488 * HACK - Try to translate the key into a direction
1489 * to allow using the roguelike keys for navigation.
1491 dir = get_keymap_dir(ch);
1492 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1506 k = (n + k - 1) % n;
1524 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1525 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1526 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1527 (*cheat_info[k].o_var) = TRUE;
1536 (*cheat_info[k].o_var) = FALSE;
1543 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1544 /* Peruse the help file */
1545 (void)show_file(TRUE, buf, NULL, 0, 0);
1564 static option_type autosave_info[2] =
1566 { &autosave_l, FALSE, 255, 0x01, 0x00,
1567 "autosave_l", _("新しい階に入る度に自動セーブする", "Autosave when entering new levels") },
1569 { &autosave_t, FALSE, 255, 0x02, 0x00,
1570 "autosave_t", _("一定ターン毎に自動セーブする", "Timed autosave") },
1574 * @brief セーブ頻度ターンの次の値を返す
1575 * @param current 現在のセーブ頻度ターン値
1576 * @return 次のセーブ頻度ターン値
1578 static s16b toggle_frequency(s16b current)
1583 case 50: return 100;
1584 case 100: return 250;
1585 case 250: return 500;
1586 case 500: return 1000;
1587 case 1000: return 2500;
1588 case 2500: return 5000;
1589 case 5000: return 10000;
1590 case 10000: return 25000;
1597 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1598 * @param info 表示メッセージ
1601 static void do_cmd_options_autosave(cptr info)
1605 int i, k = 0, n = 2;
1613 /* Interact with the player */
1616 /* Prompt XXX XXX XXX */
1617 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1618 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1622 /* Display the options */
1623 for (i = 0; i < n; i++)
1625 byte a = TERM_WHITE;
1627 /* Color current option */
1628 if (i == k) a = TERM_L_BLUE;
1630 /* Display the option text */
1631 sprintf(buf, "%-48s: %s (%s)",
1632 autosave_info[i].o_desc,
1633 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1634 autosave_info[i].o_text);
1635 c_prt(a, buf, i + 2, 0);
1637 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1639 /* Hilite current option */
1640 move_cursor(k + 2, 50);
1656 k = (n + k - 1) % n;
1674 (*autosave_info[k].o_var) = TRUE;
1683 (*autosave_info[k].o_var) = FALSE;
1691 autosave_freq = toggle_frequency(autosave_freq);
1692 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1698 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1714 * @brief 標準オプションを変更するコマンドのサブルーチン /
1715 * Interact with some options
1716 * @param page オプションページ番号
1717 * @param info 表示メッセージ
1720 void do_cmd_options_aux(int page, cptr info)
1723 int i, k = 0, n = 0, l;
1726 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1727 (!p_ptr->wizard || !allow_debug_opts);
1730 /* Lookup the options */
1731 for (i = 0; i < 24; i++) opt[i] = 0;
1733 /* Scan the options */
1734 for (i = 0; option_info[i].o_desc; i++)
1736 /* Notice options on this "page" */
1737 if (option_info[i].o_page == page) opt[n++] = i;
1744 /* Interact with the player */
1749 /* Prompt XXX XXX XXX */
1750 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1751 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1754 /* HACK -- description for easy-auto-destroy options */
1755 if (page == OPT_PAGE_AUTODESTROY)
1756 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1757 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1759 /* Display the options */
1760 for (i = 0; i < n; i++)
1762 byte a = TERM_WHITE;
1764 /* Color current option */
1765 if (i == k) a = TERM_L_BLUE;
1767 /* Display the option text */
1768 sprintf(buf, "%-48s: %s (%.19s)",
1769 option_info[opt[i]].o_desc,
1770 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1771 option_info[opt[i]].o_text);
1772 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1773 else c_prt(a, buf, i + 2, 0);
1776 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1779 /* Hilite current option */
1780 move_cursor(k + 2 + l, 50);
1786 * HACK - Try to translate the key into a direction
1787 * to allow using the roguelike keys for navigation.
1789 dir = get_keymap_dir(ch);
1790 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1804 k = (n + k - 1) % n;
1821 if (browse_only) break;
1822 (*option_info[opt[k]].o_var) = TRUE;
1831 if (browse_only) break;
1832 (*option_info[opt[k]].o_var) = FALSE;
1840 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1846 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1847 /* Peruse the help file */
1848 (void)show_file(TRUE, buf, NULL, 0, 0);
1865 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1866 * Modify the "window" options
1869 static void do_cmd_options_win(void)
1879 /* Memorize old flags */
1880 for (j = 0; j < 8; j++)
1882 /* Acquire current flags */
1883 old_flag[j] = window_flag[j];
1893 /* Prompt XXX XXX XXX */
1894 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1896 /* Display the windows */
1897 for (j = 0; j < 8; j++)
1899 byte a = TERM_WHITE;
1901 cptr s = angband_term_name[j];
1904 if (j == x) a = TERM_L_BLUE;
1906 /* Window name, staggered, centered */
1907 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1910 /* Display the options */
1911 for (i = 0; i < 16; i++)
1913 byte a = TERM_WHITE;
1915 cptr str = window_flag_desc[i];
1918 if (i == y) a = TERM_L_BLUE;
1921 if (!str) str = _("(未使用)", "(Unused option)");
1924 Term_putstr(0, i + 5, -1, a, str);
1926 /* Display the windows */
1927 for (j = 0; j < 8; j++)
1933 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1936 if (window_flag[j] & (1L << i)) c = 'X';
1939 Term_putch(35 + j * 5, i + 5, a, c);
1944 Term_gotoxy(35 + x * 5, y + 5);
1962 for (j = 0; j < 8; j++)
1964 window_flag[j] &= ~(1L << y);
1968 for (i = 0; i < 16; i++)
1970 window_flag[x] &= ~(1L << i);
1983 window_flag[x] |= (1L << y);
1991 window_flag[x] &= ~(1L << y);
1997 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
2005 d = get_keymap_dir(ch);
2007 x = (x + ddx[d] + 8) % 8;
2008 y = (y + ddy[d] + 16) % 16;
2015 /* Notice changes */
2016 for (j = 0; j < 8; j++)
2021 if (!angband_term[j]) continue;
2023 /* Ignore non-changes */
2024 if (window_flag[j] == old_flag[j]) continue;
2027 Term_activate(angband_term[j]);
2050 option_fields[OPT_NUM] =
2053 { '1', " キー入力 オプション", 3 },
2054 { '2', " マップ画面 オプション", 4 },
2055 { '3', " テキスト表示 オプション", 5 },
2056 { '4', " ゲームプレイ オプション", 6 },
2057 { '5', " 行動中止関係 オプション", 7 },
2058 { '6', " 簡易自動破壊 オプション", 8 },
2059 { 'r', " プレイ記録 オプション", 9 },
2061 { 'p', "自動拾いエディタ", 11 },
2062 { 'd', " 基本ウェイト量 ", 12 },
2063 { 'h', "低ヒットポイント", 13 },
2064 { 'm', " 低魔力色閾値 ", 14 },
2065 { 'a', " 自動セーブ オプション", 15 },
2066 { 'w', "ウインドウフラグ", 16 },
2068 { 'b', " 初期 オプション (参照のみ)", 18 },
2069 { 'c', " 詐欺 オプション", 19 },
2071 { '1', "Input Options", 3 },
2072 { '2', "Map Screen Options", 4 },
2073 { '3', "Text Display Options", 5 },
2074 { '4', "Game-Play Options", 6 },
2075 { '5', "Disturbance Options", 7 },
2076 { '6', "Easy Auto-Destroyer Options", 8 },
2077 { 'r', "Play record Options", 9 },
2079 { 'p', "Auto-picker/destroyer editor", 11 },
2080 { 'd', "Base Delay Factor", 12 },
2081 { 'h', "Hitpoint Warning", 13 },
2082 { 'm', "Mana Color Threshold", 14 },
2083 { 'a', "Autosave Options", 15 },
2084 { 'w', "Window Flags", 16 },
2086 { 'b', "Birth Options (Browse Only)", 18 },
2087 { 'c', "Cheat Options", 19 },
2093 * @brief 標準オプションを変更するコマンドのメインルーチン /
2094 * Set or unset various options.
2098 * The user must use the "Ctrl-R" command to "adapt" to changes
2099 * in any options which control "visual" aspects of the game.
2102 void do_cmd_options(void)
2108 /* Save the screen */
2116 /* Does not list cheat option when cheat option is off */
2117 if (!p_ptr->noscore && !allow_debug_opts) n--;
2122 /* Why are we here */
2123 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2127 /* Give some choices */
2128 for (i = 0; i < n; i++)
2130 byte a = TERM_WHITE;
2131 if (i == y) a = TERM_L_BLUE;
2132 Term_putstr(5, option_fields[i].row, -1, a,
2133 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2136 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2139 skey = inkey_special(TRUE);
2140 if (!(skey & SKEY_MASK)) k = (char)skey;
2144 if (k == ESCAPE) break;
2146 if (my_strchr("\n\r ", k))
2148 k = option_fields[y].key;
2152 for (i = 0; i < n; i++)
2154 if (tolower(k) == option_fields[i].key) break;
2157 /* Command is found */
2160 /* Hack -- browse help */
2161 if (k == '?') break;
2165 if (skey == SKEY_UP) d = 8;
2166 if (skey == SKEY_DOWN) d = 2;
2167 y = (y + ddy[d] + n) % n;
2172 if (k == ESCAPE) break;
2179 /* Process the general options */
2180 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2186 /* Process the general options */
2187 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2194 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2201 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2208 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2215 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2219 /* Play-record Options */
2224 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2233 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2234 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2235 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2239 /* Cheating Options */
2242 if (!p_ptr->noscore && !allow_debug_opts)
2244 /* Cheat options are not permitted */
2250 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2257 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2266 do_cmd_options_win();
2267 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2268 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2269 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2270 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2275 /* Auto-picker/destroyer editor */
2279 do_cmd_edit_autopick();
2283 /* Hack -- Delay Speed */
2289 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2291 /* Get a new value */
2294 int msec = delay_factor * delay_factor * delay_factor;
2295 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2296 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2298 if (k == ESCAPE) break;
2301 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2304 else if (isdigit(k)) delay_factor = D2I(k);
2311 /* Hack -- hitpoint warning factor */
2317 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2319 /* Get a new value */
2322 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2323 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2325 if (k == ESCAPE) break;
2328 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2331 else if (isdigit(k)) hitpoint_warn = D2I(k);
2338 /* Hack -- mana color factor */
2344 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2346 /* Get a new value */
2349 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2350 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2352 if (k == ESCAPE) break;
2355 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2358 else if (isdigit(k)) mana_warn = D2I(k);
2366 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2370 /* Unknown option */
2379 /* Flush messages */
2384 /* Restore the screen */
2387 /* Hack - Redraw equippy chars */
2388 p_ptr->redraw |= (PR_EQUIPPY);
2394 * @brief prefファイルを選択して処理する /
2395 * Ask for a "user pref line" and process it
2398 * XXX XXX XXX Allow absolute file names?
2400 void do_cmd_pref(void)
2407 /* Ask for a "user pref command" */
2408 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2410 /* Process that pref command */
2411 (void)process_pref_file_command(buf);
2415 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2418 void do_cmd_reload_autopick(void)
2420 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2421 /* Load the file with messages */
2422 autopick_load_pref(TRUE);
2428 * @brief マクロ情報をprefファイルに保存する /
2429 * @param fname ファイル名
2432 static errr macro_dump(cptr fname)
2434 static cptr mark = "Macro Dump";
2440 /* Build the filename */
2441 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2443 /* File type is "TEXT" */
2444 FILE_TYPE(FILE_TYPE_TEXT);
2446 /* Append to the file */
2447 if (!open_auto_dump(buf, mark)) return (-1);
2450 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2453 for (i = 0; i < macro__num; i++)
2455 /* Extract the action */
2456 ascii_to_text(buf, macro__act[i]);
2458 /* Dump the macro */
2459 auto_dump_printf("A:%s\n", buf);
2461 /* Extract the action */
2462 ascii_to_text(buf, macro__pat[i]);
2464 /* Dump normal macros */
2465 auto_dump_printf("P:%s\n", buf);
2468 auto_dump_printf("\n");
2480 * @brief マクロのトリガーキーを取得する /
2481 * Hack -- ask for a "trigger" (see below)
2482 * @param buf キー表記を保管するバッファ
2486 * Note the complex use of the "inkey()" function from "util.c".
2488 * Note that both "flush()" calls are extremely important.
2491 static void do_cmd_macro_aux(char *buf)
2501 /* Do not process macros */
2507 /* Read the pattern */
2513 /* Do not process macros */
2516 /* Do not wait for keys */
2519 /* Attempt to read a key */
2530 /* Convert the trigger */
2531 ascii_to_text(tmp, buf);
2533 /* Hack -- display the trigger */
2534 Term_addstr(-1, TERM_WHITE, tmp);
2540 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2541 * Hack -- ask for a keymap "trigger" (see below)
2542 * @param buf キー表記を取得するバッファ
2546 * Note that both "flush()" calls are extremely important. This may
2547 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2550 static void do_cmd_macro_aux_keymap(char *buf)
2564 /* Convert to ascii */
2565 ascii_to_text(tmp, buf);
2567 /* Hack -- display the trigger */
2568 Term_addstr(-1, TERM_WHITE, tmp);
2577 * @brief キーマップをprefファイルにダンプする /
2578 * Hack -- append all keymaps to the given file
2579 * @param fname ファイルネーム
2583 static errr keymap_dump(cptr fname)
2585 static cptr mark = "Keymap Dump";
2594 if (rogue_like_commands)
2596 mode = KEYMAP_MODE_ROGUE;
2602 mode = KEYMAP_MODE_ORIG;
2606 /* Build the filename */
2607 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2609 /* File type is "TEXT" */
2610 FILE_TYPE(FILE_TYPE_TEXT);
2612 /* Append to the file */
2613 if (!open_auto_dump(buf, mark)) return -1;
2616 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2619 for (i = 0; i < 256; i++)
2623 /* Loop up the keymap */
2624 act = keymap_act[mode][i];
2626 /* Skip empty keymaps */
2629 /* Encode the key */
2632 ascii_to_text(key, buf);
2634 /* Encode the action */
2635 ascii_to_text(buf, act);
2637 /* Dump the macro */
2638 auto_dump_printf("A:%s\n", buf);
2639 auto_dump_printf("C:%d:%s\n", mode, key);
2651 * @brief マクロを設定するコマンドのメインルーチン /
2652 * Interact with "macros"
2656 * Note that the macro "action" must be defined before the trigger.
2658 * Could use some helpful instructions on this page. XXX XXX XXX
2661 void do_cmd_macros(void)
2673 if (rogue_like_commands)
2675 mode = KEYMAP_MODE_ROGUE;
2681 mode = KEYMAP_MODE_ORIG;
2684 /* File type is "TEXT" */
2685 FILE_TYPE(FILE_TYPE_TEXT);
2692 /* Process requests until done */
2699 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2701 /* Describe that action */
2702 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2704 /* Analyze the current action */
2705 ascii_to_text(buf, macro__buf);
2707 /* Display the current action */
2712 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2714 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2715 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2716 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2717 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2718 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2719 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2720 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2721 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2722 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2723 #endif /* ALLOW_MACROS */
2726 prt(_("コマンド: ", "Command: "), 16, 0);
2732 if (i == ESCAPE) break;
2734 /* Load a 'macro' file */
2740 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2743 prt(_("ファイル: ", "File: "), 18, 0);
2745 /* Default filename */
2746 sprintf(tmp, "%s.prf", player_base);
2748 /* Ask for a file */
2749 if (!askfor(tmp, 80)) continue;
2751 /* Process the given filename */
2752 err = process_pref_file(tmp);
2755 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2760 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2764 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2774 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2777 prt(_("ファイル: ", "File: "), 18, 0);
2779 /* Default filename */
2780 sprintf(tmp, "%s.prf", player_base);
2782 /* Ask for a file */
2783 if (!askfor(tmp, 80)) continue;
2785 /* Dump the macros */
2786 (void)macro_dump(tmp);
2789 msg_print(_("マクロを追加しました。", "Appended macros."));
2798 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2802 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2804 /* Get a macro trigger */
2805 do_cmd_macro_aux(buf);
2807 /* Acquire action */
2808 k = macro_find_exact(buf);
2814 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2820 /* Obtain the action */
2821 strcpy(macro__buf, macro__act[k]);
2823 /* Analyze the current action */
2824 ascii_to_text(buf, macro__buf);
2826 /* Display the current action */
2830 msg_print(_("マクロを確認しました。", "Found a macro."));
2834 /* Create a macro */
2838 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2841 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2843 /* Get a macro trigger */
2844 do_cmd_macro_aux(buf);
2850 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2851 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2854 prt(_("マクロ行動: ", "Action: "), 20, 0);
2856 /* Convert to text */
2857 ascii_to_text(tmp, macro__buf);
2859 /* Get an encoded action */
2860 if (askfor(tmp, 80))
2862 /* Convert to ascii */
2863 text_to_ascii(macro__buf, tmp);
2865 /* Link the macro */
2866 macro_add(buf, macro__buf);
2869 msg_print(_("マクロを追加しました。", "Added a macro."));
2873 /* Remove a macro */
2877 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2880 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2882 /* Get a macro trigger */
2883 do_cmd_macro_aux(buf);
2885 /* Link the macro */
2886 macro_add(buf, buf);
2889 msg_print(_("マクロを削除しました。", "Removed a macro."));
2896 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2899 prt(_("ファイル: ", "File: "), 18, 0);
2901 /* Default filename */
2902 sprintf(tmp, "%s.prf", player_base);
2904 /* Ask for a file */
2905 if (!askfor(tmp, 80)) continue;
2907 /* Dump the macros */
2908 (void)keymap_dump(tmp);
2911 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2914 /* Query a keymap */
2920 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2923 prt(_("押すキー: ", "Keypress: "), 18, 0);
2925 /* Get a keymap trigger */
2926 do_cmd_macro_aux_keymap(buf);
2928 /* Look up the keymap */
2929 act = keymap_act[mode][(byte)(buf[0])];
2935 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2941 /* Obtain the action */
2942 strcpy(macro__buf, act);
2944 /* Analyze the current action */
2945 ascii_to_text(buf, macro__buf);
2947 /* Display the current action */
2951 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2955 /* Create a keymap */
2959 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2962 prt(_("押すキー: ", "Keypress: "), 18, 0);
2964 /* Get a keymap trigger */
2965 do_cmd_macro_aux_keymap(buf);
2971 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2972 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2975 prt(_("行動: ", "Action: "), 20, 0);
2977 /* Convert to text */
2978 ascii_to_text(tmp, macro__buf);
2980 /* Get an encoded action */
2981 if (askfor(tmp, 80))
2983 /* Convert to ascii */
2984 text_to_ascii(macro__buf, tmp);
2986 /* Free old keymap */
2987 string_free(keymap_act[mode][(byte)(buf[0])]);
2989 /* Make new keymap */
2990 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2993 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2997 /* Remove a keymap */
3001 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
3004 prt(_("押すキー: ", "Keypress: "), 18, 0);
3006 /* Get a keymap trigger */
3007 do_cmd_macro_aux_keymap(buf);
3009 /* Free old keymap */
3010 string_free(keymap_act[mode][(byte)(buf[0])]);
3012 /* Make new keymap */
3013 keymap_act[mode][(byte)(buf[0])] = NULL;
3016 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
3019 /* Enter a new action */
3023 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
3029 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
3030 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
3033 prt(_("マクロ行動: ", "Action: "), 20, 0);
3035 /* Hack -- limit the value */
3038 /* Get an encoded action */
3039 if (!askfor(buf, 80)) continue;
3041 /* Extract an action */
3042 text_to_ascii(macro__buf, buf);
3045 #endif /* ALLOW_MACROS */
3054 /* Flush messages */
3063 * @brief キャラクタ色の明暗表現
3065 static cptr lighting_level_str[F_LIT_MAX] =
3080 * @brief キャラクタのビジュアルIDを変更する際の対象指定関数
3081 * @param i 指定対象となるキャラクタコード
3082 * @param num 指定されたビジュアルIDを返す参照ポインタ
3083 * @param max ビジュアルIDの最大数
3084 * @return 指定が実際に行われた場合TRUE、キャンセルされた場合FALSE
3086 static bool cmd_visuals_aux(int i, int *num, int max)
3093 sprintf(str, "%d", *num);
3095 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3098 tmp = strtol(str, NULL, 0);
3099 if (tmp >= 0 && tmp < max)
3102 else if (isupper(i))
3103 *num = (*num + max - 1) % max;
3105 *num = (*num + 1) % max;
3111 * @brief キャラクタの変更メニュー表示
3112 * @param choice_msg 選択メッセージ
3115 static void print_visuals_menu(cptr choice_msg)
3117 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3119 /* Give some choices */
3120 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3122 #ifdef ALLOW_VISUALS
3123 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3124 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3125 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3126 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3127 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3128 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3129 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3130 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3131 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3132 #endif /* ALLOW_VISUALS */
3134 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3137 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3140 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx);
3141 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx);
3142 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level);
3145 * Interact with "visuals"
3147 void do_cmd_visuals(void)
3152 bool need_redraw = FALSE;
3153 const char *empty_symbol = "<< ? >>";
3155 if (use_bigtile) empty_symbol = "<< ?? >>";
3157 /* File type is "TEXT" */
3158 FILE_TYPE(FILE_TYPE_TEXT);
3160 /* Save the screen */
3163 /* Interact until done */
3169 /* Ask for a choice */
3170 print_visuals_menu(NULL);
3176 if (i == ESCAPE) break;
3180 /* Load a 'pref' file */
3183 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3186 prt(_("ファイル: ", "File: "), 17, 0);
3188 /* Default filename */
3189 sprintf(tmp, "%s.prf", player_base);
3192 if (!askfor(tmp, 70)) continue;
3194 /* Process the given filename */
3195 (void)process_pref_file(tmp);
3200 #ifdef ALLOW_VISUALS
3202 /* Dump monster attr/chars */
3205 static cptr mark = "Monster attr/chars";
3208 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3211 prt(_("ファイル: ", "File: "), 17, 0);
3213 /* Default filename */
3214 sprintf(tmp, "%s.prf", player_base);
3216 /* Get a filename */
3217 if (!askfor(tmp, 70)) continue;
3219 /* Build the filename */
3220 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3222 /* Append to the file */
3223 if (!open_auto_dump(buf, mark)) continue;
3226 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3229 for (i = 0; i < max_r_idx; i++)
3231 monster_race *r_ptr = &r_info[i];
3233 /* Skip non-entries */
3234 if (!r_ptr->name) continue;
3236 /* Dump a comment */
3237 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3239 /* Dump the monster attr/char info */
3240 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3241 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3248 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3253 /* Dump object attr/chars */
3256 static cptr mark = "Object attr/chars";
3259 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3262 prt(_("ファイル: ", "File: "), 17, 0);
3264 /* Default filename */
3265 sprintf(tmp, "%s.prf", player_base);
3267 /* Get a filename */
3268 if (!askfor(tmp, 70)) continue;
3270 /* Build the filename */
3271 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3273 /* Append to the file */
3274 if (!open_auto_dump(buf, mark)) continue;
3277 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3280 for (i = 0; i < max_k_idx; i++)
3283 object_kind *k_ptr = &k_info[i];
3285 /* Skip non-entries */
3286 if (!k_ptr->name) continue;
3291 strip_name(o_name, i);
3297 /* Prepare dummy object */
3298 object_prep(&forge, i);
3300 /* Get un-shuffled flavor name */
3301 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3304 /* Dump a comment */
3305 auto_dump_printf("# %s\n", o_name);
3307 /* Dump the object attr/char info */
3308 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3309 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3316 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3321 /* Dump feature attr/chars */
3324 static cptr mark = "Feature attr/chars";
3327 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3330 prt(_("ファイル: ", "File: "), 17, 0);
3332 /* Default filename */
3333 sprintf(tmp, "%s.prf", player_base);
3335 /* Get a filename */
3336 if (!askfor(tmp, 70)) continue;
3338 /* Build the filename */
3339 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3341 /* Append to the file */
3342 if (!open_auto_dump(buf, mark)) continue;
3345 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3348 for (i = 0; i < max_f_idx; i++)
3350 feature_type *f_ptr = &f_info[i];
3352 /* Skip non-entries */
3353 if (!f_ptr->name) continue;
3355 /* Skip mimiccing features */
3356 if (f_ptr->mimic != i) continue;
3358 /* Dump a comment */
3359 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3361 /* Dump the feature attr/char info */
3362 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3363 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3364 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3365 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3372 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3377 /* Modify monster attr/chars (numeric operation) */
3380 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3383 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3385 /* Hack -- query until done */
3388 monster_race *r_ptr = &r_info[r];
3392 byte da = r_ptr->d_attr;
3393 byte dc = r_ptr->d_char;
3394 byte ca = r_ptr->x_attr;
3395 byte cc = r_ptr->x_char;
3397 /* Label the object */
3398 Term_putstr(5, 17, -1, TERM_WHITE,
3399 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3401 /* Label the Default values */
3402 Term_putstr(10, 19, -1, TERM_WHITE,
3403 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3405 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3406 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3408 /* Label the Current values */
3409 Term_putstr(10, 20, -1, TERM_WHITE,
3410 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3412 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3413 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3416 Term_putstr(0, 22, -1, TERM_WHITE,
3417 _("コマンド (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): "));
3423 if (i == ESCAPE) break;
3425 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3426 else if (isupper(i)) c = 'a' + i - 'A';
3436 if (!cmd_visuals_aux(i, &r, max_r_idx))
3442 while (!r_info[r].name);
3446 t = (int)r_ptr->x_attr;
3447 (void)cmd_visuals_aux(i, &t, 256);
3448 r_ptr->x_attr = (byte)t;
3452 t = (int)r_ptr->x_char;
3453 (void)cmd_visuals_aux(i, &t, 256);
3454 r_ptr->x_char = (byte)t;
3458 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3462 print_visuals_menu(choice_msg);
3470 /* Modify object attr/chars (numeric operation) */
3473 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3475 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3477 /* Hack -- query until done */
3480 object_kind *k_ptr = &k_info[k];
3484 byte da = k_ptr->d_attr;
3485 byte dc = k_ptr->d_char;
3486 byte ca = k_ptr->x_attr;
3487 byte cc = k_ptr->x_char;
3489 /* Label the object */
3490 Term_putstr(5, 17, -1, TERM_WHITE,
3491 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3492 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3494 /* Label the Default values */
3495 Term_putstr(10, 19, -1, TERM_WHITE,
3496 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3498 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3499 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3501 /* Label the Current values */
3502 Term_putstr(10, 20, -1, TERM_WHITE,
3503 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3505 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3506 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3509 Term_putstr(0, 22, -1, TERM_WHITE,
3510 _("コマンド (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): "));
3516 if (i == ESCAPE) break;
3518 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3519 else if (isupper(i)) c = 'a' + i - 'A';
3529 if (!cmd_visuals_aux(i, &k, max_k_idx))
3535 while (!k_info[k].name);
3539 t = (int)k_ptr->x_attr;
3540 (void)cmd_visuals_aux(i, &t, 256);
3541 k_ptr->x_attr = (byte)t;
3545 t = (int)k_ptr->x_char;
3546 (void)cmd_visuals_aux(i, &t, 256);
3547 k_ptr->x_char = (byte)t;
3551 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3555 print_visuals_menu(choice_msg);
3563 /* Modify feature attr/chars (numeric operation) */
3566 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3568 static int lighting_level = F_LIT_STANDARD;
3569 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3571 /* Hack -- query until done */
3574 feature_type *f_ptr = &f_info[f];
3578 byte da = f_ptr->d_attr[lighting_level];
3579 byte dc = f_ptr->d_char[lighting_level];
3580 byte ca = f_ptr->x_attr[lighting_level];
3581 byte cc = f_ptr->x_char[lighting_level];
3583 /* Label the object */
3585 Term_putstr(5, 17, -1, TERM_WHITE,
3586 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3587 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3589 /* Label the Default values */
3590 Term_putstr(10, 19, -1, TERM_WHITE,
3591 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3593 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3594 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3596 /* Label the Current values */
3598 Term_putstr(10, 20, -1, TERM_WHITE,
3599 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3601 Term_putstr(10, 20, -1, TERM_WHITE,
3602 format("Current attr/char = %3d / %3d", ca, cc));
3605 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3606 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3610 Term_putstr(0, 22, -1, TERM_WHITE,
3611 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3613 Term_putstr(0, 22, -1, TERM_WHITE,
3614 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3621 if (i == ESCAPE) break;
3623 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3624 else if (isupper(i)) c = 'a' + i - 'A';
3634 if (!cmd_visuals_aux(i, &f, max_f_idx))
3640 while (!f_info[f].name || (f_info[f].mimic != f));
3644 t = (int)f_ptr->x_attr[lighting_level];
3645 (void)cmd_visuals_aux(i, &t, 256);
3646 f_ptr->x_attr[lighting_level] = (byte)t;
3650 t = (int)f_ptr->x_char[lighting_level];
3651 (void)cmd_visuals_aux(i, &t, 256);
3652 f_ptr->x_char[lighting_level] = (byte)t;
3656 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3659 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3663 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3667 print_visuals_menu(choice_msg);
3675 /* Modify monster attr/chars (visual mode) */
3677 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3680 /* Modify object attr/chars (visual mode) */
3682 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3685 /* Modify feature attr/chars (visual mode) */
3688 int lighting_level = F_LIT_STANDARD;
3689 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3693 #endif /* ALLOW_VISUALS */
3702 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3706 /* Unknown option */
3712 /* Flush messages */
3716 /* Restore the screen */
3719 if (need_redraw) do_cmd_redraw();
3724 * Interact with "colors"
3726 void do_cmd_colors(void)
3735 /* File type is "TEXT" */
3736 FILE_TYPE(FILE_TYPE_TEXT);
3739 /* Save the screen */
3743 /* Interact until done */
3749 /* Ask for a choice */
3750 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3752 /* Give some choices */
3753 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3756 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3757 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3761 prt(_("コマンド: ", "Command: "), 8, 0);
3766 if (i == ESCAPE) break;
3768 /* Load a 'pref' file */
3772 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3775 prt(_("ファイル: ", "File: "), 10, 0);
3778 sprintf(tmp, "%s.prf", player_base);
3781 if (!askfor(tmp, 70)) continue;
3783 /* Process the given filename */
3784 (void)process_pref_file(tmp);
3786 /* Mega-Hack -- react to changes */
3787 Term_xtra(TERM_XTRA_REACT, 0);
3789 /* Mega-Hack -- redraw */
3798 static cptr mark = "Colors";
3801 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3804 prt(_("ファイル: ", "File: "), 10, 0);
3806 /* Default filename */
3807 sprintf(tmp, "%s.prf", player_base);
3809 /* Get a filename */
3810 if (!askfor(tmp, 70)) continue;
3812 /* Build the filename */
3813 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3815 /* Append to the file */
3816 if (!open_auto_dump(buf, mark)) continue;
3819 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3822 for (i = 0; i < 256; i++)
3824 int kv = angband_color_table[i][0];
3825 int rv = angband_color_table[i][1];
3826 int gv = angband_color_table[i][2];
3827 int bv = angband_color_table[i][3];
3829 cptr name = _("未知", "unknown");
3831 /* Skip non-entries */
3832 if (!kv && !rv && !gv && !bv) continue;
3834 /* Extract the color name */
3835 if (i < 16) name = color_names[i];
3837 /* Dump a comment */
3838 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3840 /* Dump the monster attr/char info */
3841 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3849 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3858 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3860 /* Hack -- query until done */
3869 /* Exhibit the normal colors */
3870 for (j = 0; j < 16; j++)
3872 /* Exhibit this color */
3873 Term_putstr(j*4, 20, -1, a, "###");
3875 /* Exhibit all colors */
3876 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3879 /* Describe the color */
3880 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3882 /* Describe the color */
3883 Term_putstr(5, 10, -1, TERM_WHITE,
3884 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3886 /* Label the Current values */
3887 Term_putstr(5, 12, -1, TERM_WHITE,
3888 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3889 angband_color_table[a][0],
3890 angband_color_table[a][1],
3891 angband_color_table[a][2],
3892 angband_color_table[a][3]));
3895 Term_putstr(0, 14, -1, TERM_WHITE,
3896 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3903 if (i == ESCAPE) break;
3906 if (i == 'n') a = (byte)(a + 1);
3907 if (i == 'N') a = (byte)(a - 1);
3908 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3909 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3910 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3911 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3912 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3913 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3914 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3915 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3917 /* Hack -- react to changes */
3918 Term_xtra(TERM_XTRA_REACT, 0);
3920 /* Hack -- redraw */
3927 /* Unknown option */
3933 /* Flush messages */
3938 /* Restore the screen */
3944 * Note something in the message recall
3946 void do_cmd_note(void)
3954 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3956 /* Ignore empty notes */
3957 if (!buf[0] || (buf[0] == ' ')) return;
3959 /* Add the note to the message recall */
3960 msg_format(_("メモ: %s", "Note: %s"), buf);
3965 * Mention the current version
3967 void do_cmd_version(void)
3971 #if FAKE_VER_EXTRA > 0
3972 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d.%d", "You are playing Hengband %d.%d.%d.%d."),
3973 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA);
3975 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3976 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3983 * Array of feeling strings
3985 static cptr do_cmd_feeling_text[11] =
3987 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3988 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3989 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3990 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3991 _("とても悪い予感がする...", "You have a very bad feeling..."),
3992 _("悪い予感がする...", "You have a bad feeling..."),
3993 _("何か緊張する。", "You feel nervous."),
3994 _("少し不運な気がする...", "You feel your luck is turning..."),
3995 _("この場所は好きになれない。", "You don't like the look of this place."),
3996 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3997 _("なんて退屈なところだ...", "What a boring place...")
4000 static cptr do_cmd_feeling_text_combat[11] =
4002 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
4003 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
4004 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
4005 _("この階はとても危険なようだ。", "This level looks very dangerous."),
4006 _("とても悪い予感がする...", "You have a very bad feeling..."),
4007 _("悪い予感がする...", "You have a bad feeling..."),
4008 _("何か緊張する。", "You feel nervous."),
4009 _("少し不運な気がする...", "You feel your luck is turning..."),
4010 _("この場所は好きになれない。", "You don't like the look of this place."),
4011 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
4012 _("なんて退屈なところだ...", "What a boring place...")
4015 static cptr do_cmd_feeling_text_lucky[11] =
4017 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
4018 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
4019 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
4020 _("素晴らしい感じがする...", "You have an excellent feeling..."),
4021 _("とても良い感じがする...", "You have a very good feeling..."),
4022 _("良い感じがする...", "You have a good feeling..."),
4023 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
4024 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
4025 _("見た感じ悪くはない...", "You like the look of this place..."),
4026 _("全然駄目ということはないが...", "This level can't be all bad..."),
4027 _("なんて退屈なところだ...", "What a boring place...")
4032 * Note that "feeling" is set to zero unless some time has passed.
4033 * Note that this is done when the level is GENERATED, not entered.
4035 void do_cmd_feeling(void)
4037 /* No useful feeling in quests */
4038 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4040 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
4044 /* No useful feeling in town */
4045 else if (p_ptr->town_num && !dun_level)
4047 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
4049 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
4054 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
4059 /* No useful feeling in the wilderness */
4060 else if (!dun_level)
4062 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
4066 /* Display the feeling */
4067 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4068 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
4069 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
4070 inventory[INVEN_BOW].name1 == ART_CRIMSON)
4071 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
4073 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4079 * Description of each monster group.
4081 static cptr monster_group_text[] =
4084 "ユニーク", /* "Uniques" */
4085 "乗馬可能なモンスター", /* "Riding" */
4086 "賞金首", /* "Wanted */
4087 "アンバーの王族", /* "Ambertite" */
4116 /* "古代ドラゴン/ワイアーム", */
4177 /* "Ancient Dragon/Wyrm", */
4186 "Multi-Headed Reptile",
4191 "Reptile/Amphibian",
4192 "Spider/Scorpion/Tick",
4194 /* "Major Demon", */
4211 * Symbols of monsters in each group. Note the "Uniques" group
4212 * is handled differently.
4214 static cptr monster_group_char[] =
4271 "!$&()+./=>?[\\]`{|~",
4281 * hook function to sort monsters by level
4283 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4285 u16b *who = (u16b*)(u);
4290 monster_race *r_ptr1 = &r_info[w1];
4291 monster_race *r_ptr2 = &r_info[w2];
4296 if (r_ptr2->level > r_ptr1->level) return TRUE;
4297 if (r_ptr1->level > r_ptr2->level) return FALSE;
4299 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4300 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4305 * Build a list of monster indexes in the given group. Return the number
4306 * of monsters in the group.
4308 * mode & 0x01 : check for non-empty group
4309 * mode & 0x02 : visual operation only
4311 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
4316 /* Get a list of x_char in this group */
4317 cptr group_char = monster_group_char[grp_cur];
4319 /* XXX Hack -- Check if this is the "Uniques" group */
4320 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4322 /* XXX Hack -- Check if this is the "Riding" group */
4323 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4325 /* XXX Hack -- Check if this is the "Wanted" group */
4326 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4328 /* XXX Hack -- Check if this is the "Amberite" group */
4329 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4332 /* Check every race */
4333 for (i = 0; i < max_r_idx; i++)
4335 /* Access the race */
4336 monster_race *r_ptr = &r_info[i];
4338 /* Skip empty race */
4339 if (!r_ptr->name) continue ;
4341 /* Require known monsters */
4342 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4346 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4349 else if (grp_riding)
4351 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4354 else if (grp_wanted)
4356 bool wanted = FALSE;
4358 for (j = 0; j < MAX_KUBI; j++)
4360 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4361 (p_ptr->today_mon && p_ptr->today_mon == i))
4367 if (!wanted) continue;
4370 else if (grp_amberite)
4372 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4377 /* Check for race in the group */
4378 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4382 mon_idx[mon_cnt++] = i;
4384 /* XXX Hack -- Just checking for non-empty group */
4385 if (mode & 0x01) break;
4388 /* Terminate the list */
4389 mon_idx[mon_cnt] = -1;
4391 /* Select the sort method */
4392 ang_sort_comp = ang_sort_comp_monster_level;
4393 ang_sort_swap = ang_sort_swap_hook;
4395 /* Sort by monster level */
4396 ang_sort(mon_idx, &dummy_why, mon_cnt);
4398 /* Return the number of races */
4404 * Description of each monster group.
4406 static cptr object_group_text[] =
4409 "キノコ", /* "Mushrooms" */
4410 "薬", /* "Potions" */
4411 "油つぼ", /* "Flasks" */
4412 "巻物", /* "Scrolls" */
4414 "アミュレット", /* "Amulets" */
4415 "笛", /* "Whistle" */
4416 "光源", /* "Lanterns" */
4417 "魔法棒", /* "Wands" */
4420 "カード", /* "Cards" */
4431 "刀剣類", /* "Swords" */
4432 "鈍器", /* "Blunt Weapons" */
4433 "長柄武器", /* "Polearms" */
4434 "採掘道具", /* "Diggers" */
4435 "飛び道具", /* "Bows" */
4439 "軽装鎧", /* "Soft Armor" */
4440 "重装鎧", /* "Hard Armor" */
4441 "ドラゴン鎧", /* "Dragon Armor" */
4442 "盾", /* "Shields" */
4443 "クローク", /* "Cloaks" */
4444 "籠手", /* "Gloves" */
4445 "ヘルメット", /* "Helms" */
4447 "ブーツ", /* "Boots" */
4500 * TVALs of items in each group
4502 static byte object_group_tval[] =
4543 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4551 * Build a list of object indexes in the given group. Return the number
4552 * of objects in the group.
4554 * mode & 0x01 : check for non-empty group
4555 * mode & 0x02 : visual operation only
4557 static int collect_objects(int grp_cur, int object_idx[], byte mode)
4559 int i, j, k, object_cnt = 0;
4561 /* Get a list of x_char in this group */
4562 byte group_tval = object_group_tval[grp_cur];
4564 /* Check every object */
4565 for (i = 0; i < max_k_idx; i++)
4567 /* Access the object */
4568 object_kind *k_ptr = &k_info[i];
4570 /* Skip empty objects */
4571 if (!k_ptr->name) continue;
4575 /* Any objects will be displayed */
4581 /* Skip non-flavoured objects */
4582 if (!k_ptr->flavor) continue;
4584 /* Require objects ever seen */
4585 if (!k_ptr->aware) continue;
4588 /* Skip items with no distribution (special artifacts) */
4589 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4593 /* Check for objects in the group */
4594 if (TV_LIFE_BOOK == group_tval)
4596 /* Hack -- All spell books */
4597 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4599 /* Add the object */
4600 object_idx[object_cnt++] = i;
4604 else if (k_ptr->tval == group_tval)
4606 /* Add the object */
4607 object_idx[object_cnt++] = i;
4611 /* XXX Hack -- Just checking for non-empty group */
4612 if (mode & 0x01) break;
4615 /* Terminate the list */
4616 object_idx[object_cnt] = -1;
4618 /* Return the number of objects */
4624 * Description of each feature group.
4626 static cptr feature_group_text[] =
4634 * Build a list of feature indexes in the given group. Return the number
4635 * of features in the group.
4637 * mode & 0x01 : check for non-empty group
4639 static int collect_features(int grp_cur, int *feat_idx, byte mode)
4641 int i, feat_cnt = 0;
4643 /* Unused; There is a single group. */
4646 /* Check every feature */
4647 for (i = 0; i < max_f_idx; i++)
4649 /* Access the index */
4650 feature_type *f_ptr = &f_info[i];
4652 /* Skip empty index */
4653 if (!f_ptr->name) continue;
4655 /* Skip mimiccing features */
4656 if (f_ptr->mimic != i) continue;
4659 feat_idx[feat_cnt++] = i;
4661 /* XXX Hack -- Just checking for non-empty group */
4662 if (mode & 0x01) break;
4665 /* Terminate the list */
4666 feat_idx[feat_cnt] = -1;
4668 /* Return the number of races */
4675 * Build a list of monster indexes in the given group. Return the number
4676 * of monsters in the group.
4678 static int collect_artifacts(int grp_cur, int object_idx[])
4680 int i, object_cnt = 0;
4682 /* Get a list of x_char in this group */
4683 byte group_tval = object_group_tval[grp_cur];
4685 /* Check every object */
4686 for (i = 0; i < max_a_idx; i++)
4688 /* Access the artifact */
4689 artifact_type *a_ptr = &a_info[i];
4691 /* Skip empty artifacts */
4692 if (!a_ptr->name) continue;
4694 /* Skip "uncreated" artifacts */
4695 if (!a_ptr->cur_num) continue;
4697 /* Check for race in the group */
4698 if (a_ptr->tval == group_tval)
4701 object_idx[object_cnt++] = i;
4705 /* Terminate the list */
4706 object_idx[object_cnt] = 0;
4708 /* Return the number of races */
4715 * Encode the screen colors
4717 static char hack[17] = "dwsorgbuDWvyRGBU";
4721 * Hack -- load a screen dump from a file
4723 void do_cmd_load_screen(void)
4738 Term_get_size(&wid, &hgt);
4740 /* Build the filename */
4741 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4743 /* Append to the file */
4744 fff = my_fopen(buf, "r");
4748 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4754 /* Save the screen */
4757 /* Clear the screen */
4761 /* Load the screen */
4762 for (y = 0; okay; y++)
4764 /* Get a line of data including control code */
4765 if (!fgets(buf, 1024, fff)) okay = FALSE;
4767 /* Get the blank line */
4768 if (buf[0] == '\n' || buf[0] == '\0') break;
4770 /* Ignore too large screen image */
4771 if (y >= hgt) continue;
4774 for (x = 0; x < wid - 1; x++)
4777 if (buf[x] == '\n' || buf[x] == '\0') break;
4779 /* Put the attr/char */
4780 Term_draw(x, y, TERM_WHITE, buf[x]);
4784 /* Dump the screen */
4785 for (y = 0; okay; y++)
4787 /* Get a line of data including control code */
4788 if (!fgets(buf, 1024, fff)) okay = FALSE;
4790 /* Get the blank line */
4791 if (buf[0] == '\n' || buf[0] == '\0') break;
4793 /* Ignore too large screen image */
4794 if (y >= hgt) continue;
4797 for (x = 0; x < wid - 1; x++)
4800 if (buf[x] == '\n' || buf[x] == '\0') break;
4802 /* Get the attr/char */
4803 (void)(Term_what(x, y, &a, &c));
4805 /* Look up the attr */
4806 for (i = 0; i < 16; i++)
4808 /* Use attr matches */
4809 if (hack[i] == buf[x]) a = i;
4812 /* Put the attr/char */
4813 Term_draw(x, y, a, c);
4823 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4829 /* Restore the screen */
4836 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4837 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4840 #define IM_FLAG_STR _("*", "* ")
4841 #define HAS_FLAG_STR _("+", "+ ")
4842 #define NO_FLAG_STR _("・", ". ")
4844 #define print_im_or_res_flag(IM, RES) \
4846 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4847 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4850 #define print_flag(TR) \
4852 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4856 /* XTRA HACK RESLIST */
4857 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
4859 char o_name[MAX_NLEN];
4860 u32b flgs[TR_FLAG_SIZE];
4862 if (!o_ptr->k_idx) return;
4863 if (o_ptr->tval != tval) return;
4865 /* Identified items only */
4866 if (!object_is_known(o_ptr)) return;
4869 * HACK:Ring of Lordly protection and Dragon equipment
4870 * have random resistances.
4872 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4873 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4874 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4875 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4876 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4877 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4878 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4879 || object_is_artifact(o_ptr))
4882 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4884 while (o_name[i] && (i < 26))
4887 if (iskanji(o_name[i])) i++;
4896 o_name[i] = ' '; i++;
4901 fprintf(fff, "%s %s", where, o_name);
4903 if (!(o_ptr->ident & (IDENT_MENTAL)))
4905 fputs(_("-------不明--------------- -------不明---------\n",
4906 "-------unknown------------ -------unknown------\n"), fff);
4910 object_flags_known(o_ptr, flgs);
4912 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4913 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4914 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4915 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4916 print_flag(TR_RES_POIS);
4917 print_flag(TR_RES_LITE);
4918 print_flag(TR_RES_DARK);
4919 print_flag(TR_RES_SHARDS);
4920 print_flag(TR_RES_SOUND);
4921 print_flag(TR_RES_NETHER);
4922 print_flag(TR_RES_NEXUS);
4923 print_flag(TR_RES_CHAOS);
4924 print_flag(TR_RES_DISEN);
4928 print_flag(TR_RES_BLIND);
4929 print_flag(TR_RES_FEAR);
4930 print_flag(TR_RES_CONF);
4931 print_flag(TR_FREE_ACT);
4932 print_flag(TR_SEE_INVIS);
4933 print_flag(TR_HOLD_EXP);
4934 print_flag(TR_TELEPATHY);
4935 print_flag(TR_SLOW_DIGEST);
4936 print_flag(TR_REGEN);
4937 print_flag(TR_LEVITATION);
4945 fprintf(fff, "%s\n", inven_res_label);
4951 * Display *ID* ed weapons/armors's resistances
4953 static void do_cmd_knowledge_inven(void)
4957 char file_name[1024];
4967 /* Open a new file */
4968 fff = my_fopen_temp(file_name, 1024);
4971 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4975 fprintf(fff, "%s\n", inven_res_label);
4977 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4981 for (; j < 9; j++) fputc('\n', fff);
4983 fprintf(fff, "%s\n", inven_res_label);
4985 strcpy(where, _("装", "E "));
4986 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4988 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4990 strcpy(where, _("持", "I "));
4991 for (i = 0; i < INVEN_PACK; i++)
4993 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4996 st_ptr = &town[1].store[STORE_HOME];
4997 strcpy(where, _("家", "H "));
4998 for (i = 0; i < st_ptr->stock_num; i++)
5000 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5004 /* Close the file */
5007 /* Display the file contents */
5008 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
5010 /* Remove the file */
5015 void do_cmd_save_screen_html_aux(char *filename, int message)
5019 byte a = 0, old_a = 0;
5033 cptr html_head[] = {
5034 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5038 cptr html_foot[] = {
5040 "</body>\n</html>\n",
5046 Term_get_size(&wid, &hgt);
5048 /* File type is "TEXT" */
5049 FILE_TYPE(FILE_TYPE_TEXT);
5051 /* Append to the file */
5052 fff = my_fopen(filename, "w");
5057 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
5064 /* Save the screen */
5068 /* Build the filename */
5069 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5070 tmpfff = my_fopen(buf, "r");
5072 for (i = 0; html_head[i]; i++)
5073 fputs(html_head[i], fff);
5077 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5079 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5083 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5085 fprintf(fff, "%s\n", buf);
5090 /* Dump the screen */
5091 for (y = 0; y < hgt; y++)
5098 for (x = 0; x < wid - 1; x++)
5102 /* Get the attr/char */
5103 (void)(Term_what(x, y, &a, &c));
5107 case '&': cc = "&"; break;
5108 case '<': cc = "<"; break;
5109 case '>': cc = ">"; break;
5111 case 0x1f: c = '.'; break;
5112 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5117 if ((y == 0 && x == 0) || a != old_a) {
5118 rv = angband_color_table[a][1];
5119 gv = angband_color_table[a][2];
5120 bv = angband_color_table[a][3];
5121 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5122 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5126 fprintf(fff, "%s", cc);
5128 fprintf(fff, "%c", c);
5131 fprintf(fff, "</font>");
5134 for (i = 0; html_foot[i]; i++)
5135 fputs(html_foot[i], fff);
5140 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5142 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5146 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5148 fprintf(fff, "%s\n", buf);
5162 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5166 /* Restore the screen */
5172 * Hack -- save a screen dump to a file
5174 static void do_cmd_save_screen_html(void)
5176 char buf[1024], tmp[256] = "screen.html";
5178 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5181 /* Build the filename */
5182 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5186 do_cmd_save_screen_html_aux(buf, 1);
5191 * Redefinable "save_screen" action
5193 void (*screendump_aux)(void) = NULL;
5197 * Hack -- save a screen dump to a file
5199 void do_cmd_save_screen(void)
5201 bool old_use_graphics = use_graphics;
5202 bool html_dump = FALSE;
5206 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5210 if (c == 'Y' || c == 'y')
5212 else if (c == 'H' || c == 'h')
5224 Term_get_size(&wid, &hgt);
5226 if (old_use_graphics)
5228 use_graphics = FALSE;
5231 /* Redraw everything */
5232 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5234 /* Hack -- update */
5240 do_cmd_save_screen_html();
5244 /* Do we use a special screendump function ? */
5245 else if (screendump_aux)
5247 /* Dump the screen to a graphics file */
5248 (*screendump_aux)();
5250 else /* Dump the screen as text */
5261 /* Build the filename */
5262 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5264 /* File type is "TEXT" */
5265 FILE_TYPE(FILE_TYPE_TEXT);
5267 /* Append to the file */
5268 fff = my_fopen(buf, "w");
5273 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5279 /* Save the screen */
5283 /* Dump the screen */
5284 for (y = 0; y < hgt; y++)
5287 for (x = 0; x < wid - 1; x++)
5289 /* Get the attr/char */
5290 (void)(Term_what(x, y, &a, &c));
5300 fprintf(fff, "%s\n", buf);
5307 /* Dump the screen */
5308 for (y = 0; y < hgt; y++)
5311 for (x = 0; x < wid - 1; x++)
5313 /* Get the attr/char */
5314 (void)(Term_what(x, y, &a, &c));
5317 buf[x] = hack[a&0x0F];
5324 fprintf(fff, "%s\n", buf);
5335 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5338 /* Restore the screen */
5342 if (old_use_graphics)
5344 use_graphics = TRUE;
5347 /* Redraw everything */
5348 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5350 /* Hack -- update */
5357 * Sorting hook -- Comp function -- see below
5359 * We use "u" to point to array of monster indexes,
5360 * and "v" to select the type of sorting to perform on "u".
5362 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5364 u16b *who = (u16b*)(u);
5366 u16b *why = (u16b*)(v);
5373 /* Sort by total kills */
5376 /* Extract total kills */
5377 z1 = a_info[w1].tval;
5378 z2 = a_info[w2].tval;
5380 /* Compare total kills */
5381 if (z1 < z2) return (TRUE);
5382 if (z1 > z2) return (FALSE);
5386 /* Sort by monster level */
5389 /* Extract levels */
5390 z1 = a_info[w1].sval;
5391 z2 = a_info[w2].sval;
5393 /* Compare levels */
5394 if (z1 < z2) return (TRUE);
5395 if (z1 > z2) return (FALSE);
5399 /* Sort by monster experience */
5402 /* Extract experience */
5403 z1 = a_info[w1].level;
5404 z2 = a_info[w2].level;
5406 /* Compare experience */
5407 if (z1 < z2) return (TRUE);
5408 if (z1 > z2) return (FALSE);
5412 /* Compare indexes */
5418 * Sorting hook -- Swap function -- see below
5420 * We use "u" to point to array of monster indexes,
5421 * and "v" to select the type of sorting to perform.
5423 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5425 u16b *who = (u16b*)(u);
5440 * Check the status of "artifacts"
5442 static void do_cmd_knowledge_artifacts(void)
5444 int i, k, z, x, y, n = 0;
5450 char file_name[1024];
5452 char base_name[MAX_NLEN];
5456 /* Open a new file */
5457 fff = my_fopen_temp(file_name, 1024);
5460 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5465 /* Allocate the "who" array */
5466 C_MAKE(who, max_a_idx, s16b);
5468 /* Allocate the "okay" array */
5469 C_MAKE(okay, max_a_idx, bool);
5471 /* Scan the artifacts */
5472 for (k = 0; k < max_a_idx; k++)
5474 artifact_type *a_ptr = &a_info[k];
5479 /* Skip "empty" artifacts */
5480 if (!a_ptr->name) continue;
5482 /* Skip "uncreated" artifacts */
5483 if (!a_ptr->cur_num) continue;
5489 /* Check the dungeon */
5490 for (y = 0; y < cur_hgt; y++)
5492 for (x = 0; x < cur_wid; x++)
5494 cave_type *c_ptr = &cave[y][x];
5496 s16b this_o_idx, next_o_idx = 0;
5498 /* Scan all objects in the grid */
5499 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5503 /* Acquire object */
5504 o_ptr = &o_list[this_o_idx];
5506 /* Acquire next object */
5507 next_o_idx = o_ptr->next_o_idx;
5509 /* Ignore non-artifacts */
5510 if (!object_is_fixed_artifact(o_ptr)) continue;
5512 /* Ignore known items */
5513 if (object_is_known(o_ptr)) continue;
5515 /* Note the artifact */
5516 okay[o_ptr->name1] = FALSE;
5521 /* Check the inventory and equipment */
5522 for (i = 0; i < INVEN_TOTAL; i++)
5524 object_type *o_ptr = &inventory[i];
5526 /* Ignore non-objects */
5527 if (!o_ptr->k_idx) continue;
5529 /* Ignore non-artifacts */
5530 if (!object_is_fixed_artifact(o_ptr)) continue;
5532 /* Ignore known items */
5533 if (object_is_known(o_ptr)) continue;
5535 /* Note the artifact */
5536 okay[o_ptr->name1] = FALSE;
5539 for (k = 0; k < max_a_idx; k++)
5541 if (okay[k]) who[n++] = k;
5544 /* Select the sort method */
5545 ang_sort_comp = ang_sort_art_comp;
5546 ang_sort_swap = ang_sort_art_swap;
5548 /* Sort the array by dungeon depth of monsters */
5549 ang_sort(who, &why, n);
5551 /* Scan the artifacts */
5552 for (k = 0; k < n; k++)
5554 artifact_type *a_ptr = &a_info[who[k]];
5557 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5559 /* Obtain the base object type */
5560 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5568 /* Get local object */
5571 /* Create fake object */
5572 object_prep(q_ptr, z);
5574 /* Make it an artifact */
5575 q_ptr->name1 = (byte)who[k];
5577 /* Display as if known */
5578 q_ptr->ident |= IDENT_STORE;
5580 /* Describe the artifact */
5581 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5584 /* Hack -- Build the artifact name */
5585 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5588 /* Free the "who" array */
5589 C_KILL(who, max_a_idx, s16b);
5591 /* Free the "okay" array */
5592 C_KILL(okay, max_a_idx, bool);
5594 /* Close the file */
5597 /* Display the file contents */
5598 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5600 /* Remove the file */
5606 * Display known uniques
5607 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5609 static void do_cmd_knowledge_uniques(void)
5617 char file_name[1024];
5620 int n_alive_surface = 0;
5621 int n_alive_over100 = 0;
5622 int n_alive_total = 0;
5625 for (i = 0; i < 10; i++) n_alive[i] = 0;
5627 /* Open a new file */
5628 fff = my_fopen_temp(file_name, 1024);
5632 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5637 /* Allocate the "who" array */
5638 C_MAKE(who, max_r_idx, s16b);
5640 /* Scan the monsters */
5641 for (i = 1; i < max_r_idx; i++)
5643 monster_race *r_ptr = &r_info[i];
5646 if (!r_ptr->name) continue;
5648 /* Require unique monsters */
5649 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5651 /* Only display "known" uniques */
5652 if (!cheat_know && !r_ptr->r_sights) continue;
5654 /* Only print rarity <= 100 uniques */
5655 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5657 /* Only "alive" uniques */
5658 if (r_ptr->max_num == 0) continue;
5662 lev = (r_ptr->level - 1) / 10;
5666 if (max_lev < lev) max_lev = lev;
5668 else n_alive_over100++;
5670 else n_alive_surface++;
5672 /* Collect "appropriate" monsters */
5676 /* Select the sort method */
5677 ang_sort_comp = ang_sort_comp_hook;
5678 ang_sort_swap = ang_sort_swap_hook;
5680 /* Sort the array by dungeon depth of monsters */
5681 ang_sort(who, &why, n);
5683 if (n_alive_surface)
5685 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5686 n_alive_total += n_alive_surface;
5688 for (i = 0; i <= max_lev; i++)
5690 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5691 n_alive_total += n_alive[i];
5693 if (n_alive_over100)
5695 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5696 n_alive_total += n_alive_over100;
5701 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5702 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5706 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5709 /* Scan the monster races */
5710 for (k = 0; k < n; k++)
5712 monster_race *r_ptr = &r_info[who[k]];
5714 /* Print a message */
5715 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, r_ptr->level);
5718 /* Free the "who" array */
5719 C_KILL(who, max_r_idx, s16b);
5721 /* Close the file */
5724 /* Display the file contents */
5725 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5727 /* Remove the file */
5733 * Display weapon-exp
5735 static void do_cmd_knowledge_weapon_exp(void)
5737 int i, j, num, weapon_exp;
5741 char file_name[1024];
5744 /* Open a new file */
5745 fff = my_fopen_temp(file_name, 1024);
5747 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5752 for (i = 0; i < 5; i++)
5754 for (num = 0; num < 64; num++)
5756 for (j = 0; j < max_k_idx; j++)
5758 object_kind *k_ptr = &k_info[j];
5760 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5762 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON || k_ptr->sval == SV_HARP)) continue;
5764 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5766 fprintf(fff, "%-25s ", tmp);
5767 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5768 else fprintf(fff, " ");
5769 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5770 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5778 /* Close the file */
5781 /* Display the file contents */
5782 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5784 /* Remove the file */
5790 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5794 static void do_cmd_knowledge_spell_exp(void)
5796 int i = 0, spell_exp, exp_level;
5799 const magic_type *s_ptr;
5801 char file_name[1024];
5803 /* Open a new file */
5804 fff = my_fopen_temp(file_name, 1024);
5806 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5811 if (p_ptr->realm1 != REALM_NONE)
5813 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5814 for (i = 0; i < 32; i++)
5816 if (!is_magic(p_ptr->realm1))
5818 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5822 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5824 if (s_ptr->slevel >= 99) continue;
5825 spell_exp = p_ptr->spell_exp[i];
5826 exp_level = spell_exp_level(spell_exp);
5827 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5828 if (p_ptr->realm1 == REALM_HISSATSU)
5829 fprintf(fff, "[--]");
5832 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5833 else fprintf(fff, " ");
5834 fprintf(fff, "%s", exp_level_str[exp_level]);
5836 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5841 if (p_ptr->realm2 != REALM_NONE)
5843 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5844 for (i = 0; i < 32; i++)
5846 if (!is_magic(p_ptr->realm1))
5848 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5852 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5854 if (s_ptr->slevel >= 99) continue;
5856 spell_exp = p_ptr->spell_exp[i + 32];
5857 exp_level = spell_exp_level(spell_exp);
5858 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5859 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5860 else fprintf(fff, " ");
5861 fprintf(fff, "%s", exp_level_str[exp_level]);
5862 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5867 /* Close the file */
5870 /* Display the file contents */
5871 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5873 /* Remove the file */
5879 * @brief スキル情報を表示するコマンドのメインルーチン /
5883 static void do_cmd_knowledge_skill_exp(void)
5885 int i = 0, skill_exp;
5889 char file_name[1024];
5890 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5891 _("二刀流 ", "Dual Wielding "),
5892 _("乗馬 ", "Riding ")};
5894 /* Open a new file */
5895 fff = my_fopen_temp(file_name, 1024);
5897 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5902 for (i = 0; i < 3; i++)
5904 skill_exp = p_ptr->skill_exp[i];
5905 fprintf(fff, "%-20s ", skill_name[i]);
5906 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5907 else fprintf(fff, " ");
5908 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5909 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5913 /* Close the file */
5916 /* Display the file contents */
5917 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5919 /* Remove the file */
5925 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5926 * @param Name 変換したい文字列の参照ポインタ
5929 void plural_aux(char *Name)
5931 int NameLen = strlen(Name);
5933 if (my_strstr(Name, "Disembodied hand"))
5935 strcpy(Name, "Disembodied hands that strangled people");
5937 else if (my_strstr(Name, "Colour out of space"))
5939 strcpy(Name, "Colours out of space");
5941 else if (my_strstr(Name, "stairway to hell"))
5943 strcpy(Name, "stairways to hell");
5945 else if (my_strstr(Name, "Dweller on the threshold"))
5947 strcpy(Name, "Dwellers on the threshold");
5949 else if (my_strstr(Name, " of "))
5951 cptr aider = my_strstr(Name, " of ");
5962 if (dummy[i-1] == 's')
5964 strcpy(&(dummy[i]), "es");
5969 strcpy(&(dummy[i]), "s");
5972 strcpy(&(dummy[i+1]), aider);
5973 strcpy(Name, dummy);
5975 else if (my_strstr(Name, "coins"))
5978 strcpy(dummy, "piles of ");
5979 strcat(dummy, Name);
5980 strcpy(Name, dummy);
5983 else if (my_strstr(Name, "Manes"))
5987 else if (streq(&(Name[NameLen - 2]), "ey"))
5989 strcpy(&(Name[NameLen - 2]), "eys");
5991 else if (Name[NameLen - 1] == 'y')
5993 strcpy(&(Name[NameLen - 1]), "ies");
5995 else if (streq(&(Name[NameLen - 4]), "ouse"))
5997 strcpy(&(Name[NameLen - 4]), "ice");
5999 else if (streq(&(Name[NameLen - 2]), "us"))
6001 strcpy(&(Name[NameLen - 2]), "i");
6003 else if (streq(&(Name[NameLen - 6]), "kelman"))
6005 strcpy(&(Name[NameLen - 6]), "kelmen");
6007 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6009 strcpy(&(Name[NameLen - 8]), "wordsmen");
6011 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6013 strcpy(&(Name[NameLen - 7]), "oodsmen");
6015 else if (streq(&(Name[NameLen - 7]), "eastman"))
6017 strcpy(&(Name[NameLen - 7]), "eastmen");
6019 else if (streq(&(Name[NameLen - 8]), "izardman"))
6021 strcpy(&(Name[NameLen - 8]), "izardmen");
6023 else if (streq(&(Name[NameLen - 5]), "geist"))
6025 strcpy(&(Name[NameLen - 5]), "geister");
6027 else if (streq(&(Name[NameLen - 2]), "ex"))
6029 strcpy(&(Name[NameLen - 2]), "ices");
6031 else if (streq(&(Name[NameLen - 2]), "lf"))
6033 strcpy(&(Name[NameLen - 2]), "lves");
6035 else if (suffix(Name, "ch") ||
6036 suffix(Name, "sh") ||
6037 suffix(Name, "nx") ||
6038 suffix(Name, "s") ||
6041 strcpy(&(Name[NameLen]), "es");
6045 strcpy(&(Name[NameLen]), "s");
6050 * @brief 現在のペットを表示するコマンドのメインルーチン /
6051 * Display current pets
6054 static void do_cmd_knowledge_pets(void)
6058 monster_type *m_ptr;
6061 int show_upkeep = 0;
6062 char file_name[1024];
6065 /* Open a new file */
6066 fff = my_fopen_temp(file_name, 1024);
6068 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6073 /* Process the monsters (backwards) */
6074 for (i = m_max - 1; i >= 1; i--)
6076 /* Access the monster */
6079 /* Ignore "dead" monsters */
6080 if (!m_ptr->r_idx) continue;
6082 /* Calculate "upkeep" for pets */
6086 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6087 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6091 show_upkeep = calculate_upkeep();
6093 fprintf(fff, "----------------------------------------------\n");
6095 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6096 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6098 fprintf(fff, " Total: %d pet%s.\n",
6099 t_friends, (t_friends == 1 ? "" : "s"));
6100 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6105 /* Close the file */
6108 /* Display the file contents */
6109 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6111 /* Remove the file */
6117 * @brief 現在のペットを表示するコマンドのメインルーチン /
6120 * @note the player ghosts are ignored. XXX XXX XXX
6122 static void do_cmd_knowledge_kill_count(void)
6130 char file_name[1024];
6135 /* Open a new file */
6136 fff = my_fopen_temp(file_name, 1024);
6139 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6144 /* Allocate the "who" array */
6145 C_MAKE(who, max_r_idx, s16b);
6148 /* Monsters slain */
6151 for (kk = 1; kk < max_r_idx; kk++)
6153 monster_race *r_ptr = &r_info[kk];
6155 if (r_ptr->flags1 & (RF1_UNIQUE))
6157 bool dead = (r_ptr->max_num == 0);
6166 s16b This = r_ptr->r_pkills;
6176 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6179 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6181 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6187 /* Scan the monsters */
6188 for (i = 1; i < max_r_idx; i++)
6190 monster_race *r_ptr = &r_info[i];
6192 /* Use that monster */
6193 if (r_ptr->name) who[n++] = i;
6196 /* Select the sort method */
6197 ang_sort_comp = ang_sort_comp_hook;
6198 ang_sort_swap = ang_sort_swap_hook;
6200 /* Sort the array by dungeon depth of monsters */
6201 ang_sort(who, &why, n);
6203 /* Scan the monster races */
6204 for (k = 0; k < n; k++)
6206 monster_race *r_ptr = &r_info[who[k]];
6208 if (r_ptr->flags1 & (RF1_UNIQUE))
6210 bool dead = (r_ptr->max_num == 0);
6214 /* Print a message */
6215 fprintf(fff, " %s\n",
6216 (r_name + r_ptr->name));
6222 s16b This = r_ptr->r_pkills;
6227 /* p,tは人と数える by ita */
6228 if (my_strchr("pt", r_ptr->d_char))
6229 fprintf(fff, " %3d 人の %s\n", This, r_name + r_ptr->name);
6231 fprintf(fff, " %3d 体の %s\n", This, r_name + r_ptr->name);
6235 if (my_strstr(r_name + r_ptr->name, "coins"))
6237 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6241 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6247 strcpy(ToPlural, (r_name + r_ptr->name));
6248 plural_aux(ToPlural);
6249 fprintf(fff, " %d %s\n", This, ToPlural);
6259 fprintf(fff,"----------------------------------------------\n");
6261 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6263 fprintf(fff," Total: %lu creature%s killed.\n",
6264 (unsigned long int)Total, (Total == 1 ? "" : "s"));
6268 /* Free the "who" array */
6269 C_KILL(who, max_r_idx, s16b);
6271 /* Close the file */
6274 /* Display the file contents */
6275 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6277 /* Remove the file */
6283 * @brief モンスター情報リスト中のグループを表示する /
6284 * Display the object groups.
6288 * @param per_page リストの表示行
6289 * @param grp_idx グループのID配列
6290 * @param group_text グループ名の文字列配列
6291 * @param grp_cur 現在の選択ID
6292 * @param grp_top 現在の選択リスト最上部ID
6295 static void display_group_list(int col, int row, int wid, int per_page,
6296 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6300 /* Display lines until done */
6301 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6303 /* Get the group index */
6304 int grp = grp_idx[grp_top + i];
6306 /* Choose a color */
6307 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6309 /* Erase the entire line */
6310 Term_erase(col, row + i, wid);
6312 /* Display the group label */
6313 c_put_str(attr, group_text[grp], row + i, col);
6319 * Move the cursor in a browser window
6321 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
6322 int *list_cur, int list_cnt)
6327 int list = *list_cur;
6329 /* Extract direction */
6332 /* Hack -- scroll up full screen */
6337 /* Hack -- scroll down full screen */
6342 d = get_keymap_dir(ch);
6347 /* Diagonals - hack */
6348 if ((ddx[d] > 0) && ddy[d])
6354 Term_get_size(&wid, &hgt);
6356 browser_rows = hgt - 8;
6358 /* Browse group list */
6363 /* Move up or down */
6364 grp += ddy[d] * (browser_rows - 1);
6367 if (grp >= grp_cnt) grp = grp_cnt - 1;
6368 if (grp < 0) grp = 0;
6369 if (grp != old_grp) list = 0;
6372 /* Browse sub-list list */
6375 /* Move up or down */
6376 list += ddy[d] * browser_rows;
6379 if (list >= list_cnt) list = list_cnt - 1;
6380 if (list < 0) list = 0;
6392 if (col < 0) col = 0;
6393 if (col > 1) col = 1;
6400 /* Browse group list */
6405 /* Move up or down */
6409 if (grp >= grp_cnt) grp = grp_cnt - 1;
6410 if (grp < 0) grp = 0;
6411 if (grp != old_grp) list = 0;
6414 /* Browse sub-list list */
6417 /* Move up or down */
6421 if (list >= list_cnt) list = list_cnt - 1;
6422 if (list < 0) list = 0;
6433 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
6437 /* Clear the display lines */
6438 for (i = 0; i < height; i++)
6440 Term_erase(col, row + i, width);
6443 /* Bigtile mode uses double width */
6444 if (use_bigtile) width /= 2;
6446 /* Display lines until done */
6447 for (i = 0; i < height; i++)
6449 /* Display columns until done */
6450 for (j = 0; j < width; j++)
6458 /* Bigtile mode uses double width */
6459 if (use_bigtile) x += j;
6464 /* Ignore illegal characters */
6465 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6466 (!use_graphics && ic > 0x7f))
6472 /* Force correct code for both ASCII character and tile */
6473 if (c & 0x80) a |= 0x80;
6475 /* Display symbol */
6476 Term_queue_bigchar(x, y, a, c, 0, 0);
6483 * Place the cursor at the collect position for visual mode
6485 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
6487 int i = (a & 0x7f) - attr_top;
6488 int j = c - char_left;
6493 /* Bigtile mode uses double width */
6494 if (use_bigtile) x += j;
6496 /* Place the cursor */
6502 * Clipboard variables for copy&paste in visual mode
6504 static byte attr_idx = 0;
6505 static byte char_idx = 0;
6507 /* Hack -- for feature lighting */
6508 static byte attr_idx_feat[F_LIT_MAX];
6509 static byte char_idx_feat[F_LIT_MAX];
6512 * Do visual mode command -- Change symbols
6514 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6515 int height, int width,
6516 byte *attr_top_ptr, byte *char_left_ptr,
6517 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6519 static byte attr_old = 0, char_old = 0;
6524 if (*visual_list_ptr)
6527 *cur_attr_ptr = attr_old;
6528 *cur_char_ptr = char_old;
6529 *visual_list_ptr = FALSE;
6537 if (*visual_list_ptr)
6540 *visual_list_ptr = FALSE;
6541 *need_redraw = TRUE;
6549 if (!*visual_list_ptr)
6551 *visual_list_ptr = TRUE;
6553 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6554 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6556 attr_old = *cur_attr_ptr;
6557 char_old = *cur_char_ptr;
6568 /* Set the visual */
6569 attr_idx = *cur_attr_ptr;
6570 char_idx = *cur_char_ptr;
6572 /* Hack -- for feature lighting */
6573 for (i = 0; i < F_LIT_MAX; i++)
6575 attr_idx_feat[i] = 0;
6576 char_idx_feat[i] = 0;
6583 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6586 *cur_attr_ptr = attr_idx;
6587 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6588 if (!*visual_list_ptr) *need_redraw = TRUE;
6594 *cur_char_ptr = char_idx;
6595 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6596 if (!*visual_list_ptr) *need_redraw = TRUE;
6602 if (*visual_list_ptr)
6605 int d = get_keymap_dir(ch);
6606 byte a = (*cur_attr_ptr & 0x7f);
6607 byte c = *cur_char_ptr;
6609 if (use_bigtile) eff_width = width / 2;
6610 else eff_width = width;
6612 /* Restrict direction */
6613 if ((a == 0) && (ddy[d] < 0)) d = 0;
6614 if ((c == 0) && (ddx[d] < 0)) d = 0;
6615 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6616 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6621 /* Force correct code for both ASCII character and tile */
6622 if (c & 0x80) a |= 0x80;
6624 /* Set the visual */
6629 /* Move the frame */
6630 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6631 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6632 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6633 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6639 /* Visual mode command is not used */
6645 * Display the monsters in a group.
6647 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6648 int mon_cur, int mon_top, bool visual_only)
6652 /* Display lines until done */
6653 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6657 /* Get the race index */
6658 int r_idx = mon_idx[mon_top + i] ;
6660 /* Access the race */
6661 monster_race *r_ptr = &r_info[r_idx];
6663 /* Choose a color */
6664 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6666 /* Display the name */
6667 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6669 /* Hack -- visual_list mode */
6672 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6674 if (p_ptr->wizard || visual_only)
6676 c_prt(attr, format("%d", r_idx), row + i, 62);
6679 /* Erase chars before overwritten by the race letter */
6680 Term_erase(69, row + i, 255);
6682 /* Display symbol */
6683 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6688 if (!(r_ptr->flags1 & RF1_UNIQUE))
6689 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6691 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6692 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6696 /* Clear remaining lines */
6697 for (; i < per_page; i++)
6699 Term_erase(col, row + i, 255);
6705 * Display known monsters.
6707 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx)
6710 int grp_cur, grp_top, old_grp_cur;
6711 int mon_cur, mon_top;
6712 int grp_cnt, grp_idx[100];
6720 bool visual_list = FALSE;
6721 byte attr_top = 0, char_left = 0;
6729 Term_get_size(&wid, &hgt);
6731 browser_rows = hgt - 8;
6733 /* Allocate the "mon_idx" array */
6734 C_MAKE(mon_idx, max_r_idx, s16b);
6739 if (direct_r_idx < 0)
6741 mode = visual_only ? 0x03 : 0x01;
6743 /* Check every group */
6744 for (i = 0; monster_group_text[i] != NULL; i++)
6746 /* Measure the label */
6747 len = strlen(monster_group_text[i]);
6749 /* Save the maximum length */
6750 if (len > max) max = len;
6752 /* See if any monsters are known */
6753 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6755 /* Build a list of groups with known monsters */
6756 grp_idx[grp_cnt++] = i;
6764 mon_idx[0] = direct_r_idx;
6767 /* Terminate the list */
6770 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6771 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6774 /* Terminate the list */
6775 grp_idx[grp_cnt] = -1;
6778 grp_cur = grp_top = 0;
6779 mon_cur = mon_top = 0;
6784 mode = visual_only ? 0x02 : 0x00;
6789 monster_race *r_ptr;
6796 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6797 if (direct_r_idx < 0) prt("グループ", 4, 0);
6798 prt("名前", 4, max + 3);
6799 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6801 if (!visual_only) prt("殺害数", 4, 72);
6803 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6804 if (direct_r_idx < 0) prt("Group", 4, 0);
6805 prt("Name", 4, max + 3);
6806 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6808 if (!visual_only) prt("Kills", 4, 73);
6811 for (i = 0; i < 78; i++)
6813 Term_putch(i, 5, TERM_WHITE, '=');
6816 if (direct_r_idx < 0)
6818 for (i = 0; i < browser_rows; i++)
6820 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6827 if (direct_r_idx < 0)
6829 /* Scroll group list */
6830 if (grp_cur < grp_top) grp_top = grp_cur;
6831 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6833 /* Display a list of monster groups */
6834 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6836 if (old_grp_cur != grp_cur)
6838 old_grp_cur = grp_cur;
6840 /* Get a list of monsters in the current group */
6841 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6844 /* Scroll monster list */
6845 while (mon_cur < mon_top)
6846 mon_top = MAX(0, mon_top - browser_rows/2);
6847 while (mon_cur >= mon_top + browser_rows)
6848 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6853 /* Display a list of monsters in the current group */
6854 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6860 /* Display a monster name */
6861 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6863 /* Display visual list below first monster */
6864 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6869 prt(format("<方向>%s%s%s, ESC",
6870 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6871 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6872 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6875 prt(format("<dir>%s%s%s, ESC",
6876 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6877 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6878 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6882 /* Get the current monster */
6883 r_ptr = &r_info[mon_idx[mon_cur]];
6887 /* Mega Hack -- track this monster race */
6888 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6890 /* Hack -- handle stuff */
6896 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6900 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6904 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6909 /* Do visual mode command if needed */
6910 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))
6912 if (direct_r_idx >= 0)
6937 /* Recall on screen */
6938 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6940 screen_roff(mon_idx[mon_cur], 0);
6951 /* Move the cursor */
6952 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6959 /* Free the "mon_idx" array */
6960 C_KILL(mon_idx, max_r_idx, s16b);
6965 * Display the objects in a group.
6967 static void display_object_list(int col, int row, int per_page, int object_idx[],
6968 int object_cur, int object_top, bool visual_only)
6972 /* Display lines until done */
6973 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6977 object_kind *flavor_k_ptr;
6979 /* Get the object index */
6980 int k_idx = object_idx[object_top + i];
6982 /* Access the object */
6983 object_kind *k_ptr = &k_info[k_idx];
6985 /* Choose a color */
6986 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6987 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6990 if (!visual_only && k_ptr->flavor)
6992 /* Appearance of this object is shuffled */
6993 flavor_k_ptr = &k_info[k_ptr->flavor];
6997 /* Appearance of this object is very normal */
6998 flavor_k_ptr = k_ptr;
7003 attr = ((i + object_top == object_cur) ? cursor : attr);
7005 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
7008 strip_name(o_name, k_idx);
7013 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
7016 /* Display the name */
7017 c_prt(attr, o_name, row + i, col);
7019 /* Hack -- visual_list mode */
7022 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);
7024 if (p_ptr->wizard || visual_only)
7026 c_prt(attr, format("%d", k_idx), row + i, 70);
7029 a = flavor_k_ptr->x_attr;
7030 c = flavor_k_ptr->x_char;
7032 /* Display symbol */
7033 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
7036 /* Clear remaining lines */
7037 for (; i < per_page; i++)
7039 Term_erase(col, row + i, 255);
7044 * Describe fake object
7046 static void desc_obj_fake(int k_idx)
7049 object_type object_type_body;
7051 /* Get local object */
7052 o_ptr = &object_type_body;
7054 /* Wipe the object */
7057 /* Create the artifact */
7058 object_prep(o_ptr, k_idx);
7060 /* It's fully know */
7061 o_ptr->ident |= IDENT_KNOWN;
7063 /* Track the object */
7064 /* object_actual_track(o_ptr); */
7066 /* Hack - mark as fake */
7067 /* term_obj_real = FALSE; */
7069 /* Hack -- Handle stuff */
7072 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
7074 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7082 * Display known objects
7084 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx)
7087 int grp_cur, grp_top, old_grp_cur;
7088 int object_old, object_cur, object_top;
7089 int grp_cnt, grp_idx[100];
7097 bool visual_list = FALSE;
7098 byte attr_top = 0, char_left = 0;
7106 Term_get_size(&wid, &hgt);
7108 browser_rows = hgt - 8;
7110 /* Allocate the "object_idx" array */
7111 C_MAKE(object_idx, max_k_idx, int);
7116 if (direct_k_idx < 0)
7118 mode = visual_only ? 0x03 : 0x01;
7120 /* Check every group */
7121 for (i = 0; object_group_text[i] != NULL; i++)
7123 /* Measure the label */
7124 len = strlen(object_group_text[i]);
7126 /* Save the maximum length */
7127 if (len > max) max = len;
7129 /* See if any monsters are known */
7130 if (collect_objects(i, object_idx, mode))
7132 /* Build a list of groups with known monsters */
7133 grp_idx[grp_cnt++] = i;
7142 object_kind *k_ptr = &k_info[direct_k_idx];
7143 object_kind *flavor_k_ptr;
7145 if (!visual_only && k_ptr->flavor)
7147 /* Appearance of this object is shuffled */
7148 flavor_k_ptr = &k_info[k_ptr->flavor];
7152 /* Appearance of this object is very normal */
7153 flavor_k_ptr = k_ptr;
7156 object_idx[0] = direct_k_idx;
7157 object_old = direct_k_idx;
7160 /* Terminate the list */
7163 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7164 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7167 /* Terminate the list */
7168 grp_idx[grp_cnt] = -1;
7171 grp_cur = grp_top = 0;
7172 object_cur = object_top = 0;
7177 mode = visual_only ? 0x02 : 0x00;
7182 object_kind *k_ptr, *flavor_k_ptr;
7189 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7190 if (direct_k_idx < 0) prt("グループ", 4, 0);
7191 prt("名前", 4, max + 3);
7192 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7195 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7196 if (direct_k_idx < 0) prt("Group", 4, 0);
7197 prt("Name", 4, max + 3);
7198 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7202 for (i = 0; i < 78; i++)
7204 Term_putch(i, 5, TERM_WHITE, '=');
7207 if (direct_k_idx < 0)
7209 for (i = 0; i < browser_rows; i++)
7211 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7218 if (direct_k_idx < 0)
7220 /* Scroll group list */
7221 if (grp_cur < grp_top) grp_top = grp_cur;
7222 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7224 /* Display a list of object groups */
7225 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7227 if (old_grp_cur != grp_cur)
7229 old_grp_cur = grp_cur;
7231 /* Get a list of objects in the current group */
7232 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7235 /* Scroll object list */
7236 while (object_cur < object_top)
7237 object_top = MAX(0, object_top - browser_rows/2);
7238 while (object_cur >= object_top + browser_rows)
7239 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7244 /* Display a list of objects in the current group */
7245 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7249 object_top = object_cur;
7251 /* Display a list of objects in the current group */
7252 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7254 /* Display visual list below first object */
7255 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7258 /* Get the current object */
7259 k_ptr = &k_info[object_idx[object_cur]];
7261 if (!visual_only && k_ptr->flavor)
7263 /* Appearance of this object is shuffled */
7264 flavor_k_ptr = &k_info[k_ptr->flavor];
7268 /* Appearance of this object is very normal */
7269 flavor_k_ptr = k_ptr;
7274 prt(format("<方向>%s%s%s, ESC",
7275 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7276 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7277 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7280 prt(format("<dir>%s%s%s, ESC",
7281 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7282 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7283 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7289 /* Mega Hack -- track this object */
7290 if (object_cnt) object_kind_track(object_idx[object_cur]);
7292 /* The "current" object changed */
7293 if (object_old != object_idx[object_cur])
7295 /* Hack -- handle stuff */
7298 /* Remember the "current" object */
7299 object_old = object_idx[object_cur];
7305 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7309 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7313 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7318 /* Do visual mode command if needed */
7319 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))
7321 if (direct_k_idx >= 0)
7346 /* Recall on screen */
7347 if (!visual_list && !visual_only && (grp_cnt > 0))
7349 desc_obj_fake(object_idx[object_cur]);
7357 /* Move the cursor */
7358 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7364 /* Free the "object_idx" array */
7365 C_KILL(object_idx, max_k_idx, int);
7370 * Display the features in a group.
7372 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
7373 int feat_cur, int feat_top, bool visual_only, int lighting_level)
7375 int lit_col[F_LIT_MAX], i, j;
7376 int f_idx_col = use_bigtile ? 62 : 64;
7378 /* Correct columns 1 and 4 */
7379 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7380 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7381 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7383 /* Display lines until done */
7384 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7389 int f_idx = feat_idx[feat_top + i];
7391 /* Access the index */
7392 feature_type *f_ptr = &f_info[f_idx];
7394 int row_i = row + i;
7396 /* Choose a color */
7397 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7399 /* Display the name */
7400 c_prt(attr, f_name + f_ptr->name, row_i, col);
7402 /* Hack -- visual_list mode */
7405 /* Display lighting level */
7406 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7408 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));
7410 if (p_ptr->wizard || visual_only)
7412 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7415 /* Display symbol */
7416 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);
7418 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7419 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7421 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7423 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7425 /* Mega-hack -- Use non-standard colour */
7426 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7428 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7432 /* Clear remaining lines */
7433 for (; i < per_page; i++)
7435 Term_erase(col, row + i, 255);
7441 * Interact with feature visuals.
7443 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level)
7446 int grp_cur, grp_top, old_grp_cur;
7447 int feat_cur, feat_top;
7448 int grp_cnt, grp_idx[100];
7456 bool visual_list = FALSE;
7457 byte attr_top = 0, char_left = 0;
7462 byte attr_old[F_LIT_MAX];
7463 byte char_old[F_LIT_MAX];
7464 byte *cur_attr_ptr, *cur_char_ptr;
7466 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7467 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7470 Term_get_size(&wid, &hgt);
7472 browser_rows = hgt - 8;
7474 /* Allocate the "feat_idx" array */
7475 C_MAKE(feat_idx, max_f_idx, int);
7480 if (direct_f_idx < 0)
7482 /* Check every group */
7483 for (i = 0; feature_group_text[i] != NULL; i++)
7485 /* Measure the label */
7486 len = strlen(feature_group_text[i]);
7488 /* Save the maximum length */
7489 if (len > max) max = len;
7491 /* See if any features are known */
7492 if (collect_features(i, feat_idx, 0x01))
7494 /* Build a list of groups with known features */
7495 grp_idx[grp_cnt++] = i;
7503 feature_type *f_ptr = &f_info[direct_f_idx];
7505 feat_idx[0] = direct_f_idx;
7508 /* Terminate the list */
7511 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7512 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7514 for (i = 0; i < F_LIT_MAX; i++)
7516 attr_old[i] = f_ptr->x_attr[i];
7517 char_old[i] = f_ptr->x_char[i];
7521 /* Terminate the list */
7522 grp_idx[grp_cnt] = -1;
7525 grp_cur = grp_top = 0;
7526 feat_cur = feat_top = 0;
7534 feature_type *f_ptr;
7541 prt("表示 - 地形", 2, 0);
7542 if (direct_f_idx < 0) prt("グループ", 4, 0);
7543 prt("名前", 4, max + 3);
7546 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7547 prt("文字 ( l/ d)", 4, 66);
7551 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7552 prt("文字 (l/d)", 4, 68);
7555 prt("Visuals - features", 2, 0);
7556 if (direct_f_idx < 0) prt("Group", 4, 0);
7557 prt("Name", 4, max + 3);
7560 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7561 prt("Sym ( l/ d)", 4, 67);
7565 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7566 prt("Sym (l/d)", 4, 69);
7570 for (i = 0; i < 78; i++)
7572 Term_putch(i, 5, TERM_WHITE, '=');
7575 if (direct_f_idx < 0)
7577 for (i = 0; i < browser_rows; i++)
7579 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7586 if (direct_f_idx < 0)
7588 /* Scroll group list */
7589 if (grp_cur < grp_top) grp_top = grp_cur;
7590 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7592 /* Display a list of feature groups */
7593 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7595 if (old_grp_cur != grp_cur)
7597 old_grp_cur = grp_cur;
7599 /* Get a list of features in the current group */
7600 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7603 /* Scroll feature list */
7604 while (feat_cur < feat_top)
7605 feat_top = MAX(0, feat_top - browser_rows/2);
7606 while (feat_cur >= feat_top + browser_rows)
7607 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7612 /* Display a list of features in the current group */
7613 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7617 feat_top = feat_cur;
7619 /* Display a list of features in the current group */
7620 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7622 /* Display visual list below first object */
7623 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7628 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7629 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7630 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7633 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7634 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7635 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7639 /* Get the current feature */
7640 f_ptr = &f_info[feat_idx[feat_cur]];
7641 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7642 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7646 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7650 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7654 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7659 if (visual_list && ((ch == 'A') || (ch == 'a')))
7661 int prev_lighting_level = *lighting_level;
7665 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7666 else (*lighting_level)--;
7670 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7671 else (*lighting_level)++;
7674 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7675 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7677 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7678 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7683 else if ((ch == 'D') || (ch == 'd'))
7685 byte prev_x_attr = f_ptr->x_attr[*lighting_level];
7686 byte prev_x_char = f_ptr->x_char[*lighting_level];
7688 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7692 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7693 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7695 if (prev_x_char != f_ptr->x_char[*lighting_level])
7696 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7698 else *need_redraw = TRUE;
7703 /* Do visual mode command if needed */
7704 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))
7708 /* Restore previous visual settings */
7710 for (i = 0; i < F_LIT_MAX; i++)
7712 f_ptr->x_attr[i] = attr_old[i];
7713 f_ptr->x_char[i] = char_old[i];
7720 if (direct_f_idx >= 0) flag = TRUE;
7721 else *lighting_level = F_LIT_STANDARD;
7724 /* Preserve current visual settings */
7727 for (i = 0; i < F_LIT_MAX; i++)
7729 attr_old[i] = f_ptr->x_attr[i];
7730 char_old[i] = f_ptr->x_char[i];
7732 *lighting_level = F_LIT_STANDARD;
7739 for (i = 0; i < F_LIT_MAX; i++)
7741 attr_idx_feat[i] = f_ptr->x_attr[i];
7742 char_idx_feat[i] = f_ptr->x_char[i];
7751 /* Allow TERM_DARK text */
7752 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7754 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7755 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7773 /* Move the cursor */
7774 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7780 /* Free the "feat_idx" array */
7781 C_KILL(feat_idx, max_f_idx, int);
7786 * List wanted monsters
7788 static void do_cmd_knowledge_kubi(void)
7793 char file_name[1024];
7796 /* Open a new file */
7797 fff = my_fopen_temp(file_name, 1024);
7799 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7806 bool listed = FALSE;
7809 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7811 fprintf(fff, "賞金首リスト\n");
7813 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7815 fprintf(fff, "List of wanted monsters\n");
7817 fprintf(fff, "----------------------------------------------\n");
7819 for (i = 0; i < MAX_KUBI; i++)
7821 if (kubi_r_idx[i] <= 10000)
7823 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7831 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7835 /* Close the file */
7838 /* Display the file contents */
7839 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7841 /* Remove the file */
7846 * List virtues & status
7848 static void do_cmd_knowledge_virtues(void)
7852 char file_name[1024];
7855 /* Open a new file */
7856 fff = my_fopen_temp(file_name, 1024);
7858 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7865 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7869 /* Close the file */
7872 /* Display the file contents */
7873 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7875 /* Remove the file */
7883 static void do_cmd_knowledge_dungeon(void)
7887 char file_name[1024];
7891 /* Open a new file */
7892 fff = my_fopen_temp(file_name, 1024);
7894 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7901 for (i = 1; i < max_d_idx; i++)
7905 if (!d_info[i].maxdepth) continue;
7906 if (!max_dlv[i]) continue;
7907 if (d_info[i].final_guardian)
7909 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7911 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7913 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
7917 /* Close the file */
7920 /* Display the file contents */
7921 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7923 /* Remove the file */
7928 * List virtues & status
7931 static void do_cmd_knowledge_stat(void)
7935 char file_name[1024];
7938 /* Open a new file */
7939 fff = my_fopen_temp(file_name, 1024);
7941 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7948 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7949 (2 * p_ptr->hitdie +
7950 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7953 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7954 else fprintf(fff, "現在の体力ランク : ???\n\n");
7955 fprintf(fff, "能力の最大値\n\n");
7957 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7958 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7959 fprintf(fff, "Limits of maximum stats\n\n");
7961 for (v_nr = 0; v_nr < 6; v_nr++)
7963 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);
7964 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7970 /* Close the file */
7973 /* Display the file contents */
7974 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7976 /* Remove the file */
7982 * Print all active quests
7984 static void do_cmd_knowledge_quests_current(FILE *fff)
7987 char rand_tmp_str[120] = "\0";
7989 monster_race *r_ptr;
7991 int rand_level = 100;
7994 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7996 for (i = 1; i < max_quests; i++)
7998 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
7999 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
8000 (quest[i].status == QUEST_STATUS_COMPLETED))
8002 /* Set the quest number temporary */
8003 int old_quest = p_ptr->inside_quest;
8006 /* Clear the text */
8007 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8008 quest_text_line = 0;
8010 p_ptr->inside_quest = i;
8012 /* Get the quest text */
8013 init_flags = INIT_SHOW_TEXT;
8015 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8017 /* Reset the old quest number */
8018 p_ptr->inside_quest = old_quest;
8020 /* No info from "silent" quests */
8021 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8025 if (quest[i].type != QUEST_TYPE_RANDOM)
8027 char note[80] = "\0";
8029 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
8031 switch (quest[i].type)
8033 case QUEST_TYPE_KILL_LEVEL:
8034 case QUEST_TYPE_KILL_ANY_LEVEL:
8035 r_ptr = &r_info[quest[i].r_idx];
8036 strcpy(name, r_name + r_ptr->name);
8037 if (quest[i].max_num > 1)
8040 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
8041 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8044 sprintf(note," - kill %d %s, have killed %d.",
8045 quest[i].max_num, name, quest[i].cur_num);
8049 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
8052 case QUEST_TYPE_FIND_ARTIFACT:
8055 artifact_type *a_ptr = &a_info[quest[i].k_idx];
8057 object_type *q_ptr = &forge;
8058 int k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
8059 object_prep(q_ptr, k_idx);
8060 q_ptr->name1 = quest[i].k_idx;
8061 q_ptr->ident = IDENT_STORE;
8062 object_desc(name, q_ptr, OD_NAME_ONLY);
8064 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
8066 case QUEST_TYPE_FIND_EXIT:
8067 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8070 case QUEST_TYPE_KILL_NUMBER:
8072 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8073 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8075 sprintf(note," - Kill %d monsters, have killed %d.",
8076 quest[i].max_num, quest[i].cur_num);
8080 case QUEST_TYPE_KILL_ALL:
8081 case QUEST_TYPE_TOWER:
8082 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8087 /* Print the quest info */
8089 sprintf(tmp_str, " %s (危険度:%d階相当)%s\n",
8090 quest[i].name, quest[i].level, note);
8092 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8093 quest[i].name, quest[i].level, note);
8096 fputs(tmp_str, fff);
8098 if (quest[i].status == QUEST_STATUS_COMPLETED)
8100 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8101 fputs(tmp_str, fff);
8107 while (quest_text[j][0] && j < 10)
8109 fprintf(fff, " %s\n", quest_text[j]);
8114 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8117 rand_level = quest[i].level;
8119 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8121 /* Print the quest info */
8122 r_ptr = &r_info[quest[i].r_idx];
8123 strcpy(name, r_name + r_ptr->name);
8125 if (quest[i].max_num > 1)
8128 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8129 quest[i].name, quest[i].level,
8130 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8134 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8135 quest[i].name, quest[i].level,
8136 quest[i].max_num, name, quest[i].cur_num);
8142 sprintf(rand_tmp_str," %s (%d 階) - %sを倒す。\n",
8143 quest[i].name, quest[i].level, name);
8145 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8146 quest[i].name, quest[i].level, name);
8154 /* Print the current random quest */
8155 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8157 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8161 static bool do_cmd_knowledge_quests_aux(FILE *fff, int q_idx)
8164 char playtime_str[16];
8165 quest_type* const q_ptr = &quest[q_idx];
8167 if (is_fixed_quest_idx(q_idx))
8169 /* Set the quest number temporary */
8170 int old_quest = p_ptr->inside_quest;
8172 p_ptr->inside_quest = q_idx;
8175 init_flags = INIT_NAME_ONLY;
8177 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8179 /* Reset the old quest number */
8180 p_ptr->inside_quest = old_quest;
8182 /* No info from "silent" quests */
8183 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8186 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8187 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8189 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8191 /* Print the quest info */
8192 if (q_ptr->complev == 0)
8195 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8196 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8197 r_name+r_info[q_ptr->r_idx].name,
8198 q_ptr->level, playtime_str);
8203 _(" %-35s (%3d階) - レベル%2d - %s\n",
8204 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8205 r_name+r_info[q_ptr->r_idx].name,
8213 /* Print the quest info */
8215 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8216 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8217 q_ptr->name, q_ptr->level, q_ptr->complev, playtime_str);
8220 fputs(tmp_str, fff);
8226 * Print all finished quests
8228 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8233 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8234 for (i = 1; i < max_quests; i++)
8236 int q_idx = quest_num[i];
8237 quest_type* const q_ptr = &quest[q_idx];
8239 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8240 do_cmd_knowledge_quests_aux(fff, q_idx))
8245 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8250 * Print all failed quests
8252 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8257 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8258 for (i = 1; i < max_quests; i++)
8260 int q_idx = quest_num[i];
8261 quest_type* const q_ptr = &quest[q_idx];
8263 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8264 do_cmd_knowledge_quests_aux(fff, q_idx))
8269 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8274 * Print all random quests
8276 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8282 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8283 for (i = 1; i < max_quests; i++)
8285 /* No info from "silent" quests */
8286 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8288 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8292 /* Print the quest info */
8294 sprintf(tmp_str, " %s (%d階, %s)\n",
8295 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8297 sprintf(tmp_str, " %s (%d, %s)\n",
8298 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8300 fputs(tmp_str, fff);
8303 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8307 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8309 int *q_num = (int *)u;
8310 quest_type *qa = &quest[q_num[a]];
8311 quest_type *qb = &quest[q_num[b]];
8316 return (qa->comptime <= qb->comptime);
8319 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8321 int *q_num = (int *)u;
8328 q_num[a] = q_num[b];
8334 * Print quest status of all active quests
8336 static void do_cmd_knowledge_quests(void)
8339 char file_name[1024];
8340 int *quest_num, dummy, i;
8342 /* Open a new file */
8343 fff = my_fopen_temp(file_name, 1024);
8346 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8351 /* Allocate Memory */
8352 C_MAKE(quest_num, max_quests, int);
8354 /* Sort by compete level */
8355 for (i = 1; i < max_quests; i++) quest_num[i] = i;
8356 ang_sort_comp = ang_sort_comp_quest_num;
8357 ang_sort_swap = ang_sort_swap_quest_num;
8358 ang_sort(quest_num, &dummy, max_quests);
8360 /* Dump Quest Information */
8361 do_cmd_knowledge_quests_current(fff);
8363 do_cmd_knowledge_quests_completed(fff, quest_num);
8365 do_cmd_knowledge_quests_failed(fff, quest_num);
8369 do_cmd_knowledge_quests_wiz_random(fff);
8372 /* Close the file */
8375 /* Display the file contents */
8376 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8378 /* Remove the file */
8382 C_KILL(quest_num, max_quests, int);
8389 static void do_cmd_knowledge_home(void)
8394 char file_name[1024];
8396 char o_name[MAX_NLEN];
8399 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8401 /* Open a new file */
8402 fff = my_fopen_temp(file_name, 1024);
8404 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8411 /* Print all homes in the different towns */
8412 st_ptr = &town[1].store[STORE_HOME];
8414 /* Home -- if anything there */
8415 if (st_ptr->stock_num)
8420 /* Header with name of the town */
8421 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8423 /* Dump all available items */
8424 for (i = 0; i < st_ptr->stock_num; i++)
8427 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8428 object_desc(o_name, &st_ptr->stock[i], 0);
8429 if (strlen(o_name) <= 80-3)
8431 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8437 for (n = 0, t = o_name; n < 80-3; n++, t++)
8438 if(iskanji(*t)) {t++; n++;}
8439 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8441 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8442 fprintf(fff, " %.77s\n", o_name+n);
8445 object_desc(o_name, &st_ptr->stock[i], 0);
8446 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8451 /* Add an empty line */
8452 fprintf(fff, "\n\n");
8456 /* Close the file */
8459 /* Display the file contents */
8460 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8462 /* Remove the file */
8468 * Check the status of "autopick"
8470 static void do_cmd_knowledge_autopick(void)
8474 char file_name[1024];
8476 /* Open a new file */
8477 fff = my_fopen_temp(file_name, 1024);
8481 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8488 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8492 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8493 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8496 for (k = 0; k < max_autopick; k++)
8499 byte act = autopick_list[k].action;
8500 if (act & DONT_AUTOPICK)
8502 tmp = _("放置", "Leave");
8504 else if (act & DO_AUTODESTROY)
8506 tmp = _("破壊", "Destroy");
8508 else if (act & DO_AUTOPICK)
8510 tmp = _("拾う", "Pickup");
8512 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
8514 tmp = _("確認", "Query");
8517 if (act & DO_DISPLAY)
8518 fprintf(fff, "%11s", format("[%s]", tmp));
8520 fprintf(fff, "%11s", format("(%s)", tmp));
8522 tmp = autopick_line_from_entry(&autopick_list[k]);
8523 fprintf(fff, " %s", tmp);
8527 /* Close the file */
8529 /* Display the file contents */
8530 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8532 /* Remove the file */
8538 * Interact with "knowledge"
8540 void do_cmd_knowledge(void)
8543 bool need_redraw = FALSE;
8545 /* File type is "TEXT" */
8546 FILE_TYPE(FILE_TYPE_TEXT);
8548 /* Save the screen */
8551 /* Interact until done */
8557 /* Ask for a choice */
8559 prt(format("%d/2 ページ", (p+1)), 2, 65);
8560 prt("現在の知識を確認する", 3, 0);
8562 prt(format("page %d/2", (p+1)), 2, 65);
8563 prt("Display current knowledge", 3, 0);
8566 /* Give some choices */
8570 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8571 prt("(2) 既知のアイテム の一覧", 7, 5);
8572 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8573 prt("(4) 既知のモンスター の一覧", 9, 5);
8574 prt("(5) 倒した敵の数 の一覧", 10, 5);
8575 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8576 prt("(7) 現在のペット の一覧", 12, 5);
8577 prt("(8) 我が家のアイテム の一覧", 13, 5);
8578 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8579 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8583 prt("(a) 自分に関する情報 の一覧", 6, 5);
8584 prt("(b) 突然変異 の一覧", 7, 5);
8585 prt("(c) 武器の経験値 の一覧", 8, 5);
8586 prt("(d) 魔法の経験値 の一覧", 9, 5);
8587 prt("(e) 技能の経験値 の一覧", 10, 5);
8588 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8589 prt("(g) 入ったダンジョン の一覧", 12, 5);
8590 prt("(h) 実行中のクエスト の一覧", 13, 5);
8591 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8596 prt("(1) Display known artifacts", 6, 5);
8597 prt("(2) Display known objects", 7, 5);
8598 prt("(3) Display remaining uniques", 8, 5);
8599 prt("(4) Display known monster", 9, 5);
8600 prt("(5) Display kill count", 10, 5);
8601 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8602 prt("(7) Display current pets", 12, 5);
8603 prt("(8) Display home inventory", 13, 5);
8604 prt("(9) Display *identified* equip.", 14, 5);
8605 prt("(0) Display terrain symbols.", 15, 5);
8609 prt("(a) Display about yourself", 6, 5);
8610 prt("(b) Display mutations", 7, 5);
8611 prt("(c) Display weapon proficiency", 8, 5);
8612 prt("(d) Display spell proficiency", 9, 5);
8613 prt("(e) Display misc. proficiency", 10, 5);
8614 prt("(f) Display virtues", 11, 5);
8615 prt("(g) Display dungeons", 12, 5);
8616 prt("(h) Display current quests", 13, 5);
8617 prt("(i) Display auto pick/destroy", 14, 5);
8623 prt("ESC) 抜ける", 21, 1);
8624 prt("SPACE) 次ページ", 21, 30);
8625 /*prt("-) 前ページ", 21, 60);*/
8626 prt("コマンド:", 20, 0);
8628 prt("-more-", 17, 8);
8629 prt("ESC) Exit menu", 21, 1);
8630 prt("SPACE) Next page", 21, 30);
8631 /*prt("-) Previous page", 21, 60);*/
8632 prt("Command: ", 20, 0);
8639 if (i == ESCAPE) break;
8642 case ' ': /* Page change */
8646 case '1': /* Artifacts */
8647 do_cmd_knowledge_artifacts();
8649 case '2': /* Objects */
8650 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8652 case '3': /* Uniques */
8653 do_cmd_knowledge_uniques();
8655 case '4': /* Monsters */
8656 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8658 case '5': /* Kill count */
8659 do_cmd_knowledge_kill_count();
8661 case '6': /* wanted */
8662 if (!vanilla_town) do_cmd_knowledge_kubi();
8664 case '7': /* Pets */
8665 do_cmd_knowledge_pets();
8667 case '8': /* Home */
8668 do_cmd_knowledge_home();
8670 case '9': /* Resist list */
8671 do_cmd_knowledge_inven();
8673 case '0': /* Feature list */
8675 int lighting_level = F_LIT_STANDARD;
8676 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8680 case 'a': /* Max stat */
8681 do_cmd_knowledge_stat();
8683 case 'b': /* Mutations */
8684 do_cmd_knowledge_mutations();
8686 case 'c': /* weapon-exp */
8687 do_cmd_knowledge_weapon_exp();
8689 case 'd': /* spell-exp */
8690 do_cmd_knowledge_spell_exp();
8692 case 'e': /* skill-exp */
8693 do_cmd_knowledge_skill_exp();
8695 case 'f': /* Virtues */
8696 do_cmd_knowledge_virtues();
8698 case 'g': /* Dungeon */
8699 do_cmd_knowledge_dungeon();
8701 case 'h': /* Quests */
8702 do_cmd_knowledge_quests();
8704 case 'i': /* Autopick */
8705 do_cmd_knowledge_autopick();
8707 default: /* Unknown option */
8711 /* Flush messages */
8715 /* Restore the screen */
8718 if (need_redraw) do_cmd_redraw();
8723 * Check on the status of an active quest
8725 void do_cmd_checkquest(void)
8727 /* File type is "TEXT" */
8728 FILE_TYPE(FILE_TYPE_TEXT);
8730 /* Save the screen */
8734 do_cmd_knowledge_quests();
8736 /* Restore the screen */
8742 * Display the time and date
8744 void do_cmd_time(void)
8746 int day, hour, min, full, start, end, num;
8754 extract_day_hour_min(&day, &hour, &min);
8756 full = hour * 100 + min;
8763 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8765 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8766 else strcpy(day_buf, "*****");
8770 msg_format("%s日目, 時刻は%d:%02d %sです。",
8771 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8772 min, (hour < 12) ? "AM" : "PM");
8774 msg_format("This is day %s. The time is %d:%02d %s.",
8775 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8776 min, (hour < 12) ? "AM" : "PM");
8781 if (!randint0(10) || p_ptr->image)
8783 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8787 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8790 /* Open this file */
8791 fff = my_fopen(buf, "rt");
8796 /* Find this time */
8797 while (!my_fgets(fff, buf, sizeof(buf)))
8799 /* Ignore comments */
8800 if (!buf[0] || (buf[0] == '#')) continue;
8802 /* Ignore invalid lines */
8803 if (buf[1] != ':') continue;
8805 /* Process 'Start' */
8808 /* Extract the starting time */
8809 start = atoi(buf + 2);
8811 /* Assume valid for an hour */
8821 /* Extract the ending time */
8822 end = atoi(buf + 2);
8828 /* Ignore incorrect range */
8829 if ((start > full) || (full > end)) continue;
8831 /* Process 'Description' */
8836 /* Apply the randomizer */
8837 if (!randint0(num)) strcpy(desc, buf + 2);
8847 /* Close the file */