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 = 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();
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_aux(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_aux(finder, 80)) continue;
1428 strcpy(shower, finder);
1431 for (z = i + 1; z < n; z++)
1433 cptr msg = message_str(z);
1436 if (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) Output Options", 3, 5);
2313 prt("(3) Game-Play Options", 4, 5);
2314 prt("(4) Disturbance Options", 5, 5);
2315 prt("(5) Efficiency 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;
2376 /* General Options */
2379 /* Process the general options */
2381 do_cmd_options_aux(OPT_PAGE_INPUT, "¥¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2383 do_cmd_options_aux(OPT_PAGE_INPUT, "Input Options");
2389 /* General Options */
2392 /* Process the general options */
2394 do_cmd_options_aux(OPT_PAGE_OUTPUT, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
2396 do_cmd_options_aux(OPT_PAGE_OUTPUT, "Output Options");
2402 /* Inventory Options */
2407 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2409 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "Game-Play Options");
2415 /* Disturbance Options */
2420 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2422 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "Disturbance Options");
2428 /* Efficiency Options */
2433 do_cmd_options_aux(OPT_PAGE_EFFICIENCY, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
2435 do_cmd_options_aux(OPT_PAGE_EFFICIENCY, "Efficiency Options");
2441 /* Object auto-destruction Options */
2446 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2448 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "Easy Auto-Destroyer Options");
2453 /* Play-record Options */
2459 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "¥×¥ì¥¤µÏ¿¥ª¥×¥·¥ç¥ó");
2461 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "Play-record Options");
2472 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
2474 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
2480 /* Cheating Options */
2483 if (!p_ptr->noscore && !allow_debug_opts)
2485 /* Cheat options are not permitted */
2492 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤¤Ê¤¤¡ª");
2494 do_cmd_options_cheat("Cheaters never win");
2504 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2506 do_cmd_options_autosave("Autosave");
2517 do_cmd_options_win();
2518 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2519 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2520 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2521 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2525 /* Auto-picker/destroyer editor */
2529 do_cmd_edit_autopick();
2533 /* Hack -- Delay Speed */
2539 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
2541 prt("Command: Base Delay Factor", 19, 0);
2545 /* Get a new value */
2548 int msec = delay_factor * delay_factor * delay_factor;
2550 prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2551 delay_factor, msec), 22, 0);
2553 prt(format("Current base delay factor: %d (%d msec)",
2554 delay_factor, msec), 22, 0);
2558 prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2560 prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2564 if (k == ESCAPE) break;
2568 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2570 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2574 else if (isdigit(k)) delay_factor = D2I(k);
2581 /* Hack -- hitpoint warning factor */
2587 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
2589 prt("Command: Hitpoint Warning", 19, 0);
2593 /* Get a new value */
2597 prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2598 hitpoint_warn), 22, 0);
2600 prt(format("Current hitpoint warning: %d0%%",
2601 hitpoint_warn), 22, 0);
2605 prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2607 prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2611 if (k == ESCAPE) break;
2615 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2617 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2621 else if (isdigit(k)) hitpoint_warn = D2I(k);
2628 /* Hack -- mana color factor */
2634 prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
2636 prt("Command: Mana Color Threshold", 19, 0);
2640 /* Get a new value */
2644 prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
2647 prt(format("Current mana color threshold: %d0%%",
2652 prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
2654 prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
2658 if (k == ESCAPE) break;
2662 (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
2664 (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
2668 else if (isdigit(k)) mana_warn = D2I(k);
2677 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2679 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2684 /* Unknown option */
2693 /* Flush messages */
2698 /* Restore the screen */
2701 /* Hack - Redraw equippy chars */
2702 p_ptr->redraw |= (PR_EQUIPPY);
2708 * Ask for a "user pref line" and process it
2710 * XXX XXX XXX Allow absolute file names?
2712 void do_cmd_pref(void)
2719 /* Ask for a "user pref command" */
2721 if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2723 if (!get_string("Pref: ", buf, 80)) return;
2727 /* Process that pref command */
2728 (void)process_pref_file_command(buf);
2731 void do_cmd_pickpref(void)
2737 if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2739 if(!get_check("Reload auto-pick preference file? ")) return;
2742 /* Free old entries */
2745 /* ¥¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2747 sprintf(buf, "picktype-%s.prf", player_name);
2749 sprintf(buf, "pickpref-%s.prf", player_name);
2751 err = process_pickpref_file(buf);
2756 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2758 msg_format("loaded '%s'.", buf);
2762 /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2764 /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2768 err = process_pickpref_file("picktype.prf");
2770 err = process_pickpref_file("pickpref.prf");
2776 msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2778 msg_print("loaded 'pickpref.prf'.");
2785 if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2787 if(err) msg_print("Failed to reload autopick preference.");
2794 * Hack -- append all current macros to the given file
2796 static errr macro_dump(cptr fname)
2798 static cptr mark = "Macro Dump";
2804 /* Build the filename */
2805 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2807 /* File type is "TEXT" */
2808 FILE_TYPE(FILE_TYPE_TEXT);
2810 /* Append to the file */
2811 if (!open_auto_dump(buf, mark)) return (-1);
2815 auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2817 auto_dump_printf("\n# Automatic macro dump\n\n");
2821 for (i = 0; i < macro__num; i++)
2823 /* Extract the action */
2824 ascii_to_text(buf, macro__act[i]);
2826 /* Dump the macro */
2827 auto_dump_printf("A:%s\n", buf);
2829 /* Extract the action */
2830 ascii_to_text(buf, macro__pat[i]);
2832 /* Dump normal macros */
2833 auto_dump_printf("P:%s\n", buf);
2836 auto_dump_printf("\n");
2848 * Hack -- ask for a "trigger" (see below)
2850 * Note the complex use of the "inkey()" function from "util.c".
2852 * Note that both "flush()" calls are extremely important.
2854 static void do_cmd_macro_aux(char *buf)
2864 /* Do not process macros */
2870 /* Read the pattern */
2876 /* Do not process macros */
2879 /* Do not wait for keys */
2882 /* Attempt to read a key */
2893 /* Convert the trigger */
2894 ascii_to_text(tmp, buf);
2896 /* Hack -- display the trigger */
2897 Term_addstr(-1, TERM_WHITE, tmp);
2904 * Hack -- ask for a keymap "trigger" (see below)
2906 * Note that both "flush()" calls are extremely important. This may
2907 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2909 static void do_cmd_macro_aux_keymap(char *buf)
2923 /* Convert to ascii */
2924 ascii_to_text(tmp, buf);
2926 /* Hack -- display the trigger */
2927 Term_addstr(-1, TERM_WHITE, tmp);
2936 * Hack -- append all keymaps to the given file
2938 static errr keymap_dump(cptr fname)
2940 static cptr mark = "Keymap Dump";
2949 if (rogue_like_commands)
2951 mode = KEYMAP_MODE_ROGUE;
2957 mode = KEYMAP_MODE_ORIG;
2961 /* Build the filename */
2962 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2964 /* File type is "TEXT" */
2965 FILE_TYPE(FILE_TYPE_TEXT);
2967 /* Append to the file */
2968 if (!open_auto_dump(buf, mark)) return -1;
2972 auto_dump_printf("\n# ¼«Æ°¥¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2974 auto_dump_printf("\n# Automatic keymap dump\n\n");
2978 for (i = 0; i < 256; i++)
2982 /* Loop up the keymap */
2983 act = keymap_act[mode][i];
2985 /* Skip empty keymaps */
2988 /* Encode the key */
2991 ascii_to_text(key, buf);
2993 /* Encode the action */
2994 ascii_to_text(buf, act);
2996 /* Dump the macro */
2997 auto_dump_printf("A:%s\n", buf);
2998 auto_dump_printf("C:%d:%s\n", mode, key);
3011 * Interact with "macros"
3013 * Note that the macro "action" must be defined before the trigger.
3015 * Could use some helpful instructions on this page. XXX XXX XXX
3017 void do_cmd_macros(void)
3029 if (rogue_like_commands)
3031 mode = KEYMAP_MODE_ROGUE;
3037 mode = KEYMAP_MODE_ORIG;
3040 /* File type is "TEXT" */
3041 FILE_TYPE(FILE_TYPE_TEXT);
3048 /* Process requests until done */
3056 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
3058 prt("Interact with Macros", 2, 0);
3063 /* Describe that action */
3065 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3067 prt("Current action (if any) shown below:", 20, 0);
3071 /* Analyze the current action */
3072 ascii_to_text(buf, macro__buf);
3074 /* Display the current action */
3080 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3082 prt("(1) Load a user pref file", 4, 5);
3087 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
3088 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
3089 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
3090 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
3091 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3092 prt("(7) ¥¡¼ÇÛÃ֤γÎǧ", 10, 5);
3093 prt("(8) ¥¡¼ÇÛÃ֤κîÀ®", 11, 5);
3094 prt("(9) ¥¡¼ÇÛÃ֤κï½ü", 12, 5);
3095 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3097 prt("(2) Append macros to a file", 5, 5);
3098 prt("(3) Query a macro", 6, 5);
3099 prt("(4) Create a macro", 7, 5);
3100 prt("(5) Remove a macro", 8, 5);
3101 prt("(6) Append keymaps to a file", 9, 5);
3102 prt("(7) Query a keymap", 10, 5);
3103 prt("(8) Create a keymap", 11, 5);
3104 prt("(9) Remove a keymap", 12, 5);
3105 prt("(0) Enter a new action", 13, 5);
3108 #endif /* ALLOW_MACROS */
3112 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3114 prt("Command: ", 16, 0);
3122 if (i == ESCAPE) break;
3124 /* Load a 'macro' file */
3131 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3133 prt("Command: Load a user pref file", 16, 0);
3139 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3141 prt("File: ", 18, 0);
3145 /* Default filename */
3146 sprintf(tmp, "%s.prf", player_name);
3148 /* Ask for a file */
3149 if (!askfor_aux(tmp, 80)) continue;
3151 /* Process the given filename */
3152 err = process_pref_file(tmp);
3156 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3158 msg_format("Loaded default '%s'.", tmp);
3165 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3167 msg_format("Failed to load '%s'!");
3173 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3175 msg_format("Loaded '%s'.", tmp);
3187 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3189 prt("Command: Append macros to a file", 16, 0);
3195 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3197 prt("File: ", 18, 0);
3201 /* Default filename */
3202 sprintf(tmp, "%s.prf", player_name);
3204 /* Ask for a file */
3205 if (!askfor_aux(tmp, 80)) continue;
3207 /* Dump the macros */
3208 (void)macro_dump(tmp);
3212 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3214 msg_print("Appended macros.");
3226 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3228 prt("Command: Query a macro", 16, 0);
3234 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3236 prt("Trigger: ", 18, 0);
3240 /* Get a macro trigger */
3241 do_cmd_macro_aux(buf);
3243 /* Acquire action */
3244 k = macro_find_exact(buf);
3251 msg_print("¤½¤Î¥¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3253 msg_print("Found no macro.");
3261 /* Obtain the action */
3262 strcpy(macro__buf, macro__act[k]);
3264 /* Analyze the current action */
3265 ascii_to_text(buf, macro__buf);
3267 /* Display the current action */
3272 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3274 msg_print("Found a macro.");
3280 /* Create a macro */
3285 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3287 prt("Command: Create a macro", 16, 0);
3293 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3295 prt("Trigger: ", 18, 0);
3299 /* Get a macro trigger */
3300 do_cmd_macro_aux(buf);
3307 prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3309 prt("Action: ", 20, 0);
3313 /* Convert to text */
3314 ascii_to_text(tmp, macro__buf);
3316 /* Get an encoded action */
3317 if (askfor_aux(tmp, 80))
3319 /* Convert to ascii */
3320 text_to_ascii(macro__buf, tmp);
3322 /* Link the macro */
3323 macro_add(buf, macro__buf);
3327 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3329 msg_print("Added a macro.");
3335 /* Remove a macro */
3340 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3342 prt("Command: Remove a macro", 16, 0);
3348 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3350 prt("Trigger: ", 18, 0);
3354 /* Get a macro trigger */
3355 do_cmd_macro_aux(buf);
3357 /* Link the macro */
3358 macro_add(buf, buf);
3362 msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3364 msg_print("Removed a macro.");
3374 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3376 prt("Command: Append keymaps to a file", 16, 0);
3382 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3384 prt("File: ", 18, 0);
3388 /* Default filename */
3389 sprintf(tmp, "%s.prf", player_name);
3391 /* Ask for a file */
3392 if (!askfor_aux(tmp, 80)) continue;
3394 /* Dump the macros */
3395 (void)keymap_dump(tmp);
3399 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3401 msg_print("Appended keymaps.");
3406 /* Query a keymap */
3413 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤γÎǧ", 16, 0);
3415 prt("Command: Query a keymap", 16, 0);
3421 prt("²¡¤¹¥¡¼: ", 18, 0);
3423 prt("Keypress: ", 18, 0);
3427 /* Get a keymap trigger */
3428 do_cmd_macro_aux_keymap(buf);
3430 /* Look up the keymap */
3431 act = keymap_act[mode][(byte)(buf[0])];
3438 msg_print("¥¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3440 msg_print("Found no keymap.");
3448 /* Obtain the action */
3449 strcpy(macro__buf, act);
3451 /* Analyze the current action */
3452 ascii_to_text(buf, macro__buf);
3454 /* Display the current action */
3459 msg_print("¥¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3461 msg_print("Found a keymap.");
3467 /* Create a keymap */
3472 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κîÀ®", 16, 0);
3474 prt("Command: Create a keymap", 16, 0);
3480 prt("²¡¤¹¥¡¼: ", 18, 0);
3482 prt("Keypress: ", 18, 0);
3486 /* Get a keymap trigger */
3487 do_cmd_macro_aux_keymap(buf);
3494 prt("¹ÔÆ°: ", 20, 0);
3496 prt("Action: ", 20, 0);
3500 /* Convert to text */
3501 ascii_to_text(tmp, macro__buf);
3503 /* Get an encoded action */
3504 if (askfor_aux(tmp, 80))
3506 /* Convert to ascii */
3507 text_to_ascii(macro__buf, tmp);
3509 /* Free old keymap */
3510 string_free(keymap_act[mode][(byte)(buf[0])]);
3512 /* Make new keymap */
3513 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3517 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3519 msg_print("Added a keymap.");
3525 /* Remove a keymap */
3530 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κï½ü", 16, 0);
3532 prt("Command: Remove a keymap", 16, 0);
3538 prt("²¡¤¹¥¡¼: ", 18, 0);
3540 prt("Keypress: ", 18, 0);
3544 /* Get a keymap trigger */
3545 do_cmd_macro_aux_keymap(buf);
3547 /* Free old keymap */
3548 string_free(keymap_act[mode][(byte)(buf[0])]);
3550 /* Make new keymap */
3551 keymap_act[mode][(byte)(buf[0])] = NULL;
3555 msg_print("¥¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3557 msg_print("Removed a keymap.");
3562 /* Enter a new action */
3567 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3569 prt("Command: Enter a new action", 16, 0);
3573 /* Go to the correct location */
3576 /* Hack -- limit the value */
3579 /* Get an encoded action */
3580 if (!askfor_aux(buf, 80)) continue;
3582 /* Extract an action */
3583 text_to_ascii(macro__buf, buf);
3586 #endif /* ALLOW_MACROS */
3595 /* Flush messages */
3604 static void cmd_visuals_aux(int i, int *num, int max)
3611 sprintf(str, "%d", *num);
3613 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3616 tmp = strtol(str, NULL, 0);
3617 if (tmp >= 0 && tmp < max)
3621 else if (isupper(i))
3622 *num = (*num + max - 1) % max;
3624 *num = (*num + 1) % max;
3630 * Interact with "visuals"
3632 void do_cmd_visuals(void)
3640 const char *empty_symbol = "<< ? >>";
3642 if (use_bigtile) empty_symbol = "<< ?? >>";
3644 /* File type is "TEXT" */
3645 FILE_TYPE(FILE_TYPE_TEXT);
3648 /* Save the screen */
3652 /* Interact until done */
3658 /* Ask for a choice */
3660 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3662 prt("Interact with Visuals", 2, 0);
3666 /* Give some choices */
3668 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3670 prt("(1) Load a user pref file", 4, 5);
3673 #ifdef ALLOW_VISUALS
3675 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
3676 prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 6, 5);
3677 prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 7, 5);
3678 prt("(5) (̤»ÈÍÑ)", 8, 5);
3679 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3680 prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3681 prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3682 prt("(9) (̤»ÈÍÑ)", 12, 5);
3684 prt("(2) Dump monster attr/chars", 5, 5);
3685 prt("(3) Dump object attr/chars", 6, 5);
3686 prt("(4) Dump feature attr/chars", 7, 5);
3687 prt("(5) (unused)", 8, 5);
3688 prt("(6) Change monster attr/chars", 9, 5);
3689 prt("(7) Change object attr/chars", 10, 5);
3690 prt("(8) Change feature attr/chars", 11, 5);
3691 prt("(9) (unused)", 12, 5);
3696 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3698 prt("(0) Reset visuals", 13, 5);
3704 prt("¥³¥Þ¥ó¥É:", 18, 0);
3706 prt("Command: ", 15, 0);
3714 if (i == ESCAPE) break;
3716 /* Load a 'pref' file */
3721 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3723 prt("Command: Load a user pref file", 15, 0);
3729 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3731 prt("File: ", 17, 0);
3735 /* Default filename */
3736 sprintf(tmp, "%s.prf", player_name);
3739 if (!askfor_aux(tmp, 70)) continue;
3741 /* Process the given filename */
3742 (void)process_pref_file(tmp);
3745 #ifdef ALLOW_VISUALS
3747 /* Dump monster attr/chars */
3750 static cptr mark = "Monster attr/chars";
3754 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3756 prt("Command: Dump monster attr/chars", 15, 0);
3762 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3764 prt("File: ", 17, 0);
3768 /* Default filename */
3769 sprintf(tmp, "%s.prf", player_name);
3771 /* Get a filename */
3772 if (!askfor_aux(tmp, 70)) continue;
3774 /* Build the filename */
3775 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3777 /* Append to the file */
3778 if (!open_auto_dump(buf, mark)) continue;
3782 auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3784 auto_dump_printf("\n# Monster attr/char definitions\n\n");
3788 for (i = 1; i < max_r_idx; i++)
3790 monster_race *r_ptr = &r_info[i];
3792 /* Skip non-entries */
3793 if (!r_ptr->name) continue;
3795 /* Dump a comment */
3796 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3798 /* Dump the monster attr/char info */
3799 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3800 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3808 msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3810 msg_print("Dumped monster attr/chars.");
3815 /* Dump object attr/chars */
3818 static cptr mark = "Object attr/chars";
3822 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3824 prt("Command: Dump object attr/chars", 15, 0);
3830 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3832 prt("File: ", 17, 0);
3836 /* Default filename */
3837 sprintf(tmp, "%s.prf", player_name);
3839 /* Get a filename */
3840 if (!askfor_aux(tmp, 70)) continue;
3842 /* Build the filename */
3843 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3845 /* Append to the file */
3846 if (!open_auto_dump(buf, mark)) continue;
3850 auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3852 auto_dump_printf("\n# Object attr/char definitions\n\n");
3856 for (i = 1; i < max_k_idx; i++)
3859 object_kind *k_ptr = &k_info[i];
3861 /* Skip non-entries */
3862 if (!k_ptr->name) continue;
3864 /* Skip entries with flavor */
3865 if (k_ptr->flavor) continue;
3868 strip_name(o_name, i);
3870 /* Dump a comment */
3871 auto_dump_printf("# %s\n", o_name);
3873 /* Dump the object attr/char info */
3874 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3875 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3883 msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3885 msg_print("Dumped object attr/chars.");
3890 /* Dump feature attr/chars */
3893 static cptr mark = "Feature attr/chars";
3897 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3899 prt("Command: Dump feature attr/chars", 15, 0);
3905 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3907 prt("File: ", 17, 0);
3911 /* Default filename */
3912 sprintf(tmp, "%s.prf", player_name);
3914 /* Get a filename */
3915 if (!askfor_aux(tmp, 70)) continue;
3917 /* Build the filename */
3918 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3920 /* Append to the file */
3921 if (!open_auto_dump(buf, mark)) continue;
3925 auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3927 auto_dump_printf("\n# Feature attr/char definitions\n\n");
3931 for (i = 1; i < max_f_idx; i++)
3933 feature_type *f_ptr = &f_info[i];
3935 /* Skip non-entries */
3936 if (!f_ptr->name) continue;
3938 /* Skip mimiccing features */
3939 if (f_ptr->mimic != i) continue;
3941 /* Dump a comment */
3942 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3944 /* Dump the feature attr/char info */
3945 auto_dump_printf("F:%d:0x%02X/0x%02X\n\n", i,
3946 (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3954 msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3956 msg_print("Dumped feature attr/chars.");
3961 /* Modify monster attr/chars */
3968 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3970 prt("Command: Change monster attr/chars", 15, 0);
3974 /* Hack -- query until done */
3977 monster_race *r_ptr = &r_info[r];
3982 byte da = (r_ptr->d_attr);
3983 byte dc = (r_ptr->d_char);
3984 byte ca = (r_ptr->x_attr);
3985 byte cc = (r_ptr->x_char);
3987 /* Label the object */
3989 Term_putstr(5, 17, -1, TERM_WHITE,
3990 format("¥â¥ó¥¹¥¿¡¼ = %d, ̾Á° = %-40.40s",
3991 r, (r_name + r_ptr->name)));
3993 Term_putstr(5, 17, -1, TERM_WHITE,
3994 format("Monster = %d, Name = %-40.40s",
3995 r, (r_name + r_ptr->name)));
3999 /* Label the Default values */
4001 Term_putstr(10, 19, -1, TERM_WHITE,
4002 format("½é´üÃÍ ¿§ / ʸ»ú = %3u / %3u", da, dc));
4004 Term_putstr(10, 19, -1, TERM_WHITE,
4005 format("Default attr/char = %3u / %3u", da, dc));
4008 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4012 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4014 Term_putch(43, 19, a, c);
4015 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4017 /* Label the Current values */
4019 Term_putstr(10, 20, -1, TERM_WHITE,
4020 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3u / %3u", ca, cc));
4022 Term_putstr(10, 20, -1, TERM_WHITE,
4023 format("Current attr/char = %3u / %3u", ca, cc));
4026 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4030 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4032 Term_putch(43, 20, a, c);
4033 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4038 Term_putstr(0, 22, -1, TERM_WHITE,
4039 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4041 Term_putstr(0, 22, -1, TERM_WHITE,
4042 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4049 if (i == ESCAPE) break;
4051 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4052 else if (isupper(i)) c = 'a' + i - 'A';
4058 cmd_visuals_aux(i, &r, max_r_idx);
4061 t = (int)r_ptr->x_attr;
4062 cmd_visuals_aux(i, &t, 256);
4063 r_ptr->x_attr = (byte)t;
4066 t = (int)r_ptr->x_char;
4067 cmd_visuals_aux(i, &t, 256);
4068 r_ptr->x_char = (byte)t;
4074 /* Modify object attr/chars */
4081 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4083 prt("Command: Change object attr/chars", 15, 0);
4087 /* Hack -- query until done */
4090 object_kind *k_ptr = &k_info[k];
4095 byte da = (byte)k_ptr->d_attr;
4096 byte dc = (byte)k_ptr->d_char;
4097 byte ca = (byte)k_ptr->x_attr;
4098 byte cc = (byte)k_ptr->x_char;
4100 /* Label the object */
4102 Term_putstr(5, 17, -1, TERM_WHITE,
4103 format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s",
4104 k, (k_name + k_ptr->name)));
4106 Term_putstr(5, 17, -1, TERM_WHITE,
4107 format("Object = %d, Name = %-40.40s",
4108 k, (k_name + k_ptr->name)));
4112 /* Label the Default values */
4114 Term_putstr(10, 19, -1, TERM_WHITE,
4115 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4117 Term_putstr(10, 19, -1, TERM_WHITE,
4118 format("Default attr/char = %3d / %3d", da, dc));
4121 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4124 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4126 Term_putch(43, 19, a, c);
4127 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4130 /* Label the Current values */
4132 Term_putstr(10, 20, -1, TERM_WHITE,
4133 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4135 Term_putstr(10, 20, -1, TERM_WHITE,
4136 format("Current attr/char = %3d / %3d", ca, cc));
4139 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4142 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4144 Term_putch(43, 20, a, c);
4145 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4150 Term_putstr(0, 22, -1, TERM_WHITE,
4151 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4153 Term_putstr(0, 22, -1, TERM_WHITE,
4154 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4161 if (i == ESCAPE) break;
4163 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4164 else if (isupper(i)) c = 'a' + i - 'A';
4170 cmd_visuals_aux(i, &k, max_k_idx);
4173 t = (int)k_info[k].x_attr;
4174 cmd_visuals_aux(i, &t, 256);
4175 k_info[k].x_attr = (byte)t;
4178 t = (int)k_info[k].x_char;
4179 cmd_visuals_aux(i, &t, 256);
4180 k_info[k].x_char = (byte)t;
4186 /* Modify feature attr/chars */
4193 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4195 prt("Command: Change feature attr/chars", 15, 0);
4199 /* Hack -- query until done */
4202 feature_type *f_ptr = &f_info[f];
4207 byte da = (byte)f_ptr->d_attr;
4208 byte dc = (byte)f_ptr->d_char;
4209 byte ca = (byte)f_ptr->x_attr;
4210 byte cc = (byte)f_ptr->x_char;
4212 /* Label the object */
4214 Term_putstr(5, 17, -1, TERM_WHITE,
4215 format("ÃÏ·Á = %d, ̾Á° = %-40.40s",
4216 f, (f_name + f_ptr->name)));
4218 Term_putstr(5, 17, -1, TERM_WHITE,
4219 format("Terrain = %d, Name = %-40.40s",
4220 f, (f_name + f_ptr->name)));
4224 /* Label the Default values */
4226 Term_putstr(10, 19, -1, TERM_WHITE,
4227 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4229 Term_putstr(10, 19, -1, TERM_WHITE,
4230 format("Default attr/char = %3d / %3d", da, dc));
4233 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4236 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4238 Term_putch(43, 19, a, c);
4239 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4242 /* Label the Current values */
4244 Term_putstr(10, 20, -1, TERM_WHITE,
4245 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4247 Term_putstr(10, 20, -1, TERM_WHITE,
4248 format("Current attr/char = %3d / %3d", ca, cc));
4251 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4254 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4256 Term_putch(43, 20, a, c);
4257 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4262 Term_putstr(0, 22, -1, TERM_WHITE,
4263 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4265 Term_putstr(0, 22, -1, TERM_WHITE,
4266 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4273 if (i == ESCAPE) break;
4275 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4276 else if (isupper(i)) c = 'a' + i - 'A';
4282 cmd_visuals_aux(i, &f, max_f_idx);
4285 t = (int)f_info[f].x_attr;
4286 cmd_visuals_aux(i, &t, 256);
4287 f_info[f].x_attr = (byte)t;
4290 t = (int)f_info[f].x_char;
4291 cmd_visuals_aux(i, &t, 256);
4292 f_info[f].x_char = (byte)t;
4308 msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4310 msg_print("Visual attr/char tables reset.");
4315 /* Unknown option */
4321 /* Flush messages */
4326 /* Restore the screen */
4332 * Interact with "colors"
4334 void do_cmd_colors(void)
4343 /* File type is "TEXT" */
4344 FILE_TYPE(FILE_TYPE_TEXT);
4347 /* Save the screen */
4351 /* Interact until done */
4357 /* Ask for a choice */
4359 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4361 prt("Interact with Colors", 2, 0);
4365 /* Give some choices */
4367 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4369 prt("(1) Load a user pref file", 4, 5);
4374 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
4375 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4377 prt("(2) Dump colors", 5, 5);
4378 prt("(3) Modify colors", 6, 5);
4385 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4387 prt("Command: ", 8, 0);
4395 if (i == ESCAPE) break;
4397 /* Load a 'pref' file */
4402 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4404 prt("Command: Load a user pref file", 8, 0);
4410 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4412 prt("File: ", 10, 0);
4417 sprintf(tmp, "%s.prf", player_name);
4420 if (!askfor_aux(tmp, 70)) continue;
4422 /* Process the given filename */
4423 (void)process_pref_file(tmp);
4425 /* Mega-Hack -- react to changes */
4426 Term_xtra(TERM_XTRA_REACT, 0);
4428 /* Mega-Hack -- redraw */
4437 static cptr mark = "Colors";
4441 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 8, 0);
4443 prt("Command: Dump colors", 8, 0);
4449 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4451 prt("File: ", 10, 0);
4455 /* Default filename */
4456 sprintf(tmp, "%s.prf", player_name);
4458 /* Get a filename */
4459 if (!askfor_aux(tmp, 70)) continue;
4461 /* Build the filename */
4462 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4464 /* Append to the file */
4465 if (!open_auto_dump(buf, mark)) continue;
4469 auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4471 auto_dump_printf("\n# Color redefinitions\n\n");
4475 for (i = 0; i < 256; i++)
4477 int kv = angband_color_table[i][0];
4478 int rv = angband_color_table[i][1];
4479 int gv = angband_color_table[i][2];
4480 int bv = angband_color_table[i][3];
4485 cptr name = "unknown";
4489 /* Skip non-entries */
4490 if (!kv && !rv && !gv && !bv) continue;
4492 /* Extract the color name */
4493 if (i < 16) name = color_names[i];
4495 /* Dump a comment */
4497 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4499 auto_dump_printf("# Color '%s'\n", name);
4502 /* Dump the monster attr/char info */
4503 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4512 msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
4514 msg_print("Dumped color redefinitions.");
4526 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4528 prt("Command: Modify colors", 8, 0);
4532 /* Hack -- query until done */
4541 /* Exhibit the normal colors */
4542 for (j = 0; j < 16; j++)
4544 /* Exhibit this color */
4545 Term_putstr(j*4, 20, -1, a, "###");
4547 /* Exhibit all colors */
4548 Term_putstr(j*4, 22, -1, j, format("%3d", j));
4551 /* Describe the color */
4553 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4555 name = ((a < 16) ? color_names[a] : "undefined");
4559 /* Describe the color */
4561 Term_putstr(5, 10, -1, TERM_WHITE,
4562 format("¥«¥é¡¼ = %d, ̾Á° = %s", a, name));
4564 Term_putstr(5, 10, -1, TERM_WHITE,
4565 format("Color = %d, Name = %s", a, name));
4569 /* Label the Current values */
4570 Term_putstr(5, 12, -1, TERM_WHITE,
4571 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4572 angband_color_table[a][0],
4573 angband_color_table[a][1],
4574 angband_color_table[a][2],
4575 angband_color_table[a][3]));
4579 Term_putstr(0, 14, -1, TERM_WHITE,
4580 "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4582 Term_putstr(0, 14, -1, TERM_WHITE,
4583 "Command (n/N/k/K/r/R/g/G/b/B): ");
4591 if (i == ESCAPE) break;
4594 if (i == 'n') a = (byte)(a + 1);
4595 if (i == 'N') a = (byte)(a - 1);
4596 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4597 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4598 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4599 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4600 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4601 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4602 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4603 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4605 /* Hack -- react to changes */
4606 Term_xtra(TERM_XTRA_REACT, 0);
4608 /* Hack -- redraw */
4615 /* Unknown option */
4621 /* Flush messages */
4626 /* Restore the screen */
4632 * Note something in the message recall
4634 void do_cmd_note(void)
4643 if (!get_string("¥á¥â: ", buf, 60)) return;
4645 if (!get_string("Note: ", buf, 60)) return;
4649 /* Ignore empty notes */
4650 if (!buf[0] || (buf[0] == ' ')) return;
4652 /* Add the note to the message recall */
4654 msg_format("¥á¥â: %s", buf);
4656 msg_format("Note: %s", buf);
4663 * Mention the current version
4665 void do_cmd_version(void)
4670 msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4671 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4673 msg_format("You are playing Hengband %d.%d.%d.",
4674 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4681 * Array of feeling strings
4683 static cptr do_cmd_feeling_text[11] =
4686 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4688 "Looks like any other level.",
4692 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4694 "You feel there is something special about this level.",
4698 "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4700 "You nearly faint as horrible visions of death fill your mind!",
4704 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4706 "This level looks very dangerous.",
4710 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4712 "You have a very bad feeling...",
4716 "°¤¤Í½´¶¤¬¤¹¤ë...",
4718 "You have a bad feeling...",
4724 "You feel nervous.",
4728 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4730 "You feel your luck is turning...",
4734 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4736 "You don't like the look of this place.",
4740 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4742 "This level looks reasonably safe.",
4746 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4748 "What a boring place..."
4753 static cptr do_cmd_feeling_text_combat[11] =
4756 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4758 "Looks like any other level.",
4762 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4764 "You feel there is something special about this level.",
4768 "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4770 "You nearly faint as horrible visions of death fill your mind!",
4774 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4776 "This level looks very dangerous.",
4780 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4782 "You have a very bad feeling...",
4786 "°¤¤Í½´¶¤¬¤¹¤ë...",
4788 "You have a bad feeling...",
4794 "You feel nervous.",
4798 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4800 "You feel your luck is turning...",
4804 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4806 "You don't like the look of this place.",
4810 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4812 "This level looks reasonably safe.",
4816 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4818 "What a boring place..."
4823 static cptr do_cmd_feeling_text_lucky[11] =
4826 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4827 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4828 "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4829 "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4830 "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4831 "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4832 "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4833 "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤¤¿¤«...",
4834 "¸«¤¿´¶¤¸°¤¯¤Ï¤Ê¤¤...",
4835 "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4836 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4838 "Looks like any other level.",
4839 "You feel there is something special about this level.",
4840 "You have a superb feeling about this level.",
4841 "You have an excellent feeling...",
4842 "You have a very good feeling...",
4843 "You have a good feeling...",
4844 "You feel strangely lucky...",
4845 "You feel your luck is turning...",
4846 "You like the look of this place...",
4847 "This level can't be all bad...",
4848 "What a boring place..."
4854 * Note that "feeling" is set to zero unless some time has passed.
4855 * Note that this is done when the level is GENERATED, not entered.
4857 void do_cmd_feeling(void)
4859 /* Verify the feeling */
4860 if (feeling > 10) feeling = 10;
4862 /* No useful feeling in quests */
4863 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4866 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4868 msg_print("Looks like a typical quest level.");
4874 /* No useful feeling in town */
4875 else if (p_ptr->town_num && !dun_level)
4878 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4880 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4884 msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4886 msg_print("Looks like a strange wilderness.");
4894 msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4896 msg_print("Looks like a typical town.");
4903 /* No useful feeling in the wilderness */
4904 else if (!dun_level)
4907 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4909 msg_print("Looks like a typical wilderness.");
4915 /* Display the feeling */
4916 if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4918 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4920 if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4921 msg_print(do_cmd_feeling_text_combat[feeling]);
4923 msg_print(do_cmd_feeling_text[feeling]);
4928 msg_print(do_cmd_feeling_text[0]);
4935 * Description of each monster group.
4937 static cptr monster_group_text[] =
4940 "¥æ¥Ë¡¼¥¯", /* "Uniques" */
4941 "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
4970 /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4987 /* "¾åµé¥Ç¡¼¥â¥ó", */
5028 /* "Ancient Dragon/Wyrm", */
5037 "Multi-Headed Reptile",
5042 "Reptile/Amphibian",
5043 "Spider/Scorpion/Tick",
5045 /* "Major Demon", */
5061 * Symbols of monsters in each group. Note the "Uniques" group
5062 * is handled differently.
5064 static cptr monster_group_char[] =
5119 "$!?=&`.|/\\~[]()>",
5128 * hook function to sort monsters by level
5130 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5132 u16b *who = (u16b*)(u);
5137 monster_race *r_ptr1 = &r_info[w1];
5138 monster_race *r_ptr2 = &r_info[w2];
5143 if (r_ptr2->level > r_ptr1->level) return TRUE;
5144 if (r_ptr1->level > r_ptr2->level) return FALSE;
5146 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5147 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5152 * Build a list of monster indexes in the given group. Return the number
5153 * of monsters in the group.
5155 * mode & 0x01 : check for non-empty group
5156 * mode & 0x02 : cheat?
5158 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5163 /* Get a list of x_char in this group */
5164 cptr group_char = monster_group_char[grp_cur];
5166 /* XXX Hack -- Check if this is the "Uniques" group */
5167 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5169 /* XXX Hack -- Check if this is the "Riding" group */
5170 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
5172 /* Check every race */
5173 for (i = 0; i < max_r_idx; i++)
5175 /* Access the race */
5176 monster_race *r_ptr = &r_info[i];
5178 /* Skip empty race */
5179 if (!r_ptr->name) continue ;
5181 /* Require known monsters */
5182 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5186 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5189 else if (grp_riding)
5191 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
5196 /* Check for race in the group */
5197 if (!strchr(group_char, r_ptr->d_char)) continue;
5201 mon_idx[mon_cnt++] = i;
5203 /* XXX Hack -- Just checking for non-empty group */
5204 if (mode & 0x01) break;
5207 /* Terminate the list */
5208 mon_idx[mon_cnt] = 0;
5210 /* Select the sort method */
5211 ang_sort_comp = ang_sort_comp_monster_level;
5212 ang_sort_swap = ang_sort_swap_hook;
5214 /* Sort by monster level */
5215 ang_sort(mon_idx, &dummy_why, mon_cnt);
5217 /* Return the number of races */
5223 * Description of each monster group.
5225 static cptr object_group_text[] =
5228 "¥¥Î¥³", /* "Mushrooms" */
5229 "Ìô", /* "Potions" */
5230 "Ìý¤Ä¤Ü", /* "Flasks" */
5231 "´¬Êª", /* "Scrolls" */
5232 "»ØÎØ", /* "Rings" */
5233 "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5234 "ū", /* "Whistle" */
5235 "¸÷¸»", /* "Lanterns" */
5236 "ËâË¡ËÀ", /* "Wands" */
5237 "¾ó", /* "Staffs" */
5238 "¥í¥Ã¥É", /* "Rods" */
5239 "¥«¡¼¥É", /* "Cards" */
5240 "¥¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5249 "Åá·õÎà", /* "Swords" */
5250 "Æß´ï", /* "Blunt Weapons" */
5251 "ĹÊÁÉð´ï", /* "Polearms" */
5252 "ºÎ·¡Æ»¶ñ", /* "Diggers" */
5253 "Èô¤ÓÆ»¶ñ", /* "Bows" */
5257 "·ÚÁõ³»", /* "Soft Armor" */
5258 "½ÅÁõ³»", /* "Hard Armor" */
5259 "¥É¥é¥´¥ó³»", /* "Dragon Armor" */
5260 "½â", /* "Shields" */
5261 "¥¯¥í¡¼¥¯", /* "Cloaks" */
5262 "äƼê", /* "Gloves" */
5263 "¥Ø¥ë¥á¥Ã¥È", /* "Helms" */
5264 "´§", /* "Crowns" */
5265 "¥Ö¡¼¥Ä", /* "Boots" */
5313 * TVALs of items in each group
5315 static byte object_group_tval[] =
5355 TV_LIFE_BOOK, /* Hack -- all spellbooks */
5361 * Build a list of monster indexes in the given group. Return the number
5362 * of monsters in the group.
5364 static int collect_objects(int grp_cur, int object_idx[])
5366 int i, j, k, object_cnt = 0;
5368 /* Get a list of x_char in this group */
5369 byte group_tval = object_group_tval[grp_cur];
5371 /* Check every object */
5372 for (i = 0; i < max_k_idx; i++)
5374 /* Access the race */
5375 object_kind *k_ptr = &k_info[i];
5377 /* Skip empty objects */
5378 if (!k_ptr->name) continue;
5380 /* Skip non-flavoured objects */
5381 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5383 /* Skip items with no distribution (special artifacts) */
5384 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5387 /* Require objects ever seen*/
5388 if (!k_ptr->aware && !p_ptr->wizard) continue;
5390 /* Check for race in the group */
5391 if (TV_LIFE_BOOK == group_tval)
5393 /* Hack -- All spell books */
5394 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5397 object_idx[object_cnt++] = i;
5400 else if (k_ptr->tval == group_tval)
5403 object_idx[object_cnt++] = i;
5407 /* Terminate the list */
5408 object_idx[object_cnt] = 0;
5410 /* Return the number of races */
5416 * Description of each feature group.
5418 static cptr feature_group_text[] =
5426 * Build a list of feature indexes in the given group. Return the number
5427 * of features in the group.
5429 static int collect_features(int grp_cur, int *feat_idx)
5431 int i, feat_cnt = 0;
5433 /* Unused; There is a single group. */
5436 /* Check every feature */
5437 for (i = 1; i < max_f_idx; i++)
5439 /* Access the index */
5440 feature_type *f_ptr = &f_info[i];
5442 /* Skip empty index */
5443 if (!f_ptr->name) continue;
5445 /* Skip mimiccing features */
5446 if (f_ptr->mimic != i) continue;
5449 feat_idx[feat_cnt++] = i;
5452 /* Terminate the list */
5453 feat_idx[feat_cnt] = 0;
5455 /* Return the number of races */
5462 * Build a list of monster indexes in the given group. Return the number
5463 * of monsters in the group.
5465 static int collect_artifacts(int grp_cur, int object_idx[])
5467 int i, object_cnt = 0;
5469 /* Get a list of x_char in this group */
5470 byte group_tval = object_group_tval[grp_cur];
5472 /* Check every object */
5473 for (i = 0; i < max_a_idx; i++)
5475 /* Access the artifact */
5476 artifact_type *a_ptr = &a_info[i];
5478 /* Skip empty artifacts */
5479 if (!a_ptr->name) continue;
5481 /* Skip "uncreated" artifacts */
5482 if (!a_ptr->cur_num) continue;
5484 /* Check for race in the group */
5485 if (a_ptr->tval == group_tval)
5488 object_idx[object_cnt++] = i;
5492 /* Terminate the list */
5493 object_idx[object_cnt] = 0;
5495 /* Return the number of races */
5502 * Encode the screen colors
5504 static char hack[17] = "dwsorgbuDWvyRGBU";
5507 static errr photo_fgets(FILE *fff, char *buf, huge n)
5516 if (fgets(tmp, 1024, fff))
5518 /* Convert weirdness */
5519 for (s = tmp; *s; s++)
5521 /* Handle newline */
5532 else if (*s == '\t')
5534 /* Hack -- require room */
5535 if (i + 8 >= n) break;
5537 /* Append a space */
5540 /* Append some more spaces */
5541 while (!(i % 8)) buf[i++] = ' ';
5545 else if (iskanji(*s))
5552 /* Ⱦ³Ñ¤«¤Ê¤ËÂбþ */
5553 else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf))
5560 /* Handle printables */
5581 * Hack -- load a screen dump from a file
5583 void do_cmd_load_screen(void)
5598 Term_get_size(&wid, &hgt);
5600 /* Build the filename */
5601 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5603 /* Append to the file */
5604 fff = my_fopen(buf, "r");
5609 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5611 msg_format("Failed to open %s.", buf);
5618 /* Save the screen */
5621 /* Clear the screen */
5625 /* Load the screen */
5626 for (y = 0; okay && (y < hgt); y++)
5628 /* Get a line of data */
5629 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5632 for (x = 0; x < wid - 1; x++)
5634 /* Put the attr/char */
5635 Term_draw(x, y, TERM_WHITE, buf[x]);
5639 /* Get the blank line */
5640 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5643 /* Dump the screen */
5644 for (y = 0; okay && (y < hgt); y++)
5646 /* Get a line of data */
5647 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5650 for (x = 0; x < wid - 1; x++)
5652 /* Get the attr/char */
5653 (void)(Term_what(x, y, &a, &c));
5655 /* Look up the attr */
5656 for (i = 0; i < 16; i++)
5658 /* Use attr matches */
5659 if (hack[i] == buf[x]) a = i;
5662 /* Put the attr/char */
5663 Term_draw(x, y, a, c);
5668 /* Get the blank line */
5669 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5678 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5680 msg_print("Screen dump loaded.");
5687 /* Restore the screen */
5694 cptr inven_res_label =
5696 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5698 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5703 #define IM_FLAG_STR "¡ö"
5704 #define HAS_FLAG_STR "¡Ü"
5705 #define NO_FLAG_STR "¡¦"
5707 #define IM_FLAG_STR "* "
5708 #define HAS_FLAG_STR "+ "
5709 #define NO_FLAG_STR ". "
5712 #define print_im_or_res_flag(IM, RES) \
5714 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5715 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5718 #define print_flag(TR) \
5720 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5724 /* XTRA HACK RESLIST */
5725 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5727 char o_name[MAX_NLEN];
5728 u32b flgs[TR_FLAG_SIZE];
5730 if (!o_ptr->k_idx) return;
5731 if (o_ptr->tval != tval) return;
5733 /* Identified items only */
5734 if (!object_known_p(o_ptr)) return;
5737 * HACK:Ring of Lordly protection and Dragon equipment
5738 * have random resistances.
5740 if (((TV_EQUIP_BEGIN <= tval) && (tval <= TV_EQUIP_END) && o_ptr->name2)
5741 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5742 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5743 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5744 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5745 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5746 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5747 || o_ptr->art_name || o_ptr->name1)
5750 object_desc(o_name, o_ptr, TRUE, 0);
5752 while (o_name[i] && (i < 26))
5755 if (iskanji(o_name[i])) i++;
5764 o_name[i] = ' '; i++;
5769 fprintf(fff, "%s %s", where, o_name);
5771 if (!(o_ptr->ident & (IDENT_MENTAL)))
5774 fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5776 fputs("-------unknown------------ -------unknown------\n", fff);
5781 object_flags_known(o_ptr, flgs);
5783 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5784 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5785 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5786 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5787 print_flag(TR_RES_POIS);
5788 print_flag(TR_RES_LITE);
5789 print_flag(TR_RES_DARK);
5790 print_flag(TR_RES_SHARDS);
5791 print_flag(TR_RES_SOUND);
5792 print_flag(TR_RES_NETHER);
5793 print_flag(TR_RES_NEXUS);
5794 print_flag(TR_RES_CHAOS);
5795 print_flag(TR_RES_DISEN);
5799 print_flag(TR_RES_BLIND);
5800 print_flag(TR_RES_FEAR);
5801 print_flag(TR_RES_CONF);
5802 print_flag(TR_FREE_ACT);
5803 print_flag(TR_SEE_INVIS);
5804 print_flag(TR_HOLD_LIFE);
5805 print_flag(TR_TELEPATHY);
5806 print_flag(TR_SLOW_DIGEST);
5807 print_flag(TR_REGEN);
5808 print_flag(TR_FEATHER);
5816 fprintf(fff, "%s\n", inven_res_label);
5822 * Display *ID* ed weapons/armors's resistances
5824 static void do_cmd_knowledge_inven(void)
5828 char file_name[1024];
5838 /* Open a new file */
5839 fff = my_fopen_temp(file_name, 1024);
5843 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5845 msg_format("Failed to create temporary file %s.", file_name);
5850 fprintf(fff, "%s\n", inven_res_label);
5852 for (tval = TV_EQUIP_BEGIN; tval <= TV_EQUIP_END; tval++)
5856 for (; j < 9; j++) fputc('\n', fff);
5858 fprintf(fff, "%s\n", inven_res_label);
5862 strcpy(where, "Áõ");
5864 strcpy(where, "E ");
5866 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5868 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5872 strcpy(where, "»ý");
5874 strcpy(where, "I ");
5876 for (i = 0; i < INVEN_PACK; i++)
5878 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5881 st_ptr = &town[1].store[STORE_HOME];
5883 strcpy(where, "²È");
5885 strcpy(where, "H ");
5888 for (i = 0; i < st_ptr->stock_num; i++)
5890 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5894 /* Close the file */
5897 /* Display the file contents */
5899 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5901 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5904 /* Remove the file */
5909 void do_cmd_save_screen_html_aux(char *filename, int message)
5913 byte a = 0, old_a = 0;
5927 cptr html_head[] = {
5928 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5932 cptr html_foot[] = {
5934 "</body>\n</html>\n",
5940 Term_get_size(&wid, &hgt);
5942 /* File type is "TEXT" */
5943 FILE_TYPE(FILE_TYPE_TEXT);
5945 /* Append to the file */
5946 fff = my_fopen(filename, "w");
5952 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5954 msg_format("Failed to open file %s.", filename);
5962 /* Save the screen */
5966 /* Build the filename */
5967 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5968 tmpfff = my_fopen(buf, "r");
5970 for (i = 0; html_head[i]; i++)
5971 fprintf(fff, html_head[i]);
5975 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5977 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5981 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5983 fprintf(fff, "%s\n", buf);
5988 /* Dump the screen */
5989 for (y = 0; y < hgt; y++)
5996 for (x = 0; x < wid - 1; x++)
6000 /* Get the attr/char */
6001 (void)(Term_what(x, y, &a, &c));
6005 case '&': cc = "&"; break;
6006 case '<': cc = "<"; break;
6007 case '>': cc = ">"; break;
6009 case 0x1f: c = '.'; break;
6010 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
6015 if ((y == 0 && x == 0) || a != old_a) {
6016 rv = angband_color_table[a][1];
6017 gv = angband_color_table[a][2];
6018 bv = angband_color_table[a][3];
6019 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
6020 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
6024 fprintf(fff, "%s", cc);
6026 fprintf(fff, "%c", c);
6029 fprintf(fff, "</font>");
6032 for (i = 0; html_foot[i]; i++)
6033 fprintf(fff, html_foot[i]);
6038 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
6040 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
6044 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
6046 fprintf(fff, "%s\n", buf);
6061 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6063 msg_print("Screen dump saved.");
6068 /* Restore the screen */
6074 * Hack -- save a screen dump to a file
6076 static void do_cmd_save_screen_html(void)
6078 char buf[1024], tmp[256] = "screen.html";
6081 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
6083 if (!get_string("File name: ", tmp, 80))
6087 /* Build the filename */
6088 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
6092 do_cmd_save_screen_html_aux(buf, 1);
6097 * Redefinable "save_screen" action
6099 void (*screendump_aux)(void) = NULL;
6103 * Hack -- save a screen dump to a file
6105 void do_cmd_save_screen(void)
6107 bool old_use_graphics = use_graphics;
6108 bool html_dump = FALSE;
6113 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6115 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6120 if (c == 'Y' || c == 'y')
6122 else if (c == 'H' || c == 'h')
6134 Term_get_size(&wid, &hgt);
6136 if (old_use_graphics)
6138 use_graphics = FALSE;
6141 /* Redraw everything */
6142 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6144 /* Hack -- update */
6150 do_cmd_save_screen_html();
6154 /* Do we use a special screendump function ? */
6155 else if (screendump_aux)
6157 /* Dump the screen to a graphics file */
6158 (*screendump_aux)();
6160 else /* Dump the screen as text */
6171 /* Build the filename */
6172 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6174 /* File type is "TEXT" */
6175 FILE_TYPE(FILE_TYPE_TEXT);
6177 /* Append to the file */
6178 fff = my_fopen(buf, "w");
6184 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6186 msg_format("Failed to open file %s.", buf);
6193 /* Save the screen */
6197 /* Dump the screen */
6198 for (y = 0; y < hgt; y++)
6201 for (x = 0; x < wid - 1; x++)
6203 /* Get the attr/char */
6204 (void)(Term_what(x, y, &a, &c));
6214 fprintf(fff, "%s\n", buf);
6221 /* Dump the screen */
6222 for (y = 0; y < hgt; y++)
6225 for (x = 0; x < wid - 1; x++)
6227 /* Get the attr/char */
6228 (void)(Term_what(x, y, &a, &c));
6231 buf[x] = hack[a&0x0F];
6238 fprintf(fff, "%s\n", buf);
6250 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6252 msg_print("Screen dump saved.");
6258 /* Restore the screen */
6262 if (old_use_graphics)
6264 use_graphics = TRUE;
6267 /* Redraw everything */
6268 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6270 /* Hack -- update */
6277 * Sorting hook -- Comp function -- see below
6279 * We use "u" to point to array of monster indexes,
6280 * and "v" to select the type of sorting to perform on "u".
6282 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6284 u16b *who = (u16b*)(u);
6286 u16b *why = (u16b*)(v);
6293 /* Sort by total kills */
6296 /* Extract total kills */
6297 z1 = a_info[w1].tval;
6298 z2 = a_info[w2].tval;
6300 /* Compare total kills */
6301 if (z1 < z2) return (TRUE);
6302 if (z1 > z2) return (FALSE);
6306 /* Sort by monster level */
6309 /* Extract levels */
6310 z1 = a_info[w1].sval;
6311 z2 = a_info[w2].sval;
6313 /* Compare levels */
6314 if (z1 < z2) return (TRUE);
6315 if (z1 > z2) return (FALSE);
6319 /* Sort by monster experience */
6322 /* Extract experience */
6323 z1 = a_info[w1].level;
6324 z2 = a_info[w2].level;
6326 /* Compare experience */
6327 if (z1 < z2) return (TRUE);
6328 if (z1 > z2) return (FALSE);
6332 /* Compare indexes */
6338 * Sorting hook -- Swap function -- see below
6340 * We use "u" to point to array of monster indexes,
6341 * and "v" to select the type of sorting to perform.
6343 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6345 u16b *who = (u16b*)(u);
6360 * Check the status of "artifacts"
6362 static void do_cmd_knowledge_artifacts(void)
6364 int i, k, z, x, y, n = 0;
6370 char file_name[1024];
6372 char base_name[MAX_NLEN];
6376 /* Open a new file */
6377 fff = my_fopen_temp(file_name, 1024);
6381 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6383 msg_format("Failed to create temporary file %s.", file_name);
6389 /* Allocate the "who" array */
6390 C_MAKE(who, max_a_idx, s16b);
6392 /* Allocate the "okay" array */
6393 C_MAKE(okay, max_a_idx, bool);
6395 /* Scan the artifacts */
6396 for (k = 0; k < max_a_idx; k++)
6398 artifact_type *a_ptr = &a_info[k];
6403 /* Skip "empty" artifacts */
6404 if (!a_ptr->name) continue;
6406 /* Skip "uncreated" artifacts */
6407 if (!a_ptr->cur_num) continue;
6413 /* Check the dungeon */
6414 for (y = 0; y < cur_hgt; y++)
6416 for (x = 0; x < cur_wid; x++)
6418 cave_type *c_ptr = &cave[y][x];
6420 s16b this_o_idx, next_o_idx = 0;
6422 /* Scan all objects in the grid */
6423 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6427 /* Acquire object */
6428 o_ptr = &o_list[this_o_idx];
6430 /* Acquire next object */
6431 next_o_idx = o_ptr->next_o_idx;
6433 /* Ignore non-artifacts */
6434 if (!artifact_p(o_ptr)) continue;
6436 /* Ignore known items */
6437 if (object_known_p(o_ptr)) continue;
6439 /* Note the artifact */
6440 okay[o_ptr->name1] = FALSE;
6445 /* Check the inventory and equipment */
6446 for (i = 0; i < INVEN_TOTAL; i++)
6448 object_type *o_ptr = &inventory[i];
6450 /* Ignore non-objects */
6451 if (!o_ptr->k_idx) continue;
6453 /* Ignore non-artifacts */
6454 if (!artifact_p(o_ptr)) continue;
6456 /* Ignore known items */
6457 if (object_known_p(o_ptr)) continue;
6459 /* Note the artifact */
6460 okay[o_ptr->name1] = FALSE;
6463 for (k = 0; k < max_a_idx; k++)
6465 if (okay[k]) who[n++] = k;
6468 /* Select the sort method */
6469 ang_sort_comp = ang_sort_art_comp;
6470 ang_sort_swap = ang_sort_art_swap;
6472 /* Sort the array by dungeon depth of monsters */
6473 ang_sort(who, &why, n);
6475 /* Scan the artifacts */
6476 for (k = 0; k < n; k++)
6478 artifact_type *a_ptr = &a_info[who[k]];
6482 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6484 strcpy(base_name, "Unknown Artifact");
6488 /* Obtain the base object type */
6489 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6497 /* Get local object */
6500 /* Create fake object */
6501 object_prep(q_ptr, z);
6503 /* Make it an artifact */
6504 q_ptr->name1 = (byte)who[k];
6506 /* Describe the artifact */
6507 object_desc_store(base_name, q_ptr, FALSE, 0);
6510 /* Hack -- Build the artifact name */
6512 fprintf(fff, " %s\n", base_name);
6514 fprintf(fff, " The %s\n", base_name);
6519 /* Free the "who" array */
6520 C_KILL(who, max_a_idx, s16b);
6522 /* Free the "okay" array */
6523 C_KILL(okay, max_a_idx, bool);
6525 /* Close the file */
6528 /* Display the file contents */
6530 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6532 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6536 /* Remove the file */
6542 * Display known uniques
6544 static void do_cmd_knowledge_uniques(void)
6552 char file_name[1024];
6554 /* Open a new file */
6555 fff = my_fopen_temp(file_name, 1024);
6559 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6561 msg_format("Failed to create temporary file %s.", file_name);
6567 /* Allocate the "who" array */
6568 C_MAKE(who, max_r_idx, s16b);
6570 /* Scan the monsters */
6571 for (i = 1; i < max_r_idx; i++)
6573 monster_race *r_ptr = &r_info[i];
6575 /* Use that monster */
6576 if (r_ptr->name) who[n++] = i;
6579 /* Select the sort method */
6580 ang_sort_comp = ang_sort_comp_hook;
6581 ang_sort_swap = ang_sort_swap_hook;
6583 /* Sort the array by dungeon depth of monsters */
6584 ang_sort(who, &why, n);
6586 /* Scan the monster races */
6587 for (k = 0; k < n; k++)
6589 monster_race *r_ptr = &r_info[who[k]];
6591 /* Only print Uniques */
6592 if (r_ptr->flags1 & (RF1_UNIQUE))
6594 bool dead = (r_ptr->max_num == 0);
6598 /* Only display "known" uniques */
6599 if (dead || cheat_know || r_ptr->r_sights)
6601 /* Print a message */
6603 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6604 (r_name + r_ptr->name));
6606 fprintf(fff, " %s is alive\n",
6607 (r_name + r_ptr->name));
6614 /* Free the "who" array */
6615 C_KILL(who, max_r_idx, s16b);
6617 /* Close the file */
6620 /* Display the file contents */
6622 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6624 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6628 /* Remove the file */
6634 * Display weapon-exp
6636 static void do_cmd_knowledge_weapon_exp(void)
6638 int i, j, num, weapon_exp;
6642 char file_name[1024];
6645 /* Open a new file */
6646 fff = my_fopen_temp(file_name, 1024);
6649 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6651 msg_format("Failed to create temporary file %s.", file_name);
6657 for (i = 0; i < 5; i++)
6659 for (num = 0; num < 64; num++)
6661 for (j = 0; j < max_k_idx; j++)
6663 object_kind *k_ptr = &k_info[j];
6665 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6667 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6669 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6671 fprintf(fff, "%-25s ", tmp);
6672 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6673 else fprintf(fff, " ");
6674 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6675 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6683 /* Close the file */
6686 /* Display the file contents */
6688 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6690 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6694 /* Remove the file */
6702 static void do_cmd_knowledge_spell_exp(void)
6704 int i = 0, spell_exp, exp_level;
6709 char file_name[1024];
6711 /* Open a new file */
6712 fff = my_fopen_temp(file_name, 1024);
6715 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6717 msg_format("Failed to create temporary file %s.", file_name);
6723 if (p_ptr->realm1 != REALM_NONE)
6726 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6728 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6730 for (i = 0; i < 32; i++)
6732 if (!is_magic(p_ptr->realm1))
6734 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6738 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6740 if (s_ptr->slevel >= 99) continue;
6741 spell_exp = p_ptr->spell_exp[i];
6742 exp_level = spell_exp_level(spell_exp);
6743 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6744 if (p_ptr->realm1 == REALM_HISSATSU)
6745 fprintf(fff, "[--]");
6748 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6749 else fprintf(fff, " ");
6750 fprintf(fff, "%s", exp_level_str[exp_level]);
6752 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6757 if (p_ptr->realm2 != REALM_NONE)
6760 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6762 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6764 for (i = 0; i < 32; i++)
6766 if (!is_magic(p_ptr->realm1))
6768 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6772 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6774 if (s_ptr->slevel >= 99) continue;
6776 spell_exp = p_ptr->spell_exp[i + 32];
6777 exp_level = spell_exp_level(spell_exp);
6778 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6779 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6780 else fprintf(fff, " ");
6781 fprintf(fff, "%s", exp_level_str[exp_level]);
6782 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6787 /* Close the file */
6790 /* Display the file contents */
6792 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6794 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6798 /* Remove the file */
6806 static void do_cmd_knowledge_skill_exp(void)
6808 int i = 0, skill_exp;
6812 char file_name[1024];
6814 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6816 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6819 /* Open a new file */
6820 fff = my_fopen_temp(file_name, 1024);
6823 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6825 msg_format("Failed to create temporary file %s.", file_name);
6831 for (i = 0; i < 3; i++)
6833 skill_exp = p_ptr->skill_exp[i];
6834 fprintf(fff, "%-20s ", skill_name[i]);
6835 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6836 else fprintf(fff, " ");
6837 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6838 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6842 /* Close the file */
6845 /* Display the file contents */
6847 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6849 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6853 /* Remove the file */
6859 * Pluralize a monster name
6861 void plural_aux(char *Name)
6863 int NameLen = strlen(Name);
6865 if (strstr(Name, "Disembodied hand"))
6867 strcpy(Name, "Disembodied hands that strangled people");
6869 else if (strstr(Name, "Colour out of space"))
6871 strcpy(Name, "Colours out of space");
6873 else if (strstr(Name, "stairway to hell"))
6875 strcpy(Name, "stairways to hell");
6877 else if (strstr(Name, "Dweller on the threshold"))
6879 strcpy(Name, "Dwellers on the threshold");
6881 else if (strstr(Name, " of "))
6883 cptr aider = strstr(Name, " of ");
6894 if (dummy[i-1] == 's')
6896 strcpy(&(dummy[i]), "es");
6901 strcpy(&(dummy[i]), "s");
6904 strcpy(&(dummy[i+1]), aider);
6905 strcpy(Name, dummy);
6907 else if (strstr(Name, "coins"))
6910 strcpy(dummy, "piles of ");
6911 strcat(dummy, Name);
6912 strcpy(Name, dummy);
6915 else if (strstr(Name, "Manes"))
6919 else if (streq(&(Name[NameLen - 2]), "ey"))
6921 strcpy(&(Name[NameLen - 2]), "eys");
6923 else if (Name[NameLen - 1] == 'y')
6925 strcpy(&(Name[NameLen - 1]), "ies");
6927 else if (streq(&(Name[NameLen - 4]), "ouse"))
6929 strcpy(&(Name[NameLen - 4]), "ice");
6931 else if (streq(&(Name[NameLen - 2]), "us"))
6933 strcpy(&(Name[NameLen - 2]), "i");
6935 else if (streq(&(Name[NameLen - 6]), "kelman"))
6937 strcpy(&(Name[NameLen - 6]), "kelmen");
6939 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6941 strcpy(&(Name[NameLen - 8]), "wordsmen");
6943 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6945 strcpy(&(Name[NameLen - 7]), "oodsmen");
6947 else if (streq(&(Name[NameLen - 7]), "eastman"))
6949 strcpy(&(Name[NameLen - 7]), "eastmen");
6951 else if (streq(&(Name[NameLen - 8]), "izardman"))
6953 strcpy(&(Name[NameLen - 8]), "izardmen");
6955 else if (streq(&(Name[NameLen - 5]), "geist"))
6957 strcpy(&(Name[NameLen - 5]), "geister");
6959 else if (streq(&(Name[NameLen - 2]), "ex"))
6961 strcpy(&(Name[NameLen - 2]), "ices");
6963 else if (streq(&(Name[NameLen - 2]), "lf"))
6965 strcpy(&(Name[NameLen - 2]), "lves");
6967 else if (suffix(Name, "ch") ||
6968 suffix(Name, "sh") ||
6969 suffix(Name, "nx") ||
6970 suffix(Name, "s") ||
6973 strcpy(&(Name[NameLen]), "es");
6977 strcpy(&(Name[NameLen]), "s");
6982 * Display current pets
6984 static void do_cmd_knowledge_pets(void)
6988 monster_type *m_ptr;
6991 int show_upkeep = 0;
6992 char file_name[1024];
6995 /* Open a new file */
6996 fff = my_fopen_temp(file_name, 1024);
6999 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7001 msg_format("Failed to create temporary file %s.", file_name);
7007 /* Process the monsters (backwards) */
7008 for (i = m_max - 1; i >= 1; i--)
7010 /* Access the monster */
7013 /* Ignore "dead" monsters */
7014 if (!m_ptr->r_idx) continue;
7016 /* Calculate "upkeep" for pets */
7020 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
7021 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
7025 show_upkeep = calculate_upkeep();
7027 fprintf(fff, "----------------------------------------------\n");
7029 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
7030 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
7032 fprintf(fff, " Total: %d pet%s.\n",
7033 t_friends, (t_friends == 1 ? "" : "s"));
7034 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
7039 /* Close the file */
7042 /* Display the file contents */
7044 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
7046 show_file(TRUE, file_name, "Current Pets", 0, 0);
7050 /* Remove the file */
7058 * Note that the player ghosts are ignored. XXX XXX XXX
7060 static void do_cmd_knowledge_kill_count(void)
7068 char file_name[1024];
7073 /* Open a new file */
7074 fff = my_fopen_temp(file_name, 1024);
7078 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7080 msg_format("Failed to create temporary file %s.", file_name);
7086 /* Allocate the "who" array */
7087 C_MAKE(who, max_r_idx, s16b);
7090 /* Monsters slain */
7093 for (kk = 1; kk < max_r_idx; kk++)
7095 monster_race *r_ptr = &r_info[kk];
7097 if (r_ptr->flags1 & (RF1_UNIQUE))
7099 bool dead = (r_ptr->max_num == 0);
7108 s16b This = r_ptr->r_pkills;
7119 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7121 fprintf(fff,"You have defeated no enemies yet.\n\n");
7124 else if (Total == 1)
7126 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7128 fprintf(fff,"You have defeated one enemy.\n\n");
7133 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7135 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7142 /* Scan the monsters */
7143 for (i = 1; i < max_r_idx; i++)
7145 monster_race *r_ptr = &r_info[i];
7147 /* Use that monster */
7148 if (r_ptr->name) who[n++] = i;
7151 /* Select the sort method */
7152 ang_sort_comp = ang_sort_comp_hook;
7153 ang_sort_swap = ang_sort_swap_hook;
7155 /* Sort the array by dungeon depth of monsters */
7156 ang_sort(who, &why, n);
7158 /* Scan the monster races */
7159 for (k = 0; k < n; k++)
7161 monster_race *r_ptr = &r_info[who[k]];
7163 if (r_ptr->flags1 & (RF1_UNIQUE))
7165 bool dead = (r_ptr->max_num == 0);
7169 /* Print a message */
7170 fprintf(fff, " %s\n",
7171 (r_name + r_ptr->name));
7177 s16b This = r_ptr->r_pkills;
7182 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7183 if(strchr("pt",r_ptr->d_char))
7184 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7186 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7190 if (strstr(r_name + r_ptr->name, "coins"))
7192 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7196 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7202 strcpy(ToPlural, (r_name + r_ptr->name));
7203 plural_aux(ToPlural);
7204 fprintf(fff, " %d %s\n", This, ToPlural);
7214 fprintf(fff,"----------------------------------------------\n");
7216 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7218 fprintf(fff," Total: %lu creature%s killed.\n",
7219 Total, (Total == 1 ? "" : "s"));
7223 /* Free the "who" array */
7224 C_KILL(who, max_r_idx, s16b);
7226 /* Close the file */
7229 /* Display the file contents */
7231 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7233 show_file(TRUE, file_name, "Kill Count", 0, 0);
7237 /* Remove the file */
7243 * Display the object groups.
7245 static void display_group_list(int col, int row, int wid, int per_page,
7246 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7250 /* Display lines until done */
7251 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7253 /* Get the group index */
7254 int grp = grp_idx[grp_top + i];
7256 /* Choose a color */
7257 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7259 /* Erase the entire line */
7260 Term_erase(col, row + i, wid);
7262 /* Display the group label */
7263 c_put_str(attr, group_text[grp], row + i, col);
7269 * Move the cursor in a browser window
7271 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7272 int *list_cur, int list_cnt)
7277 int list = *list_cur;
7279 /* Extract direction */
7282 /* Hack -- scroll up full screen */
7287 /* Hack -- scroll down full screen */
7292 d = get_keymap_dir(ch);
7297 /* Diagonals - hack */
7298 if ((ddx[d] > 0) && ddy[d])
7304 Term_get_size(&wid, &hgt);
7306 browser_rows = hgt - 8;
7308 /* Browse group list */
7313 /* Move up or down */
7314 grp += ddy[d] * (browser_rows - 1);
7317 if (grp >= grp_cnt) grp = grp_cnt - 1;
7318 if (grp < 0) grp = 0;
7319 if (grp != old_grp) list = 0;
7322 /* Browse sub-list list */
7325 /* Move up or down */
7326 list += ddy[d] * browser_rows;
7329 if (list >= list_cnt) list = list_cnt - 1;
7330 if (list < 0) list = 0;
7342 if (col < 0) col = 0;
7343 if (col > 1) col = 1;
7350 /* Browse group list */
7355 /* Move up or down */
7359 if (grp >= grp_cnt) grp = grp_cnt - 1;
7360 if (grp < 0) grp = 0;
7361 if (grp != old_grp) list = 0;
7364 /* Browse sub-list list */
7367 /* Move up or down */
7371 if (list >= list_cnt) list = list_cnt - 1;
7372 if (list < 0) list = 0;
7383 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7387 /* Clear the display lines */
7388 for (i = 0; i < height; i++)
7390 Term_erase(col, row + i, width);
7393 /* Bigtile mode uses double width */
7394 if (use_bigtile) width /= 2;
7396 /* Display lines until done */
7397 for (i = 0; i < height; i++)
7399 /* Display columns until done */
7400 for (j = 0; j < width; j++)
7408 /* Bigtile mode uses double width */
7409 if (use_bigtile) x += j;
7414 /* Ignore illegal characters */
7415 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7416 (!use_graphics && ic > 0x7f))
7422 /* Force correct code for both ASCII character and tile */
7423 if (c & 0x80) a |= 0x80;
7425 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7427 /* Display symbol */
7428 Term_putch(x, y, a, c);
7431 if (use_bigtile) Term_putch(x + 1, y, a2, c2);
7438 * Place the cursor at the collect position for visual mode
7440 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7442 int i = (a & 0x7f) - attr_top;
7443 int j = c - char_left;
7448 /* Bigtile mode uses double width */
7449 if (use_bigtile) x += j;
7451 /* Place the cursor */
7457 * Clipboard variables for copy&paste in visual mode
7459 static byte attr_idx = 0;
7460 static byte char_idx = 0;
7463 * Do visual mode command -- Change symbols
7465 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7466 int height, int width,
7467 byte *attr_top_ptr, byte *char_left_ptr,
7468 byte *cur_attr_ptr, byte *cur_char_ptr)
7470 static byte attr_old = 0, char_old = 0;
7475 if (*visual_list_ptr)
7478 *cur_attr_ptr = attr_old;
7479 *cur_char_ptr = char_old;
7480 *visual_list_ptr = FALSE;
7489 if (*visual_list_ptr)
7492 *visual_list_ptr = FALSE;
7500 if (!*visual_list_ptr)
7502 *visual_list_ptr = TRUE;
7504 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7505 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7507 attr_old = *cur_attr_ptr;
7508 char_old = *cur_char_ptr;
7516 /* Set the visual */
7517 attr_idx = *cur_attr_ptr;
7518 char_idx = *cur_char_ptr;
7527 *cur_attr_ptr = attr_idx;
7528 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7534 *cur_char_ptr = char_idx;
7535 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7541 if (*visual_list_ptr)
7544 int d = get_keymap_dir(ch);
7545 byte a = (*cur_attr_ptr & 0x7f);
7546 byte c = *cur_char_ptr;
7548 if (use_bigtile) eff_width = width / 2;
7549 else eff_width = width;
7551 /* Restrict direction */
7552 if ((a == 0) && (ddy[d] < 0)) d = 0;
7553 if ((c == 0) && (ddx[d] < 0)) d = 0;
7554 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7555 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7560 /* Force correct code for both ASCII character and tile */
7561 if (c & 0x80) a |= 0x80;
7563 /* Set the visual */
7568 /* Move the frame */
7569 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7570 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7571 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7572 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7579 /* Visual mode command is not used */
7585 * Display the monsters in a group.
7587 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7588 int mon_cur, int mon_top)
7592 /* Display lines until done */
7593 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7599 /* Get the race index */
7600 int r_idx = mon_idx[mon_top + i] ;
7602 /* Access the race */
7603 monster_race *r_ptr = &r_info[r_idx];
7606 /* Choose a color */
7607 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7609 /* Display the name */
7610 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7612 /* Hack -- visual_list mode */
7615 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7617 else if (p_ptr->wizard)
7619 c_prt(attr, format("%d", r_idx), row + i, 60);
7624 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7626 /* Display symbol */
7627 Term_putch(70, row + i, a, c);
7630 if (use_bigtile) Term_putch(70 + 1, row + i, a2, c2);
7633 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7635 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7637 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7642 /* Clear remaining lines */
7643 for (; i < per_page; i++)
7645 Term_erase(col, row + i, 255);
7651 * Display known monsters.
7653 static void do_cmd_knowledge_monsters(void)
7656 int grp_cur, grp_top, old_grp_cur;
7657 int mon_cur, mon_top;
7658 int grp_cnt, grp_idx[100];
7666 bool visual_list = FALSE;
7667 byte attr_top = 0, char_left = 0;
7673 Term_get_size(&wid, &hgt);
7675 browser_rows = hgt - 8;
7677 /* Allocate the "mon_idx" array */
7678 C_MAKE(mon_idx, max_r_idx, s16b);
7683 /* Check every group */
7684 for (i = 0; monster_group_text[i] != NULL; i++)
7686 /* Measure the label */
7687 len = strlen(monster_group_text[i]);
7689 /* Save the maximum length */
7690 if (len > max) max = len;
7692 /* See if any monsters are known */
7693 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7695 /* Build a list of groups with known monsters */
7696 grp_idx[grp_cnt++] = i;
7700 /* Terminate the list */
7701 grp_idx[grp_cnt] = -1;
7704 grp_cur = grp_top = 0;
7705 mon_cur = mon_top = 0;
7714 monster_race *r_ptr;
7721 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7722 prt("¥°¥ë¡¼¥×", 4, 0);
7723 prt("̾Á°", 4, max + 3);
7724 if (p_ptr->wizard) prt("Idx", 4, 60);
7725 prt("ʸ»ú »¦³²¿ô", 4, 67);
7727 prt("Knowledge - Monsters", 2, 0);
7729 prt("Name", 4, max + 3);
7730 if (p_ptr->wizard) prt("Idx", 4, 60);
7731 prt("Sym Kills", 4, 67);
7734 for (i = 0; i < 78; i++)
7736 Term_putch(i, 5, TERM_WHITE, '=');
7739 for (i = 0; i < browser_rows; i++)
7741 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7747 /* Scroll group list */
7748 if (grp_cur < grp_top) grp_top = grp_cur;
7749 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7751 /* Display a list of monster groups */
7752 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7754 if (old_grp_cur != grp_cur)
7756 old_grp_cur = grp_cur;
7758 /* Get a list of monsters in the current group */
7759 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7762 /* Scroll monster list */
7763 while (mon_cur < mon_top)
7764 mon_top = MAX(0, mon_top - browser_rows/2);
7765 while (mon_cur >= mon_top + browser_rows)
7766 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7770 /* Display a list of monsters in the current group */
7771 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7777 /* Display a monster name */
7778 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7780 /* Display visual list below first monster */
7781 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7786 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7788 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);
7791 /* Get the current monster */
7792 r_ptr = &r_info[mon_idx[mon_cur]];
7794 /* Mega Hack -- track this monster race */
7795 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7797 /* Hack -- handle stuff */
7802 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7806 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7810 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7815 /* Do visual mode command if needed */
7816 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)) continue;
7829 /* Recall on screen */
7830 if (mon_idx[mon_cur])
7832 screen_roff(mon_idx[mon_cur], 0);
7843 /* Move the cursor */
7844 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7851 /* Free the "mon_idx" array */
7852 C_KILL(mon_idx, max_r_idx, s16b);
7857 * Display the objects in a group.
7859 static void display_object_list(int col, int row, int per_page, int object_idx[],
7860 int object_cur, int object_top)
7864 /* Display lines until done */
7865 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7871 /* Get the object index */
7872 int k_idx = object_idx[object_top + i];
7874 /* Access the object */
7875 object_kind *k_ptr = &k_info[k_idx];
7877 /* Choose a color */
7878 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7879 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7881 attr = ((i + object_top == object_cur) ? cursor : attr);
7884 strip_name(o_name, k_idx);
7886 /* Display the name */
7887 c_prt(attr, o_name, row + i, col);
7889 /* Hack -- visual_list mode */
7892 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7894 else if (p_ptr->wizard)
7896 c_prt(attr, format ("%d", k_idx), row + i, 70);
7899 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7900 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7902 /* Symbol is unknown */
7903 if (!k_ptr->aware && !p_ptr->wizard)
7909 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7911 /* Display symbol */
7912 Term_putch(76, row + i, a, c);
7915 if (use_bigtile) Term_putch(76 + 1, row + i, a2, c2);
7918 /* Clear remaining lines */
7919 for (; i < per_page; i++)
7921 Term_erase(col, row + i, 255);
7926 * Describe fake object
7928 static void desc_obj_fake(int k_idx)
7931 object_type object_type_body;
7933 /* Get local object */
7934 o_ptr = &object_type_body;
7936 /* Wipe the object */
7939 /* Create the artifact */
7940 object_prep(o_ptr, k_idx);
7942 /* It's fully know */
7943 o_ptr->ident |= IDENT_KNOWN;
7945 /* Track the object */
7946 /* object_actual_track(o_ptr); */
7948 /* Hack - mark as fake */
7949 /* term_obj_real = FALSE; */
7951 /* Hack -- Handle stuff */
7954 if (!screen_object(o_ptr, FALSE))
7957 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7959 msg_print("You see nothing special.");
7968 * Display known objects
7970 static void do_cmd_knowledge_objects(void)
7973 int grp_cur, grp_top, old_grp_cur;
7974 int object_old, object_cur, object_top;
7975 int grp_cnt, grp_idx[100];
7983 bool visual_list = FALSE;
7984 byte attr_top = 0, char_left = 0;
7990 Term_get_size(&wid, &hgt);
7992 browser_rows = hgt - 8;
7994 /* Allocate the "object_idx" array */
7995 C_MAKE(object_idx, max_k_idx, int);
8000 /* Check every group */
8001 for (i = 0; object_group_text[i] != NULL; i++)
8003 /* Measure the label */
8004 len = strlen(object_group_text[i]);
8006 /* Save the maximum length */
8007 if (len > max) max = len;
8009 /* See if any monsters are known */
8010 if (collect_objects(i, object_idx))
8012 /* Build a list of groups with known monsters */
8013 grp_idx[grp_cnt++] = i;
8017 /* Terminate the list */
8018 grp_idx[grp_cnt] = -1;
8021 grp_cur = grp_top = 0;
8022 object_cur = object_top = 0;
8039 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
8040 prt("¥°¥ë¡¼¥×", 4, 0);
8041 prt("̾Á°", 4, max + 3);
8042 if (p_ptr->wizard) prt("Idx", 4, 70);
8045 prt("Knowledge - objects", 2, 0);
8047 prt("Name", 4, max + 3);
8048 if (p_ptr->wizard) prt("Idx", 4, 70);
8052 for (i = 0; i < 78; i++)
8054 Term_putch(i, 5, TERM_WHITE, '=');
8057 for (i = 0; i < browser_rows; i++)
8059 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8065 /* Scroll group list */
8066 if (grp_cur < grp_top) grp_top = grp_cur;
8067 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8069 /* Display a list of object groups */
8070 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
8072 if (old_grp_cur != grp_cur)
8074 old_grp_cur = grp_cur;
8076 /* Get a list of objects in the current group */
8077 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
8080 /* Scroll object list */
8081 while (object_cur < object_top)
8082 object_top = MAX(0, object_top - browser_rows/2);
8083 while (object_cur >= object_top + browser_rows)
8084 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
8088 /* Display a list of objects in the current group */
8089 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
8093 object_top = object_cur;
8095 /* Display a list of objects in the current group */
8096 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
8098 /* Display visual list below first object */
8099 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8102 /* Get the current object */
8103 k_ptr = &k_info[object_idx[object_cur]];
8105 /* Mega Hack -- track this object */
8106 if (object_cnt) object_kind_track(object_idx[object_cur]);
8110 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8112 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);
8115 /* The "current" object changed */
8116 if (object_old != object_idx[object_cur])
8118 /* Hack -- handle stuff */
8121 /* Remember the "current" object */
8122 object_old = object_idx[object_cur];
8127 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8131 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8135 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8140 /* Do visual mode command if needed */
8141 /* Symbol of objects with flavor cannot be changed */
8142 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)) continue;
8155 /* Recall on screen */
8157 desc_obj_fake(object_idx[object_cur]);
8165 /* Move the cursor */
8166 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8172 /* Free the "object_idx" array */
8173 C_KILL(object_idx, max_k_idx, int);
8179 * Display the features in a group.
8181 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8182 int feat_cur, int feat_top)
8186 /* Display lines until done */
8187 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8194 int f_idx = feat_idx[feat_top + i];
8196 /* Access the index */
8197 feature_type *f_ptr = &f_info[f_idx];
8199 /* Choose a color */
8200 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8202 /* Display the name */
8203 c_prt(attr, f_name + f_ptr->name, row + i, col);
8205 /* Hack -- visual_list mode */
8208 c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
8214 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
8216 /* Display symbol */
8217 Term_putch(68, row + i, a, c);
8220 if (use_bigtile) Term_putch(68 + 1, row + i, a2, c2);
8223 /* Clear remaining lines */
8224 for (; i < per_page; i++)
8226 Term_erase(col, row + i, 255);
8232 * Interact with feature visuals.
8234 static void do_cmd_knowledge_features(void)
8237 int grp_cur, grp_top, old_grp_cur;
8238 int feat_cur, feat_top;
8239 int grp_cnt, grp_idx[100];
8247 bool visual_list = FALSE;
8248 byte attr_top = 0, char_left = 0;
8254 Term_get_size(&wid, &hgt);
8256 browser_rows = hgt - 8;
8258 /* Allocate the "feat_idx" array */
8259 C_MAKE(feat_idx, max_f_idx, int);
8264 /* Check every group */
8265 for (i = 0; feature_group_text[i] != NULL; i++)
8267 /* Measure the label */
8268 len = strlen(feature_group_text[i]);
8270 /* Save the maximum length */
8271 if (len > max) max = len;
8273 /* See if any features are known */
8274 if (collect_features(i, feat_idx))
8276 /* Build a list of groups with known features */
8277 grp_idx[grp_cnt++] = i;
8281 /* Terminate the list */
8282 grp_idx[grp_cnt] = -1;
8285 grp_cur = grp_top = 0;
8286 feat_cur = feat_top = 0;
8292 while ((!flag) && (grp_cnt))
8295 feature_type *f_ptr;
8301 prt("Visuals - features", 2, 0);
8303 prt("Name", 4, max + 3);
8306 for (i = 0; i < 78; i++)
8308 Term_putch(i, 5, TERM_WHITE, '=');
8311 for (i = 0; i < browser_rows; i++)
8313 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8319 /* Scroll group list */
8320 if (grp_cur < grp_top) grp_top = grp_cur;
8321 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8323 /* Display a list of feature groups */
8324 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8326 if (old_grp_cur != grp_cur)
8328 old_grp_cur = grp_cur;
8330 /* Get a list of features in the current group */
8331 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8334 /* Scroll feature list */
8335 while (feat_cur < feat_top)
8336 feat_top = MAX(0, feat_top - browser_rows/2);
8337 while (feat_cur >= feat_top + browser_rows)
8338 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8342 /* Display a list of features in the current group */
8343 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
8347 feat_top = feat_cur;
8349 /* Display a list of features in the current group */
8350 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
8352 /* Display visual list below first object */
8353 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8358 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8360 prt(format("<dir>%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);
8363 /* Get the current feature */
8364 f_ptr = &f_info[feat_idx[feat_cur]];
8368 place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
8372 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8376 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8381 /* Do visual mode command if needed */
8382 if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &f_ptr->x_attr, &f_ptr->x_char)) continue;
8394 /* Move the cursor */
8395 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8402 if (!grp_cnt) msg_print("No features known.");
8404 /* Free the "feat_idx" array */
8405 C_KILL(feat_idx, max_f_idx, int);
8410 * List wanted monsters
8412 static void do_cmd_knowledge_kubi(void)
8417 char file_name[1024];
8420 /* Open a new file */
8421 fff = my_fopen_temp(file_name, 1024);
8424 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8426 msg_format("Failed to create temporary file %s.", file_name);
8434 bool listed = FALSE;
8437 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8439 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8441 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8443 fprintf(fff, "List of wanted monsters\n");
8445 fprintf(fff, "----------------------------------------------\n");
8447 for (i = 0; i < MAX_KUBI; i++)
8449 if (kubi_r_idx[i] <= 10000)
8451 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8460 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8462 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8467 /* Close the file */
8470 /* Display the file contents */
8472 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8474 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8478 /* Remove the file */
8483 * List virtues & status
8485 static void do_cmd_knowledge_virtues(void)
8489 char file_name[1024];
8492 /* Open a new file */
8493 fff = my_fopen_temp(file_name, 1024);
8496 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8498 msg_format("Failed to create temporary file %s.", file_name);
8507 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8509 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8514 /* Close the file */
8517 /* Display the file contents */
8519 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8521 show_file(TRUE, file_name, "Virtues", 0, 0);
8525 /* Remove the file */
8533 static void do_cmd_knowledge_dungeon(void)
8537 char file_name[1024];
8541 /* Open a new file */
8542 fff = my_fopen_temp(file_name, 1024);
8545 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8547 msg_format("Failed to create temporary file %s.", file_name);
8555 for (i = 1; i < max_d_idx; i++)
8559 if (!d_info[i].maxdepth) continue;
8560 if (!max_dlv[i]) continue;
8561 if (d_info[i].final_guardian)
8563 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8565 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8567 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8569 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8574 /* Close the file */
8577 /* Display the file contents */
8579 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8581 show_file(TRUE, file_name, "Dungeon", 0, 0);
8585 /* Remove the file */
8590 * List virtues & status
8593 static void do_cmd_knowledge_stat(void)
8597 char file_name[1024];
8600 /* Open a new file */
8601 fff = my_fopen_temp(file_name, 1024);
8604 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8606 msg_format("Failed to create temporary file %s.", file_name);
8614 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8615 (2 * p_ptr->hitdie +
8616 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8619 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8620 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8621 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8623 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8624 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8625 fprintf(fff, "Limits of maximum stats\n\n");
8627 for (v_nr = 0; v_nr < 6; v_nr++)
8629 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);
8630 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8636 /* Close the file */
8639 /* Display the file contents */
8641 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8643 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8647 /* Remove the file */
8653 * Print all active quests
8655 static void do_cmd_knowledge_quests_current(FILE *fff)
8658 char rand_tmp_str[120] = "\0";
8660 monster_race *r_ptr;
8662 int rand_level = 100;
8666 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8668 fprintf(fff, "< Current Quest >\n");
8671 for (i = 1; i < max_quests; i++)
8673 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8675 /* Set the quest number temporary */
8676 int old_quest = p_ptr->inside_quest;
8679 /* Clear the text */
8680 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8681 quest_text_line = 0;
8683 p_ptr->inside_quest = i;
8685 /* Get the quest text */
8686 init_flags = INIT_SHOW_TEXT;
8688 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8690 /* Reset the old quest number */
8691 p_ptr->inside_quest = old_quest;
8693 /* No info from "silent" quests */
8694 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8698 if (quest[i].type != QUEST_TYPE_RANDOM)
8700 char note[80] = "\0";
8702 if (quest[i].status == QUEST_STATUS_TAKEN)
8704 switch (quest[i].type)
8706 case QUEST_TYPE_KILL_LEVEL:
8707 case QUEST_TYPE_KILL_ANY_LEVEL:
8708 r_ptr = &r_info[quest[i].r_idx];
8709 strcpy(name, r_name + r_ptr->name);
8710 if (quest[i].max_num > 1)
8713 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8714 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8717 sprintf(note," - kill %d %s, have killed %d.",
8718 quest[i].max_num, name, quest[i].cur_num);
8723 sprintf(note," - %s¤òÅݤ¹¡£",name);
8725 sprintf(note," - kill %s.",name);
8729 case QUEST_TYPE_FIND_ARTIFACT:
8730 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8732 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8734 sprintf(note," - Find out %s.", name);
8738 case QUEST_TYPE_FIND_EXIT:
8740 sprintf(note," - õº÷¤¹¤ë¡£");
8742 sprintf(note," - Search.");
8746 case QUEST_TYPE_KILL_NUMBER:
8748 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8749 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8751 sprintf(note," - Kill %d monsters, have killed %d.",
8752 quest[i].max_num, quest[i].cur_num);
8756 case QUEST_TYPE_KILL_ALL:
8758 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8760 sprintf(note," - Kill all monsters.");
8766 /* Print the quest info */
8768 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8769 quest[i].name, quest[i].level, note);
8771 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8772 quest[i].name, quest[i].level, note);
8775 fprintf(fff, tmp_str);
8777 if (quest[i].status == QUEST_STATUS_COMPLETED)
8780 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8782 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8784 fprintf(fff, tmp_str);
8790 while (quest_text[j][0] && j < 10)
8792 fprintf(fff, " %s\n", quest_text[j]);
8797 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8800 rand_level = quest[i].level;
8802 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8804 /* Print the quest info */
8805 r_ptr = &r_info[quest[i].r_idx];
8806 strcpy(name, r_name + r_ptr->name);
8808 if (quest[i].max_num > 1)
8811 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8812 quest[i].name, quest[i].level,
8813 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8817 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8818 quest[i].name, quest[i].level,
8819 quest[i].max_num, name, quest[i].cur_num);
8825 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8826 quest[i].name, quest[i].level, name);
8828 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8829 quest[i].name, quest[i].level, name);
8837 /* Print the current random quest */
8838 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8841 if (!total) fprintf(fff, " ¤Ê¤·\n");
8843 if (!total) fprintf(fff, " Nothing.\n");
8849 * Print all finished quests
8851 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8858 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8860 fprintf(fff, "< Completed Quest >\n");
8862 for (i = 1; i < max_quests; i++)
8864 int q_idx = quest_num[i];
8866 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8868 if (is_fixed_quest_idx(q_idx))
8870 /* Set the quest number temporary */
8871 int old_quest = p_ptr->inside_quest;
8873 p_ptr->inside_quest = q_idx;
8876 init_flags = INIT_ASSIGN;
8878 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8880 /* Reset the old quest number */
8881 p_ptr->inside_quest = old_quest;
8883 /* No info from "silent" quests */
8884 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8889 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8891 /* Print the quest info */
8893 if (quest[q_idx].complev == 0)
8897 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8899 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8901 r_name+r_info[quest[q_idx].r_idx].name,
8902 quest[q_idx].level);
8908 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8910 " %-40s (Dungeon level: %3d) - level %2d\n",
8912 r_name+r_info[quest[q_idx].r_idx].name,
8914 quest[q_idx].complev);
8919 /* Print the quest info */
8921 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8922 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8924 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8925 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8929 fprintf(fff, tmp_str);
8933 if (!total) fprintf(fff, " ¤Ê¤·\n");
8935 if (!total) fprintf(fff, " Nothing.\n");
8941 * Print all failed quests
8943 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8950 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8952 fprintf(fff, "< Failed Quest >\n");
8954 for (i = 1; i < max_quests; i++)
8956 int q_idx = quest_num[i];
8958 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8960 if (is_fixed_quest_idx(q_idx))
8962 /* Set the quest number temporary */
8963 int old_quest = p_ptr->inside_quest;
8965 p_ptr->inside_quest = q_idx;
8967 /* Get the quest text */
8968 init_flags = INIT_ASSIGN;
8970 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8972 /* Reset the old quest number */
8973 p_ptr->inside_quest = old_quest;
8975 /* No info from "silent" quests */
8976 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8981 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8983 /* Print the quest info */
8985 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8986 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8988 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
8989 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8994 /* Print the quest info */
8996 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8997 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8999 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
9000 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9003 fprintf(fff, tmp_str);
9007 if (!total) fprintf(fff, " ¤Ê¤·\n");
9009 if (!total) fprintf(fff, " Nothing.\n");
9015 * Print all random quests
9017 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
9024 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
9026 fprintf(fff, "< Remaining Random Quest >\n");
9028 for (i = 1; i < max_quests; i++)
9030 /* No info from "silent" quests */
9031 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
9033 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
9037 /* Print the quest info */
9039 sprintf(tmp_str, " %s (%d³¬, %s)\n",
9040 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9042 sprintf(tmp_str, " %s (%d, %s)\n",
9043 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9045 fprintf(fff, tmp_str);
9049 if (!total) fprintf(fff, " ¤Ê¤·\n");
9051 if (!total) fprintf(fff, " Nothing.\n");
9056 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
9058 int *q_num = (int *)u;
9059 quest_type *qa = &quest[q_num[a]];
9060 quest_type *qb = &quest[q_num[b]];
9065 if (qa->complev < qb->complev) return TRUE;
9066 if (qa->complev > qb->complev) return FALSE;
9067 if (qa->level <= qb->level) return TRUE;
9071 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9073 int *q_num = (int *)u;
9080 q_num[a] = q_num[b];
9086 * Print quest status of all active quests
9088 static void do_cmd_knowledge_quests(void)
9091 char file_name[1024];
9092 int *quest_num, dummy, i;
9094 /* Open a new file */
9095 fff = my_fopen_temp(file_name, 1024);
9099 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9101 msg_format("Failed to create temporary file %s.", file_name);
9107 /* Allocate Memory */
9108 C_MAKE(quest_num, max_quests, int);
9110 /* Sort by compete level */
9111 for (i = 1; i < max_quests; i++) quest_num[i] = i;
9112 ang_sort_comp = ang_sort_comp_quest_num;
9113 ang_sort_swap = ang_sort_swap_quest_num;
9114 ang_sort(quest_num, &dummy, max_quests);
9116 /* Dump Quest Information */
9117 do_cmd_knowledge_quests_current(fff);
9119 do_cmd_knowledge_quests_completed(fff, quest_num);
9121 do_cmd_knowledge_quests_failed(fff, quest_num);
9125 do_cmd_knowledge_quests_wiz_random(fff);
9128 /* Close the file */
9131 /* Display the file contents */
9133 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9135 show_file(TRUE, file_name, "Quest status", 0, 0);
9138 /* Remove the file */
9142 C_KILL(quest_num, max_quests, int);
9149 static void do_cmd_knowledge_home(void)
9154 char file_name[1024];
9156 char o_name[MAX_NLEN];
9159 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9161 /* Open a new file */
9162 fff = my_fopen_temp(file_name, 1024);
9165 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9167 msg_format("Failed to create temporary file %s.", file_name);
9175 /* Print all homes in the different towns */
9176 st_ptr = &town[1].store[STORE_HOME];
9178 /* Home -- if anything there */
9179 if (st_ptr->stock_num)
9184 /* Header with name of the town */
9186 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9188 fprintf(fff, " [Home Inventory]\n");
9191 /* Dump all available items */
9192 for (i = 0; i < st_ptr->stock_num; i++)
9195 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9196 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9197 if (strlen(o_name) <= 80-3)
9199 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9205 for (n = 0, t = o_name; n < 80-3; n++, t++)
9206 if(iskanji(*t)) {t++; n++;}
9207 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9209 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9210 fprintf(fff, " %.77s\n", o_name+n);
9213 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9214 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9219 /* Add an empty line */
9220 fprintf(fff, "\n\n");
9224 /* Close the file */
9227 /* Display the file contents */
9229 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9231 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9235 /* Remove the file */
9241 * Check the status of "autopick"
9243 static void do_cmd_knowledge_autopick(void)
9247 char file_name[1024];
9249 /* Open a new file */
9250 fff = my_fopen_temp(file_name, 1024);
9255 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9257 msg_format("Failed to create temporary file %s.", file_name);
9266 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9268 fprintf(fff, "No preference for auto picker/destroyer.");
9274 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9276 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9280 for (k = 0; k < max_autopick; k++)
9283 byte act = autopick_list[k].action;
9284 if (act & DONT_AUTOPICK)
9292 else if (act & DO_AUTODESTROY)
9300 else if (act & DO_AUTOPICK)
9308 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9317 if (act & DO_DISPLAY)
9318 fprintf(fff, "%11s", format("[%s]", tmp));
9320 fprintf(fff, "%11s", format("(%s)", tmp));
9322 tmp = autopick_line_from_entry(&autopick_list[k]);
9323 fprintf(fff, " %s", tmp);
9327 /* Close the file */
9329 /* Display the file contents */
9331 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9333 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9336 /* Remove the file */
9342 * Interact with "knowledge"
9344 void do_cmd_knowledge(void)
9347 /* File type is "TEXT" */
9348 FILE_TYPE(FILE_TYPE_TEXT);
9349 /* Save the screen */
9351 /* Interact until done */
9356 /* Ask for a choice */
9358 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9359 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9361 prt(format("page %d/2", (p+1)), 2, 65);
9362 prt("Display current knowledge", 3, 0);
9365 /* Give some choices */
9368 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9369 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9370 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9371 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9372 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9373 if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9374 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9375 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9376 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9377 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);
9391 prt("(1) Display known artifacts", 6, 5);
9392 prt("(2) Display known objects", 7, 5);
9393 prt("(3) Display remaining uniques", 8, 5);
9394 prt("(4) Display known monster", 9, 5);
9395 prt("(5) Display kill count", 10, 5);
9396 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9397 prt("(7) Display current pets", 12, 5);
9398 prt("(8) Display home inventory", 13, 5);
9399 prt("(9) Display *identified* equip.", 14, 5);
9400 prt("(0) Display terrain symbols.", 15, 5);
9402 prt("(a) Display about yourself", 6, 5);
9403 prt("(b) Display mutations", 7, 5);
9404 prt("(c) Display weapon proficiency", 8, 5);
9405 prt("(d) Display spell proficiency", 9, 5);
9406 prt("(e) Display misc. proficiency", 10, 5);
9407 prt("(f) Display virtues", 11, 5);
9408 prt("(g) Display dungeons", 12, 5);
9409 prt("(h) Display current quests", 13, 5);
9410 prt("(i) Display auto pick/destroy", 14, 5);
9415 prt("-³¤¯-", 17, 8);
9416 prt("ESC) È´¤±¤ë", 21, 1);
9417 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9418 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9419 prt("¥³¥Þ¥ó¥É:", 20, 0);
9421 prt("-more-", 17, 8);
9422 prt("ESC) Exit menu", 21, 1);
9423 prt("SPACE) Next page", 21, 30);
9424 /*prt("-) Previous page", 21, 60);*/
9425 prt("Command: ", 20, 0);
9431 if (i == ESCAPE) break;
9434 case ' ': /* Page change */
9438 case '1': /* Artifacts */
9439 do_cmd_knowledge_artifacts();
9441 case '2': /* Objects */
9442 do_cmd_knowledge_objects();
9444 case '3': /* Uniques */
9445 do_cmd_knowledge_uniques();
9447 case '4': /* Monsters */
9448 do_cmd_knowledge_monsters();
9450 case '5': /* Kill count */
9451 do_cmd_knowledge_kill_count();
9453 case '6': /* wanted */
9454 if (!vanilla_town) do_cmd_knowledge_kubi();
9456 case '7': /* Pets */
9457 do_cmd_knowledge_pets();
9459 case '8': /* Home */
9460 do_cmd_knowledge_home();
9462 case '9': /* Resist list */
9463 do_cmd_knowledge_inven();
9465 case '0': /* Feature list */
9466 do_cmd_knowledge_features();
9469 case 'a': /* Max stat */
9470 do_cmd_knowledge_stat();
9472 case 'b': /* Mutations */
9473 do_cmd_knowledge_mutations();
9475 case 'c': /* weapon-exp */
9476 do_cmd_knowledge_weapon_exp();
9478 case 'd': /* spell-exp */
9479 do_cmd_knowledge_spell_exp();
9481 case 'e': /* skill-exp */
9482 do_cmd_knowledge_skill_exp();
9484 case 'f': /* Virtues */
9485 do_cmd_knowledge_virtues();
9487 case 'g': /* Dungeon */
9488 do_cmd_knowledge_dungeon();
9490 case 'h': /* Quests */
9491 do_cmd_knowledge_quests();
9493 case 'i': /* Autopick */
9494 do_cmd_knowledge_autopick();
9496 default: /* Unknown option */
9499 /* Flush messages */
9502 /* Restore the screen */
9508 * Check on the status of an active quest
9510 void do_cmd_checkquest(void)
9512 /* File type is "TEXT" */
9513 FILE_TYPE(FILE_TYPE_TEXT);
9515 /* Save the screen */
9519 do_cmd_knowledge_quests();
9521 /* Restore the screen */
9527 * Display the time and date
9529 void do_cmd_time(void)
9531 int day, hour, min, full, start, end, num;
9538 extract_day_hour_min(&day, &hour, &min);
9540 full = hour * 100 + min;
9548 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9550 strcpy(desc, "It is a strange time.");
9556 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9557 day, (hour % 12 == 0) ? 12 : (hour % 12),
9558 min, (hour < 12) ? "AM" : "PM");
9560 msg_format("This is day %d. The time is %d:%02d %s.",
9561 day, (hour % 12 == 0) ? 12 : (hour % 12),
9562 min, (hour < 12) ? "AM" : "PM");
9567 if (!randint0(10) || p_ptr->image)
9570 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9572 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9579 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9581 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9586 /* Open this file */
9587 fff = my_fopen(buf, "rt");
9592 /* Find this time */
9593 while (!my_fgets(fff, buf, sizeof(buf)))
9595 /* Ignore comments */
9596 if (!buf[0] || (buf[0] == '#')) continue;
9598 /* Ignore invalid lines */
9599 if (buf[1] != ':') continue;
9601 /* Process 'Start' */
9604 /* Extract the starting time */
9605 start = atoi(buf + 2);
9607 /* Assume valid for an hour */
9617 /* Extract the ending time */
9618 end = atoi(buf + 2);
9624 /* Ignore incorrect range */
9625 if ((start > full) || (full > end)) continue;
9627 /* Process 'Description' */
9632 /* Apply the randomizer */
9633 if (!randint0(num)) strcpy(desc, buf + 2);
9643 /* Close the file */