4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
11 /* Purpose: Interface commands */
18 * A set of functions to maintain automatic dumps of various kinds.
21 * remove_auto_dump(orig_file, mark)
22 * Remove the old automatic dump of type "mark".
23 * auto_dump_printf(fmt, ...)
24 * Dump a formatted string using fprintf().
25 * open_auto_dump(buf, mark)
26 * Open a file, remove old dump, and add new header.
27 * close_auto_dump(void)
28 * Add a footer, and close the file.
30 * The dump commands of original Angband simply add new lines to
31 * existing files; these files will become bigger and bigger unless
32 * an user deletes some or all of these files by hand at some
35 * These three functions automatically delete old dumped lines
36 * before adding new ones. Since there are various kinds of automatic
37 * dumps in a single file, we add a header and a footer with a type
38 * name for every automatic dump, and kill old lines only when the
39 * lines have the correct type of header and footer.
41 * We need to be quite paranoid about correctness; the user might
42 * (mistakenly) edit the file by hand, and see all their work come
43 * to nothing on the next auto dump otherwise. The current code only
44 * detects changes by noting inconsistencies between the actual number
45 * of lines and the number written in the footer. Note that this will
46 * 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;
63 * Remove old lines automatically generated before.
65 static void remove_auto_dump(cptr orig_file)
67 FILE *tmp_fff, *orig_fff;
71 bool between_mark = FALSE;
74 long header_location = 0;
75 char header_mark_str[80];
76 char footer_mark_str[80];
79 /* Prepare a header/footer mark string */
80 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
81 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
83 mark_len = strlen(footer_mark_str);
85 /* Open an old dump file in read-only mode */
86 orig_fff = my_fopen(orig_file, "r");
88 /* If original file does not exist, nothing to do */
89 if (!orig_fff) return;
91 /* Open a new (temporary) file */
92 tmp_fff = my_fopen_temp(tmp_file, 1024);
97 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", tmp_file);
99 msg_format("Failed to create temporary file %s.", tmp_file);
105 /* Loop for every line */
109 if (my_fgets(orig_fff, buf, sizeof(buf)))
111 /* Read error: Assume End of File */
114 * Was looking for the footer, but not found.
116 * Since automatic dump might be edited by hand,
117 * it's dangerous to kill these lines.
118 * Seek back to the next line of the (pseudo) header,
123 fseek(orig_fff, header_location, SEEK_SET);
124 between_mark = FALSE;
128 /* Success -- End the loop */
135 /* We are looking for the header mark of automatic dump */
138 /* Is this line a header? */
139 if (!strcmp(buf, header_mark_str))
141 /* Memorise seek point of this line */
142 header_location = ftell(orig_fff);
144 /* Initialize counter for number of lines */
147 /* Look for the footer from now */
150 /* There are some changes */
157 /* Copy orginally lines */
158 fprintf(tmp_fff, "%s\n", buf);
162 /* We are looking for the footer mark of automatic dump */
165 /* Is this line a footer? */
166 if (!strncmp(buf, footer_mark_str, mark_len))
171 * Compare the number of lines
173 * If there is an inconsistency between
174 * actual number of lines and the
175 * number here, the automatic dump
176 * might be edited by hand. So it's
177 * dangerous to kill these lines.
178 * Seek back to the next line of the
179 * (pseudo) header, and read again.
181 if (!sscanf(buf + mark_len, " (%d)", &tmp)
184 fseek(orig_fff, header_location, SEEK_SET);
187 /* Look for another header */
188 between_mark = FALSE;
194 /* Ignore old line, and count number of lines */
204 /* If there are some changes, overwrite the original file with new one */
207 /* Copy contents of temporary file */
209 tmp_fff = my_fopen(tmp_file, "r");
210 orig_fff = my_fopen(orig_file, "w");
212 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
213 fprintf(orig_fff, "%s\n", buf);
219 /* Kill the temporary file */
227 * Dump a formatted line, using "vstrnfmt()".
229 static void auto_dump_printf(cptr fmt, ...)
236 /* Begin the Varargs Stuff */
239 /* Format the args, save the length */
240 (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
242 /* End the Varargs Stuff */
245 /* Count number of lines */
246 for (p = buf; *p; p++)
248 if (*p == '\n') auto_dump_line_num++;
252 fprintf(auto_dump_stream, "%s", buf);
257 * Open file to append auto dump.
259 static bool open_auto_dump(cptr buf, cptr mark)
262 char header_mark_str[80];
264 /* Save the mark string */
265 auto_dump_mark = mark;
267 /* Prepare a header mark string */
268 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
270 /* Remove old macro dumps */
271 remove_auto_dump(buf);
273 /* Append to the file */
274 auto_dump_stream = my_fopen(buf, "a");
277 if (!auto_dump_stream) {
279 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
281 msg_format("Failed to open %s.", buf);
290 fprintf(auto_dump_stream, "%s\n", header_mark_str);
292 /* Initialize counter */
293 auto_dump_line_num = 0;
296 auto_dump_printf("# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
297 auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
299 auto_dump_printf("# *Warning!* The lines below are an automatic dump.\n");
300 auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n");
308 * Append foot part and close auto dump.
310 static void close_auto_dump(void)
312 char footer_mark_str[80];
314 /* Prepare a footer mark string */
315 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
318 auto_dump_printf("# *·Ù¹ð!!* °Ê¾å¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
319 auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
321 auto_dump_printf("# *Warning!* The lines above are an automatic dump.\n");
322 auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n");
326 fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
329 my_fclose(auto_dump_stream);
337 * Return suffix of ordinal number
339 cptr get_ordinal_number_suffix(int num)
341 num = ABS(num) % 100;
345 return (num == 11) ? "th" : "st";
347 return (num == 12) ? "th" : "nd";
349 return (num == 13) ? "th" : "rd";
358 * Take note to the diary.
360 errr do_cmd_write_nikki(int type, int num, cptr note)
366 cptr note_level = "";
367 bool do_level = TRUE;
368 char note_level_buf[40];
371 static bool disable_nikki = FALSE;
373 extract_day_hour_min(&day, &hour, &min);
375 if (disable_nikki) return(-1);
377 if (type == NIKKI_FIX_QUEST_C ||
378 type == NIKKI_FIX_QUEST_F ||
379 type == NIKKI_RAND_QUEST_C ||
380 type == NIKKI_RAND_QUEST_F ||
381 type == NIKKI_TO_QUEST)
385 old_quest = p_ptr->inside_quest;
386 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
388 /* Get the quest text */
389 init_flags = INIT_ASSIGN;
391 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
393 /* Reset the old quest number */
394 p_ptr->inside_quest = old_quest;
398 sprintf(file_name,"playrecord-%s.txt",savefile_base);
400 /* different filne name to avoid mixing */
401 sprintf(file_name,"playrec-%s.txt",savefile_base);
404 /* Build the filename */
405 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
407 /* File type is "TEXT" */
408 FILE_TYPE(FILE_TYPE_TEXT);
410 fff = my_fopen(buf, "a");
416 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¥×¥ì¥¤µÏ¿¤ò°ì»þÄä»ß¤·¤Þ¤¹¡£", buf);
418 msg_format("Failed to open %s. Play-Record is disabled temporally.", buf);
425 q_idx = quest_number(dun_level);
429 if (p_ptr->inside_arena)
431 note_level = "¥¢¥ê¡¼¥Ê:";
433 note_level = "Arane:";
437 note_level = "ÃϾå:";
439 note_level = "Surface:";
441 else if (q_idx && (is_fixed_quest_idx(q_idx)
442 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
444 note_level = "¥¯¥¨¥¹¥È:";
446 note_level = "Quest:";
451 sprintf(note_level_buf, "%d³¬(%s):", dun_level, d_name+d_info[dungeon_type].name);
453 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, dun_level);
455 note_level = note_level_buf;
464 fprintf(fff, "%dÆüÌÜ\n",day);
466 fprintf(fff, "Day %d\n",day);
475 fprintf(fff, "%s\n",note);
479 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
485 fprintf(fff, " %2d:%02d %20s %s¤òȯ¸«¤·¤¿¡£\n", hour, min, note_level, note);
487 fprintf(fff, " %2d:%02d %20s discovered %s.\n", hour, min, note_level, note);
494 fprintf(fff, " %2d:%02d %20s %s¤òÅݤ·¤¿¡£\n", hour, min, note_level, note);
496 fprintf(fff, " %2d:%02d %20s defeated %s.\n", hour, min, note_level, note);
500 case NIKKI_FIX_QUEST_C:
502 if (quest[num].flags & QUEST_FLAG_SILENT) break;
504 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
506 fprintf(fff, " %2d:%02d %20s completed quest '%s'.\n", hour, min, note_level, quest[num].name);
510 case NIKKI_FIX_QUEST_F:
512 if (quest[num].flags & QUEST_FLAG_SILENT) break;
514 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤«¤éÌ¿¤«¤é¤¬¤éƨ¤²µ¢¤Ã¤¿¡£\n", hour, min, note_level, quest[num].name);
516 fprintf(fff, " %2d:%02d %20s run away from quest '%s'.\n", hour, min, note_level, quest[num].name);
520 case NIKKI_RAND_QUEST_C:
523 strcpy(name, r_name+r_info[quest[num].r_idx].name);
525 fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, name);
527 fprintf(fff, " %2d:%02d %20s completed randome quest '%s'\n", hour, min, note_level, name);
531 case NIKKI_RAND_QUEST_F:
534 strcpy(name, r_name+r_info[quest[num].r_idx].name);
536 fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤«¤éƨ¤²½Ð¤·¤¿¡£\n", hour, min, note_level, name);
538 fprintf(fff, " %2d:%02d %20s ran away from quest '%s'.\n", hour, min, note_level, name);
542 case NIKKI_MAXDEAPTH:
545 fprintf(fff, " %2d:%02d %20s %s¤ÎºÇ¿¼³¬%d³¬¤ËÅþ㤷¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, num);
547 fprintf(fff, " %2d:%02d %20s reached level %d of %s for the first time.\n", hour, min, note_level, num, d_name+d_info[dungeon_type].name);
554 fprintf(fff, " %2d:%02d %20s %s%s¤ÎºÇ¿¼³¬¤ò%d³¬¤Ë¥»¥Ã¥È¤·¤¿¡£\n", hour, min, note_level, note, d_name + d_info[num].name, max_dlv[num]);
556 fprintf(fff, " %2d:%02d %20s reset recall level of %s to %d %s.\n", hour, min, note_level, d_name + d_info[num].name, max_dlv[num], note);
563 if (q_idx && (is_fixed_quest_idx(q_idx)
564 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
575 if (!(dun_level+num)) to = "ÃϾå";
576 else to = format("%d³¬", dun_level+num);
578 if (!(dun_level+num)) to = "the surface";
579 else to = format("level %d", dun_level+num);
584 fprintf(fff, " %2d:%02d %20s %s¤Ø%s¡£\n", hour, min, note_level, to, note);
586 fprintf(fff, " %2d:%02d %20s %s %s.\n", hour, min, note_level, note, to);
594 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤Æ%s¤Î%d³¬¤Ø²¼¤ê¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, max_dlv[dungeon_type]);
596 fprintf(fff, " %2d:%02d %20s recalled to dungeon level %d of %s.\n", hour, min, note_level, max_dlv[dungeon_type], d_name+d_info[dungeon_type].name);
600 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤ÆÃϾå¤Ø¤ÈÌá¤Ã¤¿¡£\n", hour, min, note_level);
602 fprintf(fff, " %2d:%02d %20s recalled from dungeon to surface.\n", hour, min, note_level);
608 if (quest[num].flags & QUEST_FLAG_SILENT) break;
610 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤Ø¤ÈÆÍÆþ¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
612 fprintf(fff, " %2d:%02d %20s entered the quest '%s'.\n", hour, min, note_level, quest[num].name);
619 fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¡¦¥Æ¥ì¥Ý¡¼¥È¤Çæ½Ð¤·¤¿¡£\n", hour, min, note_level);
621 fprintf(fff, " %2d:%02d %20s Got out using teleport level.\n", hour, min, note_level);
628 fprintf(fff, " %2d:%02d %20s %s¤ò¹ØÆþ¤·¤¿¡£\n", hour, min, note_level, note);
630 fprintf(fff, " %2d:%02d %20s bought %s.\n", hour, min, note_level, note);
637 fprintf(fff, " %2d:%02d %20s %s¤òÇäµÑ¤·¤¿¡£\n", hour, min, note_level, note);
639 fprintf(fff, " %2d:%02d %20s sold %s.\n", hour, min, note_level, note);
648 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï¤Ç¡¢%s¤ÎÁ°¤ËÇÔ¤ìµî¤Ã¤¿¡£\n", hour, min, note_level, -num, note);
651 fprintf(fff, " %2d:%02d %20s beaten by %s in the %d%s fight.\n", hour, min, note_level, note, n, get_ordinal_number_suffix(n));
656 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï(%s)¤Ë¾¡Íø¤·¤¿¡£\n", hour, min, note_level, num, note);
658 fprintf(fff, " %2d:%02d %20s won the %d%s fight (%s).\n", hour, min, note_level, num, get_ordinal_number_suffix(num), note);
660 if (num == MAX_ARENA_MONS)
663 fprintf(fff, " Æ®µ»¾ì¤Î¤¹¤Ù¤Æ¤ÎŨ¤Ë¾¡Íø¤·¡¢¥Á¥ã¥ó¥Ô¥ª¥ó¤È¤Ê¤Ã¤¿¡£\n");
665 fprintf(fff, " won all fight to become a Chanpion.\n");
674 fprintf(fff, " %2d:%02d %20s %s¤ò¼±Ê̤·¤¿¡£\n", hour, min, note_level, note);
676 fprintf(fff, " %2d:%02d %20s identified %s.\n", hour, min, note_level, note);
691 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
693 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
697 fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥¦¥£¥¶¡¼¥É¡¦¥Æ¥ì¥Ý¡¼¥È¤Ç°ÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
699 fprintf(fff, " %2d:%02d %20s wizard-teleport to %s.\n", hour, min, note_level, to);
714 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
716 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
720 fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥Ñ¥¿¡¼¥ó¤ÎÎϤǰÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
722 fprintf(fff, " %2d:%02d %20s used Pattern to teleport to %s.\n", hour, min, note_level, to);
729 fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¤¬%d¤Ë¾å¤¬¤Ã¤¿¡£\n", hour, min, note_level, num);
731 fprintf(fff, " %2d:%02d %20s reached player level %d.\n", hour, min, note_level, num);
735 case NIKKI_GAMESTART:
737 time_t ct = time((time_t*)0);
741 fprintf(fff, "%s %s",note, ctime(&ct));
744 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
747 case NIKKI_NAMED_PET:
749 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
754 fprintf(fff, "%s¤òι¤Îͧ¤Ë¤¹¤ë¤³¤È¤Ë·è¤á¤¿¡£\n", note);
756 fprintf(fff, "decided to travel together with %s.\n", note);
761 fprintf(fff, "%s¤Î̾Á°¤ò¾Ã¤·¤¿¡£\n", note);
763 fprintf(fff, "unnamed %s.\n", note);
768 fprintf(fff, "%s¤ò²òÊü¤·¤¿¡£\n", note);
770 fprintf(fff, "dismissed %s.\n", note);
775 fprintf(fff, "%s¤¬»à¤ó¤Ç¤·¤Þ¤Ã¤¿¡£\n", note);
777 fprintf(fff, "%s died.\n", note);
782 fprintf(fff, "%s¤ò¤ª¤¤¤ÆÊ̤ΥޥåפذÜÆ°¤·¤¿¡£\n", note);
784 fprintf(fff, "moved to another map leaving %s behind.\n", note);
789 fprintf(fff, "%s¤È¤Ï¤°¤ì¤Æ¤·¤Þ¤Ã¤¿¡£\n", note);
791 fprintf(fff, "lost sight of %s.\n", note);
796 fprintf(fff, "%s¤¬*Ç˲õ*¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note);
798 fprintf(fff, "%s was made disappeared by *destruction*.\n", note);
803 fprintf(fff, "%s¤¬´äÀФ˲¡¤·ÄÙ¤µ¤ì¤¿¡£\n", note);
805 fprintf(fff, "%s was crushed by falling rocks.\n", note);
820 if (do_level) write_level = FALSE;
826 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
828 static void do_cmd_disp_nikki(void)
830 char nikki_title[256];
835 static const char subtitle[][30] = {"ºÇ¶¯¤ÎÆùÂΤòµá¤á¤Æ",
836 "¿ÍÀ¸¤½¤ì¤Ï¤Ï¤«¤Ê¤¤",
847 "Åݤ¹¤Ù¤Å¨¤Ï¥²¡û¥Ä",
848 "¤ó¡Á¡©Ê¹¤³¤¨¤ó¤Ê¤¡",
849 "¥ª¥ì¤Î̾¤ò¸À¤Ã¤Æ¤ß¤í",
850 "Ƭ¤¬ÊѤˤʤäÁ¤ã¤Ã¤¿",
855 "¤³¤ó¤Ê¤â¤ó¤¸¤ã¤Ê¤¤",
864 "ºÇ¹â¤ÎƬǾ¤òµá¤á¤Æ"};
866 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
867 "Attack is the best form of defence.",
869 "An unexpected windfall",
870 "A drowning man will catch at a straw",
871 "Don't count your chickens before they are hatched.",
872 "It is no use crying over spilt milk.",
873 "Seeing is believing.",
874 "Strike the iron while it is hot.",
875 "I don't care what follows.",
876 "To dig a well to put out a house on fire.",
877 "Tomorrow is another day.",
878 "Easy come, easy go.",
879 "The more haste, the less speed.",
880 "Where there is life, there is hope.",
881 "There is no royal road to *WINNER*.",
882 "Danger past, God forgotten.",
883 "The best thing to do now is to run away.",
884 "Life is but an empty dream.",
885 "Dead men tell no tales.",
886 "A book that remains shut is but a block.",
887 "Misfortunes never come singly.",
888 "A little knowledge is a dangerous thing.",
889 "History repeats itself.",
890 "*WINNER* was not built in a day.",
891 "Ignorance is bliss.",
892 "To lose is to win?",
893 "No medicine can cure folly.",
894 "All good things come to an end.",
895 "M$ Empire strikes back.",
896 "To see is to believe",
898 "Quest of The World's Greatest Brain"};
901 sprintf(file_name,"playrecord-%s.txt",savefile_base);
903 sprintf(file_name,"playrec-%s.txt",savefile_base);
906 /* Build the filename */
907 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
909 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
910 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
911 else if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
912 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
913 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
916 sprintf(nikki_title, "¡Ö%s%s%s¤ÎÅÁÀâ -%s-¡×",
917 ap_ptr->title, ap_ptr->no ? "¤Î" : "", player_name, tmp);
919 sprintf(nikki_title, "Legend of %s %s '%s'",
920 ap_ptr->title, player_name, tmp);
923 /* Display the file contents */
924 show_file(FALSE, buf, nikki_title, -1, 0);
927 static void do_cmd_bunshou(void)
930 char bunshou[80] = "\0";
933 if (get_string("ÆâÍÆ: ", tmp, 79))
935 if (get_string("diary note: ", tmp, 79))
938 strcpy(bunshou, tmp);
940 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
944 static void do_cmd_last_get(void)
949 if (record_o_name[0] == '\0') return;
952 sprintf(buf,"%s¤ÎÆþ¼ê¤òµÏ¿¤·¤Þ¤¹¡£",record_o_name);
954 sprintf(buf,"Do you really want to record getting %s? ",record_o_name);
956 if (!get_check(buf)) return;
961 sprintf(buf,"%s¤ò¼ê¤ËÆþ¤ì¤¿¡£", record_o_name);
963 sprintf(buf,"descover %s.", record_o_name);
965 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
969 static void do_cmd_erase_nikki(void)
976 if (!get_check("ËÜÅö¤ËµÏ¿¤ò¾Ãµî¤·¤Þ¤¹¤«¡©")) return;
978 if (!get_check("Do you really want to delete all your record? ")) return;
982 sprintf(file_name,"playrecord-%s.txt",savefile_base);
984 sprintf(file_name,"playrec-%s.txt",savefile_base);
987 /* Build the filename */
988 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
990 /* Remove the file */
993 fff = my_fopen(buf, "w");
997 msg_format("µÏ¿¤ò¾Ãµî¤·¤Þ¤·¤¿¡£");
999 msg_format("deleted record.");
1003 msg_format("%s ¤Î¾Ãµî¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", buf);
1005 msg_format("failed to delete %s.", buf);
1012 void do_cmd_nikki(void)
1016 /* File type is "TEXT" */
1017 FILE_TYPE(FILE_TYPE_TEXT);
1019 /* Save the screen */
1022 /* Interact until done */
1028 /* Ask for a choice */
1030 prt("[ µÏ¿¤ÎÀßÄê ]", 2, 0);
1032 prt("[ Play Record ]", 2, 0);
1036 /* Give some choices */
1038 prt("(1) µÏ¿¤ò¸«¤ë", 4, 5);
1039 prt("(2) ʸ¾Ï¤òµÏ¿¤¹¤ë", 5, 5);
1040 prt("(3) ľÁ°¤ËÆþ¼êËô¤Ï´ÕÄꤷ¤¿¤â¤Î¤òµÏ¿¤¹¤ë", 6, 5);
1041 prt("(4) µÏ¿¤ò¾Ãµî¤¹¤ë", 7, 5);
1043 prt("(1) Display your record", 4, 5);
1044 prt("(2) Add record", 5, 5);
1045 prt("(3) Record item you last get/identify", 6, 5);
1046 prt("(4) Delete your record", 7, 5);
1052 prt("¥³¥Þ¥ó¥É:", 18, 0);
1054 prt("Command: ", 18, 0);
1062 if (i == ESCAPE) break;
1067 do_cmd_disp_nikki();
1076 do_cmd_erase_nikki();
1078 default: /* Unknown option */
1082 /* Flush messages */
1086 /* Restore the screen */
1091 * Hack -- redraw the screen
1093 * This command performs various low level updates, clears all the "extra"
1094 * windows, does a total redraw of the main window, and requests all of the
1095 * interesting updates and redraws that I can think of.
1097 * This command is also used to "instantiate" the results of the user
1098 * selecting various things, such as graphics mode, so it must call
1099 * the "TERM_XTRA_REACT" hook before redrawing the windows.
1101 void do_cmd_redraw(void)
1108 /* Hack -- react to changes */
1109 Term_xtra(TERM_XTRA_REACT, 0);
1112 /* Combine and Reorder the pack (later) */
1113 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
1117 p_ptr->update |= (PU_TORCH);
1120 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
1122 /* Forget lite/view */
1123 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
1125 /* Update lite/view */
1126 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
1128 /* Update monsters */
1129 p_ptr->update |= (PU_MONSTERS);
1131 /* Redraw everything */
1132 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1135 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1138 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1142 /* Hack -- update */
1145 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1148 /* Redraw every window */
1149 for (j = 0; j < 8; j++)
1152 if (!angband_term[j]) continue;
1155 Term_activate(angband_term[j]);
1170 * Hack -- change name
1172 void do_cmd_change_name(void)
1181 /* Save the screen */
1189 /* Display the player */
1190 display_player(mode);
1195 display_player(mode);
1200 Term_putstr(2, 23, -1, TERM_WHITE,
1201 "['c'¤Ç̾Á°Êѹ¹, 'f'¤Ç¥Õ¥¡¥¤¥ë¤Ø½ñ½Ð, 'h'¤Ç¥â¡¼¥ÉÊѹ¹, ESC¤Ç½ªÎ»]");
1203 Term_putstr(2, 23, -1, TERM_WHITE,
1204 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1212 if (c == ESCAPE) break;
1219 /* Process the player name */
1220 process_player_name(FALSE);
1226 sprintf(tmp, "%s.txt", player_base);
1228 if (get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
1230 if (get_string("File name: ", tmp, 80))
1234 if (tmp[0] && (tmp[0] != ' '))
1236 file_character(tmp);
1253 /* Flush messages */
1257 /* Restore the screen */
1260 /* Redraw everything */
1261 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1268 * Recall the most recent message
1270 void do_cmd_message_one(void)
1272 /* Recall one message XXX XXX XXX */
1273 prt(format("> %s", message_str(0)), 0, 0);
1278 * Show previous messages to the user -BEN-
1280 * The screen format uses line 0 and 23 for headers and prompts,
1281 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1283 * This command shows you which commands you are viewing, and allows
1284 * you to "search" for strings in the recall.
1286 * Note that messages may be longer than 80 characters, but they are
1287 * displayed using "infinite" length, with a special sub-command to
1288 * "slide" the virtual display to the left or right.
1290 * Attempt to only hilite the matching portions of the string.
1292 void do_cmd_messages(int num_now)
1302 Term_get_size(&wid, &hgt);
1304 /* Number of message lines in a screen */
1305 num_lines = hgt - 4;
1314 /* Total messages */
1317 /* Start on first message */
1320 /* Save the screen */
1326 /* Process requests until done */
1332 /* Dump up to 20 lines of messages */
1333 for (j = 0; (j < num_lines) && (i + j < n); j++)
1335 cptr msg = message_str(i+j);
1337 /* Dump the messages, bottom to top */
1338 c_prt((i+j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1340 /* Hilite "shower" */
1345 /* Display matches */
1346 while ((str = my_strstr(str, shower)) != NULL)
1348 int len = strlen(shower);
1350 /* Display the match */
1351 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1359 /* Erase remaining lines */
1360 for (; j < num_lines; j++)
1362 Term_erase(0, num_lines + 1 - j, 255);
1365 /* Display header XXX XXX XXX */
1368 prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d)",
1369 i, i+j-1, n), 0, 0);
1371 prt(format("Message Recall (%d-%d of %d)",
1372 i, i+j-1, n), 0, 0);
1376 /* Display prompt (not very informative) */
1378 prt("[ 'p' ¤Ç¹¹¤Ë¸Å¤¤¤â¤Î, 'n' ¤Ç¹¹¤Ë¿·¤·¤¤¤â¤Î, '/' ¤Ç¸¡º÷, ESC ¤ÇÃæÃÇ ]", hgt - 1, 0);
1380 prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0);
1385 skey = inkey_special(TRUE);
1387 /* Exit on Escape */
1388 if (skey == ESCAPE) break;
1390 /* Hack -- Save the old index */
1393 /* Hack -- handle show */
1398 prt("¶¯Ä´: ", hgt - 1, 0);
1400 prt("Show: ", hgt - 1, 0);
1404 /* Get a "shower" string, or continue */
1405 if (!askfor(shower, 80)) continue;
1411 /* Hack -- handle find */
1412 if (skey == '/' || skey == KTRL('s'))
1418 prt("¸¡º÷: ", hgt - 1, 0);
1420 prt("Find: ", hgt - 1, 0);
1424 /* Get a "finder" string, or continue */
1425 if (!askfor(finder, 80)) continue;
1428 strcpy(shower, finder);
1431 for (z = i + 1; z < n; z++)
1433 cptr msg = message_str(z);
1436 if (my_strstr(msg, finder))
1447 /* Recall 1 older message */
1448 if (skey == SKEY_TOP)
1450 /* Go to the oldest line */
1454 /* Recall 1 newer message */
1455 if (skey == SKEY_BOTTOM)
1457 /* Go to the newest line */
1461 /* Recall 1 older message */
1462 if (skey == '8' || skey == SKEY_UP || skey == '\n' || skey == '\r')
1464 /* Go older if legal */
1465 i = MIN(i + 1, n - num_lines);
1468 /* Recall 10 older messages */
1471 /* Go older if legal */
1472 i = MIN(i + 10, n - num_lines);
1475 /* Recall 20 older messages */
1476 if (skey == 'p' || skey == KTRL('P') || skey == ' ' || skey == SKEY_PGUP)
1478 /* Go older if legal */
1479 i = MIN(i + num_lines, n - num_lines);
1482 /* Recall 20 newer messages */
1483 if (skey == 'n' || skey == KTRL('N') || skey == SKEY_PGDOWN)
1485 /* Go newer (if able) */
1486 i = MAX(0, i - num_lines);
1489 /* Recall 10 newer messages */
1492 /* Go newer (if able) */
1496 /* Recall 1 newer messages */
1497 if (skey == '2' || skey == SKEY_DOWN)
1499 /* Go newer (if able) */
1503 /* Hack -- Error of some kind */
1507 /* Restore the screen */
1514 * Number of cheating options
1521 static option_type cheat_info[CHEAT_MAX] =
1523 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1525 "cheat_peek", "¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1527 "cheat_peek", "Peek into object creation"
1531 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1533 "cheat_hear", "¥â¥ó¥¹¥¿¡¼¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1535 "cheat_hear", "Peek into monster creation"
1539 { &cheat_room, FALSE, 255, 0x04, 0x00,
1541 "cheat_room", "¥À¥ó¥¸¥ç¥ó¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1543 "cheat_room", "Peek into dungeon creation"
1547 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1549 "cheat_xtra", "¤½¤Î¾¤Î»ö¤ò¤Î¤¾¤¸«¤ë"
1551 "cheat_xtra", "Peek into something else"
1555 { &cheat_know, FALSE, 255, 0x10, 0x00,
1557 "cheat_know", "´°Á´¤Ê¥â¥ó¥¹¥¿¡¼¤Î»×¤¤½Ð¤òÃΤë"
1559 "cheat_know", "Know complete monster info"
1563 { &cheat_live, FALSE, 255, 0x20, 0x00,
1565 "cheat_live", "»à¤ò²óÈò¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤¹¤ë"
1567 "cheat_live", "Allow player to avoid death"
1571 { &cheat_save, FALSE, 255, 0x40, 0x00,
1573 "cheat_save", "»à¤ó¤À»þ¥»¡¼¥Ö¤¹¤ë¤«³Îǧ¤¹¤ë"
1575 "cheat_save", "Ask for saving death"
1581 * Interact with some options for cheating
1583 static void do_cmd_options_cheat(cptr info)
1587 int i, k = 0, n = CHEAT_MAX;
1595 /* Interact with the player */
1600 /* Prompt XXX XXX XXX */
1602 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, ESC ¤Ç·èÄê )", info);
1604 sprintf(buf, "%s (RET to advance, y/n to set, ESC to accept) ", info);
1610 /* º¾µ½¥ª¥×¥·¥ç¥ó¤ò¤¦¤Ã¤«¤ê¤¤¤¸¤Ã¤Æ¤·¤Þ¤¦¿Í¤¬¤¤¤ë¤è¤¦¤Ê¤Î¤ÇÃí°Õ */
1611 prt(" << Ãí°Õ >>", 11, 0);
1612 prt(" º¾µ½¥ª¥×¥·¥ç¥ó¤ò°ìÅ٤ǤâÀßÄꤹ¤ë¤È¡¢¥¹¥³¥¢µÏ¿¤¬»Ä¤é¤Ê¤¯¤Ê¤ê¤Þ¤¹¡ª", 12, 0);
1613 prt(" ¸å¤Ë²ò½ü¤·¤Æ¤â¥À¥á¤Ç¤¹¤Î¤Ç¡¢¾¡Íø¼Ô¤òÌܻؤ¹Êý¤Ï¤³¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¤", 13, 0);
1614 prt(" ¤¸¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£", 14, 0);
1616 /* Display the options */
1617 for (i = 0; i < n; i++)
1619 byte a = TERM_WHITE;
1621 /* Color current option */
1622 if (i == k) a = TERM_L_BLUE;
1624 /* Display the option text */
1625 sprintf(buf, "%-48s: %s (%s)",
1626 cheat_info[i].o_desc,
1628 (*cheat_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1630 (*cheat_info[i].o_var ? "yes" : "no "),
1633 cheat_info[i].o_text);
1634 c_prt(a, buf, i + 2, 0);
1637 /* Hilite current option */
1638 move_cursor(k + 2, 50);
1644 * HACK - Try to translate the key into a direction
1645 * to allow using the roguelike keys for navigation.
1647 dir = get_keymap_dir(ch);
1648 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1662 k = (n + k - 1) % n;
1681 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "º¾µ½¥ª¥×¥·¥ç¥ó¤òON¤Ë¤·¤Æ¡¢¥¹¥³¥¢¤ò»Ä¤»¤Ê¤¯¤Ê¤Ã¤¿¡£");
1683 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "give up sending score to use cheating options.");
1685 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1686 (*cheat_info[k].o_var) = TRUE;
1695 (*cheat_info[k].o_var) = FALSE;
1703 strnfmt(buf, sizeof(buf), "joption.txt#%s", cheat_info[k].o_text);
1705 strnfmt(buf, sizeof(buf), "option.txt#%s", cheat_info[k].o_text);
1707 /* Peruse the help file */
1708 (void)show_file(TRUE, buf, NULL, 0, 0);
1724 static option_type autosave_info[2] =
1726 { &autosave_l, FALSE, 255, 0x01, 0x00,
1728 "autosave_l", "¿·¤·¤¤³¬¤ËÆþ¤ëÅ٤˼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1730 "autosave_l", "Autosave when entering new levels" },
1734 { &autosave_t, FALSE, 255, 0x02, 0x00,
1736 "autosave_t", "°ìÄ꥿¡¼¥óËè¤Ë¼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1738 "autosave_t", "Timed autosave" },
1744 static s16b toggle_frequency(s16b current)
1749 case 50: return 100;
1750 case 100: return 250;
1751 case 250: return 500;
1752 case 500: return 1000;
1753 case 1000: return 2500;
1754 case 2500: return 5000;
1755 case 5000: return 10000;
1756 case 10000: return 25000;
1763 * Interact with some options for cheating
1765 static void do_cmd_options_autosave(cptr info)
1769 int i, k = 0, n = 2;
1777 /* Interact with the player */
1780 /* Prompt XXX XXX XXX */
1782 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, F ¤ÇÉÑÅÙ¤òÆþÎÏ, ESC ¤Ç·èÄê ) ", info);
1784 sprintf(buf, "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) ", info);
1789 /* Display the options */
1790 for (i = 0; i < n; i++)
1792 byte a = TERM_WHITE;
1794 /* Color current option */
1795 if (i == k) a = TERM_L_BLUE;
1797 /* Display the option text */
1798 sprintf(buf, "%-48s: %s (%s)",
1799 autosave_info[i].o_desc,
1801 (*autosave_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1803 (*autosave_info[i].o_var ? "yes" : "no "),
1806 autosave_info[i].o_text);
1807 c_prt(a, buf, i + 2, 0);
1811 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè", autosave_freq), 5, 0);
1813 prt(format("Timed autosave frequency: every %d turns", autosave_freq), 5, 0);
1818 /* Hilite current option */
1819 move_cursor(k + 2, 50);
1835 k = (n + k - 1) % n;
1853 (*autosave_info[k].o_var) = TRUE;
1862 (*autosave_info[k].o_var) = FALSE;
1870 autosave_freq = toggle_frequency(autosave_freq);
1872 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè",
1873 autosave_freq), 5, 0);
1875 prt(format("Timed autosave frequency: every %d turns",
1876 autosave_freq), 5, 0);
1884 (void)show_file(TRUE, "joption.txt#Autosave", NULL, 0, 0);
1886 (void)show_file(TRUE, "option.txt#Autosave", NULL, 0, 0);
1905 * Interact with some options
1907 void do_cmd_options_aux(int page, cptr info)
1910 int i, k = 0, n = 0, l;
1913 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1914 (!p_ptr->wizard || !allow_debug_opts);
1917 /* Lookup the options */
1918 for (i = 0; i < 24; i++) opt[i] = 0;
1920 /* Scan the options */
1921 for (i = 0; option_info[i].o_desc; i++)
1923 /* Notice options on this "page" */
1924 if (option_info[i].o_page == page) opt[n++] = i;
1931 /* Interact with the player */
1936 /* Prompt XXX XXX XXX */
1938 sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, %sESC:½ªÎ», ?:¥Ø¥ë¥×) ", info, browse_only ? "" : "y/n:Êѹ¹, ");
1940 sprintf(buf, "%s (RET:next, %s, ?:help) ", info, browse_only ? "ESC:exit" : "y/n:change, ESC:accept");
1946 /* HACK -- description for easy-auto-destroy options */
1948 if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤¤Î¤ß͸ú", 6, 6);
1950 if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
1953 /* Display the options */
1954 for (i = 0; i < n; i++)
1956 byte a = TERM_WHITE;
1958 /* Color current option */
1959 if (i == k) a = TERM_L_BLUE;
1961 /* Display the option text */
1962 sprintf(buf, "%-48s: %s (%.19s)",
1963 option_info[opt[i]].o_desc,
1965 (*option_info[opt[i]].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1967 (*option_info[opt[i]].o_var ? "yes" : "no "),
1970 option_info[opt[i]].o_text);
1971 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1972 else c_prt(a, buf, i + 2, 0);
1975 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1978 /* Hilite current option */
1979 move_cursor(k + 2 + l, 50);
1985 * HACK - Try to translate the key into a direction
1986 * to allow using the roguelike keys for navigation.
1988 dir = get_keymap_dir(ch);
1989 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
2003 k = (n + k - 1) % n;
2020 if (browse_only) break;
2021 (*option_info[opt[k]].o_var) = TRUE;
2030 if (browse_only) break;
2031 (*option_info[opt[k]].o_var) = FALSE;
2039 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
2046 strnfmt(buf, sizeof(buf), "joption.txt#%s", option_info[opt[k]].o_text);
2048 strnfmt(buf, sizeof(buf), "option.txt#%s", option_info[opt[k]].o_text);
2050 /* Peruse the help file */
2051 (void)show_file(TRUE, buf, NULL, 0, 0);
2068 * Modify the "window" options
2070 static void do_cmd_options_win(void)
2084 /* Memorize old flags */
2085 for (j = 0; j < 8; j++)
2087 /* Acquire current flags */
2088 old_flag[j] = window_flag[j];
2098 /* Prompt XXX XXX XXX */
2100 prt("¥¦¥£¥ó¥É¥¦¡¦¥Õ¥é¥° (<Êý¸þ>¤Ç°ÜÆ°, t¤Ç¥Á¥§¥ó¥¸, y/n ¤Ç¥»¥Ã¥È, ESC)", 0, 0);
2102 prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
2106 /* Display the windows */
2107 for (j = 0; j < 8; j++)
2109 byte a = TERM_WHITE;
2111 cptr s = angband_term_name[j];
2114 if (j == x) a = TERM_L_BLUE;
2116 /* Window name, staggered, centered */
2117 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
2120 /* Display the options */
2121 for (i = 0; i < 16; i++)
2123 byte a = TERM_WHITE;
2125 cptr str = window_flag_desc[i];
2128 if (i == y) a = TERM_L_BLUE;
2132 if (!str) str = "(̤»ÈÍÑ)";
2134 if (!str) str = "(Unused option)";
2139 Term_putstr(0, i + 5, -1, a, str);
2141 /* Display the windows */
2142 for (j = 0; j < 8; j++)
2144 byte a = TERM_WHITE;
2149 if ((i == y) && (j == x)) a = TERM_L_BLUE;
2152 if (window_flag[j] & (1L << i)) c = 'X';
2155 Term_putch(35 + j * 5, i + 5, a, c);
2160 Term_gotoxy(35 + x * 5, y + 5);
2178 for (j = 0; j < 8; j++)
2180 window_flag[j] &= ~(1L << y);
2184 for (i = 0; i < 16; i++)
2186 window_flag[x] &= ~(1L << i);
2199 window_flag[x] |= (1L << y);
2207 window_flag[x] &= ~(1L << y);
2214 (void)show_file(TRUE, "joption.txt#Window", NULL, 0, 0);
2216 (void)show_file(TRUE, "option.txt#Window", NULL, 0, 0);
2226 d = get_keymap_dir(ch);
2228 x = (x + ddx[d] + 8) % 8;
2229 y = (y + ddy[d] + 16) % 16;
2236 /* Notice changes */
2237 for (j = 0; j < 8; j++)
2242 if (!angband_term[j]) continue;
2244 /* Ignore non-changes */
2245 if (window_flag[j] == old_flag[j]) continue;
2248 Term_activate(angband_term[j]);
2265 * Set or unset various options.
2267 * The user must use the "Ctrl-R" command to "adapt" to changes
2268 * in any options which control "visual" aspects of the game.
2270 void do_cmd_options(void)
2275 /* Save the screen */
2284 /* Why are we here */
2286 prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 1, 0);
2288 prt("Options", 1, 0);
2292 /* Give some choices */
2294 prt("(1) ¥¡¼ÆþÎÏ ¥ª¥×¥·¥ç¥ó", 2, 5);
2295 prt("(2) ¥Þ¥Ã¥×²èÌÌ ¥ª¥×¥·¥ç¥ó", 3, 5);
2296 prt("(3) ¥Æ¥¥¹¥Èɽ¼¨ ¥ª¥×¥·¥ç¥ó", 4, 5);
2297 prt("(4) ¥²¡¼¥à¥×¥ì¥¤ ¥ª¥×¥·¥ç¥ó", 5, 5);
2298 prt("(5) ¹ÔÆ°Ãæ»ß´Ø·¸ ¥ª¥×¥·¥ç¥ó", 6, 5);
2299 prt("(6) ´Ê°×¼«Æ°Ç˲õ ¥ª¥×¥·¥ç¥ó", 7, 5);
2300 prt("(R) ¥×¥ì¥¤µÏ¿ ¥ª¥×¥·¥ç¥ó", 8, 5);
2302 /* Special choices */
2303 prt("(P) ¼«Æ°½¦¤¤¥¨¥Ç¥£¥¿", 10, 5);
2304 prt("(D) ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 11, 5);
2305 prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 12, 5);
2306 prt("(M) ÄãËâÎÏ¿§ïçÃÍ", 13, 5);
2307 prt("(A) ¼«Æ°¥»¡¼¥Ö ¥ª¥×¥·¥ç¥ó", 14, 5);
2309 prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
2311 prt("(1) Input Options", 2, 5);
2312 prt("(2) Map Screen Options", 3, 5);
2313 prt("(3) Text Display Options", 4, 5);
2314 prt("(4) Game-Play Options", 5, 5);
2315 prt("(5) Disturbance Options", 6, 5);
2316 prt("(6) Easy Auto-Destroyer Options", 7, 5);
2317 prt("(R) Play-record Options", 8, 5);
2318 /* Special choices */
2319 prt("(P) Auto-picker/destroyer editor", 10, 5);
2320 prt("(D) Base Delay Factor", 11, 5);
2321 prt("(H) Hitpoint Warning", 12, 5);
2322 prt("(M) Mana Color Threshold", 13, 5);
2323 prt("(A) Autosave Options", 14, 5);
2325 prt("(W) Window Flags", 15, 5);
2328 if (!p_ptr->wizard || !allow_debug_opts)
2332 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó (»²¾È¤Î¤ß)", 16, 5);
2334 prt("(B) Birth Options (Browse Only)", 16, 5);
2341 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó", 16, 5);
2343 prt("(B) Birth Options", 16, 5);
2348 if (p_ptr->noscore || allow_debug_opts)
2352 prt("(C) º¾µ½ ¥ª¥×¥·¥ç¥ó", 17, 5);
2354 prt("(C) Cheating Options", 17, 5);
2361 prt("¥³¥Þ¥ó¥É:", 19, 0);
2363 prt("Command: ", 19, 0);
2371 if (k == ESCAPE) break;
2378 /* Process the general options */
2380 do_cmd_options_aux(OPT_PAGE_INPUT, "¥¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2382 do_cmd_options_aux(OPT_PAGE_INPUT, "Input Options");
2390 /* Process the general options */
2392 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "¥Þ¥Ã¥×²èÌÌ¥ª¥×¥·¥ç¥ó");
2394 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "Map Screen Options");
2404 do_cmd_options_aux(OPT_PAGE_TEXT, "¥Æ¥¥¹¥Èɽ¼¨¥ª¥×¥·¥ç¥ó");
2406 do_cmd_options_aux(OPT_PAGE_TEXT, "Text Display Options");
2416 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2418 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "Game-Play Options");
2428 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2430 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "Disturbance Options");
2440 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "´Ê°×¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2442 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "Easy Auto-Destroyer Options");
2447 /* Play-record Options */
2453 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "¥×¥ì¥¤µÏ¿¥ª¥×¥·¥ç¥ó");
2455 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "Play-record Options");
2466 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
2468 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
2474 /* Cheating Options */
2477 if (!p_ptr->noscore && !allow_debug_opts)
2479 /* Cheat options are not permitted */
2486 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤¤Ê¤¤¡ª");
2488 do_cmd_options_cheat("Cheaters never win");
2498 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2500 do_cmd_options_autosave("Autosave");
2511 do_cmd_options_win();
2512 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2513 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2514 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2515 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2519 /* Auto-picker/destroyer editor */
2523 do_cmd_edit_autopick();
2527 /* Hack -- Delay Speed */
2533 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
2535 prt("Command: Base Delay Factor", 19, 0);
2539 /* Get a new value */
2542 int msec = delay_factor * delay_factor * delay_factor;
2544 prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2545 delay_factor, msec), 22, 0);
2547 prt(format("Current base delay factor: %d (%d msec)",
2548 delay_factor, msec), 22, 0);
2552 prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2554 prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2558 if (k == ESCAPE) break;
2562 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2564 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2568 else if (isdigit(k)) delay_factor = D2I(k);
2575 /* Hack -- hitpoint warning factor */
2581 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
2583 prt("Command: Hitpoint Warning", 19, 0);
2587 /* Get a new value */
2591 prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2592 hitpoint_warn), 22, 0);
2594 prt(format("Current hitpoint warning: %d0%%",
2595 hitpoint_warn), 22, 0);
2599 prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2601 prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2605 if (k == ESCAPE) break;
2609 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2611 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2615 else if (isdigit(k)) hitpoint_warn = D2I(k);
2622 /* Hack -- mana color factor */
2628 prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
2630 prt("Command: Mana Color Threshold", 19, 0);
2634 /* Get a new value */
2638 prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
2641 prt(format("Current mana color threshold: %d0%%",
2646 prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
2648 prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
2652 if (k == ESCAPE) break;
2656 (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
2658 (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
2662 else if (isdigit(k)) mana_warn = D2I(k);
2671 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2673 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2678 /* Unknown option */
2687 /* Flush messages */
2692 /* Restore the screen */
2695 /* Hack - Redraw equippy chars */
2696 p_ptr->redraw |= (PR_EQUIPPY);
2702 * Ask for a "user pref line" and process it
2704 * XXX XXX XXX Allow absolute file names?
2706 void do_cmd_pref(void)
2713 /* Ask for a "user pref command" */
2715 if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2717 if (!get_string("Pref: ", buf, 80)) return;
2721 /* Process that pref command */
2722 (void)process_pref_file_command(buf);
2725 void do_cmd_reload_autopick(void)
2728 if (!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2730 if (!get_check("Reload auto-pick preference file? ")) return;
2733 /* Load the file with messages */
2734 autopick_load_pref(TRUE);
2740 * Hack -- append all current macros to the given file
2742 static errr macro_dump(cptr fname)
2744 static cptr mark = "Macro Dump";
2750 /* Build the filename */
2751 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2753 /* File type is "TEXT" */
2754 FILE_TYPE(FILE_TYPE_TEXT);
2756 /* Append to the file */
2757 if (!open_auto_dump(buf, mark)) return (-1);
2761 auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2763 auto_dump_printf("\n# Automatic macro dump\n\n");
2767 for (i = 0; i < macro__num; i++)
2769 /* Extract the action */
2770 ascii_to_text(buf, macro__act[i]);
2772 /* Dump the macro */
2773 auto_dump_printf("A:%s\n", buf);
2775 /* Extract the action */
2776 ascii_to_text(buf, macro__pat[i]);
2778 /* Dump normal macros */
2779 auto_dump_printf("P:%s\n", buf);
2782 auto_dump_printf("\n");
2794 * Hack -- ask for a "trigger" (see below)
2796 * Note the complex use of the "inkey()" function from "util.c".
2798 * Note that both "flush()" calls are extremely important.
2800 static void do_cmd_macro_aux(char *buf)
2810 /* Do not process macros */
2816 /* Read the pattern */
2822 /* Do not process macros */
2825 /* Do not wait for keys */
2828 /* Attempt to read a key */
2839 /* Convert the trigger */
2840 ascii_to_text(tmp, buf);
2842 /* Hack -- display the trigger */
2843 Term_addstr(-1, TERM_WHITE, tmp);
2850 * Hack -- ask for a keymap "trigger" (see below)
2852 * Note that both "flush()" calls are extremely important. This may
2853 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2855 static void do_cmd_macro_aux_keymap(char *buf)
2869 /* Convert to ascii */
2870 ascii_to_text(tmp, buf);
2872 /* Hack -- display the trigger */
2873 Term_addstr(-1, TERM_WHITE, tmp);
2882 * Hack -- append all keymaps to the given file
2884 static errr keymap_dump(cptr fname)
2886 static cptr mark = "Keymap Dump";
2895 if (rogue_like_commands)
2897 mode = KEYMAP_MODE_ROGUE;
2903 mode = KEYMAP_MODE_ORIG;
2907 /* Build the filename */
2908 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2910 /* File type is "TEXT" */
2911 FILE_TYPE(FILE_TYPE_TEXT);
2913 /* Append to the file */
2914 if (!open_auto_dump(buf, mark)) return -1;
2918 auto_dump_printf("\n# ¼«Æ°¥¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2920 auto_dump_printf("\n# Automatic keymap dump\n\n");
2924 for (i = 0; i < 256; i++)
2928 /* Loop up the keymap */
2929 act = keymap_act[mode][i];
2931 /* Skip empty keymaps */
2934 /* Encode the key */
2937 ascii_to_text(key, buf);
2939 /* Encode the action */
2940 ascii_to_text(buf, act);
2942 /* Dump the macro */
2943 auto_dump_printf("A:%s\n", buf);
2944 auto_dump_printf("C:%d:%s\n", mode, key);
2957 * Interact with "macros"
2959 * Note that the macro "action" must be defined before the trigger.
2961 * Could use some helpful instructions on this page. XXX XXX XXX
2963 void do_cmd_macros(void)
2975 if (rogue_like_commands)
2977 mode = KEYMAP_MODE_ROGUE;
2983 mode = KEYMAP_MODE_ORIG;
2986 /* File type is "TEXT" */
2987 FILE_TYPE(FILE_TYPE_TEXT);
2994 /* Process requests until done */
3002 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
3004 prt("Interact with Macros", 2, 0);
3009 /* Describe that action */
3011 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3013 prt("Current action (if any) shown below:", 20, 0);
3017 /* Analyze the current action */
3018 ascii_to_text(buf, macro__buf);
3020 /* Display the current action */
3026 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3028 prt("(1) Load a user pref file", 4, 5);
3033 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
3034 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
3035 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
3036 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
3037 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3038 prt("(7) ¥¡¼ÇÛÃ֤γÎǧ", 10, 5);
3039 prt("(8) ¥¡¼ÇÛÃ֤κîÀ®", 11, 5);
3040 prt("(9) ¥¡¼ÇÛÃ֤κï½ü", 12, 5);
3041 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3043 prt("(2) Append macros to a file", 5, 5);
3044 prt("(3) Query a macro", 6, 5);
3045 prt("(4) Create a macro", 7, 5);
3046 prt("(5) Remove a macro", 8, 5);
3047 prt("(6) Append keymaps to a file", 9, 5);
3048 prt("(7) Query a keymap", 10, 5);
3049 prt("(8) Create a keymap", 11, 5);
3050 prt("(9) Remove a keymap", 12, 5);
3051 prt("(0) Enter a new action", 13, 5);
3054 #endif /* ALLOW_MACROS */
3058 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3060 prt("Command: ", 16, 0);
3068 if (i == ESCAPE) break;
3070 /* Load a 'macro' file */
3077 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3079 prt("Command: Load a user pref file", 16, 0);
3085 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3087 prt("File: ", 18, 0);
3091 /* Default filename */
3092 sprintf(tmp, "%s.prf", player_name);
3094 /* Ask for a file */
3095 if (!askfor(tmp, 80)) continue;
3097 /* Process the given filename */
3098 err = process_pref_file(tmp);
3102 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3104 msg_format("Loaded default '%s'.", tmp);
3111 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3113 msg_format("Failed to load '%s'!");
3119 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3121 msg_format("Loaded '%s'.", tmp);
3133 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3135 prt("Command: Append macros to a file", 16, 0);
3141 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3143 prt("File: ", 18, 0);
3147 /* Default filename */
3148 sprintf(tmp, "%s.prf", player_name);
3150 /* Ask for a file */
3151 if (!askfor(tmp, 80)) continue;
3153 /* Dump the macros */
3154 (void)macro_dump(tmp);
3158 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3160 msg_print("Appended macros.");
3172 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3174 prt("Command: Query a macro", 16, 0);
3180 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3182 prt("Trigger: ", 18, 0);
3186 /* Get a macro trigger */
3187 do_cmd_macro_aux(buf);
3189 /* Acquire action */
3190 k = macro_find_exact(buf);
3197 msg_print("¤½¤Î¥¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3199 msg_print("Found no macro.");
3207 /* Obtain the action */
3208 strcpy(macro__buf, macro__act[k]);
3210 /* Analyze the current action */
3211 ascii_to_text(buf, macro__buf);
3213 /* Display the current action */
3218 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3220 msg_print("Found a macro.");
3226 /* Create a macro */
3231 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3233 prt("Command: Create a macro", 16, 0);
3239 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3241 prt("Trigger: ", 18, 0);
3245 /* Get a macro trigger */
3246 do_cmd_macro_aux(buf);
3253 c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
3255 c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0);
3260 prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3262 prt("Action: ", 20, 0);
3266 /* Convert to text */
3267 ascii_to_text(tmp, macro__buf);
3269 /* Get an encoded action */
3270 if (askfor(tmp, 80))
3272 /* Convert to ascii */
3273 text_to_ascii(macro__buf, tmp);
3275 /* Link the macro */
3276 macro_add(buf, macro__buf);
3280 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3282 msg_print("Added a macro.");
3288 /* Remove a macro */
3293 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3295 prt("Command: Remove a macro", 16, 0);
3301 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3303 prt("Trigger: ", 18, 0);
3307 /* Get a macro trigger */
3308 do_cmd_macro_aux(buf);
3310 /* Link the macro */
3311 macro_add(buf, buf);
3315 msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3317 msg_print("Removed a macro.");
3327 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3329 prt("Command: Append keymaps to a file", 16, 0);
3335 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3337 prt("File: ", 18, 0);
3341 /* Default filename */
3342 sprintf(tmp, "%s.prf", player_name);
3344 /* Ask for a file */
3345 if (!askfor(tmp, 80)) continue;
3347 /* Dump the macros */
3348 (void)keymap_dump(tmp);
3352 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3354 msg_print("Appended keymaps.");
3359 /* Query a keymap */
3366 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤γÎǧ", 16, 0);
3368 prt("Command: Query a keymap", 16, 0);
3374 prt("²¡¤¹¥¡¼: ", 18, 0);
3376 prt("Keypress: ", 18, 0);
3380 /* Get a keymap trigger */
3381 do_cmd_macro_aux_keymap(buf);
3383 /* Look up the keymap */
3384 act = keymap_act[mode][(byte)(buf[0])];
3391 msg_print("¥¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3393 msg_print("Found no keymap.");
3401 /* Obtain the action */
3402 strcpy(macro__buf, act);
3404 /* Analyze the current action */
3405 ascii_to_text(buf, macro__buf);
3407 /* Display the current action */
3412 msg_print("¥¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3414 msg_print("Found a keymap.");
3420 /* Create a keymap */
3425 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κîÀ®", 16, 0);
3427 prt("Command: Create a keymap", 16, 0);
3433 prt("²¡¤¹¥¡¼: ", 18, 0);
3435 prt("Keypress: ", 18, 0);
3439 /* Get a keymap trigger */
3440 do_cmd_macro_aux_keymap(buf);
3447 c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
3449 c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0);
3454 prt("¹ÔÆ°: ", 20, 0);
3456 prt("Action: ", 20, 0);
3460 /* Convert to text */
3461 ascii_to_text(tmp, macro__buf);
3463 /* Get an encoded action */
3464 if (askfor(tmp, 80))
3466 /* Convert to ascii */
3467 text_to_ascii(macro__buf, tmp);
3469 /* Free old keymap */
3470 string_free(keymap_act[mode][(byte)(buf[0])]);
3472 /* Make new keymap */
3473 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3477 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3479 msg_print("Added a keymap.");
3485 /* Remove a keymap */
3490 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κï½ü", 16, 0);
3492 prt("Command: Remove a keymap", 16, 0);
3498 prt("²¡¤¹¥¡¼: ", 18, 0);
3500 prt("Keypress: ", 18, 0);
3504 /* Get a keymap trigger */
3505 do_cmd_macro_aux_keymap(buf);
3507 /* Free old keymap */
3508 string_free(keymap_act[mode][(byte)(buf[0])]);
3510 /* Make new keymap */
3511 keymap_act[mode][(byte)(buf[0])] = NULL;
3515 msg_print("¥¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3517 msg_print("Removed a keymap.");
3522 /* Enter a new action */
3527 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3529 prt("Command: Enter a new action", 16, 0);
3537 c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
3539 c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0);
3544 prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3546 prt("Action: ", 20, 0);
3549 /* Hack -- limit the value */
3552 /* Get an encoded action */
3553 if (!askfor(buf, 80)) continue;
3555 /* Extract an action */
3556 text_to_ascii(macro__buf, buf);
3559 #endif /* ALLOW_MACROS */
3568 /* Flush messages */
3577 static cptr lighting_level_str[F_LIT_MAX] =
3593 static void cmd_visuals_aux(int i, int *num, int max)
3600 sprintf(str, "%d", *num);
3602 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3605 tmp = strtol(str, NULL, 0);
3606 if (tmp >= 0 && tmp < max)
3610 else if (isupper(i))
3611 *num = (*num + max - 1) % max;
3613 *num = (*num + 1) % max;
3619 * Interact with "visuals"
3621 void do_cmd_visuals(void)
3629 const char *empty_symbol = "<< ? >>";
3631 if (use_bigtile) empty_symbol = "<< ?? >>";
3634 /* File type is "TEXT" */
3635 FILE_TYPE(FILE_TYPE_TEXT);
3638 /* Save the screen */
3642 /* Interact until done */
3648 /* Ask for a choice */
3650 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3652 prt("Interact with Visuals", 2, 0);
3656 /* Give some choices */
3658 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3660 prt("(1) Load a user pref file", 4, 5);
3663 #ifdef ALLOW_VISUALS
3665 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
3666 prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 6, 5);
3667 prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 7, 5);
3668 prt("(5) (̤»ÈÍÑ)", 8, 5);
3669 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3670 prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3671 prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3672 prt("(9) (̤»ÈÍÑ)", 12, 5);
3674 prt("(2) Dump monster attr/chars", 5, 5);
3675 prt("(3) Dump object attr/chars", 6, 5);
3676 prt("(4) Dump feature attr/chars", 7, 5);
3677 prt("(5) (unused)", 8, 5);
3678 prt("(6) Change monster attr/chars", 9, 5);
3679 prt("(7) Change object attr/chars", 10, 5);
3680 prt("(8) Change feature attr/chars", 11, 5);
3681 prt("(9) (unused)", 12, 5);
3686 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3688 prt("(0) Reset visuals", 13, 5);
3694 prt("¥³¥Þ¥ó¥É:", 15, 0);
3696 prt("Command: ", 15, 0);
3704 if (i == ESCAPE) break;
3706 /* Load a 'pref' file */
3711 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3713 prt("Command: Load a user pref file", 15, 0);
3719 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3721 prt("File: ", 17, 0);
3725 /* Default filename */
3726 sprintf(tmp, "%s.prf", player_name);
3729 if (!askfor(tmp, 70)) continue;
3731 /* Process the given filename */
3732 (void)process_pref_file(tmp);
3735 #ifdef ALLOW_VISUALS
3737 /* Dump monster attr/chars */
3740 static cptr mark = "Monster attr/chars";
3744 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3746 prt("Command: Dump monster attr/chars", 15, 0);
3752 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3754 prt("File: ", 17, 0);
3758 /* Default filename */
3759 sprintf(tmp, "%s.prf", player_name);
3761 /* Get a filename */
3762 if (!askfor(tmp, 70)) continue;
3764 /* Build the filename */
3765 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3767 /* Append to the file */
3768 if (!open_auto_dump(buf, mark)) continue;
3772 auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3774 auto_dump_printf("\n# Monster attr/char definitions\n\n");
3778 for (i = 1; i < max_r_idx; i++)
3780 monster_race *r_ptr = &r_info[i];
3782 /* Skip non-entries */
3783 if (!r_ptr->name) continue;
3785 /* Dump a comment */
3786 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3788 /* Dump the monster attr/char info */
3789 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3790 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3798 msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3800 msg_print("Dumped monster attr/chars.");
3805 /* Dump object attr/chars */
3808 static cptr mark = "Object attr/chars";
3812 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3814 prt("Command: Dump object attr/chars", 15, 0);
3820 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3822 prt("File: ", 17, 0);
3826 /* Default filename */
3827 sprintf(tmp, "%s.prf", player_name);
3829 /* Get a filename */
3830 if (!askfor(tmp, 70)) continue;
3832 /* Build the filename */
3833 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3835 /* Append to the file */
3836 if (!open_auto_dump(buf, mark)) continue;
3840 auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3842 auto_dump_printf("\n# Object attr/char definitions\n\n");
3846 for (i = 1; i < max_k_idx; i++)
3849 object_kind *k_ptr = &k_info[i];
3851 /* Skip non-entries */
3852 if (!k_ptr->name) continue;
3854 /* Skip entries with flavor */
3855 if (k_ptr->flavor) continue;
3858 strip_name(o_name, i);
3860 /* Dump a comment */
3861 auto_dump_printf("# %s\n", o_name);
3863 /* Dump the object attr/char info */
3864 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3865 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3873 msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3875 msg_print("Dumped object attr/chars.");
3880 /* Dump feature attr/chars */
3883 static cptr mark = "Feature attr/chars";
3887 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3889 prt("Command: Dump feature attr/chars", 15, 0);
3895 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3897 prt("File: ", 17, 0);
3901 /* Default filename */
3902 sprintf(tmp, "%s.prf", player_name);
3904 /* Get a filename */
3905 if (!askfor(tmp, 70)) continue;
3907 /* Build the filename */
3908 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3910 /* Append to the file */
3911 if (!open_auto_dump(buf, mark)) continue;
3915 auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3917 auto_dump_printf("\n# Feature attr/char definitions\n\n");
3921 for (i = 1; i < max_f_idx; i++)
3923 feature_type *f_ptr = &f_info[i];
3925 /* Skip non-entries */
3926 if (!f_ptr->name) continue;
3928 /* Skip mimiccing features */
3929 if (f_ptr->mimic != i) continue;
3931 /* Dump a comment */
3932 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3934 /* Dump the feature attr/char info */
3935 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3936 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3937 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3938 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]),
3939 (byte)(f_ptr->x_attr[F_LIT_DARKDARK]), (byte)(f_ptr->x_char[F_LIT_DARKDARK]));
3947 msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3949 msg_print("Dumped feature attr/chars.");
3954 /* Modify monster attr/chars */
3961 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3963 prt("Command: Change monster attr/chars", 15, 0);
3967 /* Hack -- query until done */
3970 monster_race *r_ptr = &r_info[r];
3974 byte da = r_ptr->d_attr;
3975 byte dc = r_ptr->d_char;
3976 byte ca = r_ptr->x_attr;
3977 byte cc = r_ptr->x_char;
3979 /* Label the object */
3981 Term_putstr(5, 17, -1, TERM_WHITE,
3982 format("¥â¥ó¥¹¥¿¡¼ = %d, ̾Á° = %-40.40s",
3983 r, (r_name + r_ptr->name)));
3985 Term_putstr(5, 17, -1, TERM_WHITE,
3986 format("Monster = %d, Name = %-40.40s",
3987 r, (r_name + r_ptr->name)));
3991 /* Label the Default values */
3993 Term_putstr(10, 19, -1, TERM_WHITE,
3994 format("½é´üÃÍ ¿§ / ʸ»ú = %3u / %3u", da, dc));
3996 Term_putstr(10, 19, -1, TERM_WHITE,
3997 format("Default attr/char = %3u / %3u", da, dc));
4000 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4001 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4003 /* Label the Current values */
4005 Term_putstr(10, 20, -1, TERM_WHITE,
4006 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3u / %3u", ca, cc));
4008 Term_putstr(10, 20, -1, TERM_WHITE,
4009 format("Current attr/char = %3u / %3u", ca, cc));
4012 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4013 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4017 Term_putstr(0, 22, -1, TERM_WHITE,
4018 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4020 Term_putstr(0, 22, -1, TERM_WHITE,
4021 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4028 if (i == ESCAPE) break;
4030 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4031 else if (isupper(i)) c = 'a' + i - 'A';
4037 cmd_visuals_aux(i, &r, max_r_idx);
4040 t = (int)r_ptr->x_attr;
4041 cmd_visuals_aux(i, &t, 256);
4042 r_ptr->x_attr = (byte)t;
4045 t = (int)r_ptr->x_char;
4046 cmd_visuals_aux(i, &t, 256);
4047 r_ptr->x_char = (byte)t;
4053 /* Modify object attr/chars */
4060 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4062 prt("Command: Change object attr/chars", 15, 0);
4066 /* Hack -- query until done */
4069 object_kind *k_ptr = &k_info[k];
4073 byte da = k_ptr->d_attr;
4074 byte dc = k_ptr->d_char;
4075 byte ca = k_ptr->x_attr;
4076 byte cc = k_ptr->x_char;
4078 /* Label the object */
4080 Term_putstr(5, 17, -1, TERM_WHITE,
4081 format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s",
4082 k, (k_name + k_ptr->name)));
4084 Term_putstr(5, 17, -1, TERM_WHITE,
4085 format("Object = %d, Name = %-40.40s",
4086 k, (k_name + k_ptr->name)));
4090 /* Label the Default values */
4092 Term_putstr(10, 19, -1, TERM_WHITE,
4093 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4095 Term_putstr(10, 19, -1, TERM_WHITE,
4096 format("Default attr/char = %3d / %3d", da, dc));
4099 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4100 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4102 /* Label the Current values */
4104 Term_putstr(10, 20, -1, TERM_WHITE,
4105 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4107 Term_putstr(10, 20, -1, TERM_WHITE,
4108 format("Current attr/char = %3d / %3d", ca, cc));
4111 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4112 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4116 Term_putstr(0, 22, -1, TERM_WHITE,
4117 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4119 Term_putstr(0, 22, -1, TERM_WHITE,
4120 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4127 if (i == ESCAPE) break;
4129 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4130 else if (isupper(i)) c = 'a' + i - 'A';
4136 cmd_visuals_aux(i, &k, max_k_idx);
4139 t = (int)k_ptr->x_attr;
4140 cmd_visuals_aux(i, &t, 256);
4141 k_ptr->x_attr = (byte)t;
4144 t = (int)k_ptr->x_char;
4145 cmd_visuals_aux(i, &t, 256);
4146 k_ptr->x_char = (byte)t;
4152 /* Modify feature attr/chars */
4156 static int lighting_level = F_LIT_STANDARD;
4160 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4162 prt("Command: Change feature attr/chars", 15, 0);
4166 /* Hack -- query until done */
4169 feature_type *f_ptr = &f_info[f];
4173 byte da = f_ptr->d_attr[lighting_level];
4174 byte dc = f_ptr->d_char[lighting_level];
4175 byte ca = f_ptr->x_attr[lighting_level];
4176 byte cc = f_ptr->x_char[lighting_level];
4178 /* Label the object */
4181 Term_putstr(5, 17, -1, TERM_WHITE,
4182 format("ÃÏ·Á = %d, ̾Á° = %s, ÌÀÅÙ = %s",
4183 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
4185 Term_putstr(5, 17, -1, TERM_WHITE,
4186 format("Terrain = %d, Name = %s, Lighting = %s",
4187 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
4191 /* Label the Default values */
4193 Term_putstr(10, 19, -1, TERM_WHITE,
4194 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4196 Term_putstr(10, 19, -1, TERM_WHITE,
4197 format("Default attr/char = %3d / %3d", da, dc));
4200 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4202 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4205 /* Label the Current values */
4207 Term_putstr(10, 20, -1, TERM_WHITE,
4208 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4210 Term_putstr(10, 20, -1, TERM_WHITE,
4211 format("Current attr/char = %3d / %3d", ca, cc));
4214 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4215 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4219 Term_putstr(0, 22, -1, TERM_WHITE,
4220 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D): ");
4222 Term_putstr(0, 22, -1, TERM_WHITE,
4223 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D): ");
4230 if (i == ESCAPE) break;
4232 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4233 else if (isupper(i)) c = 'a' + i - 'A';
4239 cmd_visuals_aux(i, &f, max_f_idx);
4242 t = (int)f_ptr->x_attr[lighting_level];
4243 cmd_visuals_aux(i, &t, 256);
4244 f_ptr->x_attr[lighting_level] = (byte)t;
4247 t = (int)f_ptr->x_char[lighting_level];
4248 cmd_visuals_aux(i, &t, 256);
4249 f_ptr->x_char[lighting_level] = (byte)t;
4252 cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
4255 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
4271 msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4273 msg_print("Visual attr/char tables reset.");
4278 /* Unknown option */
4284 /* Flush messages */
4289 /* Restore the screen */
4295 * Interact with "colors"
4297 void do_cmd_colors(void)
4306 /* File type is "TEXT" */
4307 FILE_TYPE(FILE_TYPE_TEXT);
4310 /* Save the screen */
4314 /* Interact until done */
4320 /* Ask for a choice */
4322 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4324 prt("Interact with Colors", 2, 0);
4328 /* Give some choices */
4330 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4332 prt("(1) Load a user pref file", 4, 5);
4337 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
4338 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4340 prt("(2) Dump colors", 5, 5);
4341 prt("(3) Modify colors", 6, 5);
4348 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4350 prt("Command: ", 8, 0);
4358 if (i == ESCAPE) break;
4360 /* Load a 'pref' file */
4365 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4367 prt("Command: Load a user pref file", 8, 0);
4373 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4375 prt("File: ", 10, 0);
4380 sprintf(tmp, "%s.prf", player_name);
4383 if (!askfor(tmp, 70)) continue;
4385 /* Process the given filename */
4386 (void)process_pref_file(tmp);
4388 /* Mega-Hack -- react to changes */
4389 Term_xtra(TERM_XTRA_REACT, 0);
4391 /* Mega-Hack -- redraw */
4400 static cptr mark = "Colors";
4404 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 8, 0);
4406 prt("Command: Dump colors", 8, 0);
4412 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4414 prt("File: ", 10, 0);
4418 /* Default filename */
4419 sprintf(tmp, "%s.prf", player_name);
4421 /* Get a filename */
4422 if (!askfor(tmp, 70)) continue;
4424 /* Build the filename */
4425 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4427 /* Append to the file */
4428 if (!open_auto_dump(buf, mark)) continue;
4432 auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4434 auto_dump_printf("\n# Color redefinitions\n\n");
4438 for (i = 0; i < 256; i++)
4440 int kv = angband_color_table[i][0];
4441 int rv = angband_color_table[i][1];
4442 int gv = angband_color_table[i][2];
4443 int bv = angband_color_table[i][3];
4448 cptr name = "unknown";
4452 /* Skip non-entries */
4453 if (!kv && !rv && !gv && !bv) continue;
4455 /* Extract the color name */
4456 if (i < 16) name = color_names[i];
4458 /* Dump a comment */
4460 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4462 auto_dump_printf("# Color '%s'\n", name);
4465 /* Dump the monster attr/char info */
4466 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4475 msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
4477 msg_print("Dumped color redefinitions.");
4489 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4491 prt("Command: Modify colors", 8, 0);
4495 /* Hack -- query until done */
4504 /* Exhibit the normal colors */
4505 for (j = 0; j < 16; j++)
4507 /* Exhibit this color */
4508 Term_putstr(j*4, 20, -1, a, "###");
4510 /* Exhibit all colors */
4511 Term_putstr(j*4, 22, -1, j, format("%3d", j));
4514 /* Describe the color */
4516 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4518 name = ((a < 16) ? color_names[a] : "undefined");
4522 /* Describe the color */
4524 Term_putstr(5, 10, -1, TERM_WHITE,
4525 format("¥«¥é¡¼ = %d, ̾Á° = %s", a, name));
4527 Term_putstr(5, 10, -1, TERM_WHITE,
4528 format("Color = %d, Name = %s", a, name));
4532 /* Label the Current values */
4533 Term_putstr(5, 12, -1, TERM_WHITE,
4534 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4535 angband_color_table[a][0],
4536 angband_color_table[a][1],
4537 angband_color_table[a][2],
4538 angband_color_table[a][3]));
4542 Term_putstr(0, 14, -1, TERM_WHITE,
4543 "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4545 Term_putstr(0, 14, -1, TERM_WHITE,
4546 "Command (n/N/k/K/r/R/g/G/b/B): ");
4554 if (i == ESCAPE) break;
4557 if (i == 'n') a = (byte)(a + 1);
4558 if (i == 'N') a = (byte)(a - 1);
4559 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4560 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4561 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4562 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4563 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4564 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4565 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4566 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4568 /* Hack -- react to changes */
4569 Term_xtra(TERM_XTRA_REACT, 0);
4571 /* Hack -- redraw */
4578 /* Unknown option */
4584 /* Flush messages */
4589 /* Restore the screen */
4595 * Note something in the message recall
4597 void do_cmd_note(void)
4606 if (!get_string("¥á¥â: ", buf, 60)) return;
4608 if (!get_string("Note: ", buf, 60)) return;
4612 /* Ignore empty notes */
4613 if (!buf[0] || (buf[0] == ' ')) return;
4615 /* Add the note to the message recall */
4617 msg_format("¥á¥â: %s", buf);
4619 msg_format("Note: %s", buf);
4626 * Mention the current version
4628 void do_cmd_version(void)
4633 msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4634 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4636 msg_format("You are playing Hengband %d.%d.%d.",
4637 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4644 * Array of feeling strings
4646 static cptr do_cmd_feeling_text[11] =
4649 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4651 "Looks like any other level.",
4655 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4657 "You feel there is something special about this level.",
4661 "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4663 "You nearly faint as horrible visions of death fill your mind!",
4667 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4669 "This level looks very dangerous.",
4673 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4675 "You have a very bad feeling...",
4679 "°¤¤Í½´¶¤¬¤¹¤ë...",
4681 "You have a bad feeling...",
4687 "You feel nervous.",
4691 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4693 "You feel your luck is turning...",
4697 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4699 "You don't like the look of this place.",
4703 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4705 "This level looks reasonably safe.",
4709 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4711 "What a boring place..."
4716 static cptr do_cmd_feeling_text_combat[11] =
4719 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4721 "Looks like any other level.",
4725 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4727 "You feel there is something special about this level.",
4731 "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4733 "You nearly faint as horrible visions of death fill your mind!",
4737 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4739 "This level looks very dangerous.",
4743 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4745 "You have a very bad feeling...",
4749 "°¤¤Í½´¶¤¬¤¹¤ë...",
4751 "You have a bad feeling...",
4757 "You feel nervous.",
4761 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4763 "You feel your luck is turning...",
4767 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4769 "You don't like the look of this place.",
4773 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4775 "This level looks reasonably safe.",
4779 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4781 "What a boring place..."
4786 static cptr do_cmd_feeling_text_lucky[11] =
4789 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4790 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4791 "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4792 "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4793 "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4794 "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4795 "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4796 "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤¤¿¤«...",
4797 "¸«¤¿´¶¤¸°¤¯¤Ï¤Ê¤¤...",
4798 "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4799 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4801 "Looks like any other level.",
4802 "You feel there is something special about this level.",
4803 "You have a superb feeling about this level.",
4804 "You have an excellent feeling...",
4805 "You have a very good feeling...",
4806 "You have a good feeling...",
4807 "You feel strangely lucky...",
4808 "You feel your luck is turning...",
4809 "You like the look of this place...",
4810 "This level can't be all bad...",
4811 "What a boring place..."
4817 * Note that "feeling" is set to zero unless some time has passed.
4818 * Note that this is done when the level is GENERATED, not entered.
4820 void do_cmd_feeling(void)
4822 /* Verify the feeling */
4823 if (feeling > 10) feeling = 10;
4825 /* No useful feeling in quests */
4826 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4829 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4831 msg_print("Looks like a typical quest level.");
4837 /* No useful feeling in town */
4838 else if (p_ptr->town_num && !dun_level)
4841 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4843 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4847 msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4849 msg_print("Looks like a strange wilderness.");
4857 msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4859 msg_print("Looks like a typical town.");
4866 /* No useful feeling in the wilderness */
4867 else if (!dun_level)
4870 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4872 msg_print("Looks like a typical wilderness.");
4878 /* Display the feeling */
4879 if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4881 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4883 if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4884 msg_print(do_cmd_feeling_text_combat[feeling]);
4886 msg_print(do_cmd_feeling_text[feeling]);
4891 msg_print(do_cmd_feeling_text[0]);
4898 * Description of each monster group.
4900 static cptr monster_group_text[] =
4903 "¥æ¥Ë¡¼¥¯", /* "Uniques" */
4904 "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
4933 /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4950 /* "¾åµé¥Ç¡¼¥â¥ó", */
4991 /* "Ancient Dragon/Wyrm", */
5000 "Multi-Headed Reptile",
5005 "Reptile/Amphibian",
5006 "Spider/Scorpion/Tick",
5008 /* "Major Demon", */
5024 * Symbols of monsters in each group. Note the "Uniques" group
5025 * is handled differently.
5027 static cptr monster_group_char[] =
5082 "$!?=&`.|/\\~[]()>",
5091 * hook function to sort monsters by level
5093 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5095 u16b *who = (u16b*)(u);
5100 monster_race *r_ptr1 = &r_info[w1];
5101 monster_race *r_ptr2 = &r_info[w2];
5106 if (r_ptr2->level > r_ptr1->level) return TRUE;
5107 if (r_ptr1->level > r_ptr2->level) return FALSE;
5109 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5110 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5115 * Build a list of monster indexes in the given group. Return the number
5116 * of monsters in the group.
5118 * mode & 0x01 : check for non-empty group
5119 * mode & 0x02 : cheat?
5121 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5126 /* Get a list of x_char in this group */
5127 cptr group_char = monster_group_char[grp_cur];
5129 /* XXX Hack -- Check if this is the "Uniques" group */
5130 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5132 /* XXX Hack -- Check if this is the "Riding" group */
5133 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
5135 /* Check every race */
5136 for (i = 0; i < max_r_idx; i++)
5138 /* Access the race */
5139 monster_race *r_ptr = &r_info[i];
5141 /* Skip empty race */
5142 if (!r_ptr->name) continue ;
5144 /* Require known monsters */
5145 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5149 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5152 else if (grp_riding)
5154 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
5159 /* Check for race in the group */
5160 if (!my_strchr(group_char, r_ptr->d_char)) continue;
5164 mon_idx[mon_cnt++] = i;
5166 /* XXX Hack -- Just checking for non-empty group */
5167 if (mode & 0x01) break;
5170 /* Terminate the list */
5171 mon_idx[mon_cnt] = 0;
5173 /* Select the sort method */
5174 ang_sort_comp = ang_sort_comp_monster_level;
5175 ang_sort_swap = ang_sort_swap_hook;
5177 /* Sort by monster level */
5178 ang_sort(mon_idx, &dummy_why, mon_cnt);
5180 /* Return the number of races */
5186 * Description of each monster group.
5188 static cptr object_group_text[] =
5191 "¥¥Î¥³", /* "Mushrooms" */
5192 "Ìô", /* "Potions" */
5193 "Ìý¤Ä¤Ü", /* "Flasks" */
5194 "´¬Êª", /* "Scrolls" */
5195 "»ØÎØ", /* "Rings" */
5196 "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5197 "ū", /* "Whistle" */
5198 "¸÷¸»", /* "Lanterns" */
5199 "ËâË¡ËÀ", /* "Wands" */
5200 "¾ó", /* "Staffs" */
5201 "¥í¥Ã¥É", /* "Rods" */
5202 "¥«¡¼¥É", /* "Cards" */
5203 "¥¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5212 "Åá·õÎà", /* "Swords" */
5213 "Æß´ï", /* "Blunt Weapons" */
5214 "ĹÊÁÉð´ï", /* "Polearms" */
5215 "ºÎ·¡Æ»¶ñ", /* "Diggers" */
5216 "Èô¤ÓÆ»¶ñ", /* "Bows" */
5220 "·ÚÁõ³»", /* "Soft Armor" */
5221 "½ÅÁõ³»", /* "Hard Armor" */
5222 "¥É¥é¥´¥ó³»", /* "Dragon Armor" */
5223 "½â", /* "Shields" */
5224 "¥¯¥í¡¼¥¯", /* "Cloaks" */
5225 "äƼê", /* "Gloves" */
5226 "¥Ø¥ë¥á¥Ã¥È", /* "Helms" */
5227 "´§", /* "Crowns" */
5228 "¥Ö¡¼¥Ä", /* "Boots" */
5276 * TVALs of items in each group
5278 static byte object_group_tval[] =
5318 TV_LIFE_BOOK, /* Hack -- all spellbooks */
5324 * Build a list of monster indexes in the given group. Return the number
5325 * of monsters in the group.
5327 static int collect_objects(int grp_cur, int object_idx[])
5329 int i, j, k, object_cnt = 0;
5331 /* Get a list of x_char in this group */
5332 byte group_tval = object_group_tval[grp_cur];
5334 /* Check every object */
5335 for (i = 0; i < max_k_idx; i++)
5337 /* Access the race */
5338 object_kind *k_ptr = &k_info[i];
5340 /* Skip empty objects */
5341 if (!k_ptr->name) continue;
5343 /* Skip non-flavoured objects */
5344 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5346 /* Skip items with no distribution (special artifacts) */
5347 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5350 /* Require objects ever seen*/
5351 if (!k_ptr->aware && !p_ptr->wizard) continue;
5353 /* Check for race in the group */
5354 if (TV_LIFE_BOOK == group_tval)
5356 /* Hack -- All spell books */
5357 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5360 object_idx[object_cnt++] = i;
5363 else if (k_ptr->tval == group_tval)
5366 object_idx[object_cnt++] = i;
5370 /* Terminate the list */
5371 object_idx[object_cnt] = 0;
5373 /* Return the number of races */
5379 * Description of each feature group.
5381 static cptr feature_group_text[] =
5389 * Build a list of feature indexes in the given group. Return the number
5390 * of features in the group.
5392 static int collect_features(int grp_cur, int *feat_idx)
5394 int i, feat_cnt = 0;
5396 /* Unused; There is a single group. */
5399 /* Check every feature */
5400 for (i = 1; i < max_f_idx; i++)
5402 /* Access the index */
5403 feature_type *f_ptr = &f_info[i];
5405 /* Skip empty index */
5406 if (!f_ptr->name) continue;
5408 /* Skip mimiccing features */
5409 if (f_ptr->mimic != i) continue;
5412 feat_idx[feat_cnt++] = i;
5415 /* Terminate the list */
5416 feat_idx[feat_cnt] = 0;
5418 /* Return the number of races */
5425 * Build a list of monster indexes in the given group. Return the number
5426 * of monsters in the group.
5428 static int collect_artifacts(int grp_cur, int object_idx[])
5430 int i, object_cnt = 0;
5432 /* Get a list of x_char in this group */
5433 byte group_tval = object_group_tval[grp_cur];
5435 /* Check every object */
5436 for (i = 0; i < max_a_idx; i++)
5438 /* Access the artifact */
5439 artifact_type *a_ptr = &a_info[i];
5441 /* Skip empty artifacts */
5442 if (!a_ptr->name) continue;
5444 /* Skip "uncreated" artifacts */
5445 if (!a_ptr->cur_num) continue;
5447 /* Check for race in the group */
5448 if (a_ptr->tval == group_tval)
5451 object_idx[object_cnt++] = i;
5455 /* Terminate the list */
5456 object_idx[object_cnt] = 0;
5458 /* Return the number of races */
5465 * Encode the screen colors
5467 static char hack[17] = "dwsorgbuDWvyRGBU";
5471 * Hack -- load a screen dump from a file
5473 void do_cmd_load_screen(void)
5488 Term_get_size(&wid, &hgt);
5490 /* Build the filename */
5491 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5493 /* Append to the file */
5494 fff = my_fopen(buf, "r");
5499 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5501 msg_format("Failed to open %s.", buf);
5508 /* Save the screen */
5511 /* Clear the screen */
5515 /* Load the screen */
5516 for (y = 0; okay; y++)
5518 /* Get a line of data including control code */
5519 if (!fgets(buf, 1024, fff)) okay = FALSE;
5521 /* Get the blank line */
5522 if (buf[0] == '\n' || buf[0] == '\0') break;
5524 /* Ignore too large screen image */
5525 if (y >= hgt) continue;
5528 for (x = 0; x < wid - 1; x++)
5531 if (buf[x] == '\n' || buf[x] == '\0') break;
5533 /* Put the attr/char */
5534 Term_draw(x, y, TERM_WHITE, buf[x]);
5538 /* Dump the screen */
5539 for (y = 0; okay; y++)
5541 /* Get a line of data including control code */
5542 if (!fgets(buf, 1024, fff)) okay = FALSE;
5544 /* Get the blank line */
5545 if (buf[0] == '\n' || buf[0] == '\0') break;
5547 /* Ignore too large screen image */
5548 if (y >= hgt) continue;
5551 for (x = 0; x < wid - 1; x++)
5554 if (buf[x] == '\n' || buf[x] == '\0') break;
5556 /* Get the attr/char */
5557 (void)(Term_what(x, y, &a, &c));
5559 /* Look up the attr */
5560 for (i = 0; i < 16; i++)
5562 /* Use attr matches */
5563 if (hack[i] == buf[x]) a = i;
5566 /* Put the attr/char */
5567 Term_draw(x, y, a, c);
5578 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5580 msg_print("Screen dump loaded.");
5587 /* Restore the screen */
5594 cptr inven_res_label =
5596 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5598 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5603 #define IM_FLAG_STR "¡ö"
5604 #define HAS_FLAG_STR "¡Ü"
5605 #define NO_FLAG_STR "¡¦"
5607 #define IM_FLAG_STR "* "
5608 #define HAS_FLAG_STR "+ "
5609 #define NO_FLAG_STR ". "
5612 #define print_im_or_res_flag(IM, RES) \
5614 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5615 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5618 #define print_flag(TR) \
5620 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5624 /* XTRA HACK RESLIST */
5625 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5627 char o_name[MAX_NLEN];
5628 u32b flgs[TR_FLAG_SIZE];
5630 if (!o_ptr->k_idx) return;
5631 if (o_ptr->tval != tval) return;
5633 /* Identified items only */
5634 if (!object_is_known(o_ptr)) return;
5637 * HACK:Ring of Lordly protection and Dragon equipment
5638 * have random resistances.
5640 if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr))
5641 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5642 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5643 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5644 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5645 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5646 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5647 || object_is_artifact(o_ptr))
5650 object_desc(o_name, o_ptr, OD_NAME_ONLY);
5652 while (o_name[i] && (i < 26))
5655 if (iskanji(o_name[i])) i++;
5664 o_name[i] = ' '; i++;
5669 fprintf(fff, "%s %s", where, o_name);
5671 if (!(o_ptr->ident & (IDENT_MENTAL)))
5674 fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5676 fputs("-------unknown------------ -------unknown------\n", fff);
5681 object_flags_known(o_ptr, flgs);
5683 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5684 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5685 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5686 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5687 print_flag(TR_RES_POIS);
5688 print_flag(TR_RES_LITE);
5689 print_flag(TR_RES_DARK);
5690 print_flag(TR_RES_SHARDS);
5691 print_flag(TR_RES_SOUND);
5692 print_flag(TR_RES_NETHER);
5693 print_flag(TR_RES_NEXUS);
5694 print_flag(TR_RES_CHAOS);
5695 print_flag(TR_RES_DISEN);
5699 print_flag(TR_RES_BLIND);
5700 print_flag(TR_RES_FEAR);
5701 print_flag(TR_RES_CONF);
5702 print_flag(TR_FREE_ACT);
5703 print_flag(TR_SEE_INVIS);
5704 print_flag(TR_HOLD_LIFE);
5705 print_flag(TR_TELEPATHY);
5706 print_flag(TR_SLOW_DIGEST);
5707 print_flag(TR_REGEN);
5708 print_flag(TR_FEATHER);
5716 fprintf(fff, "%s\n", inven_res_label);
5722 * Display *ID* ed weapons/armors's resistances
5724 static void do_cmd_knowledge_inven(void)
5728 char file_name[1024];
5738 /* Open a new file */
5739 fff = my_fopen_temp(file_name, 1024);
5743 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5745 msg_format("Failed to create temporary file %s.", file_name);
5750 fprintf(fff, "%s\n", inven_res_label);
5752 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
5756 for (; j < 9; j++) fputc('\n', fff);
5758 fprintf(fff, "%s\n", inven_res_label);
5762 strcpy(where, "Áõ");
5764 strcpy(where, "E ");
5766 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5768 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5772 strcpy(where, "»ý");
5774 strcpy(where, "I ");
5776 for (i = 0; i < INVEN_PACK; i++)
5778 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5781 st_ptr = &town[1].store[STORE_HOME];
5783 strcpy(where, "²È");
5785 strcpy(where, "H ");
5788 for (i = 0; i < st_ptr->stock_num; i++)
5790 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5794 /* Close the file */
5797 /* Display the file contents */
5799 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5801 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5804 /* Remove the file */
5809 void do_cmd_save_screen_html_aux(char *filename, int message)
5813 byte a = 0, old_a = 0;
5827 cptr html_head[] = {
5828 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5832 cptr html_foot[] = {
5834 "</body>\n</html>\n",
5840 Term_get_size(&wid, &hgt);
5842 /* File type is "TEXT" */
5843 FILE_TYPE(FILE_TYPE_TEXT);
5845 /* Append to the file */
5846 fff = my_fopen(filename, "w");
5852 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5854 msg_format("Failed to open file %s.", filename);
5862 /* Save the screen */
5866 /* Build the filename */
5867 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5868 tmpfff = my_fopen(buf, "r");
5870 for (i = 0; html_head[i]; i++)
5871 fprintf(fff, html_head[i]);
5875 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5877 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5881 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5883 fprintf(fff, "%s\n", buf);
5888 /* Dump the screen */
5889 for (y = 0; y < hgt; y++)
5896 for (x = 0; x < wid - 1; x++)
5900 /* Get the attr/char */
5901 (void)(Term_what(x, y, &a, &c));
5905 case '&': cc = "&"; break;
5906 case '<': cc = "<"; break;
5907 case '>': cc = ">"; break;
5909 case 0x1f: c = '.'; break;
5910 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5915 if ((y == 0 && x == 0) || a != old_a) {
5916 rv = angband_color_table[a][1];
5917 gv = angband_color_table[a][2];
5918 bv = angband_color_table[a][3];
5919 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5920 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5924 fprintf(fff, "%s", cc);
5926 fprintf(fff, "%c", c);
5929 fprintf(fff, "</font>");
5932 for (i = 0; html_foot[i]; i++)
5933 fprintf(fff, html_foot[i]);
5938 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5940 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5944 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5946 fprintf(fff, "%s\n", buf);
5961 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
5963 msg_print("Screen dump saved.");
5968 /* Restore the screen */
5974 * Hack -- save a screen dump to a file
5976 static void do_cmd_save_screen_html(void)
5978 char buf[1024], tmp[256] = "screen.html";
5981 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
5983 if (!get_string("File name: ", tmp, 80))
5987 /* Build the filename */
5988 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5992 do_cmd_save_screen_html_aux(buf, 1);
5997 * Redefinable "save_screen" action
5999 void (*screendump_aux)(void) = NULL;
6003 * Hack -- save a screen dump to a file
6005 void do_cmd_save_screen(void)
6007 bool old_use_graphics = use_graphics;
6008 bool html_dump = FALSE;
6013 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6015 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6020 if (c == 'Y' || c == 'y')
6022 else if (c == 'H' || c == 'h')
6034 Term_get_size(&wid, &hgt);
6036 if (old_use_graphics)
6038 use_graphics = FALSE;
6041 /* Redraw everything */
6042 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6044 /* Hack -- update */
6050 do_cmd_save_screen_html();
6054 /* Do we use a special screendump function ? */
6055 else if (screendump_aux)
6057 /* Dump the screen to a graphics file */
6058 (*screendump_aux)();
6060 else /* Dump the screen as text */
6071 /* Build the filename */
6072 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6074 /* File type is "TEXT" */
6075 FILE_TYPE(FILE_TYPE_TEXT);
6077 /* Append to the file */
6078 fff = my_fopen(buf, "w");
6084 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6086 msg_format("Failed to open file %s.", buf);
6093 /* Save the screen */
6097 /* Dump the screen */
6098 for (y = 0; y < hgt; y++)
6101 for (x = 0; x < wid - 1; x++)
6103 /* Get the attr/char */
6104 (void)(Term_what(x, y, &a, &c));
6114 fprintf(fff, "%s\n", buf);
6121 /* Dump the screen */
6122 for (y = 0; y < hgt; y++)
6125 for (x = 0; x < wid - 1; x++)
6127 /* Get the attr/char */
6128 (void)(Term_what(x, y, &a, &c));
6131 buf[x] = hack[a&0x0F];
6138 fprintf(fff, "%s\n", buf);
6150 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6152 msg_print("Screen dump saved.");
6158 /* Restore the screen */
6162 if (old_use_graphics)
6164 use_graphics = TRUE;
6167 /* Redraw everything */
6168 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6170 /* Hack -- update */
6177 * Sorting hook -- Comp function -- see below
6179 * We use "u" to point to array of monster indexes,
6180 * and "v" to select the type of sorting to perform on "u".
6182 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6184 u16b *who = (u16b*)(u);
6186 u16b *why = (u16b*)(v);
6193 /* Sort by total kills */
6196 /* Extract total kills */
6197 z1 = a_info[w1].tval;
6198 z2 = a_info[w2].tval;
6200 /* Compare total kills */
6201 if (z1 < z2) return (TRUE);
6202 if (z1 > z2) return (FALSE);
6206 /* Sort by monster level */
6209 /* Extract levels */
6210 z1 = a_info[w1].sval;
6211 z2 = a_info[w2].sval;
6213 /* Compare levels */
6214 if (z1 < z2) return (TRUE);
6215 if (z1 > z2) return (FALSE);
6219 /* Sort by monster experience */
6222 /* Extract experience */
6223 z1 = a_info[w1].level;
6224 z2 = a_info[w2].level;
6226 /* Compare experience */
6227 if (z1 < z2) return (TRUE);
6228 if (z1 > z2) return (FALSE);
6232 /* Compare indexes */
6238 * Sorting hook -- Swap function -- see below
6240 * We use "u" to point to array of monster indexes,
6241 * and "v" to select the type of sorting to perform.
6243 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6245 u16b *who = (u16b*)(u);
6260 * Check the status of "artifacts"
6262 static void do_cmd_knowledge_artifacts(void)
6264 int i, k, z, x, y, n = 0;
6270 char file_name[1024];
6272 char base_name[MAX_NLEN];
6276 /* Open a new file */
6277 fff = my_fopen_temp(file_name, 1024);
6281 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6283 msg_format("Failed to create temporary file %s.", file_name);
6289 /* Allocate the "who" array */
6290 C_MAKE(who, max_a_idx, s16b);
6292 /* Allocate the "okay" array */
6293 C_MAKE(okay, max_a_idx, bool);
6295 /* Scan the artifacts */
6296 for (k = 0; k < max_a_idx; k++)
6298 artifact_type *a_ptr = &a_info[k];
6303 /* Skip "empty" artifacts */
6304 if (!a_ptr->name) continue;
6306 /* Skip "uncreated" artifacts */
6307 if (!a_ptr->cur_num) continue;
6313 /* Check the dungeon */
6314 for (y = 0; y < cur_hgt; y++)
6316 for (x = 0; x < cur_wid; x++)
6318 cave_type *c_ptr = &cave[y][x];
6320 s16b this_o_idx, next_o_idx = 0;
6322 /* Scan all objects in the grid */
6323 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6327 /* Acquire object */
6328 o_ptr = &o_list[this_o_idx];
6330 /* Acquire next object */
6331 next_o_idx = o_ptr->next_o_idx;
6333 /* Ignore non-artifacts */
6334 if (!object_is_fixed_artifact(o_ptr)) continue;
6336 /* Ignore known items */
6337 if (object_is_known(o_ptr)) continue;
6339 /* Note the artifact */
6340 okay[o_ptr->name1] = FALSE;
6345 /* Check the inventory and equipment */
6346 for (i = 0; i < INVEN_TOTAL; i++)
6348 object_type *o_ptr = &inventory[i];
6350 /* Ignore non-objects */
6351 if (!o_ptr->k_idx) continue;
6353 /* Ignore non-artifacts */
6354 if (!object_is_fixed_artifact(o_ptr)) continue;
6356 /* Ignore known items */
6357 if (object_is_known(o_ptr)) continue;
6359 /* Note the artifact */
6360 okay[o_ptr->name1] = FALSE;
6363 for (k = 0; k < max_a_idx; k++)
6365 if (okay[k]) who[n++] = k;
6368 /* Select the sort method */
6369 ang_sort_comp = ang_sort_art_comp;
6370 ang_sort_swap = ang_sort_art_swap;
6372 /* Sort the array by dungeon depth of monsters */
6373 ang_sort(who, &why, n);
6375 /* Scan the artifacts */
6376 for (k = 0; k < n; k++)
6378 artifact_type *a_ptr = &a_info[who[k]];
6382 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6384 strcpy(base_name, "Unknown Artifact");
6388 /* Obtain the base object type */
6389 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6397 /* Get local object */
6400 /* Create fake object */
6401 object_prep(q_ptr, z);
6403 /* Make it an artifact */
6404 q_ptr->name1 = (byte)who[k];
6406 /* Display as if known */
6407 q_ptr->ident |= IDENT_STORE;
6409 /* Describe the artifact */
6410 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6413 /* Hack -- Build the artifact name */
6415 fprintf(fff, " %s\n", base_name);
6417 fprintf(fff, " The %s\n", base_name);
6422 /* Free the "who" array */
6423 C_KILL(who, max_a_idx, s16b);
6425 /* Free the "okay" array */
6426 C_KILL(okay, max_a_idx, bool);
6428 /* Close the file */
6431 /* Display the file contents */
6433 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6435 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6439 /* Remove the file */
6445 * Display known uniques
6447 static void do_cmd_knowledge_uniques(void)
6455 char file_name[1024];
6457 /* Open a new file */
6458 fff = my_fopen_temp(file_name, 1024);
6462 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6464 msg_format("Failed to create temporary file %s.", file_name);
6470 /* Allocate the "who" array */
6471 C_MAKE(who, max_r_idx, s16b);
6473 /* Scan the monsters */
6474 for (i = 1; i < max_r_idx; i++)
6476 monster_race *r_ptr = &r_info[i];
6478 /* Use that monster */
6479 if (r_ptr->name) who[n++] = i;
6482 /* Select the sort method */
6483 ang_sort_comp = ang_sort_comp_hook;
6484 ang_sort_swap = ang_sort_swap_hook;
6486 /* Sort the array by dungeon depth of monsters */
6487 ang_sort(who, &why, n);
6489 /* Scan the monster races */
6490 for (k = 0; k < n; k++)
6492 monster_race *r_ptr = &r_info[who[k]];
6494 /* Only print Uniques */
6495 if (r_ptr->flags1 & (RF1_UNIQUE))
6497 bool dead = (r_ptr->max_num == 0);
6501 /* Only display "known" uniques */
6502 if (dead || cheat_know || r_ptr->r_sights)
6504 /* Print a message */
6506 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6507 (r_name + r_ptr->name));
6509 fprintf(fff, " %s is alive\n",
6510 (r_name + r_ptr->name));
6517 /* Free the "who" array */
6518 C_KILL(who, max_r_idx, s16b);
6520 /* Close the file */
6523 /* Display the file contents */
6525 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6527 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6531 /* Remove the file */
6537 * Display weapon-exp
6539 static void do_cmd_knowledge_weapon_exp(void)
6541 int i, j, num, weapon_exp;
6545 char file_name[1024];
6548 /* Open a new file */
6549 fff = my_fopen_temp(file_name, 1024);
6552 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6554 msg_format("Failed to create temporary file %s.", file_name);
6560 for (i = 0; i < 5; i++)
6562 for (num = 0; num < 64; num++)
6564 for (j = 0; j < max_k_idx; j++)
6566 object_kind *k_ptr = &k_info[j];
6568 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6570 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6572 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6574 fprintf(fff, "%-25s ", tmp);
6575 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6576 else fprintf(fff, " ");
6577 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6578 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6586 /* Close the file */
6589 /* Display the file contents */
6591 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6593 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6597 /* Remove the file */
6605 static void do_cmd_knowledge_spell_exp(void)
6607 int i = 0, spell_exp, exp_level;
6612 char file_name[1024];
6614 /* Open a new file */
6615 fff = my_fopen_temp(file_name, 1024);
6618 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6620 msg_format("Failed to create temporary file %s.", file_name);
6626 if (p_ptr->realm1 != REALM_NONE)
6629 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6631 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6633 for (i = 0; i < 32; i++)
6635 if (!is_magic(p_ptr->realm1))
6637 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6641 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6643 if (s_ptr->slevel >= 99) continue;
6644 spell_exp = p_ptr->spell_exp[i];
6645 exp_level = spell_exp_level(spell_exp);
6646 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6647 if (p_ptr->realm1 == REALM_HISSATSU)
6648 fprintf(fff, "[--]");
6651 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6652 else fprintf(fff, " ");
6653 fprintf(fff, "%s", exp_level_str[exp_level]);
6655 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6660 if (p_ptr->realm2 != REALM_NONE)
6663 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6665 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6667 for (i = 0; i < 32; i++)
6669 if (!is_magic(p_ptr->realm1))
6671 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6675 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6677 if (s_ptr->slevel >= 99) continue;
6679 spell_exp = p_ptr->spell_exp[i + 32];
6680 exp_level = spell_exp_level(spell_exp);
6681 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6682 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6683 else fprintf(fff, " ");
6684 fprintf(fff, "%s", exp_level_str[exp_level]);
6685 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6690 /* Close the file */
6693 /* Display the file contents */
6695 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6697 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6701 /* Remove the file */
6709 static void do_cmd_knowledge_skill_exp(void)
6711 int i = 0, skill_exp;
6715 char file_name[1024];
6717 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6719 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6722 /* Open a new file */
6723 fff = my_fopen_temp(file_name, 1024);
6726 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6728 msg_format("Failed to create temporary file %s.", file_name);
6734 for (i = 0; i < 3; i++)
6736 skill_exp = p_ptr->skill_exp[i];
6737 fprintf(fff, "%-20s ", skill_name[i]);
6738 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6739 else fprintf(fff, " ");
6740 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6741 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6745 /* Close the file */
6748 /* Display the file contents */
6750 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6752 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6756 /* Remove the file */
6762 * Pluralize a monster name
6764 void plural_aux(char *Name)
6766 int NameLen = strlen(Name);
6768 if (my_strstr(Name, "Disembodied hand"))
6770 strcpy(Name, "Disembodied hands that strangled people");
6772 else if (my_strstr(Name, "Colour out of space"))
6774 strcpy(Name, "Colours out of space");
6776 else if (my_strstr(Name, "stairway to hell"))
6778 strcpy(Name, "stairways to hell");
6780 else if (my_strstr(Name, "Dweller on the threshold"))
6782 strcpy(Name, "Dwellers on the threshold");
6784 else if (my_strstr(Name, " of "))
6786 cptr aider = my_strstr(Name, " of ");
6797 if (dummy[i-1] == 's')
6799 strcpy(&(dummy[i]), "es");
6804 strcpy(&(dummy[i]), "s");
6807 strcpy(&(dummy[i+1]), aider);
6808 strcpy(Name, dummy);
6810 else if (my_strstr(Name, "coins"))
6813 strcpy(dummy, "piles of ");
6814 strcat(dummy, Name);
6815 strcpy(Name, dummy);
6818 else if (my_strstr(Name, "Manes"))
6822 else if (streq(&(Name[NameLen - 2]), "ey"))
6824 strcpy(&(Name[NameLen - 2]), "eys");
6826 else if (Name[NameLen - 1] == 'y')
6828 strcpy(&(Name[NameLen - 1]), "ies");
6830 else if (streq(&(Name[NameLen - 4]), "ouse"))
6832 strcpy(&(Name[NameLen - 4]), "ice");
6834 else if (streq(&(Name[NameLen - 2]), "us"))
6836 strcpy(&(Name[NameLen - 2]), "i");
6838 else if (streq(&(Name[NameLen - 6]), "kelman"))
6840 strcpy(&(Name[NameLen - 6]), "kelmen");
6842 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6844 strcpy(&(Name[NameLen - 8]), "wordsmen");
6846 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6848 strcpy(&(Name[NameLen - 7]), "oodsmen");
6850 else if (streq(&(Name[NameLen - 7]), "eastman"))
6852 strcpy(&(Name[NameLen - 7]), "eastmen");
6854 else if (streq(&(Name[NameLen - 8]), "izardman"))
6856 strcpy(&(Name[NameLen - 8]), "izardmen");
6858 else if (streq(&(Name[NameLen - 5]), "geist"))
6860 strcpy(&(Name[NameLen - 5]), "geister");
6862 else if (streq(&(Name[NameLen - 2]), "ex"))
6864 strcpy(&(Name[NameLen - 2]), "ices");
6866 else if (streq(&(Name[NameLen - 2]), "lf"))
6868 strcpy(&(Name[NameLen - 2]), "lves");
6870 else if (suffix(Name, "ch") ||
6871 suffix(Name, "sh") ||
6872 suffix(Name, "nx") ||
6873 suffix(Name, "s") ||
6876 strcpy(&(Name[NameLen]), "es");
6880 strcpy(&(Name[NameLen]), "s");
6885 * Display current pets
6887 static void do_cmd_knowledge_pets(void)
6891 monster_type *m_ptr;
6894 int show_upkeep = 0;
6895 char file_name[1024];
6898 /* Open a new file */
6899 fff = my_fopen_temp(file_name, 1024);
6902 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6904 msg_format("Failed to create temporary file %s.", file_name);
6910 /* Process the monsters (backwards) */
6911 for (i = m_max - 1; i >= 1; i--)
6913 /* Access the monster */
6916 /* Ignore "dead" monsters */
6917 if (!m_ptr->r_idx) continue;
6919 /* Calculate "upkeep" for pets */
6923 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6924 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6928 show_upkeep = calculate_upkeep();
6930 fprintf(fff, "----------------------------------------------\n");
6932 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
6933 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6935 fprintf(fff, " Total: %d pet%s.\n",
6936 t_friends, (t_friends == 1 ? "" : "s"));
6937 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6942 /* Close the file */
6945 /* Display the file contents */
6947 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6949 show_file(TRUE, file_name, "Current Pets", 0, 0);
6953 /* Remove the file */
6961 * Note that the player ghosts are ignored. XXX XXX XXX
6963 static void do_cmd_knowledge_kill_count(void)
6971 char file_name[1024];
6976 /* Open a new file */
6977 fff = my_fopen_temp(file_name, 1024);
6981 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6983 msg_format("Failed to create temporary file %s.", file_name);
6989 /* Allocate the "who" array */
6990 C_MAKE(who, max_r_idx, s16b);
6993 /* Monsters slain */
6996 for (kk = 1; kk < max_r_idx; kk++)
6998 monster_race *r_ptr = &r_info[kk];
7000 if (r_ptr->flags1 & (RF1_UNIQUE))
7002 bool dead = (r_ptr->max_num == 0);
7011 s16b This = r_ptr->r_pkills;
7022 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7024 fprintf(fff,"You have defeated no enemies yet.\n\n");
7027 else if (Total == 1)
7029 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7031 fprintf(fff,"You have defeated one enemy.\n\n");
7036 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7038 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7045 /* Scan the monsters */
7046 for (i = 1; i < max_r_idx; i++)
7048 monster_race *r_ptr = &r_info[i];
7050 /* Use that monster */
7051 if (r_ptr->name) who[n++] = i;
7054 /* Select the sort method */
7055 ang_sort_comp = ang_sort_comp_hook;
7056 ang_sort_swap = ang_sort_swap_hook;
7058 /* Sort the array by dungeon depth of monsters */
7059 ang_sort(who, &why, n);
7061 /* Scan the monster races */
7062 for (k = 0; k < n; k++)
7064 monster_race *r_ptr = &r_info[who[k]];
7066 if (r_ptr->flags1 & (RF1_UNIQUE))
7068 bool dead = (r_ptr->max_num == 0);
7072 /* Print a message */
7073 fprintf(fff, " %s\n",
7074 (r_name + r_ptr->name));
7080 s16b This = r_ptr->r_pkills;
7085 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7086 if(my_strchr("pt",r_ptr->d_char))
7087 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7089 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7093 if (my_strstr(r_name + r_ptr->name, "coins"))
7095 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7099 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7105 strcpy(ToPlural, (r_name + r_ptr->name));
7106 plural_aux(ToPlural);
7107 fprintf(fff, " %d %s\n", This, ToPlural);
7117 fprintf(fff,"----------------------------------------------\n");
7119 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7121 fprintf(fff," Total: %lu creature%s killed.\n",
7122 Total, (Total == 1 ? "" : "s"));
7126 /* Free the "who" array */
7127 C_KILL(who, max_r_idx, s16b);
7129 /* Close the file */
7132 /* Display the file contents */
7134 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7136 show_file(TRUE, file_name, "Kill Count", 0, 0);
7140 /* Remove the file */
7146 * Display the object groups.
7148 static void display_group_list(int col, int row, int wid, int per_page,
7149 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7153 /* Display lines until done */
7154 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7156 /* Get the group index */
7157 int grp = grp_idx[grp_top + i];
7159 /* Choose a color */
7160 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7162 /* Erase the entire line */
7163 Term_erase(col, row + i, wid);
7165 /* Display the group label */
7166 c_put_str(attr, group_text[grp], row + i, col);
7172 * Move the cursor in a browser window
7174 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7175 int *list_cur, int list_cnt)
7180 int list = *list_cur;
7182 /* Extract direction */
7185 /* Hack -- scroll up full screen */
7190 /* Hack -- scroll down full screen */
7195 d = get_keymap_dir(ch);
7200 /* Diagonals - hack */
7201 if ((ddx[d] > 0) && ddy[d])
7207 Term_get_size(&wid, &hgt);
7209 browser_rows = hgt - 8;
7211 /* Browse group list */
7216 /* Move up or down */
7217 grp += ddy[d] * (browser_rows - 1);
7220 if (grp >= grp_cnt) grp = grp_cnt - 1;
7221 if (grp < 0) grp = 0;
7222 if (grp != old_grp) list = 0;
7225 /* Browse sub-list list */
7228 /* Move up or down */
7229 list += ddy[d] * browser_rows;
7232 if (list >= list_cnt) list = list_cnt - 1;
7233 if (list < 0) list = 0;
7245 if (col < 0) col = 0;
7246 if (col > 1) col = 1;
7253 /* Browse group list */
7258 /* Move up or down */
7262 if (grp >= grp_cnt) grp = grp_cnt - 1;
7263 if (grp < 0) grp = 0;
7264 if (grp != old_grp) list = 0;
7267 /* Browse sub-list list */
7270 /* Move up or down */
7274 if (list >= list_cnt) list = list_cnt - 1;
7275 if (list < 0) list = 0;
7286 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7290 /* Clear the display lines */
7291 for (i = 0; i < height; i++)
7293 Term_erase(col, row + i, width);
7296 /* Bigtile mode uses double width */
7297 if (use_bigtile) width /= 2;
7299 /* Display lines until done */
7300 for (i = 0; i < height; i++)
7302 /* Display columns until done */
7303 for (j = 0; j < width; j++)
7311 /* Bigtile mode uses double width */
7312 if (use_bigtile) x += j;
7317 /* Ignore illegal characters */
7318 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7319 (!use_graphics && ic > 0x7f))
7325 /* Force correct code for both ASCII character and tile */
7326 if (c & 0x80) a |= 0x80;
7328 /* Display symbol */
7329 Term_queue_bigchar(x, y, a, c, 0, 0);
7336 * Place the cursor at the collect position for visual mode
7338 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7340 int i = (a & 0x7f) - attr_top;
7341 int j = c - char_left;
7346 /* Bigtile mode uses double width */
7347 if (use_bigtile) x += j;
7349 /* Place the cursor */
7355 * Clipboard variables for copy&paste in visual mode
7357 static byte attr_idx = 0;
7358 static byte char_idx = 0;
7360 /* Hack -- for feature lighting */
7361 static byte attr_idx_feat[F_LIT_MAX];
7362 static byte char_idx_feat[F_LIT_MAX];
7365 * Do visual mode command -- Change symbols
7367 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7368 int height, int width,
7369 byte *attr_top_ptr, byte *char_left_ptr,
7370 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
7372 static byte attr_old = 0, char_old = 0;
7377 if (*visual_list_ptr)
7380 *cur_attr_ptr = attr_old;
7381 *cur_char_ptr = char_old;
7382 *visual_list_ptr = FALSE;
7390 if (*visual_list_ptr)
7393 *visual_list_ptr = FALSE;
7394 *need_redraw = TRUE;
7402 if (!*visual_list_ptr)
7404 *visual_list_ptr = TRUE;
7406 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7407 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7409 attr_old = *cur_attr_ptr;
7410 char_old = *cur_char_ptr;
7421 /* Set the visual */
7422 attr_idx = *cur_attr_ptr;
7423 char_idx = *cur_char_ptr;
7425 /* Hack -- for feature lighting */
7426 for (i = 0; i < F_LIT_MAX; i++)
7428 attr_idx_feat[i] = 0;
7429 char_idx_feat[i] = 0;
7436 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow ATTR_DARK text */
7439 *cur_attr_ptr = attr_idx;
7440 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7441 if (!*visual_list_ptr) *need_redraw = TRUE;
7447 *cur_char_ptr = char_idx;
7448 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7449 if (!*visual_list_ptr) *need_redraw = TRUE;
7455 if (*visual_list_ptr)
7458 int d = get_keymap_dir(ch);
7459 byte a = (*cur_attr_ptr & 0x7f);
7460 byte c = *cur_char_ptr;
7462 if (use_bigtile) eff_width = width / 2;
7463 else eff_width = width;
7465 /* Restrict direction */
7466 if ((a == 0) && (ddy[d] < 0)) d = 0;
7467 if ((c == 0) && (ddx[d] < 0)) d = 0;
7468 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7469 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7474 /* Force correct code for both ASCII character and tile */
7475 if (c & 0x80) a |= 0x80;
7477 /* Set the visual */
7482 /* Move the frame */
7483 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7484 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7485 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7486 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7492 /* Visual mode command is not used */
7498 * Display the monsters in a group.
7500 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7501 int mon_cur, int mon_top)
7505 /* Display lines until done */
7506 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7510 /* Get the race index */
7511 int r_idx = mon_idx[mon_top + i] ;
7513 /* Access the race */
7514 monster_race *r_ptr = &r_info[r_idx];
7517 /* Choose a color */
7518 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7520 /* Display the name */
7521 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7523 /* Hack -- visual_list mode */
7526 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7528 else if (p_ptr->wizard)
7530 c_prt(attr, format("%d", r_idx), row + i, 60);
7533 /* Erase chars before overwritten by the race letter */
7534 Term_erase(69, row + i, 255);
7536 /* Display symbol */
7537 Term_queue_bigchar(70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
7541 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7543 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7545 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7550 /* Clear remaining lines */
7551 for (; i < per_page; i++)
7553 Term_erase(col, row + i, 255);
7559 * Display known monsters.
7561 static void do_cmd_knowledge_monsters(bool *need_redraw)
7564 int grp_cur, grp_top, old_grp_cur;
7565 int mon_cur, mon_top;
7566 int grp_cnt, grp_idx[100];
7574 bool visual_list = FALSE;
7575 byte attr_top = 0, char_left = 0;
7581 Term_get_size(&wid, &hgt);
7583 browser_rows = hgt - 8;
7585 /* Allocate the "mon_idx" array */
7586 C_MAKE(mon_idx, max_r_idx, s16b);
7591 /* Check every group */
7592 for (i = 0; monster_group_text[i] != NULL; i++)
7594 /* Measure the label */
7595 len = strlen(monster_group_text[i]);
7597 /* Save the maximum length */
7598 if (len > max) max = len;
7600 /* See if any monsters are known */
7601 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7603 /* Build a list of groups with known monsters */
7604 grp_idx[grp_cnt++] = i;
7608 /* Terminate the list */
7609 grp_idx[grp_cnt] = -1;
7612 grp_cur = grp_top = 0;
7613 mon_cur = mon_top = 0;
7622 monster_race *r_ptr;
7629 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7630 prt("¥°¥ë¡¼¥×", 4, 0);
7631 prt("̾Á°", 4, max + 3);
7632 if (p_ptr->wizard) prt("Idx", 4, 60);
7633 prt("ʸ»ú »¦³²¿ô", 4, 67);
7635 prt("Knowledge - Monsters", 2, 0);
7637 prt("Name", 4, max + 3);
7638 if (p_ptr->wizard) prt("Idx", 4, 60);
7639 prt("Sym Kills", 4, 67);
7642 for (i = 0; i < 78; i++)
7644 Term_putch(i, 5, TERM_WHITE, '=');
7647 for (i = 0; i < browser_rows; i++)
7649 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7655 /* Scroll group list */
7656 if (grp_cur < grp_top) grp_top = grp_cur;
7657 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7659 /* Display a list of monster groups */
7660 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7662 if (old_grp_cur != grp_cur)
7664 old_grp_cur = grp_cur;
7666 /* Get a list of monsters in the current group */
7667 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7670 /* Scroll monster list */
7671 while (mon_cur < mon_top)
7672 mon_top = MAX(0, mon_top - browser_rows/2);
7673 while (mon_cur >= mon_top + browser_rows)
7674 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7678 /* Display a list of monsters in the current group */
7679 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7685 /* Display a monster name */
7686 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7688 /* Display visual list below first monster */
7689 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7694 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7696 prt(format("<dir>, 'r' to recall%s%s, ESC", visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
7699 /* Get the current monster */
7700 r_ptr = &r_info[mon_idx[mon_cur]];
7702 /* Mega Hack -- track this monster race */
7703 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7705 /* Hack -- handle stuff */
7710 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7714 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7718 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7723 /* Do visual mode command if needed */
7724 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)) continue;
7737 /* Recall on screen */
7738 if (mon_idx[mon_cur])
7740 screen_roff(mon_idx[mon_cur], 0);
7751 /* Move the cursor */
7752 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7759 /* Free the "mon_idx" array */
7760 C_KILL(mon_idx, max_r_idx, s16b);
7765 * Display the objects in a group.
7767 static void display_object_list(int col, int row, int per_page, int object_idx[],
7768 int object_cur, int object_top)
7772 /* Display lines until done */
7773 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7778 /* Get the object index */
7779 int k_idx = object_idx[object_top + i];
7781 /* Access the object */
7782 object_kind *k_ptr = &k_info[k_idx];
7784 /* Choose a color */
7785 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7786 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7788 attr = ((i + object_top == object_cur) ? cursor : attr);
7791 strip_name(o_name, k_idx);
7793 /* Display the name */
7794 c_prt(attr, o_name, row + i, col);
7796 /* Hack -- visual_list mode */
7799 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7801 else if (p_ptr->wizard)
7803 c_prt(attr, format ("%d", k_idx), row + i, 70);
7806 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7807 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7809 /* Symbol is unknown */
7810 if (!k_ptr->aware && !p_ptr->wizard)
7816 /* Display symbol */
7817 Term_queue_bigchar(76, row + i, a, c, 0, 0);
7820 /* Clear remaining lines */
7821 for (; i < per_page; i++)
7823 Term_erase(col, row + i, 255);
7828 * Describe fake object
7830 static void desc_obj_fake(int k_idx)
7833 object_type object_type_body;
7835 /* Get local object */
7836 o_ptr = &object_type_body;
7838 /* Wipe the object */
7841 /* Create the artifact */
7842 object_prep(o_ptr, k_idx);
7844 /* It's fully know */
7845 o_ptr->ident |= IDENT_KNOWN;
7847 /* Track the object */
7848 /* object_actual_track(o_ptr); */
7850 /* Hack - mark as fake */
7851 /* term_obj_real = FALSE; */
7853 /* Hack -- Handle stuff */
7856 if (!screen_object(o_ptr, FALSE))
7859 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7861 msg_print("You see nothing special.");
7870 * Display known objects
7872 static void do_cmd_knowledge_objects(bool *need_redraw)
7875 int grp_cur, grp_top, old_grp_cur;
7876 int object_old, object_cur, object_top;
7877 int grp_cnt, grp_idx[100];
7885 bool visual_list = FALSE;
7886 byte attr_top = 0, char_left = 0;
7892 Term_get_size(&wid, &hgt);
7894 browser_rows = hgt - 8;
7896 /* Allocate the "object_idx" array */
7897 C_MAKE(object_idx, max_k_idx, int);
7902 /* Check every group */
7903 for (i = 0; object_group_text[i] != NULL; i++)
7905 /* Measure the label */
7906 len = strlen(object_group_text[i]);
7908 /* Save the maximum length */
7909 if (len > max) max = len;
7911 /* See if any monsters are known */
7912 if (collect_objects(i, object_idx))
7914 /* Build a list of groups with known monsters */
7915 grp_idx[grp_cnt++] = i;
7919 /* Terminate the list */
7920 grp_idx[grp_cnt] = -1;
7923 grp_cur = grp_top = 0;
7924 object_cur = object_top = 0;
7941 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
7942 prt("¥°¥ë¡¼¥×", 4, 0);
7943 prt("̾Á°", 4, max + 3);
7944 if (p_ptr->wizard) prt("Idx", 4, 70);
7947 prt("Knowledge - objects", 2, 0);
7949 prt("Name", 4, max + 3);
7950 if (p_ptr->wizard) prt("Idx", 4, 70);
7954 for (i = 0; i < 78; i++)
7956 Term_putch(i, 5, TERM_WHITE, '=');
7959 for (i = 0; i < browser_rows; i++)
7961 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7967 /* Scroll group list */
7968 if (grp_cur < grp_top) grp_top = grp_cur;
7969 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7971 /* Display a list of object groups */
7972 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7974 if (old_grp_cur != grp_cur)
7976 old_grp_cur = grp_cur;
7978 /* Get a list of objects in the current group */
7979 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
7982 /* Scroll object list */
7983 while (object_cur < object_top)
7984 object_top = MAX(0, object_top - browser_rows/2);
7985 while (object_cur >= object_top + browser_rows)
7986 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7990 /* Display a list of objects in the current group */
7991 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
7995 object_top = object_cur;
7997 /* Display a list of objects in the current group */
7998 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
8000 /* Display visual list below first object */
8001 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8004 /* Get the current object */
8005 k_ptr = &k_info[object_idx[object_cur]];
8007 /* Mega Hack -- track this object */
8008 if (object_cnt) object_kind_track(object_idx[object_cur]);
8012 prt(format("<Êý¸þ>, 'r'¤Ç¾ÜºÙ¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8014 prt(format("<dir>, 'r' to recall%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
8017 /* The "current" object changed */
8018 if (object_old != object_idx[object_cur])
8020 /* Hack -- handle stuff */
8023 /* Remember the "current" object */
8024 object_old = object_idx[object_cur];
8029 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8033 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8037 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8042 /* Do visual mode command if needed */
8043 /* Symbol of objects with flavor cannot be changed */
8044 if (!k_ptr->flavor && visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &k_ptr->x_attr, &k_ptr->x_char, need_redraw)) continue;
8057 /* Recall on screen */
8059 desc_obj_fake(object_idx[object_cur]);
8067 /* Move the cursor */
8068 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8074 /* Free the "object_idx" array */
8075 C_KILL(object_idx, max_k_idx, int);
8079 #define NS_LIT_NUM (F_LIT_MAX - F_LIT_NS_BEGIN)
8080 #define ROW_LIT_STANDARD 65
8083 * Display the features in a group.
8085 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8086 int feat_cur, int feat_top, int lighting_level)
8088 int ns_lit_col[NS_LIT_NUM], i, j;
8090 /* Correct columns 1 and 4 */
8091 for (i = 0; i < NS_LIT_NUM; i++)
8092 ns_lit_col[i] = ROW_LIT_STANDARD + 2 + i * 2 + (use_bigtile ? (1 + i) : 0);
8094 /* Display lines until done */
8095 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8100 int f_idx = feat_idx[feat_top + i];
8102 /* Access the index */
8103 feature_type *f_ptr = &f_info[f_idx];
8105 int row_i = row + i;
8107 /* Choose a color */
8108 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8110 /* Display the name */
8111 c_prt(attr, f_name + f_ptr->name, row_i, col);
8113 /* Hack -- visual_list mode */
8116 /* Display lighting level */
8117 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
8119 c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row_i, ROW_LIT_STANDARD - 9);
8122 /* Display symbol */
8123 Term_queue_bigchar(ROW_LIT_STANDARD, row_i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0);
8125 Term_putch(ns_lit_col[0], row_i, TERM_SLATE, '(');
8126 for (j = 1; j < NS_LIT_NUM; j++)
8128 Term_putch(ns_lit_col[j], row_i, TERM_SLATE, '/');
8130 Term_putch(ns_lit_col[NS_LIT_NUM - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
8132 /* Mega-hack -- Use non-standard colour */
8133 for (j = 0; j < NS_LIT_NUM; j++)
8135 Term_queue_bigchar(ns_lit_col[j] + 1, row_i, f_ptr->x_attr[F_LIT_NS_BEGIN + j], f_ptr->x_char[F_LIT_NS_BEGIN + j], 0, 0);
8139 /* Clear remaining lines */
8140 for (; i < per_page; i++)
8142 Term_erase(col, row + i, 255);
8148 * Interact with feature visuals.
8150 static void do_cmd_knowledge_features(bool *need_redraw)
8153 int grp_cur, grp_top, old_grp_cur;
8154 int feat_cur, feat_top;
8155 int grp_cnt, grp_idx[100];
8163 bool visual_list = FALSE;
8164 byte attr_top = 0, char_left = 0;
8169 byte attr_old[F_LIT_MAX];
8170 byte char_old[F_LIT_MAX];
8171 byte *cur_attr_ptr, *cur_char_ptr;
8172 int lighting_level = F_LIT_STANDARD;
8174 C_WIPE(attr_old, F_LIT_MAX, byte);
8175 C_WIPE(char_old, F_LIT_MAX, byte);
8178 Term_get_size(&wid, &hgt);
8180 browser_rows = hgt - 8;
8182 /* Allocate the "feat_idx" array */
8183 C_MAKE(feat_idx, max_f_idx, int);
8188 /* Check every group */
8189 for (i = 0; feature_group_text[i] != NULL; i++)
8191 /* Measure the label */
8192 len = strlen(feature_group_text[i]);
8194 /* Save the maximum length */
8195 if (len > max) max = len;
8197 /* See if any features are known */
8198 if (collect_features(i, feat_idx))
8200 /* Build a list of groups with known features */
8201 grp_idx[grp_cnt++] = i;
8205 /* Terminate the list */
8206 grp_idx[grp_cnt] = -1;
8209 grp_cur = grp_top = 0;
8210 feat_cur = feat_top = 0;
8216 while ((!flag) && (grp_cnt))
8219 feature_type *f_ptr;
8226 prt("ɽ¼¨ - ÃÏ·Á", 2, 0);
8227 prt("¥°¥ë¡¼¥×", 4, 0);
8228 prt("̾Á°", 4, max + 3);
8229 if (use_bigtile) prt("ʸ»ú ( l/ d/ D)", 4, 63);
8230 else prt("ʸ»ú (l/d/D)", 4, 62);
8232 prt("Visuals - features", 2, 0);
8234 prt("Name", 4, max + 3);
8235 if (use_bigtile) prt("Sym ( l/ d/ D)", 4, 64);
8236 else prt("Sym (l/d/D)", 4, 63);
8239 for (i = 0; i < 78; i++)
8241 Term_putch(i, 5, TERM_WHITE, '=');
8244 for (i = 0; i < browser_rows; i++)
8246 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8252 /* Scroll group list */
8253 if (grp_cur < grp_top) grp_top = grp_cur;
8254 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8256 /* Display a list of feature groups */
8257 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8259 if (old_grp_cur != grp_cur)
8261 old_grp_cur = grp_cur;
8263 /* Get a list of features in the current group */
8264 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8267 /* Scroll feature list */
8268 while (feat_cur < feat_top)
8269 feat_top = MAX(0, feat_top - browser_rows/2);
8270 while (feat_cur >= feat_top + browser_rows)
8271 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8275 /* Display a list of features in the current group */
8276 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, F_LIT_STANDARD);
8280 feat_top = feat_cur;
8282 /* Display a list of features in the current group */
8283 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, lighting_level);
8285 /* Display visual list below first object */
8286 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8291 prt(format("<Êý¸þ>%s, 'd'¤Çɸ½à¸÷¸»¸ú²Ì%s, ESC", visual_list ? ", ENTER¤Ç·èÄê, 'a'¤ÇÂоÝÌÀÅÙÊѹ¹" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8293 prt(format("<dir>%s, 'd' for default lighting%s, ESC", visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
8296 /* Get the current feature */
8297 f_ptr = &f_info[feat_idx[feat_cur]];
8298 cur_attr_ptr = &f_ptr->x_attr[lighting_level];
8299 cur_char_ptr = &f_ptr->x_char[lighting_level];
8303 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
8307 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8311 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8316 if (visual_list && ((ch == 'A') || (ch == 'a')))
8318 int prev_lighting_level = lighting_level;
8322 if (lighting_level <= 0) lighting_level = F_LIT_MAX - 1;
8323 else lighting_level--;
8327 if (lighting_level >= F_LIT_MAX - 1) lighting_level = 0;
8328 else lighting_level++;
8331 if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[lighting_level])
8332 attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
8334 if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[lighting_level])
8335 char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
8340 else if ((ch == 'D') || (ch == 'd'))
8342 byte prev_x_attr = f_ptr->x_attr[lighting_level];
8343 byte prev_x_char = f_ptr->x_char[lighting_level];
8345 apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
8349 if (prev_x_attr != f_ptr->x_attr[lighting_level])
8350 attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
8352 if (prev_x_char != f_ptr->x_char[lighting_level])
8353 char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
8355 else *need_redraw = TRUE;
8360 /* Do visual mode command if needed */
8361 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))
8365 /* Restore previous visual settings */
8367 for (i = 0; i < F_LIT_MAX; i++)
8369 f_ptr->x_attr[i] = attr_old[i];
8370 f_ptr->x_char[i] = char_old[i];
8377 lighting_level = F_LIT_STANDARD;
8380 /* Preserve current visual settings */
8383 for (i = 0; i < F_LIT_MAX; i++)
8385 attr_old[i] = f_ptr->x_attr[i];
8386 char_old[i] = f_ptr->x_char[i];
8388 lighting_level = F_LIT_STANDARD;
8395 for (i = 0; i < F_LIT_MAX; i++)
8397 attr_idx_feat[i] = f_ptr->x_attr[i];
8398 char_idx_feat[i] = f_ptr->x_char[i];
8407 /* Allow ATTR_DARK text */
8408 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
8410 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
8411 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
8429 /* Move the cursor */
8430 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8437 if (!grp_cnt) msg_print("No features known.");
8439 /* Free the "feat_idx" array */
8440 C_KILL(feat_idx, max_f_idx, int);
8445 * List wanted monsters
8447 static void do_cmd_knowledge_kubi(void)
8452 char file_name[1024];
8455 /* Open a new file */
8456 fff = my_fopen_temp(file_name, 1024);
8459 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8461 msg_format("Failed to create temporary file %s.", file_name);
8469 bool listed = FALSE;
8472 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8474 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8476 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8478 fprintf(fff, "List of wanted monsters\n");
8480 fprintf(fff, "----------------------------------------------\n");
8482 for (i = 0; i < MAX_KUBI; i++)
8484 if (kubi_r_idx[i] <= 10000)
8486 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8495 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8497 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8502 /* Close the file */
8505 /* Display the file contents */
8507 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8509 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8513 /* Remove the file */
8518 * List virtues & status
8520 static void do_cmd_knowledge_virtues(void)
8524 char file_name[1024];
8527 /* Open a new file */
8528 fff = my_fopen_temp(file_name, 1024);
8531 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8533 msg_format("Failed to create temporary file %s.", file_name);
8542 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8544 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8549 /* Close the file */
8552 /* Display the file contents */
8554 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8556 show_file(TRUE, file_name, "Virtues", 0, 0);
8560 /* Remove the file */
8568 static void do_cmd_knowledge_dungeon(void)
8572 char file_name[1024];
8576 /* Open a new file */
8577 fff = my_fopen_temp(file_name, 1024);
8580 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8582 msg_format("Failed to create temporary file %s.", file_name);
8590 for (i = 1; i < max_d_idx; i++)
8594 if (!d_info[i].maxdepth) continue;
8595 if (!max_dlv[i]) continue;
8596 if (d_info[i].final_guardian)
8598 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8600 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8602 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8604 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8609 /* Close the file */
8612 /* Display the file contents */
8614 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8616 show_file(TRUE, file_name, "Dungeon", 0, 0);
8620 /* Remove the file */
8625 * List virtues & status
8628 static void do_cmd_knowledge_stat(void)
8632 char file_name[1024];
8635 /* Open a new file */
8636 fff = my_fopen_temp(file_name, 1024);
8639 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8641 msg_format("Failed to create temporary file %s.", file_name);
8649 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8650 (2 * p_ptr->hitdie +
8651 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8654 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8655 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8656 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8658 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8659 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8660 fprintf(fff, "Limits of maximum stats\n\n");
8662 for (v_nr = 0; v_nr < 6; v_nr++)
8664 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);
8665 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8671 /* Close the file */
8674 /* Display the file contents */
8676 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8678 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8682 /* Remove the file */
8688 * Print all active quests
8690 static void do_cmd_knowledge_quests_current(FILE *fff)
8693 char rand_tmp_str[120] = "\0";
8695 monster_race *r_ptr;
8697 int rand_level = 100;
8701 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8703 fprintf(fff, "< Current Quest >\n");
8706 for (i = 1; i < max_quests; i++)
8708 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8710 /* Set the quest number temporary */
8711 int old_quest = p_ptr->inside_quest;
8714 /* Clear the text */
8715 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8716 quest_text_line = 0;
8718 p_ptr->inside_quest = i;
8720 /* Get the quest text */
8721 init_flags = INIT_SHOW_TEXT;
8723 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8725 /* Reset the old quest number */
8726 p_ptr->inside_quest = old_quest;
8728 /* No info from "silent" quests */
8729 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8733 if (quest[i].type != QUEST_TYPE_RANDOM)
8735 char note[80] = "\0";
8737 if (quest[i].status == QUEST_STATUS_TAKEN)
8739 switch (quest[i].type)
8741 case QUEST_TYPE_KILL_LEVEL:
8742 case QUEST_TYPE_KILL_ANY_LEVEL:
8743 r_ptr = &r_info[quest[i].r_idx];
8744 strcpy(name, r_name + r_ptr->name);
8745 if (quest[i].max_num > 1)
8748 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8749 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8752 sprintf(note," - kill %d %s, have killed %d.",
8753 quest[i].max_num, name, quest[i].cur_num);
8758 sprintf(note," - %s¤òÅݤ¹¡£",name);
8760 sprintf(note," - kill %s.",name);
8764 case QUEST_TYPE_FIND_ARTIFACT:
8765 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8767 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8769 sprintf(note," - Find out %s.", name);
8773 case QUEST_TYPE_FIND_EXIT:
8775 sprintf(note," - õº÷¤¹¤ë¡£");
8777 sprintf(note," - Search.");
8781 case QUEST_TYPE_KILL_NUMBER:
8783 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8784 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8786 sprintf(note," - Kill %d monsters, have killed %d.",
8787 quest[i].max_num, quest[i].cur_num);
8791 case QUEST_TYPE_KILL_ALL:
8793 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8795 sprintf(note," - Kill all monsters.");
8801 /* Print the quest info */
8803 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8804 quest[i].name, quest[i].level, note);
8806 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8807 quest[i].name, quest[i].level, note);
8810 fprintf(fff, tmp_str);
8812 if (quest[i].status == QUEST_STATUS_COMPLETED)
8815 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8817 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8819 fprintf(fff, tmp_str);
8825 while (quest_text[j][0] && j < 10)
8827 fprintf(fff, " %s\n", quest_text[j]);
8832 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8835 rand_level = quest[i].level;
8837 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8839 /* Print the quest info */
8840 r_ptr = &r_info[quest[i].r_idx];
8841 strcpy(name, r_name + r_ptr->name);
8843 if (quest[i].max_num > 1)
8846 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8847 quest[i].name, quest[i].level,
8848 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8852 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8853 quest[i].name, quest[i].level,
8854 quest[i].max_num, name, quest[i].cur_num);
8860 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8861 quest[i].name, quest[i].level, name);
8863 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8864 quest[i].name, quest[i].level, name);
8872 /* Print the current random quest */
8873 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8876 if (!total) fprintf(fff, " ¤Ê¤·\n");
8878 if (!total) fprintf(fff, " Nothing.\n");
8884 * Print all finished quests
8886 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8893 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8895 fprintf(fff, "< Completed Quest >\n");
8897 for (i = 1; i < max_quests; i++)
8899 int q_idx = quest_num[i];
8901 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8903 if (is_fixed_quest_idx(q_idx))
8905 /* Set the quest number temporary */
8906 int old_quest = p_ptr->inside_quest;
8908 p_ptr->inside_quest = q_idx;
8911 init_flags = INIT_ASSIGN;
8913 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8915 /* Reset the old quest number */
8916 p_ptr->inside_quest = old_quest;
8918 /* No info from "silent" quests */
8919 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8924 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8926 /* Print the quest info */
8928 if (quest[q_idx].complev == 0)
8932 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8934 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8936 r_name+r_info[quest[q_idx].r_idx].name,
8937 quest[q_idx].level);
8943 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8945 " %-40s (Dungeon level: %3d) - level %2d\n",
8947 r_name+r_info[quest[q_idx].r_idx].name,
8949 quest[q_idx].complev);
8954 /* Print the quest info */
8956 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8957 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8959 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8960 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8964 fprintf(fff, tmp_str);
8968 if (!total) fprintf(fff, " ¤Ê¤·\n");
8970 if (!total) fprintf(fff, " Nothing.\n");
8976 * Print all failed quests
8978 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8985 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8987 fprintf(fff, "< Failed Quest >\n");
8989 for (i = 1; i < max_quests; i++)
8991 int q_idx = quest_num[i];
8993 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8995 if (is_fixed_quest_idx(q_idx))
8997 /* Set the quest number temporary */
8998 int old_quest = p_ptr->inside_quest;
9000 p_ptr->inside_quest = q_idx;
9002 /* Get the quest text */
9003 init_flags = INIT_ASSIGN;
9005 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
9007 /* Reset the old quest number */
9008 p_ptr->inside_quest = old_quest;
9010 /* No info from "silent" quests */
9011 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
9016 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
9018 /* Print the quest info */
9020 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
9021 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
9023 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
9024 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
9029 /* Print the quest info */
9031 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
9032 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9034 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
9035 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9038 fprintf(fff, tmp_str);
9042 if (!total) fprintf(fff, " ¤Ê¤·\n");
9044 if (!total) fprintf(fff, " Nothing.\n");
9050 * Print all random quests
9052 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
9059 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
9061 fprintf(fff, "< Remaining Random Quest >\n");
9063 for (i = 1; i < max_quests; i++)
9065 /* No info from "silent" quests */
9066 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
9068 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
9072 /* Print the quest info */
9074 sprintf(tmp_str, " %s (%d³¬, %s)\n",
9075 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9077 sprintf(tmp_str, " %s (%d, %s)\n",
9078 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9080 fprintf(fff, tmp_str);
9084 if (!total) fprintf(fff, " ¤Ê¤·\n");
9086 if (!total) fprintf(fff, " Nothing.\n");
9091 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
9093 int *q_num = (int *)u;
9094 quest_type *qa = &quest[q_num[a]];
9095 quest_type *qb = &quest[q_num[b]];
9100 if (qa->complev < qb->complev) return TRUE;
9101 if (qa->complev > qb->complev) return FALSE;
9102 if (qa->level <= qb->level) return TRUE;
9106 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9108 int *q_num = (int *)u;
9115 q_num[a] = q_num[b];
9121 * Print quest status of all active quests
9123 static void do_cmd_knowledge_quests(void)
9126 char file_name[1024];
9127 int *quest_num, dummy, i;
9129 /* Open a new file */
9130 fff = my_fopen_temp(file_name, 1024);
9134 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9136 msg_format("Failed to create temporary file %s.", file_name);
9142 /* Allocate Memory */
9143 C_MAKE(quest_num, max_quests, int);
9145 /* Sort by compete level */
9146 for (i = 1; i < max_quests; i++) quest_num[i] = i;
9147 ang_sort_comp = ang_sort_comp_quest_num;
9148 ang_sort_swap = ang_sort_swap_quest_num;
9149 ang_sort(quest_num, &dummy, max_quests);
9151 /* Dump Quest Information */
9152 do_cmd_knowledge_quests_current(fff);
9154 do_cmd_knowledge_quests_completed(fff, quest_num);
9156 do_cmd_knowledge_quests_failed(fff, quest_num);
9160 do_cmd_knowledge_quests_wiz_random(fff);
9163 /* Close the file */
9166 /* Display the file contents */
9168 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9170 show_file(TRUE, file_name, "Quest status", 0, 0);
9173 /* Remove the file */
9177 C_KILL(quest_num, max_quests, int);
9184 static void do_cmd_knowledge_home(void)
9189 char file_name[1024];
9191 char o_name[MAX_NLEN];
9194 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9196 /* Open a new file */
9197 fff = my_fopen_temp(file_name, 1024);
9200 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9202 msg_format("Failed to create temporary file %s.", file_name);
9210 /* Print all homes in the different towns */
9211 st_ptr = &town[1].store[STORE_HOME];
9213 /* Home -- if anything there */
9214 if (st_ptr->stock_num)
9219 /* Header with name of the town */
9221 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9223 fprintf(fff, " [Home Inventory]\n");
9226 /* Dump all available items */
9227 for (i = 0; i < st_ptr->stock_num; i++)
9230 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9231 object_desc(o_name, &st_ptr->stock[i], 0);
9232 if (strlen(o_name) <= 80-3)
9234 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9240 for (n = 0, t = o_name; n < 80-3; n++, t++)
9241 if(iskanji(*t)) {t++; n++;}
9242 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9244 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9245 fprintf(fff, " %.77s\n", o_name+n);
9248 object_desc(o_name, &st_ptr->stock[i], 0);
9249 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9254 /* Add an empty line */
9255 fprintf(fff, "\n\n");
9259 /* Close the file */
9262 /* Display the file contents */
9264 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9266 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9270 /* Remove the file */
9276 * Check the status of "autopick"
9278 static void do_cmd_knowledge_autopick(void)
9282 char file_name[1024];
9284 /* Open a new file */
9285 fff = my_fopen_temp(file_name, 1024);
9290 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9292 msg_format("Failed to create temporary file %s.", file_name);
9301 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9303 fprintf(fff, "No preference for auto picker/destroyer.");
9309 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9311 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9315 for (k = 0; k < max_autopick; k++)
9318 byte act = autopick_list[k].action;
9319 if (act & DONT_AUTOPICK)
9327 else if (act & DO_AUTODESTROY)
9335 else if (act & DO_AUTOPICK)
9343 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9352 if (act & DO_DISPLAY)
9353 fprintf(fff, "%11s", format("[%s]", tmp));
9355 fprintf(fff, "%11s", format("(%s)", tmp));
9357 tmp = autopick_line_from_entry(&autopick_list[k]);
9358 fprintf(fff, " %s", tmp);
9362 /* Close the file */
9364 /* Display the file contents */
9366 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9368 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9371 /* Remove the file */
9377 * Interact with "knowledge"
9379 void do_cmd_knowledge(void)
9382 bool need_redraw = FALSE;
9384 /* File type is "TEXT" */
9385 FILE_TYPE(FILE_TYPE_TEXT);
9387 /* Save the screen */
9390 /* Interact until done */
9396 /* Ask for a choice */
9398 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9399 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9401 prt(format("page %d/2", (p+1)), 2, 65);
9402 prt("Display current knowledge", 3, 0);
9405 /* Give some choices */
9409 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9410 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9411 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9412 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9413 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9414 if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9415 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9416 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9417 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9418 prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5);
9422 prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5);
9423 prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5);
9424 prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5);
9425 prt("(d) ËâË¡¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 9, 5);
9426 prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 10, 5);
9427 prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ ¤Î°ìÍ÷", 11, 5);
9428 prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó ¤Î°ìÍ÷", 12, 5);
9429 prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È ¤Î°ìÍ÷", 13, 5);
9430 prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5);
9435 prt("(1) Display known artifacts", 6, 5);
9436 prt("(2) Display known objects", 7, 5);
9437 prt("(3) Display remaining uniques", 8, 5);
9438 prt("(4) Display known monster", 9, 5);
9439 prt("(5) Display kill count", 10, 5);
9440 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9441 prt("(7) Display current pets", 12, 5);
9442 prt("(8) Display home inventory", 13, 5);
9443 prt("(9) Display *identified* equip.", 14, 5);
9444 prt("(0) Display terrain symbols.", 15, 5);
9448 prt("(a) Display about yourself", 6, 5);
9449 prt("(b) Display mutations", 7, 5);
9450 prt("(c) Display weapon proficiency", 8, 5);
9451 prt("(d) Display spell proficiency", 9, 5);
9452 prt("(e) Display misc. proficiency", 10, 5);
9453 prt("(f) Display virtues", 11, 5);
9454 prt("(g) Display dungeons", 12, 5);
9455 prt("(h) Display current quests", 13, 5);
9456 prt("(i) Display auto pick/destroy", 14, 5);
9461 prt("-³¤¯-", 17, 8);
9462 prt("ESC) È´¤±¤ë", 21, 1);
9463 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9464 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9465 prt("¥³¥Þ¥ó¥É:", 20, 0);
9467 prt("-more-", 17, 8);
9468 prt("ESC) Exit menu", 21, 1);
9469 prt("SPACE) Next page", 21, 30);
9470 /*prt("-) Previous page", 21, 60);*/
9471 prt("Command: ", 20, 0);
9478 if (i == ESCAPE) break;
9481 case ' ': /* Page change */
9485 case '1': /* Artifacts */
9486 do_cmd_knowledge_artifacts();
9488 case '2': /* Objects */
9489 do_cmd_knowledge_objects(&need_redraw);
9491 case '3': /* Uniques */
9492 do_cmd_knowledge_uniques();
9494 case '4': /* Monsters */
9495 do_cmd_knowledge_monsters(&need_redraw);
9497 case '5': /* Kill count */
9498 do_cmd_knowledge_kill_count();
9500 case '6': /* wanted */
9501 if (!vanilla_town) do_cmd_knowledge_kubi();
9503 case '7': /* Pets */
9504 do_cmd_knowledge_pets();
9506 case '8': /* Home */
9507 do_cmd_knowledge_home();
9509 case '9': /* Resist list */
9510 do_cmd_knowledge_inven();
9512 case '0': /* Feature list */
9513 do_cmd_knowledge_features(&need_redraw);
9516 case 'a': /* Max stat */
9517 do_cmd_knowledge_stat();
9519 case 'b': /* Mutations */
9520 do_cmd_knowledge_mutations();
9522 case 'c': /* weapon-exp */
9523 do_cmd_knowledge_weapon_exp();
9525 case 'd': /* spell-exp */
9526 do_cmd_knowledge_spell_exp();
9528 case 'e': /* skill-exp */
9529 do_cmd_knowledge_skill_exp();
9531 case 'f': /* Virtues */
9532 do_cmd_knowledge_virtues();
9534 case 'g': /* Dungeon */
9535 do_cmd_knowledge_dungeon();
9537 case 'h': /* Quests */
9538 do_cmd_knowledge_quests();
9540 case 'i': /* Autopick */
9541 do_cmd_knowledge_autopick();
9543 default: /* Unknown option */
9547 /* Flush messages */
9551 /* Restore the screen */
9554 if (need_redraw) do_cmd_redraw();
9559 * Check on the status of an active quest
9561 void do_cmd_checkquest(void)
9563 /* File type is "TEXT" */
9564 FILE_TYPE(FILE_TYPE_TEXT);
9566 /* Save the screen */
9570 do_cmd_knowledge_quests();
9572 /* Restore the screen */
9578 * Display the time and date
9580 void do_cmd_time(void)
9582 int day, hour, min, full, start, end, num;
9589 extract_day_hour_min(&day, &hour, &min);
9591 full = hour * 100 + min;
9599 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9601 strcpy(desc, "It is a strange time.");
9607 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9608 day, (hour % 12 == 0) ? 12 : (hour % 12),
9609 min, (hour < 12) ? "AM" : "PM");
9611 msg_format("This is day %d. The time is %d:%02d %s.",
9612 day, (hour % 12 == 0) ? 12 : (hour % 12),
9613 min, (hour < 12) ? "AM" : "PM");
9618 if (!randint0(10) || p_ptr->image)
9621 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9623 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9630 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9632 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9637 /* Open this file */
9638 fff = my_fopen(buf, "rt");
9643 /* Find this time */
9644 while (!my_fgets(fff, buf, sizeof(buf)))
9646 /* Ignore comments */
9647 if (!buf[0] || (buf[0] == '#')) continue;
9649 /* Ignore invalid lines */
9650 if (buf[1] != ':') continue;
9652 /* Process 'Start' */
9655 /* Extract the starting time */
9656 start = atoi(buf + 2);
9658 /* Assume valid for an hour */
9668 /* Extract the ending time */
9669 end = atoi(buf + 2);
9675 /* Ignore incorrect range */
9676 if ((start > full) || (full > end)) continue;
9678 /* Process 'Description' */
9683 /* Apply the randomizer */
9684 if (!randint0(num)) strcpy(desc, buf + 2);
9694 /* Close the file */