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 or 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 or 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);
3533 /* Go to the correct location */
3536 /* Hack -- limit the value */
3539 /* Get an encoded action */
3540 if (!askfor(buf, 80)) continue;
3542 /* Extract an action */
3543 text_to_ascii(macro__buf, buf);
3546 #endif /* ALLOW_MACROS */
3555 /* Flush messages */
3564 static cptr lighting_level_str[F_LIT_MAX] =
3580 static void cmd_visuals_aux(int i, int *num, int max)
3587 sprintf(str, "%d", *num);
3589 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3592 tmp = strtol(str, NULL, 0);
3593 if (tmp >= 0 && tmp < max)
3597 else if (isupper(i))
3598 *num = (*num + max - 1) % max;
3600 *num = (*num + 1) % max;
3606 * Interact with "visuals"
3608 void do_cmd_visuals(void)
3616 const char *empty_symbol = "<< ? >>";
3618 if (use_bigtile) empty_symbol = "<< ?? >>";
3621 /* File type is "TEXT" */
3622 FILE_TYPE(FILE_TYPE_TEXT);
3625 /* Save the screen */
3629 /* Interact until done */
3635 /* Ask for a choice */
3637 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3639 prt("Interact with Visuals", 2, 0);
3643 /* Give some choices */
3645 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3647 prt("(1) Load a user pref file", 4, 5);
3650 #ifdef ALLOW_VISUALS
3652 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
3653 prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 6, 5);
3654 prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 7, 5);
3655 prt("(5) (̤»ÈÍÑ)", 8, 5);
3656 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3657 prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3658 prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3659 prt("(9) (̤»ÈÍÑ)", 12, 5);
3661 prt("(2) Dump monster attr/chars", 5, 5);
3662 prt("(3) Dump object attr/chars", 6, 5);
3663 prt("(4) Dump feature attr/chars", 7, 5);
3664 prt("(5) (unused)", 8, 5);
3665 prt("(6) Change monster attr/chars", 9, 5);
3666 prt("(7) Change object attr/chars", 10, 5);
3667 prt("(8) Change feature attr/chars", 11, 5);
3668 prt("(9) (unused)", 12, 5);
3673 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3675 prt("(0) Reset visuals", 13, 5);
3681 prt("¥³¥Þ¥ó¥É:", 15, 0);
3683 prt("Command: ", 15, 0);
3691 if (i == ESCAPE) break;
3693 /* Load a 'pref' file */
3698 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3700 prt("Command: Load a user pref file", 15, 0);
3706 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3708 prt("File: ", 17, 0);
3712 /* Default filename */
3713 sprintf(tmp, "%s.prf", player_name);
3716 if (!askfor(tmp, 70)) continue;
3718 /* Process the given filename */
3719 (void)process_pref_file(tmp);
3722 #ifdef ALLOW_VISUALS
3724 /* Dump monster attr/chars */
3727 static cptr mark = "Monster attr/chars";
3731 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3733 prt("Command: Dump monster attr/chars", 15, 0);
3739 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3741 prt("File: ", 17, 0);
3745 /* Default filename */
3746 sprintf(tmp, "%s.prf", player_name);
3748 /* Get a filename */
3749 if (!askfor(tmp, 70)) continue;
3751 /* Build the filename */
3752 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3754 /* Append to the file */
3755 if (!open_auto_dump(buf, mark)) continue;
3759 auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3761 auto_dump_printf("\n# Monster attr/char definitions\n\n");
3765 for (i = 1; i < max_r_idx; i++)
3767 monster_race *r_ptr = &r_info[i];
3769 /* Skip non-entries */
3770 if (!r_ptr->name) continue;
3772 /* Dump a comment */
3773 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3775 /* Dump the monster attr/char info */
3776 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3777 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3785 msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3787 msg_print("Dumped monster attr/chars.");
3792 /* Dump object attr/chars */
3795 static cptr mark = "Object attr/chars";
3799 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3801 prt("Command: Dump object attr/chars", 15, 0);
3807 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3809 prt("File: ", 17, 0);
3813 /* Default filename */
3814 sprintf(tmp, "%s.prf", player_name);
3816 /* Get a filename */
3817 if (!askfor(tmp, 70)) continue;
3819 /* Build the filename */
3820 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3822 /* Append to the file */
3823 if (!open_auto_dump(buf, mark)) continue;
3827 auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3829 auto_dump_printf("\n# Object attr/char definitions\n\n");
3833 for (i = 1; i < max_k_idx; i++)
3836 object_kind *k_ptr = &k_info[i];
3838 /* Skip non-entries */
3839 if (!k_ptr->name) continue;
3841 /* Skip entries with flavor */
3842 if (k_ptr->flavor) continue;
3845 strip_name(o_name, i);
3847 /* Dump a comment */
3848 auto_dump_printf("# %s\n", o_name);
3850 /* Dump the object attr/char info */
3851 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3852 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3860 msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3862 msg_print("Dumped object attr/chars.");
3867 /* Dump feature attr/chars */
3870 static cptr mark = "Feature attr/chars";
3874 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3876 prt("Command: Dump feature attr/chars", 15, 0);
3882 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3884 prt("File: ", 17, 0);
3888 /* Default filename */
3889 sprintf(tmp, "%s.prf", player_name);
3891 /* Get a filename */
3892 if (!askfor(tmp, 70)) continue;
3894 /* Build the filename */
3895 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3897 /* Append to the file */
3898 if (!open_auto_dump(buf, mark)) continue;
3902 auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3904 auto_dump_printf("\n# Feature attr/char definitions\n\n");
3908 for (i = 1; i < max_f_idx; i++)
3910 feature_type *f_ptr = &f_info[i];
3912 /* Skip non-entries */
3913 if (!f_ptr->name) continue;
3915 /* Skip mimiccing features */
3916 if (f_ptr->mimic != i) continue;
3918 /* Dump a comment */
3919 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3921 /* Dump the feature attr/char info */
3922 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3923 (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3924 (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3925 (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]),
3926 (byte)(f_ptr->x_attr[F_LIT_DARKDARK]), (byte)(f_ptr->x_char[F_LIT_DARKDARK]));
3934 msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3936 msg_print("Dumped feature attr/chars.");
3941 /* Modify monster attr/chars */
3948 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3950 prt("Command: Change monster attr/chars", 15, 0);
3954 /* Hack -- query until done */
3957 monster_race *r_ptr = &r_info[r];
3961 byte da = (r_ptr->d_attr);
3962 byte dc = (r_ptr->d_char);
3963 byte ca = (r_ptr->x_attr);
3964 byte cc = (r_ptr->x_char);
3966 /* Label the object */
3968 Term_putstr(5, 17, -1, TERM_WHITE,
3969 format("¥â¥ó¥¹¥¿¡¼ = %d, ̾Á° = %-40.40s",
3970 r, (r_name + r_ptr->name)));
3972 Term_putstr(5, 17, -1, TERM_WHITE,
3973 format("Monster = %d, Name = %-40.40s",
3974 r, (r_name + r_ptr->name)));
3978 /* Label the Default values */
3980 Term_putstr(10, 19, -1, TERM_WHITE,
3981 format("½é´üÃÍ ¿§ / ʸ»ú = %3u / %3u", da, dc));
3983 Term_putstr(10, 19, -1, TERM_WHITE,
3984 format("Default attr/char = %3u / %3u", da, dc));
3987 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3988 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3990 /* Label the Current values */
3992 Term_putstr(10, 20, -1, TERM_WHITE,
3993 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3u / %3u", ca, cc));
3995 Term_putstr(10, 20, -1, TERM_WHITE,
3996 format("Current attr/char = %3u / %3u", ca, cc));
3999 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4000 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4004 Term_putstr(0, 22, -1, TERM_WHITE,
4005 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4007 Term_putstr(0, 22, -1, TERM_WHITE,
4008 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4015 if (i == ESCAPE) break;
4017 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4018 else if (isupper(i)) c = 'a' + i - 'A';
4024 cmd_visuals_aux(i, &r, max_r_idx);
4027 t = (int)r_ptr->x_attr;
4028 cmd_visuals_aux(i, &t, 256);
4029 r_ptr->x_attr = (byte)t;
4032 t = (int)r_ptr->x_char;
4033 cmd_visuals_aux(i, &t, 256);
4034 r_ptr->x_char = (byte)t;
4040 /* Modify object attr/chars */
4047 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4049 prt("Command: Change object attr/chars", 15, 0);
4053 /* Hack -- query until done */
4056 object_kind *k_ptr = &k_info[k];
4060 byte da = (byte)k_ptr->d_attr;
4061 byte dc = (byte)k_ptr->d_char;
4062 byte ca = (byte)k_ptr->x_attr;
4063 byte cc = (byte)k_ptr->x_char;
4065 /* Label the object */
4067 Term_putstr(5, 17, -1, TERM_WHITE,
4068 format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s",
4069 k, (k_name + k_ptr->name)));
4071 Term_putstr(5, 17, -1, TERM_WHITE,
4072 format("Object = %d, Name = %-40.40s",
4073 k, (k_name + k_ptr->name)));
4077 /* Label the Default values */
4079 Term_putstr(10, 19, -1, TERM_WHITE,
4080 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4082 Term_putstr(10, 19, -1, TERM_WHITE,
4083 format("Default attr/char = %3d / %3d", da, dc));
4086 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4087 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4089 /* Label the Current values */
4091 Term_putstr(10, 20, -1, TERM_WHITE,
4092 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4094 Term_putstr(10, 20, -1, TERM_WHITE,
4095 format("Current attr/char = %3d / %3d", ca, cc));
4098 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4099 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4103 Term_putstr(0, 22, -1, TERM_WHITE,
4104 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4106 Term_putstr(0, 22, -1, TERM_WHITE,
4107 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4114 if (i == ESCAPE) break;
4116 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4117 else if (isupper(i)) c = 'a' + i - 'A';
4123 cmd_visuals_aux(i, &k, max_k_idx);
4126 t = (int)k_info[k].x_attr;
4127 cmd_visuals_aux(i, &t, 256);
4128 k_info[k].x_attr = (byte)t;
4131 t = (int)k_info[k].x_char;
4132 cmd_visuals_aux(i, &t, 256);
4133 k_info[k].x_char = (byte)t;
4139 /* Modify feature attr/chars */
4143 static int lighting_level = F_LIT_STANDARD;
4147 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4149 prt("Command: Change feature attr/chars", 15, 0);
4153 /* Hack -- query until done */
4156 feature_type *f_ptr = &f_info[f];
4160 byte da = (byte)f_ptr->d_attr[lighting_level];
4161 byte dc = (byte)f_ptr->d_char[lighting_level];
4162 byte ca = (byte)f_ptr->x_attr[lighting_level];
4163 byte cc = (byte)f_ptr->x_char[lighting_level];
4165 /* Label the object */
4168 Term_putstr(5, 17, -1, TERM_WHITE,
4169 format("ÃÏ·Á = %d, ̾Á° = %s, ÌÀÅÙ = %s",
4170 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
4172 Term_putstr(5, 17, -1, TERM_WHITE,
4173 format("Terrain = %d, Name = %s, Lighting = %s",
4174 f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
4178 /* Label the Default values */
4180 Term_putstr(10, 19, -1, TERM_WHITE,
4181 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4183 Term_putstr(10, 19, -1, TERM_WHITE,
4184 format("Default attr/char = %3d / %3d", da, dc));
4187 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4189 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4192 /* Label the Current values */
4194 Term_putstr(10, 20, -1, TERM_WHITE,
4195 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4197 Term_putstr(10, 20, -1, TERM_WHITE,
4198 format("Current attr/char = %3d / %3d", ca, cc));
4201 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4202 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4206 Term_putstr(0, 22, -1, TERM_WHITE,
4207 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C/l/L/^L): ");
4209 Term_putstr(0, 22, -1, TERM_WHITE,
4210 "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L): ");
4217 if (i == ESCAPE) break;
4219 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4220 else if (isupper(i)) c = 'a' + i - 'A';
4226 cmd_visuals_aux(i, &f, max_f_idx);
4229 t = (int)f_info[f].x_attr[lighting_level];
4230 cmd_visuals_aux(i, &t, 256);
4231 f_info[f].x_attr[lighting_level] = (byte)t;
4234 t = (int)f_info[f].x_char[lighting_level];
4235 cmd_visuals_aux(i, &t, 256);
4236 f_info[f].x_char[lighting_level] = (byte)t;
4239 cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
4255 msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4257 msg_print("Visual attr/char tables reset.");
4262 /* Unknown option */
4268 /* Flush messages */
4273 /* Restore the screen */
4279 * Interact with "colors"
4281 void do_cmd_colors(void)
4290 /* File type is "TEXT" */
4291 FILE_TYPE(FILE_TYPE_TEXT);
4294 /* Save the screen */
4298 /* Interact until done */
4304 /* Ask for a choice */
4306 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4308 prt("Interact with Colors", 2, 0);
4312 /* Give some choices */
4314 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4316 prt("(1) Load a user pref file", 4, 5);
4321 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
4322 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4324 prt("(2) Dump colors", 5, 5);
4325 prt("(3) Modify colors", 6, 5);
4332 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4334 prt("Command: ", 8, 0);
4342 if (i == ESCAPE) break;
4344 /* Load a 'pref' file */
4349 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4351 prt("Command: Load a user pref file", 8, 0);
4357 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4359 prt("File: ", 10, 0);
4364 sprintf(tmp, "%s.prf", player_name);
4367 if (!askfor(tmp, 70)) continue;
4369 /* Process the given filename */
4370 (void)process_pref_file(tmp);
4372 /* Mega-Hack -- react to changes */
4373 Term_xtra(TERM_XTRA_REACT, 0);
4375 /* Mega-Hack -- redraw */
4384 static cptr mark = "Colors";
4388 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 8, 0);
4390 prt("Command: Dump colors", 8, 0);
4396 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4398 prt("File: ", 10, 0);
4402 /* Default filename */
4403 sprintf(tmp, "%s.prf", player_name);
4405 /* Get a filename */
4406 if (!askfor(tmp, 70)) continue;
4408 /* Build the filename */
4409 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4411 /* Append to the file */
4412 if (!open_auto_dump(buf, mark)) continue;
4416 auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4418 auto_dump_printf("\n# Color redefinitions\n\n");
4422 for (i = 0; i < 256; i++)
4424 int kv = angband_color_table[i][0];
4425 int rv = angband_color_table[i][1];
4426 int gv = angband_color_table[i][2];
4427 int bv = angband_color_table[i][3];
4432 cptr name = "unknown";
4436 /* Skip non-entries */
4437 if (!kv && !rv && !gv && !bv) continue;
4439 /* Extract the color name */
4440 if (i < 16) name = color_names[i];
4442 /* Dump a comment */
4444 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4446 auto_dump_printf("# Color '%s'\n", name);
4449 /* Dump the monster attr/char info */
4450 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4459 msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
4461 msg_print("Dumped color redefinitions.");
4473 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4475 prt("Command: Modify colors", 8, 0);
4479 /* Hack -- query until done */
4488 /* Exhibit the normal colors */
4489 for (j = 0; j < 16; j++)
4491 /* Exhibit this color */
4492 Term_putstr(j*4, 20, -1, a, "###");
4494 /* Exhibit all colors */
4495 Term_putstr(j*4, 22, -1, j, format("%3d", j));
4498 /* Describe the color */
4500 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4502 name = ((a < 16) ? color_names[a] : "undefined");
4506 /* Describe the color */
4508 Term_putstr(5, 10, -1, TERM_WHITE,
4509 format("¥«¥é¡¼ = %d, ̾Á° = %s", a, name));
4511 Term_putstr(5, 10, -1, TERM_WHITE,
4512 format("Color = %d, Name = %s", a, name));
4516 /* Label the Current values */
4517 Term_putstr(5, 12, -1, TERM_WHITE,
4518 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4519 angband_color_table[a][0],
4520 angband_color_table[a][1],
4521 angband_color_table[a][2],
4522 angband_color_table[a][3]));
4526 Term_putstr(0, 14, -1, TERM_WHITE,
4527 "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4529 Term_putstr(0, 14, -1, TERM_WHITE,
4530 "Command (n/N/k/K/r/R/g/G/b/B): ");
4538 if (i == ESCAPE) break;
4541 if (i == 'n') a = (byte)(a + 1);
4542 if (i == 'N') a = (byte)(a - 1);
4543 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4544 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4545 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4546 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4547 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4548 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4549 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4550 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4552 /* Hack -- react to changes */
4553 Term_xtra(TERM_XTRA_REACT, 0);
4555 /* Hack -- redraw */
4562 /* Unknown option */
4568 /* Flush messages */
4573 /* Restore the screen */
4579 * Note something in the message recall
4581 void do_cmd_note(void)
4590 if (!get_string("¥á¥â: ", buf, 60)) return;
4592 if (!get_string("Note: ", buf, 60)) return;
4596 /* Ignore empty notes */
4597 if (!buf[0] || (buf[0] == ' ')) return;
4599 /* Add the note to the message recall */
4601 msg_format("¥á¥â: %s", buf);
4603 msg_format("Note: %s", buf);
4610 * Mention the current version
4612 void do_cmd_version(void)
4617 msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4618 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4620 msg_format("You are playing Hengband %d.%d.%d.",
4621 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4628 * Array of feeling strings
4630 static cptr do_cmd_feeling_text[11] =
4633 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4635 "Looks like any other level.",
4639 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4641 "You feel there is something special about this level.",
4645 "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4647 "You nearly faint as horrible visions of death fill your mind!",
4651 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4653 "This level looks very dangerous.",
4657 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4659 "You have a very bad feeling...",
4663 "°¤¤Í½´¶¤¬¤¹¤ë...",
4665 "You have a bad feeling...",
4671 "You feel nervous.",
4675 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4677 "You feel your luck is turning...",
4681 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4683 "You don't like the look of this place.",
4687 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4689 "This level looks reasonably safe.",
4693 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4695 "What a boring place..."
4700 static cptr do_cmd_feeling_text_combat[11] =
4703 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4705 "Looks like any other level.",
4709 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4711 "You feel there is something special about this level.",
4715 "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4717 "You nearly faint as horrible visions of death fill your mind!",
4721 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4723 "This level looks very dangerous.",
4727 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4729 "You have a very bad feeling...",
4733 "°¤¤Í½´¶¤¬¤¹¤ë...",
4735 "You have a bad feeling...",
4741 "You feel nervous.",
4745 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4747 "You feel your luck is turning...",
4751 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4753 "You don't like the look of this place.",
4757 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4759 "This level looks reasonably safe.",
4763 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4765 "What a boring place..."
4770 static cptr do_cmd_feeling_text_lucky[11] =
4773 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4774 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4775 "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4776 "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4777 "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4778 "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4779 "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4780 "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤¤¿¤«...",
4781 "¸«¤¿´¶¤¸°¤¯¤Ï¤Ê¤¤...",
4782 "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4783 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4785 "Looks like any other level.",
4786 "You feel there is something special about this level.",
4787 "You have a superb feeling about this level.",
4788 "You have an excellent feeling...",
4789 "You have a very good feeling...",
4790 "You have a good feeling...",
4791 "You feel strangely lucky...",
4792 "You feel your luck is turning...",
4793 "You like the look of this place...",
4794 "This level can't be all bad...",
4795 "What a boring place..."
4801 * Note that "feeling" is set to zero unless some time has passed.
4802 * Note that this is done when the level is GENERATED, not entered.
4804 void do_cmd_feeling(void)
4806 /* Verify the feeling */
4807 if (feeling > 10) feeling = 10;
4809 /* No useful feeling in quests */
4810 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4813 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4815 msg_print("Looks like a typical quest level.");
4821 /* No useful feeling in town */
4822 else if (p_ptr->town_num && !dun_level)
4825 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4827 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4831 msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4833 msg_print("Looks like a strange wilderness.");
4841 msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4843 msg_print("Looks like a typical town.");
4850 /* No useful feeling in the wilderness */
4851 else if (!dun_level)
4854 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4856 msg_print("Looks like a typical wilderness.");
4862 /* Display the feeling */
4863 if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4865 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4867 if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4868 msg_print(do_cmd_feeling_text_combat[feeling]);
4870 msg_print(do_cmd_feeling_text[feeling]);
4875 msg_print(do_cmd_feeling_text[0]);
4882 * Description of each monster group.
4884 static cptr monster_group_text[] =
4887 "¥æ¥Ë¡¼¥¯", /* "Uniques" */
4888 "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
4917 /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4934 /* "¾åµé¥Ç¡¼¥â¥ó", */
4975 /* "Ancient Dragon/Wyrm", */
4984 "Multi-Headed Reptile",
4989 "Reptile/Amphibian",
4990 "Spider/Scorpion/Tick",
4992 /* "Major Demon", */
5008 * Symbols of monsters in each group. Note the "Uniques" group
5009 * is handled differently.
5011 static cptr monster_group_char[] =
5066 "$!?=&`.|/\\~[]()>",
5075 * hook function to sort monsters by level
5077 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5079 u16b *who = (u16b*)(u);
5084 monster_race *r_ptr1 = &r_info[w1];
5085 monster_race *r_ptr2 = &r_info[w2];
5090 if (r_ptr2->level > r_ptr1->level) return TRUE;
5091 if (r_ptr1->level > r_ptr2->level) return FALSE;
5093 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5094 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5099 * Build a list of monster indexes in the given group. Return the number
5100 * of monsters in the group.
5102 * mode & 0x01 : check for non-empty group
5103 * mode & 0x02 : cheat?
5105 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5110 /* Get a list of x_char in this group */
5111 cptr group_char = monster_group_char[grp_cur];
5113 /* XXX Hack -- Check if this is the "Uniques" group */
5114 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5116 /* XXX Hack -- Check if this is the "Riding" group */
5117 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
5119 /* Check every race */
5120 for (i = 0; i < max_r_idx; i++)
5122 /* Access the race */
5123 monster_race *r_ptr = &r_info[i];
5125 /* Skip empty race */
5126 if (!r_ptr->name) continue ;
5128 /* Require known monsters */
5129 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5133 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5136 else if (grp_riding)
5138 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
5143 /* Check for race in the group */
5144 if (!my_strchr(group_char, r_ptr->d_char)) continue;
5148 mon_idx[mon_cnt++] = i;
5150 /* XXX Hack -- Just checking for non-empty group */
5151 if (mode & 0x01) break;
5154 /* Terminate the list */
5155 mon_idx[mon_cnt] = 0;
5157 /* Select the sort method */
5158 ang_sort_comp = ang_sort_comp_monster_level;
5159 ang_sort_swap = ang_sort_swap_hook;
5161 /* Sort by monster level */
5162 ang_sort(mon_idx, &dummy_why, mon_cnt);
5164 /* Return the number of races */
5170 * Description of each monster group.
5172 static cptr object_group_text[] =
5175 "¥¥Î¥³", /* "Mushrooms" */
5176 "Ìô", /* "Potions" */
5177 "Ìý¤Ä¤Ü", /* "Flasks" */
5178 "´¬Êª", /* "Scrolls" */
5179 "»ØÎØ", /* "Rings" */
5180 "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5181 "ū", /* "Whistle" */
5182 "¸÷¸»", /* "Lanterns" */
5183 "ËâË¡ËÀ", /* "Wands" */
5184 "¾ó", /* "Staffs" */
5185 "¥í¥Ã¥É", /* "Rods" */
5186 "¥«¡¼¥É", /* "Cards" */
5187 "¥¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5196 "Åá·õÎà", /* "Swords" */
5197 "Æß´ï", /* "Blunt Weapons" */
5198 "ĹÊÁÉð´ï", /* "Polearms" */
5199 "ºÎ·¡Æ»¶ñ", /* "Diggers" */
5200 "Èô¤ÓÆ»¶ñ", /* "Bows" */
5204 "·ÚÁõ³»", /* "Soft Armor" */
5205 "½ÅÁõ³»", /* "Hard Armor" */
5206 "¥É¥é¥´¥ó³»", /* "Dragon Armor" */
5207 "½â", /* "Shields" */
5208 "¥¯¥í¡¼¥¯", /* "Cloaks" */
5209 "äƼê", /* "Gloves" */
5210 "¥Ø¥ë¥á¥Ã¥È", /* "Helms" */
5211 "´§", /* "Crowns" */
5212 "¥Ö¡¼¥Ä", /* "Boots" */
5260 * TVALs of items in each group
5262 static byte object_group_tval[] =
5302 TV_LIFE_BOOK, /* Hack -- all spellbooks */
5308 * Build a list of monster indexes in the given group. Return the number
5309 * of monsters in the group.
5311 static int collect_objects(int grp_cur, int object_idx[])
5313 int i, j, k, object_cnt = 0;
5315 /* Get a list of x_char in this group */
5316 byte group_tval = object_group_tval[grp_cur];
5318 /* Check every object */
5319 for (i = 0; i < max_k_idx; i++)
5321 /* Access the race */
5322 object_kind *k_ptr = &k_info[i];
5324 /* Skip empty objects */
5325 if (!k_ptr->name) continue;
5327 /* Skip non-flavoured objects */
5328 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5330 /* Skip items with no distribution (special artifacts) */
5331 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5334 /* Require objects ever seen*/
5335 if (!k_ptr->aware && !p_ptr->wizard) continue;
5337 /* Check for race in the group */
5338 if (TV_LIFE_BOOK == group_tval)
5340 /* Hack -- All spell books */
5341 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5344 object_idx[object_cnt++] = i;
5347 else if (k_ptr->tval == group_tval)
5350 object_idx[object_cnt++] = i;
5354 /* Terminate the list */
5355 object_idx[object_cnt] = 0;
5357 /* Return the number of races */
5363 * Description of each feature group.
5365 static cptr feature_group_text[] =
5373 * Build a list of feature indexes in the given group. Return the number
5374 * of features in the group.
5376 static int collect_features(int grp_cur, int *feat_idx)
5378 int i, feat_cnt = 0;
5380 /* Unused; There is a single group. */
5383 /* Check every feature */
5384 for (i = 1; i < max_f_idx; i++)
5386 /* Access the index */
5387 feature_type *f_ptr = &f_info[i];
5389 /* Skip empty index */
5390 if (!f_ptr->name) continue;
5392 /* Skip mimiccing features */
5393 if (f_ptr->mimic != i) continue;
5396 feat_idx[feat_cnt++] = i;
5399 /* Terminate the list */
5400 feat_idx[feat_cnt] = 0;
5402 /* Return the number of races */
5409 * Build a list of monster indexes in the given group. Return the number
5410 * of monsters in the group.
5412 static int collect_artifacts(int grp_cur, int object_idx[])
5414 int i, object_cnt = 0;
5416 /* Get a list of x_char in this group */
5417 byte group_tval = object_group_tval[grp_cur];
5419 /* Check every object */
5420 for (i = 0; i < max_a_idx; i++)
5422 /* Access the artifact */
5423 artifact_type *a_ptr = &a_info[i];
5425 /* Skip empty artifacts */
5426 if (!a_ptr->name) continue;
5428 /* Skip "uncreated" artifacts */
5429 if (!a_ptr->cur_num) continue;
5431 /* Check for race in the group */
5432 if (a_ptr->tval == group_tval)
5435 object_idx[object_cnt++] = i;
5439 /* Terminate the list */
5440 object_idx[object_cnt] = 0;
5442 /* Return the number of races */
5449 * Encode the screen colors
5451 static char hack[17] = "dwsorgbuDWvyRGBU";
5455 * Hack -- load a screen dump from a file
5457 void do_cmd_load_screen(void)
5472 Term_get_size(&wid, &hgt);
5474 /* Build the filename */
5475 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5477 /* Append to the file */
5478 fff = my_fopen(buf, "r");
5483 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5485 msg_format("Failed to open %s.", buf);
5492 /* Save the screen */
5495 /* Clear the screen */
5499 /* Load the screen */
5500 for (y = 0; okay; y++)
5502 /* Get a line of data including control code */
5503 if (!fgets(buf, 1024, fff)) okay = FALSE;
5505 /* Get the blank line */
5506 if (buf[0] == '\n' || buf[0] == '\0') break;
5508 /* Ignore too large screen image */
5509 if (y >= hgt) continue;
5512 for (x = 0; x < wid - 1; x++)
5515 if (buf[x] == '\n' || buf[x] == '\0') break;
5517 /* Put the attr/char */
5518 Term_draw(x, y, TERM_WHITE, buf[x]);
5522 /* Dump the screen */
5523 for (y = 0; okay; y++)
5525 /* Get a line of data including control code */
5526 if (!fgets(buf, 1024, fff)) okay = FALSE;
5528 /* Get the blank line */
5529 if (buf[0] == '\n' || buf[0] == '\0') break;
5531 /* Ignore too large screen image */
5532 if (y >= hgt) continue;
5535 for (x = 0; x < wid - 1; x++)
5538 if (buf[x] == '\n' || buf[x] == '\0') break;
5540 /* Get the attr/char */
5541 (void)(Term_what(x, y, &a, &c));
5543 /* Look up the attr */
5544 for (i = 0; i < 16; i++)
5546 /* Use attr matches */
5547 if (hack[i] == buf[x]) a = i;
5550 /* Put the attr/char */
5551 Term_draw(x, y, a, c);
5562 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5564 msg_print("Screen dump loaded.");
5571 /* Restore the screen */
5578 cptr inven_res_label =
5580 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5582 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5587 #define IM_FLAG_STR "¡ö"
5588 #define HAS_FLAG_STR "¡Ü"
5589 #define NO_FLAG_STR "¡¦"
5591 #define IM_FLAG_STR "* "
5592 #define HAS_FLAG_STR "+ "
5593 #define NO_FLAG_STR ". "
5596 #define print_im_or_res_flag(IM, RES) \
5598 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5599 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5602 #define print_flag(TR) \
5604 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5608 /* XTRA HACK RESLIST */
5609 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5611 char o_name[MAX_NLEN];
5612 u32b flgs[TR_FLAG_SIZE];
5614 if (!o_ptr->k_idx) return;
5615 if (o_ptr->tval != tval) return;
5617 /* Identified items only */
5618 if (!object_known_p(o_ptr)) return;
5621 * HACK:Ring of Lordly protection and Dragon equipment
5622 * have random resistances.
5624 if (((TV_WEARABLE_BEGIN <= tval) && (tval <= TV_WEARABLE_END) && o_ptr->name2)
5625 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5626 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5627 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5628 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5629 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5630 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5631 || o_ptr->art_name || o_ptr->name1)
5634 object_desc(o_name, o_ptr, OD_NAME_ONLY);
5636 while (o_name[i] && (i < 26))
5639 if (iskanji(o_name[i])) i++;
5648 o_name[i] = ' '; i++;
5653 fprintf(fff, "%s %s", where, o_name);
5655 if (!(o_ptr->ident & (IDENT_MENTAL)))
5658 fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5660 fputs("-------unknown------------ -------unknown------\n", fff);
5665 object_flags_known(o_ptr, flgs);
5667 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5668 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5669 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5670 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5671 print_flag(TR_RES_POIS);
5672 print_flag(TR_RES_LITE);
5673 print_flag(TR_RES_DARK);
5674 print_flag(TR_RES_SHARDS);
5675 print_flag(TR_RES_SOUND);
5676 print_flag(TR_RES_NETHER);
5677 print_flag(TR_RES_NEXUS);
5678 print_flag(TR_RES_CHAOS);
5679 print_flag(TR_RES_DISEN);
5683 print_flag(TR_RES_BLIND);
5684 print_flag(TR_RES_FEAR);
5685 print_flag(TR_RES_CONF);
5686 print_flag(TR_FREE_ACT);
5687 print_flag(TR_SEE_INVIS);
5688 print_flag(TR_HOLD_LIFE);
5689 print_flag(TR_TELEPATHY);
5690 print_flag(TR_SLOW_DIGEST);
5691 print_flag(TR_REGEN);
5692 print_flag(TR_FEATHER);
5700 fprintf(fff, "%s\n", inven_res_label);
5706 * Display *ID* ed weapons/armors's resistances
5708 static void do_cmd_knowledge_inven(void)
5712 char file_name[1024];
5722 /* Open a new file */
5723 fff = my_fopen_temp(file_name, 1024);
5727 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5729 msg_format("Failed to create temporary file %s.", file_name);
5734 fprintf(fff, "%s\n", inven_res_label);
5736 for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
5740 for (; j < 9; j++) fputc('\n', fff);
5742 fprintf(fff, "%s\n", inven_res_label);
5746 strcpy(where, "Áõ");
5748 strcpy(where, "E ");
5750 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5752 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5756 strcpy(where, "»ý");
5758 strcpy(where, "I ");
5760 for (i = 0; i < INVEN_PACK; i++)
5762 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5765 st_ptr = &town[1].store[STORE_HOME];
5767 strcpy(where, "²È");
5769 strcpy(where, "H ");
5772 for (i = 0; i < st_ptr->stock_num; i++)
5774 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5778 /* Close the file */
5781 /* Display the file contents */
5783 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5785 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5788 /* Remove the file */
5793 void do_cmd_save_screen_html_aux(char *filename, int message)
5797 byte a = 0, old_a = 0;
5811 cptr html_head[] = {
5812 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5816 cptr html_foot[] = {
5818 "</body>\n</html>\n",
5824 Term_get_size(&wid, &hgt);
5826 /* File type is "TEXT" */
5827 FILE_TYPE(FILE_TYPE_TEXT);
5829 /* Append to the file */
5830 fff = my_fopen(filename, "w");
5836 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5838 msg_format("Failed to open file %s.", filename);
5846 /* Save the screen */
5850 /* Build the filename */
5851 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5852 tmpfff = my_fopen(buf, "r");
5854 for (i = 0; html_head[i]; i++)
5855 fprintf(fff, html_head[i]);
5859 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5861 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5865 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5867 fprintf(fff, "%s\n", buf);
5872 /* Dump the screen */
5873 for (y = 0; y < hgt; y++)
5880 for (x = 0; x < wid - 1; x++)
5884 /* Get the attr/char */
5885 (void)(Term_what(x, y, &a, &c));
5889 case '&': cc = "&"; break;
5890 case '<': cc = "<"; break;
5891 case '>': cc = ">"; break;
5893 case 0x1f: c = '.'; break;
5894 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5899 if ((y == 0 && x == 0) || a != old_a) {
5900 rv = angband_color_table[a][1];
5901 gv = angband_color_table[a][2];
5902 bv = angband_color_table[a][3];
5903 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5904 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5908 fprintf(fff, "%s", cc);
5910 fprintf(fff, "%c", c);
5913 fprintf(fff, "</font>");
5916 for (i = 0; html_foot[i]; i++)
5917 fprintf(fff, html_foot[i]);
5922 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5924 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5928 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5930 fprintf(fff, "%s\n", buf);
5945 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
5947 msg_print("Screen dump saved.");
5952 /* Restore the screen */
5958 * Hack -- save a screen dump to a file
5960 static void do_cmd_save_screen_html(void)
5962 char buf[1024], tmp[256] = "screen.html";
5965 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
5967 if (!get_string("File name: ", tmp, 80))
5971 /* Build the filename */
5972 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5976 do_cmd_save_screen_html_aux(buf, 1);
5981 * Redefinable "save_screen" action
5983 void (*screendump_aux)(void) = NULL;
5987 * Hack -- save a screen dump to a file
5989 void do_cmd_save_screen(void)
5991 bool old_use_graphics = use_graphics;
5992 bool html_dump = FALSE;
5997 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
5999 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6004 if (c == 'Y' || c == 'y')
6006 else if (c == 'H' || c == 'h')
6018 Term_get_size(&wid, &hgt);
6020 if (old_use_graphics)
6022 use_graphics = FALSE;
6025 /* Redraw everything */
6026 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6028 /* Hack -- update */
6034 do_cmd_save_screen_html();
6038 /* Do we use a special screendump function ? */
6039 else if (screendump_aux)
6041 /* Dump the screen to a graphics file */
6042 (*screendump_aux)();
6044 else /* Dump the screen as text */
6055 /* Build the filename */
6056 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6058 /* File type is "TEXT" */
6059 FILE_TYPE(FILE_TYPE_TEXT);
6061 /* Append to the file */
6062 fff = my_fopen(buf, "w");
6068 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6070 msg_format("Failed to open file %s.", buf);
6077 /* Save the screen */
6081 /* Dump the screen */
6082 for (y = 0; y < hgt; y++)
6085 for (x = 0; x < wid - 1; x++)
6087 /* Get the attr/char */
6088 (void)(Term_what(x, y, &a, &c));
6098 fprintf(fff, "%s\n", buf);
6105 /* Dump the screen */
6106 for (y = 0; y < hgt; y++)
6109 for (x = 0; x < wid - 1; x++)
6111 /* Get the attr/char */
6112 (void)(Term_what(x, y, &a, &c));
6115 buf[x] = hack[a&0x0F];
6122 fprintf(fff, "%s\n", buf);
6134 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6136 msg_print("Screen dump saved.");
6142 /* Restore the screen */
6146 if (old_use_graphics)
6148 use_graphics = TRUE;
6151 /* Redraw everything */
6152 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6154 /* Hack -- update */
6161 * Sorting hook -- Comp function -- see below
6163 * We use "u" to point to array of monster indexes,
6164 * and "v" to select the type of sorting to perform on "u".
6166 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6168 u16b *who = (u16b*)(u);
6170 u16b *why = (u16b*)(v);
6177 /* Sort by total kills */
6180 /* Extract total kills */
6181 z1 = a_info[w1].tval;
6182 z2 = a_info[w2].tval;
6184 /* Compare total kills */
6185 if (z1 < z2) return (TRUE);
6186 if (z1 > z2) return (FALSE);
6190 /* Sort by monster level */
6193 /* Extract levels */
6194 z1 = a_info[w1].sval;
6195 z2 = a_info[w2].sval;
6197 /* Compare levels */
6198 if (z1 < z2) return (TRUE);
6199 if (z1 > z2) return (FALSE);
6203 /* Sort by monster experience */
6206 /* Extract experience */
6207 z1 = a_info[w1].level;
6208 z2 = a_info[w2].level;
6210 /* Compare experience */
6211 if (z1 < z2) return (TRUE);
6212 if (z1 > z2) return (FALSE);
6216 /* Compare indexes */
6222 * Sorting hook -- Swap function -- see below
6224 * We use "u" to point to array of monster indexes,
6225 * and "v" to select the type of sorting to perform.
6227 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6229 u16b *who = (u16b*)(u);
6244 * Check the status of "artifacts"
6246 static void do_cmd_knowledge_artifacts(void)
6248 int i, k, z, x, y, n = 0;
6254 char file_name[1024];
6256 char base_name[MAX_NLEN];
6260 /* Open a new file */
6261 fff = my_fopen_temp(file_name, 1024);
6265 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6267 msg_format("Failed to create temporary file %s.", file_name);
6273 /* Allocate the "who" array */
6274 C_MAKE(who, max_a_idx, s16b);
6276 /* Allocate the "okay" array */
6277 C_MAKE(okay, max_a_idx, bool);
6279 /* Scan the artifacts */
6280 for (k = 0; k < max_a_idx; k++)
6282 artifact_type *a_ptr = &a_info[k];
6287 /* Skip "empty" artifacts */
6288 if (!a_ptr->name) continue;
6290 /* Skip "uncreated" artifacts */
6291 if (!a_ptr->cur_num) continue;
6297 /* Check the dungeon */
6298 for (y = 0; y < cur_hgt; y++)
6300 for (x = 0; x < cur_wid; x++)
6302 cave_type *c_ptr = &cave[y][x];
6304 s16b this_o_idx, next_o_idx = 0;
6306 /* Scan all objects in the grid */
6307 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6311 /* Acquire object */
6312 o_ptr = &o_list[this_o_idx];
6314 /* Acquire next object */
6315 next_o_idx = o_ptr->next_o_idx;
6317 /* Ignore non-artifacts */
6318 if (!artifact_p(o_ptr)) continue;
6320 /* Ignore known items */
6321 if (object_known_p(o_ptr)) continue;
6323 /* Note the artifact */
6324 okay[o_ptr->name1] = FALSE;
6329 /* Check the inventory and equipment */
6330 for (i = 0; i < INVEN_TOTAL; i++)
6332 object_type *o_ptr = &inventory[i];
6334 /* Ignore non-objects */
6335 if (!o_ptr->k_idx) continue;
6337 /* Ignore non-artifacts */
6338 if (!artifact_p(o_ptr)) continue;
6340 /* Ignore known items */
6341 if (object_known_p(o_ptr)) continue;
6343 /* Note the artifact */
6344 okay[o_ptr->name1] = FALSE;
6347 for (k = 0; k < max_a_idx; k++)
6349 if (okay[k]) who[n++] = k;
6352 /* Select the sort method */
6353 ang_sort_comp = ang_sort_art_comp;
6354 ang_sort_swap = ang_sort_art_swap;
6356 /* Sort the array by dungeon depth of monsters */
6357 ang_sort(who, &why, n);
6359 /* Scan the artifacts */
6360 for (k = 0; k < n; k++)
6362 artifact_type *a_ptr = &a_info[who[k]];
6366 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6368 strcpy(base_name, "Unknown Artifact");
6372 /* Obtain the base object type */
6373 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6381 /* Get local object */
6384 /* Create fake object */
6385 object_prep(q_ptr, z);
6387 /* Make it an artifact */
6388 q_ptr->name1 = (byte)who[k];
6390 /* Display as if known */
6391 q_ptr->ident |= IDENT_STORE;
6393 /* Describe the artifact */
6394 object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6397 /* Hack -- Build the artifact name */
6399 fprintf(fff, " %s\n", base_name);
6401 fprintf(fff, " The %s\n", base_name);
6406 /* Free the "who" array */
6407 C_KILL(who, max_a_idx, s16b);
6409 /* Free the "okay" array */
6410 C_KILL(okay, max_a_idx, bool);
6412 /* Close the file */
6415 /* Display the file contents */
6417 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6419 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6423 /* Remove the file */
6429 * Display known uniques
6431 static void do_cmd_knowledge_uniques(void)
6439 char file_name[1024];
6441 /* Open a new file */
6442 fff = my_fopen_temp(file_name, 1024);
6446 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6448 msg_format("Failed to create temporary file %s.", file_name);
6454 /* Allocate the "who" array */
6455 C_MAKE(who, max_r_idx, s16b);
6457 /* Scan the monsters */
6458 for (i = 1; i < max_r_idx; i++)
6460 monster_race *r_ptr = &r_info[i];
6462 /* Use that monster */
6463 if (r_ptr->name) who[n++] = i;
6466 /* Select the sort method */
6467 ang_sort_comp = ang_sort_comp_hook;
6468 ang_sort_swap = ang_sort_swap_hook;
6470 /* Sort the array by dungeon depth of monsters */
6471 ang_sort(who, &why, n);
6473 /* Scan the monster races */
6474 for (k = 0; k < n; k++)
6476 monster_race *r_ptr = &r_info[who[k]];
6478 /* Only print Uniques */
6479 if (r_ptr->flags1 & (RF1_UNIQUE))
6481 bool dead = (r_ptr->max_num == 0);
6485 /* Only display "known" uniques */
6486 if (dead || cheat_know || r_ptr->r_sights)
6488 /* Print a message */
6490 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6491 (r_name + r_ptr->name));
6493 fprintf(fff, " %s is alive\n",
6494 (r_name + r_ptr->name));
6501 /* Free the "who" array */
6502 C_KILL(who, max_r_idx, s16b);
6504 /* Close the file */
6507 /* Display the file contents */
6509 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6511 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6515 /* Remove the file */
6521 * Display weapon-exp
6523 static void do_cmd_knowledge_weapon_exp(void)
6525 int i, j, num, weapon_exp;
6529 char file_name[1024];
6532 /* Open a new file */
6533 fff = my_fopen_temp(file_name, 1024);
6536 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6538 msg_format("Failed to create temporary file %s.", file_name);
6544 for (i = 0; i < 5; i++)
6546 for (num = 0; num < 64; num++)
6548 for (j = 0; j < max_k_idx; j++)
6550 object_kind *k_ptr = &k_info[j];
6552 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6554 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6556 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6558 fprintf(fff, "%-25s ", tmp);
6559 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6560 else fprintf(fff, " ");
6561 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6562 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6570 /* Close the file */
6573 /* Display the file contents */
6575 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6577 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6581 /* Remove the file */
6589 static void do_cmd_knowledge_spell_exp(void)
6591 int i = 0, spell_exp, exp_level;
6596 char file_name[1024];
6598 /* Open a new file */
6599 fff = my_fopen_temp(file_name, 1024);
6602 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6604 msg_format("Failed to create temporary file %s.", file_name);
6610 if (p_ptr->realm1 != REALM_NONE)
6613 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6615 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6617 for (i = 0; i < 32; i++)
6619 if (!is_magic(p_ptr->realm1))
6621 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6625 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6627 if (s_ptr->slevel >= 99) continue;
6628 spell_exp = p_ptr->spell_exp[i];
6629 exp_level = spell_exp_level(spell_exp);
6630 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6631 if (p_ptr->realm1 == REALM_HISSATSU)
6632 fprintf(fff, "[--]");
6635 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6636 else fprintf(fff, " ");
6637 fprintf(fff, "%s", exp_level_str[exp_level]);
6639 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6644 if (p_ptr->realm2 != REALM_NONE)
6647 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6649 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6651 for (i = 0; i < 32; i++)
6653 if (!is_magic(p_ptr->realm1))
6655 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6659 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6661 if (s_ptr->slevel >= 99) continue;
6663 spell_exp = p_ptr->spell_exp[i + 32];
6664 exp_level = spell_exp_level(spell_exp);
6665 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6666 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6667 else fprintf(fff, " ");
6668 fprintf(fff, "%s", exp_level_str[exp_level]);
6669 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6674 /* Close the file */
6677 /* Display the file contents */
6679 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6681 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6685 /* Remove the file */
6693 static void do_cmd_knowledge_skill_exp(void)
6695 int i = 0, skill_exp;
6699 char file_name[1024];
6701 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6703 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6706 /* Open a new file */
6707 fff = my_fopen_temp(file_name, 1024);
6710 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6712 msg_format("Failed to create temporary file %s.", file_name);
6718 for (i = 0; i < 3; i++)
6720 skill_exp = p_ptr->skill_exp[i];
6721 fprintf(fff, "%-20s ", skill_name[i]);
6722 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6723 else fprintf(fff, " ");
6724 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6725 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6729 /* Close the file */
6732 /* Display the file contents */
6734 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6736 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6740 /* Remove the file */
6746 * Pluralize a monster name
6748 void plural_aux(char *Name)
6750 int NameLen = strlen(Name);
6752 if (my_strstr(Name, "Disembodied hand"))
6754 strcpy(Name, "Disembodied hands that strangled people");
6756 else if (my_strstr(Name, "Colour out of space"))
6758 strcpy(Name, "Colours out of space");
6760 else if (my_strstr(Name, "stairway to hell"))
6762 strcpy(Name, "stairways to hell");
6764 else if (my_strstr(Name, "Dweller on the threshold"))
6766 strcpy(Name, "Dwellers on the threshold");
6768 else if (my_strstr(Name, " of "))
6770 cptr aider = my_strstr(Name, " of ");
6781 if (dummy[i-1] == 's')
6783 strcpy(&(dummy[i]), "es");
6788 strcpy(&(dummy[i]), "s");
6791 strcpy(&(dummy[i+1]), aider);
6792 strcpy(Name, dummy);
6794 else if (my_strstr(Name, "coins"))
6797 strcpy(dummy, "piles of ");
6798 strcat(dummy, Name);
6799 strcpy(Name, dummy);
6802 else if (my_strstr(Name, "Manes"))
6806 else if (streq(&(Name[NameLen - 2]), "ey"))
6808 strcpy(&(Name[NameLen - 2]), "eys");
6810 else if (Name[NameLen - 1] == 'y')
6812 strcpy(&(Name[NameLen - 1]), "ies");
6814 else if (streq(&(Name[NameLen - 4]), "ouse"))
6816 strcpy(&(Name[NameLen - 4]), "ice");
6818 else if (streq(&(Name[NameLen - 2]), "us"))
6820 strcpy(&(Name[NameLen - 2]), "i");
6822 else if (streq(&(Name[NameLen - 6]), "kelman"))
6824 strcpy(&(Name[NameLen - 6]), "kelmen");
6826 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6828 strcpy(&(Name[NameLen - 8]), "wordsmen");
6830 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6832 strcpy(&(Name[NameLen - 7]), "oodsmen");
6834 else if (streq(&(Name[NameLen - 7]), "eastman"))
6836 strcpy(&(Name[NameLen - 7]), "eastmen");
6838 else if (streq(&(Name[NameLen - 8]), "izardman"))
6840 strcpy(&(Name[NameLen - 8]), "izardmen");
6842 else if (streq(&(Name[NameLen - 5]), "geist"))
6844 strcpy(&(Name[NameLen - 5]), "geister");
6846 else if (streq(&(Name[NameLen - 2]), "ex"))
6848 strcpy(&(Name[NameLen - 2]), "ices");
6850 else if (streq(&(Name[NameLen - 2]), "lf"))
6852 strcpy(&(Name[NameLen - 2]), "lves");
6854 else if (suffix(Name, "ch") ||
6855 suffix(Name, "sh") ||
6856 suffix(Name, "nx") ||
6857 suffix(Name, "s") ||
6860 strcpy(&(Name[NameLen]), "es");
6864 strcpy(&(Name[NameLen]), "s");
6869 * Display current pets
6871 static void do_cmd_knowledge_pets(void)
6875 monster_type *m_ptr;
6878 int show_upkeep = 0;
6879 char file_name[1024];
6882 /* Open a new file */
6883 fff = my_fopen_temp(file_name, 1024);
6886 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6888 msg_format("Failed to create temporary file %s.", file_name);
6894 /* Process the monsters (backwards) */
6895 for (i = m_max - 1; i >= 1; i--)
6897 /* Access the monster */
6900 /* Ignore "dead" monsters */
6901 if (!m_ptr->r_idx) continue;
6903 /* Calculate "upkeep" for pets */
6907 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6908 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6912 show_upkeep = calculate_upkeep();
6914 fprintf(fff, "----------------------------------------------\n");
6916 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
6917 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6919 fprintf(fff, " Total: %d pet%s.\n",
6920 t_friends, (t_friends == 1 ? "" : "s"));
6921 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6926 /* Close the file */
6929 /* Display the file contents */
6931 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6933 show_file(TRUE, file_name, "Current Pets", 0, 0);
6937 /* Remove the file */
6945 * Note that the player ghosts are ignored. XXX XXX XXX
6947 static void do_cmd_knowledge_kill_count(void)
6955 char file_name[1024];
6960 /* Open a new file */
6961 fff = my_fopen_temp(file_name, 1024);
6965 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6967 msg_format("Failed to create temporary file %s.", file_name);
6973 /* Allocate the "who" array */
6974 C_MAKE(who, max_r_idx, s16b);
6977 /* Monsters slain */
6980 for (kk = 1; kk < max_r_idx; kk++)
6982 monster_race *r_ptr = &r_info[kk];
6984 if (r_ptr->flags1 & (RF1_UNIQUE))
6986 bool dead = (r_ptr->max_num == 0);
6995 s16b This = r_ptr->r_pkills;
7006 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7008 fprintf(fff,"You have defeated no enemies yet.\n\n");
7011 else if (Total == 1)
7013 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7015 fprintf(fff,"You have defeated one enemy.\n\n");
7020 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7022 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7029 /* Scan the monsters */
7030 for (i = 1; i < max_r_idx; i++)
7032 monster_race *r_ptr = &r_info[i];
7034 /* Use that monster */
7035 if (r_ptr->name) who[n++] = i;
7038 /* Select the sort method */
7039 ang_sort_comp = ang_sort_comp_hook;
7040 ang_sort_swap = ang_sort_swap_hook;
7042 /* Sort the array by dungeon depth of monsters */
7043 ang_sort(who, &why, n);
7045 /* Scan the monster races */
7046 for (k = 0; k < n; k++)
7048 monster_race *r_ptr = &r_info[who[k]];
7050 if (r_ptr->flags1 & (RF1_UNIQUE))
7052 bool dead = (r_ptr->max_num == 0);
7056 /* Print a message */
7057 fprintf(fff, " %s\n",
7058 (r_name + r_ptr->name));
7064 s16b This = r_ptr->r_pkills;
7069 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7070 if(my_strchr("pt",r_ptr->d_char))
7071 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7073 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7077 if (my_strstr(r_name + r_ptr->name, "coins"))
7079 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7083 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7089 strcpy(ToPlural, (r_name + r_ptr->name));
7090 plural_aux(ToPlural);
7091 fprintf(fff, " %d %s\n", This, ToPlural);
7101 fprintf(fff,"----------------------------------------------\n");
7103 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7105 fprintf(fff," Total: %lu creature%s killed.\n",
7106 Total, (Total == 1 ? "" : "s"));
7110 /* Free the "who" array */
7111 C_KILL(who, max_r_idx, s16b);
7113 /* Close the file */
7116 /* Display the file contents */
7118 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7120 show_file(TRUE, file_name, "Kill Count", 0, 0);
7124 /* Remove the file */
7130 * Display the object groups.
7132 static void display_group_list(int col, int row, int wid, int per_page,
7133 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7137 /* Display lines until done */
7138 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7140 /* Get the group index */
7141 int grp = grp_idx[grp_top + i];
7143 /* Choose a color */
7144 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7146 /* Erase the entire line */
7147 Term_erase(col, row + i, wid);
7149 /* Display the group label */
7150 c_put_str(attr, group_text[grp], row + i, col);
7156 * Move the cursor in a browser window
7158 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7159 int *list_cur, int list_cnt)
7164 int list = *list_cur;
7166 /* Extract direction */
7169 /* Hack -- scroll up full screen */
7174 /* Hack -- scroll down full screen */
7179 d = get_keymap_dir(ch);
7184 /* Diagonals - hack */
7185 if ((ddx[d] > 0) && ddy[d])
7191 Term_get_size(&wid, &hgt);
7193 browser_rows = hgt - 8;
7195 /* Browse group list */
7200 /* Move up or down */
7201 grp += ddy[d] * (browser_rows - 1);
7204 if (grp >= grp_cnt) grp = grp_cnt - 1;
7205 if (grp < 0) grp = 0;
7206 if (grp != old_grp) list = 0;
7209 /* Browse sub-list list */
7212 /* Move up or down */
7213 list += ddy[d] * browser_rows;
7216 if (list >= list_cnt) list = list_cnt - 1;
7217 if (list < 0) list = 0;
7229 if (col < 0) col = 0;
7230 if (col > 1) col = 1;
7237 /* Browse group list */
7242 /* Move up or down */
7246 if (grp >= grp_cnt) grp = grp_cnt - 1;
7247 if (grp < 0) grp = 0;
7248 if (grp != old_grp) list = 0;
7251 /* Browse sub-list list */
7254 /* Move up or down */
7258 if (list >= list_cnt) list = list_cnt - 1;
7259 if (list < 0) list = 0;
7270 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7274 /* Clear the display lines */
7275 for (i = 0; i < height; i++)
7277 Term_erase(col, row + i, width);
7280 /* Bigtile mode uses double width */
7281 if (use_bigtile) width /= 2;
7283 /* Display lines until done */
7284 for (i = 0; i < height; i++)
7286 /* Display columns until done */
7287 for (j = 0; j < width; j++)
7295 /* Bigtile mode uses double width */
7296 if (use_bigtile) x += j;
7301 /* Ignore illegal characters */
7302 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7303 (!use_graphics && ic > 0x7f))
7309 /* Force correct code for both ASCII character and tile */
7310 if (c & 0x80) a |= 0x80;
7312 /* Display symbol */
7313 Term_queue_bigchar(x, y, a, c, 0, 0);
7320 * Place the cursor at the collect position for visual mode
7322 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7324 int i = (a & 0x7f) - attr_top;
7325 int j = c - char_left;
7330 /* Bigtile mode uses double width */
7331 if (use_bigtile) x += j;
7333 /* Place the cursor */
7339 * Clipboard variables for copy&paste in visual mode
7341 static byte attr_idx = 0;
7342 static byte char_idx = 0;
7344 /* Hack -- for feature lighting */
7345 static byte attr_idx_feat[F_LIT_MAX] = {0, 0, 0, 0};
7346 static byte char_idx_feat[F_LIT_MAX] = {0, 0, 0, 0};
7349 * Do visual mode command -- Change symbols
7351 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7352 int height, int width,
7353 byte *attr_top_ptr, byte *char_left_ptr,
7354 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
7356 static byte attr_old = 0, char_old = 0;
7361 if (*visual_list_ptr)
7364 *cur_attr_ptr = attr_old;
7365 *cur_char_ptr = char_old;
7366 *visual_list_ptr = FALSE;
7375 if (*visual_list_ptr)
7378 *visual_list_ptr = FALSE;
7379 *need_redraw = TRUE;
7387 if (!*visual_list_ptr)
7389 *visual_list_ptr = TRUE;
7391 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7392 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7394 attr_old = *cur_attr_ptr;
7395 char_old = *cur_char_ptr;
7406 /* Set the visual */
7407 attr_idx = *cur_attr_ptr;
7408 char_idx = *cur_char_ptr;
7410 /* Hack -- for feature lighting */
7411 for (i = 0; i < F_LIT_MAX; i++)
7413 attr_idx_feat[i] = 0;
7414 char_idx_feat[i] = 0;
7421 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow ATTR_DARK text */
7424 *cur_attr_ptr = attr_idx;
7425 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7426 if (!*visual_list_ptr) *need_redraw = TRUE;
7432 *cur_char_ptr = char_idx;
7433 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7434 if (!*visual_list_ptr) *need_redraw = TRUE;
7440 if (*visual_list_ptr)
7443 int d = get_keymap_dir(ch);
7444 byte a = (*cur_attr_ptr & 0x7f);
7445 byte c = *cur_char_ptr;
7447 if (use_bigtile) eff_width = width / 2;
7448 else eff_width = width;
7450 /* Restrict direction */
7451 if ((a == 0) && (ddy[d] < 0)) d = 0;
7452 if ((c == 0) && (ddx[d] < 0)) d = 0;
7453 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7454 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7459 /* Force correct code for both ASCII character and tile */
7460 if (c & 0x80) a |= 0x80;
7462 /* Set the visual */
7467 /* Move the frame */
7468 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7469 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7470 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7471 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7478 /* Visual mode command is not used */
7484 * Display the monsters in a group.
7486 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7487 int mon_cur, int mon_top)
7491 /* Display lines until done */
7492 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7496 /* Get the race index */
7497 int r_idx = mon_idx[mon_top + i] ;
7499 /* Access the race */
7500 monster_race *r_ptr = &r_info[r_idx];
7503 /* Choose a color */
7504 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7506 /* Display the name */
7507 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7509 /* Hack -- visual_list mode */
7512 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7514 else if (p_ptr->wizard)
7516 c_prt(attr, format("%d", r_idx), row + i, 60);
7519 /* Display symbol */
7520 Term_queue_bigchar(70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
7524 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7526 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7528 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7533 /* Clear remaining lines */
7534 for (; i < per_page; i++)
7536 Term_erase(col, row + i, 255);
7542 * Display known monsters.
7544 static void do_cmd_knowledge_monsters(bool *need_redraw)
7547 int grp_cur, grp_top, old_grp_cur;
7548 int mon_cur, mon_top;
7549 int grp_cnt, grp_idx[100];
7557 bool visual_list = FALSE;
7558 byte attr_top = 0, char_left = 0;
7564 Term_get_size(&wid, &hgt);
7566 browser_rows = hgt - 8;
7568 /* Allocate the "mon_idx" array */
7569 C_MAKE(mon_idx, max_r_idx, s16b);
7574 /* Check every group */
7575 for (i = 0; monster_group_text[i] != NULL; i++)
7577 /* Measure the label */
7578 len = strlen(monster_group_text[i]);
7580 /* Save the maximum length */
7581 if (len > max) max = len;
7583 /* See if any monsters are known */
7584 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7586 /* Build a list of groups with known monsters */
7587 grp_idx[grp_cnt++] = i;
7591 /* Terminate the list */
7592 grp_idx[grp_cnt] = -1;
7595 grp_cur = grp_top = 0;
7596 mon_cur = mon_top = 0;
7605 monster_race *r_ptr;
7612 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7613 prt("¥°¥ë¡¼¥×", 4, 0);
7614 prt("̾Á°", 4, max + 3);
7615 if (p_ptr->wizard) prt("Idx", 4, 60);
7616 prt("ʸ»ú »¦³²¿ô", 4, 67);
7618 prt("Knowledge - Monsters", 2, 0);
7620 prt("Name", 4, max + 3);
7621 if (p_ptr->wizard) prt("Idx", 4, 60);
7622 prt("Sym Kills", 4, 67);
7625 for (i = 0; i < 78; i++)
7627 Term_putch(i, 5, TERM_WHITE, '=');
7630 for (i = 0; i < browser_rows; i++)
7632 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7638 /* Scroll group list */
7639 if (grp_cur < grp_top) grp_top = grp_cur;
7640 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7642 /* Display a list of monster groups */
7643 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7645 if (old_grp_cur != grp_cur)
7647 old_grp_cur = grp_cur;
7649 /* Get a list of monsters in the current group */
7650 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7653 /* Scroll monster list */
7654 while (mon_cur < mon_top)
7655 mon_top = MAX(0, mon_top - browser_rows/2);
7656 while (mon_cur >= mon_top + browser_rows)
7657 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7661 /* Display a list of monsters in the current group */
7662 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7668 /* Display a monster name */
7669 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7671 /* Display visual list below first monster */
7672 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7677 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7679 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);
7682 /* Get the current monster */
7683 r_ptr = &r_info[mon_idx[mon_cur]];
7685 /* Mega Hack -- track this monster race */
7686 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7688 /* Hack -- handle stuff */
7693 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7697 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7701 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7706 /* Do visual mode command if needed */
7707 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;
7720 /* Recall on screen */
7721 if (mon_idx[mon_cur])
7723 screen_roff(mon_idx[mon_cur], 0);
7734 /* Move the cursor */
7735 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7742 /* Free the "mon_idx" array */
7743 C_KILL(mon_idx, max_r_idx, s16b);
7748 * Display the objects in a group.
7750 static void display_object_list(int col, int row, int per_page, int object_idx[],
7751 int object_cur, int object_top)
7755 /* Display lines until done */
7756 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7761 /* Get the object index */
7762 int k_idx = object_idx[object_top + i];
7764 /* Access the object */
7765 object_kind *k_ptr = &k_info[k_idx];
7767 /* Choose a color */
7768 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7769 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7771 attr = ((i + object_top == object_cur) ? cursor : attr);
7774 strip_name(o_name, k_idx);
7776 /* Display the name */
7777 c_prt(attr, o_name, row + i, col);
7779 /* Hack -- visual_list mode */
7782 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7784 else if (p_ptr->wizard)
7786 c_prt(attr, format ("%d", k_idx), row + i, 70);
7789 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7790 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7792 /* Symbol is unknown */
7793 if (!k_ptr->aware && !p_ptr->wizard)
7799 /* Display symbol */
7800 Term_queue_bigchar(76, row + i, a, c, 0, 0);
7803 /* Clear remaining lines */
7804 for (; i < per_page; i++)
7806 Term_erase(col, row + i, 255);
7811 * Describe fake object
7813 static void desc_obj_fake(int k_idx)
7816 object_type object_type_body;
7818 /* Get local object */
7819 o_ptr = &object_type_body;
7821 /* Wipe the object */
7824 /* Create the artifact */
7825 object_prep(o_ptr, k_idx);
7827 /* It's fully know */
7828 o_ptr->ident |= IDENT_KNOWN;
7830 /* Track the object */
7831 /* object_actual_track(o_ptr); */
7833 /* Hack - mark as fake */
7834 /* term_obj_real = FALSE; */
7836 /* Hack -- Handle stuff */
7839 if (!screen_object(o_ptr, FALSE))
7842 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7844 msg_print("You see nothing special.");
7853 * Display known objects
7855 static void do_cmd_knowledge_objects(bool *need_redraw)
7858 int grp_cur, grp_top, old_grp_cur;
7859 int object_old, object_cur, object_top;
7860 int grp_cnt, grp_idx[100];
7868 bool visual_list = FALSE;
7869 byte attr_top = 0, char_left = 0;
7875 Term_get_size(&wid, &hgt);
7877 browser_rows = hgt - 8;
7879 /* Allocate the "object_idx" array */
7880 C_MAKE(object_idx, max_k_idx, int);
7885 /* Check every group */
7886 for (i = 0; object_group_text[i] != NULL; i++)
7888 /* Measure the label */
7889 len = strlen(object_group_text[i]);
7891 /* Save the maximum length */
7892 if (len > max) max = len;
7894 /* See if any monsters are known */
7895 if (collect_objects(i, object_idx))
7897 /* Build a list of groups with known monsters */
7898 grp_idx[grp_cnt++] = i;
7902 /* Terminate the list */
7903 grp_idx[grp_cnt] = -1;
7906 grp_cur = grp_top = 0;
7907 object_cur = object_top = 0;
7924 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
7925 prt("¥°¥ë¡¼¥×", 4, 0);
7926 prt("̾Á°", 4, max + 3);
7927 if (p_ptr->wizard) prt("Idx", 4, 70);
7930 prt("Knowledge - objects", 2, 0);
7932 prt("Name", 4, max + 3);
7933 if (p_ptr->wizard) prt("Idx", 4, 70);
7937 for (i = 0; i < 78; i++)
7939 Term_putch(i, 5, TERM_WHITE, '=');
7942 for (i = 0; i < browser_rows; i++)
7944 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7950 /* Scroll group list */
7951 if (grp_cur < grp_top) grp_top = grp_cur;
7952 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7954 /* Display a list of object groups */
7955 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7957 if (old_grp_cur != grp_cur)
7959 old_grp_cur = grp_cur;
7961 /* Get a list of objects in the current group */
7962 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
7965 /* Scroll object list */
7966 while (object_cur < object_top)
7967 object_top = MAX(0, object_top - browser_rows/2);
7968 while (object_cur >= object_top + browser_rows)
7969 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7973 /* Display a list of objects in the current group */
7974 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
7978 object_top = object_cur;
7980 /* Display a list of objects in the current group */
7981 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
7983 /* Display visual list below first object */
7984 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7987 /* Get the current object */
7988 k_ptr = &k_info[object_idx[object_cur]];
7990 /* Mega Hack -- track this object */
7991 if (object_cnt) object_kind_track(object_idx[object_cur]);
7995 prt(format("<Êý¸þ>, 'r'¤Ç¾ÜºÙ¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7997 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);
8000 /* The "current" object changed */
8001 if (object_old != object_idx[object_cur])
8003 /* Hack -- handle stuff */
8006 /* Remember the "current" object */
8007 object_old = object_idx[object_cur];
8012 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8016 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8020 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8025 /* Do visual mode command if needed */
8026 /* Symbol of objects with flavor cannot be changed */
8027 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;
8040 /* Recall on screen */
8042 desc_obj_fake(object_idx[object_cur]);
8050 /* Move the cursor */
8051 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8057 /* Free the "object_idx" array */
8058 C_KILL(object_idx, max_k_idx, int);
8063 * Display the features in a group.
8065 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8066 int feat_cur, int feat_top, int lighting_level)
8073 /* Correct columns 1 and 4 */
8076 col2++; col3 += 2; col4 += 3;
8079 /* Display lines until done */
8080 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8085 int f_idx = feat_idx[feat_top + i];
8087 /* Access the index */
8088 feature_type *f_ptr = &f_info[f_idx];
8090 /* Choose a color */
8091 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8093 /* Display the name */
8094 c_prt(attr, f_name + f_ptr->name, row + i, col);
8096 /* Hack -- visual_list mode */
8099 /* Display lighting level */
8100 c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row + i, col + 1 + strlen(f_name + f_ptr->name));
8102 c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row + i, 56);
8105 /* Display symbol */
8106 Term_queue_bigchar(65, row + i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0);
8108 Term_putch(col2, row + i, TERM_SLATE, '(');
8109 Term_putch(col3, row + i, TERM_SLATE, '/');
8110 Term_putch(col4, row + i, TERM_SLATE, '/');
8111 Term_putch(col4 + (use_bigtile ? 3 : 2), row + i, TERM_SLATE, ')');
8115 /* Use lightened colour */
8116 Term_queue_bigchar(col2 + 1, row + i, f_ptr->x_attr[F_LIT_LITE], f_ptr->x_char[F_LIT_LITE], 0, 0);
8118 /* Use darkened colour */
8119 Term_queue_bigchar(col3 + 1, row + i, f_ptr->x_attr[F_LIT_DARK], f_ptr->x_char[F_LIT_DARK], 0, 0);
8121 /* Use darkly darkened colour */
8122 Term_queue_bigchar(col4 + 1, row + i, f_ptr->x_attr[F_LIT_DARKDARK], f_ptr->x_char[F_LIT_DARKDARK], 0, 0);
8125 /* Clear remaining lines */
8126 for (; i < per_page; i++)
8128 Term_erase(col, row + i, 255);
8134 * Interact with feature visuals.
8136 static void do_cmd_knowledge_features(bool *need_redraw)
8139 int grp_cur, grp_top, old_grp_cur;
8140 int feat_cur, feat_top;
8141 int grp_cnt, grp_idx[100];
8149 bool visual_list = FALSE;
8150 byte attr_top = 0, char_left = 0;
8155 byte attr_old[F_LIT_MAX] = {0, 0, 0, 0};
8156 byte char_old[F_LIT_MAX] = {0, 0, 0, 0};
8157 byte *cur_attr_ptr, *cur_char_ptr;
8158 int lighting_level = F_LIT_STANDARD;
8161 Term_get_size(&wid, &hgt);
8163 browser_rows = hgt - 8;
8165 /* Allocate the "feat_idx" array */
8166 C_MAKE(feat_idx, max_f_idx, int);
8171 /* Check every group */
8172 for (i = 0; feature_group_text[i] != NULL; i++)
8174 /* Measure the label */
8175 len = strlen(feature_group_text[i]);
8177 /* Save the maximum length */
8178 if (len > max) max = len;
8180 /* See if any features are known */
8181 if (collect_features(i, feat_idx))
8183 /* Build a list of groups with known features */
8184 grp_idx[grp_cnt++] = i;
8188 /* Terminate the list */
8189 grp_idx[grp_cnt] = -1;
8192 grp_cur = grp_top = 0;
8193 feat_cur = feat_top = 0;
8199 while ((!flag) && (grp_cnt))
8202 feature_type *f_ptr;
8209 prt("ɽ¼¨ - ÃÏ·Á", 2, 0);
8210 prt("¥°¥ë¡¼¥×", 4, 0);
8211 prt("̾Á°", 4, max + 3);
8212 if (use_bigtile) prt("ʸ»ú ( l/ d/ D)", 4, 63);
8213 else prt("ʸ»ú (l/d/D)", 4, 62);
8215 prt("Visuals - features", 2, 0);
8217 prt("Name", 4, max + 3);
8218 if (use_bigtile) prt("Sym ( l/ d/ D)", 4, 64);
8219 else prt("Sym (l/d/D)", 4, 63);
8222 for (i = 0; i < 78; i++)
8224 Term_putch(i, 5, TERM_WHITE, '=');
8227 for (i = 0; i < browser_rows; i++)
8229 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8235 /* Scroll group list */
8236 if (grp_cur < grp_top) grp_top = grp_cur;
8237 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8239 /* Display a list of feature groups */
8240 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8242 if (old_grp_cur != grp_cur)
8244 old_grp_cur = grp_cur;
8246 /* Get a list of features in the current group */
8247 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8250 /* Scroll feature list */
8251 while (feat_cur < feat_top)
8252 feat_top = MAX(0, feat_top - browser_rows/2);
8253 while (feat_cur >= feat_top + browser_rows)
8254 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8258 /* Display a list of features in the current group */
8259 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, F_LIT_STANDARD);
8263 feat_top = feat_cur;
8265 /* Display a list of features in the current group */
8266 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, lighting_level);
8268 /* Display visual list below first object */
8269 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8274 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê, 'a'¤ÇÂоÝÌÀÅÙÊѹ¹" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8276 prt(format("<dir>%s%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);
8279 /* Get the current feature */
8280 f_ptr = &f_info[feat_idx[feat_cur]];
8281 cur_attr_ptr = &f_ptr->x_attr[lighting_level];
8282 cur_char_ptr = &f_ptr->x_char[lighting_level];
8286 place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
8290 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8294 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8299 if ((ch == 'A') && visual_list)
8301 if (lighting_level <= F_LIT_STANDARD) lighting_level = F_LIT_DARKDARK;
8302 else lighting_level--;
8303 attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
8304 char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
8308 else if ((ch == 'a') && visual_list)
8310 if (lighting_level >= F_LIT_DARKDARK) lighting_level = F_LIT_STANDARD;
8311 else lighting_level++;
8312 attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
8313 char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
8317 /* Do visual mode command if needed */
8318 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))
8322 /* Restore previous visual settings */
8324 for (i = 0; i < F_LIT_MAX; i++)
8326 f_ptr->x_attr[i] = attr_old[i];
8327 f_ptr->x_char[i] = char_old[i];
8334 lighting_level = F_LIT_STANDARD;
8337 /* Preserve current visual settings */
8340 for (i = 0; i < F_LIT_MAX; i++)
8342 attr_old[i] = f_ptr->x_attr[i];
8343 char_old[i] = f_ptr->x_char[i];
8345 lighting_level = F_LIT_STANDARD;
8352 for (i = 0; i < F_LIT_MAX; i++)
8354 attr_idx_feat[i] = f_ptr->x_attr[i];
8355 char_idx_feat[i] = f_ptr->x_char[i];
8364 /* Allow ATTR_DARK text */
8365 for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
8367 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
8368 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
8386 /* Move the cursor */
8387 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8394 if (!grp_cnt) msg_print("No features known.");
8396 /* Free the "feat_idx" array */
8397 C_KILL(feat_idx, max_f_idx, int);
8402 * List wanted monsters
8404 static void do_cmd_knowledge_kubi(void)
8409 char file_name[1024];
8412 /* Open a new file */
8413 fff = my_fopen_temp(file_name, 1024);
8416 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8418 msg_format("Failed to create temporary file %s.", file_name);
8426 bool listed = FALSE;
8429 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8431 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8433 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8435 fprintf(fff, "List of wanted monsters\n");
8437 fprintf(fff, "----------------------------------------------\n");
8439 for (i = 0; i < MAX_KUBI; i++)
8441 if (kubi_r_idx[i] <= 10000)
8443 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8452 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8454 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8459 /* Close the file */
8462 /* Display the file contents */
8464 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8466 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8470 /* Remove the file */
8475 * List virtues & status
8477 static void do_cmd_knowledge_virtues(void)
8481 char file_name[1024];
8484 /* Open a new file */
8485 fff = my_fopen_temp(file_name, 1024);
8488 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8490 msg_format("Failed to create temporary file %s.", file_name);
8499 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8501 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8506 /* Close the file */
8509 /* Display the file contents */
8511 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8513 show_file(TRUE, file_name, "Virtues", 0, 0);
8517 /* Remove the file */
8525 static void do_cmd_knowledge_dungeon(void)
8529 char file_name[1024];
8533 /* Open a new file */
8534 fff = my_fopen_temp(file_name, 1024);
8537 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8539 msg_format("Failed to create temporary file %s.", file_name);
8547 for (i = 1; i < max_d_idx; i++)
8551 if (!d_info[i].maxdepth) continue;
8552 if (!max_dlv[i]) continue;
8553 if (d_info[i].final_guardian)
8555 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8557 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8559 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8561 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8566 /* Close the file */
8569 /* Display the file contents */
8571 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8573 show_file(TRUE, file_name, "Dungeon", 0, 0);
8577 /* Remove the file */
8582 * List virtues & status
8585 static void do_cmd_knowledge_stat(void)
8589 char file_name[1024];
8592 /* Open a new file */
8593 fff = my_fopen_temp(file_name, 1024);
8596 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8598 msg_format("Failed to create temporary file %s.", file_name);
8606 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8607 (2 * p_ptr->hitdie +
8608 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8611 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8612 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8613 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8615 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8616 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8617 fprintf(fff, "Limits of maximum stats\n\n");
8619 for (v_nr = 0; v_nr < 6; v_nr++)
8621 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);
8622 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8628 /* Close the file */
8631 /* Display the file contents */
8633 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8635 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8639 /* Remove the file */
8645 * Print all active quests
8647 static void do_cmd_knowledge_quests_current(FILE *fff)
8650 char rand_tmp_str[120] = "\0";
8652 monster_race *r_ptr;
8654 int rand_level = 100;
8658 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8660 fprintf(fff, "< Current Quest >\n");
8663 for (i = 1; i < max_quests; i++)
8665 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8667 /* Set the quest number temporary */
8668 int old_quest = p_ptr->inside_quest;
8671 /* Clear the text */
8672 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8673 quest_text_line = 0;
8675 p_ptr->inside_quest = i;
8677 /* Get the quest text */
8678 init_flags = INIT_SHOW_TEXT;
8680 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8682 /* Reset the old quest number */
8683 p_ptr->inside_quest = old_quest;
8685 /* No info from "silent" quests */
8686 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8690 if (quest[i].type != QUEST_TYPE_RANDOM)
8692 char note[80] = "\0";
8694 if (quest[i].status == QUEST_STATUS_TAKEN)
8696 switch (quest[i].type)
8698 case QUEST_TYPE_KILL_LEVEL:
8699 case QUEST_TYPE_KILL_ANY_LEVEL:
8700 r_ptr = &r_info[quest[i].r_idx];
8701 strcpy(name, r_name + r_ptr->name);
8702 if (quest[i].max_num > 1)
8705 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8706 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8709 sprintf(note," - kill %d %s, have killed %d.",
8710 quest[i].max_num, name, quest[i].cur_num);
8715 sprintf(note," - %s¤òÅݤ¹¡£",name);
8717 sprintf(note," - kill %s.",name);
8721 case QUEST_TYPE_FIND_ARTIFACT:
8722 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8724 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8726 sprintf(note," - Find out %s.", name);
8730 case QUEST_TYPE_FIND_EXIT:
8732 sprintf(note," - õº÷¤¹¤ë¡£");
8734 sprintf(note," - Search.");
8738 case QUEST_TYPE_KILL_NUMBER:
8740 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8741 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8743 sprintf(note," - Kill %d monsters, have killed %d.",
8744 quest[i].max_num, quest[i].cur_num);
8748 case QUEST_TYPE_KILL_ALL:
8750 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8752 sprintf(note," - Kill all monsters.");
8758 /* Print the quest info */
8760 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8761 quest[i].name, quest[i].level, note);
8763 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8764 quest[i].name, quest[i].level, note);
8767 fprintf(fff, tmp_str);
8769 if (quest[i].status == QUEST_STATUS_COMPLETED)
8772 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8774 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8776 fprintf(fff, tmp_str);
8782 while (quest_text[j][0] && j < 10)
8784 fprintf(fff, " %s\n", quest_text[j]);
8789 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8792 rand_level = quest[i].level;
8794 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8796 /* Print the quest info */
8797 r_ptr = &r_info[quest[i].r_idx];
8798 strcpy(name, r_name + r_ptr->name);
8800 if (quest[i].max_num > 1)
8803 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8804 quest[i].name, quest[i].level,
8805 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8809 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8810 quest[i].name, quest[i].level,
8811 quest[i].max_num, name, quest[i].cur_num);
8817 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8818 quest[i].name, quest[i].level, name);
8820 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8821 quest[i].name, quest[i].level, name);
8829 /* Print the current random quest */
8830 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8833 if (!total) fprintf(fff, " ¤Ê¤·\n");
8835 if (!total) fprintf(fff, " Nothing.\n");
8841 * Print all finished quests
8843 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8850 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8852 fprintf(fff, "< Completed Quest >\n");
8854 for (i = 1; i < max_quests; i++)
8856 int q_idx = quest_num[i];
8858 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8860 if (is_fixed_quest_idx(q_idx))
8862 /* Set the quest number temporary */
8863 int old_quest = p_ptr->inside_quest;
8865 p_ptr->inside_quest = q_idx;
8868 init_flags = INIT_ASSIGN;
8870 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8872 /* Reset the old quest number */
8873 p_ptr->inside_quest = old_quest;
8875 /* No info from "silent" quests */
8876 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8881 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8883 /* Print the quest info */
8885 if (quest[q_idx].complev == 0)
8889 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8891 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8893 r_name+r_info[quest[q_idx].r_idx].name,
8894 quest[q_idx].level);
8900 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8902 " %-40s (Dungeon level: %3d) - level %2d\n",
8904 r_name+r_info[quest[q_idx].r_idx].name,
8906 quest[q_idx].complev);
8911 /* Print the quest info */
8913 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8914 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8916 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8917 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8921 fprintf(fff, tmp_str);
8925 if (!total) fprintf(fff, " ¤Ê¤·\n");
8927 if (!total) fprintf(fff, " Nothing.\n");
8933 * Print all failed quests
8935 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8942 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8944 fprintf(fff, "< Failed Quest >\n");
8946 for (i = 1; i < max_quests; i++)
8948 int q_idx = quest_num[i];
8950 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8952 if (is_fixed_quest_idx(q_idx))
8954 /* Set the quest number temporary */
8955 int old_quest = p_ptr->inside_quest;
8957 p_ptr->inside_quest = q_idx;
8959 /* Get the quest text */
8960 init_flags = INIT_ASSIGN;
8962 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8964 /* Reset the old quest number */
8965 p_ptr->inside_quest = old_quest;
8967 /* No info from "silent" quests */
8968 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8973 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8975 /* Print the quest info */
8977 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8978 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8980 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
8981 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8986 /* Print the quest info */
8988 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8989 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8991 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8992 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8995 fprintf(fff, tmp_str);
8999 if (!total) fprintf(fff, " ¤Ê¤·\n");
9001 if (!total) fprintf(fff, " Nothing.\n");
9007 * Print all random quests
9009 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
9016 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
9018 fprintf(fff, "< Remaining Random Quest >\n");
9020 for (i = 1; i < max_quests; i++)
9022 /* No info from "silent" quests */
9023 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
9025 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
9029 /* Print the quest info */
9031 sprintf(tmp_str, " %s (%d³¬, %s)\n",
9032 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9034 sprintf(tmp_str, " %s (%d, %s)\n",
9035 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9037 fprintf(fff, tmp_str);
9041 if (!total) fprintf(fff, " ¤Ê¤·\n");
9043 if (!total) fprintf(fff, " Nothing.\n");
9048 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
9050 int *q_num = (int *)u;
9051 quest_type *qa = &quest[q_num[a]];
9052 quest_type *qb = &quest[q_num[b]];
9057 if (qa->complev < qb->complev) return TRUE;
9058 if (qa->complev > qb->complev) return FALSE;
9059 if (qa->level <= qb->level) return TRUE;
9063 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9065 int *q_num = (int *)u;
9072 q_num[a] = q_num[b];
9078 * Print quest status of all active quests
9080 static void do_cmd_knowledge_quests(void)
9083 char file_name[1024];
9084 int *quest_num, dummy, i;
9086 /* Open a new file */
9087 fff = my_fopen_temp(file_name, 1024);
9091 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9093 msg_format("Failed to create temporary file %s.", file_name);
9099 /* Allocate Memory */
9100 C_MAKE(quest_num, max_quests, int);
9102 /* Sort by compete level */
9103 for (i = 1; i < max_quests; i++) quest_num[i] = i;
9104 ang_sort_comp = ang_sort_comp_quest_num;
9105 ang_sort_swap = ang_sort_swap_quest_num;
9106 ang_sort(quest_num, &dummy, max_quests);
9108 /* Dump Quest Information */
9109 do_cmd_knowledge_quests_current(fff);
9111 do_cmd_knowledge_quests_completed(fff, quest_num);
9113 do_cmd_knowledge_quests_failed(fff, quest_num);
9117 do_cmd_knowledge_quests_wiz_random(fff);
9120 /* Close the file */
9123 /* Display the file contents */
9125 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9127 show_file(TRUE, file_name, "Quest status", 0, 0);
9130 /* Remove the file */
9134 C_KILL(quest_num, max_quests, int);
9141 static void do_cmd_knowledge_home(void)
9146 char file_name[1024];
9148 char o_name[MAX_NLEN];
9151 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9153 /* Open a new file */
9154 fff = my_fopen_temp(file_name, 1024);
9157 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9159 msg_format("Failed to create temporary file %s.", file_name);
9167 /* Print all homes in the different towns */
9168 st_ptr = &town[1].store[STORE_HOME];
9170 /* Home -- if anything there */
9171 if (st_ptr->stock_num)
9176 /* Header with name of the town */
9178 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9180 fprintf(fff, " [Home Inventory]\n");
9183 /* Dump all available items */
9184 for (i = 0; i < st_ptr->stock_num; i++)
9187 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9188 object_desc(o_name, &st_ptr->stock[i], 0);
9189 if (strlen(o_name) <= 80-3)
9191 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9197 for (n = 0, t = o_name; n < 80-3; n++, t++)
9198 if(iskanji(*t)) {t++; n++;}
9199 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9201 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9202 fprintf(fff, " %.77s\n", o_name+n);
9205 object_desc(o_name, &st_ptr->stock[i], 0);
9206 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9211 /* Add an empty line */
9212 fprintf(fff, "\n\n");
9216 /* Close the file */
9219 /* Display the file contents */
9221 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9223 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9227 /* Remove the file */
9233 * Check the status of "autopick"
9235 static void do_cmd_knowledge_autopick(void)
9239 char file_name[1024];
9241 /* Open a new file */
9242 fff = my_fopen_temp(file_name, 1024);
9247 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9249 msg_format("Failed to create temporary file %s.", file_name);
9258 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9260 fprintf(fff, "No preference for auto picker/destroyer.");
9266 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9268 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9272 for (k = 0; k < max_autopick; k++)
9275 byte act = autopick_list[k].action;
9276 if (act & DONT_AUTOPICK)
9284 else if (act & DO_AUTODESTROY)
9292 else if (act & DO_AUTOPICK)
9300 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9309 if (act & DO_DISPLAY)
9310 fprintf(fff, "%11s", format("[%s]", tmp));
9312 fprintf(fff, "%11s", format("(%s)", tmp));
9314 tmp = autopick_line_from_entry(&autopick_list[k]);
9315 fprintf(fff, " %s", tmp);
9319 /* Close the file */
9321 /* Display the file contents */
9323 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9325 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9328 /* Remove the file */
9334 * Interact with "knowledge"
9336 void do_cmd_knowledge(void)
9339 bool need_redraw = FALSE;
9341 /* File type is "TEXT" */
9342 FILE_TYPE(FILE_TYPE_TEXT);
9344 /* Save the screen */
9347 /* Interact until done */
9353 /* Ask for a choice */
9355 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9356 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9358 prt(format("page %d/2", (p+1)), 2, 65);
9359 prt("Display current knowledge", 3, 0);
9362 /* Give some choices */
9366 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9367 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9368 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9369 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9370 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9371 if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9372 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9373 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9374 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9375 prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5);
9379 prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5);
9380 prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5);
9381 prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5);
9382 prt("(d) ËâË¡¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 9, 5);
9383 prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 10, 5);
9384 prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ ¤Î°ìÍ÷", 11, 5);
9385 prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó ¤Î°ìÍ÷", 12, 5);
9386 prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È ¤Î°ìÍ÷", 13, 5);
9387 prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5);
9392 prt("(1) Display known artifacts", 6, 5);
9393 prt("(2) Display known objects", 7, 5);
9394 prt("(3) Display remaining uniques", 8, 5);
9395 prt("(4) Display known monster", 9, 5);
9396 prt("(5) Display kill count", 10, 5);
9397 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9398 prt("(7) Display current pets", 12, 5);
9399 prt("(8) Display home inventory", 13, 5);
9400 prt("(9) Display *identified* equip.", 14, 5);
9401 prt("(0) Display terrain symbols.", 15, 5);
9405 prt("(a) Display about yourself", 6, 5);
9406 prt("(b) Display mutations", 7, 5);
9407 prt("(c) Display weapon proficiency", 8, 5);
9408 prt("(d) Display spell proficiency", 9, 5);
9409 prt("(e) Display misc. proficiency", 10, 5);
9410 prt("(f) Display virtues", 11, 5);
9411 prt("(g) Display dungeons", 12, 5);
9412 prt("(h) Display current quests", 13, 5);
9413 prt("(i) Display auto pick/destroy", 14, 5);
9418 prt("-³¤¯-", 17, 8);
9419 prt("ESC) È´¤±¤ë", 21, 1);
9420 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9421 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9422 prt("¥³¥Þ¥ó¥É:", 20, 0);
9424 prt("-more-", 17, 8);
9425 prt("ESC) Exit menu", 21, 1);
9426 prt("SPACE) Next page", 21, 30);
9427 /*prt("-) Previous page", 21, 60);*/
9428 prt("Command: ", 20, 0);
9435 if (i == ESCAPE) break;
9438 case ' ': /* Page change */
9442 case '1': /* Artifacts */
9443 do_cmd_knowledge_artifacts();
9445 case '2': /* Objects */
9446 do_cmd_knowledge_objects(&need_redraw);
9448 case '3': /* Uniques */
9449 do_cmd_knowledge_uniques();
9451 case '4': /* Monsters */
9452 do_cmd_knowledge_monsters(&need_redraw);
9454 case '5': /* Kill count */
9455 do_cmd_knowledge_kill_count();
9457 case '6': /* wanted */
9458 if (!vanilla_town) do_cmd_knowledge_kubi();
9460 case '7': /* Pets */
9461 do_cmd_knowledge_pets();
9463 case '8': /* Home */
9464 do_cmd_knowledge_home();
9466 case '9': /* Resist list */
9467 do_cmd_knowledge_inven();
9469 case '0': /* Feature list */
9470 do_cmd_knowledge_features(&need_redraw);
9473 case 'a': /* Max stat */
9474 do_cmd_knowledge_stat();
9476 case 'b': /* Mutations */
9477 do_cmd_knowledge_mutations();
9479 case 'c': /* weapon-exp */
9480 do_cmd_knowledge_weapon_exp();
9482 case 'd': /* spell-exp */
9483 do_cmd_knowledge_spell_exp();
9485 case 'e': /* skill-exp */
9486 do_cmd_knowledge_skill_exp();
9488 case 'f': /* Virtues */
9489 do_cmd_knowledge_virtues();
9491 case 'g': /* Dungeon */
9492 do_cmd_knowledge_dungeon();
9494 case 'h': /* Quests */
9495 do_cmd_knowledge_quests();
9497 case 'i': /* Autopick */
9498 do_cmd_knowledge_autopick();
9500 default: /* Unknown option */
9504 /* Flush messages */
9508 /* Restore the screen */
9511 if (need_redraw) do_cmd_redraw();
9516 * Check on the status of an active quest
9518 void do_cmd_checkquest(void)
9520 /* File type is "TEXT" */
9521 FILE_TYPE(FILE_TYPE_TEXT);
9523 /* Save the screen */
9527 do_cmd_knowledge_quests();
9529 /* Restore the screen */
9535 * Display the time and date
9537 void do_cmd_time(void)
9539 int day, hour, min, full, start, end, num;
9546 extract_day_hour_min(&day, &hour, &min);
9548 full = hour * 100 + min;
9556 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9558 strcpy(desc, "It is a strange time.");
9564 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9565 day, (hour % 12 == 0) ? 12 : (hour % 12),
9566 min, (hour < 12) ? "AM" : "PM");
9568 msg_format("This is day %d. The time is %d:%02d %s.",
9569 day, (hour % 12 == 0) ? 12 : (hour % 12),
9570 min, (hour < 12) ? "AM" : "PM");
9575 if (!randint0(10) || p_ptr->image)
9578 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9580 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9587 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9589 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9594 /* Open this file */
9595 fff = my_fopen(buf, "rt");
9600 /* Find this time */
9601 while (!my_fgets(fff, buf, sizeof(buf)))
9603 /* Ignore comments */
9604 if (!buf[0] || (buf[0] == '#')) continue;
9606 /* Ignore invalid lines */
9607 if (buf[1] != ':') continue;
9609 /* Process 'Start' */
9612 /* Extract the starting time */
9613 start = atoi(buf + 2);
9615 /* Assume valid for an hour */
9625 /* Extract the ending time */
9626 end = atoi(buf + 2);
9632 /* Ignore incorrect range */
9633 if ((start > full) || (full > end)) continue;
9635 /* Process 'Description' */
9640 /* Apply the randomizer */
9641 if (!randint0(num)) strcpy(desc, buf + 2);
9651 /* Close the file */