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)
1303 Term_get_size(&wid, &hgt);
1312 /* Total messages */
1315 /* Start on first message */
1318 /* Start at leftmost edge */
1321 /* Save the screen */
1324 /* Process requests until done */
1330 /* Dump up to 20 lines of messages */
1331 for (j = 0; (j < hgt - 4) && (i + j < n); j++)
1333 cptr msg = message_str(i+j);
1335 /* Apply horizontal scroll */
1336 msg = (strlen(msg) >= q) ? (msg + q) : "";
1338 /* Dump the messages, bottom to top */
1339 Term_putstr(0, hgt-j-3, -1, (bool)(i+j < num_now ? TERM_WHITE : TERM_SLATE), msg);
1341 /* Hilite "shower" */
1346 /* Display matches */
1347 while ((str = strstr(str, shower)) != NULL)
1349 int len = strlen(shower);
1351 /* Display the match */
1352 Term_putstr(str-msg, hgt-j-3, len, TERM_YELLOW, shower);
1360 /* Display header XXX XXX XXX */
1363 prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d) ¥ª¥Õ¥»¥Ã¥È(%d)",
1364 i, i+j-1, n, q), 0, 0);
1366 prt(format("Message Recall (%d-%d of %d), Offset %d",
1367 i, i+j-1, n, q), 0, 0);
1371 /* Display prompt (not very informative) */
1373 prt("[ 'p' ¤Ç¹¹¤Ë¸Å¤¤¤â¤Î, 'n' ¤Ç¹¹¤Ë¿·¤·¤¤¤â¤Î, '/' ¤Ç¸¡º÷, ESC ¤ÇÃæÃÇ ]", hgt - 1, 0);
1375 prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0);
1382 /* Exit on Escape */
1383 if (k == ESCAPE) break;
1385 /* Hack -- Save the old index */
1388 /* Horizontal scroll */
1392 q = (q >= 40) ? (q - 40) : 0;
1398 /* Horizontal scroll */
1408 /* Hack -- handle show */
1413 prt("¶¯Ä´: ", hgt - 1, 0);
1415 prt("Show: ", hgt - 1, 0);
1419 /* Get a "shower" string, or continue */
1420 if (!askfor_aux(shower, 80)) continue;
1426 /* Hack -- handle find */
1433 prt("¸¡º÷: ", hgt - 1, 0);
1435 prt("Find: ", hgt - 1, 0);
1439 /* Get a "finder" string, or continue */
1440 if (!askfor_aux(finder, 80)) continue;
1443 strcpy(shower, finder);
1446 for (z = i + 1; z < n; z++)
1448 cptr msg = message_str(z);
1451 if (strstr(msg, finder))
1462 /* Recall 1 older message */
1463 if ((k == '8') || (k == '\n') || (k == '\r'))
1465 /* Go newer if legal */
1466 if (i + 1 < n) i += 1;
1469 /* Recall 10 older messages */
1472 /* Go older if legal */
1473 if (i + 10 < n) i += 10;
1476 /* Recall 20 older messages */
1477 if ((k == 'p') || (k == KTRL('P')) || (k == ' '))
1479 /* Go older if legal */
1480 if (i + 20 < n) i += 20;
1483 /* Recall 20 newer messages */
1484 if ((k == 'n') || (k == KTRL('N')))
1486 /* Go newer (if able) */
1487 i = (i >= 20) ? (i - 20) : 0;
1490 /* Recall 10 newer messages */
1493 /* Go newer (if able) */
1494 i = (i >= 20) ? (i - 20) : 0;
1497 /* Recall 1 newer messages */
1500 /* Go newer (if able) */
1501 i = (i >= 1) ? (i - 1) : 0;
1504 /* Hack -- Error of some kind */
1508 /* Restore the screen */
1515 * Number of cheating options
1522 static option_type cheat_info[CHEAT_MAX] =
1524 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1526 "cheat_peek", "¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1528 "cheat_peek", "Peek into object creation"
1532 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1534 "cheat_hear", "¥â¥ó¥¹¥¿¡¼¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1536 "cheat_hear", "Peek into monster creation"
1540 { &cheat_room, FALSE, 255, 0x04, 0x00,
1542 "cheat_room", "¥À¥ó¥¸¥ç¥ó¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1544 "cheat_room", "Peek into dungeon creation"
1548 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1550 "cheat_xtra", "¤½¤Î¾¤Î»ö¤ò¤Î¤¾¤¸«¤ë"
1552 "cheat_xtra", "Peek into something else"
1556 { &cheat_know, FALSE, 255, 0x10, 0x00,
1558 "cheat_know", "´°Á´¤Ê¥â¥ó¥¹¥¿¡¼¤Î»×¤¤½Ð¤òÃΤë"
1560 "cheat_know", "Know complete monster info"
1564 { &cheat_live, FALSE, 255, 0x20, 0x00,
1566 "cheat_live", "»à¤ò²óÈò¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤¹¤ë"
1568 "cheat_live", "Allow player to avoid death"
1572 { &cheat_save, FALSE, 255, 0x40, 0x00,
1574 "cheat_save", "»à¤ó¤À»þ¥»¡¼¥Ö¤¹¤ë¤«³Îǧ¤¹¤ë"
1576 "cheat_save", "Ask for saving death"
1582 * Interact with some options for cheating
1584 static void do_cmd_options_cheat(cptr info)
1588 int i, k = 0, n = CHEAT_MAX;
1596 /* Interact with the player */
1601 /* Prompt XXX XXX XXX */
1603 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, ESC ¤Ç·èÄê )", info);
1605 sprintf(buf, "%s (RET to advance, y/n to set, ESC to accept) ", info);
1611 /* º¾µ½¥ª¥×¥·¥ç¥ó¤ò¤¦¤Ã¤«¤ê¤¤¤¸¤Ã¤Æ¤·¤Þ¤¦¿Í¤¬¤¤¤ë¤è¤¦¤Ê¤Î¤ÇÃí°Õ */
1612 prt(" << Ãí°Õ >>", 11, 0);
1613 prt(" º¾µ½¥ª¥×¥·¥ç¥ó¤ò°ìÅ٤ǤâÀßÄꤹ¤ë¤È¡¢¥¹¥³¥¢µÏ¿¤¬»Ä¤é¤Ê¤¯¤Ê¤ê¤Þ¤¹¡ª", 12, 0);
1614 prt(" ¸å¤Ë²ò½ü¤·¤Æ¤â¥À¥á¤Ç¤¹¤Î¤Ç¡¢¾¡Íø¼Ô¤òÌܻؤ¹Êý¤Ï¤³¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¤", 13, 0);
1615 prt(" ¤¸¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£", 14, 0);
1617 /* Display the options */
1618 for (i = 0; i < n; i++)
1620 byte a = TERM_WHITE;
1622 /* Color current option */
1623 if (i == k) a = TERM_L_BLUE;
1625 /* Display the option text */
1626 sprintf(buf, "%-48s: %s (%s)",
1627 cheat_info[i].o_desc,
1629 (*cheat_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1631 (*cheat_info[i].o_var ? "yes" : "no "),
1634 cheat_info[i].o_text);
1635 c_prt(a, buf, i + 2, 0);
1638 /* Hilite current option */
1639 move_cursor(k + 2, 50);
1645 * HACK - Try to translate the key into a direction
1646 * to allow using the roguelike keys for navigation.
1648 dir = get_keymap_dir(ch);
1649 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1663 k = (n + k - 1) % n;
1682 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "º¾µ½¥ª¥×¥·¥ç¥ó¤òON¤Ë¤·¤Æ¡¢¥¹¥³¥¢¤ò»Ä¤»¤Ê¤¯¤Ê¤Ã¤¿¡£");
1684 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "give up sending score to use cheating options.");
1686 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1687 (*cheat_info[k].o_var) = TRUE;
1696 (*cheat_info[k].o_var) = FALSE;
1704 strnfmt(buf, sizeof(buf), "joption.txt#%s", cheat_info[k].o_text);
1706 strnfmt(buf, sizeof(buf), "option.txt#%s", cheat_info[k].o_text);
1708 /* Peruse the help file */
1709 (void)show_file(TRUE, buf, NULL, 0, 0);
1725 static option_type autosave_info[2] =
1727 { &autosave_l, FALSE, 255, 0x01, 0x00,
1729 "autosave_l", "¿·¤·¤¤³¬¤ËÆþ¤ëÅ٤˼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1731 "autosave_l", "Autosave when entering new levels" },
1735 { &autosave_t, FALSE, 255, 0x02, 0x00,
1737 "autosave_t", "°ìÄ꥿¡¼¥óËè¤Ë¼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1739 "autosave_t", "Timed autosave" },
1745 static s16b toggle_frequency(s16b current)
1750 case 50: return 100;
1751 case 100: return 250;
1752 case 250: return 500;
1753 case 500: return 1000;
1754 case 1000: return 2500;
1755 case 2500: return 5000;
1756 case 5000: return 10000;
1757 case 10000: return 25000;
1764 * Interact with some options for cheating
1766 static void do_cmd_options_autosave(cptr info)
1770 int i, k = 0, n = 2;
1778 /* Interact with the player */
1781 /* Prompt XXX XXX XXX */
1783 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, F ¤ÇÉÑÅÙ¤òÆþÎÏ, ESC ¤Ç·èÄê ) ", info);
1785 sprintf(buf, "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) ", info);
1790 /* Display the options */
1791 for (i = 0; i < n; i++)
1793 byte a = TERM_WHITE;
1795 /* Color current option */
1796 if (i == k) a = TERM_L_BLUE;
1798 /* Display the option text */
1799 sprintf(buf, "%-48s: %s (%s)",
1800 autosave_info[i].o_desc,
1802 (*autosave_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1804 (*autosave_info[i].o_var ? "yes" : "no "),
1807 autosave_info[i].o_text);
1808 c_prt(a, buf, i + 2, 0);
1812 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè", autosave_freq), 5, 0);
1814 prt(format("Timed autosave frequency: every %d turns", autosave_freq), 5, 0);
1819 /* Hilite current option */
1820 move_cursor(k + 2, 50);
1836 k = (n + k - 1) % n;
1854 (*autosave_info[k].o_var) = TRUE;
1863 (*autosave_info[k].o_var) = FALSE;
1871 autosave_freq = toggle_frequency(autosave_freq);
1873 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè",
1874 autosave_freq), 5, 0);
1876 prt(format("Timed autosave frequency: every %d turns",
1877 autosave_freq), 5, 0);
1885 (void)show_file(TRUE, "joption.txt#Autosave", NULL, 0, 0);
1887 (void)show_file(TRUE, "option.txt#Autosave", NULL, 0, 0);
1905 #define PAGE_BIRTH 6
1906 #define PAGE_AUTODESTROY 7
1909 * Interact with some options
1911 void do_cmd_options_aux(int page, cptr info)
1914 int i, k = 0, n = 0, l;
1917 bool browse_only = (page == PAGE_BIRTH) && character_generated &&
1918 (!p_ptr->wizard || !allow_debug_opts);
1921 /* Lookup the options */
1922 for (i = 0; i < 24; i++) opt[i] = 0;
1924 /* Scan the options */
1925 for (i = 0; option_info[i].o_desc; i++)
1927 /* Notice options on this "page" */
1928 if (option_info[i].o_page == page) opt[n++] = i;
1935 /* Interact with the player */
1940 /* Prompt XXX XXX XXX */
1942 sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, %sESC:½ªÎ», ?:¥Ø¥ë¥×) ", info, browse_only ? "" : "y/n:Êѹ¹, ");
1944 sprintf(buf, "%s (RET:next, %s, ?:help) ", info, browse_only ? "ESC:exit" : "y/n:change, ESC:accept");
1950 /* HACK -- description for easy-auto-destroy options */
1952 if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤¤Î¤ß͸ú", 6, 6);
1954 if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
1957 /* Display the options */
1958 for (i = 0; i < n; i++)
1960 byte a = TERM_WHITE;
1962 /* Color current option */
1963 if (i == k) a = TERM_L_BLUE;
1965 /* Display the option text */
1966 sprintf(buf, "%-48s: %s (%.19s)",
1967 option_info[opt[i]].o_desc,
1969 (*option_info[opt[i]].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1971 (*option_info[opt[i]].o_var ? "yes" : "no "),
1974 option_info[opt[i]].o_text);
1975 if ((page == PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1976 else c_prt(a, buf, i + 2, 0);
1979 if ((page == PAGE_AUTODESTROY) && (k > 2)) l = 3;
1982 /* Hilite current option */
1983 move_cursor(k + 2 + l, 50);
1989 * HACK - Try to translate the key into a direction
1990 * to allow using the roguelike keys for navigation.
1992 dir = get_keymap_dir(ch);
1993 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
2007 k = (n + k - 1) % n;
2024 if (browse_only) break;
2025 (*option_info[opt[k]].o_var) = TRUE;
2034 if (browse_only) break;
2035 (*option_info[opt[k]].o_var) = FALSE;
2043 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
2050 strnfmt(buf, sizeof(buf), "joption.txt#%s", option_info[opt[k]].o_text);
2052 strnfmt(buf, sizeof(buf), "option.txt#%s", option_info[opt[k]].o_text);
2054 /* Peruse the help file */
2055 (void)show_file(TRUE, buf, NULL, 0, 0);
2072 * Modify the "window" options
2074 static void do_cmd_options_win(void)
2088 /* Memorize old flags */
2089 for (j = 0; j < 8; j++)
2091 /* Acquire current flags */
2092 old_flag[j] = window_flag[j];
2102 /* Prompt XXX XXX XXX */
2104 prt("¥¦¥£¥ó¥É¥¦¡¦¥Õ¥é¥° (<Êý¸þ>¤Ç°ÜÆ°, t¤Ç¥Á¥§¥ó¥¸, y/n ¤Ç¥»¥Ã¥È, ESC)", 0, 0);
2106 prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
2110 /* Display the windows */
2111 for (j = 0; j < 8; j++)
2113 byte a = TERM_WHITE;
2115 cptr s = angband_term_name[j];
2118 if (j == x) a = TERM_L_BLUE;
2120 /* Window name, staggered, centered */
2121 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
2124 /* Display the options */
2125 for (i = 0; i < 16; i++)
2127 byte a = TERM_WHITE;
2129 cptr str = window_flag_desc[i];
2132 if (i == y) a = TERM_L_BLUE;
2136 if (!str) str = "(̤»ÈÍÑ)";
2138 if (!str) str = "(Unused option)";
2143 Term_putstr(0, i + 5, -1, a, str);
2145 /* Display the windows */
2146 for (j = 0; j < 8; j++)
2148 byte a = TERM_WHITE;
2153 if ((i == y) && (j == x)) a = TERM_L_BLUE;
2156 if (window_flag[j] & (1L << i)) c = 'X';
2159 Term_putch(35 + j * 5, i + 5, a, c);
2164 Term_gotoxy(35 + x * 5, y + 5);
2182 for (j = 0; j < 8; j++)
2184 window_flag[j] &= ~(1L << y);
2188 for (i = 0; i < 16; i++)
2190 window_flag[x] &= ~(1L << i);
2203 window_flag[x] |= (1L << y);
2211 window_flag[x] &= ~(1L << y);
2218 (void)show_file(TRUE, "joption.txt#Window", NULL, 0, 0);
2220 (void)show_file(TRUE, "option.txt#Window", NULL, 0, 0);
2230 d = get_keymap_dir(ch);
2232 x = (x + ddx[d] + 8) % 8;
2233 y = (y + ddy[d] + 16) % 16;
2240 /* Notice changes */
2241 for (j = 0; j < 8; j++)
2246 if (!angband_term[j]) continue;
2248 /* Ignore non-changes */
2249 if (window_flag[j] == old_flag[j]) continue;
2252 Term_activate(angband_term[j]);
2269 * Set or unset various options.
2271 * The user must use the "Ctrl-R" command to "adapt" to changes
2272 * in any options which control "visual" aspects of the game.
2274 void do_cmd_options(void)
2279 /* Save the screen */
2288 /* Why are we here */
2290 prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 1, 0);
2292 prt("Options", 1, 0);
2296 /* Give some choices */
2298 prt("(1) ¥¡¼ÆþÎÏ ¥ª¥×¥·¥ç¥ó", 2, 5);
2299 prt("(2) ²èÌ̽ÐÎÏ ¥ª¥×¥·¥ç¥ó", 3, 5);
2300 prt("(3) ¥²¡¼¥à¥×¥ì¥¤ ¥ª¥×¥·¥ç¥ó", 4, 5);
2301 prt("(4) ¹ÔÆ°Ãæ»ß´Ø·¸ ¥ª¥×¥·¥ç¥ó", 5, 5);
2302 prt("(5) ¸úΨ²½ ¥ª¥×¥·¥ç¥ó", 6, 5);
2303 prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ ¥ª¥×¥·¥ç¥ó", 7, 5);
2304 prt("(R) ¥×¥ì¥¤µÏ¿ ¥ª¥×¥·¥ç¥ó", 8, 5);
2306 /* Special choices */
2307 prt("(P) ¼«Æ°½¦¤¤¥¨¥Ç¥£¥¿", 10, 5);
2308 prt("(D) ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 11, 5);
2309 prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 12, 5);
2310 prt("(M) ÄãËâÎÏ¿§ïçÃÍ", 13, 5);
2311 prt("(A) ¼«Æ°¥»¡¼¥Ö ¥ª¥×¥·¥ç¥ó", 14, 5);
2313 prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
2315 prt("(1) Input Options", 2, 5);
2316 prt("(2) Output Options", 3, 5);
2317 prt("(3) Game-Play Options", 4, 5);
2318 prt("(4) Disturbance Options", 5, 5);
2319 prt("(5) Efficiency Options", 6, 5);
2320 prt("(6) Easy Auto-Destroyer Options", 7, 5);
2321 prt("(R) Play-record Options", 8, 5);
2322 /* Special choices */
2323 prt("(P) Auto-picker/destroyer editor", 10, 5);
2324 prt("(D) Base Delay Factor", 11, 5);
2325 prt("(H) Hitpoint Warning", 12, 5);
2326 prt("(M) Mana Color Threshold", 13, 5);
2327 prt("(A) Autosave Options", 14, 5);
2329 prt("(W) Window Flags", 15, 5);
2332 if (!p_ptr->wizard || !allow_debug_opts)
2336 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó (»²¾È¤Î¤ß)", 16, 5);
2338 prt("(B) Birth Options (Browse Only)", 16, 5);
2345 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó", 16, 5);
2347 prt("(B) Birth Options", 16, 5);
2352 if (p_ptr->noscore || allow_debug_opts)
2356 prt("(C) º¾µ½ ¥ª¥×¥·¥ç¥ó", 17, 5);
2358 prt("(C) Cheating Options", 17, 5);
2365 prt("¥³¥Þ¥ó¥É:", 19, 0);
2367 prt("Command: ", 19, 0);
2375 if (k == ESCAPE) break;
2380 /* General Options */
2383 /* Process the general options */
2385 do_cmd_options_aux(1, "¥¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2387 do_cmd_options_aux(1, "Input Options");
2393 /* General Options */
2396 /* Process the general options */
2398 do_cmd_options_aux(2, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
2400 do_cmd_options_aux(2, "Output Options");
2406 /* Inventory Options */
2411 do_cmd_options_aux(3, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2413 do_cmd_options_aux(3, "Game-Play Options");
2419 /* Disturbance Options */
2424 do_cmd_options_aux(4, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2426 do_cmd_options_aux(4, "Disturbance Options");
2432 /* Efficiency Options */
2437 do_cmd_options_aux(5, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
2439 do_cmd_options_aux(5, "Efficiency Options");
2445 /* Object auto-destruction Options */
2450 do_cmd_options_aux(7, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2452 do_cmd_options_aux(7, "Easy Auto-Destroyer Options");
2457 /* Play-record Options */
2463 do_cmd_options_aux(10, "¥×¥ì¥¤µÏ¿¥ª¥×¥·¥ç¥ó");
2465 do_cmd_options_aux(10, "Play-record Options");
2476 do_cmd_options_aux(6, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
2478 do_cmd_options_aux(6, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
2484 /* Cheating Options */
2487 if (!p_ptr->noscore && !allow_debug_opts)
2489 /* Cheat options are not permitted */
2496 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤¤Ê¤¤¡ª");
2498 do_cmd_options_cheat("Cheaters never win");
2508 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2510 do_cmd_options_autosave("Autosave");
2521 do_cmd_options_win();
2522 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2523 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2524 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2525 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2529 /* Auto-picker/destroyer editor */
2533 do_cmd_edit_autopick();
2537 /* Hack -- Delay Speed */
2543 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
2545 prt("Command: Base Delay Factor", 19, 0);
2549 /* Get a new value */
2552 int msec = delay_factor * delay_factor * delay_factor;
2554 prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2555 delay_factor, msec), 22, 0);
2557 prt(format("Current base delay factor: %d (%d msec)",
2558 delay_factor, msec), 22, 0);
2562 prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2564 prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2568 if (k == ESCAPE) break;
2572 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2574 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2578 else if (isdigit(k)) delay_factor = D2I(k);
2585 /* Hack -- hitpoint warning factor */
2591 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
2593 prt("Command: Hitpoint Warning", 19, 0);
2597 /* Get a new value */
2601 prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2602 hitpoint_warn), 22, 0);
2604 prt(format("Current hitpoint warning: %d0%%",
2605 hitpoint_warn), 22, 0);
2609 prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2611 prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2615 if (k == ESCAPE) break;
2619 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2621 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2625 else if (isdigit(k)) hitpoint_warn = D2I(k);
2632 /* Hack -- mana color factor */
2638 prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
2640 prt("Command: Mana Color Threshold", 19, 0);
2644 /* Get a new value */
2648 prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
2651 prt(format("Current mana color threshold: %d0%%",
2656 prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
2658 prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
2662 if (k == ESCAPE) break;
2666 (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
2668 (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
2672 else if (isdigit(k)) mana_warn = D2I(k);
2681 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2683 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2688 /* Unknown option */
2697 /* Flush messages */
2702 /* Restore the screen */
2705 /* Hack - Redraw equippy chars */
2706 p_ptr->redraw |= (PR_EQUIPPY);
2712 * Ask for a "user pref line" and process it
2714 * XXX XXX XXX Allow absolute file names?
2716 void do_cmd_pref(void)
2723 /* Ask for a "user pref command" */
2725 if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2727 if (!get_string("Pref: ", buf, 80)) return;
2731 /* Process that pref command */
2732 (void)process_pref_file_command(buf);
2735 void do_cmd_pickpref(void)
2741 if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2743 if(!get_check("Reload auto-pick preference file? ")) return;
2746 /* Free old entries */
2749 /* ¥¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2751 sprintf(buf, "picktype-%s.prf", player_name);
2753 sprintf(buf, "pickpref-%s.prf", player_name);
2755 err = process_pickpref_file(buf);
2760 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2762 msg_format("loaded '%s'.", buf);
2766 /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2768 /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2772 err = process_pickpref_file("picktype.prf");
2774 err = process_pickpref_file("pickpref.prf");
2780 msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2782 msg_print("loaded 'pickpref.prf'.");
2789 if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2791 if(err) msg_print("Failed to reload autopick preference.");
2798 * Hack -- append all current macros to the given file
2800 static errr macro_dump(cptr fname)
2802 static cptr mark = "Macro Dump";
2808 /* Build the filename */
2809 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2811 /* File type is "TEXT" */
2812 FILE_TYPE(FILE_TYPE_TEXT);
2814 /* Append to the file */
2815 if (!open_auto_dump(buf, mark)) return (-1);
2819 auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2821 auto_dump_printf("\n# Automatic macro dump\n\n");
2825 for (i = 0; i < macro__num; i++)
2827 /* Extract the action */
2828 ascii_to_text(buf, macro__act[i]);
2830 /* Dump the macro */
2831 auto_dump_printf("A:%s\n", buf);
2833 /* Extract the action */
2834 ascii_to_text(buf, macro__pat[i]);
2836 /* Dump normal macros */
2837 auto_dump_printf("P:%s\n", buf);
2840 auto_dump_printf("\n");
2852 * Hack -- ask for a "trigger" (see below)
2854 * Note the complex use of the "inkey()" function from "util.c".
2856 * Note that both "flush()" calls are extremely important.
2858 static void do_cmd_macro_aux(char *buf)
2868 /* Do not process macros */
2874 /* Read the pattern */
2880 /* Do not process macros */
2883 /* Do not wait for keys */
2886 /* Attempt to read a key */
2897 /* Convert the trigger */
2898 ascii_to_text(tmp, buf);
2900 /* Hack -- display the trigger */
2901 Term_addstr(-1, TERM_WHITE, tmp);
2908 * Hack -- ask for a keymap "trigger" (see below)
2910 * Note that both "flush()" calls are extremely important. This may
2911 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2913 static void do_cmd_macro_aux_keymap(char *buf)
2927 /* Convert to ascii */
2928 ascii_to_text(tmp, buf);
2930 /* Hack -- display the trigger */
2931 Term_addstr(-1, TERM_WHITE, tmp);
2940 * Hack -- append all keymaps to the given file
2942 static errr keymap_dump(cptr fname)
2944 static cptr mark = "Keymap Dump";
2953 if (rogue_like_commands)
2955 mode = KEYMAP_MODE_ROGUE;
2961 mode = KEYMAP_MODE_ORIG;
2965 /* Build the filename */
2966 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2968 /* File type is "TEXT" */
2969 FILE_TYPE(FILE_TYPE_TEXT);
2971 /* Append to the file */
2972 if (!open_auto_dump(buf, mark)) return -1;
2976 auto_dump_printf("\n# ¼«Æ°¥¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2978 auto_dump_printf("\n# Automatic keymap dump\n\n");
2982 for (i = 0; i < 256; i++)
2986 /* Loop up the keymap */
2987 act = keymap_act[mode][i];
2989 /* Skip empty keymaps */
2992 /* Encode the key */
2995 ascii_to_text(key, buf);
2997 /* Encode the action */
2998 ascii_to_text(buf, act);
3000 /* Dump the macro */
3001 auto_dump_printf("A:%s\n", buf);
3002 auto_dump_printf("C:%d:%s\n", mode, key);
3015 * Interact with "macros"
3017 * Note that the macro "action" must be defined before the trigger.
3019 * Could use some helpful instructions on this page. XXX XXX XXX
3021 void do_cmd_macros(void)
3033 if (rogue_like_commands)
3035 mode = KEYMAP_MODE_ROGUE;
3041 mode = KEYMAP_MODE_ORIG;
3044 /* File type is "TEXT" */
3045 FILE_TYPE(FILE_TYPE_TEXT);
3052 /* Process requests until done */
3060 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
3062 prt("Interact with Macros", 2, 0);
3067 /* Describe that action */
3069 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3071 prt("Current action (if any) shown below:", 20, 0);
3075 /* Analyze the current action */
3076 ascii_to_text(buf, macro__buf);
3078 /* Display the current action */
3084 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3086 prt("(1) Load a user pref file", 4, 5);
3091 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
3092 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
3093 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
3094 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
3095 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3096 prt("(7) ¥¡¼ÇÛÃ֤γÎǧ", 10, 5);
3097 prt("(8) ¥¡¼ÇÛÃ֤κîÀ®", 11, 5);
3098 prt("(9) ¥¡¼ÇÛÃ֤κï½ü", 12, 5);
3099 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3101 prt("(2) Append macros to a file", 5, 5);
3102 prt("(3) Query a macro", 6, 5);
3103 prt("(4) Create a macro", 7, 5);
3104 prt("(5) Remove a macro", 8, 5);
3105 prt("(6) Append keymaps to a file", 9, 5);
3106 prt("(7) Query a keymap", 10, 5);
3107 prt("(8) Create a keymap", 11, 5);
3108 prt("(9) Remove a keymap", 12, 5);
3109 prt("(0) Enter a new action", 13, 5);
3112 #endif /* ALLOW_MACROS */
3116 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3118 prt("Command: ", 16, 0);
3126 if (i == ESCAPE) break;
3128 /* Load a 'macro' file */
3135 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3137 prt("Command: Load a user pref file", 16, 0);
3143 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3145 prt("File: ", 18, 0);
3149 /* Default filename */
3150 sprintf(tmp, "%s.prf", player_name);
3152 /* Ask for a file */
3153 if (!askfor_aux(tmp, 80)) continue;
3155 /* Process the given filename */
3156 err = process_pref_file(tmp);
3160 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3162 msg_format("Loaded default '%s'.", tmp);
3169 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3171 msg_format("Failed to load '%s'!");
3177 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3179 msg_format("Loaded '%s'.", tmp);
3191 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3193 prt("Command: Append macros to a file", 16, 0);
3199 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3201 prt("File: ", 18, 0);
3205 /* Default filename */
3206 sprintf(tmp, "%s.prf", player_name);
3208 /* Ask for a file */
3209 if (!askfor_aux(tmp, 80)) continue;
3211 /* Dump the macros */
3212 (void)macro_dump(tmp);
3216 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3218 msg_print("Appended macros.");
3230 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3232 prt("Command: Query a macro", 16, 0);
3238 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3240 prt("Trigger: ", 18, 0);
3244 /* Get a macro trigger */
3245 do_cmd_macro_aux(buf);
3247 /* Acquire action */
3248 k = macro_find_exact(buf);
3255 msg_print("¤½¤Î¥¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3257 msg_print("Found no macro.");
3265 /* Obtain the action */
3266 strcpy(macro__buf, macro__act[k]);
3268 /* Analyze the current action */
3269 ascii_to_text(buf, macro__buf);
3271 /* Display the current action */
3276 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3278 msg_print("Found a macro.");
3284 /* Create a macro */
3289 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3291 prt("Command: Create a macro", 16, 0);
3297 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3299 prt("Trigger: ", 18, 0);
3303 /* Get a macro trigger */
3304 do_cmd_macro_aux(buf);
3311 prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3313 prt("Action: ", 20, 0);
3317 /* Convert to text */
3318 ascii_to_text(tmp, macro__buf);
3320 /* Get an encoded action */
3321 if (askfor_aux(tmp, 80))
3323 /* Convert to ascii */
3324 text_to_ascii(macro__buf, tmp);
3326 /* Link the macro */
3327 macro_add(buf, macro__buf);
3331 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3333 msg_print("Added a macro.");
3339 /* Remove a macro */
3344 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3346 prt("Command: Remove a macro", 16, 0);
3352 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3354 prt("Trigger: ", 18, 0);
3358 /* Get a macro trigger */
3359 do_cmd_macro_aux(buf);
3361 /* Link the macro */
3362 macro_add(buf, buf);
3366 msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3368 msg_print("Removed a macro.");
3378 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3380 prt("Command: Append keymaps to a file", 16, 0);
3386 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3388 prt("File: ", 18, 0);
3392 /* Default filename */
3393 sprintf(tmp, "%s.prf", player_name);
3395 /* Ask for a file */
3396 if (!askfor_aux(tmp, 80)) continue;
3398 /* Dump the macros */
3399 (void)keymap_dump(tmp);
3403 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3405 msg_print("Appended keymaps.");
3410 /* Query a keymap */
3417 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤γÎǧ", 16, 0);
3419 prt("Command: Query a keymap", 16, 0);
3425 prt("²¡¤¹¥¡¼: ", 18, 0);
3427 prt("Keypress: ", 18, 0);
3431 /* Get a keymap trigger */
3432 do_cmd_macro_aux_keymap(buf);
3434 /* Look up the keymap */
3435 act = keymap_act[mode][(byte)(buf[0])];
3442 msg_print("¥¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3444 msg_print("Found no keymap.");
3452 /* Obtain the action */
3453 strcpy(macro__buf, act);
3455 /* Analyze the current action */
3456 ascii_to_text(buf, macro__buf);
3458 /* Display the current action */
3463 msg_print("¥¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3465 msg_print("Found a keymap.");
3471 /* Create a keymap */
3476 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κîÀ®", 16, 0);
3478 prt("Command: Create a keymap", 16, 0);
3484 prt("²¡¤¹¥¡¼: ", 18, 0);
3486 prt("Keypress: ", 18, 0);
3490 /* Get a keymap trigger */
3491 do_cmd_macro_aux_keymap(buf);
3498 prt("¹ÔÆ°: ", 20, 0);
3500 prt("Action: ", 20, 0);
3504 /* Convert to text */
3505 ascii_to_text(tmp, macro__buf);
3507 /* Get an encoded action */
3508 if (askfor_aux(tmp, 80))
3510 /* Convert to ascii */
3511 text_to_ascii(macro__buf, tmp);
3513 /* Free old keymap */
3514 string_free(keymap_act[mode][(byte)(buf[0])]);
3516 /* Make new keymap */
3517 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3521 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3523 msg_print("Added a keymap.");
3529 /* Remove a keymap */
3534 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κï½ü", 16, 0);
3536 prt("Command: Remove a keymap", 16, 0);
3542 prt("²¡¤¹¥¡¼: ", 18, 0);
3544 prt("Keypress: ", 18, 0);
3548 /* Get a keymap trigger */
3549 do_cmd_macro_aux_keymap(buf);
3551 /* Free old keymap */
3552 string_free(keymap_act[mode][(byte)(buf[0])]);
3554 /* Make new keymap */
3555 keymap_act[mode][(byte)(buf[0])] = NULL;
3559 msg_print("¥¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3561 msg_print("Removed a keymap.");
3566 /* Enter a new action */
3571 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3573 prt("Command: Enter a new action", 16, 0);
3577 /* Go to the correct location */
3580 /* Hack -- limit the value */
3583 /* Get an encoded action */
3584 if (!askfor_aux(buf, 80)) continue;
3586 /* Extract an action */
3587 text_to_ascii(macro__buf, buf);
3590 #endif /* ALLOW_MACROS */
3599 /* Flush messages */
3608 static void cmd_visuals_aux(int i, int *num, int max)
3615 sprintf(str, "%d", *num);
3617 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3620 tmp = strtol(str, NULL, 0);
3621 if (tmp >= 0 && tmp < max)
3625 else if (isupper(i))
3626 *num = (*num + max - 1) % max;
3628 *num = (*num + 1) % max;
3634 * Interact with "visuals"
3636 void do_cmd_visuals(void)
3644 const char *empty_symbol = "<< ? >>";
3646 if (use_bigtile) empty_symbol = "<< ?? >>";
3648 /* File type is "TEXT" */
3649 FILE_TYPE(FILE_TYPE_TEXT);
3652 /* Save the screen */
3656 /* Interact until done */
3662 /* Ask for a choice */
3664 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3666 prt("Interact with Visuals", 2, 0);
3670 /* Give some choices */
3672 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3674 prt("(1) Load a user pref file", 4, 5);
3677 #ifdef ALLOW_VISUALS
3679 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
3680 prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 6, 5);
3681 prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 7, 5);
3682 prt("(5) (̤»ÈÍÑ)", 8, 5);
3683 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3684 prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3685 prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3686 prt("(9) (̤»ÈÍÑ)", 12, 5);
3688 prt("(2) Dump monster attr/chars", 5, 5);
3689 prt("(3) Dump object attr/chars", 6, 5);
3690 prt("(4) Dump feature attr/chars", 7, 5);
3691 prt("(5) (unused)", 8, 5);
3692 prt("(6) Change monster attr/chars", 9, 5);
3693 prt("(7) Change object attr/chars", 10, 5);
3694 prt("(8) Change feature attr/chars", 11, 5);
3695 prt("(9) (unused)", 12, 5);
3700 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3702 prt("(0) Reset visuals", 13, 5);
3708 prt("¥³¥Þ¥ó¥É:", 18, 0);
3710 prt("Command: ", 15, 0);
3718 if (i == ESCAPE) break;
3720 /* Load a 'pref' file */
3725 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3727 prt("Command: Load a user pref file", 15, 0);
3733 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3735 prt("File: ", 17, 0);
3739 /* Default filename */
3740 sprintf(tmp, "%s.prf", player_name);
3743 if (!askfor_aux(tmp, 70)) continue;
3745 /* Process the given filename */
3746 (void)process_pref_file(tmp);
3749 #ifdef ALLOW_VISUALS
3751 /* Dump monster attr/chars */
3754 static cptr mark = "Monster attr/chars";
3758 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3760 prt("Command: Dump monster attr/chars", 15, 0);
3766 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3768 prt("File: ", 17, 0);
3772 /* Default filename */
3773 sprintf(tmp, "%s.prf", player_name);
3775 /* Get a filename */
3776 if (!askfor_aux(tmp, 70)) continue;
3778 /* Build the filename */
3779 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3781 /* Append to the file */
3782 if (!open_auto_dump(buf, mark)) continue;
3786 auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3788 auto_dump_printf("\n# Monster attr/char definitions\n\n");
3792 for (i = 1; i < max_r_idx; i++)
3794 monster_race *r_ptr = &r_info[i];
3796 /* Skip non-entries */
3797 if (!r_ptr->name) continue;
3799 /* Dump a comment */
3800 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3802 /* Dump the monster attr/char info */
3803 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3804 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3812 msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3814 msg_print("Dumped monster attr/chars.");
3819 /* Dump object attr/chars */
3822 static cptr mark = "Object attr/chars";
3826 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3828 prt("Command: Dump object attr/chars", 15, 0);
3834 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3836 prt("File: ", 17, 0);
3840 /* Default filename */
3841 sprintf(tmp, "%s.prf", player_name);
3843 /* Get a filename */
3844 if (!askfor_aux(tmp, 70)) continue;
3846 /* Build the filename */
3847 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3849 /* Append to the file */
3850 if (!open_auto_dump(buf, mark)) continue;
3854 auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3856 auto_dump_printf("\n# Object attr/char definitions\n\n");
3860 for (i = 1; i < max_k_idx; i++)
3863 object_kind *k_ptr = &k_info[i];
3865 /* Skip non-entries */
3866 if (!k_ptr->name) continue;
3868 /* Skip entries with flavor */
3869 if (k_ptr->flavor) continue;
3872 strip_name(o_name, i);
3874 /* Dump a comment */
3875 auto_dump_printf("# %s\n", o_name);
3877 /* Dump the object attr/char info */
3878 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3879 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3887 msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3889 msg_print("Dumped object attr/chars.");
3894 /* Dump feature attr/chars */
3897 static cptr mark = "Feature attr/chars";
3901 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3903 prt("Command: Dump feature attr/chars", 15, 0);
3909 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3911 prt("File: ", 17, 0);
3915 /* Default filename */
3916 sprintf(tmp, "%s.prf", player_name);
3918 /* Get a filename */
3919 if (!askfor_aux(tmp, 70)) continue;
3921 /* Build the filename */
3922 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3924 /* Append to the file */
3925 if (!open_auto_dump(buf, mark)) continue;
3929 auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3931 auto_dump_printf("\n# Feature attr/char definitions\n\n");
3935 for (i = 1; i < max_f_idx; i++)
3937 feature_type *f_ptr = &f_info[i];
3939 /* Skip non-entries */
3940 if (!f_ptr->name) continue;
3942 /* Skip mimiccing features */
3943 if (f_ptr->mimic != i) continue;
3945 /* Dump a comment */
3946 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3948 /* Dump the feature attr/char info */
3949 auto_dump_printf("F:%d:0x%02X/0x%02X\n\n", i,
3950 (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3958 msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3960 msg_print("Dumped feature attr/chars.");
3965 /* Modify monster attr/chars */
3972 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3974 prt("Command: Change monster attr/chars", 15, 0);
3978 /* Hack -- query until done */
3981 monster_race *r_ptr = &r_info[r];
3986 byte da = (r_ptr->d_attr);
3987 byte dc = (r_ptr->d_char);
3988 byte ca = (r_ptr->x_attr);
3989 byte cc = (r_ptr->x_char);
3991 /* Label the object */
3993 Term_putstr(5, 17, -1, TERM_WHITE,
3994 format("¥â¥ó¥¹¥¿¡¼ = %d, ̾Á° = %-40.40s",
3995 r, (r_name + r_ptr->name)));
3997 Term_putstr(5, 17, -1, TERM_WHITE,
3998 format("Monster = %d, Name = %-40.40s",
3999 r, (r_name + r_ptr->name)));
4003 /* Label the Default values */
4005 Term_putstr(10, 19, -1, TERM_WHITE,
4006 format("½é´üÃÍ ¿§ / ʸ»ú = %3u / %3u", da, dc));
4008 Term_putstr(10, 19, -1, TERM_WHITE,
4009 format("Default attr/char = %3u / %3u", da, dc));
4012 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4016 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4018 Term_putch(43, 19, a, c);
4019 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4021 /* Label the Current values */
4023 Term_putstr(10, 20, -1, TERM_WHITE,
4024 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3u / %3u", ca, cc));
4026 Term_putstr(10, 20, -1, TERM_WHITE,
4027 format("Current attr/char = %3u / %3u", ca, cc));
4030 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4034 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4036 Term_putch(43, 20, a, c);
4037 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4042 Term_putstr(0, 22, -1, TERM_WHITE,
4043 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4045 Term_putstr(0, 22, -1, TERM_WHITE,
4046 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4053 if (i == ESCAPE) break;
4055 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4056 else if (isupper(i)) c = 'a' + i - 'A';
4062 cmd_visuals_aux(i, &r, max_r_idx);
4065 t = (int)r_ptr->x_attr;
4066 cmd_visuals_aux(i, &t, 256);
4067 r_ptr->x_attr = (byte)t;
4070 t = (int)r_ptr->x_char;
4071 cmd_visuals_aux(i, &t, 256);
4072 r_ptr->x_char = (byte)t;
4078 /* Modify object attr/chars */
4085 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4087 prt("Command: Change object attr/chars", 15, 0);
4091 /* Hack -- query until done */
4094 object_kind *k_ptr = &k_info[k];
4099 byte da = (byte)k_ptr->d_attr;
4100 byte dc = (byte)k_ptr->d_char;
4101 byte ca = (byte)k_ptr->x_attr;
4102 byte cc = (byte)k_ptr->x_char;
4104 /* Label the object */
4106 Term_putstr(5, 17, -1, TERM_WHITE,
4107 format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s",
4108 k, (k_name + k_ptr->name)));
4110 Term_putstr(5, 17, -1, TERM_WHITE,
4111 format("Object = %d, Name = %-40.40s",
4112 k, (k_name + k_ptr->name)));
4116 /* Label the Default values */
4118 Term_putstr(10, 19, -1, TERM_WHITE,
4119 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4121 Term_putstr(10, 19, -1, TERM_WHITE,
4122 format("Default attr/char = %3d / %3d", da, dc));
4125 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4128 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4130 Term_putch(43, 19, a, c);
4131 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4134 /* Label the Current values */
4136 Term_putstr(10, 20, -1, TERM_WHITE,
4137 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4139 Term_putstr(10, 20, -1, TERM_WHITE,
4140 format("Current attr/char = %3d / %3d", ca, cc));
4143 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4146 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4148 Term_putch(43, 20, a, c);
4149 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4154 Term_putstr(0, 22, -1, TERM_WHITE,
4155 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4157 Term_putstr(0, 22, -1, TERM_WHITE,
4158 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4165 if (i == ESCAPE) break;
4167 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4168 else if (isupper(i)) c = 'a' + i - 'A';
4174 cmd_visuals_aux(i, &k, max_k_idx);
4177 t = (int)k_info[k].x_attr;
4178 cmd_visuals_aux(i, &t, 256);
4179 k_info[k].x_attr = (byte)t;
4182 t = (int)k_info[k].x_char;
4183 cmd_visuals_aux(i, &t, 256);
4184 k_info[k].x_char = (byte)t;
4190 /* Modify feature attr/chars */
4197 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4199 prt("Command: Change feature attr/chars", 15, 0);
4203 /* Hack -- query until done */
4206 feature_type *f_ptr = &f_info[f];
4211 byte da = (byte)f_ptr->d_attr;
4212 byte dc = (byte)f_ptr->d_char;
4213 byte ca = (byte)f_ptr->x_attr;
4214 byte cc = (byte)f_ptr->x_char;
4216 /* Label the object */
4218 Term_putstr(5, 17, -1, TERM_WHITE,
4219 format("ÃÏ·Á = %d, ̾Á° = %-40.40s",
4220 f, (f_name + f_ptr->name)));
4222 Term_putstr(5, 17, -1, TERM_WHITE,
4223 format("Terrain = %d, Name = %-40.40s",
4224 f, (f_name + f_ptr->name)));
4228 /* Label the Default values */
4230 Term_putstr(10, 19, -1, TERM_WHITE,
4231 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4233 Term_putstr(10, 19, -1, TERM_WHITE,
4234 format("Default attr/char = %3d / %3d", da, dc));
4237 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4240 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4242 Term_putch(43, 19, a, c);
4243 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4246 /* Label the Current values */
4248 Term_putstr(10, 20, -1, TERM_WHITE,
4249 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4251 Term_putstr(10, 20, -1, TERM_WHITE,
4252 format("Current attr/char = %3d / %3d", ca, cc));
4255 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4258 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4260 Term_putch(43, 20, a, c);
4261 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4266 Term_putstr(0, 22, -1, TERM_WHITE,
4267 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4269 Term_putstr(0, 22, -1, TERM_WHITE,
4270 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4277 if (i == ESCAPE) break;
4279 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4280 else if (isupper(i)) c = 'a' + i - 'A';
4286 cmd_visuals_aux(i, &f, max_f_idx);
4289 t = (int)f_info[f].x_attr;
4290 cmd_visuals_aux(i, &t, 256);
4291 f_info[f].x_attr = (byte)t;
4294 t = (int)f_info[f].x_char;
4295 cmd_visuals_aux(i, &t, 256);
4296 f_info[f].x_char = (byte)t;
4312 msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4314 msg_print("Visual attr/char tables reset.");
4319 /* Unknown option */
4325 /* Flush messages */
4330 /* Restore the screen */
4336 * Interact with "colors"
4338 void do_cmd_colors(void)
4347 /* File type is "TEXT" */
4348 FILE_TYPE(FILE_TYPE_TEXT);
4351 /* Save the screen */
4355 /* Interact until done */
4361 /* Ask for a choice */
4363 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4365 prt("Interact with Colors", 2, 0);
4369 /* Give some choices */
4371 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4373 prt("(1) Load a user pref file", 4, 5);
4378 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
4379 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4381 prt("(2) Dump colors", 5, 5);
4382 prt("(3) Modify colors", 6, 5);
4389 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4391 prt("Command: ", 8, 0);
4399 if (i == ESCAPE) break;
4401 /* Load a 'pref' file */
4406 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4408 prt("Command: Load a user pref file", 8, 0);
4414 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4416 prt("File: ", 10, 0);
4421 sprintf(tmp, "%s.prf", player_name);
4424 if (!askfor_aux(tmp, 70)) continue;
4426 /* Process the given filename */
4427 (void)process_pref_file(tmp);
4429 /* Mega-Hack -- react to changes */
4430 Term_xtra(TERM_XTRA_REACT, 0);
4432 /* Mega-Hack -- redraw */
4441 static cptr mark = "Colors";
4445 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 8, 0);
4447 prt("Command: Dump colors", 8, 0);
4453 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4455 prt("File: ", 10, 0);
4459 /* Default filename */
4460 sprintf(tmp, "%s.prf", player_name);
4462 /* Get a filename */
4463 if (!askfor_aux(tmp, 70)) continue;
4465 /* Build the filename */
4466 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4468 /* Append to the file */
4469 if (!open_auto_dump(buf, mark)) continue;
4473 auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4475 auto_dump_printf("\n# Color redefinitions\n\n");
4479 for (i = 0; i < 256; i++)
4481 int kv = angband_color_table[i][0];
4482 int rv = angband_color_table[i][1];
4483 int gv = angband_color_table[i][2];
4484 int bv = angband_color_table[i][3];
4489 cptr name = "unknown";
4493 /* Skip non-entries */
4494 if (!kv && !rv && !gv && !bv) continue;
4496 /* Extract the color name */
4497 if (i < 16) name = color_names[i];
4499 /* Dump a comment */
4501 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4503 auto_dump_printf("# Color '%s'\n", name);
4506 /* Dump the monster attr/char info */
4507 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4516 msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
4518 msg_print("Dumped color redefinitions.");
4530 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4532 prt("Command: Modify colors", 8, 0);
4536 /* Hack -- query until done */
4545 /* Exhibit the normal colors */
4546 for (j = 0; j < 16; j++)
4548 /* Exhibit this color */
4549 Term_putstr(j*4, 20, -1, a, "###");
4551 /* Exhibit all colors */
4552 Term_putstr(j*4, 22, -1, j, format("%3d", j));
4555 /* Describe the color */
4557 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4559 name = ((a < 16) ? color_names[a] : "undefined");
4563 /* Describe the color */
4565 Term_putstr(5, 10, -1, TERM_WHITE,
4566 format("¥«¥é¡¼ = %d, ̾Á° = %s", a, name));
4568 Term_putstr(5, 10, -1, TERM_WHITE,
4569 format("Color = %d, Name = %s", a, name));
4573 /* Label the Current values */
4574 Term_putstr(5, 12, -1, TERM_WHITE,
4575 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4576 angband_color_table[a][0],
4577 angband_color_table[a][1],
4578 angband_color_table[a][2],
4579 angband_color_table[a][3]));
4583 Term_putstr(0, 14, -1, TERM_WHITE,
4584 "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4586 Term_putstr(0, 14, -1, TERM_WHITE,
4587 "Command (n/N/k/K/r/R/g/G/b/B): ");
4595 if (i == ESCAPE) break;
4598 if (i == 'n') a = (byte)(a + 1);
4599 if (i == 'N') a = (byte)(a - 1);
4600 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4601 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4602 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4603 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4604 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4605 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4606 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4607 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4609 /* Hack -- react to changes */
4610 Term_xtra(TERM_XTRA_REACT, 0);
4612 /* Hack -- redraw */
4619 /* Unknown option */
4625 /* Flush messages */
4630 /* Restore the screen */
4636 * Note something in the message recall
4638 void do_cmd_note(void)
4647 if (!get_string("¥á¥â: ", buf, 60)) return;
4649 if (!get_string("Note: ", buf, 60)) return;
4653 /* Ignore empty notes */
4654 if (!buf[0] || (buf[0] == ' ')) return;
4656 /* Add the note to the message recall */
4658 msg_format("¥á¥â: %s", buf);
4660 msg_format("Note: %s", buf);
4667 * Mention the current version
4669 void do_cmd_version(void)
4674 msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4675 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4677 msg_format("You are playing Hengband %d.%d.%d.",
4678 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4685 * Array of feeling strings
4687 static cptr do_cmd_feeling_text[11] =
4690 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4692 "Looks like any other level.",
4696 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4698 "You feel there is something special about this level.",
4702 "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4704 "You nearly faint as horrible visions of death fill your mind!",
4708 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4710 "This level looks very dangerous.",
4714 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4716 "You have a very bad feeling...",
4720 "°¤¤Í½´¶¤¬¤¹¤ë...",
4722 "You have a bad feeling...",
4728 "You feel nervous.",
4732 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4734 "You feel your luck is turning...",
4738 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4740 "You don't like the look of this place.",
4744 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4746 "This level looks reasonably safe.",
4750 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4752 "What a boring place..."
4757 static cptr do_cmd_feeling_text_combat[11] =
4760 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4762 "Looks like any other level.",
4766 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4768 "You feel there is something special about this level.",
4772 "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4774 "You nearly faint as horrible visions of death fill your mind!",
4778 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4780 "This level looks very dangerous.",
4784 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4786 "You have a very bad feeling...",
4790 "°¤¤Í½´¶¤¬¤¹¤ë...",
4792 "You have a bad feeling...",
4798 "You feel nervous.",
4802 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4804 "You feel your luck is turning...",
4808 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4810 "You don't like the look of this place.",
4814 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4816 "This level looks reasonably safe.",
4820 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4822 "What a boring place..."
4827 static cptr do_cmd_feeling_text_lucky[11] =
4830 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4831 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4832 "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4833 "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4834 "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4835 "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4836 "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4837 "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤¤¿¤«...",
4838 "¸«¤¿´¶¤¸°¤¯¤Ï¤Ê¤¤...",
4839 "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4840 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4842 "Looks like any other level.",
4843 "You feel there is something special about this level.",
4844 "You have a superb feeling about this level.",
4845 "You have an excellent feeling...",
4846 "You have a very good feeling...",
4847 "You have a good feeling...",
4848 "You feel strangely lucky...",
4849 "You feel your luck is turning...",
4850 "You like the look of this place...",
4851 "This level can't be all bad...",
4852 "What a boring place..."
4858 * Note that "feeling" is set to zero unless some time has passed.
4859 * Note that this is done when the level is GENERATED, not entered.
4861 void do_cmd_feeling(void)
4863 /* Verify the feeling */
4864 if (feeling > 10) feeling = 10;
4866 /* No useful feeling in quests */
4867 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4870 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4872 msg_print("Looks like a typical quest level.");
4878 /* No useful feeling in town */
4879 else if (p_ptr->town_num && !dun_level)
4882 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4884 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4888 msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4890 msg_print("Looks like a strange wilderness.");
4898 msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4900 msg_print("Looks like a typical town.");
4907 /* No useful feeling in the wilderness */
4908 else if (!dun_level)
4911 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4913 msg_print("Looks like a typical wilderness.");
4919 /* Display the feeling */
4920 if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4922 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4924 if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4925 msg_print(do_cmd_feeling_text_combat[feeling]);
4927 msg_print(do_cmd_feeling_text[feeling]);
4932 msg_print(do_cmd_feeling_text[0]);
4939 * Description of each monster group.
4941 static cptr monster_group_text[] =
4944 "¥æ¥Ë¡¼¥¯", /* "Uniques" */
4945 "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
4974 /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4991 /* "¾åµé¥Ç¡¼¥â¥ó", */
5032 /* "Ancient Dragon/Wyrm", */
5041 "Multi-Headed Reptile",
5046 "Reptile/Amphibian",
5047 "Spider/Scorpion/Tick",
5049 /* "Major Demon", */
5065 * Symbols of monsters in each group. Note the "Uniques" group
5066 * is handled differently.
5068 static cptr monster_group_char[] =
5123 "$!?=&`.|/\\~[]()>",
5132 * hook function to sort monsters by level
5134 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5136 u16b *who = (u16b*)(u);
5141 monster_race *r_ptr1 = &r_info[w1];
5142 monster_race *r_ptr2 = &r_info[w2];
5147 if (r_ptr2->level > r_ptr1->level) return TRUE;
5148 if (r_ptr1->level > r_ptr2->level) return FALSE;
5150 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5151 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5156 * Build a list of monster indexes in the given group. Return the number
5157 * of monsters in the group.
5159 * mode & 0x01 : check for non-empty group
5160 * mode & 0x02 : cheat?
5162 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5167 /* Get a list of x_char in this group */
5168 cptr group_char = monster_group_char[grp_cur];
5170 /* XXX Hack -- Check if this is the "Uniques" group */
5171 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5173 /* XXX Hack -- Check if this is the "Riding" group */
5174 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
5176 /* Check every race */
5177 for (i = 0; i < max_r_idx; i++)
5179 /* Access the race */
5180 monster_race *r_ptr = &r_info[i];
5182 /* Skip empty race */
5183 if (!r_ptr->name) continue ;
5185 /* Require known monsters */
5186 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5190 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5193 else if (grp_riding)
5195 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
5200 /* Check for race in the group */
5201 if (!strchr(group_char, r_ptr->d_char)) continue;
5205 mon_idx[mon_cnt++] = i;
5207 /* XXX Hack -- Just checking for non-empty group */
5208 if (mode & 0x01) break;
5211 /* Terminate the list */
5212 mon_idx[mon_cnt] = 0;
5214 /* Select the sort method */
5215 ang_sort_comp = ang_sort_comp_monster_level;
5216 ang_sort_swap = ang_sort_swap_hook;
5218 /* Sort by monster level */
5219 ang_sort(mon_idx, &dummy_why, mon_cnt);
5221 /* Return the number of races */
5227 * Description of each monster group.
5229 static cptr object_group_text[] =
5232 "¥¥Î¥³", /* "Mushrooms" */
5233 "Ìô", /* "Potions" */
5234 "Ìý¤Ä¤Ü", /* "Flasks" */
5235 "´¬Êª", /* "Scrolls" */
5236 "»ØÎØ", /* "Rings" */
5237 "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5238 "ū", /* "Whistle" */
5239 "¸÷¸»", /* "Lanterns" */
5240 "ËâË¡ËÀ", /* "Wands" */
5241 "¾ó", /* "Staffs" */
5242 "¥í¥Ã¥É", /* "Rods" */
5243 "¥«¡¼¥É", /* "Cards" */
5244 "¥¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5253 "Åá·õÎà", /* "Swords" */
5254 "Æß´ï", /* "Blunt Weapons" */
5255 "ĹÊÁÉð´ï", /* "Polearms" */
5256 "ºÎ·¡Æ»¶ñ", /* "Diggers" */
5257 "Èô¤ÓÆ»¶ñ", /* "Bows" */
5261 "·ÚÁõ³»", /* "Soft Armor" */
5262 "½ÅÁõ³»", /* "Hard Armor" */
5263 "¥É¥é¥´¥ó³»", /* "Dragon Armor" */
5264 "½â", /* "Shields" */
5265 "¥¯¥í¡¼¥¯", /* "Cloaks" */
5266 "äƼê", /* "Gloves" */
5267 "¥Ø¥ë¥á¥Ã¥È", /* "Helms" */
5268 "´§", /* "Crowns" */
5269 "¥Ö¡¼¥Ä", /* "Boots" */
5317 * TVALs of items in each group
5319 static byte object_group_tval[] =
5359 TV_LIFE_BOOK, /* Hack -- all spellbooks */
5365 * Build a list of monster indexes in the given group. Return the number
5366 * of monsters in the group.
5368 static int collect_objects(int grp_cur, int object_idx[])
5370 int i, j, k, object_cnt = 0;
5372 /* Get a list of x_char in this group */
5373 byte group_tval = object_group_tval[grp_cur];
5375 /* Check every object */
5376 for (i = 0; i < max_k_idx; i++)
5378 /* Access the race */
5379 object_kind *k_ptr = &k_info[i];
5381 /* Skip empty objects */
5382 if (!k_ptr->name) continue;
5384 /* Skip non-flavoured objects */
5385 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5387 /* Skip items with no distribution (special artifacts) */
5388 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5391 /* Require objects ever seen*/
5392 if (!k_ptr->aware && !p_ptr->wizard) continue;
5394 /* Check for race in the group */
5395 if (TV_LIFE_BOOK == group_tval)
5397 /* Hack -- All spell books */
5398 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5401 object_idx[object_cnt++] = i;
5404 else if (k_ptr->tval == group_tval)
5407 object_idx[object_cnt++] = i;
5411 /* Terminate the list */
5412 object_idx[object_cnt] = 0;
5414 /* Return the number of races */
5420 * Description of each feature group.
5422 static cptr feature_group_text[] =
5430 * Build a list of feature indexes in the given group. Return the number
5431 * of features in the group.
5433 static int collect_features(int grp_cur, int *feat_idx)
5435 int i, feat_cnt = 0;
5437 /* Unused; There is a single group. */
5440 /* Check every feature */
5441 for (i = 1; i < max_f_idx; i++)
5443 /* Access the index */
5444 feature_type *f_ptr = &f_info[i];
5446 /* Skip empty index */
5447 if (!f_ptr->name) continue;
5449 /* Skip mimiccing features */
5450 if (f_ptr->mimic != i) continue;
5453 feat_idx[feat_cnt++] = i;
5456 /* Terminate the list */
5457 feat_idx[feat_cnt] = 0;
5459 /* Return the number of races */
5466 * Build a list of monster indexes in the given group. Return the number
5467 * of monsters in the group.
5469 static int collect_artifacts(int grp_cur, int object_idx[])
5471 int i, object_cnt = 0;
5473 /* Get a list of x_char in this group */
5474 byte group_tval = object_group_tval[grp_cur];
5476 /* Check every object */
5477 for (i = 0; i < max_a_idx; i++)
5479 /* Access the artifact */
5480 artifact_type *a_ptr = &a_info[i];
5482 /* Skip empty artifacts */
5483 if (!a_ptr->name) continue;
5485 /* Skip "uncreated" artifacts */
5486 if (!a_ptr->cur_num) continue;
5488 /* Check for race in the group */
5489 if (a_ptr->tval == group_tval)
5492 object_idx[object_cnt++] = i;
5496 /* Terminate the list */
5497 object_idx[object_cnt] = 0;
5499 /* Return the number of races */
5506 * Encode the screen colors
5508 static char hack[17] = "dwsorgbuDWvyRGBU";
5511 static errr photo_fgets(FILE *fff, char *buf, huge n)
5520 if (fgets(tmp, 1024, fff))
5522 /* Convert weirdness */
5523 for (s = tmp; *s; s++)
5525 /* Handle newline */
5536 else if (*s == '\t')
5538 /* Hack -- require room */
5539 if (i + 8 >= n) break;
5541 /* Append a space */
5544 /* Append some more spaces */
5545 while (!(i % 8)) buf[i++] = ' ';
5549 else if (iskanji(*s))
5556 /* Ⱦ³Ñ¤«¤Ê¤ËÂбþ */
5557 else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf))
5564 /* Handle printables */
5585 * Hack -- load a screen dump from a file
5587 void do_cmd_load_screen(void)
5602 Term_get_size(&wid, &hgt);
5604 /* Build the filename */
5605 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5607 /* Append to the file */
5608 fff = my_fopen(buf, "r");
5613 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5615 msg_format("Failed to open %s.", buf);
5622 /* Save the screen */
5625 /* Clear the screen */
5629 /* Load the screen */
5630 for (y = 0; okay && (y < hgt); y++)
5632 /* Get a line of data */
5633 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5636 for (x = 0; x < wid - 1; x++)
5638 /* Put the attr/char */
5639 Term_draw(x, y, TERM_WHITE, buf[x]);
5643 /* Get the blank line */
5644 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5647 /* Dump the screen */
5648 for (y = 0; okay && (y < hgt); y++)
5650 /* Get a line of data */
5651 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5654 for (x = 0; x < wid - 1; x++)
5656 /* Get the attr/char */
5657 (void)(Term_what(x, y, &a, &c));
5659 /* Look up the attr */
5660 for (i = 0; i < 16; i++)
5662 /* Use attr matches */
5663 if (hack[i] == buf[x]) a = i;
5666 /* Put the attr/char */
5667 Term_draw(x, y, a, c);
5672 /* Get the blank line */
5673 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5682 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5684 msg_print("Screen dump loaded.");
5691 /* Restore the screen */
5698 cptr inven_res_label =
5700 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5702 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5707 #define IM_FLAG_STR "¡ö"
5708 #define HAS_FLAG_STR "¡Ü"
5709 #define NO_FLAG_STR "¡¦"
5711 #define IM_FLAG_STR "* "
5712 #define HAS_FLAG_STR "+ "
5713 #define NO_FLAG_STR ". "
5716 #define print_im_or_res_flag(IM, RES) \
5718 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5719 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5722 #define print_flag(TR) \
5724 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5728 /* XTRA HACK RESLIST */
5729 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5731 char o_name[MAX_NLEN];
5732 u32b flgs[TR_FLAG_SIZE];
5734 if (!o_ptr->k_idx) return;
5735 if (o_ptr->tval != tval) return;
5737 /* Identified items only */
5738 if (!object_known_p(o_ptr)) return;
5741 * HACK:Ring of Lordly protection and Dragon equipment
5742 * have random resistances.
5744 if (((o_ptr->tval >= TV_BOW) && (o_ptr->tval<= TV_DRAG_ARMOR) && o_ptr->name2)
5745 || ((o_ptr->tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5746 || ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5747 || ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5748 || ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5749 || ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5750 || ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5751 || o_ptr->art_name || o_ptr->name1)
5754 object_desc(o_name, o_ptr, TRUE, 0);
5756 while (o_name[i] && (i < 26))
5759 if (iskanji(o_name[i])) i++;
5768 o_name[i] = ' '; i++;
5773 fprintf(fff, "%s %s", where, o_name);
5775 if (!(o_ptr->ident & (IDENT_MENTAL)))
5778 fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5780 fputs("-------unknown------------ -------unknown------\n", fff);
5785 object_flags_known(o_ptr, flgs);
5787 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5788 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5789 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5790 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5791 print_flag(TR_RES_POIS);
5792 print_flag(TR_RES_LITE);
5793 print_flag(TR_RES_DARK);
5794 print_flag(TR_RES_SHARDS);
5795 print_flag(TR_RES_SOUND);
5796 print_flag(TR_RES_NETHER);
5797 print_flag(TR_RES_NEXUS);
5798 print_flag(TR_RES_CHAOS);
5799 print_flag(TR_RES_DISEN);
5803 print_flag(TR_RES_BLIND);
5804 print_flag(TR_RES_FEAR);
5805 print_flag(TR_RES_CONF);
5806 print_flag(TR_FREE_ACT);
5807 print_flag(TR_SEE_INVIS);
5808 print_flag(TR_HOLD_LIFE);
5809 print_flag(TR_TELEPATHY);
5810 print_flag(TR_SLOW_DIGEST);
5811 print_flag(TR_REGEN);
5812 print_flag(TR_FEATHER);
5820 fprintf(fff, "%s\n", inven_res_label);
5826 * Display *ID* ed weapons/armors's resistances
5828 static void do_cmd_knowledge_inven(void)
5832 char file_name[1024];
5842 /* Open a new file */
5843 fff = my_fopen_temp(file_name, 1024);
5847 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5849 msg_format("Failed to create temporary file %s.", file_name);
5854 fprintf(fff, "%s\n", inven_res_label);
5856 for (tval = TV_BOW; tval <= TV_RING; tval++)
5860 for (; j < 9; j++) fputc('\n', fff);
5862 fprintf(fff, "%s\n", inven_res_label);
5866 strcpy(where, "Áõ");
5868 strcpy(where, "E ");
5870 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5872 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5876 strcpy(where, "»ý");
5878 strcpy(where, "I ");
5880 for (i = 0; i < INVEN_PACK; i++)
5882 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5885 st_ptr = &town[1].store[STORE_HOME];
5887 strcpy(where, "²È");
5889 strcpy(where, "H ");
5892 for (i = 0; i < st_ptr->stock_num; i++)
5894 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5898 /* Close the file */
5901 /* Display the file contents */
5903 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5905 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5908 /* Remove the file */
5913 void do_cmd_save_screen_html_aux(char *filename, int message)
5917 byte a = 0, old_a = 0;
5931 cptr html_head[] = {
5932 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5936 cptr html_foot[] = {
5938 "</body>\n</html>\n",
5944 Term_get_size(&wid, &hgt);
5946 /* File type is "TEXT" */
5947 FILE_TYPE(FILE_TYPE_TEXT);
5949 /* Append to the file */
5950 fff = my_fopen(filename, "w");
5956 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5958 msg_format("Failed to open file %s.", filename);
5966 /* Save the screen */
5970 /* Build the filename */
5971 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5972 tmpfff = my_fopen(buf, "r");
5974 for (i = 0; html_head[i]; i++)
5975 fprintf(fff, html_head[i]);
5979 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5981 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5985 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5987 fprintf(fff, "%s\n", buf);
5992 /* Dump the screen */
5993 for (y = 0; y < hgt; y++)
6000 for (x = 0; x < wid - 1; x++)
6004 /* Get the attr/char */
6005 (void)(Term_what(x, y, &a, &c));
6009 case '&': cc = "&"; break;
6010 case '<': cc = "<"; break;
6011 case '>': cc = ">"; break;
6013 case 0x1f: c = '.'; break;
6014 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
6019 if ((y == 0 && x == 0) || a != old_a) {
6020 rv = angband_color_table[a][1];
6021 gv = angband_color_table[a][2];
6022 bv = angband_color_table[a][3];
6023 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
6024 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
6028 fprintf(fff, "%s", cc);
6030 fprintf(fff, "%c", c);
6033 fprintf(fff, "</font>");
6036 for (i = 0; html_foot[i]; i++)
6037 fprintf(fff, html_foot[i]);
6042 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
6044 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
6048 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
6050 fprintf(fff, "%s\n", buf);
6065 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6067 msg_print("Screen dump saved.");
6072 /* Restore the screen */
6078 * Hack -- save a screen dump to a file
6080 static void do_cmd_save_screen_html(void)
6082 char buf[1024], tmp[256] = "screen.html";
6085 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
6087 if (!get_string("File name: ", tmp, 80))
6091 /* Build the filename */
6092 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
6096 do_cmd_save_screen_html_aux(buf, 1);
6101 * Redefinable "save_screen" action
6103 void (*screendump_aux)(void) = NULL;
6107 * Hack -- save a screen dump to a file
6109 void do_cmd_save_screen(void)
6111 bool old_use_graphics = use_graphics;
6112 bool html_dump = FALSE;
6117 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6119 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6124 if (c == 'Y' || c == 'y')
6126 else if (c == 'H' || c == 'h')
6138 Term_get_size(&wid, &hgt);
6140 if (old_use_graphics)
6142 use_graphics = FALSE;
6145 /* Redraw everything */
6146 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6148 /* Hack -- update */
6154 do_cmd_save_screen_html();
6158 /* Do we use a special screendump function ? */
6159 else if (screendump_aux)
6161 /* Dump the screen to a graphics file */
6162 (*screendump_aux)();
6164 else /* Dump the screen as text */
6175 /* Build the filename */
6176 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6178 /* File type is "TEXT" */
6179 FILE_TYPE(FILE_TYPE_TEXT);
6181 /* Append to the file */
6182 fff = my_fopen(buf, "w");
6188 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6190 msg_format("Failed to open file %s.", buf);
6197 /* Save the screen */
6201 /* Dump the screen */
6202 for (y = 0; y < hgt; y++)
6205 for (x = 0; x < wid - 1; x++)
6207 /* Get the attr/char */
6208 (void)(Term_what(x, y, &a, &c));
6218 fprintf(fff, "%s\n", buf);
6225 /* Dump the screen */
6226 for (y = 0; y < hgt; y++)
6229 for (x = 0; x < wid - 1; x++)
6231 /* Get the attr/char */
6232 (void)(Term_what(x, y, &a, &c));
6235 buf[x] = hack[a&0x0F];
6242 fprintf(fff, "%s\n", buf);
6254 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6256 msg_print("Screen dump saved.");
6262 /* Restore the screen */
6266 if (old_use_graphics)
6268 use_graphics = TRUE;
6271 /* Redraw everything */
6272 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6274 /* Hack -- update */
6281 * Sorting hook -- Comp function -- see below
6283 * We use "u" to point to array of monster indexes,
6284 * and "v" to select the type of sorting to perform on "u".
6286 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6288 u16b *who = (u16b*)(u);
6290 u16b *why = (u16b*)(v);
6297 /* Sort by total kills */
6300 /* Extract total kills */
6301 z1 = a_info[w1].tval;
6302 z2 = a_info[w2].tval;
6304 /* Compare total kills */
6305 if (z1 < z2) return (TRUE);
6306 if (z1 > z2) return (FALSE);
6310 /* Sort by monster level */
6313 /* Extract levels */
6314 z1 = a_info[w1].sval;
6315 z2 = a_info[w2].sval;
6317 /* Compare levels */
6318 if (z1 < z2) return (TRUE);
6319 if (z1 > z2) return (FALSE);
6323 /* Sort by monster experience */
6326 /* Extract experience */
6327 z1 = a_info[w1].level;
6328 z2 = a_info[w2].level;
6330 /* Compare experience */
6331 if (z1 < z2) return (TRUE);
6332 if (z1 > z2) return (FALSE);
6336 /* Compare indexes */
6342 * Sorting hook -- Swap function -- see below
6344 * We use "u" to point to array of monster indexes,
6345 * and "v" to select the type of sorting to perform.
6347 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6349 u16b *who = (u16b*)(u);
6364 * Check the status of "artifacts"
6366 static void do_cmd_knowledge_artifacts(void)
6368 int i, k, z, x, y, n = 0;
6374 char file_name[1024];
6376 char base_name[MAX_NLEN];
6380 /* Open a new file */
6381 fff = my_fopen_temp(file_name, 1024);
6385 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6387 msg_format("Failed to create temporary file %s.", file_name);
6393 /* Allocate the "who" array */
6394 C_MAKE(who, max_a_idx, s16b);
6396 /* Allocate the "okay" array */
6397 C_MAKE(okay, max_a_idx, bool);
6399 /* Scan the artifacts */
6400 for (k = 0; k < max_a_idx; k++)
6402 artifact_type *a_ptr = &a_info[k];
6407 /* Skip "empty" artifacts */
6408 if (!a_ptr->name) continue;
6410 /* Skip "uncreated" artifacts */
6411 if (!a_ptr->cur_num) continue;
6417 /* Check the dungeon */
6418 for (y = 0; y < cur_hgt; y++)
6420 for (x = 0; x < cur_wid; x++)
6422 cave_type *c_ptr = &cave[y][x];
6424 s16b this_o_idx, next_o_idx = 0;
6426 /* Scan all objects in the grid */
6427 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6431 /* Acquire object */
6432 o_ptr = &o_list[this_o_idx];
6434 /* Acquire next object */
6435 next_o_idx = o_ptr->next_o_idx;
6437 /* Ignore non-artifacts */
6438 if (!artifact_p(o_ptr)) continue;
6440 /* Ignore known items */
6441 if (object_known_p(o_ptr)) continue;
6443 /* Note the artifact */
6444 okay[o_ptr->name1] = FALSE;
6449 /* Check the inventory and equipment */
6450 for (i = 0; i < INVEN_TOTAL; i++)
6452 object_type *o_ptr = &inventory[i];
6454 /* Ignore non-objects */
6455 if (!o_ptr->k_idx) continue;
6457 /* Ignore non-artifacts */
6458 if (!artifact_p(o_ptr)) continue;
6460 /* Ignore known items */
6461 if (object_known_p(o_ptr)) continue;
6463 /* Note the artifact */
6464 okay[o_ptr->name1] = FALSE;
6467 for (k = 0; k < max_a_idx; k++)
6469 if (okay[k]) who[n++] = k;
6472 /* Select the sort method */
6473 ang_sort_comp = ang_sort_art_comp;
6474 ang_sort_swap = ang_sort_art_swap;
6476 /* Sort the array by dungeon depth of monsters */
6477 ang_sort(who, &why, n);
6479 /* Scan the artifacts */
6480 for (k = 0; k < n; k++)
6482 artifact_type *a_ptr = &a_info[who[k]];
6486 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6488 strcpy(base_name, "Unknown Artifact");
6492 /* Obtain the base object type */
6493 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6501 /* Get local object */
6504 /* Create fake object */
6505 object_prep(q_ptr, z);
6507 /* Make it an artifact */
6508 q_ptr->name1 = (byte)who[k];
6510 /* Describe the artifact */
6511 object_desc_store(base_name, q_ptr, FALSE, 0);
6514 /* Hack -- Build the artifact name */
6516 fprintf(fff, " %s\n", base_name);
6518 fprintf(fff, " The %s\n", base_name);
6523 /* Free the "who" array */
6524 C_KILL(who, max_a_idx, s16b);
6526 /* Free the "okay" array */
6527 C_KILL(okay, max_a_idx, bool);
6529 /* Close the file */
6532 /* Display the file contents */
6534 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6536 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6540 /* Remove the file */
6546 * Display known uniques
6548 static void do_cmd_knowledge_uniques(void)
6556 char file_name[1024];
6558 /* Open a new file */
6559 fff = my_fopen_temp(file_name, 1024);
6563 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6565 msg_format("Failed to create temporary file %s.", file_name);
6571 /* Allocate the "who" array */
6572 C_MAKE(who, max_r_idx, s16b);
6574 /* Scan the monsters */
6575 for (i = 1; i < max_r_idx; i++)
6577 monster_race *r_ptr = &r_info[i];
6579 /* Use that monster */
6580 if (r_ptr->name) who[n++] = i;
6583 /* Select the sort method */
6584 ang_sort_comp = ang_sort_comp_hook;
6585 ang_sort_swap = ang_sort_swap_hook;
6587 /* Sort the array by dungeon depth of monsters */
6588 ang_sort(who, &why, n);
6590 /* Scan the monster races */
6591 for (k = 0; k < n; k++)
6593 monster_race *r_ptr = &r_info[who[k]];
6595 /* Only print Uniques */
6596 if (r_ptr->flags1 & (RF1_UNIQUE))
6598 bool dead = (r_ptr->max_num == 0);
6602 /* Only display "known" uniques */
6603 if (dead || cheat_know || r_ptr->r_sights)
6605 /* Print a message */
6607 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6608 (r_name + r_ptr->name));
6610 fprintf(fff, " %s is alive\n",
6611 (r_name + r_ptr->name));
6618 /* Free the "who" array */
6619 C_KILL(who, max_r_idx, s16b);
6621 /* Close the file */
6624 /* Display the file contents */
6626 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6628 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6632 /* Remove the file */
6638 * Display weapon-exp
6640 static void do_cmd_knowledge_weapon_exp(void)
6642 int i, j, num, weapon_exp;
6646 char file_name[1024];
6649 /* Open a new file */
6650 fff = my_fopen_temp(file_name, 1024);
6653 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6655 msg_format("Failed to create temporary file %s.", file_name);
6661 for (i = 0; i < 5; i++)
6663 for (num = 0; num < 64; num++)
6665 for (j = 0; j < max_k_idx; j++)
6667 object_kind *k_ptr = &k_info[j];
6669 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6671 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6673 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6675 fprintf(fff, "%-25s ", tmp);
6676 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6677 else fprintf(fff, " ");
6678 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6679 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6687 /* Close the file */
6690 /* Display the file contents */
6692 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6694 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6698 /* Remove the file */
6706 static void do_cmd_knowledge_spell_exp(void)
6708 int i = 0, spell_exp, exp_level;
6713 char file_name[1024];
6715 /* Open a new file */
6716 fff = my_fopen_temp(file_name, 1024);
6719 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6721 msg_format("Failed to create temporary file %s.", file_name);
6727 if (p_ptr->realm1 != REALM_NONE)
6730 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6732 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6734 for (i = 0; i < 32; i++)
6736 if (!is_magic(p_ptr->realm1))
6738 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6742 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6744 if (s_ptr->slevel >= 99) continue;
6745 spell_exp = p_ptr->spell_exp[i];
6746 exp_level = spell_exp_level(spell_exp);
6747 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6748 if (p_ptr->realm1 == REALM_HISSATSU)
6749 fprintf(fff, "[--]");
6752 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6753 else fprintf(fff, " ");
6754 fprintf(fff, "%s", exp_level_str[exp_level]);
6756 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6761 if (p_ptr->realm2 != REALM_NONE)
6764 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6766 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6768 for (i = 0; i < 32; i++)
6770 if (!is_magic(p_ptr->realm1))
6772 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6776 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6778 if (s_ptr->slevel >= 99) continue;
6780 spell_exp = p_ptr->spell_exp[i + 32];
6781 exp_level = spell_exp_level(spell_exp);
6782 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6783 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6784 else fprintf(fff, " ");
6785 fprintf(fff, "%s", exp_level_str[exp_level]);
6786 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6791 /* Close the file */
6794 /* Display the file contents */
6796 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6798 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6802 /* Remove the file */
6810 static void do_cmd_knowledge_skill_exp(void)
6812 int i = 0, skill_exp;
6816 char file_name[1024];
6818 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6820 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6823 /* Open a new file */
6824 fff = my_fopen_temp(file_name, 1024);
6827 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6829 msg_format("Failed to create temporary file %s.", file_name);
6835 for (i = 0; i < 3; i++)
6837 skill_exp = p_ptr->skill_exp[i];
6838 fprintf(fff, "%-20s ", skill_name[i]);
6839 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6840 else fprintf(fff, " ");
6841 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6842 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6846 /* Close the file */
6849 /* Display the file contents */
6851 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6853 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6857 /* Remove the file */
6863 * Pluralize a monster name
6865 void plural_aux(char *Name)
6867 int NameLen = strlen(Name);
6869 if (strstr(Name, "Disembodied hand"))
6871 strcpy(Name, "Disembodied hands that strangled people");
6873 else if (strstr(Name, "Colour out of space"))
6875 strcpy(Name, "Colours out of space");
6877 else if (strstr(Name, "stairway to hell"))
6879 strcpy(Name, "stairways to hell");
6881 else if (strstr(Name, "Dweller on the threshold"))
6883 strcpy(Name, "Dwellers on the threshold");
6885 else if (strstr(Name, " of "))
6887 cptr aider = strstr(Name, " of ");
6898 if (dummy[i-1] == 's')
6900 strcpy(&(dummy[i]), "es");
6905 strcpy(&(dummy[i]), "s");
6908 strcpy(&(dummy[i+1]), aider);
6909 strcpy(Name, dummy);
6911 else if (strstr(Name, "coins"))
6914 strcpy(dummy, "piles of ");
6915 strcat(dummy, Name);
6916 strcpy(Name, dummy);
6919 else if (strstr(Name, "Manes"))
6923 else if (streq(&(Name[NameLen - 2]), "ey"))
6925 strcpy(&(Name[NameLen - 2]), "eys");
6927 else if (Name[NameLen - 1] == 'y')
6929 strcpy(&(Name[NameLen - 1]), "ies");
6931 else if (streq(&(Name[NameLen - 4]), "ouse"))
6933 strcpy(&(Name[NameLen - 4]), "ice");
6935 else if (streq(&(Name[NameLen - 2]), "us"))
6937 strcpy(&(Name[NameLen - 2]), "i");
6939 else if (streq(&(Name[NameLen - 6]), "kelman"))
6941 strcpy(&(Name[NameLen - 6]), "kelmen");
6943 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6945 strcpy(&(Name[NameLen - 8]), "wordsmen");
6947 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6949 strcpy(&(Name[NameLen - 7]), "oodsmen");
6951 else if (streq(&(Name[NameLen - 7]), "eastman"))
6953 strcpy(&(Name[NameLen - 7]), "eastmen");
6955 else if (streq(&(Name[NameLen - 8]), "izardman"))
6957 strcpy(&(Name[NameLen - 8]), "izardmen");
6959 else if (streq(&(Name[NameLen - 5]), "geist"))
6961 strcpy(&(Name[NameLen - 5]), "geister");
6963 else if (streq(&(Name[NameLen - 2]), "ex"))
6965 strcpy(&(Name[NameLen - 2]), "ices");
6967 else if (streq(&(Name[NameLen - 2]), "lf"))
6969 strcpy(&(Name[NameLen - 2]), "lves");
6971 else if (suffix(Name, "ch") ||
6972 suffix(Name, "sh") ||
6973 suffix(Name, "nx") ||
6974 suffix(Name, "s") ||
6977 strcpy(&(Name[NameLen]), "es");
6981 strcpy(&(Name[NameLen]), "s");
6986 * Display current pets
6988 static void do_cmd_knowledge_pets(void)
6992 monster_type *m_ptr;
6995 int show_upkeep = 0;
6996 char file_name[1024];
6999 /* Open a new file */
7000 fff = my_fopen_temp(file_name, 1024);
7003 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7005 msg_format("Failed to create temporary file %s.", file_name);
7011 /* Process the monsters (backwards) */
7012 for (i = m_max - 1; i >= 1; i--)
7014 /* Access the monster */
7017 /* Ignore "dead" monsters */
7018 if (!m_ptr->r_idx) continue;
7020 /* Calculate "upkeep" for pets */
7024 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
7025 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
7029 show_upkeep = calculate_upkeep();
7031 fprintf(fff, "----------------------------------------------\n");
7033 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
7034 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
7036 fprintf(fff, " Total: %d pet%s.\n",
7037 t_friends, (t_friends == 1 ? "" : "s"));
7038 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
7043 /* Close the file */
7046 /* Display the file contents */
7048 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
7050 show_file(TRUE, file_name, "Current Pets", 0, 0);
7054 /* Remove the file */
7062 * Note that the player ghosts are ignored. XXX XXX XXX
7064 static void do_cmd_knowledge_kill_count(void)
7072 char file_name[1024];
7077 /* Open a new file */
7078 fff = my_fopen_temp(file_name, 1024);
7082 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7084 msg_format("Failed to create temporary file %s.", file_name);
7090 /* Allocate the "who" array */
7091 C_MAKE(who, max_r_idx, s16b);
7094 /* Monsters slain */
7097 for (kk = 1; kk < max_r_idx; kk++)
7099 monster_race *r_ptr = &r_info[kk];
7101 if (r_ptr->flags1 & (RF1_UNIQUE))
7103 bool dead = (r_ptr->max_num == 0);
7112 s16b This = r_ptr->r_pkills;
7123 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7125 fprintf(fff,"You have defeated no enemies yet.\n\n");
7128 else if (Total == 1)
7130 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7132 fprintf(fff,"You have defeated one enemy.\n\n");
7137 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7139 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7146 /* Scan the monsters */
7147 for (i = 1; i < max_r_idx; i++)
7149 monster_race *r_ptr = &r_info[i];
7151 /* Use that monster */
7152 if (r_ptr->name) who[n++] = i;
7155 /* Select the sort method */
7156 ang_sort_comp = ang_sort_comp_hook;
7157 ang_sort_swap = ang_sort_swap_hook;
7159 /* Sort the array by dungeon depth of monsters */
7160 ang_sort(who, &why, n);
7162 /* Scan the monster races */
7163 for (k = 0; k < n; k++)
7165 monster_race *r_ptr = &r_info[who[k]];
7167 if (r_ptr->flags1 & (RF1_UNIQUE))
7169 bool dead = (r_ptr->max_num == 0);
7173 /* Print a message */
7174 fprintf(fff, " %s\n",
7175 (r_name + r_ptr->name));
7181 s16b This = r_ptr->r_pkills;
7186 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7187 if(strchr("pt",r_ptr->d_char))
7188 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7190 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7194 if (strstr(r_name + r_ptr->name, "coins"))
7196 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7200 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7206 strcpy(ToPlural, (r_name + r_ptr->name));
7207 plural_aux(ToPlural);
7208 fprintf(fff, " %d %s\n", This, ToPlural);
7218 fprintf(fff,"----------------------------------------------\n");
7220 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7222 fprintf(fff," Total: %lu creature%s killed.\n",
7223 Total, (Total == 1 ? "" : "s"));
7227 /* Free the "who" array */
7228 C_KILL(who, max_r_idx, s16b);
7230 /* Close the file */
7233 /* Display the file contents */
7235 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7237 show_file(TRUE, file_name, "Kill Count", 0, 0);
7241 /* Remove the file */
7247 * Display the object groups.
7249 static void display_group_list(int col, int row, int wid, int per_page,
7250 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7254 /* Display lines until done */
7255 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7257 /* Get the group index */
7258 int grp = grp_idx[grp_top + i];
7260 /* Choose a color */
7261 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7263 /* Erase the entire line */
7264 Term_erase(col, row + i, wid);
7266 /* Display the group label */
7267 c_put_str(attr, group_text[grp], row + i, col);
7273 * Move the cursor in a browser window
7275 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7276 int *list_cur, int list_cnt)
7281 int list = *list_cur;
7283 /* Extract direction */
7286 /* Hack -- scroll up full screen */
7291 /* Hack -- scroll down full screen */
7296 d = get_keymap_dir(ch);
7301 /* Diagonals - hack */
7302 if ((ddx[d] > 0) && ddy[d])
7308 Term_get_size(&wid, &hgt);
7310 browser_rows = hgt - 8;
7312 /* Browse group list */
7317 /* Move up or down */
7318 grp += ddy[d] * (browser_rows - 1);
7321 if (grp >= grp_cnt) grp = grp_cnt - 1;
7322 if (grp < 0) grp = 0;
7323 if (grp != old_grp) list = 0;
7326 /* Browse sub-list list */
7329 /* Move up or down */
7330 list += ddy[d] * browser_rows;
7333 if (list >= list_cnt) list = list_cnt - 1;
7334 if (list < 0) list = 0;
7346 if (col < 0) col = 0;
7347 if (col > 1) col = 1;
7354 /* Browse group list */
7359 /* Move up or down */
7363 if (grp >= grp_cnt) grp = grp_cnt - 1;
7364 if (grp < 0) grp = 0;
7365 if (grp != old_grp) list = 0;
7368 /* Browse sub-list list */
7371 /* Move up or down */
7375 if (list >= list_cnt) list = list_cnt - 1;
7376 if (list < 0) list = 0;
7387 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7391 /* Clear the display lines */
7392 for (i = 0; i < height; i++)
7394 Term_erase(col, row + i, width);
7397 /* Bigtile mode uses double width */
7398 if (use_bigtile) width /= 2;
7400 /* Display lines until done */
7401 for (i = 0; i < height; i++)
7403 /* Display columns until done */
7404 for (j = 0; j < width; j++)
7412 /* Bigtile mode uses double width */
7413 if (use_bigtile) x += j;
7418 /* Ignore illegal characters */
7419 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7420 (!use_graphics && ic > 0x7f))
7426 /* Force correct code for both ASCII character and tile */
7427 if (c & 0x80) a |= 0x80;
7429 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7431 /* Display symbol */
7432 Term_putch(x, y, a, c);
7435 if (use_bigtile) Term_putch(x + 1, y, a2, c2);
7442 * Place the cursor at the collect position for visual mode
7444 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7446 int i = (a & 0x7f) - attr_top;
7447 int j = c - char_left;
7452 /* Bigtile mode uses double width */
7453 if (use_bigtile) x += j;
7455 /* Place the cursor */
7461 * Clipboard variables for copy&paste in visual mode
7463 static byte attr_idx = 0;
7464 static byte char_idx = 0;
7467 * Do visual mode command -- Change symbols
7469 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7470 int height, int width,
7471 byte *attr_top_ptr, byte *char_left_ptr,
7472 byte *cur_attr_ptr, byte *cur_char_ptr)
7474 static byte attr_old = 0, char_old = 0;
7479 if (*visual_list_ptr)
7482 *cur_attr_ptr = attr_old;
7483 *cur_char_ptr = char_old;
7484 *visual_list_ptr = FALSE;
7493 if (*visual_list_ptr)
7496 *visual_list_ptr = FALSE;
7504 if (!*visual_list_ptr)
7506 *visual_list_ptr = TRUE;
7508 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7509 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7511 attr_old = *cur_attr_ptr;
7512 char_old = *cur_char_ptr;
7520 /* Set the visual */
7521 attr_idx = *cur_attr_ptr;
7522 char_idx = *cur_char_ptr;
7531 *cur_attr_ptr = attr_idx;
7532 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7538 *cur_char_ptr = char_idx;
7539 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7545 if (*visual_list_ptr)
7548 int d = get_keymap_dir(ch);
7549 byte a = (*cur_attr_ptr & 0x7f);
7550 byte c = *cur_char_ptr;
7552 if (use_bigtile) eff_width = width / 2;
7553 else eff_width = width;
7555 /* Restrict direction */
7556 if ((a == 0) && (ddy[d] < 0)) d = 0;
7557 if ((c == 0) && (ddx[d] < 0)) d = 0;
7558 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7559 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7564 /* Force correct code for both ASCII character and tile */
7565 if (c & 0x80) a |= 0x80;
7567 /* Set the visual */
7572 /* Move the frame */
7573 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7574 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7575 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7576 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7583 /* Visual mode command is not used */
7589 * Display the monsters in a group.
7591 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7592 int mon_cur, int mon_top)
7596 /* Display lines until done */
7597 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7603 /* Get the race index */
7604 int r_idx = mon_idx[mon_top + i] ;
7606 /* Access the race */
7607 monster_race *r_ptr = &r_info[r_idx];
7610 /* Choose a color */
7611 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7613 /* Display the name */
7614 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7616 /* Hack -- visual_list mode */
7619 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7621 else if (p_ptr->wizard)
7623 c_prt(attr, format("%d", r_idx), row + i, 60);
7628 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7630 /* Display symbol */
7631 Term_putch(70, row + i, a, c);
7634 if (use_bigtile) Term_putch(70 + 1, row + i, a2, c2);
7637 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7639 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7641 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7646 /* Clear remaining lines */
7647 for (; i < per_page; i++)
7649 Term_erase(col, row + i, 255);
7655 * Display known monsters.
7657 static void do_cmd_knowledge_monsters(void)
7660 int grp_cur, grp_top, old_grp_cur;
7661 int mon_cur, mon_top;
7662 int grp_cnt, grp_idx[100];
7670 bool visual_list = FALSE;
7671 byte attr_top = 0, char_left = 0;
7677 Term_get_size(&wid, &hgt);
7679 browser_rows = hgt - 8;
7681 /* Allocate the "mon_idx" array */
7682 C_MAKE(mon_idx, max_r_idx, s16b);
7687 /* Check every group */
7688 for (i = 0; monster_group_text[i] != NULL; i++)
7690 /* Measure the label */
7691 len = strlen(monster_group_text[i]);
7693 /* Save the maximum length */
7694 if (len > max) max = len;
7696 /* See if any monsters are known */
7697 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7699 /* Build a list of groups with known monsters */
7700 grp_idx[grp_cnt++] = i;
7704 /* Terminate the list */
7705 grp_idx[grp_cnt] = -1;
7708 grp_cur = grp_top = 0;
7709 mon_cur = mon_top = 0;
7718 monster_race *r_ptr;
7725 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7726 prt("¥°¥ë¡¼¥×", 4, 0);
7727 prt("̾Á°", 4, max + 3);
7728 if (p_ptr->wizard) prt("Idx", 4, 60);
7729 prt("ʸ»ú »¦³²¿ô", 4, 67);
7731 prt("Knowledge - Monsters", 2, 0);
7733 prt("Name", 4, max + 3);
7734 if (p_ptr->wizard) prt("Idx", 4, 60);
7735 prt("Sym Kills", 4, 67);
7738 for (i = 0; i < 78; i++)
7740 Term_putch(i, 5, TERM_WHITE, '=');
7743 for (i = 0; i < browser_rows; i++)
7745 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7751 /* Scroll group list */
7752 if (grp_cur < grp_top) grp_top = grp_cur;
7753 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7755 /* Display a list of monster groups */
7756 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7758 if (old_grp_cur != grp_cur)
7760 old_grp_cur = grp_cur;
7762 /* Get a list of monsters in the current group */
7763 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7766 /* Scroll monster list */
7767 while (mon_cur < mon_top)
7768 mon_top = MAX(0, mon_top - browser_rows/2);
7769 while (mon_cur >= mon_top + browser_rows)
7770 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7774 /* Display a list of monsters in the current group */
7775 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7781 /* Display a monster name */
7782 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7784 /* Display visual list below first monster */
7785 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7790 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7792 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);
7795 /* Get the current monster */
7796 r_ptr = &r_info[mon_idx[mon_cur]];
7798 /* Mega Hack -- track this monster race */
7799 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7801 /* Hack -- handle stuff */
7806 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7810 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7814 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7819 /* Do visual mode command if needed */
7820 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;
7833 /* Recall on screen */
7834 if (mon_idx[mon_cur])
7836 screen_roff(mon_idx[mon_cur], 0);
7847 /* Move the cursor */
7848 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7855 /* Free the "mon_idx" array */
7856 C_KILL(mon_idx, max_r_idx, s16b);
7861 * Display the objects in a group.
7863 static void display_object_list(int col, int row, int per_page, int object_idx[],
7864 int object_cur, int object_top)
7868 /* Display lines until done */
7869 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7875 /* Get the object index */
7876 int k_idx = object_idx[object_top + i];
7878 /* Access the object */
7879 object_kind *k_ptr = &k_info[k_idx];
7881 /* Choose a color */
7882 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7883 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7885 attr = ((i + object_top == object_cur) ? cursor : attr);
7888 strip_name(o_name, k_idx);
7890 /* Display the name */
7891 c_prt(attr, o_name, row + i, col);
7893 /* Hack -- visual_list mode */
7896 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7898 else if (p_ptr->wizard)
7900 c_prt(attr, format ("%d", k_idx), row + i, 70);
7903 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7904 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7906 /* Symbol is unknown */
7907 if (!k_ptr->aware && !p_ptr->wizard)
7913 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7915 /* Display symbol */
7916 Term_putch(76, row + i, a, c);
7919 if (use_bigtile) Term_putch(76 + 1, row + i, a2, c2);
7922 /* Clear remaining lines */
7923 for (; i < per_page; i++)
7925 Term_erase(col, row + i, 255);
7930 * Describe fake object
7932 static void desc_obj_fake(int k_idx)
7935 object_type object_type_body;
7937 /* Get local object */
7938 o_ptr = &object_type_body;
7940 /* Wipe the object */
7943 /* Create the artifact */
7944 object_prep(o_ptr, k_idx);
7946 /* It's fully know */
7947 o_ptr->ident |= IDENT_KNOWN;
7949 /* Track the object */
7950 /* object_actual_track(o_ptr); */
7952 /* Hack - mark as fake */
7953 /* term_obj_real = FALSE; */
7955 /* Hack -- Handle stuff */
7958 if (!screen_object(o_ptr, FALSE))
7961 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7963 msg_print("You see nothing special.");
7972 * Display known objects
7974 static void do_cmd_knowledge_objects(void)
7977 int grp_cur, grp_top, old_grp_cur;
7978 int object_old, object_cur, object_top;
7979 int grp_cnt, grp_idx[100];
7987 bool visual_list = FALSE;
7988 byte attr_top = 0, char_left = 0;
7994 Term_get_size(&wid, &hgt);
7996 browser_rows = hgt - 8;
7998 /* Allocate the "object_idx" array */
7999 C_MAKE(object_idx, max_k_idx, int);
8004 /* Check every group */
8005 for (i = 0; object_group_text[i] != NULL; i++)
8007 /* Measure the label */
8008 len = strlen(object_group_text[i]);
8010 /* Save the maximum length */
8011 if (len > max) max = len;
8013 /* See if any monsters are known */
8014 if (collect_objects(i, object_idx))
8016 /* Build a list of groups with known monsters */
8017 grp_idx[grp_cnt++] = i;
8021 /* Terminate the list */
8022 grp_idx[grp_cnt] = -1;
8025 grp_cur = grp_top = 0;
8026 object_cur = object_top = 0;
8043 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
8044 prt("¥°¥ë¡¼¥×", 4, 0);
8045 prt("̾Á°", 4, max + 3);
8046 if (p_ptr->wizard) prt("Idx", 4, 70);
8049 prt("Knowledge - objects", 2, 0);
8051 prt("Name", 4, max + 3);
8052 if (p_ptr->wizard) prt("Idx", 4, 70);
8056 for (i = 0; i < 78; i++)
8058 Term_putch(i, 5, TERM_WHITE, '=');
8061 for (i = 0; i < browser_rows; i++)
8063 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8069 /* Scroll group list */
8070 if (grp_cur < grp_top) grp_top = grp_cur;
8071 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8073 /* Display a list of object groups */
8074 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
8076 if (old_grp_cur != grp_cur)
8078 old_grp_cur = grp_cur;
8080 /* Get a list of objects in the current group */
8081 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
8084 /* Scroll object list */
8085 while (object_cur < object_top)
8086 object_top = MAX(0, object_top - browser_rows/2);
8087 while (object_cur >= object_top + browser_rows)
8088 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
8092 /* Display a list of objects in the current group */
8093 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
8097 object_top = object_cur;
8099 /* Display a list of objects in the current group */
8100 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
8102 /* Display visual list below first object */
8103 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8106 /* Get the current object */
8107 k_ptr = &k_info[object_idx[object_cur]];
8109 /* Mega Hack -- track this object */
8110 if (object_cnt) object_kind_track(object_idx[object_cur]);
8114 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8116 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);
8119 /* The "current" object changed */
8120 if (object_old != object_idx[object_cur])
8122 /* Hack -- handle stuff */
8125 /* Remember the "current" object */
8126 object_old = object_idx[object_cur];
8131 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8135 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8139 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8144 /* Do visual mode command if needed */
8145 /* Symbol of objects with flavor cannot be changed */
8146 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;
8159 /* Recall on screen */
8161 desc_obj_fake(object_idx[object_cur]);
8169 /* Move the cursor */
8170 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8176 /* Free the "object_idx" array */
8177 C_KILL(object_idx, max_k_idx, int);
8183 * Display the features in a group.
8185 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8186 int feat_cur, int feat_top)
8190 /* Display lines until done */
8191 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8198 int f_idx = feat_idx[feat_top + i];
8200 /* Access the index */
8201 feature_type *f_ptr = &f_info[f_idx];
8203 /* Choose a color */
8204 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8206 /* Display the name */
8207 c_prt(attr, f_name + f_ptr->name, row + i, col);
8209 /* Hack -- visual_list mode */
8212 c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
8218 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
8220 /* Display symbol */
8221 Term_putch(68, row + i, a, c);
8224 if (use_bigtile) Term_putch(68 + 1, row + i, a2, c2);
8227 /* Clear remaining lines */
8228 for (; i < per_page; i++)
8230 Term_erase(col, row + i, 255);
8236 * Interact with feature visuals.
8238 static void do_cmd_knowledge_features(void)
8241 int grp_cur, grp_top, old_grp_cur;
8242 int feat_cur, feat_top;
8243 int grp_cnt, grp_idx[100];
8251 bool visual_list = FALSE;
8252 byte attr_top = 0, char_left = 0;
8258 Term_get_size(&wid, &hgt);
8260 browser_rows = hgt - 8;
8262 /* Allocate the "feat_idx" array */
8263 C_MAKE(feat_idx, max_f_idx, int);
8268 /* Check every group */
8269 for (i = 0; feature_group_text[i] != NULL; i++)
8271 /* Measure the label */
8272 len = strlen(feature_group_text[i]);
8274 /* Save the maximum length */
8275 if (len > max) max = len;
8277 /* See if any features are known */
8278 if (collect_features(i, feat_idx))
8280 /* Build a list of groups with known features */
8281 grp_idx[grp_cnt++] = i;
8285 /* Terminate the list */
8286 grp_idx[grp_cnt] = -1;
8289 grp_cur = grp_top = 0;
8290 feat_cur = feat_top = 0;
8296 while ((!flag) && (grp_cnt))
8299 feature_type *f_ptr;
8305 prt("Visuals - features", 2, 0);
8307 prt("Name", 4, max + 3);
8310 for (i = 0; i < 78; i++)
8312 Term_putch(i, 5, TERM_WHITE, '=');
8315 for (i = 0; i < browser_rows; i++)
8317 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8323 /* Scroll group list */
8324 if (grp_cur < grp_top) grp_top = grp_cur;
8325 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8327 /* Display a list of feature groups */
8328 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8330 if (old_grp_cur != grp_cur)
8332 old_grp_cur = grp_cur;
8334 /* Get a list of features in the current group */
8335 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8338 /* Scroll feature list */
8339 while (feat_cur < feat_top)
8340 feat_top = MAX(0, feat_top - browser_rows/2);
8341 while (feat_cur >= feat_top + browser_rows)
8342 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8346 /* Display a list of features in the current group */
8347 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
8351 feat_top = feat_cur;
8353 /* Display a list of features in the current group */
8354 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
8356 /* Display visual list below first object */
8357 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8362 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8364 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);
8367 /* Get the current feature */
8368 f_ptr = &f_info[feat_idx[feat_cur]];
8372 place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
8376 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8380 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8385 /* Do visual mode command if needed */
8386 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;
8398 /* Move the cursor */
8399 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8406 if (!grp_cnt) msg_print("No features known.");
8408 /* Free the "feat_idx" array */
8409 C_KILL(feat_idx, max_f_idx, int);
8414 * List wanted monsters
8416 static void do_cmd_knowledge_kubi(void)
8421 char file_name[1024];
8424 /* Open a new file */
8425 fff = my_fopen_temp(file_name, 1024);
8428 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8430 msg_format("Failed to create temporary file %s.", file_name);
8438 bool listed = FALSE;
8441 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8443 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8445 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8447 fprintf(fff, "List of wanted monsters\n");
8449 fprintf(fff, "----------------------------------------------\n");
8451 for (i = 0; i < MAX_KUBI; i++)
8453 if (kubi_r_idx[i] <= 10000)
8455 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8464 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8466 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8471 /* Close the file */
8474 /* Display the file contents */
8476 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8478 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8482 /* Remove the file */
8487 * List virtues & status
8489 static void do_cmd_knowledge_virtues(void)
8493 char file_name[1024];
8496 /* Open a new file */
8497 fff = my_fopen_temp(file_name, 1024);
8500 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8502 msg_format("Failed to create temporary file %s.", file_name);
8511 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8513 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8518 /* Close the file */
8521 /* Display the file contents */
8523 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8525 show_file(TRUE, file_name, "Virtues", 0, 0);
8529 /* Remove the file */
8537 static void do_cmd_knowledge_dungeon(void)
8541 char file_name[1024];
8545 /* Open a new file */
8546 fff = my_fopen_temp(file_name, 1024);
8549 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8551 msg_format("Failed to create temporary file %s.", file_name);
8559 for (i = 1; i < max_d_idx; i++)
8563 if (!d_info[i].maxdepth) continue;
8564 if (!max_dlv[i]) continue;
8565 if (d_info[i].final_guardian)
8567 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8569 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8571 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8573 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8578 /* Close the file */
8581 /* Display the file contents */
8583 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8585 show_file(TRUE, file_name, "Dungeon", 0, 0);
8589 /* Remove the file */
8594 * List virtues & status
8597 static void do_cmd_knowledge_stat(void)
8601 char file_name[1024];
8604 /* Open a new file */
8605 fff = my_fopen_temp(file_name, 1024);
8608 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8610 msg_format("Failed to create temporary file %s.", file_name);
8618 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8619 (2 * p_ptr->hitdie +
8620 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8623 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8624 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8625 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8627 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8628 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8629 fprintf(fff, "Limits of maximum stats\n\n");
8631 for (v_nr = 0; v_nr < 6; v_nr++)
8633 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);
8634 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8640 /* Close the file */
8643 /* Display the file contents */
8645 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8647 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8651 /* Remove the file */
8657 * Print all active quests
8659 static void do_cmd_knowledge_quests_current(FILE *fff)
8662 char rand_tmp_str[120] = "\0";
8664 monster_race *r_ptr;
8666 int rand_level = 100;
8670 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8672 fprintf(fff, "< Current Quest >\n");
8675 for (i = 1; i < max_quests; i++)
8677 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8679 /* Set the quest number temporary */
8680 int old_quest = p_ptr->inside_quest;
8683 /* Clear the text */
8684 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8685 quest_text_line = 0;
8687 p_ptr->inside_quest = i;
8689 /* Get the quest text */
8690 init_flags = INIT_SHOW_TEXT;
8692 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8694 /* Reset the old quest number */
8695 p_ptr->inside_quest = old_quest;
8697 /* No info from "silent" quests */
8698 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8702 if (quest[i].type != QUEST_TYPE_RANDOM)
8704 char note[80] = "\0";
8706 if (quest[i].status == QUEST_STATUS_TAKEN)
8708 switch (quest[i].type)
8710 case QUEST_TYPE_KILL_LEVEL:
8711 case QUEST_TYPE_KILL_ANY_LEVEL:
8712 r_ptr = &r_info[quest[i].r_idx];
8713 strcpy(name, r_name + r_ptr->name);
8714 if (quest[i].max_num > 1)
8717 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8718 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8721 sprintf(note," - kill %d %s, have killed %d.",
8722 quest[i].max_num, name, quest[i].cur_num);
8727 sprintf(note," - %s¤òÅݤ¹¡£",name);
8729 sprintf(note," - kill %s.",name);
8733 case QUEST_TYPE_FIND_ARTIFACT:
8734 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8736 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8738 sprintf(note," - Find out %s.", name);
8742 case QUEST_TYPE_FIND_EXIT:
8744 sprintf(note," - õº÷¤¹¤ë¡£");
8746 sprintf(note," - Search.");
8750 case QUEST_TYPE_KILL_NUMBER:
8752 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8753 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8755 sprintf(note," - Kill %d monsters, have killed %d.",
8756 quest[i].max_num, quest[i].cur_num);
8760 case QUEST_TYPE_KILL_ALL:
8762 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8764 sprintf(note," - Kill all monsters.");
8770 /* Print the quest info */
8772 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8773 quest[i].name, quest[i].level, note);
8775 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8776 quest[i].name, quest[i].level, note);
8779 fprintf(fff, tmp_str);
8781 if (quest[i].status == QUEST_STATUS_COMPLETED)
8784 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8786 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8788 fprintf(fff, tmp_str);
8794 while (quest_text[j][0] && j < 10)
8796 fprintf(fff, " %s\n", quest_text[j]);
8801 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8804 rand_level = quest[i].level;
8806 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8808 /* Print the quest info */
8809 r_ptr = &r_info[quest[i].r_idx];
8810 strcpy(name, r_name + r_ptr->name);
8812 if (quest[i].max_num > 1)
8815 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8816 quest[i].name, quest[i].level,
8817 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8821 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8822 quest[i].name, quest[i].level,
8823 quest[i].max_num, name, quest[i].cur_num);
8829 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8830 quest[i].name, quest[i].level, name);
8832 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8833 quest[i].name, quest[i].level, name);
8841 /* Print the current random quest */
8842 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8845 if (!total) fprintf(fff, " ¤Ê¤·\n");
8847 if (!total) fprintf(fff, " Nothing.\n");
8853 * Print all finished quests
8855 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8862 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8864 fprintf(fff, "< Completed Quest >\n");
8866 for (i = 1; i < max_quests; i++)
8868 int q_idx = quest_num[i];
8870 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8872 if (is_fixed_quest_idx(q_idx))
8874 /* Set the quest number temporary */
8875 int old_quest = p_ptr->inside_quest;
8877 p_ptr->inside_quest = q_idx;
8880 init_flags = INIT_ASSIGN;
8882 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8884 /* Reset the old quest number */
8885 p_ptr->inside_quest = old_quest;
8887 /* No info from "silent" quests */
8888 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8893 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8895 /* Print the quest info */
8897 if (quest[q_idx].complev == 0)
8901 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8903 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8905 r_name+r_info[quest[q_idx].r_idx].name,
8906 quest[q_idx].level);
8912 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8914 " %-40s (Dungeon level: %3d) - level %2d\n",
8916 r_name+r_info[quest[q_idx].r_idx].name,
8918 quest[q_idx].complev);
8923 /* Print the quest info */
8925 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8926 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8928 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8929 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8933 fprintf(fff, tmp_str);
8937 if (!total) fprintf(fff, " ¤Ê¤·\n");
8939 if (!total) fprintf(fff, " Nothing.\n");
8945 * Print all failed quests
8947 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8954 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8956 fprintf(fff, "< Failed Quest >\n");
8958 for (i = 1; i < max_quests; i++)
8960 int q_idx = quest_num[i];
8962 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8964 if (is_fixed_quest_idx(q_idx))
8966 /* Set the quest number temporary */
8967 int old_quest = p_ptr->inside_quest;
8969 p_ptr->inside_quest = q_idx;
8971 /* Get the quest text */
8972 init_flags = INIT_ASSIGN;
8974 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8976 /* Reset the old quest number */
8977 p_ptr->inside_quest = old_quest;
8979 /* No info from "silent" quests */
8980 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8985 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8987 /* Print the quest info */
8989 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8990 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8992 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
8993 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8998 /* Print the quest info */
9000 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
9001 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9003 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
9004 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9007 fprintf(fff, tmp_str);
9011 if (!total) fprintf(fff, " ¤Ê¤·\n");
9013 if (!total) fprintf(fff, " Nothing.\n");
9019 * Print all random quests
9021 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
9028 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
9030 fprintf(fff, "< Remaining Random Quest >\n");
9032 for (i = 1; i < max_quests; i++)
9034 /* No info from "silent" quests */
9035 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
9037 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
9041 /* Print the quest info */
9043 sprintf(tmp_str, " %s (%d³¬, %s)\n",
9044 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9046 sprintf(tmp_str, " %s (%d, %s)\n",
9047 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9049 fprintf(fff, tmp_str);
9053 if (!total) fprintf(fff, " ¤Ê¤·\n");
9055 if (!total) fprintf(fff, " Nothing.\n");
9060 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
9062 int *q_num = (int *)u;
9063 quest_type *qa = &quest[q_num[a]];
9064 quest_type *qb = &quest[q_num[b]];
9069 if (qa->complev < qb->complev) return TRUE;
9070 if (qa->complev > qb->complev) return FALSE;
9071 if (qa->level <= qb->level) return TRUE;
9075 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9077 int *q_num = (int *)u;
9084 q_num[a] = q_num[b];
9090 * Print quest status of all active quests
9092 static void do_cmd_knowledge_quests(void)
9095 char file_name[1024];
9096 int *quest_num, dummy, i;
9098 /* Open a new file */
9099 fff = my_fopen_temp(file_name, 1024);
9103 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9105 msg_format("Failed to create temporary file %s.", file_name);
9111 /* Allocate Memory */
9112 C_MAKE(quest_num, max_quests, int);
9114 /* Sort by compete level */
9115 for (i = 1; i < max_quests; i++) quest_num[i] = i;
9116 ang_sort_comp = ang_sort_comp_quest_num;
9117 ang_sort_swap = ang_sort_swap_quest_num;
9118 ang_sort(quest_num, &dummy, max_quests);
9120 /* Dump Quest Information */
9121 do_cmd_knowledge_quests_current(fff);
9123 do_cmd_knowledge_quests_completed(fff, quest_num);
9125 do_cmd_knowledge_quests_failed(fff, quest_num);
9129 do_cmd_knowledge_quests_wiz_random(fff);
9132 /* Close the file */
9135 /* Display the file contents */
9137 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9139 show_file(TRUE, file_name, "Quest status", 0, 0);
9142 /* Remove the file */
9146 C_KILL(quest_num, max_quests, int);
9153 static void do_cmd_knowledge_home(void)
9158 char file_name[1024];
9160 char o_name[MAX_NLEN];
9163 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9165 /* Open a new file */
9166 fff = my_fopen_temp(file_name, 1024);
9169 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9171 msg_format("Failed to create temporary file %s.", file_name);
9179 /* Print all homes in the different towns */
9180 st_ptr = &town[1].store[STORE_HOME];
9182 /* Home -- if anything there */
9183 if (st_ptr->stock_num)
9188 /* Header with name of the town */
9190 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9192 fprintf(fff, " [Home Inventory]\n");
9195 /* Dump all available items */
9196 for (i = 0; i < st_ptr->stock_num; i++)
9199 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9200 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9201 if (strlen(o_name) <= 80-3)
9203 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9209 for (n = 0, t = o_name; n < 80-3; n++, t++)
9210 if(iskanji(*t)) {t++; n++;}
9211 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9213 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9214 fprintf(fff, " %.77s\n", o_name+n);
9217 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9218 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9223 /* Add an empty line */
9224 fprintf(fff, "\n\n");
9228 /* Close the file */
9231 /* Display the file contents */
9233 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9235 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9239 /* Remove the file */
9245 * Check the status of "autopick"
9247 static void do_cmd_knowledge_autopick(void)
9251 char file_name[1024];
9253 /* Open a new file */
9254 fff = my_fopen_temp(file_name, 1024);
9259 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9261 msg_format("Failed to create temporary file %s.", file_name);
9270 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9272 fprintf(fff, "No preference for auto picker/destroyer.");
9278 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9280 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9284 for (k = 0; k < max_autopick; k++)
9287 byte act = autopick_list[k].action;
9288 if (act & DONT_AUTOPICK)
9296 else if (act & DO_AUTODESTROY)
9304 else if (act & DO_AUTOPICK)
9312 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9321 if (act & DO_DISPLAY)
9322 fprintf(fff, "%11s", format("[%s]", tmp));
9324 fprintf(fff, "%11s", format("(%s)", tmp));
9326 tmp = autopick_line_from_entry(&autopick_list[k]);
9327 fprintf(fff, " %s", tmp);
9331 /* Close the file */
9333 /* Display the file contents */
9335 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9337 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9340 /* Remove the file */
9346 * Interact with "knowledge"
9348 void do_cmd_knowledge(void)
9351 /* File type is "TEXT" */
9352 FILE_TYPE(FILE_TYPE_TEXT);
9353 /* Save the screen */
9355 /* Interact until done */
9360 /* Ask for a choice */
9362 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9363 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9365 prt(format("page %d/2", (p+1)), 2, 65);
9366 prt("Display current knowledge", 3, 0);
9369 /* Give some choices */
9372 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9373 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9374 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9375 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9376 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9377 if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9378 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9379 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9380 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9381 prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5);
9383 prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5);
9384 prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5);
9385 prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5);
9386 prt("(d) ËâË¡¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 9, 5);
9387 prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 10, 5);
9388 prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ ¤Î°ìÍ÷", 11, 5);
9389 prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó ¤Î°ìÍ÷", 12, 5);
9390 prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È ¤Î°ìÍ÷", 13, 5);
9391 prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5);
9395 prt("(1) Display known artifacts", 6, 5);
9396 prt("(2) Display known objects", 7, 5);
9397 prt("(3) Display remaining uniques", 8, 5);
9398 prt("(4) Display known monster", 9, 5);
9399 prt("(5) Display kill count", 10, 5);
9400 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9401 prt("(7) Display current pets", 12, 5);
9402 prt("(8) Display home inventory", 13, 5);
9403 prt("(9) Display *identified* equip.", 14, 5);
9404 prt("(0) Display terrain symbols.", 15, 5);
9406 prt("(a) Display about yourself", 6, 5);
9407 prt("(b) Display mutations", 7, 5);
9408 prt("(c) Display weapon proficiency", 8, 5);
9409 prt("(d) Display spell proficiency", 9, 5);
9410 prt("(e) Display misc. proficiency", 10, 5);
9411 prt("(f) Display virtues", 11, 5);
9412 prt("(g) Display dungeons", 12, 5);
9413 prt("(h) Display current quests", 13, 5);
9414 prt("(i) Display auto pick/destroy", 14, 5);
9419 prt("-³¤¯-", 17, 8);
9420 prt("ESC) È´¤±¤ë", 21, 1);
9421 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9422 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9423 prt("¥³¥Þ¥ó¥É:", 20, 0);
9425 prt("-more-", 17, 8);
9426 prt("ESC) Exit menu", 21, 1);
9427 prt("SPACE) Next page", 21, 30);
9428 /*prt("-) Previous page", 21, 60);*/
9429 prt("Command: ", 20, 0);
9435 if (i == ESCAPE) break;
9438 case ' ': /* Page change */
9442 case '1': /* Artifacts */
9443 do_cmd_knowledge_artifacts();
9445 case '2': /* Objects */
9446 do_cmd_knowledge_objects();
9448 case '3': /* Uniques */
9449 do_cmd_knowledge_uniques();
9451 case '4': /* Monsters */
9452 do_cmd_knowledge_monsters();
9454 case '5': /* Kill count */
9455 do_cmd_knowledge_kill_count();
9457 case '6': /* wanted */
9458 if (!vanilla_town) do_cmd_knowledge_kubi();
9460 case '7': /* Pets */
9461 do_cmd_knowledge_pets();
9463 case '8': /* Home */
9464 do_cmd_knowledge_home();
9466 case '9': /* Resist list */
9467 do_cmd_knowledge_inven();
9469 case '0': /* Feature list */
9470 do_cmd_knowledge_features();
9473 case 'a': /* Max stat */
9474 do_cmd_knowledge_stat();
9476 case 'b': /* Mutations */
9477 do_cmd_knowledge_mutations();
9479 case 'c': /* weapon-exp */
9480 do_cmd_knowledge_weapon_exp();
9482 case 'd': /* spell-exp */
9483 do_cmd_knowledge_spell_exp();
9485 case 'e': /* skill-exp */
9486 do_cmd_knowledge_skill_exp();
9488 case 'f': /* Virtues */
9489 do_cmd_knowledge_virtues();
9491 case 'g': /* Dungeon */
9492 do_cmd_knowledge_dungeon();
9494 case 'h': /* Quests */
9495 do_cmd_knowledge_quests();
9497 case 'i': /* Autopick */
9498 do_cmd_knowledge_autopick();
9500 default: /* Unknown option */
9503 /* Flush messages */
9506 /* Restore the screen */
9512 * Check on the status of an active quest
9514 void do_cmd_checkquest(void)
9516 /* File type is "TEXT" */
9517 FILE_TYPE(FILE_TYPE_TEXT);
9519 /* Save the screen */
9523 do_cmd_knowledge_quests();
9525 /* Restore the screen */
9531 * Display the time and date
9533 void do_cmd_time(void)
9535 int day, hour, min, full, start, end, num;
9542 extract_day_hour_min(&day, &hour, &min);
9544 full = hour * 100 + min;
9552 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9554 strcpy(desc, "It is a strange time.");
9560 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9561 day, (hour % 12 == 0) ? 12 : (hour % 12),
9562 min, (hour < 12) ? "AM" : "PM");
9564 msg_format("This is day %d. The time is %d:%02d %s.",
9565 day, (hour % 12 == 0) ? 12 : (hour % 12),
9566 min, (hour < 12) ? "AM" : "PM");
9571 if (!randint0(10) || p_ptr->image)
9574 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9576 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9583 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9585 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9590 /* Open this file */
9591 fff = my_fopen(buf, "rt");
9596 /* Find this time */
9597 while (!my_fgets(fff, buf, sizeof(buf)))
9599 /* Ignore comments */
9600 if (!buf[0] || (buf[0] == '#')) continue;
9602 /* Ignore invalid lines */
9603 if (buf[1] != ':') continue;
9605 /* Process 'Start' */
9608 /* Extract the starting time */
9609 start = atoi(buf + 2);
9611 /* Assume valid for an hour */
9621 /* Extract the ending time */
9622 end = atoi(buf + 2);
9628 /* Ignore incorrect range */
9629 if ((start > full) || (full > end)) continue;
9631 /* Process 'Description' */
9636 /* Apply the randomizer */
9637 if (!randint0(num)) strcpy(desc, buf + 2);
9647 /* Close the file */