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_AUTODESTROY 7
1908 * Interact with some options
1910 void do_cmd_options_aux(int page, cptr info)
1913 int i, k = 0, n = 0, l;
1918 /* Lookup the options */
1919 for (i = 0; i < 24; i++) opt[i] = 0;
1921 /* Scan the options */
1922 for (i = 0; option_info[i].o_desc; i++)
1924 /* Notice options on this "page" */
1925 if (option_info[i].o_page == page) opt[n++] = i;
1932 /* Interact with the player */
1937 /* Prompt XXX XXX XXX */
1939 sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, y/n:Êѹ¹, ESC:½ªÎ», ?:¥Ø¥ë¥×) ", info);
1941 sprintf(buf, "%s (RET:next, y/n:change, ESC:accept, ?:help) ", info);
1947 /* HACK -- description for easy-auto-destroy options */
1949 if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤¤Î¤ß͸ú", 6, 6);
1951 if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
1954 /* Display the options */
1955 for (i = 0; i < n; i++)
1957 byte a = TERM_WHITE;
1959 /* Color current option */
1960 if (i == k) a = TERM_L_BLUE;
1962 /* Display the option text */
1963 sprintf(buf, "%-48s: %s (%.19s)",
1964 option_info[opt[i]].o_desc,
1966 (*option_info[opt[i]].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1968 (*option_info[opt[i]].o_var ? "yes" : "no "),
1971 option_info[opt[i]].o_text);
1972 if ((page == PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1973 else c_prt(a, buf, i + 2, 0);
1976 if ((page == PAGE_AUTODESTROY) && (k > 2)) l = 3;
1979 /* Hilite current option */
1980 move_cursor(k + 2 + l, 50);
1986 * HACK - Try to translate the key into a direction
1987 * to allow using the roguelike keys for navigation.
1989 dir = get_keymap_dir(ch);
1990 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
2004 k = (n + k - 1) % n;
2021 (*option_info[opt[k]].o_var) = TRUE;
2030 (*option_info[opt[k]].o_var) = FALSE;
2038 (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
2045 strnfmt(buf, sizeof(buf), "joption.txt#%s", option_info[opt[k]].o_text);
2047 strnfmt(buf, sizeof(buf), "option.txt#%s", option_info[opt[k]].o_text);
2049 /* Peruse the help file */
2050 (void)show_file(TRUE, buf, NULL, 0, 0);
2067 * Modify the "window" options
2069 static void do_cmd_options_win(void)
2083 /* Memorize old flags */
2084 for (j = 0; j < 8; j++)
2086 /* Acquire current flags */
2087 old_flag[j] = window_flag[j];
2097 /* Prompt XXX XXX XXX */
2099 prt("¥¦¥£¥ó¥É¥¦¡¦¥Õ¥é¥° (<Êý¸þ>¤Ç°ÜÆ°, t¤Ç¥Á¥§¥ó¥¸, y/n ¤Ç¥»¥Ã¥È, ESC)", 0, 0);
2101 prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
2105 /* Display the windows */
2106 for (j = 0; j < 8; j++)
2108 byte a = TERM_WHITE;
2110 cptr s = angband_term_name[j];
2113 if (j == x) a = TERM_L_BLUE;
2115 /* Window name, staggered, centered */
2116 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
2119 /* Display the options */
2120 for (i = 0; i < 16; i++)
2122 byte a = TERM_WHITE;
2124 cptr str = window_flag_desc[i];
2127 if (i == y) a = TERM_L_BLUE;
2131 if (!str) str = "(̤»ÈÍÑ)";
2133 if (!str) str = "(Unused option)";
2138 Term_putstr(0, i + 5, -1, a, str);
2140 /* Display the windows */
2141 for (j = 0; j < 8; j++)
2143 byte a = TERM_WHITE;
2148 if ((i == y) && (j == x)) a = TERM_L_BLUE;
2151 if (window_flag[j] & (1L << i)) c = 'X';
2154 Term_putch(35 + j * 5, i + 5, a, c);
2159 Term_gotoxy(35 + x * 5, y + 5);
2177 for (j = 0; j < 8; j++)
2179 window_flag[j] &= ~(1L << y);
2183 for (i = 0; i < 16; i++)
2185 window_flag[x] &= ~(1L << i);
2198 window_flag[x] |= (1L << y);
2206 window_flag[x] &= ~(1L << y);
2213 (void)show_file(TRUE, "joption.txt#Window", NULL, 0, 0);
2215 (void)show_file(TRUE, "option.txt#Window", NULL, 0, 0);
2225 d = get_keymap_dir(ch);
2227 x = (x + ddx[d] + 8) % 8;
2228 y = (y + ddy[d] + 16) % 16;
2235 /* Notice changes */
2236 for (j = 0; j < 8; j++)
2241 if (!angband_term[j]) continue;
2243 /* Ignore non-changes */
2244 if (window_flag[j] == old_flag[j]) continue;
2247 Term_activate(angband_term[j]);
2264 * Set or unset various options.
2266 * The user must use the "Ctrl-R" command to "adapt" to changes
2267 * in any options which control "visual" aspects of the game.
2269 void do_cmd_options(void)
2274 /* Save the screen */
2283 /* Why are we here */
2285 prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 2, 0);
2287 prt("Options", 2, 0);
2291 /* Give some choices */
2293 prt("(1) ¥¡¼ÆþÎÏ ¥ª¥×¥·¥ç¥ó", 4, 5);
2294 prt("(2) ²èÌ̽ÐÎÏ ¥ª¥×¥·¥ç¥ó", 5, 5);
2295 prt("(3) ¥²¡¼¥à¥×¥ì¥¤ ¥ª¥×¥·¥ç¥ó", 6, 5);
2296 prt("(4) ¹ÔÆ°Ãæ»ß´Ø·¸ ¥ª¥×¥·¥ç¥ó", 7, 5);
2297 prt("(5) ¸úΨ²½ ¥ª¥×¥·¥ç¥ó", 8, 5);
2298 prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ ¥ª¥×¥·¥ç¥ó", 9, 5);
2299 prt("(R) ¥×¥ì¥¤µÏ¿ ¥ª¥×¥·¥ç¥ó", 10, 5);
2300 /* Special choices */
2301 prt("(D) ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 12, 5);
2302 prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 13, 5);
2303 prt("(A) ¼«Æ°¥»¡¼¥Ö ¥ª¥×¥·¥ç¥ó", 14, 5);
2305 prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
2307 prt("(1) Input Options", 4, 5);
2308 prt("(2) Output Options", 5, 5);
2309 prt("(3) Game-Play Options", 6, 5);
2310 prt("(4) Disturbance Options", 7, 5);
2311 prt("(5) Efficiency Options", 8, 5);
2312 prt("(6) Easy Auto-Destroyer Options", 9, 5);
2313 prt("(R) Play-record Options", 10, 5);
2315 /* Special choices */
2316 prt("(D) Base Delay Factor", 12, 5);
2317 prt("(H) Hitpoint Warning", 13, 5);
2318 prt("(A) Autosave Options", 14, 5);
2322 prt("(W) Window Flags", 15, 5);
2325 if (p_ptr->noscore || allow_debug_opts)
2329 prt("(C) º¾µ½ ¥ª¥×¥·¥ç¥ó", 16, 5);
2331 prt("(C) Cheating Options", 16, 5);
2338 prt("¥³¥Þ¥ó¥É:", 18, 0);
2340 prt("Command: ", 18, 0);
2348 if (k == ESCAPE) break;
2353 /* General Options */
2356 /* Process the general options */
2358 do_cmd_options_aux(1, "¥¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2360 do_cmd_options_aux(1, "Input Options");
2366 /* General Options */
2369 /* Process the general options */
2371 do_cmd_options_aux(2, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
2373 do_cmd_options_aux(2, "Output Options");
2379 /* Inventory Options */
2384 do_cmd_options_aux(3, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2386 do_cmd_options_aux(3, "Game-Play Options");
2392 /* Disturbance Options */
2397 do_cmd_options_aux(4, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2399 do_cmd_options_aux(4, "Disturbance Options");
2405 /* Efficiency Options */
2410 do_cmd_options_aux(5, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
2412 do_cmd_options_aux(5, "Efficiency Options");
2418 /* Object auto-destruction Options */
2423 do_cmd_options_aux(7, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2425 do_cmd_options_aux(7, "Easy Auto-Destroyer Options");
2430 /* Play-record Options */
2436 do_cmd_options_aux(10, "¥×¥ì¥¤µÏ¿¥ª¥×¥·¥ç¥ó");
2438 do_cmd_options_aux(10, "Play-record Option");
2443 /* Cheating Options */
2446 if (!p_ptr->noscore && !allow_debug_opts)
2448 /* Cheat options are not permitted */
2455 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤¤Ê¤¤¡ª");
2457 do_cmd_options_cheat("Cheaters never win");
2467 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2469 do_cmd_options_autosave("Autosave");
2480 do_cmd_options_win();
2481 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2482 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2483 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2484 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2488 /* Hack -- Delay Speed */
2494 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 18, 0);
2496 prt("Command: Base Delay Factor", 18, 0);
2500 /* Get a new value */
2503 int msec = delay_factor * delay_factor * delay_factor;
2505 prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2506 delay_factor, msec), 22, 0);
2508 prt(format("Current base delay factor: %d (%d msec)",
2509 delay_factor, msec), 22, 0);
2513 prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2515 prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2519 if (k == ESCAPE) break;
2523 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2525 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2529 else if (isdigit(k)) delay_factor = D2I(k);
2536 /* Hack -- hitpoint warning factor */
2542 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 18, 0);
2544 prt("Command: Hitpoint Warning", 18, 0);
2548 /* Get a new value */
2552 prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2553 hitpoint_warn), 22, 0);
2555 prt(format("Current hitpoint warning: %d0%%",
2556 hitpoint_warn), 22, 0);
2560 prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2562 prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2566 if (k == ESCAPE) break;
2570 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2572 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2576 else if (isdigit(k)) hitpoint_warn = D2I(k);
2585 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2587 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2592 /* Unknown option */
2601 /* Flush messages */
2606 /* Restore the screen */
2609 /* Hack - Redraw equippy chars */
2610 p_ptr->redraw |= (PR_EQUIPPY);
2616 * Ask for a "user pref line" and process it
2618 * XXX XXX XXX Allow absolute file names?
2620 void do_cmd_pref(void)
2627 /* Ask for a "user pref command" */
2629 if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2631 if (!get_string("Pref: ", buf, 80)) return;
2635 /* Process that pref command */
2636 (void)process_pref_file_command(buf);
2639 void do_cmd_pickpref(void)
2645 if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2647 if(!get_check("Reload auto-pick preference file? ")) return;
2650 /* Free old entries */
2653 /* ¥¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2655 sprintf(buf, "picktype-%s.prf", player_name);
2657 sprintf(buf, "pickpref-%s.prf", player_name);
2659 err = process_pickpref_file(buf);
2664 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2666 msg_format("loaded '%s'.", buf);
2670 /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2672 /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2676 err = process_pickpref_file("picktype.prf");
2678 err = process_pickpref_file("pickpref.prf");
2684 msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2686 msg_print("loaded 'pickpref.prf'.");
2693 if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2695 if(err) msg_print("Failed to reload autopick preference.");
2702 * Hack -- append all current macros to the given file
2704 static errr macro_dump(cptr fname)
2706 static cptr mark = "Macro Dump";
2712 /* Build the filename */
2713 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2715 /* File type is "TEXT" */
2716 FILE_TYPE(FILE_TYPE_TEXT);
2718 /* Append to the file */
2719 if (!open_auto_dump(buf, mark)) return (-1);
2723 auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2725 auto_dump_printf("\n# Automatic macro dump\n\n");
2729 for (i = 0; i < macro__num; i++)
2731 /* Extract the action */
2732 ascii_to_text(buf, macro__act[i]);
2734 /* Dump the macro */
2735 auto_dump_printf("A:%s\n", buf);
2737 /* Extract the action */
2738 ascii_to_text(buf, macro__pat[i]);
2740 /* Dump normal macros */
2741 auto_dump_printf("P:%s\n", buf);
2744 auto_dump_printf("\n");
2756 * Hack -- ask for a "trigger" (see below)
2758 * Note the complex use of the "inkey()" function from "util.c".
2760 * Note that both "flush()" calls are extremely important.
2762 static void do_cmd_macro_aux(char *buf)
2772 /* Do not process macros */
2778 /* Read the pattern */
2784 /* Do not process macros */
2787 /* Do not wait for keys */
2790 /* Attempt to read a key */
2801 /* Convert the trigger */
2802 ascii_to_text(tmp, buf);
2804 /* Hack -- display the trigger */
2805 Term_addstr(-1, TERM_WHITE, tmp);
2812 * Hack -- ask for a keymap "trigger" (see below)
2814 * Note that both "flush()" calls are extremely important. This may
2815 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2817 static void do_cmd_macro_aux_keymap(char *buf)
2831 /* Convert to ascii */
2832 ascii_to_text(tmp, buf);
2834 /* Hack -- display the trigger */
2835 Term_addstr(-1, TERM_WHITE, tmp);
2844 * Hack -- append all keymaps to the given file
2846 static errr keymap_dump(cptr fname)
2848 static cptr mark = "Keymap Dump";
2857 if (rogue_like_commands)
2859 mode = KEYMAP_MODE_ROGUE;
2865 mode = KEYMAP_MODE_ORIG;
2869 /* Build the filename */
2870 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2872 /* File type is "TEXT" */
2873 FILE_TYPE(FILE_TYPE_TEXT);
2875 /* Append to the file */
2876 if (!open_auto_dump(buf, mark)) return -1;
2880 auto_dump_printf("\n# ¼«Æ°¥¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2882 auto_dump_printf("\n# Automatic keymap dump\n\n");
2886 for (i = 0; i < 256; i++)
2890 /* Loop up the keymap */
2891 act = keymap_act[mode][i];
2893 /* Skip empty keymaps */
2896 /* Encode the key */
2899 ascii_to_text(key, buf);
2901 /* Encode the action */
2902 ascii_to_text(buf, act);
2904 /* Dump the macro */
2905 auto_dump_printf("A:%s\n", buf);
2906 auto_dump_printf("C:%d:%s\n", mode, key);
2919 * Interact with "macros"
2921 * Note that the macro "action" must be defined before the trigger.
2923 * Could use some helpful instructions on this page. XXX XXX XXX
2925 void do_cmd_macros(void)
2937 if (rogue_like_commands)
2939 mode = KEYMAP_MODE_ROGUE;
2945 mode = KEYMAP_MODE_ORIG;
2948 /* File type is "TEXT" */
2949 FILE_TYPE(FILE_TYPE_TEXT);
2956 /* Process requests until done */
2964 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
2966 prt("Interact with Macros", 2, 0);
2971 /* Describe that action */
2973 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
2975 prt("Current action (if any) shown below:", 20, 0);
2979 /* Analyze the current action */
2980 ascii_to_text(buf, macro__buf);
2982 /* Display the current action */
2988 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
2990 prt("(1) Load a user pref file", 4, 5);
2995 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
2996 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
2997 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
2998 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
2999 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3000 prt("(7) ¥¡¼ÇÛÃ֤γÎǧ", 10, 5);
3001 prt("(8) ¥¡¼ÇÛÃ֤κîÀ®", 11, 5);
3002 prt("(9) ¥¡¼ÇÛÃ֤κï½ü", 12, 5);
3003 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3005 prt("(2) Append macros to a file", 5, 5);
3006 prt("(3) Query a macro", 6, 5);
3007 prt("(4) Create a macro", 7, 5);
3008 prt("(5) Remove a macro", 8, 5);
3009 prt("(6) Append keymaps to a file", 9, 5);
3010 prt("(7) Query a keymap", 10, 5);
3011 prt("(8) Create a keymap", 11, 5);
3012 prt("(9) Remove a keymap", 12, 5);
3013 prt("(0) Enter a new action", 13, 5);
3016 #endif /* ALLOW_MACROS */
3020 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3022 prt("Command: ", 16, 0);
3030 if (i == ESCAPE) break;
3032 /* Load a 'macro' file */
3039 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3041 prt("Command: Load a user pref file", 16, 0);
3047 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3049 prt("File: ", 18, 0);
3053 /* Default filename */
3054 sprintf(tmp, "%s.prf", player_name);
3056 /* Ask for a file */
3057 if (!askfor_aux(tmp, 80)) continue;
3059 /* Process the given filename */
3060 err = process_pref_file(tmp);
3064 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3066 msg_format("Loaded default '%s'.", tmp);
3073 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3075 msg_format("Failed to load '%s'!");
3081 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3083 msg_format("Loaded '%s'.", tmp);
3095 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3097 prt("Command: Append macros to a file", 16, 0);
3103 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3105 prt("File: ", 18, 0);
3109 /* Default filename */
3110 sprintf(tmp, "%s.prf", player_name);
3112 /* Ask for a file */
3113 if (!askfor_aux(tmp, 80)) continue;
3115 /* Dump the macros */
3116 (void)macro_dump(tmp);
3120 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3122 msg_print("Appended macros.");
3134 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3136 prt("Command: Query a macro", 16, 0);
3142 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3144 prt("Trigger: ", 18, 0);
3148 /* Get a macro trigger */
3149 do_cmd_macro_aux(buf);
3151 /* Acquire action */
3152 k = macro_find_exact(buf);
3159 msg_print("¤½¤Î¥¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3161 msg_print("Found no macro.");
3169 /* Obtain the action */
3170 strcpy(macro__buf, macro__act[k]);
3172 /* Analyze the current action */
3173 ascii_to_text(buf, macro__buf);
3175 /* Display the current action */
3180 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3182 msg_print("Found a macro.");
3188 /* Create a macro */
3193 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3195 prt("Command: Create a macro", 16, 0);
3201 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3203 prt("Trigger: ", 18, 0);
3207 /* Get a macro trigger */
3208 do_cmd_macro_aux(buf);
3215 prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3217 prt("Action: ", 20, 0);
3221 /* Convert to text */
3222 ascii_to_text(tmp, macro__buf);
3224 /* Get an encoded action */
3225 if (askfor_aux(tmp, 80))
3227 /* Convert to ascii */
3228 text_to_ascii(macro__buf, tmp);
3230 /* Link the macro */
3231 macro_add(buf, macro__buf);
3235 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3237 msg_print("Added a macro.");
3243 /* Remove a macro */
3248 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3250 prt("Command: Remove a macro", 16, 0);
3256 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3258 prt("Trigger: ", 18, 0);
3262 /* Get a macro trigger */
3263 do_cmd_macro_aux(buf);
3265 /* Link the macro */
3266 macro_add(buf, buf);
3270 msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3272 msg_print("Removed a macro.");
3282 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3284 prt("Command: Append keymaps to a file", 16, 0);
3290 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3292 prt("File: ", 18, 0);
3296 /* Default filename */
3297 sprintf(tmp, "%s.prf", player_name);
3299 /* Ask for a file */
3300 if (!askfor_aux(tmp, 80)) continue;
3302 /* Dump the macros */
3303 (void)keymap_dump(tmp);
3307 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3309 msg_print("Appended keymaps.");
3314 /* Query a keymap */
3321 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤γÎǧ", 16, 0);
3323 prt("Command: Query a keymap", 16, 0);
3329 prt("²¡¤¹¥¡¼: ", 18, 0);
3331 prt("Keypress: ", 18, 0);
3335 /* Get a keymap trigger */
3336 do_cmd_macro_aux_keymap(buf);
3338 /* Look up the keymap */
3339 act = keymap_act[mode][(byte)(buf[0])];
3346 msg_print("¥¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3348 msg_print("Found no keymap.");
3356 /* Obtain the action */
3357 strcpy(macro__buf, act);
3359 /* Analyze the current action */
3360 ascii_to_text(buf, macro__buf);
3362 /* Display the current action */
3367 msg_print("¥¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3369 msg_print("Found a keymap.");
3375 /* Create a keymap */
3380 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κîÀ®", 16, 0);
3382 prt("Command: Create a keymap", 16, 0);
3388 prt("²¡¤¹¥¡¼: ", 18, 0);
3390 prt("Keypress: ", 18, 0);
3394 /* Get a keymap trigger */
3395 do_cmd_macro_aux_keymap(buf);
3402 prt("¹ÔÆ°: ", 20, 0);
3404 prt("Action: ", 20, 0);
3408 /* Convert to text */
3409 ascii_to_text(tmp, macro__buf);
3411 /* Get an encoded action */
3412 if (askfor_aux(tmp, 80))
3414 /* Convert to ascii */
3415 text_to_ascii(macro__buf, tmp);
3417 /* Free old keymap */
3418 string_free(keymap_act[mode][(byte)(buf[0])]);
3420 /* Make new keymap */
3421 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3425 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3427 msg_print("Added a keymap.");
3433 /* Remove a keymap */
3438 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κï½ü", 16, 0);
3440 prt("Command: Remove a keymap", 16, 0);
3446 prt("²¡¤¹¥¡¼: ", 18, 0);
3448 prt("Keypress: ", 18, 0);
3452 /* Get a keymap trigger */
3453 do_cmd_macro_aux_keymap(buf);
3455 /* Free old keymap */
3456 string_free(keymap_act[mode][(byte)(buf[0])]);
3458 /* Make new keymap */
3459 keymap_act[mode][(byte)(buf[0])] = NULL;
3463 msg_print("¥¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3465 msg_print("Removed a keymap.");
3470 /* Enter a new action */
3475 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3477 prt("Command: Enter a new action", 16, 0);
3481 /* Go to the correct location */
3484 /* Hack -- limit the value */
3487 /* Get an encoded action */
3488 if (!askfor_aux(buf, 80)) continue;
3490 /* Extract an action */
3491 text_to_ascii(macro__buf, buf);
3494 #endif /* ALLOW_MACROS */
3503 /* Flush messages */
3512 static void cmd_visuals_aux(int i, int *num, int max)
3519 sprintf(str, "%d", *num);
3521 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3524 tmp = strtol(str, NULL, 0);
3525 if (tmp >= 0 && tmp < max)
3529 else if (isupper(i))
3530 *num = (*num + max - 1) % max;
3532 *num = (*num + 1) % max;
3538 * Interact with "visuals"
3540 void do_cmd_visuals(void)
3548 const char *empty_symbol = "<< ? >>";
3550 if (use_bigtile) empty_symbol = "<< ?? >>";
3552 /* File type is "TEXT" */
3553 FILE_TYPE(FILE_TYPE_TEXT);
3556 /* Save the screen */
3560 /* Interact until done */
3566 /* Ask for a choice */
3568 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3570 prt("Interact with Visuals", 2, 0);
3574 /* Give some choices */
3576 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3578 prt("(1) Load a user pref file", 4, 5);
3581 #ifdef ALLOW_VISUALS
3583 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
3584 prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 6, 5);
3585 prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 7, 5);
3586 prt("(5) (̤»ÈÍÑ)", 8, 5);
3587 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3588 prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3589 prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3590 prt("(9) (̤»ÈÍÑ)", 12, 5);
3592 prt("(2) Dump monster attr/chars", 5, 5);
3593 prt("(3) Dump object attr/chars", 6, 5);
3594 prt("(4) Dump feature attr/chars", 7, 5);
3595 prt("(5) (unused)", 8, 5);
3596 prt("(6) Change monster attr/chars", 9, 5);
3597 prt("(7) Change object attr/chars", 10, 5);
3598 prt("(8) Change feature attr/chars", 11, 5);
3599 prt("(9) (unused)", 12, 5);
3604 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3606 prt("(0) Reset visuals", 13, 5);
3612 prt("¥³¥Þ¥ó¥É:", 18, 0);
3614 prt("Command: ", 15, 0);
3622 if (i == ESCAPE) break;
3624 /* Load a 'pref' file */
3629 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3631 prt("Command: Load a user pref file", 15, 0);
3637 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3639 prt("File: ", 17, 0);
3643 /* Default filename */
3644 sprintf(tmp, "%s.prf", player_name);
3647 if (!askfor_aux(tmp, 70)) continue;
3649 /* Process the given filename */
3650 (void)process_pref_file(tmp);
3653 #ifdef ALLOW_VISUALS
3655 /* Dump monster attr/chars */
3658 static cptr mark = "Monster attr/chars";
3662 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3664 prt("Command: Dump monster attr/chars", 15, 0);
3670 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3672 prt("File: ", 17, 0);
3676 /* Default filename */
3677 sprintf(tmp, "%s.prf", player_name);
3679 /* Get a filename */
3680 if (!askfor_aux(tmp, 70)) continue;
3682 /* Build the filename */
3683 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3685 /* Append to the file */
3686 if (!open_auto_dump(buf, mark)) continue;
3690 auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3692 auto_dump_printf("\n# Monster attr/char definitions\n\n");
3696 for (i = 1; i < max_r_idx; i++)
3698 monster_race *r_ptr = &r_info[i];
3700 /* Skip non-entries */
3701 if (!r_ptr->name) continue;
3703 /* Dump a comment */
3704 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3706 /* Dump the monster attr/char info */
3707 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3708 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3716 msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3718 msg_print("Dumped monster attr/chars.");
3723 /* Dump object attr/chars */
3726 static cptr mark = "Object attr/chars";
3730 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3732 prt("Command: Dump object attr/chars", 15, 0);
3738 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3740 prt("File: ", 17, 0);
3744 /* Default filename */
3745 sprintf(tmp, "%s.prf", player_name);
3747 /* Get a filename */
3748 if (!askfor_aux(tmp, 70)) continue;
3750 /* Build the filename */
3751 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3753 /* Append to the file */
3754 if (!open_auto_dump(buf, mark)) continue;
3758 auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3760 auto_dump_printf("\n# Object attr/char definitions\n\n");
3764 for (i = 1; i < max_k_idx; i++)
3767 object_kind *k_ptr = &k_info[i];
3769 /* Skip non-entries */
3770 if (!k_ptr->name) continue;
3772 /* Skip entries with flavor */
3773 if (k_ptr->flavor) continue;
3776 strip_name(o_name, i);
3778 /* Dump a comment */
3779 auto_dump_printf("# %s\n", o_name);
3781 /* Dump the object attr/char info */
3782 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3783 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3791 msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3793 msg_print("Dumped object attr/chars.");
3798 /* Dump feature attr/chars */
3801 static cptr mark = "Feature attr/chars";
3805 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3807 prt("Command: Dump feature attr/chars", 15, 0);
3813 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3815 prt("File: ", 17, 0);
3819 /* Default filename */
3820 sprintf(tmp, "%s.prf", player_name);
3822 /* Get a filename */
3823 if (!askfor_aux(tmp, 70)) continue;
3825 /* Build the filename */
3826 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3828 /* Append to the file */
3829 if (!open_auto_dump(buf, mark)) continue;
3833 auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3835 auto_dump_printf("\n# Feature attr/char definitions\n\n");
3839 for (i = 1; i < max_f_idx; i++)
3841 feature_type *f_ptr = &f_info[i];
3843 /* Skip non-entries */
3844 if (!f_ptr->name) continue;
3846 /* Skip mimiccing features */
3847 if (f_ptr->mimic != i) continue;
3849 /* Dump a comment */
3850 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3852 /* Dump the feature attr/char info */
3853 auto_dump_printf("F:%d:0x%02X/0x%02X\n\n", i,
3854 (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3862 msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3864 msg_print("Dumped feature attr/chars.");
3869 /* Modify monster attr/chars */
3876 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3878 prt("Command: Change monster attr/chars", 15, 0);
3882 /* Hack -- query until done */
3885 monster_race *r_ptr = &r_info[r];
3890 byte da = (r_ptr->d_attr);
3891 byte dc = (r_ptr->d_char);
3892 byte ca = (r_ptr->x_attr);
3893 byte cc = (r_ptr->x_char);
3895 /* Label the object */
3897 Term_putstr(5, 17, -1, TERM_WHITE,
3898 format("¥â¥ó¥¹¥¿¡¼ = %d, ̾Á° = %-40.40s",
3899 r, (r_name + r_ptr->name)));
3901 Term_putstr(5, 17, -1, TERM_WHITE,
3902 format("Monster = %d, Name = %-40.40s",
3903 r, (r_name + r_ptr->name)));
3907 /* Label the Default values */
3909 Term_putstr(10, 19, -1, TERM_WHITE,
3910 format("½é´üÃÍ ¿§ / ʸ»ú = %3u / %3u", da, dc));
3912 Term_putstr(10, 19, -1, TERM_WHITE,
3913 format("Default attr/char = %3u / %3u", da, dc));
3916 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3920 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
3922 Term_putch(43, 19, a, c);
3923 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
3925 /* Label the Current values */
3927 Term_putstr(10, 20, -1, TERM_WHITE,
3928 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3u / %3u", ca, cc));
3930 Term_putstr(10, 20, -1, TERM_WHITE,
3931 format("Current attr/char = %3u / %3u", ca, cc));
3934 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
3938 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
3940 Term_putch(43, 20, a, c);
3941 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
3946 Term_putstr(0, 22, -1, TERM_WHITE,
3947 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
3949 Term_putstr(0, 22, -1, TERM_WHITE,
3950 "Command (n/N/^N/a/A/^A/c/C/^C): ");
3957 if (i == ESCAPE) break;
3959 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3960 else if (isupper(i)) c = 'a' + i - 'A';
3966 cmd_visuals_aux(i, &r, max_r_idx);
3969 t = (int)r_ptr->x_attr;
3970 cmd_visuals_aux(i, &t, 256);
3971 r_ptr->x_attr = (byte)t;
3974 t = (int)r_ptr->x_char;
3975 cmd_visuals_aux(i, &t, 256);
3976 r_ptr->x_char = (byte)t;
3982 /* Modify object attr/chars */
3989 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3991 prt("Command: Change object attr/chars", 15, 0);
3995 /* Hack -- query until done */
3998 object_kind *k_ptr = &k_info[k];
4003 byte da = (byte)k_ptr->d_attr;
4004 byte dc = (byte)k_ptr->d_char;
4005 byte ca = (byte)k_ptr->x_attr;
4006 byte cc = (byte)k_ptr->x_char;
4008 /* Label the object */
4010 Term_putstr(5, 17, -1, TERM_WHITE,
4011 format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s",
4012 k, (k_name + k_ptr->name)));
4014 Term_putstr(5, 17, -1, TERM_WHITE,
4015 format("Object = %d, Name = %-40.40s",
4016 k, (k_name + k_ptr->name)));
4020 /* Label the Default values */
4022 Term_putstr(10, 19, -1, TERM_WHITE,
4023 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4025 Term_putstr(10, 19, -1, TERM_WHITE,
4026 format("Default attr/char = %3d / %3d", da, dc));
4029 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4032 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4034 Term_putch(43, 19, a, c);
4035 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4038 /* Label the Current values */
4040 Term_putstr(10, 20, -1, TERM_WHITE,
4041 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4043 Term_putstr(10, 20, -1, TERM_WHITE,
4044 format("Current attr/char = %3d / %3d", ca, cc));
4047 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4050 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4052 Term_putch(43, 20, a, c);
4053 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4058 Term_putstr(0, 22, -1, TERM_WHITE,
4059 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4061 Term_putstr(0, 22, -1, TERM_WHITE,
4062 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4069 if (i == ESCAPE) break;
4071 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4072 else if (isupper(i)) c = 'a' + i - 'A';
4078 cmd_visuals_aux(i, &k, max_k_idx);
4081 t = (int)k_info[k].x_attr;
4082 cmd_visuals_aux(i, &t, 256);
4083 k_info[k].x_attr = (byte)t;
4086 t = (int)k_info[k].x_char;
4087 cmd_visuals_aux(i, &t, 256);
4088 k_info[k].x_char = (byte)t;
4094 /* Modify feature attr/chars */
4101 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4103 prt("Command: Change feature attr/chars", 15, 0);
4107 /* Hack -- query until done */
4110 feature_type *f_ptr = &f_info[f];
4115 byte da = (byte)f_ptr->d_attr;
4116 byte dc = (byte)f_ptr->d_char;
4117 byte ca = (byte)f_ptr->x_attr;
4118 byte cc = (byte)f_ptr->x_char;
4120 /* Label the object */
4122 Term_putstr(5, 17, -1, TERM_WHITE,
4123 format("ÃÏ·Á = %d, ̾Á° = %-40.40s",
4124 f, (f_name + f_ptr->name)));
4126 Term_putstr(5, 17, -1, TERM_WHITE,
4127 format("Terrain = %d, Name = %-40.40s",
4128 f, (f_name + f_ptr->name)));
4132 /* Label the Default values */
4134 Term_putstr(10, 19, -1, TERM_WHITE,
4135 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4137 Term_putstr(10, 19, -1, TERM_WHITE,
4138 format("Default attr/char = %3d / %3d", da, dc));
4141 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4144 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4146 Term_putch(43, 19, a, c);
4147 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4150 /* Label the Current values */
4152 Term_putstr(10, 20, -1, TERM_WHITE,
4153 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4155 Term_putstr(10, 20, -1, TERM_WHITE,
4156 format("Current attr/char = %3d / %3d", ca, cc));
4159 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4162 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4164 Term_putch(43, 20, a, c);
4165 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4170 Term_putstr(0, 22, -1, TERM_WHITE,
4171 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4173 Term_putstr(0, 22, -1, TERM_WHITE,
4174 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4181 if (i == ESCAPE) break;
4183 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4184 else if (isupper(i)) c = 'a' + i - 'A';
4190 cmd_visuals_aux(i, &f, max_f_idx);
4193 t = (int)f_info[f].x_attr;
4194 cmd_visuals_aux(i, &t, 256);
4195 f_info[f].x_attr = (byte)t;
4198 t = (int)f_info[f].x_char;
4199 cmd_visuals_aux(i, &t, 256);
4200 f_info[f].x_char = (byte)t;
4216 msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4218 msg_print("Visual attr/char tables reset.");
4223 /* Unknown option */
4229 /* Flush messages */
4234 /* Restore the screen */
4240 * Interact with "colors"
4242 void do_cmd_colors(void)
4251 /* File type is "TEXT" */
4252 FILE_TYPE(FILE_TYPE_TEXT);
4255 /* Save the screen */
4259 /* Interact until done */
4265 /* Ask for a choice */
4267 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4269 prt("Interact with Colors", 2, 0);
4273 /* Give some choices */
4275 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4277 prt("(1) Load a user pref file", 4, 5);
4282 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
4283 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4285 prt("(2) Dump colors", 5, 5);
4286 prt("(3) Modify colors", 6, 5);
4293 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4295 prt("Command: ", 8, 0);
4303 if (i == ESCAPE) break;
4305 /* Load a 'pref' file */
4310 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4312 prt("Command: Load a user pref file", 8, 0);
4318 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4320 prt("File: ", 10, 0);
4325 sprintf(tmp, "%s.prf", player_name);
4328 if (!askfor_aux(tmp, 70)) continue;
4330 /* Process the given filename */
4331 (void)process_pref_file(tmp);
4333 /* Mega-Hack -- react to changes */
4334 Term_xtra(TERM_XTRA_REACT, 0);
4336 /* Mega-Hack -- redraw */
4345 static cptr mark = "Colors";
4349 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 8, 0);
4351 prt("Command: Dump colors", 8, 0);
4357 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4359 prt("File: ", 10, 0);
4363 /* Default filename */
4364 sprintf(tmp, "%s.prf", player_name);
4366 /* Get a filename */
4367 if (!askfor_aux(tmp, 70)) continue;
4369 /* Build the filename */
4370 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4372 /* Append to the file */
4373 if (!open_auto_dump(buf, mark)) continue;
4377 auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4379 auto_dump_printf("\n# Color redefinitions\n\n");
4383 for (i = 0; i < 256; i++)
4385 int kv = angband_color_table[i][0];
4386 int rv = angband_color_table[i][1];
4387 int gv = angband_color_table[i][2];
4388 int bv = angband_color_table[i][3];
4393 cptr name = "unknown";
4397 /* Skip non-entries */
4398 if (!kv && !rv && !gv && !bv) continue;
4400 /* Extract the color name */
4401 if (i < 16) name = color_names[i];
4403 /* Dump a comment */
4405 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4407 auto_dump_printf("# Color '%s'\n", name);
4410 /* Dump the monster attr/char info */
4411 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4420 msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
4422 msg_print("Dumped color redefinitions.");
4434 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4436 prt("Command: Modify colors", 8, 0);
4440 /* Hack -- query until done */
4449 /* Exhibit the normal colors */
4450 for (j = 0; j < 16; j++)
4452 /* Exhibit this color */
4453 Term_putstr(j*4, 20, -1, a, "###");
4455 /* Exhibit all colors */
4456 Term_putstr(j*4, 22, -1, j, format("%3d", j));
4459 /* Describe the color */
4461 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4463 name = ((a < 16) ? color_names[a] : "undefined");
4467 /* Describe the color */
4469 Term_putstr(5, 10, -1, TERM_WHITE,
4470 format("¥«¥é¡¼ = %d, ̾Á° = %s", a, name));
4472 Term_putstr(5, 10, -1, TERM_WHITE,
4473 format("Color = %d, Name = %s", a, name));
4477 /* Label the Current values */
4478 Term_putstr(5, 12, -1, TERM_WHITE,
4479 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4480 angband_color_table[a][0],
4481 angband_color_table[a][1],
4482 angband_color_table[a][2],
4483 angband_color_table[a][3]));
4487 Term_putstr(0, 14, -1, TERM_WHITE,
4488 "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4490 Term_putstr(0, 14, -1, TERM_WHITE,
4491 "Command (n/N/k/K/r/R/g/G/b/B): ");
4499 if (i == ESCAPE) break;
4502 if (i == 'n') a = (byte)(a + 1);
4503 if (i == 'N') a = (byte)(a - 1);
4504 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4505 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4506 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4507 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4508 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4509 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4510 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4511 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4513 /* Hack -- react to changes */
4514 Term_xtra(TERM_XTRA_REACT, 0);
4516 /* Hack -- redraw */
4523 /* Unknown option */
4529 /* Flush messages */
4534 /* Restore the screen */
4540 * Note something in the message recall
4542 void do_cmd_note(void)
4551 if (!get_string("¥á¥â: ", buf, 60)) return;
4553 if (!get_string("Note: ", buf, 60)) return;
4557 /* Ignore empty notes */
4558 if (!buf[0] || (buf[0] == ' ')) return;
4560 /* Add the note to the message recall */
4562 msg_format("¥á¥â: %s", buf);
4564 msg_format("Note: %s", buf);
4571 * Mention the current version
4573 void do_cmd_version(void)
4578 msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4579 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4581 msg_format("You are playing Hengband %d.%d.%d.",
4582 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4589 * Array of feeling strings
4591 static cptr do_cmd_feeling_text[11] =
4594 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4596 "Looks like any other level.",
4600 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4602 "You feel there is something special about this level.",
4606 "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4608 "You nearly faint as horrible visions of death fill your mind!",
4612 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4614 "This level looks very dangerous.",
4618 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4620 "You have a very bad feeling...",
4624 "°¤¤Í½´¶¤¬¤¹¤ë...",
4626 "You have a bad feeling...",
4632 "You feel nervous.",
4636 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4638 "You feel your luck is turning...",
4642 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4644 "You don't like the look of this place.",
4648 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4650 "This level looks reasonably safe.",
4654 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4656 "What a boring place..."
4661 static cptr do_cmd_feeling_text_combat[11] =
4664 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4666 "Looks like any other level.",
4670 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4672 "You feel there is something special about this level.",
4676 "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4678 "You nearly faint as horrible visions of death fill your mind!",
4682 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4684 "This level looks very dangerous.",
4688 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4690 "You have a very bad feeling...",
4694 "°¤¤Í½´¶¤¬¤¹¤ë...",
4696 "You have a bad feeling...",
4702 "You feel nervous.",
4706 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4708 "You feel your luck is turning...",
4712 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4714 "You don't like the look of this place.",
4718 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4720 "This level looks reasonably safe.",
4724 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4726 "What a boring place..."
4731 static cptr do_cmd_feeling_text_lucky[11] =
4734 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4735 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4736 "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4737 "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4738 "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4739 "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4740 "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4741 "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤¤¿¤«...",
4742 "¸«¤¿´¶¤¸°¤¯¤Ï¤Ê¤¤...",
4743 "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4744 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4746 "Looks like any other level.",
4747 "You feel there is something special about this level.",
4748 "You have a superb feeling about this level.",
4749 "You have an excellent feeling...",
4750 "You have a very good feeling...",
4751 "You have a good feeling...",
4752 "You feel strangely lucky...",
4753 "You feel your luck is turning...",
4754 "You like the look of this place...",
4755 "This level can't be all bad...",
4756 "What a boring place..."
4762 * Note that "feeling" is set to zero unless some time has passed.
4763 * Note that this is done when the level is GENERATED, not entered.
4765 void do_cmd_feeling(void)
4767 /* Verify the feeling */
4768 if (feeling > 10) feeling = 10;
4770 /* No useful feeling in quests */
4771 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4774 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4776 msg_print("Looks like a typical quest level.");
4782 /* No useful feeling in town */
4783 else if (p_ptr->town_num && !dun_level)
4786 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4788 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4792 msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4794 msg_print("Looks like a strange wilderness.");
4802 msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4804 msg_print("Looks like a typical town.");
4811 /* No useful feeling in the wilderness */
4812 else if (!dun_level)
4815 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4817 msg_print("Looks like a typical wilderness.");
4823 /* Display the feeling */
4824 if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4826 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4828 if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4829 msg_print(do_cmd_feeling_text_combat[feeling]);
4831 msg_print(do_cmd_feeling_text[feeling]);
4836 msg_print(do_cmd_feeling_text[0]);
4843 * Description of each monster group.
4845 static cptr monster_group_text[] =
4848 "¥æ¥Ë¡¼¥¯", /* "Uniques" */
4877 /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4894 /* "¾åµé¥Ç¡¼¥â¥ó", */
4934 /* "Ancient Dragon/Wyrm", */
4943 "Multi-Headed Reptile",
4948 "Reptile/Amphibian",
4949 "Spider/Scorpion/Tick",
4951 /* "Major Demon", */
4967 * Symbols of monsters in each group. Note the "Uniques" group
4968 * is handled differently.
4970 static cptr monster_group_char[] =
5024 "$!?=&`.|/\\~[]()>",
5033 * hook function to sort monsters by level
5035 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5037 u16b *who = (u16b*)(u);
5042 monster_race *r_ptr1 = &r_info[w1];
5043 monster_race *r_ptr2 = &r_info[w2];
5048 if (r_ptr2->level > r_ptr1->level) return TRUE;
5049 if (r_ptr1->level > r_ptr2->level) return FALSE;
5051 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5052 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5057 * Build a list of monster indexes in the given group. Return the number
5058 * of monsters in the group.
5060 * mode & 0x01 : check for non-empty group
5061 * mode & 0x02 : cheat?
5063 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5068 /* Get a list of x_char in this group */
5069 cptr group_char = monster_group_char[grp_cur];
5071 /* XXX Hack -- Check if this is the "Uniques" group */
5072 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5074 /* Check every race */
5075 for (i = 0; i < max_r_idx; i++)
5077 /* Access the race */
5078 monster_race *r_ptr = &r_info[i];
5080 /* Skip empty race */
5081 if (!r_ptr->name) continue ;
5083 /* Require known monsters */
5084 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5086 if (grp_unique && !(r_ptr->flags1 & RF1_UNIQUE)) continue;
5088 /* Check for race in the group */
5089 if (grp_unique || strchr(group_char, r_ptr->d_char))
5092 mon_idx[mon_cnt++] = i;
5094 /* XXX Hack -- Just checking for non-empty group */
5095 if (mode & 0x01) break;
5099 /* Terminate the list */
5100 mon_idx[mon_cnt] = 0;
5102 /* Select the sort method */
5103 ang_sort_comp = ang_sort_comp_monster_level;
5104 ang_sort_swap = ang_sort_swap_hook;
5106 /* Sort by monster level */
5107 ang_sort(mon_idx, &dummy_why, mon_cnt);
5109 /* Return the number of races */
5115 * Description of each monster group.
5117 static cptr object_group_text[] =
5120 "¥¥Î¥³", /* "Mushrooms" */
5121 "Ìô", /* "Potions" */
5122 "Ìý¤Ä¤Ü", /* "Flasks" */
5123 "´¬Êª", /* "Scrolls" */
5124 "»ØÎØ", /* "Rings" */
5125 "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5126 "ū", /* "Whistle" */
5127 "¸÷¸»", /* "Lanterns" */
5128 "ËâË¡ËÀ", /* "Wands" */
5129 "¾ó", /* "Staffs" */
5130 "¥í¥Ã¥É", /* "Rods" */
5131 "¥«¡¼¥É", /* "Cards" */
5132 "¥¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5141 "Åá·õÎà", /* "Swords" */
5142 "Æß´ï", /* "Blunt Weapons" */
5143 "ĹÊÁÉð´ï", /* "Polearms" */
5144 "ºÎ·¡Æ»¶ñ", /* "Diggers" */
5145 "Èô¤ÓÆ»¶ñ", /* "Bows" */
5149 "·ÚÁõ³»", /* "Soft Armor" */
5150 "½ÅÁõ³»", /* "Hard Armor" */
5151 "¥É¥é¥´¥ó³»", /* "Dragon Armor" */
5152 "½â", /* "Shields" */
5153 "¥¯¥í¡¼¥¯", /* "Cloaks" */
5154 "äƼê", /* "Gloves" */
5155 "¥Ø¥ë¥á¥Ã¥È", /* "Helms" */
5156 "´§", /* "Crowns" */
5157 "¥Ö¡¼¥Ä", /* "Boots" */
5205 * TVALs of items in each group
5207 static byte object_group_tval[] =
5247 TV_LIFE_BOOK, /* Hack -- all spellbooks */
5253 * Build a list of monster indexes in the given group. Return the number
5254 * of monsters in the group.
5256 static int collect_objects(int grp_cur, int object_idx[])
5258 int i, j, k, object_cnt = 0;
5260 /* Get a list of x_char in this group */
5261 byte group_tval = object_group_tval[grp_cur];
5263 /* Check every object */
5264 for (i = 0; i < max_k_idx; i++)
5266 /* Access the race */
5267 object_kind *k_ptr = &k_info[i];
5269 /* Skip empty objects */
5270 if (!k_ptr->name) continue;
5272 /* Skip non-flavoured objects */
5273 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5275 /* Skip items with no distribution (special artifacts) */
5276 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5279 /* Require objects ever seen*/
5280 if (!k_ptr->aware && !p_ptr->wizard) continue;
5282 /* Check for race in the group */
5283 if (TV_LIFE_BOOK == group_tval)
5285 /* Hack -- All spell books */
5286 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5289 object_idx[object_cnt++] = i;
5292 else if (k_ptr->tval == group_tval)
5295 object_idx[object_cnt++] = i;
5299 /* Terminate the list */
5300 object_idx[object_cnt] = 0;
5302 /* Return the number of races */
5308 * Description of each feature group.
5310 static cptr feature_group_text[] =
5318 * Build a list of feature indexes in the given group. Return the number
5319 * of features in the group.
5321 static int collect_features(int grp_cur, int *feat_idx)
5323 int i, feat_cnt = 0;
5325 /* Unused; There is a single group. */
5328 /* Check every feature */
5329 for (i = 1; i < max_f_idx; i++)
5331 /* Access the index */
5332 feature_type *f_ptr = &f_info[i];
5334 /* Skip empty index */
5335 if (!f_ptr->name) continue;
5337 /* Skip mimiccing features */
5338 if (f_ptr->mimic != i) continue;
5341 feat_idx[feat_cnt++] = i;
5344 /* Terminate the list */
5345 feat_idx[feat_cnt] = 0;
5347 /* Return the number of races */
5354 * Build a list of monster indexes in the given group. Return the number
5355 * of monsters in the group.
5357 static int collect_artifacts(int grp_cur, int object_idx[])
5359 int i, object_cnt = 0;
5361 /* Get a list of x_char in this group */
5362 byte group_tval = object_group_tval[grp_cur];
5364 /* Check every object */
5365 for (i = 0; i < max_a_idx; i++)
5367 /* Access the artifact */
5368 artifact_type *a_ptr = &a_info[i];
5370 /* Skip empty artifacts */
5371 if (!a_ptr->name) continue;
5373 /* Skip "uncreated" artifacts */
5374 if (!a_ptr->cur_num) continue;
5376 /* Check for race in the group */
5377 if (a_ptr->tval == group_tval)
5380 object_idx[object_cnt++] = i;
5384 /* Terminate the list */
5385 object_idx[object_cnt] = 0;
5387 /* Return the number of races */
5394 * Encode the screen colors
5396 static char hack[17] = "dwsorgbuDWvyRGBU";
5399 static errr photo_fgets(FILE *fff, char *buf, huge n)
5408 if (fgets(tmp, 1024, fff))
5410 /* Convert weirdness */
5411 for (s = tmp; *s; s++)
5413 /* Handle newline */
5424 else if (*s == '\t')
5426 /* Hack -- require room */
5427 if (i + 8 >= n) break;
5429 /* Append a space */
5432 /* Append some more spaces */
5433 while (!(i % 8)) buf[i++] = ' ';
5437 else if (iskanji(*s))
5444 /* Ⱦ³Ñ¤«¤Ê¤ËÂбþ */
5445 else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf))
5452 /* Handle printables */
5473 * Hack -- load a screen dump from a file
5475 void do_cmd_load_screen(void)
5490 Term_get_size(&wid, &hgt);
5492 /* Build the filename */
5493 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5495 /* Append to the file */
5496 fff = my_fopen(buf, "r");
5501 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5503 msg_format("Failed to open %s.", buf);
5510 /* Save the screen */
5513 /* Clear the screen */
5517 /* Load the screen */
5518 for (y = 0; okay && (y < hgt); y++)
5520 /* Get a line of data */
5521 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5524 for (x = 0; x < wid - 1; x++)
5526 /* Put the attr/char */
5527 Term_draw(x, y, TERM_WHITE, buf[x]);
5531 /* Get the blank line */
5532 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5535 /* Dump the screen */
5536 for (y = 0; okay && (y < hgt); y++)
5538 /* Get a line of data */
5539 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5542 for (x = 0; x < wid - 1; x++)
5544 /* Get the attr/char */
5545 (void)(Term_what(x, y, &a, &c));
5547 /* Look up the attr */
5548 for (i = 0; i < 16; i++)
5550 /* Use attr matches */
5551 if (hack[i] == buf[x]) a = i;
5554 /* Put the attr/char */
5555 Term_draw(x, y, a, c);
5560 /* Get the blank line */
5561 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5570 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5572 msg_print("Screen dump loaded.");
5579 /* Restore the screen */
5586 cptr inven_res_label =
5588 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5590 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5593 /* XTRA HACK RESLIST */
5594 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr,
5595 int *j, byte tval, char *where)
5597 char o_name[MAX_NLEN];
5598 u32b flgs[TR_FLAG_SIZE];
5600 if (!o_ptr->k_idx)return;
5601 if (o_ptr->tval != tval)return;
5604 * HACK:Ring of Lordly protection and Dragon shield/helm
5605 * have random resistances.
5607 if ( ((o_ptr->tval >= TV_BOW && o_ptr->tval<= TV_DRAG_ARMOR && o_ptr->name2)
5608 || (o_ptr->tval == TV_RING && o_ptr->sval == SV_RING_LORDLY)
5609 || (o_ptr->tval == TV_SHIELD && o_ptr->sval == SV_DRAGON_SHIELD)
5610 || (o_ptr->tval == TV_HELM && o_ptr->sval == SV_DRAGON_HELM)
5611 || (o_ptr->tval == TV_GLOVES && o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
5612 || (o_ptr->tval == TV_BOOTS && o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
5613 || o_ptr->art_name || o_ptr->name1) && object_known_p(o_ptr))
5616 object_desc(o_name, o_ptr, TRUE, 0);
5618 while ( o_name[i] && i < 26 ){
5620 if (iskanji(o_name[i])) i++;
5624 if(i<28) while(i<28){o_name[i]=' ';i++;}
5627 fprintf(fff,"%s %s", where, o_name);
5629 if (!(o_ptr->ident & (IDENT_MENTAL)))
5632 fprintf(fff, "-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n");
5634 fprintf(fff, "-------unknown------------ -------unknown------\n");
5638 object_flags_known(o_ptr, flgs);
5641 if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"¡ö");
5642 else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"¡Ü");
5643 else fprintf(fff,"¡¦");
5645 if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"¡ö");
5646 else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"¡Ü");
5647 else fprintf(fff,"¡¦");
5649 if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"¡ö");
5650 else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"¡Ü");
5651 else fprintf(fff,"¡¦");
5653 if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"¡ö");
5654 else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"¡Ü");
5655 else fprintf(fff,"¡¦");
5657 if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"¡Ü");
5658 else fprintf(fff,"¡¦");
5660 if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"¡Ü");
5661 else fprintf(fff,"¡¦");
5663 if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"¡Ü");
5664 else fprintf(fff,"¡¦");
5666 if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"¡Ü");
5667 else fprintf(fff,"¡¦");
5669 if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"¡Ü");
5670 else fprintf(fff,"¡¦");
5672 if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"¡Ü");
5673 else fprintf(fff,"¡¦");
5675 if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"¡Ü");
5676 else fprintf(fff,"¡¦");
5678 if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"¡Ü");
5679 else fprintf(fff,"¡¦");
5681 if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"¡Ü");
5682 else fprintf(fff,"¡¦");
5686 if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"¡Ü");
5687 else fprintf(fff,"¡¦");
5689 if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"¡Ü");
5690 else fprintf(fff,"¡¦");
5692 if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"¡Ü");
5693 else fprintf(fff,"¡¦");
5695 if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"¡Ü");
5696 else fprintf(fff,"¡¦");
5698 if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"¡Ü");
5699 else fprintf(fff,"¡¦");
5701 if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"¡Ü");
5702 else fprintf(fff,"¡¦");
5704 if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"¡Ü");
5705 else fprintf(fff,"¡¦");
5707 if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"¡Ü");
5708 else fprintf(fff,"¡¦");
5711 if (have_flag(flgs, TR_REGEN)) fprintf(fff,"¡Ü");
5712 else fprintf(fff,"¡¦");
5714 if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"¡Ü");
5715 else fprintf(fff,"¡¦");
5717 if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"* ");
5718 else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"+ ");
5719 else fprintf(fff,". ");
5721 if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"* ");
5722 else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"+ ");
5723 else fprintf(fff,". ");
5725 if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"* ");
5726 else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"+ ");
5727 else fprintf(fff,". ");
5729 if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"* ");
5730 else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"+ ");
5731 else fprintf(fff,". ");
5733 if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"+ ");
5734 else fprintf(fff,". ");
5736 if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"+ ");
5737 else fprintf(fff,". ");
5739 if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"+ ");
5740 else fprintf(fff,". ");
5742 if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"+ ");
5743 else fprintf(fff,". ");
5745 if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"+ ");
5746 else fprintf(fff,". ");
5748 if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"+ ");
5749 else fprintf(fff,". ");
5751 if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"+ ");
5752 else fprintf(fff,". ");
5754 if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"+ ");
5755 else fprintf(fff,". ");
5757 if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"+ ");
5758 else fprintf(fff,". ");
5762 if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"+ ");
5763 else fprintf(fff,". ");
5765 if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"+ ");
5766 else fprintf(fff,". ");
5768 if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"+ ");
5769 else fprintf(fff,". ");
5771 if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"+ ");
5772 else fprintf(fff,". ");
5774 if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"+ ");
5775 else fprintf(fff,". ");
5777 if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"+ ");
5778 else fprintf(fff,". ");
5780 if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"+ ");
5781 else fprintf(fff,". ");
5783 if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"+ ");
5784 else fprintf(fff,". ");
5787 if (have_flag(flgs, TR_REGEN)) fprintf(fff,"+ ");
5788 else fprintf(fff,". ");
5790 if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"+ ");
5791 else fprintf(fff,". ");
5799 fprintf(fff,"%s\n", inven_res_label);
5805 * Display *ID* ed weapons/armors's resistances
5807 static void do_cmd_knowledge_inven(void)
5812 char file_name[1024];
5823 /* Open a new file */
5824 fff = my_fopen_temp(file_name, 1024);
5827 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5829 msg_format("Failed to create temporary file %s.", file_name);
5834 fprintf(fff,"%s\n",inven_res_label);
5836 for (tval=TV_BOW; tval <= TV_RING; tval++){
5839 for (;j<9;j++) fprintf(fff, "\n");
5841 fprintf(fff,"%s\n",inven_res_label);
5845 strcpy(where, "Áõ");
5847 strcpy(where, "E ");
5849 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5851 o_ptr = &inventory[i];
5852 do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5856 strcpy(where, "»ý");
5858 strcpy(where, "I ");
5860 for (i = 0; i < INVEN_PACK; i++)
5862 o_ptr = &inventory[i];
5863 do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5867 /* Print all homes in the different towns */
5868 st_ptr = &town[1].store[STORE_HOME];
5870 strcpy(where, "²È");
5872 strcpy(where, "H ");
5875 /* Dump all available items */
5876 for (i = 0; i < st_ptr->stock_num; i++)
5878 o_ptr = &st_ptr->stock[i];
5879 do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5883 /* Close the file */
5886 /* Display the file contents */
5888 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5890 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5893 /* Remove the file */
5898 void do_cmd_save_screen_html_aux(char *filename, int message)
5902 byte a = 0, old_a = 0;
5916 cptr html_head[] = {
5917 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5921 cptr html_foot[] = {
5923 "</body>\n</html>\n",
5929 Term_get_size(&wid, &hgt);
5931 /* File type is "TEXT" */
5932 FILE_TYPE(FILE_TYPE_TEXT);
5934 /* Append to the file */
5935 fff = my_fopen(filename, "w");
5941 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5943 msg_format("Failed to open file %s.", filename);
5951 /* Save the screen */
5955 /* Build the filename */
5956 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5957 tmpfff = my_fopen(buf, "r");
5959 for (i = 0; html_head[i]; i++)
5960 fprintf(fff, html_head[i]);
5964 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5966 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5970 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5972 fprintf(fff, "%s\n", buf);
5977 /* Dump the screen */
5978 for (y = 0; y < hgt; y++)
5985 for (x = 0; x < wid - 1; x++)
5989 /* Get the attr/char */
5990 (void)(Term_what(x, y, &a, &c));
5994 case '&': cc = "&"; break;
5995 case '<': cc = "<"; break;
5996 case '>': cc = ">"; break;
5998 case 0x1f: c = '.'; break;
5999 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
6004 if ((y == 0 && x == 0) || a != old_a) {
6005 rv = angband_color_table[a][1];
6006 gv = angband_color_table[a][2];
6007 bv = angband_color_table[a][3];
6008 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
6009 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
6013 fprintf(fff, "%s", cc);
6015 fprintf(fff, "%c", c);
6018 fprintf(fff, "</font>");
6021 for (i = 0; html_foot[i]; i++)
6022 fprintf(fff, html_foot[i]);
6027 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
6029 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
6033 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
6035 fprintf(fff, "%s\n", buf);
6050 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6052 msg_print("Screen dump saved.");
6057 /* Restore the screen */
6063 * Hack -- save a screen dump to a file
6065 static void do_cmd_save_screen_html(void)
6067 char buf[1024], tmp[256] = "screen.html";
6070 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
6072 if (!get_string("File name: ", tmp, 80))
6076 /* Build the filename */
6077 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
6081 do_cmd_save_screen_html_aux(buf, 1);
6086 * Redefinable "save_screen" action
6088 void (*screendump_aux)(void) = NULL;
6092 * Hack -- save a screen dump to a file
6094 void do_cmd_save_screen(void)
6096 bool old_use_graphics = use_graphics;
6097 bool html_dump = FALSE;
6102 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6104 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6109 if (c == 'Y' || c == 'y')
6111 else if (c == 'H' || c == 'h')
6123 Term_get_size(&wid, &hgt);
6125 if (old_use_graphics)
6127 use_graphics = FALSE;
6130 /* Redraw everything */
6131 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6133 /* Hack -- update */
6139 do_cmd_save_screen_html();
6143 /* Do we use a special screendump function ? */
6144 else if (screendump_aux)
6146 /* Dump the screen to a graphics file */
6147 (*screendump_aux)();
6149 else /* Dump the screen as text */
6160 /* Build the filename */
6161 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6163 /* File type is "TEXT" */
6164 FILE_TYPE(FILE_TYPE_TEXT);
6166 /* Append to the file */
6167 fff = my_fopen(buf, "w");
6173 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6175 msg_format("Failed to open file %s.", buf);
6182 /* Save the screen */
6186 /* Dump the screen */
6187 for (y = 0; y < hgt; y++)
6190 for (x = 0; x < wid - 1; x++)
6192 /* Get the attr/char */
6193 (void)(Term_what(x, y, &a, &c));
6203 fprintf(fff, "%s\n", buf);
6210 /* Dump the screen */
6211 for (y = 0; y < hgt; y++)
6214 for (x = 0; x < wid - 1; x++)
6216 /* Get the attr/char */
6217 (void)(Term_what(x, y, &a, &c));
6220 buf[x] = hack[a&0x0F];
6227 fprintf(fff, "%s\n", buf);
6239 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6241 msg_print("Screen dump saved.");
6247 /* Restore the screen */
6251 if (old_use_graphics)
6253 use_graphics = TRUE;
6256 /* Redraw everything */
6257 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6259 /* Hack -- update */
6266 * Sorting hook -- Comp function -- see below
6268 * We use "u" to point to array of monster indexes,
6269 * and "v" to select the type of sorting to perform on "u".
6271 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6273 u16b *who = (u16b*)(u);
6275 u16b *why = (u16b*)(v);
6282 /* Sort by total kills */
6285 /* Extract total kills */
6286 z1 = a_info[w1].tval;
6287 z2 = a_info[w2].tval;
6289 /* Compare total kills */
6290 if (z1 < z2) return (TRUE);
6291 if (z1 > z2) return (FALSE);
6295 /* Sort by monster level */
6298 /* Extract levels */
6299 z1 = a_info[w1].sval;
6300 z2 = a_info[w2].sval;
6302 /* Compare levels */
6303 if (z1 < z2) return (TRUE);
6304 if (z1 > z2) return (FALSE);
6308 /* Sort by monster experience */
6311 /* Extract experience */
6312 z1 = a_info[w1].level;
6313 z2 = a_info[w2].level;
6315 /* Compare experience */
6316 if (z1 < z2) return (TRUE);
6317 if (z1 > z2) return (FALSE);
6321 /* Compare indexes */
6327 * Sorting hook -- Swap function -- see below
6329 * We use "u" to point to array of monster indexes,
6330 * and "v" to select the type of sorting to perform.
6332 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6334 u16b *who = (u16b*)(u);
6349 * Check the status of "artifacts"
6351 static void do_cmd_knowledge_artifacts(void)
6353 int i, k, z, x, y, n = 0;
6359 char file_name[1024];
6361 char base_name[MAX_NLEN];
6365 /* Open a new file */
6366 fff = my_fopen_temp(file_name, 1024);
6370 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6372 msg_format("Failed to create temporary file %s.", file_name);
6378 /* Allocate the "who" array */
6379 C_MAKE(who, max_a_idx, s16b);
6381 /* Allocate the "okay" array */
6382 C_MAKE(okay, max_a_idx, bool);
6384 /* Scan the artifacts */
6385 for (k = 0; k < max_a_idx; k++)
6387 artifact_type *a_ptr = &a_info[k];
6392 /* Skip "empty" artifacts */
6393 if (!a_ptr->name) continue;
6395 /* Skip "uncreated" artifacts */
6396 if (!a_ptr->cur_num) continue;
6402 /* Check the dungeon */
6403 for (y = 0; y < cur_hgt; y++)
6405 for (x = 0; x < cur_wid; x++)
6407 cave_type *c_ptr = &cave[y][x];
6409 s16b this_o_idx, next_o_idx = 0;
6411 /* Scan all objects in the grid */
6412 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6416 /* Acquire object */
6417 o_ptr = &o_list[this_o_idx];
6419 /* Acquire next object */
6420 next_o_idx = o_ptr->next_o_idx;
6422 /* Ignore non-artifacts */
6423 if (!artifact_p(o_ptr)) continue;
6425 /* Ignore known items */
6426 if (object_known_p(o_ptr)) continue;
6428 /* Note the artifact */
6429 okay[o_ptr->name1] = FALSE;
6434 /* Check the inventory and equipment */
6435 for (i = 0; i < INVEN_TOTAL; i++)
6437 object_type *o_ptr = &inventory[i];
6439 /* Ignore non-objects */
6440 if (!o_ptr->k_idx) continue;
6442 /* Ignore non-artifacts */
6443 if (!artifact_p(o_ptr)) continue;
6445 /* Ignore known items */
6446 if (object_known_p(o_ptr)) continue;
6448 /* Note the artifact */
6449 okay[o_ptr->name1] = FALSE;
6452 for (k = 0; k < max_a_idx; k++)
6454 if (okay[k]) who[n++] = k;
6457 /* Select the sort method */
6458 ang_sort_comp = ang_sort_art_comp;
6459 ang_sort_swap = ang_sort_art_swap;
6461 /* Sort the array by dungeon depth of monsters */
6462 ang_sort(who, &why, n);
6464 /* Scan the artifacts */
6465 for (k = 0; k < n; k++)
6467 artifact_type *a_ptr = &a_info[who[k]];
6471 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6473 strcpy(base_name, "Unknown Artifact");
6477 /* Obtain the base object type */
6478 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6486 /* Get local object */
6489 /* Create fake object */
6490 object_prep(q_ptr, z);
6492 /* Make it an artifact */
6493 q_ptr->name1 = (byte)who[k];
6495 /* Describe the artifact */
6496 object_desc_store(base_name, q_ptr, FALSE, 0);
6499 /* Hack -- Build the artifact name */
6501 fprintf(fff, " %s\n", base_name);
6503 fprintf(fff, " The %s\n", base_name);
6508 /* Free the "who" array */
6509 C_KILL(who, max_a_idx, s16b);
6511 /* Free the "okay" array */
6512 C_KILL(okay, max_a_idx, bool);
6514 /* Close the file */
6517 /* Display the file contents */
6519 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6521 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6525 /* Remove the file */
6531 * Display known uniques
6533 static void do_cmd_knowledge_uniques(void)
6541 char file_name[1024];
6543 /* Open a new file */
6544 fff = my_fopen_temp(file_name, 1024);
6548 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6550 msg_format("Failed to create temporary file %s.", file_name);
6556 /* Allocate the "who" array */
6557 C_MAKE(who, max_r_idx, s16b);
6559 /* Scan the monsters */
6560 for (i = 1; i < max_r_idx; i++)
6562 monster_race *r_ptr = &r_info[i];
6564 /* Use that monster */
6565 if (r_ptr->name) who[n++] = i;
6568 /* Select the sort method */
6569 ang_sort_comp = ang_sort_comp_hook;
6570 ang_sort_swap = ang_sort_swap_hook;
6572 /* Sort the array by dungeon depth of monsters */
6573 ang_sort(who, &why, n);
6575 /* Scan the monster races */
6576 for (k = 0; k < n; k++)
6578 monster_race *r_ptr = &r_info[who[k]];
6580 /* Only print Uniques */
6581 if (r_ptr->flags1 & (RF1_UNIQUE))
6583 bool dead = (r_ptr->max_num == 0);
6587 /* Only display "known" uniques */
6588 if (dead || cheat_know || r_ptr->r_sights)
6590 /* Print a message */
6592 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6593 (r_name + r_ptr->name));
6595 fprintf(fff, " %s is alive\n",
6596 (r_name + r_ptr->name));
6603 /* Free the "who" array */
6604 C_KILL(who, max_r_idx, s16b);
6606 /* Close the file */
6609 /* Display the file contents */
6611 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6613 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6617 /* Remove the file */
6623 * Display weapon-exp
6625 static void do_cmd_knowledge_weapon_exp(void)
6627 int i, j, num, weapon_exp;
6631 char file_name[1024];
6634 /* Open a new file */
6635 fff = my_fopen_temp(file_name, 1024);
6638 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6640 msg_format("Failed to create temporary file %s.", file_name);
6646 for (i = 0; i < 5; i++)
6648 for (num = 0; num < 64; num++)
6650 for (j = 0; j < max_k_idx; j++)
6652 object_kind *k_ptr = &k_info[j];
6654 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6656 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6658 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6660 fprintf(fff, "%-25s ", tmp);
6661 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6662 else fprintf(fff, " ");
6663 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6664 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6672 /* Close the file */
6675 /* Display the file contents */
6677 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6679 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6683 /* Remove the file */
6691 static void do_cmd_knowledge_spell_exp(void)
6693 int i = 0, spell_exp, exp_level;
6698 char file_name[1024];
6700 /* Open a new file */
6701 fff = my_fopen_temp(file_name, 1024);
6704 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6706 msg_format("Failed to create temporary file %s.", file_name);
6712 if (p_ptr->realm1 != REALM_NONE)
6715 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6717 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6719 for (i = 0; i < 32; i++)
6721 if (!is_magic(p_ptr->realm1))
6723 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6727 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6729 if (s_ptr->slevel >= 99) continue;
6730 spell_exp = p_ptr->spell_exp[i];
6731 exp_level = spell_exp_level(spell_exp);
6732 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6733 if (p_ptr->realm1 == REALM_HISSATSU)
6734 fprintf(fff, "[--]");
6737 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6738 else fprintf(fff, " ");
6739 fprintf(fff, "%s", exp_level_str[exp_level]);
6741 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6746 if (p_ptr->realm2 != REALM_NONE)
6749 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6751 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6753 for (i = 0; i < 32; i++)
6755 if (!is_magic(p_ptr->realm1))
6757 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6761 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6763 if (s_ptr->slevel >= 99) continue;
6765 spell_exp = p_ptr->spell_exp[i + 32];
6766 exp_level = spell_exp_level(spell_exp);
6767 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6768 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6769 else fprintf(fff, " ");
6770 fprintf(fff, "%s", exp_level_str[exp_level]);
6771 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6776 /* Close the file */
6779 /* Display the file contents */
6781 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6783 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6787 /* Remove the file */
6795 static void do_cmd_knowledge_skill_exp(void)
6797 int i = 0, skill_exp;
6801 char file_name[1024];
6803 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6805 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6808 /* Open a new file */
6809 fff = my_fopen_temp(file_name, 1024);
6812 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6814 msg_format("Failed to create temporary file %s.", file_name);
6820 for (i = 0; i < 3; i++)
6822 skill_exp = p_ptr->skill_exp[i];
6823 fprintf(fff, "%-20s ", skill_name[i]);
6824 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6825 else fprintf(fff, " ");
6826 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6827 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6831 /* Close the file */
6834 /* Display the file contents */
6836 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6838 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6842 /* Remove the file */
6848 * Pluralize a monster name
6850 void plural_aux(char *Name)
6852 int NameLen = strlen(Name);
6854 if (strstr(Name, "Disembodied hand"))
6856 strcpy(Name, "Disembodied hands that strangled people");
6858 else if (strstr(Name, "Colour out of space"))
6860 strcpy(Name, "Colours out of space");
6862 else if (strstr(Name, "stairway to hell"))
6864 strcpy(Name, "stairways to hell");
6866 else if (strstr(Name, "Dweller on the threshold"))
6868 strcpy(Name, "Dwellers on the threshold");
6870 else if (strstr(Name, " of "))
6872 cptr aider = strstr(Name, " of ");
6883 if (dummy[i-1] == 's')
6885 strcpy(&(dummy[i]), "es");
6890 strcpy(&(dummy[i]), "s");
6893 strcpy(&(dummy[i+1]), aider);
6894 strcpy(Name, dummy);
6896 else if (strstr(Name, "coins"))
6899 strcpy(dummy, "piles of ");
6900 strcat(dummy, Name);
6901 strcpy(Name, dummy);
6904 else if (strstr(Name, "Manes"))
6908 else if (streq(&(Name[NameLen - 2]), "ey"))
6910 strcpy(&(Name[NameLen - 2]), "eys");
6912 else if (Name[NameLen - 1] == 'y')
6914 strcpy(&(Name[NameLen - 1]), "ies");
6916 else if (streq(&(Name[NameLen - 4]), "ouse"))
6918 strcpy(&(Name[NameLen - 4]), "ice");
6920 else if (streq(&(Name[NameLen - 2]), "us"))
6922 strcpy(&(Name[NameLen - 2]), "i");
6924 else if (streq(&(Name[NameLen - 6]), "kelman"))
6926 strcpy(&(Name[NameLen - 6]), "kelmen");
6928 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6930 strcpy(&(Name[NameLen - 8]), "wordsmen");
6932 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6934 strcpy(&(Name[NameLen - 7]), "oodsmen");
6936 else if (streq(&(Name[NameLen - 7]), "eastman"))
6938 strcpy(&(Name[NameLen - 7]), "eastmen");
6940 else if (streq(&(Name[NameLen - 8]), "izardman"))
6942 strcpy(&(Name[NameLen - 8]), "izardmen");
6944 else if (streq(&(Name[NameLen - 5]), "geist"))
6946 strcpy(&(Name[NameLen - 5]), "geister");
6948 else if (streq(&(Name[NameLen - 2]), "ex"))
6950 strcpy(&(Name[NameLen - 2]), "ices");
6952 else if (streq(&(Name[NameLen - 2]), "lf"))
6954 strcpy(&(Name[NameLen - 2]), "lves");
6956 else if (suffix(Name, "ch") ||
6957 suffix(Name, "sh") ||
6958 suffix(Name, "nx") ||
6959 suffix(Name, "s") ||
6962 strcpy(&(Name[NameLen]), "es");
6966 strcpy(&(Name[NameLen]), "s");
6971 * Display current pets
6973 static void do_cmd_knowledge_pets(void)
6977 monster_type *m_ptr;
6980 int show_upkeep = 0;
6981 char file_name[1024];
6984 /* Open a new file */
6985 fff = my_fopen_temp(file_name, 1024);
6988 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6990 msg_format("Failed to create temporary file %s.", file_name);
6996 /* Process the monsters (backwards) */
6997 for (i = m_max - 1; i >= 1; i--)
6999 /* Access the monster */
7002 /* Ignore "dead" monsters */
7003 if (!m_ptr->r_idx) continue;
7005 /* Calculate "upkeep" for pets */
7009 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
7010 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
7014 /* Process the waiting pets (backwards) */
7015 for (i = MAX_PARTY_MON - 1; i >= 0; i--)
7017 /* Access the monster */
7018 m_ptr = &party_mon[i];
7020 /* Ignore "dead" monsters */
7021 if (!m_ptr->r_idx) continue;
7025 /* List waiting pets */
7026 monster_desc(pet_name, m_ptr, MD_ASSUME_OUTSIDE | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
7027 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
7030 show_upkeep = calculate_upkeep();
7032 fprintf(fff, "----------------------------------------------\n");
7034 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
7035 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
7037 fprintf(fff, " Total: %d pet%s.\n",
7038 t_friends, (t_friends == 1 ? "" : "s"));
7039 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
7044 /* Close the file */
7047 /* Display the file contents */
7049 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
7051 show_file(TRUE, file_name, "Current Pets", 0, 0);
7055 /* Remove the file */
7063 * Note that the player ghosts are ignored. XXX XXX XXX
7065 static void do_cmd_knowledge_kill_count(void)
7073 char file_name[1024];
7078 /* Open a new file */
7079 fff = my_fopen_temp(file_name, 1024);
7083 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7085 msg_format("Failed to create temporary file %s.", file_name);
7091 /* Allocate the "who" array */
7092 C_MAKE(who, max_r_idx, s16b);
7095 /* Monsters slain */
7098 for (kk = 1; kk < max_r_idx; kk++)
7100 monster_race *r_ptr = &r_info[kk];
7102 if (r_ptr->flags1 & (RF1_UNIQUE))
7104 bool dead = (r_ptr->max_num == 0);
7113 s16b This = r_ptr->r_pkills;
7124 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7126 fprintf(fff,"You have defeated no enemies yet.\n\n");
7129 else if (Total == 1)
7131 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7133 fprintf(fff,"You have defeated one enemy.\n\n");
7138 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7140 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7147 /* Scan the monsters */
7148 for (i = 1; i < max_r_idx; i++)
7150 monster_race *r_ptr = &r_info[i];
7152 /* Use that monster */
7153 if (r_ptr->name) who[n++] = i;
7156 /* Select the sort method */
7157 ang_sort_comp = ang_sort_comp_hook;
7158 ang_sort_swap = ang_sort_swap_hook;
7160 /* Sort the array by dungeon depth of monsters */
7161 ang_sort(who, &why, n);
7163 /* Scan the monster races */
7164 for (k = 0; k < n; k++)
7166 monster_race *r_ptr = &r_info[who[k]];
7168 if (r_ptr->flags1 & (RF1_UNIQUE))
7170 bool dead = (r_ptr->max_num == 0);
7174 /* Print a message */
7175 fprintf(fff, " %s\n",
7176 (r_name + r_ptr->name));
7182 s16b This = r_ptr->r_pkills;
7187 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7188 if(strchr("pt",r_ptr->d_char))
7189 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7191 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7195 if (strstr(r_name + r_ptr->name, "coins"))
7197 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7201 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7207 strcpy(ToPlural, (r_name + r_ptr->name));
7208 plural_aux(ToPlural);
7209 fprintf(fff, " %d %s\n", This, ToPlural);
7219 fprintf(fff,"----------------------------------------------\n");
7221 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7223 fprintf(fff," Total: %lu creature%s killed.\n",
7224 Total, (Total == 1 ? "" : "s"));
7228 /* Free the "who" array */
7229 C_KILL(who, max_r_idx, s16b);
7231 /* Close the file */
7234 /* Display the file contents */
7236 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7238 show_file(TRUE, file_name, "Kill Count", 0, 0);
7242 /* Remove the file */
7248 * Display the object groups.
7250 static void display_group_list(int col, int row, int wid, int per_page,
7251 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7255 /* Display lines until done */
7256 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7258 /* Get the group index */
7259 int grp = grp_idx[grp_top + i];
7261 /* Choose a color */
7262 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7264 /* Erase the entire line */
7265 Term_erase(col, row + i, wid);
7267 /* Display the group label */
7268 c_put_str(attr, group_text[grp], row + i, col);
7274 * Move the cursor in a browser window
7276 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7277 int *list_cur, int list_cnt)
7282 int list = *list_cur;
7284 /* Extract direction */
7287 /* Hack -- scroll up full screen */
7292 /* Hack -- scroll down full screen */
7297 d = get_keymap_dir(ch);
7302 /* Diagonals - hack */
7303 if ((ddx[d] > 0) && ddy[d])
7309 Term_get_size(&wid, &hgt);
7311 browser_rows = hgt - 8;
7313 /* Browse group list */
7318 /* Move up or down */
7319 grp += ddy[d] * (browser_rows - 1);
7322 if (grp >= grp_cnt) grp = grp_cnt - 1;
7323 if (grp < 0) grp = 0;
7324 if (grp != old_grp) list = 0;
7327 /* Browse sub-list list */
7330 /* Move up or down */
7331 list += ddy[d] * browser_rows;
7334 if (list >= list_cnt) list = list_cnt - 1;
7335 if (list < 0) list = 0;
7347 if (col < 0) col = 0;
7348 if (col > 1) col = 1;
7355 /* Browse group list */
7360 /* Move up or down */
7364 if (grp >= grp_cnt) grp = grp_cnt - 1;
7365 if (grp < 0) grp = 0;
7366 if (grp != old_grp) list = 0;
7369 /* Browse sub-list list */
7372 /* Move up or down */
7376 if (list >= list_cnt) list = list_cnt - 1;
7377 if (list < 0) list = 0;
7388 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7392 /* Clear the display lines */
7393 for (i = 0; i < height; i++)
7395 Term_erase(col, row + i, width);
7398 /* Bigtile mode uses double width */
7399 if (use_bigtile) width /= 2;
7401 /* Display lines until done */
7402 for (i = 0; i < height; i++)
7404 /* Display columns until done */
7405 for (j = 0; j < width; j++)
7413 /* Bigtile mode uses double width */
7414 if (use_bigtile) x += j;
7419 /* Ignore illegal characters */
7420 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7421 (!use_graphics && ic > 0x7f))
7427 /* Force correct code for both ASCII character and tile */
7428 if (c & 0x80) a |= 0x80;
7430 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7432 /* Display symbol */
7433 Term_putch(x, y, a, c);
7436 if (use_bigtile) Term_putch(x + 1, y, a2, c2);
7443 * Place the cursor at the collect position for visual mode
7445 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7447 int i = (a & 0x7f) - attr_top;
7448 int j = c - char_left;
7453 /* Bigtile mode uses double width */
7454 if (use_bigtile) x += j;
7456 /* Place the cursor */
7462 * Clipboard variables for copy&paste in visual mode
7464 static byte attr_idx = 0;
7465 static byte char_idx = 0;
7468 * Do visual mode command -- Change symbols
7470 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7471 int height, int width,
7472 byte *attr_top_ptr, byte *char_left_ptr,
7473 byte *cur_attr_ptr, byte *cur_char_ptr)
7475 static byte attr_old = 0, char_old = 0;
7480 if (*visual_list_ptr)
7483 *cur_attr_ptr = attr_old;
7484 *cur_char_ptr = char_old;
7485 *visual_list_ptr = FALSE;
7494 if (*visual_list_ptr)
7497 *visual_list_ptr = FALSE;
7505 if (!*visual_list_ptr)
7507 *visual_list_ptr = TRUE;
7509 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7510 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7512 attr_old = *cur_attr_ptr;
7513 char_old = *cur_char_ptr;
7521 /* Set the visual */
7522 attr_idx = *cur_attr_ptr;
7523 char_idx = *cur_char_ptr;
7532 *cur_attr_ptr = attr_idx;
7533 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7539 *cur_char_ptr = char_idx;
7540 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7546 if (*visual_list_ptr)
7549 int d = get_keymap_dir(ch);
7550 byte a = (*cur_attr_ptr & 0x7f);
7551 byte c = *cur_char_ptr;
7553 if (use_bigtile) eff_width = width / 2;
7554 else eff_width = width;
7556 /* Restrict direction */
7557 if ((a == 0) && (ddy[d] < 0)) d = 0;
7558 if ((c == 0) && (ddx[d] < 0)) d = 0;
7559 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7560 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7565 /* Force correct code for both ASCII character and tile */
7566 if (c & 0x80) a |= 0x80;
7568 /* Set the visual */
7573 /* Move the frame */
7574 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7575 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7576 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7577 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7584 /* Visual mode command is not used */
7590 * Display the monsters in a group.
7592 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7593 int mon_cur, int mon_top)
7597 /* Display lines until done */
7598 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7604 /* Get the race index */
7605 int r_idx = mon_idx[mon_top + i] ;
7607 /* Access the race */
7608 monster_race *r_ptr = &r_info[r_idx];
7611 /* Choose a color */
7612 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7614 /* Display the name */
7615 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7617 /* Hack -- visual_list mode */
7620 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7622 else if (p_ptr->wizard)
7624 c_prt(attr, format("%d", r_idx), row + i, 60);
7629 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7631 /* Display symbol */
7632 Term_putch(70, row + i, a, c);
7635 if (use_bigtile) Term_putch(70 + 1, row + i, a2, c2);
7638 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7640 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7642 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7647 /* Clear remaining lines */
7648 for (; i < per_page; i++)
7650 Term_erase(col, row + i, 255);
7656 * Display known monsters.
7658 static void do_cmd_knowledge_monsters(void)
7661 int grp_cur, grp_top, old_grp_cur;
7662 int mon_cur, mon_top;
7663 int grp_cnt, grp_idx[100];
7671 bool visual_list = FALSE;
7672 byte attr_top = 0, char_left = 0;
7678 Term_get_size(&wid, &hgt);
7680 browser_rows = hgt - 8;
7682 /* Allocate the "mon_idx" array */
7683 C_MAKE(mon_idx, max_r_idx, s16b);
7688 /* Check every group */
7689 for (i = 0; monster_group_text[i] != NULL; i++)
7691 /* Measure the label */
7692 len = strlen(monster_group_text[i]);
7694 /* Save the maximum length */
7695 if (len > max) max = len;
7697 /* See if any monsters are known */
7698 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7700 /* Build a list of groups with known monsters */
7701 grp_idx[grp_cnt++] = i;
7705 /* Terminate the list */
7706 grp_idx[grp_cnt] = -1;
7709 grp_cur = grp_top = 0;
7710 mon_cur = mon_top = 0;
7719 monster_race *r_ptr;
7726 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7727 prt("¥°¥ë¡¼¥×", 4, 0);
7728 prt("̾Á°", 4, max + 3);
7729 if (p_ptr->wizard) prt("Idx", 4, 60);
7730 prt("ʸ»ú »¦³²¿ô", 4, 67);
7732 prt("Knowledge - Monsters", 2, 0);
7734 prt("Name", 4, max + 3);
7735 if (p_ptr->wizard) prt("Idx", 4, 60);
7736 prt("Sym Kills", 4, 67);
7739 for (i = 0; i < 78; i++)
7741 Term_putch(i, 5, TERM_WHITE, '=');
7744 for (i = 0; i < browser_rows; i++)
7746 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7752 /* Scroll group list */
7753 if (grp_cur < grp_top) grp_top = grp_cur;
7754 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7756 /* Display a list of monster groups */
7757 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7759 if (old_grp_cur != grp_cur)
7761 old_grp_cur = grp_cur;
7763 /* Get a list of monsters in the current group */
7764 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7767 /* Scroll monster list */
7768 while (mon_cur < mon_top)
7769 mon_top = MAX(0, mon_top - browser_rows/2);
7770 while (mon_cur >= mon_top + browser_rows)
7771 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7775 /* Display a list of monsters in the current group */
7776 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7782 /* Display a monster name */
7783 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7785 /* Display visual list below first monster */
7786 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7791 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7793 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);
7796 /* Get the current monster */
7797 r_ptr = &r_info[mon_idx[mon_cur]];
7799 /* Mega Hack -- track this monster race */
7800 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7802 /* Hack -- handle stuff */
7807 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7811 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7815 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7820 /* Do visual mode command if needed */
7821 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;
7834 /* Recall on screen */
7835 if (mon_idx[mon_cur])
7837 screen_roff(mon_idx[mon_cur], 0);
7848 /* Move the cursor */
7849 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7856 /* Free the "mon_idx" array */
7857 C_KILL(mon_idx, max_r_idx, s16b);
7862 * Display the objects in a group.
7864 static void display_object_list(int col, int row, int per_page, int object_idx[],
7865 int object_cur, int object_top)
7869 /* Display lines until done */
7870 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7876 /* Get the object index */
7877 int k_idx = object_idx[object_top + i];
7879 /* Access the object */
7880 object_kind *k_ptr = &k_info[k_idx];
7882 /* Choose a color */
7883 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7884 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7886 attr = ((i + object_top == object_cur) ? cursor : attr);
7889 strip_name(o_name, k_idx);
7891 /* Display the name */
7892 c_prt(attr, o_name, row + i, col);
7894 /* Hack -- visual_list mode */
7897 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7899 else if (p_ptr->wizard)
7901 c_prt(attr, format ("%d", k_idx), row + i, 70);
7904 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7905 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7907 /* Symbol is unknown */
7908 if (!k_ptr->aware && !p_ptr->wizard)
7914 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7916 /* Display symbol */
7917 Term_putch(76, row + i, a, c);
7920 if (use_bigtile) Term_putch(76 + 1, row + i, a2, c2);
7923 /* Clear remaining lines */
7924 for (; i < per_page; i++)
7926 Term_erase(col, row + i, 255);
7931 * Describe fake object
7933 static void desc_obj_fake(int k_idx)
7936 object_type object_type_body;
7938 /* Get local object */
7939 o_ptr = &object_type_body;
7941 /* Wipe the object */
7944 /* Create the artifact */
7945 object_prep(o_ptr, k_idx);
7947 /* It's fully know */
7948 o_ptr->ident |= IDENT_KNOWN;
7950 /* Track the object */
7951 /* object_actual_track(o_ptr); */
7953 /* Hack - mark as fake */
7954 /* term_obj_real = FALSE; */
7956 /* Hack -- Handle stuff */
7959 if (!screen_object(o_ptr, FALSE))
7962 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7964 msg_print("You see nothing special.");
7973 * Display known objects
7975 static void do_cmd_knowledge_objects(void)
7978 int grp_cur, grp_top, old_grp_cur;
7979 int object_old, object_cur, object_top;
7980 int grp_cnt, grp_idx[100];
7988 bool visual_list = FALSE;
7989 byte attr_top = 0, char_left = 0;
7995 Term_get_size(&wid, &hgt);
7997 browser_rows = hgt - 8;
7999 /* Allocate the "object_idx" array */
8000 C_MAKE(object_idx, max_k_idx, int);
8005 /* Check every group */
8006 for (i = 0; object_group_text[i] != NULL; i++)
8008 /* Measure the label */
8009 len = strlen(object_group_text[i]);
8011 /* Save the maximum length */
8012 if (len > max) max = len;
8014 /* See if any monsters are known */
8015 if (collect_objects(i, object_idx))
8017 /* Build a list of groups with known monsters */
8018 grp_idx[grp_cnt++] = i;
8022 /* Terminate the list */
8023 grp_idx[grp_cnt] = -1;
8026 grp_cur = grp_top = 0;
8027 object_cur = object_top = 0;
8044 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
8045 prt("¥°¥ë¡¼¥×", 4, 0);
8046 prt("̾Á°", 4, max + 3);
8047 if (p_ptr->wizard) prt("Idx", 4, 70);
8050 prt("Knowledge - objects", 2, 0);
8052 prt("Name", 4, max + 3);
8053 if (p_ptr->wizard) prt("Idx", 4, 70);
8057 for (i = 0; i < 78; i++)
8059 Term_putch(i, 5, TERM_WHITE, '=');
8062 for (i = 0; i < browser_rows; i++)
8064 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8070 /* Scroll group list */
8071 if (grp_cur < grp_top) grp_top = grp_cur;
8072 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8074 /* Display a list of object groups */
8075 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
8077 if (old_grp_cur != grp_cur)
8079 old_grp_cur = grp_cur;
8081 /* Get a list of objects in the current group */
8082 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
8085 /* Scroll object list */
8086 while (object_cur < object_top)
8087 object_top = MAX(0, object_top - browser_rows/2);
8088 while (object_cur >= object_top + browser_rows)
8089 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
8093 /* Display a list of objects in the current group */
8094 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
8098 object_top = object_cur;
8100 /* Display a list of objects in the current group */
8101 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
8103 /* Display visual list below first object */
8104 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8107 /* Get the current object */
8108 k_ptr = &k_info[object_idx[object_cur]];
8110 /* Mega Hack -- track this object */
8111 if (object_cnt) object_kind_track(object_idx[object_cur]);
8115 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8117 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);
8120 /* The "current" object changed */
8121 if (object_old != object_idx[object_cur])
8123 /* Hack -- handle stuff */
8126 /* Remember the "current" object */
8127 object_old = object_idx[object_cur];
8132 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8136 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8140 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8145 /* Do visual mode command if needed */
8146 /* Symbol of objects with flavor cannot be changed */
8147 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;
8160 /* Recall on screen */
8162 desc_obj_fake(object_idx[object_cur]);
8170 /* Move the cursor */
8171 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8177 /* Free the "object_idx" array */
8178 C_KILL(object_idx, max_k_idx, int);
8184 * Display the features in a group.
8186 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8187 int feat_cur, int feat_top)
8191 /* Display lines until done */
8192 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8199 int f_idx = feat_idx[feat_top + i];
8201 /* Access the index */
8202 feature_type *f_ptr = &f_info[f_idx];
8204 /* Choose a color */
8205 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8207 /* Display the name */
8208 c_prt(attr, f_name + f_ptr->name, row + i, col);
8210 /* Hack -- visual_list mode */
8213 c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
8219 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
8221 /* Display symbol */
8222 Term_putch(68, row + i, a, c);
8225 if (use_bigtile) Term_putch(68 + 1, row + i, a2, c2);
8228 /* Clear remaining lines */
8229 for (; i < per_page; i++)
8231 Term_erase(col, row + i, 255);
8237 * Interact with feature visuals.
8239 static void do_cmd_knowledge_features(void)
8242 int grp_cur, grp_top, old_grp_cur;
8243 int feat_cur, feat_top;
8244 int grp_cnt, grp_idx[100];
8252 bool visual_list = FALSE;
8253 byte attr_top = 0, char_left = 0;
8259 Term_get_size(&wid, &hgt);
8261 browser_rows = hgt - 8;
8263 /* Allocate the "feat_idx" array */
8264 C_MAKE(feat_idx, max_f_idx, int);
8269 /* Check every group */
8270 for (i = 0; feature_group_text[i] != NULL; i++)
8272 /* Measure the label */
8273 len = strlen(feature_group_text[i]);
8275 /* Save the maximum length */
8276 if (len > max) max = len;
8278 /* See if any features are known */
8279 if (collect_features(i, feat_idx))
8281 /* Build a list of groups with known features */
8282 grp_idx[grp_cnt++] = i;
8286 /* Terminate the list */
8287 grp_idx[grp_cnt] = -1;
8290 grp_cur = grp_top = 0;
8291 feat_cur = feat_top = 0;
8297 while ((!flag) && (grp_cnt))
8300 feature_type *f_ptr;
8306 prt("Visuals - features", 2, 0);
8308 prt("Name", 4, max + 3);
8311 for (i = 0; i < 78; i++)
8313 Term_putch(i, 5, TERM_WHITE, '=');
8316 for (i = 0; i < browser_rows; i++)
8318 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8324 /* Scroll group list */
8325 if (grp_cur < grp_top) grp_top = grp_cur;
8326 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8328 /* Display a list of feature groups */
8329 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8331 if (old_grp_cur != grp_cur)
8333 old_grp_cur = grp_cur;
8335 /* Get a list of features in the current group */
8336 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8339 /* Scroll feature list */
8340 while (feat_cur < feat_top)
8341 feat_top = MAX(0, feat_top - browser_rows/2);
8342 while (feat_cur >= feat_top + browser_rows)
8343 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8347 /* Display a list of features in the current group */
8348 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
8352 feat_top = feat_cur;
8354 /* Display a list of features in the current group */
8355 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
8357 /* Display visual list below first object */
8358 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8363 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8365 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);
8368 /* Get the current feature */
8369 f_ptr = &f_info[feat_idx[feat_cur]];
8373 place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
8377 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8381 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8386 /* Do visual mode command if needed */
8387 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;
8399 /* Move the cursor */
8400 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8407 if (!grp_cnt) msg_print("No features known.");
8409 /* Free the "feat_idx" array */
8410 C_KILL(feat_idx, max_f_idx, int);
8415 * List wanted monsters
8417 static void do_cmd_knowledge_kubi(void)
8422 char file_name[1024];
8425 /* Open a new file */
8426 fff = my_fopen_temp(file_name, 1024);
8429 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8431 msg_format("Failed to create temporary file %s.", file_name);
8439 bool listed = FALSE;
8442 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8444 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8446 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8448 fprintf(fff, "List of wanted monsters\n");
8450 fprintf(fff, "----------------------------------------------\n");
8452 for (i = 0; i < MAX_KUBI; i++)
8454 if (kubi_r_idx[i] <= 10000)
8456 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8465 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8467 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8472 /* Close the file */
8475 /* Display the file contents */
8477 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8479 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8483 /* Remove the file */
8488 * List virtues & status
8490 static void do_cmd_knowledge_virtues(void)
8494 char file_name[1024];
8497 /* Open a new file */
8498 fff = my_fopen_temp(file_name, 1024);
8501 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8503 msg_format("Failed to create temporary file %s.", file_name);
8512 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8514 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8519 /* Close the file */
8522 /* Display the file contents */
8524 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8526 show_file(TRUE, file_name, "Virtues", 0, 0);
8530 /* Remove the file */
8538 static void do_cmd_knowledge_dungeon(void)
8542 char file_name[1024];
8546 /* Open a new file */
8547 fff = my_fopen_temp(file_name, 1024);
8550 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8552 msg_format("Failed to create temporary file %s.", file_name);
8560 for (i = 1; i < max_d_idx; i++)
8564 if (!d_info[i].maxdepth) continue;
8565 if (!max_dlv[i]) continue;
8566 if (d_info[i].final_guardian)
8568 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8570 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8572 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8574 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8579 /* Close the file */
8582 /* Display the file contents */
8584 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8586 show_file(TRUE, file_name, "Dungeon", 0, 0);
8590 /* Remove the file */
8595 * List virtues & status
8598 static void do_cmd_knowledge_stat(void)
8602 char file_name[1024];
8605 /* Open a new file */
8606 fff = my_fopen_temp(file_name, 1024);
8609 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8611 msg_format("Failed to create temporary file %s.", file_name);
8619 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8620 (2 * p_ptr->hitdie +
8621 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8624 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8625 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8626 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8628 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8629 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8630 fprintf(fff, "Limits of maximum stats\n\n");
8632 for (v_nr = 0; v_nr < 6; v_nr++)
8634 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);
8635 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8641 /* Close the file */
8644 /* Display the file contents */
8646 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8648 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8652 /* Remove the file */
8658 * Print all active quests
8660 static void do_cmd_knowledge_quests_current(FILE *fff)
8663 char rand_tmp_str[120] = "\0";
8665 monster_race *r_ptr;
8667 int rand_level = 100;
8671 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8673 fprintf(fff, "< Current Quest >\n");
8676 for (i = 1; i < max_quests; i++)
8678 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8680 /* Set the quest number temporary */
8681 int old_quest = p_ptr->inside_quest;
8684 /* Clear the text */
8685 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8686 quest_text_line = 0;
8688 p_ptr->inside_quest = i;
8690 /* Get the quest text */
8691 init_flags = INIT_SHOW_TEXT;
8693 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8695 /* Reset the old quest number */
8696 p_ptr->inside_quest = old_quest;
8698 /* No info from "silent" quests */
8699 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8703 if (quest[i].type != QUEST_TYPE_RANDOM)
8705 char note[80] = "\0";
8707 if (quest[i].status == QUEST_STATUS_TAKEN)
8709 switch (quest[i].type)
8711 case QUEST_TYPE_KILL_LEVEL:
8712 case QUEST_TYPE_KILL_ANY_LEVEL:
8713 r_ptr = &r_info[quest[i].r_idx];
8714 strcpy(name, r_name + r_ptr->name);
8715 if (quest[i].max_num > 1)
8718 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8719 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8722 sprintf(note," - kill %d %s, have killed %d.",
8723 quest[i].max_num, name, quest[i].cur_num);
8728 sprintf(note," - %s¤òÅݤ¹¡£",name);
8730 sprintf(note," - kill %s.",name);
8734 case QUEST_TYPE_FIND_ARTIFACT:
8735 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8737 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8739 sprintf(note," - Find out %s.", name);
8743 case QUEST_TYPE_FIND_EXIT:
8745 sprintf(note," - õº÷¤¹¤ë¡£");
8747 sprintf(note," - Search.");
8751 case QUEST_TYPE_KILL_NUMBER:
8753 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8754 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8756 sprintf(note," - Kill %d monsters, have killed %d.",
8757 quest[i].max_num, quest[i].cur_num);
8761 case QUEST_TYPE_KILL_ALL:
8763 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8765 sprintf(note," - Kill all monsters.");
8771 /* Print the quest info */
8773 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8774 quest[i].name, quest[i].level, note);
8776 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8777 quest[i].name, quest[i].level, note);
8780 fprintf(fff, tmp_str);
8782 if (quest[i].status == QUEST_STATUS_COMPLETED)
8785 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8787 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8789 fprintf(fff, tmp_str);
8795 while (quest_text[j][0] && j < 10)
8797 fprintf(fff, " %s\n", quest_text[j]);
8802 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8805 rand_level = quest[i].level;
8807 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8809 /* Print the quest info */
8810 r_ptr = &r_info[quest[i].r_idx];
8811 strcpy(name, r_name + r_ptr->name);
8813 if (quest[i].max_num > 1)
8816 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8817 quest[i].name, quest[i].level,
8818 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8822 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8823 quest[i].name, quest[i].level,
8824 quest[i].max_num, name, quest[i].cur_num);
8830 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8831 quest[i].name, quest[i].level, name);
8833 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8834 quest[i].name, quest[i].level, name);
8842 /* Print the current random quest */
8843 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8846 if (!total) fprintf(fff, " ¤Ê¤·\n");
8848 if (!total) fprintf(fff, " Nothing.\n");
8854 * Print all finished quests
8856 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8863 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8865 fprintf(fff, "< Completed Quest >\n");
8867 for (i = 1; i < max_quests; i++)
8869 int q_idx = quest_num[i];
8871 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8873 if (is_fixed_quest_idx(q_idx))
8875 /* Set the quest number temporary */
8876 int old_quest = p_ptr->inside_quest;
8878 p_ptr->inside_quest = q_idx;
8881 init_flags = INIT_ASSIGN;
8883 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8885 /* Reset the old quest number */
8886 p_ptr->inside_quest = old_quest;
8888 /* No info from "silent" quests */
8889 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8894 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8896 /* Print the quest info */
8898 if (quest[q_idx].complev == 0)
8902 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8904 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8906 r_name+r_info[quest[q_idx].r_idx].name,
8907 quest[q_idx].level);
8913 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8915 " %-40s (Dungeon level: %3d) - level %2d\n",
8917 r_name+r_info[quest[q_idx].r_idx].name,
8919 quest[q_idx].complev);
8924 /* Print the quest info */
8926 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8927 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8929 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8930 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8934 fprintf(fff, tmp_str);
8938 if (!total) fprintf(fff, " ¤Ê¤·\n");
8940 if (!total) fprintf(fff, " Nothing.\n");
8946 * Print all failed quests
8948 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8955 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8957 fprintf(fff, "< Failed Quest >\n");
8959 for (i = 1; i < max_quests; i++)
8961 int q_idx = quest_num[i];
8963 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8965 if (is_fixed_quest_idx(q_idx))
8967 /* Set the quest number temporary */
8968 int old_quest = p_ptr->inside_quest;
8970 p_ptr->inside_quest = q_idx;
8972 /* Get the quest text */
8973 init_flags = INIT_ASSIGN;
8975 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8977 /* Reset the old quest number */
8978 p_ptr->inside_quest = old_quest;
8980 /* No info from "silent" quests */
8981 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8986 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8988 /* Print the quest info */
8990 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8991 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8993 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
8994 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8999 /* Print the quest info */
9001 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
9002 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9004 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
9005 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9008 fprintf(fff, tmp_str);
9012 if (!total) fprintf(fff, " ¤Ê¤·\n");
9014 if (!total) fprintf(fff, " Nothing.\n");
9020 * Print all random quests
9022 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
9029 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
9031 fprintf(fff, "< Remaining Random Quest >\n");
9033 for (i = 1; i < max_quests; i++)
9035 /* No info from "silent" quests */
9036 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
9038 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
9042 /* Print the quest info */
9044 sprintf(tmp_str, " %s (%d³¬, %s)\n",
9045 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9047 sprintf(tmp_str, " %s (%d, %s)\n",
9048 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9050 fprintf(fff, tmp_str);
9054 if (!total) fprintf(fff, " ¤Ê¤·\n");
9056 if (!total) fprintf(fff, " Nothing.\n");
9061 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
9063 int *q_num = (int *)u;
9064 quest_type *qa = &quest[q_num[a]];
9065 quest_type *qb = &quest[q_num[b]];
9070 if (qa->complev < qb->complev) return TRUE;
9071 if (qa->complev > qb->complev) return FALSE;
9072 if (qa->level <= qb->level) return TRUE;
9076 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9078 int *q_num = (int *)u;
9085 q_num[a] = q_num[b];
9091 * Print quest status of all active quests
9093 static void do_cmd_knowledge_quests(void)
9096 char file_name[1024];
9097 int *quest_num, dummy, i;
9099 /* Open a new file */
9100 fff = my_fopen_temp(file_name, 1024);
9104 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9106 msg_format("Failed to create temporary file %s.", file_name);
9112 /* Allocate Memory */
9113 C_MAKE(quest_num, max_quests, int);
9115 /* Sort by compete level */
9116 for (i = 1; i < max_quests; i++) quest_num[i] = i;
9117 ang_sort_comp = ang_sort_comp_quest_num;
9118 ang_sort_swap = ang_sort_swap_quest_num;
9119 ang_sort(quest_num, &dummy, max_quests);
9121 /* Dump Quest Information */
9122 do_cmd_knowledge_quests_current(fff);
9124 do_cmd_knowledge_quests_completed(fff, quest_num);
9126 do_cmd_knowledge_quests_failed(fff, quest_num);
9130 do_cmd_knowledge_quests_wiz_random(fff);
9133 /* Close the file */
9136 /* Display the file contents */
9138 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9140 show_file(TRUE, file_name, "Quest status", 0, 0);
9143 /* Remove the file */
9147 C_KILL(quest_num, max_quests, int);
9154 static void do_cmd_knowledge_home(void)
9159 char file_name[1024];
9161 char o_name[MAX_NLEN];
9164 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9166 /* Open a new file */
9167 fff = my_fopen_temp(file_name, 1024);
9170 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9172 msg_format("Failed to create temporary file %s.", file_name);
9180 /* Print all homes in the different towns */
9181 st_ptr = &town[1].store[STORE_HOME];
9183 /* Home -- if anything there */
9184 if (st_ptr->stock_num)
9189 /* Header with name of the town */
9191 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9193 fprintf(fff, " [Home Inventory]\n");
9196 /* Dump all available items */
9197 for (i = 0; i < st_ptr->stock_num; i++)
9200 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9201 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9202 if (strlen(o_name) <= 80-3)
9204 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9210 for (n = 0, t = o_name; n < 80-3; n++, t++)
9211 if(iskanji(*t)) {t++; n++;}
9212 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9214 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9215 fprintf(fff, " %.77s\n", o_name+n);
9218 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9219 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9224 /* Add an empty line */
9225 fprintf(fff, "\n\n");
9229 /* Close the file */
9232 /* Display the file contents */
9234 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9236 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9240 /* Remove the file */
9246 * Check the status of "autopick"
9248 static void do_cmd_knowledge_autopick(void)
9252 char file_name[1024];
9254 /* Open a new file */
9255 fff = my_fopen_temp(file_name, 1024);
9260 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9262 msg_format("Failed to create temporary file %s.", file_name);
9271 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9273 fprintf(fff, "No preference for auto picker/destroyer.");
9279 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9281 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9285 for (k = 0; k < max_autopick; k++)
9288 byte act = autopick_list[k].action;
9289 if (act & DONT_AUTOPICK)
9297 else if (act & DO_AUTODESTROY)
9305 else if (act & DO_AUTOPICK)
9313 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9322 if (act & DO_DISPLAY)
9323 fprintf(fff, "%11s", format("[%s]", tmp));
9325 fprintf(fff, "%11s", format("(%s)", tmp));
9327 tmp = autopick_line_from_entry(&autopick_list[k]);
9328 fprintf(fff, " %s", tmp);
9332 /* Close the file */
9334 /* Display the file contents */
9336 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9338 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9341 /* Remove the file */
9347 * Interact with "knowledge"
9349 void do_cmd_knowledge(void)
9352 /* File type is "TEXT" */
9353 FILE_TYPE(FILE_TYPE_TEXT);
9354 /* Save the screen */
9356 /* Interact until done */
9361 /* Ask for a choice */
9363 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9364 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9366 prt(format("page %d/2", (p+1)), 2, 65);
9367 prt("Display current knowledge", 3, 0);
9370 /* Give some choices */
9373 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9374 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9375 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9376 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9377 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9378 prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9379 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9380 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9381 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9382 prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5);
9384 prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5);
9385 prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5);
9386 prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5);
9387 prt("(d) ËâË¡¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 9, 5);
9388 prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 10, 5);
9389 prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ ¤Î°ìÍ÷", 11, 5);
9390 prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó ¤Î°ìÍ÷", 12, 5);
9391 prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È ¤Î°ìÍ÷", 13, 5);
9392 prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5);
9396 prt("(1) Display known artifacts", 6, 5);
9397 prt("(2) Display known objects", 7, 5);
9398 prt("(3) Display remaining uniques", 8, 5);
9399 prt("(4) Display known monster", 9, 5);
9400 prt("(5) Display kill count", 10, 5);
9401 prt("(6) Display wanted monsters", 11, 5);
9402 prt("(7) Display current pets", 12, 5);
9403 prt("(8) Display home inventory", 13, 5);
9404 prt("(9) Display *identified* equip.", 14, 5);
9405 prt("(0) Display terrain symbols.", 15, 5);
9407 prt("(a) Display about yourself", 6, 5);
9408 prt("(b) Display mutations", 7, 5);
9409 prt("(c) Display weapon proficiency", 8, 5);
9410 prt("(d) Display spell proficiency", 9, 5);
9411 prt("(e) Display misc. proficiency", 10, 5);
9412 prt("(f) Display virtues", 11, 5);
9413 prt("(g) Display dungeons", 12, 5);
9414 prt("(h) Display current quests", 13, 5);
9415 prt("(i) Display auto pick/destroy", 14, 5);
9420 prt("-³¤¯-", 17, 8);
9421 prt("ESC) È´¤±¤ë", 21, 1);
9422 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9423 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9424 prt("¥³¥Þ¥ó¥É:", 20, 0);
9426 prt("-more-", 17, 8);
9427 prt("ESC) Exit menu", 21, 1);
9428 prt("SPACE) Next page", 21, 30);
9429 /*prt("-) Previous page", 21, 60);*/
9430 prt("Command: ", 20, 0);
9436 if (i == ESCAPE) break;
9439 case ' ': /* Page change */
9443 case '1': /* Artifacts */
9444 do_cmd_knowledge_artifacts();
9446 case '2': /* Objects */
9447 do_cmd_knowledge_objects();
9449 case '3': /* Uniques */
9450 do_cmd_knowledge_uniques();
9452 case '4': /* Monsters */
9453 do_cmd_knowledge_monsters();
9455 case '5': /* Kill count */
9456 do_cmd_knowledge_kill_count();
9458 case '6': /* wanted */
9459 do_cmd_knowledge_kubi();
9461 case '7': /* Pets */
9462 do_cmd_knowledge_pets();
9464 case '8': /* Home */
9465 do_cmd_knowledge_home();
9467 case '9': /* Resist list */
9468 do_cmd_knowledge_inven();
9470 case '0': /* Feature list */
9471 do_cmd_knowledge_features();
9474 case 'a': /* Max stat */
9475 do_cmd_knowledge_stat();
9477 case 'b': /* Mutations */
9478 do_cmd_knowledge_mutations();
9480 case 'c': /* weapon-exp */
9481 do_cmd_knowledge_weapon_exp();
9483 case 'd': /* spell-exp */
9484 do_cmd_knowledge_spell_exp();
9486 case 'e': /* skill-exp */
9487 do_cmd_knowledge_skill_exp();
9489 case 'f': /* Virtues */
9490 do_cmd_knowledge_virtues();
9492 case 'g': /* Dungeon */
9493 do_cmd_knowledge_dungeon();
9495 case 'h': /* Quests */
9496 do_cmd_knowledge_quests();
9498 case 'i': /* Autopick */
9499 do_cmd_knowledge_autopick();
9501 default: /* Unknown option */
9504 /* Flush messages */
9507 /* Restore the screen */
9513 * Check on the status of an active quest
9515 void do_cmd_checkquest(void)
9517 /* File type is "TEXT" */
9518 FILE_TYPE(FILE_TYPE_TEXT);
9520 /* Save the screen */
9524 do_cmd_knowledge_quests();
9526 /* Restore the screen */
9532 * Display the time and date
9534 void do_cmd_time(void)
9536 int day, hour, min, full, start, end, num;
9543 extract_day_hour_min(&day, &hour, &min);
9545 full = hour * 100 + min;
9553 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9555 strcpy(desc, "It is a strange time.");
9561 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9562 day, (hour % 12 == 0) ? 12 : (hour % 12),
9563 min, (hour < 12) ? "AM" : "PM");
9565 msg_format("This is day %d. The time is %d:%02d %s.",
9566 day, (hour % 12 == 0) ? 12 : (hour % 12),
9567 min, (hour < 12) ? "AM" : "PM");
9572 if (!randint0(10) || p_ptr->image)
9575 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9577 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9584 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9586 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9591 /* Open this file */
9592 fff = my_fopen(buf, "rt");
9597 /* Find this time */
9598 while (!my_fgets(fff, buf, sizeof(buf)))
9600 /* Ignore comments */
9601 if (!buf[0] || (buf[0] == '#')) continue;
9603 /* Ignore invalid lines */
9604 if (buf[1] != ':') continue;
9606 /* Process 'Start' */
9609 /* Extract the starting time */
9610 start = atoi(buf + 2);
9612 /* Assume valid for an hour */
9622 /* Extract the ending time */
9623 end = atoi(buf + 2);
9629 /* Ignore incorrect range */
9630 if ((start > full) || (full > end)) continue;
9632 /* Process 'Description' */
9637 /* Apply the randomizer */
9638 if (!randint0(num)) strcpy(desc, buf + 2);
9648 /* Close the file */