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(TRUE);
1387 /* Exit on Escape */
1388 if (skey == ESCAPE) break;
1390 /* Hack -- Save the old index */
1393 /* Hack -- handle show */
1398 prt("¶¯Ä´: ", hgt - 1, 0);
1400 prt("Show: ", hgt - 1, 0);
1404 /* Get a "shower" string, or continue */
1405 if (!askfor_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";
5508 * Hack -- load a screen dump from a file
5510 void do_cmd_load_screen(void)
5525 Term_get_size(&wid, &hgt);
5527 /* Build the filename */
5528 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5530 /* Append to the file */
5531 fff = my_fopen(buf, "r");
5536 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5538 msg_format("Failed to open %s.", buf);
5545 /* Save the screen */
5548 /* Clear the screen */
5552 /* Load the screen */
5553 for (y = 0; okay; y++)
5555 /* Get a line of data including control code */
5556 if (!fgets(buf, 1024, fff)) okay = FALSE;
5558 /* Get the blank line */
5559 if (buf[0] == '\n' || buf[0] == '\0') break;
5561 /* Ignore too large screen image */
5562 if (y >= hgt) continue;
5565 for (x = 0; x < wid - 1; x++)
5568 if (buf[x] == '\n' || buf[x] == '\0') break;
5570 /* Put the attr/char */
5571 Term_draw(x, y, TERM_WHITE, buf[x]);
5575 /* Dump the screen */
5576 for (y = 0; okay; y++)
5578 /* Get a line of data including control code */
5579 if (!fgets(buf, 1024, fff)) okay = FALSE;
5581 /* Get the blank line */
5582 if (buf[0] == '\n' || buf[0] == '\0') break;
5584 /* Ignore too large screen image */
5585 if (y >= hgt) continue;
5588 for (x = 0; x < wid - 1; x++)
5591 if (buf[x] == '\n' || buf[x] == '\0') break;
5593 /* Get the attr/char */
5594 (void)(Term_what(x, y, &a, &c));
5596 /* Look up the attr */
5597 for (i = 0; i < 16; i++)
5599 /* Use attr matches */
5600 if (hack[i] == buf[x]) a = i;
5603 /* Put the attr/char */
5604 Term_draw(x, y, a, c);
5615 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5617 msg_print("Screen dump loaded.");
5624 /* Restore the screen */
5631 cptr inven_res_label =
5633 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5635 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5640 #define IM_FLAG_STR "¡ö"
5641 #define HAS_FLAG_STR "¡Ü"
5642 #define NO_FLAG_STR "¡¦"
5644 #define IM_FLAG_STR "* "
5645 #define HAS_FLAG_STR "+ "
5646 #define NO_FLAG_STR ". "
5649 #define print_im_or_res_flag(IM, RES) \
5651 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5652 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5655 #define print_flag(TR) \
5657 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5661 /* XTRA HACK RESLIST */
5662 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5664 char o_name[MAX_NLEN];
5665 u32b flgs[TR_FLAG_SIZE];
5667 if (!o_ptr->k_idx) return;
5668 if (o_ptr->tval != tval) return;
5670 /* Identified items only */
5671 if (!object_known_p(o_ptr)) return;
5674 * HACK:Ring of Lordly protection and Dragon equipment
5675 * have random resistances.
5677 if (((TV_EQUIP_BEGIN <= tval) && (tval <= TV_EQUIP_END) && o_ptr->name2)
5678 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5679 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5680 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5681 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5682 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5683 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5684 || o_ptr->art_name || o_ptr->name1)
5687 object_desc(o_name, o_ptr, TRUE, 0);
5689 while (o_name[i] && (i < 26))
5692 if (iskanji(o_name[i])) i++;
5701 o_name[i] = ' '; i++;
5706 fprintf(fff, "%s %s", where, o_name);
5708 if (!(o_ptr->ident & (IDENT_MENTAL)))
5711 fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5713 fputs("-------unknown------------ -------unknown------\n", fff);
5718 object_flags_known(o_ptr, flgs);
5720 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5721 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5722 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5723 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5724 print_flag(TR_RES_POIS);
5725 print_flag(TR_RES_LITE);
5726 print_flag(TR_RES_DARK);
5727 print_flag(TR_RES_SHARDS);
5728 print_flag(TR_RES_SOUND);
5729 print_flag(TR_RES_NETHER);
5730 print_flag(TR_RES_NEXUS);
5731 print_flag(TR_RES_CHAOS);
5732 print_flag(TR_RES_DISEN);
5736 print_flag(TR_RES_BLIND);
5737 print_flag(TR_RES_FEAR);
5738 print_flag(TR_RES_CONF);
5739 print_flag(TR_FREE_ACT);
5740 print_flag(TR_SEE_INVIS);
5741 print_flag(TR_HOLD_LIFE);
5742 print_flag(TR_TELEPATHY);
5743 print_flag(TR_SLOW_DIGEST);
5744 print_flag(TR_REGEN);
5745 print_flag(TR_FEATHER);
5753 fprintf(fff, "%s\n", inven_res_label);
5759 * Display *ID* ed weapons/armors's resistances
5761 static void do_cmd_knowledge_inven(void)
5765 char file_name[1024];
5775 /* Open a new file */
5776 fff = my_fopen_temp(file_name, 1024);
5780 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5782 msg_format("Failed to create temporary file %s.", file_name);
5787 fprintf(fff, "%s\n", inven_res_label);
5789 for (tval = TV_EQUIP_BEGIN; tval <= TV_EQUIP_END; tval++)
5793 for (; j < 9; j++) fputc('\n', fff);
5795 fprintf(fff, "%s\n", inven_res_label);
5799 strcpy(where, "Áõ");
5801 strcpy(where, "E ");
5803 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5805 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5809 strcpy(where, "»ý");
5811 strcpy(where, "I ");
5813 for (i = 0; i < INVEN_PACK; i++)
5815 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5818 st_ptr = &town[1].store[STORE_HOME];
5820 strcpy(where, "²È");
5822 strcpy(where, "H ");
5825 for (i = 0; i < st_ptr->stock_num; i++)
5827 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5831 /* Close the file */
5834 /* Display the file contents */
5836 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5838 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5841 /* Remove the file */
5846 void do_cmd_save_screen_html_aux(char *filename, int message)
5850 byte a = 0, old_a = 0;
5864 cptr html_head[] = {
5865 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5869 cptr html_foot[] = {
5871 "</body>\n</html>\n",
5877 Term_get_size(&wid, &hgt);
5879 /* File type is "TEXT" */
5880 FILE_TYPE(FILE_TYPE_TEXT);
5882 /* Append to the file */
5883 fff = my_fopen(filename, "w");
5889 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5891 msg_format("Failed to open file %s.", filename);
5899 /* Save the screen */
5903 /* Build the filename */
5904 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5905 tmpfff = my_fopen(buf, "r");
5907 for (i = 0; html_head[i]; i++)
5908 fprintf(fff, html_head[i]);
5912 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5914 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5918 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5920 fprintf(fff, "%s\n", buf);
5925 /* Dump the screen */
5926 for (y = 0; y < hgt; y++)
5933 for (x = 0; x < wid - 1; x++)
5937 /* Get the attr/char */
5938 (void)(Term_what(x, y, &a, &c));
5942 case '&': cc = "&"; break;
5943 case '<': cc = "<"; break;
5944 case '>': cc = ">"; break;
5946 case 0x1f: c = '.'; break;
5947 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5952 if ((y == 0 && x == 0) || a != old_a) {
5953 rv = angband_color_table[a][1];
5954 gv = angband_color_table[a][2];
5955 bv = angband_color_table[a][3];
5956 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5957 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5961 fprintf(fff, "%s", cc);
5963 fprintf(fff, "%c", c);
5966 fprintf(fff, "</font>");
5969 for (i = 0; html_foot[i]; i++)
5970 fprintf(fff, html_foot[i]);
5975 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5977 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5981 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5983 fprintf(fff, "%s\n", buf);
5998 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6000 msg_print("Screen dump saved.");
6005 /* Restore the screen */
6011 * Hack -- save a screen dump to a file
6013 static void do_cmd_save_screen_html(void)
6015 char buf[1024], tmp[256] = "screen.html";
6018 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
6020 if (!get_string("File name: ", tmp, 80))
6024 /* Build the filename */
6025 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
6029 do_cmd_save_screen_html_aux(buf, 1);
6034 * Redefinable "save_screen" action
6036 void (*screendump_aux)(void) = NULL;
6040 * Hack -- save a screen dump to a file
6042 void do_cmd_save_screen(void)
6044 bool old_use_graphics = use_graphics;
6045 bool html_dump = FALSE;
6050 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6052 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6057 if (c == 'Y' || c == 'y')
6059 else if (c == 'H' || c == 'h')
6071 Term_get_size(&wid, &hgt);
6073 if (old_use_graphics)
6075 use_graphics = FALSE;
6078 /* Redraw everything */
6079 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6081 /* Hack -- update */
6087 do_cmd_save_screen_html();
6091 /* Do we use a special screendump function ? */
6092 else if (screendump_aux)
6094 /* Dump the screen to a graphics file */
6095 (*screendump_aux)();
6097 else /* Dump the screen as text */
6108 /* Build the filename */
6109 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6111 /* File type is "TEXT" */
6112 FILE_TYPE(FILE_TYPE_TEXT);
6114 /* Append to the file */
6115 fff = my_fopen(buf, "w");
6121 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6123 msg_format("Failed to open file %s.", buf);
6130 /* Save the screen */
6134 /* Dump the screen */
6135 for (y = 0; y < hgt; y++)
6138 for (x = 0; x < wid - 1; x++)
6140 /* Get the attr/char */
6141 (void)(Term_what(x, y, &a, &c));
6151 fprintf(fff, "%s\n", buf);
6158 /* Dump the screen */
6159 for (y = 0; y < hgt; y++)
6162 for (x = 0; x < wid - 1; x++)
6164 /* Get the attr/char */
6165 (void)(Term_what(x, y, &a, &c));
6168 buf[x] = hack[a&0x0F];
6175 fprintf(fff, "%s\n", buf);
6187 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6189 msg_print("Screen dump saved.");
6195 /* Restore the screen */
6199 if (old_use_graphics)
6201 use_graphics = TRUE;
6204 /* Redraw everything */
6205 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6207 /* Hack -- update */
6214 * Sorting hook -- Comp function -- see below
6216 * We use "u" to point to array of monster indexes,
6217 * and "v" to select the type of sorting to perform on "u".
6219 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6221 u16b *who = (u16b*)(u);
6223 u16b *why = (u16b*)(v);
6230 /* Sort by total kills */
6233 /* Extract total kills */
6234 z1 = a_info[w1].tval;
6235 z2 = a_info[w2].tval;
6237 /* Compare total kills */
6238 if (z1 < z2) return (TRUE);
6239 if (z1 > z2) return (FALSE);
6243 /* Sort by monster level */
6246 /* Extract levels */
6247 z1 = a_info[w1].sval;
6248 z2 = a_info[w2].sval;
6250 /* Compare levels */
6251 if (z1 < z2) return (TRUE);
6252 if (z1 > z2) return (FALSE);
6256 /* Sort by monster experience */
6259 /* Extract experience */
6260 z1 = a_info[w1].level;
6261 z2 = a_info[w2].level;
6263 /* Compare experience */
6264 if (z1 < z2) return (TRUE);
6265 if (z1 > z2) return (FALSE);
6269 /* Compare indexes */
6275 * Sorting hook -- Swap function -- see below
6277 * We use "u" to point to array of monster indexes,
6278 * and "v" to select the type of sorting to perform.
6280 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6282 u16b *who = (u16b*)(u);
6297 * Check the status of "artifacts"
6299 static void do_cmd_knowledge_artifacts(void)
6301 int i, k, z, x, y, n = 0;
6307 char file_name[1024];
6309 char base_name[MAX_NLEN];
6313 /* Open a new file */
6314 fff = my_fopen_temp(file_name, 1024);
6318 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6320 msg_format("Failed to create temporary file %s.", file_name);
6326 /* Allocate the "who" array */
6327 C_MAKE(who, max_a_idx, s16b);
6329 /* Allocate the "okay" array */
6330 C_MAKE(okay, max_a_idx, bool);
6332 /* Scan the artifacts */
6333 for (k = 0; k < max_a_idx; k++)
6335 artifact_type *a_ptr = &a_info[k];
6340 /* Skip "empty" artifacts */
6341 if (!a_ptr->name) continue;
6343 /* Skip "uncreated" artifacts */
6344 if (!a_ptr->cur_num) continue;
6350 /* Check the dungeon */
6351 for (y = 0; y < cur_hgt; y++)
6353 for (x = 0; x < cur_wid; x++)
6355 cave_type *c_ptr = &cave[y][x];
6357 s16b this_o_idx, next_o_idx = 0;
6359 /* Scan all objects in the grid */
6360 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6364 /* Acquire object */
6365 o_ptr = &o_list[this_o_idx];
6367 /* Acquire next object */
6368 next_o_idx = o_ptr->next_o_idx;
6370 /* Ignore non-artifacts */
6371 if (!artifact_p(o_ptr)) continue;
6373 /* Ignore known items */
6374 if (object_known_p(o_ptr)) continue;
6376 /* Note the artifact */
6377 okay[o_ptr->name1] = FALSE;
6382 /* Check the inventory and equipment */
6383 for (i = 0; i < INVEN_TOTAL; i++)
6385 object_type *o_ptr = &inventory[i];
6387 /* Ignore non-objects */
6388 if (!o_ptr->k_idx) continue;
6390 /* Ignore non-artifacts */
6391 if (!artifact_p(o_ptr)) continue;
6393 /* Ignore known items */
6394 if (object_known_p(o_ptr)) continue;
6396 /* Note the artifact */
6397 okay[o_ptr->name1] = FALSE;
6400 for (k = 0; k < max_a_idx; k++)
6402 if (okay[k]) who[n++] = k;
6405 /* Select the sort method */
6406 ang_sort_comp = ang_sort_art_comp;
6407 ang_sort_swap = ang_sort_art_swap;
6409 /* Sort the array by dungeon depth of monsters */
6410 ang_sort(who, &why, n);
6412 /* Scan the artifacts */
6413 for (k = 0; k < n; k++)
6415 artifact_type *a_ptr = &a_info[who[k]];
6419 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6421 strcpy(base_name, "Unknown Artifact");
6425 /* Obtain the base object type */
6426 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6434 /* Get local object */
6437 /* Create fake object */
6438 object_prep(q_ptr, z);
6440 /* Make it an artifact */
6441 q_ptr->name1 = (byte)who[k];
6443 /* Describe the artifact */
6444 object_desc_store(base_name, q_ptr, FALSE, 0);
6447 /* Hack -- Build the artifact name */
6449 fprintf(fff, " %s\n", base_name);
6451 fprintf(fff, " The %s\n", base_name);
6456 /* Free the "who" array */
6457 C_KILL(who, max_a_idx, s16b);
6459 /* Free the "okay" array */
6460 C_KILL(okay, max_a_idx, bool);
6462 /* Close the file */
6465 /* Display the file contents */
6467 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6469 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6473 /* Remove the file */
6479 * Display known uniques
6481 static void do_cmd_knowledge_uniques(void)
6489 char file_name[1024];
6491 /* Open a new file */
6492 fff = my_fopen_temp(file_name, 1024);
6496 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6498 msg_format("Failed to create temporary file %s.", file_name);
6504 /* Allocate the "who" array */
6505 C_MAKE(who, max_r_idx, s16b);
6507 /* Scan the monsters */
6508 for (i = 1; i < max_r_idx; i++)
6510 monster_race *r_ptr = &r_info[i];
6512 /* Use that monster */
6513 if (r_ptr->name) who[n++] = i;
6516 /* Select the sort method */
6517 ang_sort_comp = ang_sort_comp_hook;
6518 ang_sort_swap = ang_sort_swap_hook;
6520 /* Sort the array by dungeon depth of monsters */
6521 ang_sort(who, &why, n);
6523 /* Scan the monster races */
6524 for (k = 0; k < n; k++)
6526 monster_race *r_ptr = &r_info[who[k]];
6528 /* Only print Uniques */
6529 if (r_ptr->flags1 & (RF1_UNIQUE))
6531 bool dead = (r_ptr->max_num == 0);
6535 /* Only display "known" uniques */
6536 if (dead || cheat_know || r_ptr->r_sights)
6538 /* Print a message */
6540 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6541 (r_name + r_ptr->name));
6543 fprintf(fff, " %s is alive\n",
6544 (r_name + r_ptr->name));
6551 /* Free the "who" array */
6552 C_KILL(who, max_r_idx, s16b);
6554 /* Close the file */
6557 /* Display the file contents */
6559 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6561 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6565 /* Remove the file */
6571 * Display weapon-exp
6573 static void do_cmd_knowledge_weapon_exp(void)
6575 int i, j, num, weapon_exp;
6579 char file_name[1024];
6582 /* Open a new file */
6583 fff = my_fopen_temp(file_name, 1024);
6586 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6588 msg_format("Failed to create temporary file %s.", file_name);
6594 for (i = 0; i < 5; i++)
6596 for (num = 0; num < 64; num++)
6598 for (j = 0; j < max_k_idx; j++)
6600 object_kind *k_ptr = &k_info[j];
6602 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6604 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6606 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6608 fprintf(fff, "%-25s ", tmp);
6609 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6610 else fprintf(fff, " ");
6611 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6612 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6620 /* Close the file */
6623 /* Display the file contents */
6625 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6627 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6631 /* Remove the file */
6639 static void do_cmd_knowledge_spell_exp(void)
6641 int i = 0, spell_exp, exp_level;
6646 char file_name[1024];
6648 /* Open a new file */
6649 fff = my_fopen_temp(file_name, 1024);
6652 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6654 msg_format("Failed to create temporary file %s.", file_name);
6660 if (p_ptr->realm1 != REALM_NONE)
6663 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6665 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6667 for (i = 0; i < 32; i++)
6669 if (!is_magic(p_ptr->realm1))
6671 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6675 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6677 if (s_ptr->slevel >= 99) continue;
6678 spell_exp = p_ptr->spell_exp[i];
6679 exp_level = spell_exp_level(spell_exp);
6680 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6681 if (p_ptr->realm1 == REALM_HISSATSU)
6682 fprintf(fff, "[--]");
6685 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6686 else fprintf(fff, " ");
6687 fprintf(fff, "%s", exp_level_str[exp_level]);
6689 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6694 if (p_ptr->realm2 != REALM_NONE)
6697 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6699 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6701 for (i = 0; i < 32; i++)
6703 if (!is_magic(p_ptr->realm1))
6705 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6709 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6711 if (s_ptr->slevel >= 99) continue;
6713 spell_exp = p_ptr->spell_exp[i + 32];
6714 exp_level = spell_exp_level(spell_exp);
6715 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6716 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6717 else fprintf(fff, " ");
6718 fprintf(fff, "%s", exp_level_str[exp_level]);
6719 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6724 /* Close the file */
6727 /* Display the file contents */
6729 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6731 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6735 /* Remove the file */
6743 static void do_cmd_knowledge_skill_exp(void)
6745 int i = 0, skill_exp;
6749 char file_name[1024];
6751 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6753 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6756 /* Open a new file */
6757 fff = my_fopen_temp(file_name, 1024);
6760 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6762 msg_format("Failed to create temporary file %s.", file_name);
6768 for (i = 0; i < 3; i++)
6770 skill_exp = p_ptr->skill_exp[i];
6771 fprintf(fff, "%-20s ", skill_name[i]);
6772 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6773 else fprintf(fff, " ");
6774 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6775 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6779 /* Close the file */
6782 /* Display the file contents */
6784 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6786 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6790 /* Remove the file */
6796 * Pluralize a monster name
6798 void plural_aux(char *Name)
6800 int NameLen = strlen(Name);
6802 if (strstr(Name, "Disembodied hand"))
6804 strcpy(Name, "Disembodied hands that strangled people");
6806 else if (strstr(Name, "Colour out of space"))
6808 strcpy(Name, "Colours out of space");
6810 else if (strstr(Name, "stairway to hell"))
6812 strcpy(Name, "stairways to hell");
6814 else if (strstr(Name, "Dweller on the threshold"))
6816 strcpy(Name, "Dwellers on the threshold");
6818 else if (strstr(Name, " of "))
6820 cptr aider = strstr(Name, " of ");
6831 if (dummy[i-1] == 's')
6833 strcpy(&(dummy[i]), "es");
6838 strcpy(&(dummy[i]), "s");
6841 strcpy(&(dummy[i+1]), aider);
6842 strcpy(Name, dummy);
6844 else if (strstr(Name, "coins"))
6847 strcpy(dummy, "piles of ");
6848 strcat(dummy, Name);
6849 strcpy(Name, dummy);
6852 else if (strstr(Name, "Manes"))
6856 else if (streq(&(Name[NameLen - 2]), "ey"))
6858 strcpy(&(Name[NameLen - 2]), "eys");
6860 else if (Name[NameLen - 1] == 'y')
6862 strcpy(&(Name[NameLen - 1]), "ies");
6864 else if (streq(&(Name[NameLen - 4]), "ouse"))
6866 strcpy(&(Name[NameLen - 4]), "ice");
6868 else if (streq(&(Name[NameLen - 2]), "us"))
6870 strcpy(&(Name[NameLen - 2]), "i");
6872 else if (streq(&(Name[NameLen - 6]), "kelman"))
6874 strcpy(&(Name[NameLen - 6]), "kelmen");
6876 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6878 strcpy(&(Name[NameLen - 8]), "wordsmen");
6880 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6882 strcpy(&(Name[NameLen - 7]), "oodsmen");
6884 else if (streq(&(Name[NameLen - 7]), "eastman"))
6886 strcpy(&(Name[NameLen - 7]), "eastmen");
6888 else if (streq(&(Name[NameLen - 8]), "izardman"))
6890 strcpy(&(Name[NameLen - 8]), "izardmen");
6892 else if (streq(&(Name[NameLen - 5]), "geist"))
6894 strcpy(&(Name[NameLen - 5]), "geister");
6896 else if (streq(&(Name[NameLen - 2]), "ex"))
6898 strcpy(&(Name[NameLen - 2]), "ices");
6900 else if (streq(&(Name[NameLen - 2]), "lf"))
6902 strcpy(&(Name[NameLen - 2]), "lves");
6904 else if (suffix(Name, "ch") ||
6905 suffix(Name, "sh") ||
6906 suffix(Name, "nx") ||
6907 suffix(Name, "s") ||
6910 strcpy(&(Name[NameLen]), "es");
6914 strcpy(&(Name[NameLen]), "s");
6919 * Display current pets
6921 static void do_cmd_knowledge_pets(void)
6925 monster_type *m_ptr;
6928 int show_upkeep = 0;
6929 char file_name[1024];
6932 /* Open a new file */
6933 fff = my_fopen_temp(file_name, 1024);
6936 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6938 msg_format("Failed to create temporary file %s.", file_name);
6944 /* Process the monsters (backwards) */
6945 for (i = m_max - 1; i >= 1; i--)
6947 /* Access the monster */
6950 /* Ignore "dead" monsters */
6951 if (!m_ptr->r_idx) continue;
6953 /* Calculate "upkeep" for pets */
6957 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6958 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6962 show_upkeep = calculate_upkeep();
6964 fprintf(fff, "----------------------------------------------\n");
6966 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
6967 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6969 fprintf(fff, " Total: %d pet%s.\n",
6970 t_friends, (t_friends == 1 ? "" : "s"));
6971 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6976 /* Close the file */
6979 /* Display the file contents */
6981 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6983 show_file(TRUE, file_name, "Current Pets", 0, 0);
6987 /* Remove the file */
6995 * Note that the player ghosts are ignored. XXX XXX XXX
6997 static void do_cmd_knowledge_kill_count(void)
7005 char file_name[1024];
7010 /* Open a new file */
7011 fff = my_fopen_temp(file_name, 1024);
7015 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7017 msg_format("Failed to create temporary file %s.", file_name);
7023 /* Allocate the "who" array */
7024 C_MAKE(who, max_r_idx, s16b);
7027 /* Monsters slain */
7030 for (kk = 1; kk < max_r_idx; kk++)
7032 monster_race *r_ptr = &r_info[kk];
7034 if (r_ptr->flags1 & (RF1_UNIQUE))
7036 bool dead = (r_ptr->max_num == 0);
7045 s16b This = r_ptr->r_pkills;
7056 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7058 fprintf(fff,"You have defeated no enemies yet.\n\n");
7061 else if (Total == 1)
7063 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7065 fprintf(fff,"You have defeated one enemy.\n\n");
7070 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7072 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7079 /* Scan the monsters */
7080 for (i = 1; i < max_r_idx; i++)
7082 monster_race *r_ptr = &r_info[i];
7084 /* Use that monster */
7085 if (r_ptr->name) who[n++] = i;
7088 /* Select the sort method */
7089 ang_sort_comp = ang_sort_comp_hook;
7090 ang_sort_swap = ang_sort_swap_hook;
7092 /* Sort the array by dungeon depth of monsters */
7093 ang_sort(who, &why, n);
7095 /* Scan the monster races */
7096 for (k = 0; k < n; k++)
7098 monster_race *r_ptr = &r_info[who[k]];
7100 if (r_ptr->flags1 & (RF1_UNIQUE))
7102 bool dead = (r_ptr->max_num == 0);
7106 /* Print a message */
7107 fprintf(fff, " %s\n",
7108 (r_name + r_ptr->name));
7114 s16b This = r_ptr->r_pkills;
7119 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7120 if(strchr("pt",r_ptr->d_char))
7121 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7123 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7127 if (strstr(r_name + r_ptr->name, "coins"))
7129 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7133 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7139 strcpy(ToPlural, (r_name + r_ptr->name));
7140 plural_aux(ToPlural);
7141 fprintf(fff, " %d %s\n", This, ToPlural);
7151 fprintf(fff,"----------------------------------------------\n");
7153 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7155 fprintf(fff," Total: %lu creature%s killed.\n",
7156 Total, (Total == 1 ? "" : "s"));
7160 /* Free the "who" array */
7161 C_KILL(who, max_r_idx, s16b);
7163 /* Close the file */
7166 /* Display the file contents */
7168 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7170 show_file(TRUE, file_name, "Kill Count", 0, 0);
7174 /* Remove the file */
7180 * Display the object groups.
7182 static void display_group_list(int col, int row, int wid, int per_page,
7183 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7187 /* Display lines until done */
7188 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7190 /* Get the group index */
7191 int grp = grp_idx[grp_top + i];
7193 /* Choose a color */
7194 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7196 /* Erase the entire line */
7197 Term_erase(col, row + i, wid);
7199 /* Display the group label */
7200 c_put_str(attr, group_text[grp], row + i, col);
7206 * Move the cursor in a browser window
7208 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7209 int *list_cur, int list_cnt)
7214 int list = *list_cur;
7216 /* Extract direction */
7219 /* Hack -- scroll up full screen */
7224 /* Hack -- scroll down full screen */
7229 d = get_keymap_dir(ch);
7234 /* Diagonals - hack */
7235 if ((ddx[d] > 0) && ddy[d])
7241 Term_get_size(&wid, &hgt);
7243 browser_rows = hgt - 8;
7245 /* Browse group list */
7250 /* Move up or down */
7251 grp += ddy[d] * (browser_rows - 1);
7254 if (grp >= grp_cnt) grp = grp_cnt - 1;
7255 if (grp < 0) grp = 0;
7256 if (grp != old_grp) list = 0;
7259 /* Browse sub-list list */
7262 /* Move up or down */
7263 list += ddy[d] * browser_rows;
7266 if (list >= list_cnt) list = list_cnt - 1;
7267 if (list < 0) list = 0;
7279 if (col < 0) col = 0;
7280 if (col > 1) col = 1;
7287 /* Browse group list */
7292 /* Move up or down */
7296 if (grp >= grp_cnt) grp = grp_cnt - 1;
7297 if (grp < 0) grp = 0;
7298 if (grp != old_grp) list = 0;
7301 /* Browse sub-list list */
7304 /* Move up or down */
7308 if (list >= list_cnt) list = list_cnt - 1;
7309 if (list < 0) list = 0;
7320 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7324 /* Clear the display lines */
7325 for (i = 0; i < height; i++)
7327 Term_erase(col, row + i, width);
7330 /* Bigtile mode uses double width */
7331 if (use_bigtile) width /= 2;
7333 /* Display lines until done */
7334 for (i = 0; i < height; i++)
7336 /* Display columns until done */
7337 for (j = 0; j < width; j++)
7345 /* Bigtile mode uses double width */
7346 if (use_bigtile) x += j;
7351 /* Ignore illegal characters */
7352 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7353 (!use_graphics && ic > 0x7f))
7359 /* Force correct code for both ASCII character and tile */
7360 if (c & 0x80) a |= 0x80;
7362 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7364 /* Display symbol */
7365 Term_putch(x, y, a, c);
7368 if (use_bigtile) Term_putch(x + 1, y, a2, c2);
7375 * Place the cursor at the collect position for visual mode
7377 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7379 int i = (a & 0x7f) - attr_top;
7380 int j = c - char_left;
7385 /* Bigtile mode uses double width */
7386 if (use_bigtile) x += j;
7388 /* Place the cursor */
7394 * Clipboard variables for copy&paste in visual mode
7396 static byte attr_idx = 0;
7397 static byte char_idx = 0;
7400 * Do visual mode command -- Change symbols
7402 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7403 int height, int width,
7404 byte *attr_top_ptr, byte *char_left_ptr,
7405 byte *cur_attr_ptr, byte *cur_char_ptr)
7407 static byte attr_old = 0, char_old = 0;
7412 if (*visual_list_ptr)
7415 *cur_attr_ptr = attr_old;
7416 *cur_char_ptr = char_old;
7417 *visual_list_ptr = FALSE;
7426 if (*visual_list_ptr)
7429 *visual_list_ptr = FALSE;
7437 if (!*visual_list_ptr)
7439 *visual_list_ptr = TRUE;
7441 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7442 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7444 attr_old = *cur_attr_ptr;
7445 char_old = *cur_char_ptr;
7453 /* Set the visual */
7454 attr_idx = *cur_attr_ptr;
7455 char_idx = *cur_char_ptr;
7464 *cur_attr_ptr = attr_idx;
7465 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7471 *cur_char_ptr = char_idx;
7472 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7478 if (*visual_list_ptr)
7481 int d = get_keymap_dir(ch);
7482 byte a = (*cur_attr_ptr & 0x7f);
7483 byte c = *cur_char_ptr;
7485 if (use_bigtile) eff_width = width / 2;
7486 else eff_width = width;
7488 /* Restrict direction */
7489 if ((a == 0) && (ddy[d] < 0)) d = 0;
7490 if ((c == 0) && (ddx[d] < 0)) d = 0;
7491 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7492 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7497 /* Force correct code for both ASCII character and tile */
7498 if (c & 0x80) a |= 0x80;
7500 /* Set the visual */
7505 /* Move the frame */
7506 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7507 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7508 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7509 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7516 /* Visual mode command is not used */
7522 * Display the monsters in a group.
7524 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7525 int mon_cur, int mon_top)
7529 /* Display lines until done */
7530 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7536 /* Get the race index */
7537 int r_idx = mon_idx[mon_top + i] ;
7539 /* Access the race */
7540 monster_race *r_ptr = &r_info[r_idx];
7543 /* Choose a color */
7544 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7546 /* Display the name */
7547 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7549 /* Hack -- visual_list mode */
7552 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7554 else if (p_ptr->wizard)
7556 c_prt(attr, format("%d", r_idx), row + i, 60);
7561 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7563 /* Display symbol */
7564 Term_putch(70, row + i, a, c);
7567 if (use_bigtile) Term_putch(70 + 1, row + i, a2, c2);
7570 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7572 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7574 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7579 /* Clear remaining lines */
7580 for (; i < per_page; i++)
7582 Term_erase(col, row + i, 255);
7588 * Display known monsters.
7590 static void do_cmd_knowledge_monsters(void)
7593 int grp_cur, grp_top, old_grp_cur;
7594 int mon_cur, mon_top;
7595 int grp_cnt, grp_idx[100];
7603 bool visual_list = FALSE;
7604 byte attr_top = 0, char_left = 0;
7610 Term_get_size(&wid, &hgt);
7612 browser_rows = hgt - 8;
7614 /* Allocate the "mon_idx" array */
7615 C_MAKE(mon_idx, max_r_idx, s16b);
7620 /* Check every group */
7621 for (i = 0; monster_group_text[i] != NULL; i++)
7623 /* Measure the label */
7624 len = strlen(monster_group_text[i]);
7626 /* Save the maximum length */
7627 if (len > max) max = len;
7629 /* See if any monsters are known */
7630 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7632 /* Build a list of groups with known monsters */
7633 grp_idx[grp_cnt++] = i;
7637 /* Terminate the list */
7638 grp_idx[grp_cnt] = -1;
7641 grp_cur = grp_top = 0;
7642 mon_cur = mon_top = 0;
7651 monster_race *r_ptr;
7658 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7659 prt("¥°¥ë¡¼¥×", 4, 0);
7660 prt("̾Á°", 4, max + 3);
7661 if (p_ptr->wizard) prt("Idx", 4, 60);
7662 prt("ʸ»ú »¦³²¿ô", 4, 67);
7664 prt("Knowledge - Monsters", 2, 0);
7666 prt("Name", 4, max + 3);
7667 if (p_ptr->wizard) prt("Idx", 4, 60);
7668 prt("Sym Kills", 4, 67);
7671 for (i = 0; i < 78; i++)
7673 Term_putch(i, 5, TERM_WHITE, '=');
7676 for (i = 0; i < browser_rows; i++)
7678 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7684 /* Scroll group list */
7685 if (grp_cur < grp_top) grp_top = grp_cur;
7686 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7688 /* Display a list of monster groups */
7689 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7691 if (old_grp_cur != grp_cur)
7693 old_grp_cur = grp_cur;
7695 /* Get a list of monsters in the current group */
7696 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7699 /* Scroll monster list */
7700 while (mon_cur < mon_top)
7701 mon_top = MAX(0, mon_top - browser_rows/2);
7702 while (mon_cur >= mon_top + browser_rows)
7703 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7707 /* Display a list of monsters in the current group */
7708 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7714 /* Display a monster name */
7715 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7717 /* Display visual list below first monster */
7718 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7723 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7725 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);
7728 /* Get the current monster */
7729 r_ptr = &r_info[mon_idx[mon_cur]];
7731 /* Mega Hack -- track this monster race */
7732 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7734 /* Hack -- handle stuff */
7739 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7743 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7747 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7752 /* Do visual mode command if needed */
7753 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;
7766 /* Recall on screen */
7767 if (mon_idx[mon_cur])
7769 screen_roff(mon_idx[mon_cur], 0);
7780 /* Move the cursor */
7781 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7788 /* Free the "mon_idx" array */
7789 C_KILL(mon_idx, max_r_idx, s16b);
7794 * Display the objects in a group.
7796 static void display_object_list(int col, int row, int per_page, int object_idx[],
7797 int object_cur, int object_top)
7801 /* Display lines until done */
7802 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7808 /* Get the object index */
7809 int k_idx = object_idx[object_top + i];
7811 /* Access the object */
7812 object_kind *k_ptr = &k_info[k_idx];
7814 /* Choose a color */
7815 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7816 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7818 attr = ((i + object_top == object_cur) ? cursor : attr);
7821 strip_name(o_name, k_idx);
7823 /* Display the name */
7824 c_prt(attr, o_name, row + i, col);
7826 /* Hack -- visual_list mode */
7829 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7831 else if (p_ptr->wizard)
7833 c_prt(attr, format ("%d", k_idx), row + i, 70);
7836 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7837 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7839 /* Symbol is unknown */
7840 if (!k_ptr->aware && !p_ptr->wizard)
7846 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7848 /* Display symbol */
7849 Term_putch(76, row + i, a, c);
7852 if (use_bigtile) Term_putch(76 + 1, row + i, a2, c2);
7855 /* Clear remaining lines */
7856 for (; i < per_page; i++)
7858 Term_erase(col, row + i, 255);
7863 * Describe fake object
7865 static void desc_obj_fake(int k_idx)
7868 object_type object_type_body;
7870 /* Get local object */
7871 o_ptr = &object_type_body;
7873 /* Wipe the object */
7876 /* Create the artifact */
7877 object_prep(o_ptr, k_idx);
7879 /* It's fully know */
7880 o_ptr->ident |= IDENT_KNOWN;
7882 /* Track the object */
7883 /* object_actual_track(o_ptr); */
7885 /* Hack - mark as fake */
7886 /* term_obj_real = FALSE; */
7888 /* Hack -- Handle stuff */
7891 if (!screen_object(o_ptr, FALSE))
7894 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7896 msg_print("You see nothing special.");
7905 * Display known objects
7907 static void do_cmd_knowledge_objects(void)
7910 int grp_cur, grp_top, old_grp_cur;
7911 int object_old, object_cur, object_top;
7912 int grp_cnt, grp_idx[100];
7920 bool visual_list = FALSE;
7921 byte attr_top = 0, char_left = 0;
7927 Term_get_size(&wid, &hgt);
7929 browser_rows = hgt - 8;
7931 /* Allocate the "object_idx" array */
7932 C_MAKE(object_idx, max_k_idx, int);
7937 /* Check every group */
7938 for (i = 0; object_group_text[i] != NULL; i++)
7940 /* Measure the label */
7941 len = strlen(object_group_text[i]);
7943 /* Save the maximum length */
7944 if (len > max) max = len;
7946 /* See if any monsters are known */
7947 if (collect_objects(i, object_idx))
7949 /* Build a list of groups with known monsters */
7950 grp_idx[grp_cnt++] = i;
7954 /* Terminate the list */
7955 grp_idx[grp_cnt] = -1;
7958 grp_cur = grp_top = 0;
7959 object_cur = object_top = 0;
7976 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
7977 prt("¥°¥ë¡¼¥×", 4, 0);
7978 prt("̾Á°", 4, max + 3);
7979 if (p_ptr->wizard) prt("Idx", 4, 70);
7982 prt("Knowledge - objects", 2, 0);
7984 prt("Name", 4, max + 3);
7985 if (p_ptr->wizard) prt("Idx", 4, 70);
7989 for (i = 0; i < 78; i++)
7991 Term_putch(i, 5, TERM_WHITE, '=');
7994 for (i = 0; i < browser_rows; i++)
7996 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8002 /* Scroll group list */
8003 if (grp_cur < grp_top) grp_top = grp_cur;
8004 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8006 /* Display a list of object groups */
8007 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
8009 if (old_grp_cur != grp_cur)
8011 old_grp_cur = grp_cur;
8013 /* Get a list of objects in the current group */
8014 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
8017 /* Scroll object list */
8018 while (object_cur < object_top)
8019 object_top = MAX(0, object_top - browser_rows/2);
8020 while (object_cur >= object_top + browser_rows)
8021 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
8025 /* Display a list of objects in the current group */
8026 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
8030 object_top = object_cur;
8032 /* Display a list of objects in the current group */
8033 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
8035 /* Display visual list below first object */
8036 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8039 /* Get the current object */
8040 k_ptr = &k_info[object_idx[object_cur]];
8042 /* Mega Hack -- track this object */
8043 if (object_cnt) object_kind_track(object_idx[object_cur]);
8047 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8049 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);
8052 /* The "current" object changed */
8053 if (object_old != object_idx[object_cur])
8055 /* Hack -- handle stuff */
8058 /* Remember the "current" object */
8059 object_old = object_idx[object_cur];
8064 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8068 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8072 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8077 /* Do visual mode command if needed */
8078 /* Symbol of objects with flavor cannot be changed */
8079 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;
8092 /* Recall on screen */
8094 desc_obj_fake(object_idx[object_cur]);
8102 /* Move the cursor */
8103 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8109 /* Free the "object_idx" array */
8110 C_KILL(object_idx, max_k_idx, int);
8116 * Display the features in a group.
8118 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8119 int feat_cur, int feat_top)
8123 /* Display lines until done */
8124 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8131 int f_idx = feat_idx[feat_top + i];
8133 /* Access the index */
8134 feature_type *f_ptr = &f_info[f_idx];
8136 /* Choose a color */
8137 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8139 /* Display the name */
8140 c_prt(attr, f_name + f_ptr->name, row + i, col);
8142 /* Hack -- visual_list mode */
8145 c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
8151 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
8153 /* Display symbol */
8154 Term_putch(68, row + i, a, c);
8157 if (use_bigtile) Term_putch(68 + 1, row + i, a2, c2);
8160 /* Clear remaining lines */
8161 for (; i < per_page; i++)
8163 Term_erase(col, row + i, 255);
8169 * Interact with feature visuals.
8171 static void do_cmd_knowledge_features(void)
8174 int grp_cur, grp_top, old_grp_cur;
8175 int feat_cur, feat_top;
8176 int grp_cnt, grp_idx[100];
8184 bool visual_list = FALSE;
8185 byte attr_top = 0, char_left = 0;
8191 Term_get_size(&wid, &hgt);
8193 browser_rows = hgt - 8;
8195 /* Allocate the "feat_idx" array */
8196 C_MAKE(feat_idx, max_f_idx, int);
8201 /* Check every group */
8202 for (i = 0; feature_group_text[i] != NULL; i++)
8204 /* Measure the label */
8205 len = strlen(feature_group_text[i]);
8207 /* Save the maximum length */
8208 if (len > max) max = len;
8210 /* See if any features are known */
8211 if (collect_features(i, feat_idx))
8213 /* Build a list of groups with known features */
8214 grp_idx[grp_cnt++] = i;
8218 /* Terminate the list */
8219 grp_idx[grp_cnt] = -1;
8222 grp_cur = grp_top = 0;
8223 feat_cur = feat_top = 0;
8229 while ((!flag) && (grp_cnt))
8232 feature_type *f_ptr;
8238 prt("Visuals - features", 2, 0);
8240 prt("Name", 4, max + 3);
8243 for (i = 0; i < 78; i++)
8245 Term_putch(i, 5, TERM_WHITE, '=');
8248 for (i = 0; i < browser_rows; i++)
8250 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8256 /* Scroll group list */
8257 if (grp_cur < grp_top) grp_top = grp_cur;
8258 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8260 /* Display a list of feature groups */
8261 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8263 if (old_grp_cur != grp_cur)
8265 old_grp_cur = grp_cur;
8267 /* Get a list of features in the current group */
8268 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8271 /* Scroll feature list */
8272 while (feat_cur < feat_top)
8273 feat_top = MAX(0, feat_top - browser_rows/2);
8274 while (feat_cur >= feat_top + browser_rows)
8275 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8279 /* Display a list of features in the current group */
8280 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
8284 feat_top = feat_cur;
8286 /* Display a list of features in the current group */
8287 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
8289 /* Display visual list below first object */
8290 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8295 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8297 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);
8300 /* Get the current feature */
8301 f_ptr = &f_info[feat_idx[feat_cur]];
8305 place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
8309 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8313 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8318 /* Do visual mode command if needed */
8319 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;
8331 /* Move the cursor */
8332 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8339 if (!grp_cnt) msg_print("No features known.");
8341 /* Free the "feat_idx" array */
8342 C_KILL(feat_idx, max_f_idx, int);
8347 * List wanted monsters
8349 static void do_cmd_knowledge_kubi(void)
8354 char file_name[1024];
8357 /* Open a new file */
8358 fff = my_fopen_temp(file_name, 1024);
8361 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8363 msg_format("Failed to create temporary file %s.", file_name);
8371 bool listed = FALSE;
8374 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8376 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8378 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8380 fprintf(fff, "List of wanted monsters\n");
8382 fprintf(fff, "----------------------------------------------\n");
8384 for (i = 0; i < MAX_KUBI; i++)
8386 if (kubi_r_idx[i] <= 10000)
8388 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8397 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8399 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8404 /* Close the file */
8407 /* Display the file contents */
8409 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8411 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8415 /* Remove the file */
8420 * List virtues & status
8422 static void do_cmd_knowledge_virtues(void)
8426 char file_name[1024];
8429 /* Open a new file */
8430 fff = my_fopen_temp(file_name, 1024);
8433 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8435 msg_format("Failed to create temporary file %s.", file_name);
8444 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8446 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8451 /* Close the file */
8454 /* Display the file contents */
8456 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8458 show_file(TRUE, file_name, "Virtues", 0, 0);
8462 /* Remove the file */
8470 static void do_cmd_knowledge_dungeon(void)
8474 char file_name[1024];
8478 /* Open a new file */
8479 fff = my_fopen_temp(file_name, 1024);
8482 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8484 msg_format("Failed to create temporary file %s.", file_name);
8492 for (i = 1; i < max_d_idx; i++)
8496 if (!d_info[i].maxdepth) continue;
8497 if (!max_dlv[i]) continue;
8498 if (d_info[i].final_guardian)
8500 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8502 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8504 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8506 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8511 /* Close the file */
8514 /* Display the file contents */
8516 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8518 show_file(TRUE, file_name, "Dungeon", 0, 0);
8522 /* Remove the file */
8527 * List virtues & status
8530 static void do_cmd_knowledge_stat(void)
8534 char file_name[1024];
8537 /* Open a new file */
8538 fff = my_fopen_temp(file_name, 1024);
8541 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8543 msg_format("Failed to create temporary file %s.", file_name);
8551 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8552 (2 * p_ptr->hitdie +
8553 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8556 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8557 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8558 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8560 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8561 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8562 fprintf(fff, "Limits of maximum stats\n\n");
8564 for (v_nr = 0; v_nr < 6; v_nr++)
8566 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);
8567 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8573 /* Close the file */
8576 /* Display the file contents */
8578 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8580 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8584 /* Remove the file */
8590 * Print all active quests
8592 static void do_cmd_knowledge_quests_current(FILE *fff)
8595 char rand_tmp_str[120] = "\0";
8597 monster_race *r_ptr;
8599 int rand_level = 100;
8603 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8605 fprintf(fff, "< Current Quest >\n");
8608 for (i = 1; i < max_quests; i++)
8610 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8612 /* Set the quest number temporary */
8613 int old_quest = p_ptr->inside_quest;
8616 /* Clear the text */
8617 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8618 quest_text_line = 0;
8620 p_ptr->inside_quest = i;
8622 /* Get the quest text */
8623 init_flags = INIT_SHOW_TEXT;
8625 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8627 /* Reset the old quest number */
8628 p_ptr->inside_quest = old_quest;
8630 /* No info from "silent" quests */
8631 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8635 if (quest[i].type != QUEST_TYPE_RANDOM)
8637 char note[80] = "\0";
8639 if (quest[i].status == QUEST_STATUS_TAKEN)
8641 switch (quest[i].type)
8643 case QUEST_TYPE_KILL_LEVEL:
8644 case QUEST_TYPE_KILL_ANY_LEVEL:
8645 r_ptr = &r_info[quest[i].r_idx];
8646 strcpy(name, r_name + r_ptr->name);
8647 if (quest[i].max_num > 1)
8650 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8651 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8654 sprintf(note," - kill %d %s, have killed %d.",
8655 quest[i].max_num, name, quest[i].cur_num);
8660 sprintf(note," - %s¤òÅݤ¹¡£",name);
8662 sprintf(note," - kill %s.",name);
8666 case QUEST_TYPE_FIND_ARTIFACT:
8667 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8669 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8671 sprintf(note," - Find out %s.", name);
8675 case QUEST_TYPE_FIND_EXIT:
8677 sprintf(note," - õº÷¤¹¤ë¡£");
8679 sprintf(note," - Search.");
8683 case QUEST_TYPE_KILL_NUMBER:
8685 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8686 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8688 sprintf(note," - Kill %d monsters, have killed %d.",
8689 quest[i].max_num, quest[i].cur_num);
8693 case QUEST_TYPE_KILL_ALL:
8695 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8697 sprintf(note," - Kill all monsters.");
8703 /* Print the quest info */
8705 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8706 quest[i].name, quest[i].level, note);
8708 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8709 quest[i].name, quest[i].level, note);
8712 fprintf(fff, tmp_str);
8714 if (quest[i].status == QUEST_STATUS_COMPLETED)
8717 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8719 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8721 fprintf(fff, tmp_str);
8727 while (quest_text[j][0] && j < 10)
8729 fprintf(fff, " %s\n", quest_text[j]);
8734 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8737 rand_level = quest[i].level;
8739 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8741 /* Print the quest info */
8742 r_ptr = &r_info[quest[i].r_idx];
8743 strcpy(name, r_name + r_ptr->name);
8745 if (quest[i].max_num > 1)
8748 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8749 quest[i].name, quest[i].level,
8750 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8754 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8755 quest[i].name, quest[i].level,
8756 quest[i].max_num, name, quest[i].cur_num);
8762 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8763 quest[i].name, quest[i].level, name);
8765 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8766 quest[i].name, quest[i].level, name);
8774 /* Print the current random quest */
8775 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8778 if (!total) fprintf(fff, " ¤Ê¤·\n");
8780 if (!total) fprintf(fff, " Nothing.\n");
8786 * Print all finished quests
8788 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8795 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8797 fprintf(fff, "< Completed Quest >\n");
8799 for (i = 1; i < max_quests; i++)
8801 int q_idx = quest_num[i];
8803 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8805 if (is_fixed_quest_idx(q_idx))
8807 /* Set the quest number temporary */
8808 int old_quest = p_ptr->inside_quest;
8810 p_ptr->inside_quest = q_idx;
8813 init_flags = INIT_ASSIGN;
8815 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8817 /* Reset the old quest number */
8818 p_ptr->inside_quest = old_quest;
8820 /* No info from "silent" quests */
8821 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8826 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8828 /* Print the quest info */
8830 if (quest[q_idx].complev == 0)
8834 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8836 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8838 r_name+r_info[quest[q_idx].r_idx].name,
8839 quest[q_idx].level);
8845 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8847 " %-40s (Dungeon level: %3d) - level %2d\n",
8849 r_name+r_info[quest[q_idx].r_idx].name,
8851 quest[q_idx].complev);
8856 /* Print the quest info */
8858 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8859 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8861 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8862 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8866 fprintf(fff, tmp_str);
8870 if (!total) fprintf(fff, " ¤Ê¤·\n");
8872 if (!total) fprintf(fff, " Nothing.\n");
8878 * Print all failed quests
8880 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8887 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8889 fprintf(fff, "< Failed Quest >\n");
8891 for (i = 1; i < max_quests; i++)
8893 int q_idx = quest_num[i];
8895 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8897 if (is_fixed_quest_idx(q_idx))
8899 /* Set the quest number temporary */
8900 int old_quest = p_ptr->inside_quest;
8902 p_ptr->inside_quest = q_idx;
8904 /* Get the quest text */
8905 init_flags = INIT_ASSIGN;
8907 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8909 /* Reset the old quest number */
8910 p_ptr->inside_quest = old_quest;
8912 /* No info from "silent" quests */
8913 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8918 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8920 /* Print the quest info */
8922 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8923 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8925 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
8926 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8931 /* Print the quest info */
8933 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8934 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8936 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8937 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8940 fprintf(fff, tmp_str);
8944 if (!total) fprintf(fff, " ¤Ê¤·\n");
8946 if (!total) fprintf(fff, " Nothing.\n");
8952 * Print all random quests
8954 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8961 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
8963 fprintf(fff, "< Remaining Random Quest >\n");
8965 for (i = 1; i < max_quests; i++)
8967 /* No info from "silent" quests */
8968 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8970 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8974 /* Print the quest info */
8976 sprintf(tmp_str, " %s (%d³¬, %s)\n",
8977 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8979 sprintf(tmp_str, " %s (%d, %s)\n",
8980 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8982 fprintf(fff, tmp_str);
8986 if (!total) fprintf(fff, " ¤Ê¤·\n");
8988 if (!total) fprintf(fff, " Nothing.\n");
8993 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8995 int *q_num = (int *)u;
8996 quest_type *qa = &quest[q_num[a]];
8997 quest_type *qb = &quest[q_num[b]];
9002 if (qa->complev < qb->complev) return TRUE;
9003 if (qa->complev > qb->complev) return FALSE;
9004 if (qa->level <= qb->level) return TRUE;
9008 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9010 int *q_num = (int *)u;
9017 q_num[a] = q_num[b];
9023 * Print quest status of all active quests
9025 static void do_cmd_knowledge_quests(void)
9028 char file_name[1024];
9029 int *quest_num, dummy, i;
9031 /* Open a new file */
9032 fff = my_fopen_temp(file_name, 1024);
9036 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9038 msg_format("Failed to create temporary file %s.", file_name);
9044 /* Allocate Memory */
9045 C_MAKE(quest_num, max_quests, int);
9047 /* Sort by compete level */
9048 for (i = 1; i < max_quests; i++) quest_num[i] = i;
9049 ang_sort_comp = ang_sort_comp_quest_num;
9050 ang_sort_swap = ang_sort_swap_quest_num;
9051 ang_sort(quest_num, &dummy, max_quests);
9053 /* Dump Quest Information */
9054 do_cmd_knowledge_quests_current(fff);
9056 do_cmd_knowledge_quests_completed(fff, quest_num);
9058 do_cmd_knowledge_quests_failed(fff, quest_num);
9062 do_cmd_knowledge_quests_wiz_random(fff);
9065 /* Close the file */
9068 /* Display the file contents */
9070 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9072 show_file(TRUE, file_name, "Quest status", 0, 0);
9075 /* Remove the file */
9079 C_KILL(quest_num, max_quests, int);
9086 static void do_cmd_knowledge_home(void)
9091 char file_name[1024];
9093 char o_name[MAX_NLEN];
9096 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9098 /* Open a new file */
9099 fff = my_fopen_temp(file_name, 1024);
9102 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9104 msg_format("Failed to create temporary file %s.", file_name);
9112 /* Print all homes in the different towns */
9113 st_ptr = &town[1].store[STORE_HOME];
9115 /* Home -- if anything there */
9116 if (st_ptr->stock_num)
9121 /* Header with name of the town */
9123 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9125 fprintf(fff, " [Home Inventory]\n");
9128 /* Dump all available items */
9129 for (i = 0; i < st_ptr->stock_num; i++)
9132 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9133 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9134 if (strlen(o_name) <= 80-3)
9136 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9142 for (n = 0, t = o_name; n < 80-3; n++, t++)
9143 if(iskanji(*t)) {t++; n++;}
9144 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9146 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9147 fprintf(fff, " %.77s\n", o_name+n);
9150 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9151 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9156 /* Add an empty line */
9157 fprintf(fff, "\n\n");
9161 /* Close the file */
9164 /* Display the file contents */
9166 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9168 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9172 /* Remove the file */
9178 * Check the status of "autopick"
9180 static void do_cmd_knowledge_autopick(void)
9184 char file_name[1024];
9186 /* Open a new file */
9187 fff = my_fopen_temp(file_name, 1024);
9192 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9194 msg_format("Failed to create temporary file %s.", file_name);
9203 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9205 fprintf(fff, "No preference for auto picker/destroyer.");
9211 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9213 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9217 for (k = 0; k < max_autopick; k++)
9220 byte act = autopick_list[k].action;
9221 if (act & DONT_AUTOPICK)
9229 else if (act & DO_AUTODESTROY)
9237 else if (act & DO_AUTOPICK)
9245 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9254 if (act & DO_DISPLAY)
9255 fprintf(fff, "%11s", format("[%s]", tmp));
9257 fprintf(fff, "%11s", format("(%s)", tmp));
9259 tmp = autopick_line_from_entry(&autopick_list[k]);
9260 fprintf(fff, " %s", tmp);
9264 /* Close the file */
9266 /* Display the file contents */
9268 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9270 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9273 /* Remove the file */
9279 * Interact with "knowledge"
9281 void do_cmd_knowledge(void)
9284 /* File type is "TEXT" */
9285 FILE_TYPE(FILE_TYPE_TEXT);
9286 /* Save the screen */
9288 /* Interact until done */
9293 /* Ask for a choice */
9295 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9296 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9298 prt(format("page %d/2", (p+1)), 2, 65);
9299 prt("Display current knowledge", 3, 0);
9302 /* Give some choices */
9305 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9306 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9307 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9308 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9309 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9310 if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9311 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9312 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9313 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9314 prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5);
9316 prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5);
9317 prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5);
9318 prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5);
9319 prt("(d) ËâË¡¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 9, 5);
9320 prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 10, 5);
9321 prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ ¤Î°ìÍ÷", 11, 5);
9322 prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó ¤Î°ìÍ÷", 12, 5);
9323 prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È ¤Î°ìÍ÷", 13, 5);
9324 prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5);
9328 prt("(1) Display known artifacts", 6, 5);
9329 prt("(2) Display known objects", 7, 5);
9330 prt("(3) Display remaining uniques", 8, 5);
9331 prt("(4) Display known monster", 9, 5);
9332 prt("(5) Display kill count", 10, 5);
9333 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9334 prt("(7) Display current pets", 12, 5);
9335 prt("(8) Display home inventory", 13, 5);
9336 prt("(9) Display *identified* equip.", 14, 5);
9337 prt("(0) Display terrain symbols.", 15, 5);
9339 prt("(a) Display about yourself", 6, 5);
9340 prt("(b) Display mutations", 7, 5);
9341 prt("(c) Display weapon proficiency", 8, 5);
9342 prt("(d) Display spell proficiency", 9, 5);
9343 prt("(e) Display misc. proficiency", 10, 5);
9344 prt("(f) Display virtues", 11, 5);
9345 prt("(g) Display dungeons", 12, 5);
9346 prt("(h) Display current quests", 13, 5);
9347 prt("(i) Display auto pick/destroy", 14, 5);
9352 prt("-³¤¯-", 17, 8);
9353 prt("ESC) È´¤±¤ë", 21, 1);
9354 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9355 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9356 prt("¥³¥Þ¥ó¥É:", 20, 0);
9358 prt("-more-", 17, 8);
9359 prt("ESC) Exit menu", 21, 1);
9360 prt("SPACE) Next page", 21, 30);
9361 /*prt("-) Previous page", 21, 60);*/
9362 prt("Command: ", 20, 0);
9368 if (i == ESCAPE) break;
9371 case ' ': /* Page change */
9375 case '1': /* Artifacts */
9376 do_cmd_knowledge_artifacts();
9378 case '2': /* Objects */
9379 do_cmd_knowledge_objects();
9381 case '3': /* Uniques */
9382 do_cmd_knowledge_uniques();
9384 case '4': /* Monsters */
9385 do_cmd_knowledge_monsters();
9387 case '5': /* Kill count */
9388 do_cmd_knowledge_kill_count();
9390 case '6': /* wanted */
9391 if (!vanilla_town) do_cmd_knowledge_kubi();
9393 case '7': /* Pets */
9394 do_cmd_knowledge_pets();
9396 case '8': /* Home */
9397 do_cmd_knowledge_home();
9399 case '9': /* Resist list */
9400 do_cmd_knowledge_inven();
9402 case '0': /* Feature list */
9403 do_cmd_knowledge_features();
9406 case 'a': /* Max stat */
9407 do_cmd_knowledge_stat();
9409 case 'b': /* Mutations */
9410 do_cmd_knowledge_mutations();
9412 case 'c': /* weapon-exp */
9413 do_cmd_knowledge_weapon_exp();
9415 case 'd': /* spell-exp */
9416 do_cmd_knowledge_spell_exp();
9418 case 'e': /* skill-exp */
9419 do_cmd_knowledge_skill_exp();
9421 case 'f': /* Virtues */
9422 do_cmd_knowledge_virtues();
9424 case 'g': /* Dungeon */
9425 do_cmd_knowledge_dungeon();
9427 case 'h': /* Quests */
9428 do_cmd_knowledge_quests();
9430 case 'i': /* Autopick */
9431 do_cmd_knowledge_autopick();
9433 default: /* Unknown option */
9436 /* Flush messages */
9439 /* Restore the screen */
9445 * Check on the status of an active quest
9447 void do_cmd_checkquest(void)
9449 /* File type is "TEXT" */
9450 FILE_TYPE(FILE_TYPE_TEXT);
9452 /* Save the screen */
9456 do_cmd_knowledge_quests();
9458 /* Restore the screen */
9464 * Display the time and date
9466 void do_cmd_time(void)
9468 int day, hour, min, full, start, end, num;
9475 extract_day_hour_min(&day, &hour, &min);
9477 full = hour * 100 + min;
9485 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9487 strcpy(desc, "It is a strange time.");
9493 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9494 day, (hour % 12 == 0) ? 12 : (hour % 12),
9495 min, (hour < 12) ? "AM" : "PM");
9497 msg_format("This is day %d. The time is %d:%02d %s.",
9498 day, (hour % 12 == 0) ? 12 : (hour % 12),
9499 min, (hour < 12) ? "AM" : "PM");
9504 if (!randint0(10) || p_ptr->image)
9507 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9509 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9516 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9518 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9523 /* Open this file */
9524 fff = my_fopen(buf, "rt");
9529 /* Find this time */
9530 while (!my_fgets(fff, buf, sizeof(buf)))
9532 /* Ignore comments */
9533 if (!buf[0] || (buf[0] == '#')) continue;
9535 /* Ignore invalid lines */
9536 if (buf[1] != ':') continue;
9538 /* Process 'Start' */
9541 /* Extract the starting time */
9542 start = atoi(buf + 2);
9544 /* Assume valid for an hour */
9554 /* Extract the ending time */
9555 end = atoi(buf + 2);
9561 /* Ignore incorrect range */
9562 if ((start > full) || (full > end)) continue;
9564 /* Process 'Description' */
9569 /* Apply the randomizer */
9570 if (!randint0(num)) strcpy(desc, buf + 2);
9580 /* Close the file */