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);
469 fprintf(fff, _(" %2d:%02d %20s %sを倒した。\n", " %2d:%02d %20s defeated %s.\n"), hour, min, note_level, note);
472 case NIKKI_FIX_QUEST_C:
474 if (quest[num].flags & QUEST_FLAG_SILENT) break;
475 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」を達成した。\n",
476 " %2d:%02d %20s completed quest '%s'.\n"), hour, min, note_level, quest[num].name);
479 case NIKKI_FIX_QUEST_F:
481 if (quest[num].flags & QUEST_FLAG_SILENT) break;
482 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」から命からがら逃げ帰った。\n",
483 " %2d:%02d %20s run away from quest '%s'.\n"), hour, min, note_level, quest[num].name);
486 case NIKKI_RAND_QUEST_C:
489 strcpy(name, r_name+r_info[quest[num].r_idx].name);
490 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)を達成した。\n",
491 " %2d:%02d %20s completed random quest '%s'\n"), hour, min, note_level, name);
494 case NIKKI_RAND_QUEST_F:
497 strcpy(name, r_name+r_info[quest[num].r_idx].name);
498 fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)から逃げ出した。\n",
499 " %2d:%02d %20s ran away from quest '%s'.\n"), hour, min, note_level, name);
502 case NIKKI_MAXDEAPTH:
504 fprintf(fff, _(" %2d:%02d %20s %sの最深階%d階に到達した。\n",
505 " %2d:%02d %20s reached level %d of %s for the first time.\n"), hour, min, note_level, d_name+d_info[dungeon_type].name, num);
510 fprintf(fff, _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n",
511 " %2d:%02d %20s reset recall level of %s to %d %s.\n"), hour, min, note_level, note, d_name + d_info[num].name, max_dlv[num]);
517 if (q_idx && (is_fixed_quest_idx(q_idx)
518 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
520 to = _("地上", "the surface");
524 if (!(dun_level+num)) to = _("地上", "the surface");
525 else to = format(_("%d階", "level %d"), dun_level+num);
527 fprintf(fff, _(" %2d:%02d %20s %sへ%s。\n", " %2d:%02d %20s %s %s.\n"), hour, min, note_level, _(to, note), _(note, to));
533 fprintf(fff, _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n"),
534 hour, min, note_level, _(d_name+d_info[dungeon_type].name, max_dlv[dungeon_type]),
535 _(max_dlv[dungeon_type], d_name+d_info[dungeon_type].name));
537 fprintf(fff, _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n"), hour, min, note_level);
542 if (quest[num].flags & QUEST_FLAG_SILENT) break;
543 fprintf(fff, _(" %2d:%02d %20s クエスト「%s」へと突入した。\n", " %2d:%02d %20s entered the quest '%s'.\n"),
544 hour, min, note_level, quest[num].name);
549 fprintf(fff, _(" %2d:%02d %20s レベル・テレポートで脱出した。\n", " %2d:%02d %20s Got out using teleport level.\n"),
550 hour, min, note_level);
555 fprintf(fff, _(" %2d:%02d %20s %sを購入した。\n", " %2d:%02d %20s bought %s.\n"), hour, min, note_level, note);
560 fprintf(fff, _(" %2d:%02d %20s %sを売却した。\n", " %2d:%02d %20s sold %s.\n"), hour, min, note_level, note);
568 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d回戦で、%sの前に敗れ去った。\n", " %2d:%02d %20s beaten by %s in the %d%s fight.\n"),
569 hour, min, note_level, _(n, note), _(note, n), _("", get_ordinal_number_suffix(n)));
572 fprintf(fff, _(" %2d:%02d %20s 闘技場の%d回戦(%s)に勝利した。\n", " %2d:%02d %20s won the %d%s fight (%s).\n"),
573 hour, min, note_level, num, _(note, get_ordinal_number_suffix(num)), note);
575 if (num == MAX_ARENA_MONS)
577 fprintf(fff, _(" 闘技場のすべての敵に勝利し、チャンピオンとなった。\n",
578 " won all fight to become a Chanpion.\n"));
585 fprintf(fff, _(" %2d:%02d %20s %sを識別した。\n", " %2d:%02d %20s identified %s.\n"), hour, min, note_level, note);
592 to = _("地上", "the surface");
594 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
596 fprintf(fff, _(" %2d:%02d %20s %sへとウィザード・テレポートで移動した。\n",
597 " %2d:%02d %20s wizard-teleport to %s.\n"), hour, min, note_level, to);
604 to = _("地上", "the surface");
606 to = format(_("%d階(%s)", "level %d of %s"), dun_level, d_name+d_info[dungeon_type].name);
608 fprintf(fff, _(" %2d:%02d %20s %sへとパターンの力で移動した。\n",
609 " %2d:%02d %20s used Pattern to teleport to %s.\n"), hour, min, note_level, to);
614 fprintf(fff, _(" %2d:%02d %20s レベルが%dに上がった。\n", " %2d:%02d %20s reached player level %d.\n"), hour, min, note_level, num);
617 case NIKKI_GAMESTART:
619 time_t ct = time((time_t*)0);
623 fprintf(fff, "%s %s",note, ctime(&ct));
626 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
629 case NIKKI_NAMED_PET:
631 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
634 case RECORD_NAMED_PET_NAME:
635 fprintf(fff, _("%sを旅の友にすることに決めた。\n", "decided to travel together with %s.\n"), note);
637 case RECORD_NAMED_PET_UNNAME:
638 fprintf(fff, _("%sの名前を消した。\n", "unnamed %s.\n"), note);
640 case RECORD_NAMED_PET_DISMISS:
641 fprintf(fff, _("%sを解放した。\n", "dismissed %s.\n"), note);
643 case RECORD_NAMED_PET_DEATH:
644 fprintf(fff, _("%sが死んでしまった。\n", "%s died.\n"), note);
646 case RECORD_NAMED_PET_MOVED:
647 fprintf(fff, _("%sをおいて別のマップへ移動した。\n", "moved to another map leaving %s behind.\n"), note);
649 case RECORD_NAMED_PET_LOST_SIGHT:
650 fprintf(fff, _("%sとはぐれてしまった。\n", "lost sight of %s.\n"), note);
652 case RECORD_NAMED_PET_DESTROY:
653 fprintf(fff, _("%sが*破壊*によって消え去った。\n", "%s was made disappeared by *destruction*.\n"), note);
655 case RECORD_NAMED_PET_EARTHQUAKE:
656 fprintf(fff, _("%sが岩石に押し潰された。\n", "%s was crushed by falling rocks.\n"), note);
658 case RECORD_NAMED_PET_GENOCIDE:
659 fprintf(fff, _("%sが抹殺によって消え去った。\n", "%s was made disappeared by genocide.\n"), note);
661 case RECORD_NAMED_PET_WIZ_ZAP:
662 fprintf(fff, _("%sがデバッグコマンドによって消え去った。\n", "%s was removed by debug command.\n"), note);
664 case RECORD_NAMED_PET_TELE_LEVEL:
665 fprintf(fff, _("%sがテレポート・レベルによって消え去った。\n", "%s was made disappeared by teleport level.\n"), note);
667 case RECORD_NAMED_PET_BLAST:
668 fprintf(fff, _("%sを爆破した。\n", "blasted %s.\n"), note);
670 case RECORD_NAMED_PET_HEAL_LEPER:
671 fprintf(fff, _("%sの病気が治り旅から外れた。\n", "%s was healed and left.\n"), note);
673 case RECORD_NAMED_PET_COMPACT:
674 fprintf(fff, _("%sがモンスター情報圧縮によって消え去った。\n", "%s was made disappeared by compacting monsters.\n"), note);
676 case RECORD_NAMED_PET_LOSE_PARENT:
677 fprintf(fff, _("%sの召喚者が既にいないため消え去った。\n", "%s disappeared because there does not exist summoner.\n"), note);
691 if (do_level) write_level = FALSE;
697 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
700 * @brief 日記のタイトル表記と内容出力 /
703 static void do_cmd_disp_nikki(void)
705 char nikki_title[256];
710 static const char subtitle[][30] = {"最強の肉体を求めて",
741 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
742 "Attack is the best form of defence.",
744 "An unexpected windfall",
745 "A drowning man will catch at a straw",
746 "Don't count your chickens before they are hatched.",
747 "It is no use crying over spilt milk.",
748 "Seeing is believing.",
749 "Strike the iron while it is hot.",
750 "I don't care what follows.",
751 "To dig a well to put out a house on fire.",
752 "Tomorrow is another day.",
753 "Easy come, easy go.",
754 "The more haste, the less speed.",
755 "Where there is life, there is hope.",
756 "There is no royal road to *WINNER*.",
757 "Danger past, God forgotten.",
758 "The best thing to do now is to run away.",
759 "Life is but an empty dream.",
760 "Dead men tell no tales.",
761 "A book that remains shut is but a block.",
762 "Misfortunes never come singly.",
763 "A little knowledge is a dangerous thing.",
764 "History repeats itself.",
765 "*WINNER* was not built in a day.",
766 "Ignorance is bliss.",
767 "To lose is to win?",
768 "No medicine can cure folly.",
769 "All good things come to an end.",
770 "M$ Empire strikes back.",
771 "To see is to believe",
773 "Quest of The World's Greatest Brain"};
775 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
777 /* Build the filename */
778 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
780 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
781 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
782 else if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
783 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
784 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
787 sprintf(nikki_title, "「%s%s%sの伝説 -%s-」",
788 ap_ptr->title, ap_ptr->no ? "の" : "", player_name, tmp);
790 sprintf(nikki_title, "Legend of %s %s '%s'",
791 ap_ptr->title, player_name, tmp);
794 /* Display the file contents */
795 show_file(FALSE, buf, nikki_title, -1, 0);
799 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
802 static void do_cmd_bunshou(void)
805 char bunshou[80] = "\0";
807 if (get_string(_("内容: ", "diary note: "), tmp, 79))
809 strcpy(bunshou, tmp);
811 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
816 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
819 static void do_cmd_last_get(void)
824 if (record_o_name[0] == '\0') return;
826 sprintf(buf,_("%sの入手を記録します。", "Do you really want to record getting %s? "),record_o_name);
827 if (!get_check(buf)) return;
831 sprintf(buf,_("%sを手に入れた。", "descover %s."), record_o_name);
832 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
836 static void do_cmd_erase_nikki(void)
842 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your record? "))) return;
843 sprintf(file_name,_("playrecord-%s.txt", "playrec-%s.txt"),savefile_base);
845 /* Build the filename */
846 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
848 /* Remove the file */
851 fff = my_fopen(buf, "w");
854 msg_format(_("記録を消去しました。", "deleted record."));
856 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
865 void do_cmd_nikki(void)
869 /* File type is "TEXT" */
870 FILE_TYPE(FILE_TYPE_TEXT);
872 /* Save the screen */
875 /* Interact until done */
881 /* Ask for a choice */
882 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
884 /* Give some choices */
885 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
886 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
887 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record item you last get/identify"), 6, 5);
888 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
890 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
893 prt(_("コマンド:", "Command: "), 18, 0);
899 if (i == ESCAPE) break;
913 do_cmd_erase_nikki();
917 prepare_movie_hooks();
919 default: /* Unknown option */
927 /* Restore the screen */
932 * @brief 画面を再描画するコマンドのメインルーチン
933 * Hack -- redraw the screen
937 * This command performs various low level updates, clears all the "extra"
938 * windows, does a total redraw of the main window, and requests all of the
939 * interesting updates and redraws that I can think of.
941 * This command is also used to "instantiate" the results of the user
942 * selecting various things, such as graphics mode, so it must call
943 * the "TERM_XTRA_REACT" hook before redrawing the windows.
946 void do_cmd_redraw(void)
953 /* Hack -- react to changes */
954 Term_xtra(TERM_XTRA_REACT, 0);
957 /* Combine and Reorder the pack (later) */
958 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
962 p_ptr->update |= (PU_TORCH);
965 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
967 /* Forget lite/view */
968 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
970 /* Update lite/view */
971 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
973 /* Update monsters */
974 p_ptr->update |= (PU_MONSTERS);
976 /* Redraw everything */
977 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
980 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
983 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
990 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
993 /* Redraw every window */
994 for (j = 0; j < 8; j++)
997 if (!angband_term[j]) continue;
1000 Term_activate(angband_term[j]);
1015 * @brief 名前を変更するコマンドのメインルーチン
1016 * Hack -- change name
1019 void do_cmd_change_name(void)
1028 /* Save the screen */
1036 /* Display the player */
1037 display_player(mode);
1042 display_player(mode);
1047 Term_putstr(2, 23, -1, TERM_WHITE,
1048 "['c'で名前変更, 'f'でファイルへ書出, 'h'でモード変更, ESCで終了]");
1050 Term_putstr(2, 23, -1, TERM_WHITE,
1051 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1059 if (c == ESCAPE) break;
1066 /* Process the player name */
1067 process_player_name(FALSE);
1073 sprintf(tmp, "%s.txt", player_base);
1074 if (get_string(_("ファイル名: ", "File name: "), tmp, 80))
1076 if (tmp[0] && (tmp[0] != ' '))
1078 file_character(tmp);
1095 /* Flush messages */
1099 /* Restore the screen */
1102 /* Redraw everything */
1103 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1110 * @brief 最近表示されたメッセージを再表示するコマンドのメインルーチン
1111 * Recall the most recent message
1114 void do_cmd_message_one(void)
1116 /* Recall one message XXX XXX XXX */
1117 prt(format("> %s", message_str(0)), 0, 0);
1122 * @brief メッセージのログを表示するコマンドのメインルーチン
1123 * Recall the most recent message
1127 * Show previous messages to the user -BEN-
1129 * The screen format uses line 0 and 23 for headers and prompts,
1130 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1132 * This command shows you which commands you are viewing, and allows
1133 * you to "search" for strings in the recall.
1135 * Note that messages may be longer than 80 characters, but they are
1136 * displayed using "infinite" length, with a special sub-command to
1137 * "slide" the virtual display to the left or right.
1139 * Attempt to only hilite the matching portions of the string.
1142 void do_cmd_messages(int num_now)
1146 char shower_str[81];
1147 char finder_str[81];
1154 Term_get_size(&wid, &hgt);
1156 /* Number of message lines in a screen */
1157 num_lines = hgt - 4;
1160 strcpy(finder_str, "");
1163 strcpy(shower_str, "");
1165 /* Total messages */
1168 /* Start on first message */
1171 /* Save the screen */
1177 /* Process requests until done */
1183 /* Dump up to 20 lines of messages */
1184 for (j = 0; (j < num_lines) && (i + j < n); j++)
1186 cptr msg = message_str(i+j);
1188 /* Dump the messages, bottom to top */
1189 c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1191 /* Hilite "shower" */
1192 if (shower && shower[0])
1196 /* Display matches */
1197 while ((str = my_strstr(str, shower)) != NULL)
1199 int len = strlen(shower);
1201 /* Display the match */
1202 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1210 /* Erase remaining lines */
1211 for (; j < num_lines; j++)
1213 Term_erase(0, num_lines + 1 - j, 255);
1216 /* Display header XXX XXX XXX */
1219 prt(format("以前のメッセージ %d-%d 全部で(%d)",
1220 i, i + j - 1, n), 0, 0);
1222 prt(format("Message Recall (%d-%d of %d)",
1223 i, i + j - 1, n), 0, 0);
1226 /* Display prompt (not very informative) */
1227 prt(_("[ 'p' で更に古いもの, 'n' で更に新しいもの, '/' で検索, ESC で中断 ]",
1228 "[Press 'p' for older, 'n' for newer, ..., or ESCAPE]"), hgt - 1, 0);
1231 skey = inkey_special(TRUE);
1233 /* Exit on Escape */
1234 if (skey == ESCAPE) break;
1236 /* Hack -- Save the old index */
1241 /* Hack -- handle show */
1244 prt(_("強調: ", "Show: "), hgt - 1, 0);
1246 /* Get a "shower" string, or continue */
1247 strcpy(back_str, shower_str);
1248 if (askfor(shower_str, 80))
1251 shower = shower_str[0] ? shower_str : NULL;
1253 else strcpy(shower_str, back_str);
1258 /* Hack -- handle find */
1265 prt(_("検索: ", "Find: "), hgt - 1, 0);
1267 /* Get a "finder" string, or continue */
1268 strcpy(back_str, finder_str);
1269 if (!askfor(finder_str, 80))
1271 strcpy(finder_str, back_str);
1274 else if (!finder_str[0])
1276 shower = NULL; /* Stop showing */
1281 shower = finder_str;
1284 for (z = i + 1; z < n; z++)
1286 cptr msg = message_str(z);
1289 if (my_strstr(msg, finder_str))
1301 /* Recall 1 older message */
1303 /* Go to the oldest line */
1307 /* Recall 1 newer message */
1309 /* Go to the newest line */
1313 /* Recall 1 older message */
1318 /* Go older if legal */
1319 i = MIN(i + 1, n - num_lines);
1322 /* Recall 10 older messages */
1324 /* Go older if legal */
1325 i = MIN(i + 10, n - num_lines);
1328 /* Recall 20 older messages */
1333 /* Go older if legal */
1334 i = MIN(i + num_lines, n - num_lines);
1337 /* Recall 20 newer messages */
1341 /* Go newer (if able) */
1342 i = MAX(0, i - num_lines);
1345 /* Recall 10 newer messages */
1347 /* Go newer (if able) */
1351 /* Recall 1 newer messages */
1354 /* Go newer (if able) */
1359 /* Hack -- Error of some kind */
1363 /* Restore the screen */
1370 * チートオプションの最大数 / Number of cheating options
1375 * チーとオプションの定義テーブル / Cheating options
1377 static option_type cheat_info[CHEAT_MAX] =
1379 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1380 "cheat_peek", _("アイテムの生成をのぞき見る", "Peek into object creation")
1383 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1384 "cheat_hear", _("モンスターの生成をのぞき見る", "Peek into monster creation")
1387 { &cheat_room, FALSE, 255, 0x04, 0x00,
1388 "cheat_room", _("ダンジョンの生成をのぞき見る", "Peek into dungeon creation")
1391 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1392 "cheat_xtra", _("その他の事をのぞき見る", "Peek into something else")
1395 { &cheat_know, FALSE, 255, 0x10, 0x00,
1396 "cheat_know", _("完全なモンスターの思い出を知る", "Know complete monster info")
1399 { &cheat_live, FALSE, 255, 0x20, 0x00,
1400 "cheat_live", _("死を回避することを可能にする", "Allow player to avoid death")
1403 { &cheat_save, FALSE, 255, 0x40, 0x00,
1404 "cheat_save", _("死んだ時セーブするか確認する", "Ask for saving death")
1409 * @brief チートオプションを変更するコマンドのメインルーチン
1410 * Interact with some options for cheating
1411 * @param info 表示メッセージ
1414 static void do_cmd_options_cheat(cptr info)
1418 int i, k = 0, n = CHEAT_MAX;
1426 /* Interact with the player */
1431 /* Prompt XXX XXX XXX */
1432 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, ESC で決定 )", "%s (RET to advance, y/n to set, ESC to accept) "), info);
1437 /* 詐欺オプションをうっかりいじってしまう人がいるようなので注意 */
1438 prt(" << 注意 >>", 11, 0);
1439 prt(" 詐欺オプションを一度でも設定すると、スコア記録が残らなくなります!", 12, 0);
1440 prt(" 後に解除してもダメですので、勝利者を目指す方はここのオプションはい", 13, 0);
1441 prt(" じらないようにして下さい。", 14, 0);
1443 /* Display the options */
1444 for (i = 0; i < n; i++)
1446 byte a = TERM_WHITE;
1448 /* Color current option */
1449 if (i == k) a = TERM_L_BLUE;
1451 /* Display the option text */
1452 sprintf(buf, "%-48s: %s (%s)",
1453 cheat_info[i].o_desc,
1454 (*cheat_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1455 cheat_info[i].o_text);
1456 c_prt(a, buf, i + 2, 0);
1459 /* Hilite current option */
1460 move_cursor(k + 2, 50);
1466 * HACK - Try to translate the key into a direction
1467 * to allow using the roguelike keys for navigation.
1469 dir = get_keymap_dir(ch);
1470 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1484 k = (n + k - 1) % n;
1502 do_cmd_write_nikki(NIKKI_BUNSHOU, 0,
1503 _("詐欺オプションをONにして、スコアを残せなくなった。", "give up sending score to use cheating options."));
1504 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1505 (*cheat_info[k].o_var) = TRUE;
1514 (*cheat_info[k].o_var) = FALSE;
1521 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), cheat_info[k].o_text);
1522 /* Peruse the help file */
1523 (void)show_file(TRUE, buf, NULL, 0, 0);
1542 static option_type autosave_info[2] =
1544 { &autosave_l, FALSE, 255, 0x01, 0x00,
1545 "autosave_l", _("新しい階に入る度に自動セーブする", "Autosave when entering new levels") },
1547 { &autosave_t, FALSE, 255, 0x02, 0x00,
1548 "autosave_t", _("一定ターン毎に自動セーブする", "Timed autosave") },
1552 * @brief セーブ頻度ターンの次の値を返す
1553 * @param current 現在のセーブ頻度ターン値
1554 * @return 次のセーブ頻度ターン値
1556 static s16b toggle_frequency(s16b current)
1561 case 50: return 100;
1562 case 100: return 250;
1563 case 250: return 500;
1564 case 500: return 1000;
1565 case 1000: return 2500;
1566 case 2500: return 5000;
1567 case 5000: return 10000;
1568 case 10000: return 25000;
1575 * @brief 自動セーブオプションを変更するコマンドのメインルーチン
1576 * @param info 表示メッセージ
1579 static void do_cmd_options_autosave(cptr info)
1583 int i, k = 0, n = 2;
1591 /* Interact with the player */
1594 /* Prompt XXX XXX XXX */
1595 sprintf(buf, _("%s ( リターンで次へ, y/n でセット, F で頻度を入力, ESC で決定 ) ",
1596 "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) "), info);
1600 /* Display the options */
1601 for (i = 0; i < n; i++)
1603 byte a = TERM_WHITE;
1605 /* Color current option */
1606 if (i == k) a = TERM_L_BLUE;
1608 /* Display the option text */
1609 sprintf(buf, "%-48s: %s (%s)",
1610 autosave_info[i].o_desc,
1611 (*autosave_info[i].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1612 autosave_info[i].o_text);
1613 c_prt(a, buf, i + 2, 0);
1615 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1617 /* Hilite current option */
1618 move_cursor(k + 2, 50);
1634 k = (n + k - 1) % n;
1652 (*autosave_info[k].o_var) = TRUE;
1661 (*autosave_info[k].o_var) = FALSE;
1669 autosave_freq = toggle_frequency(autosave_freq);
1670 prt(format(_("自動セーブの頻度: %d ターン毎", "Timed autosave frequency: every %d turns"), autosave_freq), 5, 0);
1676 (void)show_file(TRUE, _("joption.txt#Autosave", "option.txt#Autosave"), NULL, 0, 0);
1692 * @brief 標準オプションを変更するコマンドのサブルーチン /
1693 * Interact with some options
1694 * @param page オプションページ番号
1695 * @param info 表示メッセージ
1698 void do_cmd_options_aux(int page, cptr info)
1701 int i, k = 0, n = 0, l;
1704 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1705 (!p_ptr->wizard || !allow_debug_opts);
1708 /* Lookup the options */
1709 for (i = 0; i < 24; i++) opt[i] = 0;
1711 /* Scan the options */
1712 for (i = 0; option_info[i].o_desc; i++)
1714 /* Notice options on this "page" */
1715 if (option_info[i].o_page == page) opt[n++] = i;
1722 /* Interact with the player */
1727 /* Prompt XXX XXX XXX */
1728 sprintf(buf, _("%s (リターン:次, %sESC:終了, ?:ヘルプ) ", "%s (RET:next, %s, ?:help) "),
1729 info, browse_only ? _("", "ESC:exit") : _("y/n:変更, ", "y/n:change, ESC:accept"));
1732 /* HACK -- description for easy-auto-destroy options */
1733 if (page == OPT_PAGE_AUTODESTROY)
1734 c_prt(TERM_YELLOW, _("以下のオプションは、簡易自動破壊を使用するときのみ有効",
1735 "Following options will protect items from easy auto-destroyer."), 6, _(6, 3));
1737 /* Display the options */
1738 for (i = 0; i < n; i++)
1740 byte a = TERM_WHITE;
1742 /* Color current option */
1743 if (i == k) a = TERM_L_BLUE;
1745 /* Display the option text */
1746 sprintf(buf, "%-48s: %s (%.19s)",
1747 option_info[opt[i]].o_desc,
1748 (*option_info[opt[i]].o_var ? _("はい ", "yes") : _("いいえ", "no ")),
1749 option_info[opt[i]].o_text);
1750 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1751 else c_prt(a, buf, i + 2, 0);
1754 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1757 /* Hilite current option */
1758 move_cursor(k + 2 + l, 50);
1764 * HACK - Try to translate the key into a direction
1765 * to allow using the roguelike keys for navigation.
1767 dir = get_keymap_dir(ch);
1768 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1782 k = (n + k - 1) % n;
1799 if (browse_only) break;
1800 (*option_info[opt[k]].o_var) = TRUE;
1809 if (browse_only) break;
1810 (*option_info[opt[k]].o_var) = FALSE;
1818 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1824 strnfmt(buf, sizeof(buf), _("joption.txt#%s", "option.txt#%s"), option_info[opt[k]].o_text);
1825 /* Peruse the help file */
1826 (void)show_file(TRUE, buf, NULL, 0, 0);
1843 * @brief ウィンドウオプションを変更するコマンドのメインルーチン /
1844 * Modify the "window" options
1847 static void do_cmd_options_win(void)
1861 /* Memorize old flags */
1862 for (j = 0; j < 8; j++)
1864 /* Acquire current flags */
1865 old_flag[j] = window_flag[j];
1875 /* Prompt XXX XXX XXX */
1876 prt(_("ウィンドウ・フラグ (<方向>で移動, tでチェンジ, y/n でセット, ESC)", "Window Flags (<dir>, t, y, n, ESC) "), 0, 0);
1878 /* Display the windows */
1879 for (j = 0; j < 8; j++)
1881 byte a = TERM_WHITE;
1883 cptr s = angband_term_name[j];
1886 if (j == x) a = TERM_L_BLUE;
1888 /* Window name, staggered, centered */
1889 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1892 /* Display the options */
1893 for (i = 0; i < 16; i++)
1895 byte a = TERM_WHITE;
1897 cptr str = window_flag_desc[i];
1900 if (i == y) a = TERM_L_BLUE;
1903 if (!str) str = _("(未使用)", "(Unused option)");
1906 Term_putstr(0, i + 5, -1, a, str);
1908 /* Display the windows */
1909 for (j = 0; j < 8; j++)
1911 byte a = TERM_WHITE;
1916 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1919 if (window_flag[j] & (1L << i)) c = 'X';
1922 Term_putch(35 + j * 5, i + 5, a, c);
1927 Term_gotoxy(35 + x * 5, y + 5);
1945 for (j = 0; j < 8; j++)
1947 window_flag[j] &= ~(1L << y);
1951 for (i = 0; i < 16; i++)
1953 window_flag[x] &= ~(1L << i);
1966 window_flag[x] |= (1L << y);
1974 window_flag[x] &= ~(1L << y);
1980 (void)show_file(TRUE, _("joption.txt#Window", "option.txt#Window"), NULL, 0, 0);
1988 d = get_keymap_dir(ch);
1990 x = (x + ddx[d] + 8) % 8;
1991 y = (y + ddy[d] + 16) % 16;
1998 /* Notice changes */
1999 for (j = 0; j < 8; j++)
2004 if (!angband_term[j]) continue;
2006 /* Ignore non-changes */
2007 if (window_flag[j] == old_flag[j]) continue;
2010 Term_activate(angband_term[j]);
2033 option_fields[OPT_NUM] =
2036 { '1', " キー入力 オプション", 3 },
2037 { '2', " マップ画面 オプション", 4 },
2038 { '3', " テキスト表示 オプション", 5 },
2039 { '4', " ゲームプレイ オプション", 6 },
2040 { '5', " 行動中止関係 オプション", 7 },
2041 { '6', " 簡易自動破壊 オプション", 8 },
2042 { 'r', " プレイ記録 オプション", 9 },
2044 { 'p', "自動拾いエディタ", 11 },
2045 { 'd', " 基本ウェイト量 ", 12 },
2046 { 'h', "低ヒットポイント", 13 },
2047 { 'm', " 低魔力色閾値 ", 14 },
2048 { 'a', " 自動セーブ オプション", 15 },
2049 { 'w', "ウインドウフラグ", 16 },
2051 { 'b', " 初期 オプション (参照のみ)", 18 },
2052 { 'c', " 詐欺 オプション", 19 },
2054 { '1', "Input Options", 3 },
2055 { '2', "Map Screen Options", 4 },
2056 { '3', "Text Display Options", 5 },
2057 { '4', "Game-Play Options", 6 },
2058 { '5', "Disturbance Options", 7 },
2059 { '6', "Easy Auto-Destroyer Options", 8 },
2060 { 'r', "Play record Options", 9 },
2062 { 'p', "Auto-picker/destroyer editor", 11 },
2063 { 'd', "Base Delay Factor", 12 },
2064 { 'h', "Hitpoint Warning", 13 },
2065 { 'm', "Mana Color Threshold", 14 },
2066 { 'a', "Autosave Options", 15 },
2067 { 'w', "Window Flags", 16 },
2069 { 'b', "Birth Options (Browse Only)", 18 },
2070 { 'c', "Cheat Options", 19 },
2076 * @brief 標準オプションを変更するコマンドのメインルーチン /
2077 * Set or unset various options.
2081 * The user must use the "Ctrl-R" command to "adapt" to changes
2082 * in any options which control "visual" aspects of the game.
2085 void do_cmd_options(void)
2091 /* Save the screen */
2099 /* Does not list cheat option when cheat option is off */
2100 if (!p_ptr->noscore && !allow_debug_opts) n--;
2105 /* Why are we here */
2106 prt(_("[ オプションの設定 ]", "TinyAngband options"), 1, 0);
2110 /* Give some choices */
2111 for (i = 0; i < n; i++)
2113 byte a = TERM_WHITE;
2114 if (i == y) a = TERM_L_BLUE;
2115 Term_putstr(5, option_fields[i].row, -1, a,
2116 format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name));
2119 prt(_("<方向>で移動, Enterで決定, ESCでキャンセル, ?でヘルプ: ", "Move to <dir>, Select to Enter, Cancel to ESC, ? to help: "), 21, 0);
2122 skey = inkey_special(TRUE);
2123 if (!(skey & SKEY_MASK)) k = (char)skey;
2127 if (k == ESCAPE) break;
2129 if (my_strchr("\n\r ", k))
2131 k = option_fields[y].key;
2135 for (i = 0; i < n; i++)
2137 if (tolower(k) == option_fields[i].key) break;
2140 /* Command is found */
2143 /* Hack -- browse help */
2144 if (k == '?') break;
2148 if (skey == SKEY_UP) d = 8;
2149 if (skey == SKEY_DOWN) d = 2;
2150 y = (y + ddy[d] + n) % n;
2155 if (k == ESCAPE) break;
2162 /* Process the general options */
2163 do_cmd_options_aux(OPT_PAGE_INPUT, _("キー入力オプション", "Input Options"));
2169 /* Process the general options */
2170 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, _("マップ画面オプション", "Map Screen Options"));
2177 do_cmd_options_aux(OPT_PAGE_TEXT, _("テキスト表示オプション", "Text Display Options"));
2184 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, _("ゲームプレイ・オプション", "Game-Play Options"));
2191 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, _("行動中止関係のオプション", "Disturbance Options"));
2198 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, _("簡易自動破壊オプション", "Easy Auto-Destroyer Options"));
2202 /* Play-record Options */
2207 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, _("プレイ記録オプション", "Play-record Options"));
2216 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ?
2217 _("初期オプション(参照のみ)", "Birth Options(browse only)") :
2218 _("初期オプション((*)はスコアに影響)", "Birth Options((*)s effect score)"));
2222 /* Cheating Options */
2225 if (!p_ptr->noscore && !allow_debug_opts)
2227 /* Cheat options are not permitted */
2233 do_cmd_options_cheat(_("詐欺師は決して勝利できない!", "Cheaters never win"));
2240 do_cmd_options_autosave(_("自動セーブ", "Autosave"));
2249 do_cmd_options_win();
2250 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2251 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2252 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2253 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON |
2258 /* Auto-picker/destroyer editor */
2262 do_cmd_edit_autopick();
2266 /* Hack -- Delay Speed */
2272 prt(_("コマンド: 基本ウェイト量", "Command: Base Delay Factor"), 19, 0);
2274 /* Get a new value */
2277 int msec = delay_factor * delay_factor * delay_factor;
2278 prt(format(_("現在のウェイト: %d (%dミリ秒)", "Current base delay factor: %d (%d msec)"), delay_factor, msec), 22, 0);
2279 prt(_("ウェイト (0-9) ESCで決定: ", "Delay Factor (0-9 or ESC to accept): "), 20, 0);
2281 if (k == ESCAPE) break;
2284 (void)show_file(TRUE, _("joption.txt#BaseDelay", "option.txt#BaseDelay"), NULL, 0, 0);
2287 else if (isdigit(k)) delay_factor = D2I(k);
2294 /* Hack -- hitpoint warning factor */
2300 prt(_("コマンド: 低ヒットポイント警告", "Command: Hitpoint Warning"), 19, 0);
2302 /* Get a new value */
2305 prt(format(_("現在の低ヒットポイント警告: %d0%%", "Current hitpoint warning: %d0%%"), hitpoint_warn), 22, 0);
2306 prt(_("低ヒットポイント警告 (0-9) ESCで決定: ", "Hitpoint Warning (0-9 or ESC to accept): "), 20, 0);
2308 if (k == ESCAPE) break;
2311 (void)show_file(TRUE, _("joption.txt#Hitpoint", "option.txt#Hitpoint"), NULL, 0, 0);
2314 else if (isdigit(k)) hitpoint_warn = D2I(k);
2321 /* Hack -- mana color factor */
2327 prt(_("コマンド: 低魔力色閾値", "Command: Mana Color Threshold"), 19, 0);
2329 /* Get a new value */
2332 prt(format(_("現在の低魔力色閾値: %d0%%", "Current mana color threshold: %d0%%"), mana_warn), 22, 0);
2333 prt(_("低魔力閾値 (0-9) ESCで決定: ", "Mana color Threshold (0-9 or ESC to accept): "), 20, 0);
2335 if (k == ESCAPE) break;
2338 (void)show_file(TRUE, _("joption.txt#Manapoint", "option.txt#Manapoint"), NULL, 0, 0);
2341 else if (isdigit(k)) mana_warn = D2I(k);
2349 (void)show_file(TRUE, _("joption.txt", "option.txt"), NULL, 0, 0);
2353 /* Unknown option */
2362 /* Flush messages */
2367 /* Restore the screen */
2370 /* Hack - Redraw equippy chars */
2371 p_ptr->redraw |= (PR_EQUIPPY);
2377 * @brief prefファイルを選択して処理する /
2378 * Ask for a "user pref line" and process it
2381 * XXX XXX XXX Allow absolute file names?
2383 void do_cmd_pref(void)
2390 /* Ask for a "user pref command" */
2391 if (!get_string(_("設定変更コマンド: ", "Pref: "), buf, 80)) return;
2393 /* Process that pref command */
2394 (void)process_pref_file_command(buf);
2398 * @brief 自動拾い設定ファイルをロードするコマンドのメインルーチン /
2401 void do_cmd_reload_autopick(void)
2403 if (!get_check(_("自動拾い設定ファイルをロードしますか? ", "Reload auto-pick preference file? "))) return;
2404 /* Load the file with messages */
2405 autopick_load_pref(TRUE);
2411 * @brief マクロ情報をprefファイルに保存する /
2412 * @param fname ファイル名
2415 static errr macro_dump(cptr fname)
2417 static cptr mark = "Macro Dump";
2423 /* Build the filename */
2424 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2426 /* File type is "TEXT" */
2427 FILE_TYPE(FILE_TYPE_TEXT);
2429 /* Append to the file */
2430 if (!open_auto_dump(buf, mark)) return (-1);
2433 auto_dump_printf(_("\n# 自動マクロセーブ\n\n", "\n# Automatic macro dump\n\n"));
2436 for (i = 0; i < macro__num; i++)
2438 /* Extract the action */
2439 ascii_to_text(buf, macro__act[i]);
2441 /* Dump the macro */
2442 auto_dump_printf("A:%s\n", buf);
2444 /* Extract the action */
2445 ascii_to_text(buf, macro__pat[i]);
2447 /* Dump normal macros */
2448 auto_dump_printf("P:%s\n", buf);
2451 auto_dump_printf("\n");
2463 * @brief マクロのトリガーキーを取得する /
2464 * Hack -- ask for a "trigger" (see below)
2465 * @param buf キー表記を保管するバッファ
2469 * Note the complex use of the "inkey()" function from "util.c".
2471 * Note that both "flush()" calls are extremely important.
2474 static void do_cmd_macro_aux(char *buf)
2484 /* Do not process macros */
2490 /* Read the pattern */
2496 /* Do not process macros */
2499 /* Do not wait for keys */
2502 /* Attempt to read a key */
2513 /* Convert the trigger */
2514 ascii_to_text(tmp, buf);
2516 /* Hack -- display the trigger */
2517 Term_addstr(-1, TERM_WHITE, tmp);
2523 * @brief マクロのキー表記からアスキーコードを得てターミナルに表示する /
2524 * Hack -- ask for a keymap "trigger" (see below)
2525 * @param buf キー表記を取得するバッファ
2529 * Note that both "flush()" calls are extremely important. This may
2530 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2533 static void do_cmd_macro_aux_keymap(char *buf)
2547 /* Convert to ascii */
2548 ascii_to_text(tmp, buf);
2550 /* Hack -- display the trigger */
2551 Term_addstr(-1, TERM_WHITE, tmp);
2560 * @brief キーマップをprefファイルにダンプする /
2561 * Hack -- append all keymaps to the given file
2562 * @param fname ファイルネーム
2566 static errr keymap_dump(cptr fname)
2568 static cptr mark = "Keymap Dump";
2577 if (rogue_like_commands)
2579 mode = KEYMAP_MODE_ROGUE;
2585 mode = KEYMAP_MODE_ORIG;
2589 /* Build the filename */
2590 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2592 /* File type is "TEXT" */
2593 FILE_TYPE(FILE_TYPE_TEXT);
2595 /* Append to the file */
2596 if (!open_auto_dump(buf, mark)) return -1;
2599 auto_dump_printf(_("\n# 自動キー配置セーブ\n\n", "\n# Automatic keymap dump\n\n"));
2602 for (i = 0; i < 256; i++)
2606 /* Loop up the keymap */
2607 act = keymap_act[mode][i];
2609 /* Skip empty keymaps */
2612 /* Encode the key */
2615 ascii_to_text(key, buf);
2617 /* Encode the action */
2618 ascii_to_text(buf, act);
2620 /* Dump the macro */
2621 auto_dump_printf("A:%s\n", buf);
2622 auto_dump_printf("C:%d:%s\n", mode, key);
2634 * @brief マクロを設定するコマンドのメインルーチン /
2635 * Interact with "macros"
2639 * Note that the macro "action" must be defined before the trigger.
2641 * Could use some helpful instructions on this page. XXX XXX XXX
2644 void do_cmd_macros(void)
2656 if (rogue_like_commands)
2658 mode = KEYMAP_MODE_ROGUE;
2664 mode = KEYMAP_MODE_ORIG;
2667 /* File type is "TEXT" */
2668 FILE_TYPE(FILE_TYPE_TEXT);
2675 /* Process requests until done */
2682 prt(_("[ マクロの設定 ]", "Interact with Macros"), 2, 0);
2684 /* Describe that action */
2685 prt(_("マクロ行動が(もしあれば)下に表示されます:", "Current action (if any) shown below:"), 20, 0);
2687 /* Analyze the current action */
2688 ascii_to_text(buf, macro__buf);
2690 /* Display the current action */
2695 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
2697 prt(_("(2) ファイルにマクロを追加", "(2) Append macros to a file"), 5, 5);
2698 prt(_("(3) マクロの確認", "(3) Query a macro"), 6, 5);
2699 prt(_("(4) マクロの作成", "(4) Create a macro"), 7, 5);
2700 prt(_("(5) マクロの削除", "(5) Remove a macro"), 8, 5);
2701 prt(_("(6) ファイルにキー配置を追加", "(6) Append keymaps to a file"), 9, 5);
2702 prt(_("(7) キー配置の確認", "(7) Query a keymap"), 10, 5);
2703 prt(_("(8) キー配置の作成", "(8) Create a keymap"), 11, 5);
2704 prt(_("(9) キー配置の削除", "(9) Remove a keymap"), 12, 5);
2705 prt(_("(0) マクロ行動の入力", "(0) Enter a new action"), 13, 5);
2706 #endif /* ALLOW_MACROS */
2709 prt(_("コマンド: ", "Command: "), 16, 0);
2715 if (i == ESCAPE) break;
2717 /* Load a 'macro' file */
2723 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 16, 0);
2726 prt(_("ファイル: ", "File: "), 18, 0);
2728 /* Default filename */
2729 sprintf(tmp, "%s.prf", player_base);
2731 /* Ask for a file */
2732 if (!askfor(tmp, 80)) continue;
2734 /* Process the given filename */
2735 err = process_pref_file(tmp);
2738 msg_format(_("標準の設定ファイル'%s'を読み込みました。", "Loaded default '%s'."), tmp);
2743 msg_format(_("'%s'の読み込みに失敗しました!", "Failed to load '%s'!"), tmp);
2747 msg_format(_("'%s'を読み込みました。", "Loaded '%s'."), tmp);
2757 prt(_("コマンド: マクロをファイルに追加する", "Command: Append macros to a file"), 16, 0);
2760 prt(_("ファイル: ", "File: "), 18, 0);
2762 /* Default filename */
2763 sprintf(tmp, "%s.prf", player_base);
2765 /* Ask for a file */
2766 if (!askfor(tmp, 80)) continue;
2768 /* Dump the macros */
2769 (void)macro_dump(tmp);
2772 msg_print(_("マクロを追加しました。", "Appended macros."));
2781 prt(_("コマンド: マクロの確認", "Command: Query a macro"), 16, 0);
2785 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2787 /* Get a macro trigger */
2788 do_cmd_macro_aux(buf);
2790 /* Acquire action */
2791 k = macro_find_exact(buf);
2797 msg_print(_("そのキーにはマクロは定義されていません。", "Found no macro."));
2803 /* Obtain the action */
2804 strcpy(macro__buf, macro__act[k]);
2806 /* Analyze the current action */
2807 ascii_to_text(buf, macro__buf);
2809 /* Display the current action */
2813 msg_print(_("マクロを確認しました。", "Found a macro."));
2817 /* Create a macro */
2821 prt(_("コマンド: マクロの作成", "Command: Create a macro"), 16, 0);
2824 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2826 /* Get a macro trigger */
2827 do_cmd_macro_aux(buf);
2833 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2834 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2837 prt(_("マクロ行動: ", "Action: "), 20, 0);
2839 /* Convert to text */
2840 ascii_to_text(tmp, macro__buf);
2842 /* Get an encoded action */
2843 if (askfor(tmp, 80))
2845 /* Convert to ascii */
2846 text_to_ascii(macro__buf, tmp);
2848 /* Link the macro */
2849 macro_add(buf, macro__buf);
2852 msg_print(_("マクロを追加しました。", "Added a macro."));
2856 /* Remove a macro */
2860 prt(_("コマンド: マクロの削除", "Command: Remove a macro"), 16, 0);
2863 prt(_("トリガーキー: ", "Trigger: "), 18, 0);
2865 /* Get a macro trigger */
2866 do_cmd_macro_aux(buf);
2868 /* Link the macro */
2869 macro_add(buf, buf);
2872 msg_print(_("マクロを削除しました。", "Removed a macro."));
2879 prt(_("コマンド: キー配置をファイルに追加する", "Command: Append keymaps to a file"), 16, 0);
2882 prt(_("ファイル: ", "File: "), 18, 0);
2884 /* Default filename */
2885 sprintf(tmp, "%s.prf", player_base);
2887 /* Ask for a file */
2888 if (!askfor(tmp, 80)) continue;
2890 /* Dump the macros */
2891 (void)keymap_dump(tmp);
2894 msg_print(_("キー配置を追加しました。", "Appended keymaps."));
2897 /* Query a keymap */
2903 prt(_("コマンド: キー配置の確認", "Command: Query a keymap"), 16, 0);
2906 prt(_("押すキー: ", "Keypress: "), 18, 0);
2908 /* Get a keymap trigger */
2909 do_cmd_macro_aux_keymap(buf);
2911 /* Look up the keymap */
2912 act = keymap_act[mode][(byte)(buf[0])];
2918 msg_print(_("キー配置は定義されていません。", "Found no keymap."));
2924 /* Obtain the action */
2925 strcpy(macro__buf, act);
2927 /* Analyze the current action */
2928 ascii_to_text(buf, macro__buf);
2930 /* Display the current action */
2934 msg_print(_("キー配置を確認しました。", "Found a keymap."));
2938 /* Create a keymap */
2942 prt(_("コマンド: キー配置の作成", "Command: Create a keymap"), 16, 0);
2945 prt(_("押すキー: ", "Keypress: "), 18, 0);
2947 /* Get a keymap trigger */
2948 do_cmd_macro_aux_keymap(buf);
2954 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
2955 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
2958 prt(_("行動: ", "Action: "), 20, 0);
2960 /* Convert to text */
2961 ascii_to_text(tmp, macro__buf);
2963 /* Get an encoded action */
2964 if (askfor(tmp, 80))
2966 /* Convert to ascii */
2967 text_to_ascii(macro__buf, tmp);
2969 /* Free old keymap */
2970 string_free(keymap_act[mode][(byte)(buf[0])]);
2972 /* Make new keymap */
2973 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
2976 msg_print(_("キー配置を追加しました。", "Added a keymap."));
2980 /* Remove a keymap */
2984 prt(_("コマンド: キー配置の削除", "Command: Remove a keymap"), 16, 0);
2987 prt(_("押すキー: ", "Keypress: "), 18, 0);
2989 /* Get a keymap trigger */
2990 do_cmd_macro_aux_keymap(buf);
2992 /* Free old keymap */
2993 string_free(keymap_act[mode][(byte)(buf[0])]);
2995 /* Make new keymap */
2996 keymap_act[mode][(byte)(buf[0])] = NULL;
2999 msg_print(_("キー配置を削除しました。", "Removed a keymap."));
3002 /* Enter a new action */
3006 prt(_("コマンド: マクロ行動の入力", "Command: Enter a new action"), 16, 0);
3012 c_prt(TERM_L_RED, _("カーソルキーの左右でカーソル位置を移動。BackspaceかDeleteで一文字削除。",
3013 "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char."), 22, 0);
3016 prt(_("マクロ行動: ", "Action: "), 20, 0);
3018 /* Hack -- limit the value */
3021 /* Get an encoded action */
3022 if (!askfor(buf, 80)) continue;
3024 /* Extract an action */
3025 text_to_ascii(macro__buf, buf);
3028 #endif /* ALLOW_MACROS */
3037 /* Flush messages */
3046 static cptr lighting_level_str[F_LIT_MAX] =
3060 static bool cmd_visuals_aux(int i, int *num, int max)
3067 sprintf(str, "%d", *num);
3069 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3072 tmp = strtol(str, NULL, 0);
3073 if (tmp >= 0 && tmp < max)
3076 else if (isupper(i))
3077 *num = (*num + max - 1) % max;
3079 *num = (*num + 1) % max;
3084 static void print_visuals_menu(cptr choice_msg)
3086 prt(_("[ 画面表示の設定 ]", "Interact with Visuals"), 1, 0);
3088 /* Give some choices */
3089 prt(_("(0) ユーザー設定ファイルのロード", "(0) Load a user pref file"), 3, 5);
3091 #ifdef ALLOW_VISUALS
3092 prt(_("(1) モンスターの 色/文字 をファイルに書き出す", "(1) Dump monster attr/chars"), 4, 5);
3093 prt(_("(2) アイテムの 色/文字 をファイルに書き出す", "(2) Dump object attr/chars"), 5, 5);
3094 prt(_("(3) 地形の 色/文字 をファイルに書き出す", "(3) Dump feature attr/chars"), 6, 5);
3095 prt(_("(4) モンスターの 色/文字 を変更する (数値操作)", "(4) Change monster attr/chars (numeric operation)"), 7, 5);
3096 prt(_("(5) アイテムの 色/文字 を変更する (数値操作)", "(5) Change object attr/chars (numeric operation)"), 8, 5);
3097 prt(_("(6) 地形の 色/文字 を変更する (数値操作)", "(6) Change feature attr/chars (numeric operation)"), 9, 5);
3098 prt(_("(7) モンスターの 色/文字 を変更する (シンボルエディタ)", "(7) Change monster attr/chars (visual mode)"), 10, 5);
3099 prt(_("(8) アイテムの 色/文字 を変更する (シンボルエディタ)", "(8) Change object attr/chars (visual mode)"), 11, 5);
3100 prt(_("(9) 地形の 色/文字 を変更する (シンボルエディタ)", "(9) Change feature attr/chars (visual mode)"), 12, 5);
3101 #endif /* ALLOW_VISUALS */
3103 prt(_("(R) 画面表示方法の初期化", "(R) Reset visuals"), 13, 5);
3106 prt(format("コマンド: %s", choice_msg ? choice_msg : _("", "")), 15, 0);
3109 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx);
3110 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx);
3111 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level);
3114 * Interact with "visuals"
3116 void do_cmd_visuals(void)
3121 bool need_redraw = FALSE;
3122 const char *empty_symbol = "<< ? >>";
3124 if (use_bigtile) empty_symbol = "<< ?? >>";
3126 /* File type is "TEXT" */
3127 FILE_TYPE(FILE_TYPE_TEXT);
3129 /* Save the screen */
3132 /* Interact until done */
3138 /* Ask for a choice */
3139 print_visuals_menu(NULL);
3145 if (i == ESCAPE) break;
3149 /* Load a 'pref' file */
3152 prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
3155 prt(_("ファイル: ", "File: "), 17, 0);
3157 /* Default filename */
3158 sprintf(tmp, "%s.prf", player_base);
3161 if (!askfor(tmp, 70)) continue;
3163 /* Process the given filename */
3164 (void)process_pref_file(tmp);
3169 #ifdef ALLOW_VISUALS
3171 /* Dump monster attr/chars */
3174 static cptr mark = "Monster attr/chars";
3177 prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
3180 prt(_("ファイル: ", "File: "), 17, 0);
3182 /* Default filename */
3183 sprintf(tmp, "%s.prf", player_base);
3185 /* Get a filename */
3186 if (!askfor(tmp, 70)) continue;
3188 /* Build the filename */
3189 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3191 /* Append to the file */
3192 if (!open_auto_dump(buf, mark)) continue;
3195 auto_dump_printf(_("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
3198 for (i = 0; i < max_r_idx; i++)
3200 monster_race *r_ptr = &r_info[i];
3202 /* Skip non-entries */
3203 if (!r_ptr->name) continue;
3205 /* Dump a comment */
3206 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3208 /* Dump the monster attr/char info */
3209 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3210 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3217 msg_print(_("モンスターの[色/文字]をファイルに書き出しました。", "Dumped monster attr/chars."));
3222 /* Dump object attr/chars */
3225 static cptr mark = "Object attr/chars";
3228 prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
3231 prt(_("ファイル: ", "File: "), 17, 0);
3233 /* Default filename */
3234 sprintf(tmp, "%s.prf", player_base);
3236 /* Get a filename */
3237 if (!askfor(tmp, 70)) continue;
3239 /* Build the filename */
3240 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3242 /* Append to the file */
3243 if (!open_auto_dump(buf, mark)) continue;
3246 auto_dump_printf(_("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
3249 for (i = 0; i < max_k_idx; i++)
3252 object_kind *k_ptr = &k_info[i];
3254 /* Skip non-entries */
3255 if (!k_ptr->name) continue;
3260 strip_name(o_name, i);
3266 /* Prepare dummy object */
3267 object_prep(&forge, i);
3269 /* Get un-shuffled flavor name */
3270 object_desc(o_name, &forge, OD_FORCE_FLAVOR);
3273 /* Dump a comment */
3274 auto_dump_printf("# %s\n", o_name);
3276 /* Dump the object attr/char info */
3277 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3278 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3285 msg_print(_("アイテムの[色/文字]をファイルに書き出しました。", "Dumped object attr/chars."));
3290 /* Dump feature attr/chars */
3293 static cptr mark = "Feature attr/chars";
3296 prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
3299 prt(_("ファイル: ", "File: "), 17, 0);
3301 /* Default filename */
3302 sprintf(tmp, "%s.prf", player_base);
3304 /* Get a filename */
3305 if (!askfor(tmp, 70)) continue;
3307 /* Build the filename */
3308 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3310 /* Append to the file */
3311 if (!open_auto_dump(buf, mark)) continue;
3314 auto_dump_printf(_("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
3317 for (i = 0; i < max_f_idx; i++)
3319 feature_type *f_ptr = &f_info[i];
3321 /* Skip non-entries */
3322 if (!f_ptr->name) continue;
3324 /* Skip mimiccing features */
3325 if (f_ptr->mimic != i) continue;
3327 /* Dump a comment */
3328 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3330 /* Dump the feature attr/char info */
3331 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3332 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3333 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3334 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
3341 msg_print(_("地形の[色/文字]をファイルに書き出しました。", "Dumped feature attr/chars."));
3346 /* Modify monster attr/chars (numeric operation) */
3349 static cptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
3352 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3354 /* Hack -- query until done */
3357 monster_race *r_ptr = &r_info[r];
3361 byte da = r_ptr->d_attr;
3362 byte dc = r_ptr->d_char;
3363 byte ca = r_ptr->x_attr;
3364 byte cc = r_ptr->x_char;
3366 /* Label the object */
3367 Term_putstr(5, 17, -1, TERM_WHITE,
3368 format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
3370 /* Label the Default values */
3371 Term_putstr(10, 19, -1, TERM_WHITE,
3372 format(_("初期値 色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
3374 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3375 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3377 /* Label the Current values */
3378 Term_putstr(10, 20, -1, TERM_WHITE,
3379 format(_("現在値 色 / 文字 = %3u / %3u", "Current attr/char = %3u / %3u"), ca, cc));
3381 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3382 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3385 Term_putstr(0, 22, -1, TERM_WHITE,
3386 _("コマンド (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): "));
3392 if (i == ESCAPE) break;
3394 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3395 else if (isupper(i)) c = 'a' + i - 'A';
3405 if (!cmd_visuals_aux(i, &r, max_r_idx))
3411 while (!r_info[r].name);
3415 t = (int)r_ptr->x_attr;
3416 (void)cmd_visuals_aux(i, &t, 256);
3417 r_ptr->x_attr = (byte)t;
3421 t = (int)r_ptr->x_char;
3422 (void)cmd_visuals_aux(i, &t, 256);
3423 r_ptr->x_char = (byte)t;
3427 do_cmd_knowledge_monsters(&need_redraw, TRUE, r);
3431 print_visuals_menu(choice_msg);
3439 /* Modify object attr/chars (numeric operation) */
3442 static cptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
3444 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3446 /* Hack -- query until done */
3449 object_kind *k_ptr = &k_info[k];
3453 byte da = k_ptr->d_attr;
3454 byte dc = k_ptr->d_char;
3455 byte ca = k_ptr->x_attr;
3456 byte cc = k_ptr->x_char;
3458 /* Label the object */
3459 Term_putstr(5, 17, -1, TERM_WHITE,
3460 format(_("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"),
3461 k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
3463 /* Label the Default values */
3464 Term_putstr(10, 19, -1, TERM_WHITE,
3465 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3467 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3468 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3470 /* Label the Current values */
3471 Term_putstr(10, 20, -1, TERM_WHITE,
3472 format(_("現在値 色 / 文字 = %3d / %3d", "Current attr/char = %3d / %3d"), ca, cc));
3474 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3475 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3478 Term_putstr(0, 22, -1, TERM_WHITE,
3479 _("コマンド (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): "));
3485 if (i == ESCAPE) break;
3487 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3488 else if (isupper(i)) c = 'a' + i - 'A';
3498 if (!cmd_visuals_aux(i, &k, max_k_idx))
3504 while (!k_info[k].name);
3508 t = (int)k_ptr->x_attr;
3509 (void)cmd_visuals_aux(i, &t, 256);
3510 k_ptr->x_attr = (byte)t;
3514 t = (int)k_ptr->x_char;
3515 (void)cmd_visuals_aux(i, &t, 256);
3516 k_ptr->x_char = (byte)t;
3520 do_cmd_knowledge_objects(&need_redraw, TRUE, k);
3524 print_visuals_menu(choice_msg);
3532 /* Modify feature attr/chars (numeric operation) */
3535 static cptr choice_msg = _("地形の[色/文字]を変更します", "Change feature attr/chars");
3537 static int lighting_level = F_LIT_STANDARD;
3538 prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
3540 /* Hack -- query until done */
3543 feature_type *f_ptr = &f_info[f];
3547 byte da = f_ptr->d_attr[lighting_level];
3548 byte dc = f_ptr->d_char[lighting_level];
3549 byte ca = f_ptr->x_attr[lighting_level];
3550 byte cc = f_ptr->x_char[lighting_level];
3552 /* Label the object */
3554 Term_putstr(5, 17, -1, TERM_WHITE,
3555 format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"),
3556 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
3558 /* Label the Default values */
3559 Term_putstr(10, 19, -1, TERM_WHITE,
3560 format(_("初期値 色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
3562 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3563 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3565 /* Label the Current values */
3567 Term_putstr(10, 20, -1, TERM_WHITE,
3568 format("現在値 色 / 文字 = %3d / %3d", ca, cc));
3570 Term_putstr(10, 20, -1, TERM_WHITE,
3571 format("Current attr/char = %3d / %3d", ca, cc));
3574 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3575 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
3579 Term_putstr(0, 22, -1, TERM_WHITE,
3580 "コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3582 Term_putstr(0, 22, -1, TERM_WHITE,
3583 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ");
3590 if (i == ESCAPE) break;
3592 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3593 else if (isupper(i)) c = 'a' + i - 'A';
3603 if (!cmd_visuals_aux(i, &f, max_f_idx))
3609 while (!f_info[f].name || (f_info[f].mimic != f));
3613 t = (int)f_ptr->x_attr[lighting_level];
3614 (void)cmd_visuals_aux(i, &t, 256);
3615 f_ptr->x_attr[lighting_level] = (byte)t;
3619 t = (int)f_ptr->x_char[lighting_level];
3620 (void)cmd_visuals_aux(i, &t, 256);
3621 f_ptr->x_char[lighting_level] = (byte)t;
3625 (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
3628 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
3632 do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
3636 print_visuals_menu(choice_msg);
3644 /* Modify monster attr/chars (visual mode) */
3646 do_cmd_knowledge_monsters(&need_redraw, TRUE, -1);
3649 /* Modify object attr/chars (visual mode) */
3651 do_cmd_knowledge_objects(&need_redraw, TRUE, -1);
3654 /* Modify feature attr/chars (visual mode) */
3657 int lighting_level = F_LIT_STANDARD;
3658 do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
3662 #endif /* ALLOW_VISUALS */
3671 msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
3675 /* Unknown option */
3681 /* Flush messages */
3685 /* Restore the screen */
3688 if (need_redraw) do_cmd_redraw();
3693 * Interact with "colors"
3695 void do_cmd_colors(void)
3704 /* File type is "TEXT" */
3705 FILE_TYPE(FILE_TYPE_TEXT);
3708 /* Save the screen */
3712 /* Interact until done */
3718 /* Ask for a choice */
3719 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
3721 /* Give some choices */
3722 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
3725 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
3726 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
3730 prt(_("コマンド: ", "Command: "), 8, 0);
3735 if (i == ESCAPE) break;
3737 /* Load a 'pref' file */
3741 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
3744 prt(_("ファイル: ", "File: "), 10, 0);
3747 sprintf(tmp, "%s.prf", player_base);
3750 if (!askfor(tmp, 70)) continue;
3752 /* Process the given filename */
3753 (void)process_pref_file(tmp);
3755 /* Mega-Hack -- react to changes */
3756 Term_xtra(TERM_XTRA_REACT, 0);
3758 /* Mega-Hack -- redraw */
3767 static cptr mark = "Colors";
3770 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
3773 prt(_("ファイル: ", "File: "), 10, 0);
3775 /* Default filename */
3776 sprintf(tmp, "%s.prf", player_base);
3778 /* Get a filename */
3779 if (!askfor(tmp, 70)) continue;
3781 /* Build the filename */
3782 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3784 /* Append to the file */
3785 if (!open_auto_dump(buf, mark)) continue;
3788 auto_dump_printf(_("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
3791 for (i = 0; i < 256; i++)
3793 int kv = angband_color_table[i][0];
3794 int rv = angband_color_table[i][1];
3795 int gv = angband_color_table[i][2];
3796 int bv = angband_color_table[i][3];
3798 cptr name = _("未知", "unknown");
3800 /* Skip non-entries */
3801 if (!kv && !rv && !gv && !bv) continue;
3803 /* Extract the color name */
3804 if (i < 16) name = color_names[i];
3806 /* Dump a comment */
3807 auto_dump_printf(_("# カラー '%s'\n", "# Color '%s'\n"), name);
3809 /* Dump the monster attr/char info */
3810 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
3818 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
3827 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
3829 /* Hack -- query until done */
3838 /* Exhibit the normal colors */
3839 for (j = 0; j < 16; j++)
3841 /* Exhibit this color */
3842 Term_putstr(j*4, 20, -1, a, "###");
3844 /* Exhibit all colors */
3845 Term_putstr(j*4, 22, -1, j, format("%3d", j));
3848 /* Describe the color */
3849 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
3851 /* Describe the color */
3852 Term_putstr(5, 10, -1, TERM_WHITE,
3853 format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
3855 /* Label the Current values */
3856 Term_putstr(5, 12, -1, TERM_WHITE,
3857 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
3858 angband_color_table[a][0],
3859 angband_color_table[a][1],
3860 angband_color_table[a][2],
3861 angband_color_table[a][3]));
3864 Term_putstr(0, 14, -1, TERM_WHITE,
3865 _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
3872 if (i == ESCAPE) break;
3875 if (i == 'n') a = (byte)(a + 1);
3876 if (i == 'N') a = (byte)(a - 1);
3877 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
3878 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
3879 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
3880 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
3881 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
3882 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
3883 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
3884 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
3886 /* Hack -- react to changes */
3887 Term_xtra(TERM_XTRA_REACT, 0);
3889 /* Hack -- redraw */
3896 /* Unknown option */
3902 /* Flush messages */
3907 /* Restore the screen */
3913 * Note something in the message recall
3915 void do_cmd_note(void)
3923 if (!get_string(_("メモ: ", "Note: "), buf, 60)) return;
3925 /* Ignore empty notes */
3926 if (!buf[0] || (buf[0] == ' ')) return;
3928 /* Add the note to the message recall */
3929 msg_format(_("メモ: %s", "Note: %s"), buf);
3934 * Mention the current version
3936 void do_cmd_version(void)
3939 msg_format(_("変愚蛮怒(Hengband) %d.%d.%d", "You are playing Hengband %d.%d.%d."),
3940 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
3946 * Array of feeling strings
3948 static cptr do_cmd_feeling_text[11] =
3950 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3951 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3952 _("恐ろしい死の幻が目に浮かび、気絶しそうになった!", "You nearly faint as horrible visions of death fill your mind!"),
3953 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3954 _("とても悪い予感がする...", "You have a very bad feeling..."),
3955 _("悪い予感がする...", "You have a bad feeling..."),
3956 _("何か緊張する。", "You feel nervous."),
3957 _("少し不運な気がする...", "You feel your luck is turning..."),
3958 _("この場所は好きになれない。", "You don't like the look of this place."),
3959 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3960 _("なんて退屈なところだ...", "What a boring place...")
3963 static cptr do_cmd_feeling_text_combat[11] =
3965 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3966 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3967 _("今夜もまた、誰かが命を落とす...", "You nearly faint as horrible visions of death fill your mind!"),
3968 _("この階はとても危険なようだ。", "This level looks very dangerous."),
3969 _("とても悪い予感がする...", "You have a very bad feeling..."),
3970 _("悪い予感がする...", "You have a bad feeling..."),
3971 _("何か緊張する。", "You feel nervous."),
3972 _("少し不運な気がする...", "You feel your luck is turning..."),
3973 _("この場所は好きになれない。", "You don't like the look of this place."),
3974 _("この階はそれなりに安全なようだ。", "This level looks reasonably safe."),
3975 _("なんて退屈なところだ...", "What a boring place...")
3978 static cptr do_cmd_feeling_text_lucky[11] =
3980 _("この階の雰囲気を感じとれなかった...", "Looks like any other level."),
3981 _("この階には何か特別なものがあるような気がする。", "You feel there is something special about this level."),
3982 _("この階はこの上なく素晴らしい感じがする。", "You have a superb feeling about this level."),
3983 _("素晴らしい感じがする...", "You have an excellent feeling..."),
3984 _("とても良い感じがする...", "You have a very good feeling..."),
3985 _("良い感じがする...", "You have a good feeling..."),
3986 _("ちょっと幸運な感じがする...", "You feel strangely lucky..."),
3987 _("多少は運が向いてきたか...", "You feel your luck is turning..."),
3988 _("見た感じ悪くはない...", "You like the look of this place..."),
3989 _("全然駄目ということはないが...", "This level can't be all bad..."),
3990 _("なんて退屈なところだ...", "What a boring place...")
3995 * Note that "feeling" is set to zero unless some time has passed.
3996 * Note that this is done when the level is GENERATED, not entered.
3998 void do_cmd_feeling(void)
4000 /* No useful feeling in quests */
4001 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4003 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
4007 /* No useful feeling in town */
4008 else if (p_ptr->town_num && !dun_level)
4010 if (!strcmp(town[p_ptr->town_num].name, _("荒野", "wilderness")))
4012 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
4017 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
4022 /* No useful feeling in the wilderness */
4023 else if (!dun_level)
4025 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
4029 /* Display the feeling */
4030 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4031 msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]);
4032 else if (p_ptr->pseikaku == SEIKAKU_COMBAT ||
4033 inventory[INVEN_BOW].name1 == ART_CRIMSON)
4034 msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]);
4036 msg_print(do_cmd_feeling_text[p_ptr->feeling]);
4042 * Description of each monster group.
4044 static cptr monster_group_text[] =
4047 "ユニーク", /* "Uniques" */
4048 "乗馬可能なモンスター", /* "Riding" */
4049 "賞金首", /* "Wanted */
4050 "アンバーの王族", /* "Ambertite" */
4079 /* "古代ドラゴン/ワイアーム", */
4140 /* "Ancient Dragon/Wyrm", */
4149 "Multi-Headed Reptile",
4154 "Reptile/Amphibian",
4155 "Spider/Scorpion/Tick",
4157 /* "Major Demon", */
4174 * Symbols of monsters in each group. Note the "Uniques" group
4175 * is handled differently.
4177 static cptr monster_group_char[] =
4234 "!$&()+./=>?[\\]`{|~",
4244 * hook function to sort monsters by level
4246 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
4248 u16b *who = (u16b*)(u);
4253 monster_race *r_ptr1 = &r_info[w1];
4254 monster_race *r_ptr2 = &r_info[w2];
4259 if (r_ptr2->level > r_ptr1->level) return TRUE;
4260 if (r_ptr1->level > r_ptr2->level) return FALSE;
4262 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
4263 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
4268 * Build a list of monster indexes in the given group. Return the number
4269 * of monsters in the group.
4271 * mode & 0x01 : check for non-empty group
4272 * mode & 0x02 : visual operation only
4274 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
4279 /* Get a list of x_char in this group */
4280 cptr group_char = monster_group_char[grp_cur];
4282 /* XXX Hack -- Check if this is the "Uniques" group */
4283 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
4285 /* XXX Hack -- Check if this is the "Riding" group */
4286 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
4288 /* XXX Hack -- Check if this is the "Wanted" group */
4289 bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L);
4291 /* XXX Hack -- Check if this is the "Amberite" group */
4292 bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L);
4295 /* Check every race */
4296 for (i = 0; i < max_r_idx; i++)
4298 /* Access the race */
4299 monster_race *r_ptr = &r_info[i];
4301 /* Skip empty race */
4302 if (!r_ptr->name) continue ;
4304 /* Require known monsters */
4305 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue;
4309 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
4312 else if (grp_riding)
4314 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
4317 else if (grp_wanted)
4319 bool wanted = FALSE;
4321 for (j = 0; j < MAX_KUBI; j++)
4323 if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i ||
4324 (p_ptr->today_mon && p_ptr->today_mon == i))
4330 if (!wanted) continue;
4333 else if (grp_amberite)
4335 if (!(r_ptr->flags3 & RF3_AMBERITE)) continue;
4340 /* Check for race in the group */
4341 if (!my_strchr(group_char, r_ptr->d_char)) continue;
4345 mon_idx[mon_cnt++] = i;
4347 /* XXX Hack -- Just checking for non-empty group */
4348 if (mode & 0x01) break;
4351 /* Terminate the list */
4352 mon_idx[mon_cnt] = -1;
4354 /* Select the sort method */
4355 ang_sort_comp = ang_sort_comp_monster_level;
4356 ang_sort_swap = ang_sort_swap_hook;
4358 /* Sort by monster level */
4359 ang_sort(mon_idx, &dummy_why, mon_cnt);
4361 /* Return the number of races */
4367 * Description of each monster group.
4369 static cptr object_group_text[] =
4372 "キノコ", /* "Mushrooms" */
4373 "薬", /* "Potions" */
4374 "油つぼ", /* "Flasks" */
4375 "巻物", /* "Scrolls" */
4377 "アミュレット", /* "Amulets" */
4378 "笛", /* "Whistle" */
4379 "光源", /* "Lanterns" */
4380 "魔法棒", /* "Wands" */
4383 "カード", /* "Cards" */
4394 "刀剣類", /* "Swords" */
4395 "鈍器", /* "Blunt Weapons" */
4396 "長柄武器", /* "Polearms" */
4397 "採掘道具", /* "Diggers" */
4398 "飛び道具", /* "Bows" */
4402 "軽装鎧", /* "Soft Armor" */
4403 "重装鎧", /* "Hard Armor" */
4404 "ドラゴン鎧", /* "Dragon Armor" */
4405 "盾", /* "Shields" */
4406 "クローク", /* "Cloaks" */
4407 "籠手", /* "Gloves" */
4408 "ヘルメット", /* "Helms" */
4410 "ブーツ", /* "Boots" */
4463 * TVALs of items in each group
4465 static byte object_group_tval[] =
4506 TV_LIFE_BOOK, /* Hack -- all spellbooks */
4514 * Build a list of object indexes in the given group. Return the number
4515 * of objects in the group.
4517 * mode & 0x01 : check for non-empty group
4518 * mode & 0x02 : visual operation only
4520 static int collect_objects(int grp_cur, int object_idx[], byte mode)
4522 int i, j, k, object_cnt = 0;
4524 /* Get a list of x_char in this group */
4525 byte group_tval = object_group_tval[grp_cur];
4527 /* Check every object */
4528 for (i = 0; i < max_k_idx; i++)
4530 /* Access the object */
4531 object_kind *k_ptr = &k_info[i];
4533 /* Skip empty objects */
4534 if (!k_ptr->name) continue;
4538 /* Any objects will be displayed */
4544 /* Skip non-flavoured objects */
4545 if (!k_ptr->flavor) continue;
4547 /* Require objects ever seen */
4548 if (!k_ptr->aware) continue;
4551 /* Skip items with no distribution (special artifacts) */
4552 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
4556 /* Check for objects in the group */
4557 if (TV_LIFE_BOOK == group_tval)
4559 /* Hack -- All spell books */
4560 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK)
4562 /* Add the object */
4563 object_idx[object_cnt++] = i;
4567 else if (k_ptr->tval == group_tval)
4569 /* Add the object */
4570 object_idx[object_cnt++] = i;
4574 /* XXX Hack -- Just checking for non-empty group */
4575 if (mode & 0x01) break;
4578 /* Terminate the list */
4579 object_idx[object_cnt] = -1;
4581 /* Return the number of objects */
4587 * Description of each feature group.
4589 static cptr feature_group_text[] =
4597 * Build a list of feature indexes in the given group. Return the number
4598 * of features in the group.
4600 * mode & 0x01 : check for non-empty group
4602 static int collect_features(int grp_cur, int *feat_idx, byte mode)
4604 int i, feat_cnt = 0;
4606 /* Unused; There is a single group. */
4609 /* Check every feature */
4610 for (i = 0; i < max_f_idx; i++)
4612 /* Access the index */
4613 feature_type *f_ptr = &f_info[i];
4615 /* Skip empty index */
4616 if (!f_ptr->name) continue;
4618 /* Skip mimiccing features */
4619 if (f_ptr->mimic != i) continue;
4622 feat_idx[feat_cnt++] = i;
4624 /* XXX Hack -- Just checking for non-empty group */
4625 if (mode & 0x01) break;
4628 /* Terminate the list */
4629 feat_idx[feat_cnt] = -1;
4631 /* Return the number of races */
4638 * Build a list of monster indexes in the given group. Return the number
4639 * of monsters in the group.
4641 static int collect_artifacts(int grp_cur, int object_idx[])
4643 int i, object_cnt = 0;
4645 /* Get a list of x_char in this group */
4646 byte group_tval = object_group_tval[grp_cur];
4648 /* Check every object */
4649 for (i = 0; i < max_a_idx; i++)
4651 /* Access the artifact */
4652 artifact_type *a_ptr = &a_info[i];
4654 /* Skip empty artifacts */
4655 if (!a_ptr->name) continue;
4657 /* Skip "uncreated" artifacts */
4658 if (!a_ptr->cur_num) continue;
4660 /* Check for race in the group */
4661 if (a_ptr->tval == group_tval)
4664 object_idx[object_cnt++] = i;
4668 /* Terminate the list */
4669 object_idx[object_cnt] = 0;
4671 /* Return the number of races */
4678 * Encode the screen colors
4680 static char hack[17] = "dwsorgbuDWvyRGBU";
4684 * Hack -- load a screen dump from a file
4686 void do_cmd_load_screen(void)
4701 Term_get_size(&wid, &hgt);
4703 /* Build the filename */
4704 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
4706 /* Append to the file */
4707 fff = my_fopen(buf, "r");
4711 msg_format(_("%s を開くことができませんでした。", "Failed to open %s."), buf);
4717 /* Save the screen */
4720 /* Clear the screen */
4724 /* Load the screen */
4725 for (y = 0; okay; y++)
4727 /* Get a line of data including control code */
4728 if (!fgets(buf, 1024, fff)) okay = FALSE;
4730 /* Get the blank line */
4731 if (buf[0] == '\n' || buf[0] == '\0') break;
4733 /* Ignore too large screen image */
4734 if (y >= hgt) continue;
4737 for (x = 0; x < wid - 1; x++)
4740 if (buf[x] == '\n' || buf[x] == '\0') break;
4742 /* Put the attr/char */
4743 Term_draw(x, y, TERM_WHITE, buf[x]);
4747 /* Dump the screen */
4748 for (y = 0; okay; y++)
4750 /* Get a line of data including control code */
4751 if (!fgets(buf, 1024, fff)) okay = FALSE;
4753 /* Get the blank line */
4754 if (buf[0] == '\n' || buf[0] == '\0') break;
4756 /* Ignore too large screen image */
4757 if (y >= hgt) continue;
4760 for (x = 0; x < wid - 1; x++)
4763 if (buf[x] == '\n' || buf[x] == '\0') break;
4765 /* Get the attr/char */
4766 (void)(Term_what(x, y, &a, &c));
4768 /* Look up the attr */
4769 for (i = 0; i < 16; i++)
4771 /* Use attr matches */
4772 if (hack[i] == buf[x]) a = i;
4775 /* Put the attr/char */
4776 Term_draw(x, y, a, c);
4786 prt(_("ファイルに書き出された画面(記念撮影)をロードしました。", "Screen dump loaded."), 0, 0);
4792 /* Restore the screen */
4799 cptr inven_res_label = _(" 酸電火冷毒光闇破轟獄因沌劣 盲怖乱痺透命感消復浮",
4800 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv");
4803 #define IM_FLAG_STR _("*", "* ")
4804 #define HAS_FLAG_STR _("+", "+ ")
4805 #define NO_FLAG_STR _("・", ". ")
4807 #define print_im_or_res_flag(IM, RES) \
4809 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
4810 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
4813 #define print_flag(TR) \
4815 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
4819 /* XTRA HACK RESLIST */
4820 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
4822 char o_name[MAX_NLEN];
4823 u32b flgs[TR_FLAG_SIZE];
4825 if (!o_ptr->k_idx) return;
4826 if (o_ptr->tval != tval) return;
4828 /* Identified items only */
4829 if (!object_is_known(o_ptr)) return;
4832 * HACK:Ring of Lordly protection and Dragon equipment
4833 * have random resistances.
4835 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
4836 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
4837 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
4838 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
4839 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
4840 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
4841 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
4842 || object_is_artifact(o_ptr))
4845 object_desc(o_name, o_ptr, OD_NAME_ONLY);
4847 while (o_name[i] && (i < 26))
4850 if (iskanji(o_name[i])) i++;
4859 o_name[i] = ' '; i++;
4864 fprintf(fff, "%s %s", where, o_name);
4866 if (!(o_ptr->ident & (IDENT_MENTAL)))
4868 fputs(_("-------不明--------------- -------不明---------\n",
4869 "-------unknown------------ -------unknown------\n"), fff);
4873 object_flags_known(o_ptr, flgs);
4875 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
4876 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
4877 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
4878 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
4879 print_flag(TR_RES_POIS);
4880 print_flag(TR_RES_LITE);
4881 print_flag(TR_RES_DARK);
4882 print_flag(TR_RES_SHARDS);
4883 print_flag(TR_RES_SOUND);
4884 print_flag(TR_RES_NETHER);
4885 print_flag(TR_RES_NEXUS);
4886 print_flag(TR_RES_CHAOS);
4887 print_flag(TR_RES_DISEN);
4891 print_flag(TR_RES_BLIND);
4892 print_flag(TR_RES_FEAR);
4893 print_flag(TR_RES_CONF);
4894 print_flag(TR_FREE_ACT);
4895 print_flag(TR_SEE_INVIS);
4896 print_flag(TR_HOLD_EXP);
4897 print_flag(TR_TELEPATHY);
4898 print_flag(TR_SLOW_DIGEST);
4899 print_flag(TR_REGEN);
4900 print_flag(TR_LEVITATION);
4908 fprintf(fff, "%s\n", inven_res_label);
4914 * Display *ID* ed weapons/armors's resistances
4916 static void do_cmd_knowledge_inven(void)
4920 char file_name[1024];
4930 /* Open a new file */
4931 fff = my_fopen_temp(file_name, 1024);
4934 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
4938 fprintf(fff, "%s\n", inven_res_label);
4940 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
4944 for (; j < 9; j++) fputc('\n', fff);
4946 fprintf(fff, "%s\n", inven_res_label);
4948 strcpy(where, _("装", "E "));
4949 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4951 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4953 strcpy(where, _("持", "I "));
4954 for (i = 0; i < INVEN_PACK; i++)
4956 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
4959 st_ptr = &town[1].store[STORE_HOME];
4960 strcpy(where, _("家", "H "));
4961 for (i = 0; i < st_ptr->stock_num; i++)
4963 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
4967 /* Close the file */
4970 /* Display the file contents */
4971 show_file(TRUE, file_name, _("*鑑定*済み武器/防具の耐性リスト", "Resistances of *identified* equipment"), 0, 0);
4973 /* Remove the file */
4978 void do_cmd_save_screen_html_aux(char *filename, int message)
4982 byte a = 0, old_a = 0;
4996 cptr html_head[] = {
4997 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5001 cptr html_foot[] = {
5003 "</body>\n</html>\n",
5009 Term_get_size(&wid, &hgt);
5011 /* File type is "TEXT" */
5012 FILE_TYPE(FILE_TYPE_TEXT);
5014 /* Append to the file */
5015 fff = my_fopen(filename, "w");
5020 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), filename);
5027 /* Save the screen */
5031 /* Build the filename */
5032 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5033 tmpfff = my_fopen(buf, "r");
5035 for (i = 0; html_head[i]; i++)
5036 fputs(html_head[i], fff);
5040 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5042 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5046 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5048 fprintf(fff, "%s\n", buf);
5053 /* Dump the screen */
5054 for (y = 0; y < hgt; y++)
5061 for (x = 0; x < wid - 1; x++)
5065 /* Get the attr/char */
5066 (void)(Term_what(x, y, &a, &c));
5070 case '&': cc = "&"; break;
5071 case '<': cc = "<"; break;
5072 case '>': cc = ">"; break;
5074 case 0x1f: c = '.'; break;
5075 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5080 if ((y == 0 && x == 0) || a != old_a) {
5081 rv = angband_color_table[a][1];
5082 gv = angband_color_table[a][2];
5083 bv = angband_color_table[a][3];
5084 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5085 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5089 fprintf(fff, "%s", cc);
5091 fprintf(fff, "%c", c);
5094 fprintf(fff, "</font>");
5097 for (i = 0; html_foot[i]; i++)
5098 fputs(html_foot[i], fff);
5103 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5105 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5109 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5111 fprintf(fff, "%s\n", buf);
5125 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5129 /* Restore the screen */
5135 * Hack -- save a screen dump to a file
5137 static void do_cmd_save_screen_html(void)
5139 char buf[1024], tmp[256] = "screen.html";
5141 if (!get_string(_("ファイル名: ", "File name: "), tmp, 80))
5144 /* Build the filename */
5145 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5149 do_cmd_save_screen_html_aux(buf, 1);
5154 * Redefinable "save_screen" action
5156 void (*screendump_aux)(void) = NULL;
5160 * Hack -- save a screen dump to a file
5162 void do_cmd_save_screen(void)
5164 bool old_use_graphics = use_graphics;
5165 bool html_dump = FALSE;
5169 prt(_("記念撮影しますか? [(y)es/(h)tml/(n)o] ", "Save screen dump? [(y)es/(h)tml/(n)o] "), 0, 0);
5173 if (c == 'Y' || c == 'y')
5175 else if (c == 'H' || c == 'h')
5187 Term_get_size(&wid, &hgt);
5189 if (old_use_graphics)
5191 use_graphics = FALSE;
5194 /* Redraw everything */
5195 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5197 /* Hack -- update */
5203 do_cmd_save_screen_html();
5207 /* Do we use a special screendump function ? */
5208 else if (screendump_aux)
5210 /* Dump the screen to a graphics file */
5211 (*screendump_aux)();
5213 else /* Dump the screen as text */
5224 /* Build the filename */
5225 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5227 /* File type is "TEXT" */
5228 FILE_TYPE(FILE_TYPE_TEXT);
5230 /* Append to the file */
5231 fff = my_fopen(buf, "w");
5236 msg_format(_("ファイル %s を開けませんでした。", "Failed to open file %s."), buf);
5242 /* Save the screen */
5246 /* Dump the screen */
5247 for (y = 0; y < hgt; y++)
5250 for (x = 0; x < wid - 1; x++)
5252 /* Get the attr/char */
5253 (void)(Term_what(x, y, &a, &c));
5263 fprintf(fff, "%s\n", buf);
5270 /* Dump the screen */
5271 for (y = 0; y < hgt; y++)
5274 for (x = 0; x < wid - 1; x++)
5276 /* Get the attr/char */
5277 (void)(Term_what(x, y, &a, &c));
5280 buf[x] = hack[a&0x0F];
5287 fprintf(fff, "%s\n", buf);
5298 msg_print(_("画面(記念撮影)をファイルに書き出しました。", "Screen dump saved."));
5301 /* Restore the screen */
5305 if (old_use_graphics)
5307 use_graphics = TRUE;
5310 /* Redraw everything */
5311 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5313 /* Hack -- update */
5320 * Sorting hook -- Comp function -- see below
5322 * We use "u" to point to array of monster indexes,
5323 * and "v" to select the type of sorting to perform on "u".
5325 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5327 u16b *who = (u16b*)(u);
5329 u16b *why = (u16b*)(v);
5336 /* Sort by total kills */
5339 /* Extract total kills */
5340 z1 = a_info[w1].tval;
5341 z2 = a_info[w2].tval;
5343 /* Compare total kills */
5344 if (z1 < z2) return (TRUE);
5345 if (z1 > z2) return (FALSE);
5349 /* Sort by monster level */
5352 /* Extract levels */
5353 z1 = a_info[w1].sval;
5354 z2 = a_info[w2].sval;
5356 /* Compare levels */
5357 if (z1 < z2) return (TRUE);
5358 if (z1 > z2) return (FALSE);
5362 /* Sort by monster experience */
5365 /* Extract experience */
5366 z1 = a_info[w1].level;
5367 z2 = a_info[w2].level;
5369 /* Compare experience */
5370 if (z1 < z2) return (TRUE);
5371 if (z1 > z2) return (FALSE);
5375 /* Compare indexes */
5381 * Sorting hook -- Swap function -- see below
5383 * We use "u" to point to array of monster indexes,
5384 * and "v" to select the type of sorting to perform.
5386 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5388 u16b *who = (u16b*)(u);
5403 * Check the status of "artifacts"
5405 static void do_cmd_knowledge_artifacts(void)
5407 int i, k, z, x, y, n = 0;
5413 char file_name[1024];
5415 char base_name[MAX_NLEN];
5419 /* Open a new file */
5420 fff = my_fopen_temp(file_name, 1024);
5423 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5428 /* Allocate the "who" array */
5429 C_MAKE(who, max_a_idx, s16b);
5431 /* Allocate the "okay" array */
5432 C_MAKE(okay, max_a_idx, bool);
5434 /* Scan the artifacts */
5435 for (k = 0; k < max_a_idx; k++)
5437 artifact_type *a_ptr = &a_info[k];
5442 /* Skip "empty" artifacts */
5443 if (!a_ptr->name) continue;
5445 /* Skip "uncreated" artifacts */
5446 if (!a_ptr->cur_num) continue;
5452 /* Check the dungeon */
5453 for (y = 0; y < cur_hgt; y++)
5455 for (x = 0; x < cur_wid; x++)
5457 cave_type *c_ptr = &cave[y][x];
5459 s16b this_o_idx, next_o_idx = 0;
5461 /* Scan all objects in the grid */
5462 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5466 /* Acquire object */
5467 o_ptr = &o_list[this_o_idx];
5469 /* Acquire next object */
5470 next_o_idx = o_ptr->next_o_idx;
5472 /* Ignore non-artifacts */
5473 if (!object_is_fixed_artifact(o_ptr)) continue;
5475 /* Ignore known items */
5476 if (object_is_known(o_ptr)) continue;
5478 /* Note the artifact */
5479 okay[o_ptr->name1] = FALSE;
5484 /* Check the inventory and equipment */
5485 for (i = 0; i < INVEN_TOTAL; i++)
5487 object_type *o_ptr = &inventory[i];
5489 /* Ignore non-objects */
5490 if (!o_ptr->k_idx) continue;
5492 /* Ignore non-artifacts */
5493 if (!object_is_fixed_artifact(o_ptr)) continue;
5495 /* Ignore known items */
5496 if (object_is_known(o_ptr)) continue;
5498 /* Note the artifact */
5499 okay[o_ptr->name1] = FALSE;
5502 for (k = 0; k < max_a_idx; k++)
5504 if (okay[k]) who[n++] = k;
5507 /* Select the sort method */
5508 ang_sort_comp = ang_sort_art_comp;
5509 ang_sort_swap = ang_sort_art_swap;
5511 /* Sort the array by dungeon depth of monsters */
5512 ang_sort(who, &why, n);
5514 /* Scan the artifacts */
5515 for (k = 0; k < n; k++)
5517 artifact_type *a_ptr = &a_info[who[k]];
5520 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
5522 /* Obtain the base object type */
5523 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5531 /* Get local object */
5534 /* Create fake object */
5535 object_prep(q_ptr, z);
5537 /* Make it an artifact */
5538 q_ptr->name1 = (byte)who[k];
5540 /* Display as if known */
5541 q_ptr->ident |= IDENT_STORE;
5543 /* Describe the artifact */
5544 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5547 /* Hack -- Build the artifact name */
5548 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
5551 /* Free the "who" array */
5552 C_KILL(who, max_a_idx, s16b);
5554 /* Free the "okay" array */
5555 C_KILL(okay, max_a_idx, bool);
5557 /* Close the file */
5560 /* Display the file contents */
5561 show_file(TRUE, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
5563 /* Remove the file */
5569 * Display known uniques
5570 * With "XTRA HACK UNIQHIST" (Originally from XAngband)
5572 static void do_cmd_knowledge_uniques(void)
5580 char file_name[1024];
5583 int n_alive_surface = 0;
5584 int n_alive_over100 = 0;
5585 int n_alive_total = 0;
5588 for (i = 0; i < 10; i++) n_alive[i] = 0;
5590 /* Open a new file */
5591 fff = my_fopen_temp(file_name, 1024);
5595 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5600 /* Allocate the "who" array */
5601 C_MAKE(who, max_r_idx, s16b);
5603 /* Scan the monsters */
5604 for (i = 1; i < max_r_idx; i++)
5606 monster_race *r_ptr = &r_info[i];
5609 if (!r_ptr->name) continue;
5611 /* Require unique monsters */
5612 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5614 /* Only display "known" uniques */
5615 if (!cheat_know && !r_ptr->r_sights) continue;
5617 /* Only print rarity <= 100 uniques */
5618 if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue;
5620 /* Only "alive" uniques */
5621 if (r_ptr->max_num == 0) continue;
5625 lev = (r_ptr->level - 1) / 10;
5629 if (max_lev < lev) max_lev = lev;
5631 else n_alive_over100++;
5633 else n_alive_surface++;
5635 /* Collect "appropriate" monsters */
5639 /* Select the sort method */
5640 ang_sort_comp = ang_sort_comp_hook;
5641 ang_sort_swap = ang_sort_swap_hook;
5643 /* Sort the array by dungeon depth of monsters */
5644 ang_sort(who, &why, n);
5646 if (n_alive_surface)
5648 fprintf(fff, _(" 地上 生存: %3d体\n", " Surface alive: %3d\n"), n_alive_surface);
5649 n_alive_total += n_alive_surface;
5651 for (i = 0; i <= max_lev; i++)
5653 fprintf(fff, _("%3d-%3d階 生存: %3d体\n", "Level %3d-%3d alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
5654 n_alive_total += n_alive[i];
5656 if (n_alive_over100)
5658 fprintf(fff, _("101- 階 生存: %3d体\n", "Level 101- alive: %3d\n"), n_alive_over100);
5659 n_alive_total += n_alive_over100;
5664 fputs(_("--------- -----------\n", "------------- ----------\n"), fff);
5665 fprintf(fff, _(" 合計 生存: %3d体\n\n", " Total alive: %3d\n\n"), n_alive_total);
5669 fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
5672 /* Scan the monster races */
5673 for (k = 0; k < n; k++)
5675 monster_race *r_ptr = &r_info[who[k]];
5677 /* Print a message */
5678 fprintf(fff, _(" %s (レベル%d)\n", " %s (level %d)\n"), r_name + r_ptr->name, r_ptr->level);
5681 /* Free the "who" array */
5682 C_KILL(who, max_r_idx, s16b);
5684 /* Close the file */
5687 /* Display the file contents */
5688 show_file(TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
5690 /* Remove the file */
5696 * Display weapon-exp
5698 static void do_cmd_knowledge_weapon_exp(void)
5700 int i, j, num, weapon_exp;
5704 char file_name[1024];
5707 /* Open a new file */
5708 fff = my_fopen_temp(file_name, 1024);
5710 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5715 for (i = 0; i < 5; i++)
5717 for (num = 0; num < 64; num++)
5719 for (j = 0; j < max_k_idx; j++)
5721 object_kind *k_ptr = &k_info[j];
5723 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
5725 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
5727 weapon_exp = p_ptr->weapon_exp[4 - i][num];
5729 fprintf(fff, "%-25s ", tmp);
5730 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
5731 else fprintf(fff, " ");
5732 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
5733 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
5741 /* Close the file */
5744 /* Display the file contents */
5745 show_file(TRUE, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
5747 /* Remove the file */
5753 * @brief 魔法の経験値を表示するコマンドのメインルーチン
5757 static void do_cmd_knowledge_spell_exp(void)
5759 int i = 0, spell_exp, exp_level;
5762 const magic_type *s_ptr;
5764 char file_name[1024];
5766 /* Open a new file */
5767 fff = my_fopen_temp(file_name, 1024);
5769 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5774 if (p_ptr->realm1 != REALM_NONE)
5776 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[p_ptr->realm1]);
5777 for (i = 0; i < 32; i++)
5779 if (!is_magic(p_ptr->realm1))
5781 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
5785 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
5787 if (s_ptr->slevel >= 99) continue;
5788 spell_exp = p_ptr->spell_exp[i];
5789 exp_level = spell_exp_level(spell_exp);
5790 fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME));
5791 if (p_ptr->realm1 == REALM_HISSATSU)
5792 fprintf(fff, "[--]");
5795 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
5796 else fprintf(fff, " ");
5797 fprintf(fff, "%s", exp_level_str[exp_level]);
5799 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5804 if (p_ptr->realm2 != REALM_NONE)
5806 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[p_ptr->realm2]);
5807 for (i = 0; i < 32; i++)
5809 if (!is_magic(p_ptr->realm1))
5811 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
5815 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
5817 if (s_ptr->slevel >= 99) continue;
5819 spell_exp = p_ptr->spell_exp[i + 32];
5820 exp_level = spell_exp_level(spell_exp);
5821 fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME));
5822 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
5823 else fprintf(fff, " ");
5824 fprintf(fff, "%s", exp_level_str[exp_level]);
5825 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
5830 /* Close the file */
5833 /* Display the file contents */
5834 show_file(TRUE, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
5836 /* Remove the file */
5842 * @brief スキル情報を表示するコマンドのメインルーチン /
5846 static void do_cmd_knowledge_skill_exp(void)
5848 int i = 0, skill_exp;
5852 char file_name[1024];
5853 char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts "),
5854 _("二刀流 ", "Dual Wielding "),
5855 _("乗馬 ", "Riding ")};
5857 /* Open a new file */
5858 fff = my_fopen_temp(file_name, 1024);
5860 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
5865 for (i = 0; i < 3; i++)
5867 skill_exp = p_ptr->skill_exp[i];
5868 fprintf(fff, "%-20s ", skill_name[i]);
5869 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
5870 else fprintf(fff, " ");
5871 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
5872 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
5876 /* Close the file */
5879 /* Display the file contents */
5880 show_file(TRUE, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
5882 /* Remove the file */
5888 * @brief 英単語、句、説を複数形を変換する / Pluralize a monster name
5889 * @param Name 変換したい文字列の参照ポインタ
5892 void plural_aux(char *Name)
5894 int NameLen = strlen(Name);
5896 if (my_strstr(Name, "Disembodied hand"))
5898 strcpy(Name, "Disembodied hands that strangled people");
5900 else if (my_strstr(Name, "Colour out of space"))
5902 strcpy(Name, "Colours out of space");
5904 else if (my_strstr(Name, "stairway to hell"))
5906 strcpy(Name, "stairways to hell");
5908 else if (my_strstr(Name, "Dweller on the threshold"))
5910 strcpy(Name, "Dwellers on the threshold");
5912 else if (my_strstr(Name, " of "))
5914 cptr aider = my_strstr(Name, " of ");
5925 if (dummy[i-1] == 's')
5927 strcpy(&(dummy[i]), "es");
5932 strcpy(&(dummy[i]), "s");
5935 strcpy(&(dummy[i+1]), aider);
5936 strcpy(Name, dummy);
5938 else if (my_strstr(Name, "coins"))
5941 strcpy(dummy, "piles of ");
5942 strcat(dummy, Name);
5943 strcpy(Name, dummy);
5946 else if (my_strstr(Name, "Manes"))
5950 else if (streq(&(Name[NameLen - 2]), "ey"))
5952 strcpy(&(Name[NameLen - 2]), "eys");
5954 else if (Name[NameLen - 1] == 'y')
5956 strcpy(&(Name[NameLen - 1]), "ies");
5958 else if (streq(&(Name[NameLen - 4]), "ouse"))
5960 strcpy(&(Name[NameLen - 4]), "ice");
5962 else if (streq(&(Name[NameLen - 2]), "us"))
5964 strcpy(&(Name[NameLen - 2]), "i");
5966 else if (streq(&(Name[NameLen - 6]), "kelman"))
5968 strcpy(&(Name[NameLen - 6]), "kelmen");
5970 else if (streq(&(Name[NameLen - 8]), "wordsman"))
5972 strcpy(&(Name[NameLen - 8]), "wordsmen");
5974 else if (streq(&(Name[NameLen - 7]), "oodsman"))
5976 strcpy(&(Name[NameLen - 7]), "oodsmen");
5978 else if (streq(&(Name[NameLen - 7]), "eastman"))
5980 strcpy(&(Name[NameLen - 7]), "eastmen");
5982 else if (streq(&(Name[NameLen - 8]), "izardman"))
5984 strcpy(&(Name[NameLen - 8]), "izardmen");
5986 else if (streq(&(Name[NameLen - 5]), "geist"))
5988 strcpy(&(Name[NameLen - 5]), "geister");
5990 else if (streq(&(Name[NameLen - 2]), "ex"))
5992 strcpy(&(Name[NameLen - 2]), "ices");
5994 else if (streq(&(Name[NameLen - 2]), "lf"))
5996 strcpy(&(Name[NameLen - 2]), "lves");
5998 else if (suffix(Name, "ch") ||
5999 suffix(Name, "sh") ||
6000 suffix(Name, "nx") ||
6001 suffix(Name, "s") ||
6004 strcpy(&(Name[NameLen]), "es");
6008 strcpy(&(Name[NameLen]), "s");
6013 * @brief 現在のペットを表示するコマンドのメインルーチン /
6014 * Display current pets
6017 static void do_cmd_knowledge_pets(void)
6021 monster_type *m_ptr;
6024 int show_upkeep = 0;
6025 char file_name[1024];
6028 /* Open a new file */
6029 fff = my_fopen_temp(file_name, 1024);
6031 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6036 /* Process the monsters (backwards) */
6037 for (i = m_max - 1; i >= 1; i--)
6039 /* Access the monster */
6042 /* Ignore "dead" monsters */
6043 if (!m_ptr->r_idx) continue;
6045 /* Calculate "upkeep" for pets */
6049 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6050 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6054 show_upkeep = calculate_upkeep();
6056 fprintf(fff, "----------------------------------------------\n");
6058 fprintf(fff, " 合計: %d 体のペット\n", t_friends);
6059 fprintf(fff, " 維持コスト: %d%% MP\n", show_upkeep);
6061 fprintf(fff, " Total: %d pet%s.\n",
6062 t_friends, (t_friends == 1 ? "" : "s"));
6063 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6068 /* Close the file */
6071 /* Display the file contents */
6072 show_file(TRUE, file_name, _("現在のペット", "Current Pets"), 0, 0);
6074 /* Remove the file */
6080 * @brief 現在のペットを表示するコマンドのメインルーチン /
6083 * @note the player ghosts are ignored. XXX XXX XXX
6085 static void do_cmd_knowledge_kill_count(void)
6093 char file_name[1024];
6098 /* Open a new file */
6099 fff = my_fopen_temp(file_name, 1024);
6102 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
6107 /* Allocate the "who" array */
6108 C_MAKE(who, max_r_idx, s16b);
6111 /* Monsters slain */
6114 for (kk = 1; kk < max_r_idx; kk++)
6116 monster_race *r_ptr = &r_info[kk];
6118 if (r_ptr->flags1 & (RF1_UNIQUE))
6120 bool dead = (r_ptr->max_num == 0);
6129 s16b This = r_ptr->r_pkills;
6139 fprintf(fff,_("あなたはまだ敵を倒していない。\n\n", "You have defeated no enemies yet.\n\n"));
6142 fprintf(fff,"あなたは%ld体の敵を倒している。\n\n", (long int)Total);
6144 fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies");
6150 /* Scan the monsters */
6151 for (i = 1; i < max_r_idx; i++)
6153 monster_race *r_ptr = &r_info[i];
6155 /* Use that monster */
6156 if (r_ptr->name) who[n++] = i;
6159 /* Select the sort method */
6160 ang_sort_comp = ang_sort_comp_hook;
6161 ang_sort_swap = ang_sort_swap_hook;
6163 /* Sort the array by dungeon depth of monsters */
6164 ang_sort(who, &why, n);
6166 /* Scan the monster races */
6167 for (k = 0; k < n; k++)
6169 monster_race *r_ptr = &r_info[who[k]];
6171 if (r_ptr->flags1 & (RF1_UNIQUE))
6173 bool dead = (r_ptr->max_num == 0);
6177 /* Print a message */
6178 fprintf(fff, " %s\n",
6179 (r_name + r_ptr->name));
6185 s16b This = r_ptr->r_pkills;
6190 /* p,tは人と数える by ita */
6191 if (my_strchr("pt", r_ptr->d_char))
6192 fprintf(fff, " %3d 人の %s\n", This, r_name + r_ptr->name);
6194 fprintf(fff, " %3d 体の %s\n", This, r_name + r_ptr->name);
6198 if (my_strstr(r_name + r_ptr->name, "coins"))
6200 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
6204 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
6210 strcpy(ToPlural, (r_name + r_ptr->name));
6211 plural_aux(ToPlural);
6212 fprintf(fff, " %d %s\n", This, ToPlural);
6222 fprintf(fff,"----------------------------------------------\n");
6224 fprintf(fff," 合計: %lu 体を倒した。\n", (unsigned long int)Total);
6226 fprintf(fff," Total: %lu creature%s killed.\n",
6227 (unsigned long int)Total, (Total == 1 ? "" : "s"));
6231 /* Free the "who" array */
6232 C_KILL(who, max_r_idx, s16b);
6234 /* Close the file */
6237 /* Display the file contents */
6238 show_file(TRUE, file_name, _("倒した敵の数", "Kill Count"), 0, 0);
6240 /* Remove the file */
6246 * @brief モンスター情報リスト中のグループを表示する /
6247 * Display the object groups.
6251 * @param per_page リストの表示行
6252 * @param grp_idx グループのID配列
6253 * @param group_text グループ名の文字列配列
6254 * @param grp_cur 現在の選択ID
6255 * @param grp_top 現在の選択リスト最上部ID
6258 static void display_group_list(int col, int row, int wid, int per_page,
6259 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
6263 /* Display lines until done */
6264 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
6266 /* Get the group index */
6267 int grp = grp_idx[grp_top + i];
6269 /* Choose a color */
6270 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
6272 /* Erase the entire line */
6273 Term_erase(col, row + i, wid);
6275 /* Display the group label */
6276 c_put_str(attr, group_text[grp], row + i, col);
6282 * Move the cursor in a browser window
6284 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
6285 int *list_cur, int list_cnt)
6290 int list = *list_cur;
6292 /* Extract direction */
6295 /* Hack -- scroll up full screen */
6300 /* Hack -- scroll down full screen */
6305 d = get_keymap_dir(ch);
6310 /* Diagonals - hack */
6311 if ((ddx[d] > 0) && ddy[d])
6317 Term_get_size(&wid, &hgt);
6319 browser_rows = hgt - 8;
6321 /* Browse group list */
6326 /* Move up or down */
6327 grp += ddy[d] * (browser_rows - 1);
6330 if (grp >= grp_cnt) grp = grp_cnt - 1;
6331 if (grp < 0) grp = 0;
6332 if (grp != old_grp) list = 0;
6335 /* Browse sub-list list */
6338 /* Move up or down */
6339 list += ddy[d] * browser_rows;
6342 if (list >= list_cnt) list = list_cnt - 1;
6343 if (list < 0) list = 0;
6355 if (col < 0) col = 0;
6356 if (col > 1) col = 1;
6363 /* Browse group list */
6368 /* Move up or down */
6372 if (grp >= grp_cnt) grp = grp_cnt - 1;
6373 if (grp < 0) grp = 0;
6374 if (grp != old_grp) list = 0;
6377 /* Browse sub-list list */
6380 /* Move up or down */
6384 if (list >= list_cnt) list = list_cnt - 1;
6385 if (list < 0) list = 0;
6396 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
6400 /* Clear the display lines */
6401 for (i = 0; i < height; i++)
6403 Term_erase(col, row + i, width);
6406 /* Bigtile mode uses double width */
6407 if (use_bigtile) width /= 2;
6409 /* Display lines until done */
6410 for (i = 0; i < height; i++)
6412 /* Display columns until done */
6413 for (j = 0; j < width; j++)
6421 /* Bigtile mode uses double width */
6422 if (use_bigtile) x += j;
6427 /* Ignore illegal characters */
6428 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
6429 (!use_graphics && ic > 0x7f))
6435 /* Force correct code for both ASCII character and tile */
6436 if (c & 0x80) a |= 0x80;
6438 /* Display symbol */
6439 Term_queue_bigchar(x, y, a, c, 0, 0);
6446 * Place the cursor at the collect position for visual mode
6448 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
6450 int i = (a & 0x7f) - attr_top;
6451 int j = c - char_left;
6456 /* Bigtile mode uses double width */
6457 if (use_bigtile) x += j;
6459 /* Place the cursor */
6465 * Clipboard variables for copy&paste in visual mode
6467 static byte attr_idx = 0;
6468 static byte char_idx = 0;
6470 /* Hack -- for feature lighting */
6471 static byte attr_idx_feat[F_LIT_MAX];
6472 static byte char_idx_feat[F_LIT_MAX];
6475 * Do visual mode command -- Change symbols
6477 static bool visual_mode_command(char ch, bool *visual_list_ptr,
6478 int height, int width,
6479 byte *attr_top_ptr, byte *char_left_ptr,
6480 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
6482 static byte attr_old = 0, char_old = 0;
6487 if (*visual_list_ptr)
6490 *cur_attr_ptr = attr_old;
6491 *cur_char_ptr = char_old;
6492 *visual_list_ptr = FALSE;
6500 if (*visual_list_ptr)
6503 *visual_list_ptr = FALSE;
6504 *need_redraw = TRUE;
6512 if (!*visual_list_ptr)
6514 *visual_list_ptr = TRUE;
6516 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6517 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6519 attr_old = *cur_attr_ptr;
6520 char_old = *cur_char_ptr;
6531 /* Set the visual */
6532 attr_idx = *cur_attr_ptr;
6533 char_idx = *cur_char_ptr;
6535 /* Hack -- for feature lighting */
6536 for (i = 0; i < F_LIT_MAX; i++)
6538 attr_idx_feat[i] = 0;
6539 char_idx_feat[i] = 0;
6546 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */
6549 *cur_attr_ptr = attr_idx;
6550 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
6551 if (!*visual_list_ptr) *need_redraw = TRUE;
6557 *cur_char_ptr = char_idx;
6558 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
6559 if (!*visual_list_ptr) *need_redraw = TRUE;
6565 if (*visual_list_ptr)
6568 int d = get_keymap_dir(ch);
6569 byte a = (*cur_attr_ptr & 0x7f);
6570 byte c = *cur_char_ptr;
6572 if (use_bigtile) eff_width = width / 2;
6573 else eff_width = width;
6575 /* Restrict direction */
6576 if ((a == 0) && (ddy[d] < 0)) d = 0;
6577 if ((c == 0) && (ddx[d] < 0)) d = 0;
6578 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
6579 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
6584 /* Force correct code for both ASCII character and tile */
6585 if (c & 0x80) a |= 0x80;
6587 /* Set the visual */
6592 /* Move the frame */
6593 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
6594 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
6595 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
6596 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
6602 /* Visual mode command is not used */
6608 * Display the monsters in a group.
6610 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
6611 int mon_cur, int mon_top, bool visual_only)
6615 /* Display lines until done */
6616 for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++)
6620 /* Get the race index */
6621 int r_idx = mon_idx[mon_top + i] ;
6623 /* Access the race */
6624 monster_race *r_ptr = &r_info[r_idx];
6626 /* Choose a color */
6627 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
6629 /* Display the name */
6630 c_prt(attr, (r_name + r_ptr->name), row + i, col);
6632 /* Hack -- visual_list mode */
6635 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61);
6637 if (p_ptr->wizard || visual_only)
6639 c_prt(attr, format("%d", r_idx), row + i, 62);
6642 /* Erase chars before overwritten by the race letter */
6643 Term_erase(69, row + i, 255);
6645 /* Display symbol */
6646 Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
6651 if (!(r_ptr->flags1 & RF1_UNIQUE))
6652 put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
6654 c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE),
6655 (r_ptr->max_num == 0 ? _("死亡", " dead") : _("生存", "alive")), row + i, 74);
6659 /* Clear remaining lines */
6660 for (; i < per_page; i++)
6662 Term_erase(col, row + i, 255);
6668 * Display known monsters.
6670 static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx)
6673 int grp_cur, grp_top, old_grp_cur;
6674 int mon_cur, mon_top;
6675 int grp_cnt, grp_idx[100];
6683 bool visual_list = FALSE;
6684 byte attr_top = 0, char_left = 0;
6692 Term_get_size(&wid, &hgt);
6694 browser_rows = hgt - 8;
6696 /* Allocate the "mon_idx" array */
6697 C_MAKE(mon_idx, max_r_idx, s16b);
6702 if (direct_r_idx < 0)
6704 mode = visual_only ? 0x03 : 0x01;
6706 /* Check every group */
6707 for (i = 0; monster_group_text[i] != NULL; i++)
6709 /* Measure the label */
6710 len = strlen(monster_group_text[i]);
6712 /* Save the maximum length */
6713 if (len > max) max = len;
6715 /* See if any monsters are known */
6716 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode))
6718 /* Build a list of groups with known monsters */
6719 grp_idx[grp_cnt++] = i;
6727 mon_idx[0] = direct_r_idx;
6730 /* Terminate the list */
6733 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
6734 &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw);
6737 /* Terminate the list */
6738 grp_idx[grp_cnt] = -1;
6741 grp_cur = grp_top = 0;
6742 mon_cur = mon_top = 0;
6747 mode = visual_only ? 0x02 : 0x00;
6752 monster_race *r_ptr;
6759 prt(format("%s - モンスター", !visual_only ? "知識" : "表示"), 2, 0);
6760 if (direct_r_idx < 0) prt("グループ", 4, 0);
6761 prt("名前", 4, max + 3);
6762 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6764 if (!visual_only) prt("殺害数", 4, 72);
6766 prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
6767 if (direct_r_idx < 0) prt("Group", 4, 0);
6768 prt("Name", 4, max + 3);
6769 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
6771 if (!visual_only) prt("Kills", 4, 73);
6774 for (i = 0; i < 78; i++)
6776 Term_putch(i, 5, TERM_WHITE, '=');
6779 if (direct_r_idx < 0)
6781 for (i = 0; i < browser_rows; i++)
6783 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
6790 if (direct_r_idx < 0)
6792 /* Scroll group list */
6793 if (grp_cur < grp_top) grp_top = grp_cur;
6794 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
6796 /* Display a list of monster groups */
6797 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
6799 if (old_grp_cur != grp_cur)
6801 old_grp_cur = grp_cur;
6803 /* Get a list of monsters in the current group */
6804 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode);
6807 /* Scroll monster list */
6808 while (mon_cur < mon_top)
6809 mon_top = MAX(0, mon_top - browser_rows/2);
6810 while (mon_cur >= mon_top + browser_rows)
6811 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
6816 /* Display a list of monsters in the current group */
6817 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
6823 /* Display a monster name */
6824 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
6826 /* Display visual list below first monster */
6827 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
6832 prt(format("<方向>%s%s%s, ESC",
6833 (!visual_list && !visual_only) ? ", 'r'で思い出を見る" : "",
6834 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
6835 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
6838 prt(format("<dir>%s%s%s, ESC",
6839 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
6840 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
6841 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
6845 /* Get the current monster */
6846 r_ptr = &r_info[mon_idx[mon_cur]];
6850 /* Mega Hack -- track this monster race */
6851 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
6853 /* Hack -- handle stuff */
6859 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
6863 Term_gotoxy(0, 6 + (grp_cur - grp_top));
6867 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
6872 /* Do visual mode command if needed */
6873 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))
6875 if (direct_r_idx >= 0)
6900 /* Recall on screen */
6901 if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0))
6903 screen_roff(mon_idx[mon_cur], 0);
6914 /* Move the cursor */
6915 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
6922 /* Free the "mon_idx" array */
6923 C_KILL(mon_idx, max_r_idx, s16b);
6928 * Display the objects in a group.
6930 static void display_object_list(int col, int row, int per_page, int object_idx[],
6931 int object_cur, int object_top, bool visual_only)
6935 /* Display lines until done */
6936 for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++)
6940 object_kind *flavor_k_ptr;
6942 /* Get the object index */
6943 int k_idx = object_idx[object_top + i];
6945 /* Access the object */
6946 object_kind *k_ptr = &k_info[k_idx];
6948 /* Choose a color */
6949 byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE);
6950 byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE);
6953 if (!visual_only && k_ptr->flavor)
6955 /* Appearance of this object is shuffled */
6956 flavor_k_ptr = &k_info[k_ptr->flavor];
6960 /* Appearance of this object is very normal */
6961 flavor_k_ptr = k_ptr;
6966 attr = ((i + object_top == object_cur) ? cursor : attr);
6968 if (!k_ptr->flavor || (!visual_only && k_ptr->aware))
6971 strip_name(o_name, k_idx);
6976 strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
6979 /* Display the name */
6980 c_prt(attr, o_name, row + i, col);
6982 /* Hack -- visual_list mode */
6985 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);
6987 if (p_ptr->wizard || visual_only)
6989 c_prt(attr, format("%d", k_idx), row + i, 70);
6992 a = flavor_k_ptr->x_attr;
6993 c = flavor_k_ptr->x_char;
6995 /* Display symbol */
6996 Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0);
6999 /* Clear remaining lines */
7000 for (; i < per_page; i++)
7002 Term_erase(col, row + i, 255);
7007 * Describe fake object
7009 static void desc_obj_fake(int k_idx)
7012 object_type object_type_body;
7014 /* Get local object */
7015 o_ptr = &object_type_body;
7017 /* Wipe the object */
7020 /* Create the artifact */
7021 object_prep(o_ptr, k_idx);
7023 /* It's fully know */
7024 o_ptr->ident |= IDENT_KNOWN;
7026 /* Track the object */
7027 /* object_actual_track(o_ptr); */
7029 /* Hack - mark as fake */
7030 /* term_obj_real = FALSE; */
7032 /* Hack -- Handle stuff */
7035 if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL))
7037 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
7045 * Display known objects
7047 static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx)
7050 int grp_cur, grp_top, old_grp_cur;
7051 int object_old, object_cur, object_top;
7052 int grp_cnt, grp_idx[100];
7060 bool visual_list = FALSE;
7061 byte attr_top = 0, char_left = 0;
7069 Term_get_size(&wid, &hgt);
7071 browser_rows = hgt - 8;
7073 /* Allocate the "object_idx" array */
7074 C_MAKE(object_idx, max_k_idx, int);
7079 if (direct_k_idx < 0)
7081 mode = visual_only ? 0x03 : 0x01;
7083 /* Check every group */
7084 for (i = 0; object_group_text[i] != NULL; i++)
7086 /* Measure the label */
7087 len = strlen(object_group_text[i]);
7089 /* Save the maximum length */
7090 if (len > max) max = len;
7092 /* See if any monsters are known */
7093 if (collect_objects(i, object_idx, mode))
7095 /* Build a list of groups with known monsters */
7096 grp_idx[grp_cnt++] = i;
7105 object_kind *k_ptr = &k_info[direct_k_idx];
7106 object_kind *flavor_k_ptr;
7108 if (!visual_only && k_ptr->flavor)
7110 /* Appearance of this object is shuffled */
7111 flavor_k_ptr = &k_info[k_ptr->flavor];
7115 /* Appearance of this object is very normal */
7116 flavor_k_ptr = k_ptr;
7119 object_idx[0] = direct_k_idx;
7120 object_old = direct_k_idx;
7123 /* Terminate the list */
7126 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7127 &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw);
7130 /* Terminate the list */
7131 grp_idx[grp_cnt] = -1;
7134 grp_cur = grp_top = 0;
7135 object_cur = object_top = 0;
7140 mode = visual_only ? 0x02 : 0x00;
7145 object_kind *k_ptr, *flavor_k_ptr;
7152 prt(format("%s - アイテム", !visual_only ? "知識" : "表示"), 2, 0);
7153 if (direct_k_idx < 0) prt("グループ", 4, 0);
7154 prt("名前", 4, max + 3);
7155 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7158 prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0);
7159 if (direct_k_idx < 0) prt("Group", 4, 0);
7160 prt("Name", 4, max + 3);
7161 if (p_ptr->wizard || visual_only) prt("Idx", 4, 70);
7165 for (i = 0; i < 78; i++)
7167 Term_putch(i, 5, TERM_WHITE, '=');
7170 if (direct_k_idx < 0)
7172 for (i = 0; i < browser_rows; i++)
7174 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7181 if (direct_k_idx < 0)
7183 /* Scroll group list */
7184 if (grp_cur < grp_top) grp_top = grp_cur;
7185 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7187 /* Display a list of object groups */
7188 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7190 if (old_grp_cur != grp_cur)
7192 old_grp_cur = grp_cur;
7194 /* Get a list of objects in the current group */
7195 object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
7198 /* Scroll object list */
7199 while (object_cur < object_top)
7200 object_top = MAX(0, object_top - browser_rows/2);
7201 while (object_cur >= object_top + browser_rows)
7202 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7207 /* Display a list of objects in the current group */
7208 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
7212 object_top = object_cur;
7214 /* Display a list of objects in the current group */
7215 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
7217 /* Display visual list below first object */
7218 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7221 /* Get the current object */
7222 k_ptr = &k_info[object_idx[object_cur]];
7224 if (!visual_only && k_ptr->flavor)
7226 /* Appearance of this object is shuffled */
7227 flavor_k_ptr = &k_info[k_ptr->flavor];
7231 /* Appearance of this object is very normal */
7232 flavor_k_ptr = k_ptr;
7237 prt(format("<方向>%s%s%s, ESC",
7238 (!visual_list && !visual_only) ? ", 'r'で詳細を見る" : "",
7239 visual_list ? ", ENTERで決定" : ", 'v'でシンボル変更",
7240 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7243 prt(format("<dir>%s%s%s, ESC",
7244 (!visual_list && !visual_only) ? ", 'r' to recall" : "",
7245 visual_list ? ", ENTER to accept" : ", 'v' for visuals",
7246 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7252 /* Mega Hack -- track this object */
7253 if (object_cnt) object_kind_track(object_idx[object_cur]);
7255 /* The "current" object changed */
7256 if (object_old != object_idx[object_cur])
7258 /* Hack -- handle stuff */
7261 /* Remember the "current" object */
7262 object_old = object_idx[object_cur];
7268 place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left);
7272 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7276 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
7281 /* Do visual mode command if needed */
7282 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))
7284 if (direct_k_idx >= 0)
7309 /* Recall on screen */
7310 if (!visual_list && !visual_only && (grp_cnt > 0))
7312 desc_obj_fake(object_idx[object_cur]);
7320 /* Move the cursor */
7321 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
7327 /* Free the "object_idx" array */
7328 C_KILL(object_idx, max_k_idx, int);
7333 * Display the features in a group.
7335 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
7336 int feat_cur, int feat_top, bool visual_only, int lighting_level)
7338 int lit_col[F_LIT_MAX], i, j;
7339 int f_idx_col = use_bigtile ? 62 : 64;
7341 /* Correct columns 1 and 4 */
7342 lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
7343 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7344 lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
7346 /* Display lines until done */
7347 for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
7352 int f_idx = feat_idx[feat_top + i];
7354 /* Access the index */
7355 feature_type *f_ptr = &f_info[f_idx];
7357 int row_i = row + i;
7359 /* Choose a color */
7360 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
7362 /* Display the name */
7363 c_prt(attr, f_name + f_ptr->name, row_i, col);
7365 /* Hack -- visual_list mode */
7368 /* Display lighting level */
7369 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
7371 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));
7373 if (p_ptr->wizard || visual_only)
7375 c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
7378 /* Display symbol */
7379 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);
7381 Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
7382 for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
7384 Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
7386 Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
7388 /* Mega-hack -- Use non-standard colour */
7389 for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
7391 Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
7395 /* Clear remaining lines */
7396 for (; i < per_page; i++)
7398 Term_erase(col, row + i, 255);
7404 * Interact with feature visuals.
7406 static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level)
7409 int grp_cur, grp_top, old_grp_cur;
7410 int feat_cur, feat_top;
7411 int grp_cnt, grp_idx[100];
7419 bool visual_list = FALSE;
7420 byte attr_top = 0, char_left = 0;
7425 byte attr_old[F_LIT_MAX];
7426 byte char_old[F_LIT_MAX];
7427 byte *cur_attr_ptr, *cur_char_ptr;
7429 (void)C_WIPE(attr_old, F_LIT_MAX, byte);
7430 (void)C_WIPE(char_old, F_LIT_MAX, byte);
7433 Term_get_size(&wid, &hgt);
7435 browser_rows = hgt - 8;
7437 /* Allocate the "feat_idx" array */
7438 C_MAKE(feat_idx, max_f_idx, int);
7443 if (direct_f_idx < 0)
7445 /* Check every group */
7446 for (i = 0; feature_group_text[i] != NULL; i++)
7448 /* Measure the label */
7449 len = strlen(feature_group_text[i]);
7451 /* Save the maximum length */
7452 if (len > max) max = len;
7454 /* See if any features are known */
7455 if (collect_features(i, feat_idx, 0x01))
7457 /* Build a list of groups with known features */
7458 grp_idx[grp_cnt++] = i;
7466 feature_type *f_ptr = &f_info[direct_f_idx];
7468 feat_idx[0] = direct_f_idx;
7471 /* Terminate the list */
7474 (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
7475 &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
7477 for (i = 0; i < F_LIT_MAX; i++)
7479 attr_old[i] = f_ptr->x_attr[i];
7480 char_old[i] = f_ptr->x_char[i];
7484 /* Terminate the list */
7485 grp_idx[grp_cnt] = -1;
7488 grp_cur = grp_top = 0;
7489 feat_cur = feat_top = 0;
7497 feature_type *f_ptr;
7504 prt("表示 - 地形", 2, 0);
7505 if (direct_f_idx < 0) prt("グループ", 4, 0);
7506 prt("名前", 4, max + 3);
7509 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7510 prt("文字 ( l/ d)", 4, 66);
7514 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7515 prt("文字 (l/d)", 4, 68);
7518 prt("Visuals - features", 2, 0);
7519 if (direct_f_idx < 0) prt("Group", 4, 0);
7520 prt("Name", 4, max + 3);
7523 if (p_ptr->wizard || visual_only) prt("Idx", 4, 62);
7524 prt("Sym ( l/ d)", 4, 67);
7528 if (p_ptr->wizard || visual_only) prt("Idx", 4, 64);
7529 prt("Sym (l/d)", 4, 69);
7533 for (i = 0; i < 78; i++)
7535 Term_putch(i, 5, TERM_WHITE, '=');
7538 if (direct_f_idx < 0)
7540 for (i = 0; i < browser_rows; i++)
7542 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7549 if (direct_f_idx < 0)
7551 /* Scroll group list */
7552 if (grp_cur < grp_top) grp_top = grp_cur;
7553 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7555 /* Display a list of feature groups */
7556 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
7558 if (old_grp_cur != grp_cur)
7560 old_grp_cur = grp_cur;
7562 /* Get a list of features in the current group */
7563 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00);
7566 /* Scroll feature list */
7567 while (feat_cur < feat_top)
7568 feat_top = MAX(0, feat_top - browser_rows/2);
7569 while (feat_cur >= feat_top + browser_rows)
7570 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
7575 /* Display a list of features in the current group */
7576 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
7580 feat_top = feat_cur;
7582 /* Display a list of features in the current group */
7583 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
7585 /* Display visual list below first object */
7586 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7591 prt(format("<方向>%s, 'd'で標準光源効果%s, ESC",
7592 visual_list ? ", ENTERで決定, 'a'で対象明度変更" : ", 'v'でシンボル変更",
7593 (attr_idx || char_idx) ? ", 'c', 'p'でペースト" : ", 'c'でコピー"),
7596 prt(format("<dir>%s, 'd' for default lighting%s, ESC",
7597 visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals",
7598 (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"),
7602 /* Get the current feature */
7603 f_ptr = &f_info[feat_idx[feat_cur]];
7604 cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
7605 cur_char_ptr = &f_ptr->x_char[*lighting_level];
7609 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
7613 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7617 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
7622 if (visual_list && ((ch == 'A') || (ch == 'a')))
7624 int prev_lighting_level = *lighting_level;
7628 if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
7629 else (*lighting_level)--;
7633 if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
7634 else (*lighting_level)++;
7637 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
7638 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7640 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
7641 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7646 else if ((ch == 'D') || (ch == 'd'))
7648 byte prev_x_attr = f_ptr->x_attr[*lighting_level];
7649 byte prev_x_char = f_ptr->x_char[*lighting_level];
7651 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
7655 if (prev_x_attr != f_ptr->x_attr[*lighting_level])
7656 attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
7658 if (prev_x_char != f_ptr->x_char[*lighting_level])
7659 char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
7661 else *need_redraw = TRUE;
7666 /* Do visual mode command if needed */
7667 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))
7671 /* Restore previous visual settings */
7673 for (i = 0; i < F_LIT_MAX; i++)
7675 f_ptr->x_attr[i] = attr_old[i];
7676 f_ptr->x_char[i] = char_old[i];
7683 if (direct_f_idx >= 0) flag = TRUE;
7684 else *lighting_level = F_LIT_STANDARD;
7687 /* Preserve current visual settings */
7690 for (i = 0; i < F_LIT_MAX; i++)
7692 attr_old[i] = f_ptr->x_attr[i];
7693 char_old[i] = f_ptr->x_char[i];
7695 *lighting_level = F_LIT_STANDARD;
7702 for (i = 0; i < F_LIT_MAX; i++)
7704 attr_idx_feat[i] = f_ptr->x_attr[i];
7705 char_idx_feat[i] = f_ptr->x_char[i];
7714 /* Allow TERM_DARK text */
7715 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
7717 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
7718 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
7736 /* Move the cursor */
7737 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
7743 /* Free the "feat_idx" array */
7744 C_KILL(feat_idx, max_f_idx, int);
7749 * List wanted monsters
7751 static void do_cmd_knowledge_kubi(void)
7756 char file_name[1024];
7759 /* Open a new file */
7760 fff = my_fopen_temp(file_name, 1024);
7762 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7769 bool listed = FALSE;
7772 fprintf(fff, "今日のターゲット : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "不明"));
7774 fprintf(fff, "賞金首リスト\n");
7776 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
7778 fprintf(fff, "List of wanted monsters\n");
7780 fprintf(fff, "----------------------------------------------\n");
7782 for (i = 0; i < MAX_KUBI; i++)
7784 if (kubi_r_idx[i] <= 10000)
7786 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
7794 fprintf(fff,"\n%s\n", _("賞金首はもう残っていません。", "There is no more wanted monster."));
7798 /* Close the file */
7801 /* Display the file contents */
7802 show_file(TRUE, file_name, _("賞金首の一覧", "Wanted monsters"), 0, 0);
7804 /* Remove the file */
7809 * List virtues & status
7811 static void do_cmd_knowledge_virtues(void)
7815 char file_name[1024];
7818 /* Open a new file */
7819 fff = my_fopen_temp(file_name, 1024);
7821 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7828 fprintf(fff, _("現在の属性 : %s\n\n", "Your alighnment : %s\n\n"), your_alignment());
7832 /* Close the file */
7835 /* Display the file contents */
7836 show_file(TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
7838 /* Remove the file */
7846 static void do_cmd_knowledge_dungeon(void)
7850 char file_name[1024];
7854 /* Open a new file */
7855 fff = my_fopen_temp(file_name, 1024);
7857 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7864 for (i = 1; i < max_d_idx; i++)
7868 if (!d_info[i].maxdepth) continue;
7869 if (!max_dlv[i]) continue;
7870 if (d_info[i].final_guardian)
7872 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
7874 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
7876 fprintf(fff, _("%c%-12s : %3d 階\n", "%c%-16s : level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
7880 /* Close the file */
7883 /* Display the file contents */
7884 show_file(TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
7886 /* Remove the file */
7891 * List virtues & status
7894 static void do_cmd_knowledge_stat(void)
7898 char file_name[1024];
7901 /* Open a new file */
7902 fff = my_fopen_temp(file_name, 1024);
7904 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
7911 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
7912 (2 * p_ptr->hitdie +
7913 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
7916 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
7917 else fprintf(fff, "現在の体力ランク : ???\n\n");
7918 fprintf(fff, "能力の最大値\n\n");
7920 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
7921 else fprintf(fff, "Your current Life Rating is ???.\n\n");
7922 fprintf(fff, "Limits of maximum stats\n\n");
7924 for (v_nr = 0; v_nr < 6; v_nr++)
7926 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);
7927 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
7933 /* Close the file */
7936 /* Display the file contents */
7937 show_file(TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
7939 /* Remove the file */
7945 * Print all active quests
7947 static void do_cmd_knowledge_quests_current(FILE *fff)
7950 char rand_tmp_str[120] = "\0";
7952 monster_race *r_ptr;
7954 int rand_level = 100;
7957 fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
7959 for (i = 1; i < max_quests; i++)
7961 if ((quest[i].status == QUEST_STATUS_TAKEN) ||
7962 ((quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER)) ||
7963 (quest[i].status == QUEST_STATUS_COMPLETED))
7965 /* Set the quest number temporary */
7966 int old_quest = p_ptr->inside_quest;
7969 /* Clear the text */
7970 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
7971 quest_text_line = 0;
7973 p_ptr->inside_quest = i;
7975 /* Get the quest text */
7976 init_flags = INIT_SHOW_TEXT;
7978 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
7980 /* Reset the old quest number */
7981 p_ptr->inside_quest = old_quest;
7983 /* No info from "silent" quests */
7984 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7988 if (quest[i].type != QUEST_TYPE_RANDOM)
7990 char note[80] = "\0";
7992 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
7994 switch (quest[i].type)
7996 case QUEST_TYPE_KILL_LEVEL:
7997 case QUEST_TYPE_KILL_ANY_LEVEL:
7998 r_ptr = &r_info[quest[i].r_idx];
7999 strcpy(name, r_name + r_ptr->name);
8000 if (quest[i].max_num > 1)
8003 sprintf(note," - %d 体の%sを倒す。(あと %d 体)",
8004 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8007 sprintf(note," - kill %d %s, have killed %d.",
8008 quest[i].max_num, name, quest[i].cur_num);
8012 sprintf(note,_(" - %sを倒す。", " - kill %s."),name);
8015 case QUEST_TYPE_FIND_ARTIFACT:
8018 artifact_type *a_ptr = &a_info[quest[i].k_idx];
8020 object_type *q_ptr = &forge;
8021 int k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
8022 object_prep(q_ptr, k_idx);
8023 q_ptr->name1 = quest[i].k_idx;
8024 q_ptr->ident = IDENT_STORE;
8025 object_desc(name, q_ptr, OD_NAME_ONLY);
8027 sprintf(note,_("\n - %sを見つけ出す。", "\n - Find out %s."), name);
8029 case QUEST_TYPE_FIND_EXIT:
8030 sprintf(note,_(" - 出口に到達する。", " - Reach to Exit."));
8033 case QUEST_TYPE_KILL_NUMBER:
8035 sprintf(note," - %d 体のモンスターを倒す。(あと %d 体)",
8036 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8038 sprintf(note," - Kill %d monsters, have killed %d.",
8039 quest[i].max_num, quest[i].cur_num);
8043 case QUEST_TYPE_KILL_ALL:
8044 case QUEST_TYPE_TOWER:
8045 sprintf(note,_(" - 全てのモンスターを倒す。", " - Kill all monsters."));
8050 /* Print the quest info */
8052 sprintf(tmp_str, " %s (危険度:%d階相当)%s\n",
8053 quest[i].name, quest[i].level, note);
8055 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8056 quest[i].name, quest[i].level, note);
8059 fputs(tmp_str, fff);
8061 if (quest[i].status == QUEST_STATUS_COMPLETED)
8063 sprintf(tmp_str, _(" クエスト達成 - まだ報酬を受けとってない。\n", " Quest Completed - Unrewarded\n"));
8064 fputs(tmp_str, fff);
8070 while (quest_text[j][0] && j < 10)
8072 fprintf(fff, " %s\n", quest_text[j]);
8077 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8080 rand_level = quest[i].level;
8082 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8084 /* Print the quest info */
8085 r_ptr = &r_info[quest[i].r_idx];
8086 strcpy(name, r_name + r_ptr->name);
8088 if (quest[i].max_num > 1)
8091 sprintf(rand_tmp_str," %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
8092 quest[i].name, quest[i].level,
8093 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8097 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8098 quest[i].name, quest[i].level,
8099 quest[i].max_num, name, quest[i].cur_num);
8105 sprintf(rand_tmp_str," %s (%d 階) - %sを倒す。\n",
8106 quest[i].name, quest[i].level, name);
8108 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8109 quest[i].name, quest[i].level, name);
8117 /* Print the current random quest */
8118 if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
8120 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8124 static bool do_cmd_knowledge_quests_aux(FILE *fff, int q_idx)
8127 char playtime_str[16];
8128 quest_type* const q_ptr = &quest[q_idx];
8130 if (is_fixed_quest_idx(q_idx))
8132 /* Set the quest number temporary */
8133 int old_quest = p_ptr->inside_quest;
8135 p_ptr->inside_quest = q_idx;
8138 init_flags = INIT_NAME_ONLY;
8140 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8142 /* Reset the old quest number */
8143 p_ptr->inside_quest = old_quest;
8145 /* No info from "silent" quests */
8146 if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
8149 strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
8150 q_ptr->comptime/(60*60), (q_ptr->comptime/60)%60, q_ptr->comptime%60);
8152 if (!is_fixed_quest_idx(q_idx) && q_ptr->r_idx)
8154 /* Print the quest info */
8155 if (q_ptr->complev == 0)
8158 _(" %-35s (%3d階) - 不戦勝 - %s\n",
8159 " %-35s (Dungeon level: %3d) - Unearned - %s\n") ,
8160 r_name+r_info[q_ptr->r_idx].name,
8161 q_ptr->level, playtime_str);
8166 _(" %-35s (%3d階) - レベル%2d - %s\n",
8167 " %-35s (Dungeon level: %3d) - level %2d - %s\n") ,
8168 r_name+r_info[q_ptr->r_idx].name,
8176 /* Print the quest info */
8178 _(" %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
8179 " %-35s (Danger level: %3d) - level %2d - %s\n") ,
8180 q_ptr->name, q_ptr->level, q_ptr->complev, playtime_str);
8183 fputs(tmp_str, fff);
8189 * Print all finished quests
8191 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8196 fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
8197 for (i = 1; i < max_quests; i++)
8199 int q_idx = quest_num[i];
8200 quest_type* const q_ptr = &quest[q_idx];
8202 if (q_ptr->status == QUEST_STATUS_FINISHED &&
8203 do_cmd_knowledge_quests_aux(fff, q_idx))
8208 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8213 * Print all failed quests
8215 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8220 fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
8221 for (i = 1; i < max_quests; i++)
8223 int q_idx = quest_num[i];
8224 quest_type* const q_ptr = &quest[q_idx];
8226 if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
8227 do_cmd_knowledge_quests_aux(fff, q_idx))
8232 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8237 * Print all random quests
8239 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8245 fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
8246 for (i = 1; i < max_quests; i++)
8248 /* No info from "silent" quests */
8249 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8251 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8255 /* Print the quest info */
8257 sprintf(tmp_str, " %s (%d階, %s)\n",
8258 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8260 sprintf(tmp_str, " %s (%d, %s)\n",
8261 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8263 fputs(tmp_str, fff);
8266 if (!total) fprintf(fff, _(" なし\n", " Nothing.\n"));
8270 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8272 int *q_num = (int *)u;
8273 quest_type *qa = &quest[q_num[a]];
8274 quest_type *qb = &quest[q_num[b]];
8279 return (qa->comptime <= qb->comptime);
8282 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8284 int *q_num = (int *)u;
8291 q_num[a] = q_num[b];
8297 * Print quest status of all active quests
8299 static void do_cmd_knowledge_quests(void)
8302 char file_name[1024];
8303 int *quest_num, dummy, i;
8305 /* Open a new file */
8306 fff = my_fopen_temp(file_name, 1024);
8309 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8314 /* Allocate Memory */
8315 C_MAKE(quest_num, max_quests, int);
8317 /* Sort by compete level */
8318 for (i = 1; i < max_quests; i++) quest_num[i] = i;
8319 ang_sort_comp = ang_sort_comp_quest_num;
8320 ang_sort_swap = ang_sort_swap_quest_num;
8321 ang_sort(quest_num, &dummy, max_quests);
8323 /* Dump Quest Information */
8324 do_cmd_knowledge_quests_current(fff);
8326 do_cmd_knowledge_quests_completed(fff, quest_num);
8328 do_cmd_knowledge_quests_failed(fff, quest_num);
8332 do_cmd_knowledge_quests_wiz_random(fff);
8335 /* Close the file */
8338 /* Display the file contents */
8339 show_file(TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
8341 /* Remove the file */
8345 C_KILL(quest_num, max_quests, int);
8352 static void do_cmd_knowledge_home(void)
8357 char file_name[1024];
8359 char o_name[MAX_NLEN];
8362 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
8364 /* Open a new file */
8365 fff = my_fopen_temp(file_name, 1024);
8367 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8374 /* Print all homes in the different towns */
8375 st_ptr = &town[1].store[STORE_HOME];
8377 /* Home -- if anything there */
8378 if (st_ptr->stock_num)
8383 /* Header with name of the town */
8384 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
8386 /* Dump all available items */
8387 for (i = 0; i < st_ptr->stock_num; i++)
8390 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
8391 object_desc(o_name, &st_ptr->stock[i], 0);
8392 if (strlen(o_name) <= 80-3)
8394 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8400 for (n = 0, t = o_name; n < 80-3; n++, t++)
8401 if(iskanji(*t)) {t++; n++;}
8402 if (n == 81-3) n = 79-3; /* 最後が漢字半分 */
8404 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
8405 fprintf(fff, " %.77s\n", o_name+n);
8408 object_desc(o_name, &st_ptr->stock[i], 0);
8409 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
8414 /* Add an empty line */
8415 fprintf(fff, "\n\n");
8419 /* Close the file */
8422 /* Display the file contents */
8423 show_file(TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
8425 /* Remove the file */
8431 * Check the status of "autopick"
8433 static void do_cmd_knowledge_autopick(void)
8437 char file_name[1024];
8439 /* Open a new file */
8440 fff = my_fopen_temp(file_name, 1024);
8444 msg_format(_("一時ファイル %s を作成できませんでした。", "Failed to create temporary file %s."), file_name);
8451 fprintf(fff, _("自動破壊/拾いには何も登録されていません。", "No preference for auto picker/destroyer."));
8455 fprintf(fff, _(" 自動拾い/破壊には現在 %d行登録されています。\n\n",
8456 " There are %d registered lines for auto picker/destroyer.\n\n"), max_autopick);
8459 for (k = 0; k < max_autopick; k++)
8462 byte act = autopick_list[k].action;
8463 if (act & DONT_AUTOPICK)
8465 tmp = _("放置", "Leave");
8467 else if (act & DO_AUTODESTROY)
8469 tmp = _("破壊", "Destroy");
8471 else if (act & DO_AUTOPICK)
8473 tmp = _("拾う", "Pickup");
8475 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
8477 tmp = _("確認", "Query");
8480 if (act & DO_DISPLAY)
8481 fprintf(fff, "%11s", format("[%s]", tmp));
8483 fprintf(fff, "%11s", format("(%s)", tmp));
8485 tmp = autopick_line_from_entry(&autopick_list[k]);
8486 fprintf(fff, " %s", tmp);
8490 /* Close the file */
8492 /* Display the file contents */
8493 show_file(TRUE, file_name, _("自動拾い/破壊 設定リスト", "Auto-picker/Destroyer"), 0, 0);
8495 /* Remove the file */
8501 * Interact with "knowledge"
8503 void do_cmd_knowledge(void)
8506 bool need_redraw = FALSE;
8508 /* File type is "TEXT" */
8509 FILE_TYPE(FILE_TYPE_TEXT);
8511 /* Save the screen */
8514 /* Interact until done */
8520 /* Ask for a choice */
8522 prt(format("%d/2 ページ", (p+1)), 2, 65);
8523 prt("現在の知識を確認する", 3, 0);
8525 prt(format("page %d/2", (p+1)), 2, 65);
8526 prt("Display current knowledge", 3, 0);
8529 /* Give some choices */
8533 prt("(1) 既知の伝説のアイテム の一覧", 6, 5);
8534 prt("(2) 既知のアイテム の一覧", 7, 5);
8535 prt("(3) 既知の生きているユニーク・モンスター の一覧", 8, 5);
8536 prt("(4) 既知のモンスター の一覧", 9, 5);
8537 prt("(5) 倒した敵の数 の一覧", 10, 5);
8538 if (!vanilla_town) prt("(6) 賞金首 の一覧", 11, 5);
8539 prt("(7) 現在のペット の一覧", 12, 5);
8540 prt("(8) 我が家のアイテム の一覧", 13, 5);
8541 prt("(9) *鑑定*済み装備の耐性 の一覧", 14, 5);
8542 prt("(0) 地形の表示文字/タイル の一覧", 15, 5);
8546 prt("(a) 自分に関する情報 の一覧", 6, 5);
8547 prt("(b) 突然変異 の一覧", 7, 5);
8548 prt("(c) 武器の経験値 の一覧", 8, 5);
8549 prt("(d) 魔法の経験値 の一覧", 9, 5);
8550 prt("(e) 技能の経験値 の一覧", 10, 5);
8551 prt("(f) プレイヤーの徳 の一覧", 11, 5);
8552 prt("(g) 入ったダンジョン の一覧", 12, 5);
8553 prt("(h) 実行中のクエスト の一覧", 13, 5);
8554 prt("(i) 現在の自動拾い/破壊設定 の一覧", 14, 5);
8559 prt("(1) Display known artifacts", 6, 5);
8560 prt("(2) Display known objects", 7, 5);
8561 prt("(3) Display remaining uniques", 8, 5);
8562 prt("(4) Display known monster", 9, 5);
8563 prt("(5) Display kill count", 10, 5);
8564 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
8565 prt("(7) Display current pets", 12, 5);
8566 prt("(8) Display home inventory", 13, 5);
8567 prt("(9) Display *identified* equip.", 14, 5);
8568 prt("(0) Display terrain symbols.", 15, 5);
8572 prt("(a) Display about yourself", 6, 5);
8573 prt("(b) Display mutations", 7, 5);
8574 prt("(c) Display weapon proficiency", 8, 5);
8575 prt("(d) Display spell proficiency", 9, 5);
8576 prt("(e) Display misc. proficiency", 10, 5);
8577 prt("(f) Display virtues", 11, 5);
8578 prt("(g) Display dungeons", 12, 5);
8579 prt("(h) Display current quests", 13, 5);
8580 prt("(i) Display auto pick/destroy", 14, 5);
8586 prt("ESC) 抜ける", 21, 1);
8587 prt("SPACE) 次ページ", 21, 30);
8588 /*prt("-) 前ページ", 21, 60);*/
8589 prt("コマンド:", 20, 0);
8591 prt("-more-", 17, 8);
8592 prt("ESC) Exit menu", 21, 1);
8593 prt("SPACE) Next page", 21, 30);
8594 /*prt("-) Previous page", 21, 60);*/
8595 prt("Command: ", 20, 0);
8602 if (i == ESCAPE) break;
8605 case ' ': /* Page change */
8609 case '1': /* Artifacts */
8610 do_cmd_knowledge_artifacts();
8612 case '2': /* Objects */
8613 do_cmd_knowledge_objects(&need_redraw, FALSE, -1);
8615 case '3': /* Uniques */
8616 do_cmd_knowledge_uniques();
8618 case '4': /* Monsters */
8619 do_cmd_knowledge_monsters(&need_redraw, FALSE, -1);
8621 case '5': /* Kill count */
8622 do_cmd_knowledge_kill_count();
8624 case '6': /* wanted */
8625 if (!vanilla_town) do_cmd_knowledge_kubi();
8627 case '7': /* Pets */
8628 do_cmd_knowledge_pets();
8630 case '8': /* Home */
8631 do_cmd_knowledge_home();
8633 case '9': /* Resist list */
8634 do_cmd_knowledge_inven();
8636 case '0': /* Feature list */
8638 int lighting_level = F_LIT_STANDARD;
8639 do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
8643 case 'a': /* Max stat */
8644 do_cmd_knowledge_stat();
8646 case 'b': /* Mutations */
8647 do_cmd_knowledge_mutations();
8649 case 'c': /* weapon-exp */
8650 do_cmd_knowledge_weapon_exp();
8652 case 'd': /* spell-exp */
8653 do_cmd_knowledge_spell_exp();
8655 case 'e': /* skill-exp */
8656 do_cmd_knowledge_skill_exp();
8658 case 'f': /* Virtues */
8659 do_cmd_knowledge_virtues();
8661 case 'g': /* Dungeon */
8662 do_cmd_knowledge_dungeon();
8664 case 'h': /* Quests */
8665 do_cmd_knowledge_quests();
8667 case 'i': /* Autopick */
8668 do_cmd_knowledge_autopick();
8670 default: /* Unknown option */
8674 /* Flush messages */
8678 /* Restore the screen */
8681 if (need_redraw) do_cmd_redraw();
8686 * Check on the status of an active quest
8688 void do_cmd_checkquest(void)
8690 /* File type is "TEXT" */
8691 FILE_TYPE(FILE_TYPE_TEXT);
8693 /* Save the screen */
8697 do_cmd_knowledge_quests();
8699 /* Restore the screen */
8705 * Display the time and date
8707 void do_cmd_time(void)
8709 int day, hour, min, full, start, end, num;
8717 extract_day_hour_min(&day, &hour, &min);
8719 full = hour * 100 + min;
8726 strcpy(desc, _("変な時刻だ。", "It is a strange time."));
8728 if (day < MAX_DAYS) sprintf(day_buf, "%d", day);
8729 else strcpy(day_buf, "*****");
8733 msg_format("%s日目, 時刻は%d:%02d %sです。",
8734 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8735 min, (hour < 12) ? "AM" : "PM");
8737 msg_format("This is day %s. The time is %d:%02d %s.",
8738 day_buf, (hour % 12 == 0) ? 12 : (hour % 12),
8739 min, (hour < 12) ? "AM" : "PM");
8744 if (!randint0(10) || p_ptr->image)
8746 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
8750 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
8753 /* Open this file */
8754 fff = my_fopen(buf, "rt");
8759 /* Find this time */
8760 while (!my_fgets(fff, buf, sizeof(buf)))
8762 /* Ignore comments */
8763 if (!buf[0] || (buf[0] == '#')) continue;
8765 /* Ignore invalid lines */
8766 if (buf[1] != ':') continue;
8768 /* Process 'Start' */
8771 /* Extract the starting time */
8772 start = atoi(buf + 2);
8774 /* Assume valid for an hour */
8784 /* Extract the ending time */
8785 end = atoi(buf + 2);
8791 /* Ignore incorrect range */
8792 if ((start > full) || (full > end)) continue;
8794 /* Process 'Description' */
8799 /* Apply the randomizer */
8800 if (!randint0(num)) strcpy(desc, buf + 2);
8810 /* Close the file */