4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
11 /* Purpose: Interface commands */
18 * A set of functions to maintain automatic dumps of various kinds.
21 * remove_auto_dump(orig_file, mark)
22 * Remove the old automatic dump of type "mark".
23 * auto_dump_printf(fmt, ...)
24 * Dump a formatted string using fprintf().
25 * open_auto_dump(buf, mark)
26 * Open a file, remove old dump, and add new header.
27 * close_auto_dump(void)
28 * Add a footer, and close the file.
30 * The dump commands of original Angband simply add new lines to
31 * existing files; these files will become bigger and bigger unless
32 * an user deletes some or all of these files by hand at some
35 * These three functions automatically delete old dumped lines
36 * before adding new ones. Since there are various kinds of automatic
37 * dumps in a single file, we add a header and a footer with a type
38 * name for every automatic dump, and kill old lines only when the
39 * lines have the correct type of header and footer.
41 * We need to be quite paranoid about correctness; the user might
42 * (mistakenly) edit the file by hand, and see all their work come
43 * to nothing on the next auto dump otherwise. The current code only
44 * detects changes by noting inconsistencies between the actual number
45 * of lines and the number written in the footer. Note that this will
46 * not catch single-line edits.
50 * Mark strings for auto dump
52 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
53 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
56 * Variables for auto dump
58 static FILE *auto_dump_stream;
59 static cptr auto_dump_mark;
60 static int auto_dump_line_num;
63 * Remove old lines automatically generated before.
65 static void remove_auto_dump(cptr orig_file)
67 FILE *tmp_fff, *orig_fff;
71 bool between_mark = FALSE;
74 long header_location = 0;
75 char header_mark_str[80];
76 char footer_mark_str[80];
79 /* Prepare a header/footer mark string */
80 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
81 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
83 mark_len = strlen(footer_mark_str);
85 /* Open an old dump file in read-only mode */
86 orig_fff = my_fopen(orig_file, "r");
88 /* If original file does not exist, nothing to do */
89 if (!orig_fff) return;
91 /* Open a new (temporary) file */
92 tmp_fff = my_fopen_temp(tmp_file, 1024);
97 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", tmp_file);
99 msg_format("Failed to create temporary file %s.", tmp_file);
105 /* Loop for every line */
109 if (my_fgets(orig_fff, buf, sizeof(buf)))
111 /* Read error: Assume End of File */
114 * Was looking for the footer, but not found.
116 * Since automatic dump might be edited by hand,
117 * it's dangerous to kill these lines.
118 * Seek back to the next line of the (pseudo) header,
123 fseek(orig_fff, header_location, SEEK_SET);
124 between_mark = FALSE;
128 /* Success -- End the loop */
135 /* We are looking for the header mark of automatic dump */
138 /* Is this line a header? */
139 if (!strcmp(buf, header_mark_str))
141 /* Memorise seek point of this line */
142 header_location = ftell(orig_fff);
144 /* Initialize counter for number of lines */
147 /* Look for the footer from now */
150 /* There are some changes */
157 /* Copy orginally lines */
158 fprintf(tmp_fff, "%s\n", buf);
162 /* We are looking for the footer mark of automatic dump */
165 /* Is this line a footer? */
166 if (!strncmp(buf, footer_mark_str, mark_len))
171 * Compare the number of lines
173 * If there is an inconsistency between
174 * actual number of lines and the
175 * number here, the automatic dump
176 * might be edited by hand. So it's
177 * dangerous to kill these lines.
178 * Seek back to the next line of the
179 * (pseudo) header, and read again.
181 if (!sscanf(buf + mark_len, " (%d)", &tmp)
184 fseek(orig_fff, header_location, SEEK_SET);
187 /* Look for another header */
188 between_mark = FALSE;
194 /* Ignore old line, and count number of lines */
204 /* If there are some changes, overwrite the original file with new one */
207 /* Copy contents of temporary file */
209 tmp_fff = my_fopen(tmp_file, "r");
210 orig_fff = my_fopen(orig_file, "w");
212 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
213 fprintf(orig_fff, "%s\n", buf);
219 /* Kill the temporary file */
227 * Dump a formatted line, using "vstrnfmt()".
229 static void auto_dump_printf(cptr fmt, ...)
236 /* Begin the Varargs Stuff */
239 /* Format the args, save the length */
240 (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
242 /* End the Varargs Stuff */
245 /* Count number of lines */
246 for (p = buf; *p; p++)
248 if (*p == '\n') auto_dump_line_num++;
252 fprintf(auto_dump_stream, "%s", buf);
257 * Open file to append auto dump.
259 static bool open_auto_dump(cptr buf, cptr mark)
262 char header_mark_str[80];
264 /* Save the mark string */
265 auto_dump_mark = mark;
267 /* Prepare a header mark string */
268 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
270 /* Remove old macro dumps */
271 remove_auto_dump(buf);
273 /* Append to the file */
274 auto_dump_stream = my_fopen(buf, "a");
277 if (!auto_dump_stream) {
279 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
281 msg_format("Failed to open %s.", buf);
290 fprintf(auto_dump_stream, "%s\n", header_mark_str);
292 /* Initialize counter */
293 auto_dump_line_num = 0;
296 auto_dump_printf("# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
297 auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
299 auto_dump_printf("# *Warning!* The lines below are an automatic dump.\n");
300 auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n");
308 * Append foot part and close auto dump.
310 static void close_auto_dump(void)
312 char footer_mark_str[80];
314 /* Prepare a footer mark string */
315 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
318 auto_dump_printf("# *·Ù¹ð!!* °Ê¾å¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
319 auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
321 auto_dump_printf("# *Warning!* The lines above are an automatic dump.\n");
322 auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n");
326 fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
329 my_fclose(auto_dump_stream);
337 * Return suffix of ordinal number
339 cptr get_ordinal_number_suffix(int num)
341 num = ABS(num) % 100;
345 return (num == 11) ? "th" : "st";
347 return (num == 12) ? "th" : "nd";
349 return (num == 13) ? "th" : "rd";
358 * Take note to the diary.
360 errr do_cmd_write_nikki(int type, int num, cptr note)
366 cptr note_level = "";
367 bool do_level = TRUE;
368 char note_level_buf[40];
371 static bool disable_nikki = FALSE;
373 extract_day_hour_min(&day, &hour, &min);
375 if (disable_nikki) return(-1);
377 if (type == NIKKI_FIX_QUEST_C ||
378 type == NIKKI_FIX_QUEST_F ||
379 type == NIKKI_RAND_QUEST_C ||
380 type == NIKKI_RAND_QUEST_F ||
381 type == NIKKI_TO_QUEST)
385 old_quest = p_ptr->inside_quest;
386 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
388 /* Get the quest text */
389 init_flags = INIT_ASSIGN;
391 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
393 /* Reset the old quest number */
394 p_ptr->inside_quest = old_quest;
398 sprintf(file_name,"playrecord-%s.txt",savefile_base);
400 /* different filne name to avoid mixing */
401 sprintf(file_name,"playrec-%s.txt",savefile_base);
404 /* Build the filename */
405 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
407 /* File type is "TEXT" */
408 FILE_TYPE(FILE_TYPE_TEXT);
410 fff = my_fopen(buf, "a");
416 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¥×¥ì¥¤µÏ¿¤ò°ì»þÄä»ß¤·¤Þ¤¹¡£", buf);
418 msg_format("Failed to open %s. Play-Record is disabled temporally.", buf);
425 q_idx = quest_number(dun_level);
429 if (p_ptr->inside_arena)
431 note_level = "¥¢¥ê¡¼¥Ê:";
433 note_level = "Arane:";
437 note_level = "ÃϾå:";
439 note_level = "Surface:";
441 else if (q_idx && (is_fixed_quest_idx(q_idx)
442 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
444 note_level = "¥¯¥¨¥¹¥È:";
446 note_level = "Quest:";
451 sprintf(note_level_buf, "%d³¬(%s):", dun_level, d_name+d_info[dungeon_type].name);
453 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, dun_level);
455 note_level = note_level_buf;
464 fprintf(fff, "%dÆüÌÜ\n",day);
466 fprintf(fff, "Day %d\n",day);
475 fprintf(fff, "%s\n",note);
479 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
485 fprintf(fff, " %2d:%02d %20s %s¤òȯ¸«¤·¤¿¡£\n", hour, min, note_level, note);
487 fprintf(fff, " %2d:%02d %20s discovered %s.\n", hour, min, note_level, note);
494 fprintf(fff, " %2d:%02d %20s %s¤òÅݤ·¤¿¡£\n", hour, min, note_level, note);
496 fprintf(fff, " %2d:%02d %20s defeated %s.\n", hour, min, note_level, note);
500 case NIKKI_FIX_QUEST_C:
502 if (quest[num].flags & QUEST_FLAG_SILENT) break;
504 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
506 fprintf(fff, " %2d:%02d %20s completed quest '%s'.\n", hour, min, note_level, quest[num].name);
510 case NIKKI_FIX_QUEST_F:
512 if (quest[num].flags & QUEST_FLAG_SILENT) break;
514 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤«¤éÌ¿¤«¤é¤¬¤éƨ¤²µ¢¤Ã¤¿¡£\n", hour, min, note_level, quest[num].name);
516 fprintf(fff, " %2d:%02d %20s run away from quest '%s'.\n", hour, min, note_level, quest[num].name);
520 case NIKKI_RAND_QUEST_C:
523 strcpy(name, r_name+r_info[quest[num].r_idx].name);
525 fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, name);
527 fprintf(fff, " %2d:%02d %20s completed randome quest '%s'\n", hour, min, note_level, name);
531 case NIKKI_RAND_QUEST_F:
534 strcpy(name, r_name+r_info[quest[num].r_idx].name);
536 fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤«¤éƨ¤²½Ð¤·¤¿¡£\n", hour, min, note_level, name);
538 fprintf(fff, " %2d:%02d %20s ran away from quest '%s'.\n", hour, min, note_level, name);
542 case NIKKI_MAXDEAPTH:
545 fprintf(fff, " %2d:%02d %20s %s¤ÎºÇ¿¼³¬%d³¬¤ËÅþ㤷¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, num);
547 fprintf(fff, " %2d:%02d %20s reached level %d of %s for the first time.\n", hour, min, note_level, num, d_name+d_info[dungeon_type].name);
554 fprintf(fff, " %2d:%02d %20s %s%s¤ÎºÇ¿¼³¬¤ò%d³¬¤Ë¥»¥Ã¥È¤·¤¿¡£\n", hour, min, note_level, note, d_name + d_info[num].name, max_dlv[num]);
556 fprintf(fff, " %2d:%02d %20s reset recall level of %s to %d %s.\n", hour, min, note_level, d_name + d_info[num].name, max_dlv[num], note);
563 if (q_idx && (is_fixed_quest_idx(q_idx)
564 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
575 if (!(dun_level+num)) to = "ÃϾå";
576 else to = format("%d³¬", dun_level+num);
578 if (!(dun_level+num)) to = "the surface";
579 else to = format("level %d", dun_level+num);
584 fprintf(fff, " %2d:%02d %20s %s¤Ø%s¡£\n", hour, min, note_level, to, note);
586 fprintf(fff, " %2d:%02d %20s %s %s.\n", hour, min, note_level, note, to);
594 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤Æ%s¤Î%d³¬¤Ø²¼¤ê¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, max_dlv[dungeon_type]);
596 fprintf(fff, " %2d:%02d %20s recalled to dungeon level %d of %s.\n", hour, min, note_level, max_dlv[dungeon_type], d_name+d_info[dungeon_type].name);
600 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤ÆÃϾå¤Ø¤ÈÌá¤Ã¤¿¡£\n", hour, min, note_level);
602 fprintf(fff, " %2d:%02d %20s recalled from dungeon to surface.\n", hour, min, note_level);
608 if (quest[num].flags & QUEST_FLAG_SILENT) break;
610 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤Ø¤ÈÆÍÆþ¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
612 fprintf(fff, " %2d:%02d %20s entered the quest '%s'.\n", hour, min, note_level, quest[num].name);
619 fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¡¦¥Æ¥ì¥Ý¡¼¥È¤Çæ½Ð¤·¤¿¡£\n", hour, min, note_level);
621 fprintf(fff, " %2d:%02d %20s Got out using teleport level.\n", hour, min, note_level);
628 fprintf(fff, " %2d:%02d %20s %s¤ò¹ØÆþ¤·¤¿¡£\n", hour, min, note_level, note);
630 fprintf(fff, " %2d:%02d %20s bought %s.\n", hour, min, note_level, note);
637 fprintf(fff, " %2d:%02d %20s %s¤òÇäµÑ¤·¤¿¡£\n", hour, min, note_level, note);
639 fprintf(fff, " %2d:%02d %20s sold %s.\n", hour, min, note_level, note);
648 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï¤Ç¡¢%s¤ÎÁ°¤ËÇÔ¤ìµî¤Ã¤¿¡£\n", hour, min, note_level, -num, note);
651 fprintf(fff, " %2d:%02d %20s beaten by %s in the %d%s fight.\n", hour, min, note_level, note, n, get_ordinal_number_suffix(n));
656 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï(%s)¤Ë¾¡Íø¤·¤¿¡£\n", hour, min, note_level, num, note);
658 fprintf(fff, " %2d:%02d %20s won the %d%s fight (%s).\n", hour, min, note_level, num, get_ordinal_number_suffix(num), note);
660 if (num == MAX_ARENA_MONS)
663 fprintf(fff, " Æ®µ»¾ì¤Î¤¹¤Ù¤Æ¤ÎŨ¤Ë¾¡Íø¤·¡¢¥Á¥ã¥ó¥Ô¥ª¥ó¤È¤Ê¤Ã¤¿¡£\n");
665 fprintf(fff, " won all fight to become a Chanpion.\n");
674 fprintf(fff, " %2d:%02d %20s %s¤ò¼±Ê̤·¤¿¡£\n", hour, min, note_level, note);
676 fprintf(fff, " %2d:%02d %20s identified %s.\n", hour, min, note_level, note);
691 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
693 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
697 fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥¦¥£¥¶¡¼¥É¡¦¥Æ¥ì¥Ý¡¼¥È¤Ç°ÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
699 fprintf(fff, " %2d:%02d %20s wizard-teleport to %s.\n", hour, min, note_level, to);
714 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
716 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
720 fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥Ñ¥¿¡¼¥ó¤ÎÎϤǰÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
722 fprintf(fff, " %2d:%02d %20s used Pattern to teleport to %s.\n", hour, min, note_level, to);
729 fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¤¬%d¤Ë¾å¤¬¤Ã¤¿¡£\n", hour, min, note_level, num);
731 fprintf(fff, " %2d:%02d %20s reached player level %d.\n", hour, min, note_level, num);
735 case NIKKI_GAMESTART:
737 time_t ct = time((time_t*)0);
741 fprintf(fff, "%s %s",note, ctime(&ct));
744 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
747 case NIKKI_NAMED_PET:
749 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
754 fprintf(fff, "%s¤òι¤Îͧ¤Ë¤¹¤ë¤³¤È¤Ë·è¤á¤¿¡£\n", note);
756 fprintf(fff, "decided to travel together with %s.\n", note);
761 fprintf(fff, "%s¤Î̾Á°¤ò¾Ã¤·¤¿¡£\n", note);
763 fprintf(fff, "unnamed %s.\n", note);
768 fprintf(fff, "%s¤ò²òÊü¤·¤¿¡£\n", note);
770 fprintf(fff, "dismissed %s.\n", note);
775 fprintf(fff, "%s¤¬»à¤ó¤Ç¤·¤Þ¤Ã¤¿¡£\n", note);
777 fprintf(fff, "%s died.\n", note);
782 fprintf(fff, "%s¤ò¤ª¤¤¤ÆÊ̤ΥޥåפذÜÆ°¤·¤¿¡£\n", note);
784 fprintf(fff, "moved to another map leaving %s behind.\n", note);
789 fprintf(fff, "%s¤È¤Ï¤°¤ì¤Æ¤·¤Þ¤Ã¤¿¡£\n", note);
791 fprintf(fff, "lost sight of %s.\n", note);
796 fprintf(fff, "%s¤¬*Ç˲õ*¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note);
798 fprintf(fff, "%s was made disappeared by *destruction*.\n", note);
803 fprintf(fff, "%s¤¬´äÀФ˲¡¤·ÄÙ¤µ¤ì¤¿¡£\n", note);
805 fprintf(fff, "%s was crushed by falling rocks.\n", note);
820 if (do_level) write_level = FALSE;
826 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
828 static void do_cmd_disp_nikki(void)
830 char nikki_title[256];
835 static const char subtitle[][30] = {"ºÇ¶¯¤ÎÆùÂΤòµá¤á¤Æ",
836 "¿ÍÀ¸¤½¤ì¤Ï¤Ï¤«¤Ê¤¤",
847 "Åݤ¹¤Ù¤Å¨¤Ï¥²¡û¥Ä",
848 "¤ó¡Á¡©Ê¹¤³¤¨¤ó¤Ê¤¡",
849 "¥ª¥ì¤Î̾¤ò¸À¤Ã¤Æ¤ß¤í",
850 "Ƭ¤¬ÊѤˤʤäÁ¤ã¤Ã¤¿",
855 "¤³¤ó¤Ê¤â¤ó¤¸¤ã¤Ê¤¤",
864 "ºÇ¹â¤ÎƬǾ¤òµá¤á¤Æ"};
866 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
867 "Attack is the best form of defence.",
869 "An unexpected windfall",
870 "A drowning man will catch at a straw",
871 "Don't count your chickens before they are hatched.",
872 "It is no use crying over spilt milk.",
873 "Seeing is believing.",
874 "Strike the iron while it is hot.",
875 "I don't care what follows.",
876 "To dig a well to put out a house on fire.",
877 "Tomorrow is another day.",
878 "Easy come, easy go.",
879 "The more haste, the less speed.",
880 "Where there is life, there is hope.",
881 "There is no royal road to *WINNER*.",
882 "Danger past, God forgotten.",
883 "The best thing to do now is to run away.",
884 "Life is but an empty dream.",
885 "Dead men tell no tales.",
886 "A book that remains shut is but a block.",
887 "Misfortunes never come singly.",
888 "A little knowledge is a dangerous thing.",
889 "History repeats itself.",
890 "*WINNER* was not built in a day.",
891 "Ignorance is bliss.",
892 "To lose is to win?",
893 "No medicine can cure folly.",
894 "All good things come to an end.",
895 "M$ Empire strikes back.",
896 "To see is to believe",
898 "Quest of The World's Greatest Brain"};
901 sprintf(file_name,"playrecord-%s.txt",savefile_base);
903 sprintf(file_name,"playrec-%s.txt",savefile_base);
906 /* Build the filename */
907 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
909 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
910 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
911 else if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
912 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
913 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
916 sprintf(nikki_title, "¡Ö%s%s%s¤ÎÅÁÀâ -%s-¡×",
917 ap_ptr->title, ap_ptr->no ? "¤Î" : "", player_name, tmp);
919 sprintf(nikki_title, "Legend of %s %s '%s'",
920 ap_ptr->title, player_name, tmp);
923 /* Display the file contents */
924 show_file(FALSE, buf, nikki_title, -1, 0);
927 static void do_cmd_bunshou(void)
930 char bunshou[80] = "\0";
933 if (get_string("ÆâÍÆ: ", tmp, 79))
935 if (get_string("diary note: ", tmp, 79))
938 strcpy(bunshou, tmp);
940 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
944 static void do_cmd_last_get(void)
949 if (record_o_name[0] == '\0') return;
952 sprintf(buf,"%s¤ÎÆþ¼ê¤òµÏ¿¤·¤Þ¤¹¡£",record_o_name);
954 sprintf(buf,"Do you really want to record getting %s? ",record_o_name);
956 if (!get_check(buf)) return;
961 sprintf(buf,"%s¤ò¼ê¤ËÆþ¤ì¤¿¡£", record_o_name);
963 sprintf(buf,"descover %s.", record_o_name);
965 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
969 static void do_cmd_erase_nikki(void)
976 if (!get_check("ËÜÅö¤ËµÏ¿¤ò¾Ãµî¤·¤Þ¤¹¤«¡©")) return;
978 if (!get_check("Do you really want to delete all your record? ")) return;
982 sprintf(file_name,"playrecord-%s.txt",savefile_base);
984 sprintf(file_name,"playrec-%s.txt",savefile_base);
987 /* Build the filename */
988 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
990 /* Remove the file */
993 fff = my_fopen(buf, "w");
997 msg_format("µÏ¿¤ò¾Ãµî¤·¤Þ¤·¤¿¡£");
999 msg_format("deleted record.");
1003 msg_format("%s ¤Î¾Ãµî¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", buf);
1005 msg_format("failed to delete %s.", buf);
1012 void do_cmd_nikki(void)
1016 /* File type is "TEXT" */
1017 FILE_TYPE(FILE_TYPE_TEXT);
1019 /* Save the screen */
1022 /* Interact until done */
1028 /* Ask for a choice */
1030 prt("[ µÏ¿¤ÎÀßÄê ]", 2, 0);
1032 prt("[ Play Record ]", 2, 0);
1036 /* Give some choices */
1038 prt("(1) µÏ¿¤ò¸«¤ë", 4, 5);
1039 prt("(2) ʸ¾Ï¤òµÏ¿¤¹¤ë", 5, 5);
1040 prt("(3) ľÁ°¤ËÆþ¼êËô¤Ï´ÕÄꤷ¤¿¤â¤Î¤òµÏ¿¤¹¤ë", 6, 5);
1041 prt("(4) µÏ¿¤ò¾Ãµî¤¹¤ë", 7, 5);
1043 prt("(1) Display your record", 4, 5);
1044 prt("(2) Add record", 5, 5);
1045 prt("(3) Record item you last get/identify", 6, 5);
1046 prt("(4) Delete your record", 7, 5);
1052 prt("¥³¥Þ¥ó¥É:", 18, 0);
1054 prt("Command: ", 18, 0);
1062 if (i == ESCAPE) break;
1067 do_cmd_disp_nikki();
1076 do_cmd_erase_nikki();
1078 default: /* Unknown option */
1082 /* Flush messages */
1086 /* Restore the screen */
1091 * Hack -- redraw the screen
1093 * This command performs various low level updates, clears all the "extra"
1094 * windows, does a total redraw of the main window, and requests all of the
1095 * interesting updates and redraws that I can think of.
1097 * This command is also used to "instantiate" the results of the user
1098 * selecting various things, such as graphics mode, so it must call
1099 * the "TERM_XTRA_REACT" hook before redrawing the windows.
1101 void do_cmd_redraw(void)
1108 /* Hack -- react to changes */
1109 Term_xtra(TERM_XTRA_REACT, 0);
1112 /* Combine and Reorder the pack (later) */
1113 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
1117 p_ptr->update |= (PU_TORCH);
1120 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
1122 /* Forget lite/view */
1123 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
1125 /* Update lite/view */
1126 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
1128 /* Update monsters */
1129 p_ptr->update |= (PU_MONSTERS);
1131 /* Redraw everything */
1132 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1135 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1138 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1142 /* Hack -- update */
1145 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1148 /* Redraw every window */
1149 for (j = 0; j < 8; j++)
1152 if (!angband_term[j]) continue;
1155 Term_activate(angband_term[j]);
1170 * Hack -- change name
1172 void do_cmd_change_name(void)
1181 /* Save the screen */
1189 /* Display the player */
1190 display_player(mode);
1195 display_player(mode);
1200 Term_putstr(2, 23, -1, TERM_WHITE,
1201 "['c'¤Ç̾Á°Êѹ¹, 'f'¤Ç¥Õ¥¡¥¤¥ë¤Ø½ñ½Ð, 'h'¤Ç¥â¡¼¥ÉÊѹ¹, ESC¤Ç½ªÎ»]");
1203 Term_putstr(2, 23, -1, TERM_WHITE,
1204 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1212 if (c == ESCAPE) break;
1219 /* Process the player name */
1220 process_player_name(FALSE);
1226 sprintf(tmp, "%s.txt", player_base);
1228 if (get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
1230 if (get_string("File name: ", tmp, 80))
1234 if (tmp[0] && (tmp[0] != ' '))
1236 file_character(tmp);
1253 /* Flush messages */
1257 /* Restore the screen */
1260 /* Redraw everything */
1261 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1268 * Recall the most recent message
1270 void do_cmd_message_one(void)
1272 /* Recall one message XXX XXX XXX */
1273 prt(format("> %s", message_str(0)), 0, 0);
1278 * Show previous messages to the user -BEN-
1280 * The screen format uses line 0 and 23 for headers and prompts,
1281 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1283 * This command shows you which commands you are viewing, and allows
1284 * you to "search" for strings in the recall.
1286 * Note that messages may be longer than 80 characters, but they are
1287 * displayed using "infinite" length, with a special sub-command to
1288 * "slide" the virtual display to the left or right.
1290 * Attempt to only hilite the matching portions of the string.
1292 void do_cmd_messages(int num_now)
1302 Term_get_size(&wid, &hgt);
1304 /* Number of message lines in a screen */
1305 num_lines = hgt - 4;
1314 /* Total messages */
1317 /* Start on first message */
1320 /* Save the screen */
1326 /* Process requests until done */
1332 /* Dump up to 20 lines of messages */
1333 for (j = 0; (j < num_lines) && (i + j < n); j++)
1335 cptr msg = message_str(i+j);
1337 /* Dump the messages, bottom to top */
1338 c_prt((i+j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1340 /* Hilite "shower" */
1345 /* Display matches */
1346 while ((str = my_strstr(str, shower)) != NULL)
1348 int len = strlen(shower);
1350 /* Display the match */
1351 Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1359 /* Erase remaining lines */
1360 for (; j < num_lines; j++)
1362 Term_erase(0, num_lines + 1 - j, 255);
1365 /* Display header XXX XXX XXX */
1368 prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d)",
1369 i, i+j-1, n), 0, 0);
1371 prt(format("Message Recall (%d-%d of %d)",
1372 i, i+j-1, n), 0, 0);
1376 /* Display prompt (not very informative) */
1378 prt("[ 'p' ¤Ç¹¹¤Ë¸Å¤¤¤â¤Î, 'n' ¤Ç¹¹¤Ë¿·¤·¤¤¤â¤Î, '/' ¤Ç¸¡º÷, ESC ¤ÇÃæÃÇ ]", hgt - 1, 0);
1380 prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0);
1385 skey = inkey_special();
1387 /* Exit on Escape */
1388 if (skey == ESCAPE) break;
1390 /* Hack -- Save the old index */
1393 /* Hack -- handle show */
1398 prt("¶¯Ä´: ", hgt - 1, 0);
1400 prt("Show: ", hgt - 1, 0);
1404 /* Get a "shower" string, or continue */
1405 if (!askfor_aux(shower, 80)) continue;
1411 /* Hack -- handle find */
1412 if (skey == '/' || skey == KTRL('s'))
1418 prt("¸¡º÷: ", hgt - 1, 0);
1420 prt("Find: ", hgt - 1, 0);
1424 /* Get a "finder" string, or continue */
1425 if (!askfor_aux(finder, 80)) continue;
1428 strcpy(shower, finder);
1431 for (z = i + 1; z < n; z++)
1433 cptr msg = message_str(z);
1436 if (my_strstr(msg, finder))
1447 /* Recall 1 older message */
1448 if (skey == SKEY_TOP)
1450 /* Go to the oldest line */
1454 /* Recall 1 newer message */
1455 if (skey == SKEY_BOTTOM)
1457 /* Go to the newest line */
1461 /* Recall 1 older message */
1462 if (skey == '8' || skey == SKEY_UP || skey == '\n' || skey == '\r')
1464 /* Go older if legal */
1465 i = MIN(i + 1, n - num_lines);
1468 /* Recall 10 older messages */
1471 /* Go older if legal */
1472 i = MIN(i + 10, n - num_lines);
1475 /* Recall 20 older messages */
1476 if (skey == 'p' || skey == KTRL('P') || skey == ' ' || skey == SKEY_PGUP)
1478 /* Go older if legal */
1479 i = MIN(i + num_lines, n - num_lines);
1482 /* Recall 20 newer messages */
1483 if (skey == 'n' || skey == KTRL('N') || skey == SKEY_PGDOWN)
1485 /* Go newer (if able) */
1486 i = MAX(0, i - num_lines);
1489 /* Recall 10 newer messages */
1492 /* Go newer (if able) */
1496 /* Recall 1 newer messages */
1497 if (skey == '2' || skey == SKEY_DOWN)
1499 /* Go newer (if able) */
1503 /* Hack -- Error of some kind */
1507 /* Restore the screen */
1514 * Number of cheating options
1521 static option_type cheat_info[CHEAT_MAX] =
1523 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1525 "cheat_peek", "¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1527 "cheat_peek", "Peek into object creation"
1531 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1533 "cheat_hear", "¥â¥ó¥¹¥¿¡¼¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1535 "cheat_hear", "Peek into monster creation"
1539 { &cheat_room, FALSE, 255, 0x04, 0x00,
1541 "cheat_room", "¥À¥ó¥¸¥ç¥ó¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1543 "cheat_room", "Peek into dungeon creation"
1547 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1549 "cheat_xtra", "¤½¤Î¾¤Î»ö¤ò¤Î¤¾¤¸«¤ë"
1551 "cheat_xtra", "Peek into something else"
1555 { &cheat_know, FALSE, 255, 0x10, 0x00,
1557 "cheat_know", "´°Á´¤Ê¥â¥ó¥¹¥¿¡¼¤Î»×¤¤½Ð¤òÃΤë"
1559 "cheat_know", "Know complete monster info"
1563 { &cheat_live, FALSE, 255, 0x20, 0x00,
1565 "cheat_live", "»à¤ò²óÈò¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤¹¤ë"
1567 "cheat_live", "Allow player to avoid death"
1571 { &cheat_save, FALSE, 255, 0x40, 0x00,
1573 "cheat_save", "»à¤ó¤À»þ¥»¡¼¥Ö¤¹¤ë¤«³Îǧ¤¹¤ë"
1575 "cheat_save", "Ask for saving death"
1581 * Interact with some options for cheating
1583 static void do_cmd_options_cheat(cptr info)
1587 int i, k = 0, n = CHEAT_MAX;
1595 /* Interact with the player */
1600 /* Prompt XXX XXX XXX */
1602 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, ESC ¤Ç·èÄê )", info);
1604 sprintf(buf, "%s (RET to advance, y/n to set, ESC to accept) ", info);
1610 /* º¾µ½¥ª¥×¥·¥ç¥ó¤ò¤¦¤Ã¤«¤ê¤¤¤¸¤Ã¤Æ¤·¤Þ¤¦¿Í¤¬¤¤¤ë¤è¤¦¤Ê¤Î¤ÇÃí°Õ */
1611 prt(" << Ãí°Õ >>", 11, 0);
1612 prt(" º¾µ½¥ª¥×¥·¥ç¥ó¤ò°ìÅ٤ǤâÀßÄꤹ¤ë¤È¡¢¥¹¥³¥¢µÏ¿¤¬»Ä¤é¤Ê¤¯¤Ê¤ê¤Þ¤¹¡ª", 12, 0);
1613 prt(" ¸å¤Ë²ò½ü¤·¤Æ¤â¥À¥á¤Ç¤¹¤Î¤Ç¡¢¾¡Íø¼Ô¤òÌܻؤ¹Êý¤Ï¤³¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¤", 13, 0);
1614 prt(" ¤¸¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£", 14, 0);
1616 /* Display the options */
1617 for (i = 0; i < n; i++)
1619 byte a = TERM_WHITE;
1621 /* Color current option */
1622 if (i == k) a = TERM_L_BLUE;
1624 /* Display the option text */
1625 sprintf(buf, "%-48s: %s (%s)",
1626 cheat_info[i].o_desc,
1628 (*cheat_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1630 (*cheat_info[i].o_var ? "yes" : "no "),
1633 cheat_info[i].o_text);
1634 c_prt(a, buf, i + 2, 0);
1637 /* Hilite current option */
1638 move_cursor(k + 2, 50);
1644 * HACK - Try to translate the key into a direction
1645 * to allow using the roguelike keys for navigation.
1647 dir = get_keymap_dir(ch);
1648 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1662 k = (n + k - 1) % n;
1681 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "º¾µ½¥ª¥×¥·¥ç¥ó¤òON¤Ë¤·¤Æ¡¢¥¹¥³¥¢¤ò»Ä¤»¤Ê¤¯¤Ê¤Ã¤¿¡£");
1683 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "give up sending score to use cheating options.");
1685 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1686 (*cheat_info[k].o_var) = TRUE;
1695 (*cheat_info[k].o_var) = FALSE;
1703 strnfmt(buf, sizeof(buf), "joption.txt#%s", cheat_info[k].o_text);
1705 strnfmt(buf, sizeof(buf), "option.txt#%s", cheat_info[k].o_text);
1707 /* Peruse the help file */
1708 (void)show_file(TRUE, buf, NULL, 0, 0);
1724 static option_type autosave_info[2] =
1726 { &autosave_l, FALSE, 255, 0x01, 0x00,
1728 "autosave_l", "¿·¤·¤¤³¬¤ËÆþ¤ëÅ٤˼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1730 "autosave_l", "Autosave when entering new levels" },
1734 { &autosave_t, FALSE, 255, 0x02, 0x00,
1736 "autosave_t", "°ìÄ꥿¡¼¥óËè¤Ë¼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1738 "autosave_t", "Timed autosave" },
1744 static s16b toggle_frequency(s16b current)
1749 case 50: return 100;
1750 case 100: return 250;
1751 case 250: return 500;
1752 case 500: return 1000;
1753 case 1000: return 2500;
1754 case 2500: return 5000;
1755 case 5000: return 10000;
1756 case 10000: return 25000;
1763 * Interact with some options for cheating
1765 static void do_cmd_options_autosave(cptr info)
1769 int i, k = 0, n = 2;
1777 /* Interact with the player */
1780 /* Prompt XXX XXX XXX */
1782 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, F ¤ÇÉÑÅÙ¤òÆþÎÏ, ESC ¤Ç·èÄê ) ", info);
1784 sprintf(buf, "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) ", info);
1789 /* Display the options */
1790 for (i = 0; i < n; i++)
1792 byte a = TERM_WHITE;
1794 /* Color current option */
1795 if (i == k) a = TERM_L_BLUE;
1797 /* Display the option text */
1798 sprintf(buf, "%-48s: %s (%s)",
1799 autosave_info[i].o_desc,
1801 (*autosave_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1803 (*autosave_info[i].o_var ? "yes" : "no "),
1806 autosave_info[i].o_text);
1807 c_prt(a, buf, i + 2, 0);
1811 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè", autosave_freq), 5, 0);
1813 prt(format("Timed autosave frequency: every %d turns", autosave_freq), 5, 0);
1818 /* Hilite current option */
1819 move_cursor(k + 2, 50);
1835 k = (n + k - 1) % n;
1853 (*autosave_info[k].o_var) = TRUE;
1862 (*autosave_info[k].o_var) = FALSE;
1870 autosave_freq = toggle_frequency(autosave_freq);
1872 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè",
1873 autosave_freq), 5, 0);
1875 prt(format("Timed autosave frequency: every %d turns",
1876 autosave_freq), 5, 0);
1884 (void)show_file(TRUE, "joption.txt#Autosave", NULL, 0, 0);
1886 (void)show_file(TRUE, "option.txt#Autosave", NULL, 0, 0);
1905 * Interact with some options
1907 void do_cmd_options_aux(int page, cptr info)
1910 int i, k = 0, n = 0, l;
1913 bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1914 (!p_ptr->wizard || !allow_debug_opts);
1917 /* Lookup the options */
1918 for (i = 0; i < 24; i++) opt[i] = 0;
1920 /* Scan the options */
1921 for (i = 0; option_info[i].o_desc; i++)
1923 /* Notice options on this "page" */
1924 if (option_info[i].o_page == page) opt[n++] = i;
1931 /* Interact with the player */
1936 /* Prompt XXX XXX XXX */
1938 sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, %sESC:½ªÎ», ?:¥Ø¥ë¥×) ", info, browse_only ? "" : "y/n:Êѹ¹, ");
1940 sprintf(buf, "%s (RET:next, %s, ?:help) ", info, browse_only ? "ESC:exit" : "y/n:change, ESC:accept");
1946 /* HACK -- description for easy-auto-destroy options */
1948 if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤¤Î¤ß͸ú", 6, 6);
1950 if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
1953 /* Display the options */
1954 for (i = 0; i < n; i++)
1956 byte a = TERM_WHITE;
1958 /* Color current option */
1959 if (i == k) a = TERM_L_BLUE;
1961 /* Display the option text */
1962 sprintf(buf, "%-48s: %s (%.19s)",
1963 option_info[opt[i]].o_desc,
1965 (*option_info[opt[i]].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1967 (*option_info[opt[i]].o_var ? "yes" : "no "),
1970 option_info[opt[i]].o_text);
1971 if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1972 else c_prt(a, buf, i + 2, 0);
1975 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1978 /* Hilite current option */
1979 move_cursor(k + 2 + l, 50);
1985 * HACK - Try to translate the key into a direction
1986 * to allow using the roguelike keys for navigation.
1988 dir = get_keymap_dir(ch);
1989 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
2003 k = (n + k - 1) % n;
2020 if (browse_only) break;
2021 (*option_info[opt[k]].o_var) = TRUE;
2030 if (browse_only) break;
2031 (*option_info[opt[k]].o_var) = FALSE;
2039 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
2046 strnfmt(buf, sizeof(buf), "joption.txt#%s", option_info[opt[k]].o_text);
2048 strnfmt(buf, sizeof(buf), "option.txt#%s", option_info[opt[k]].o_text);
2050 /* Peruse the help file */
2051 (void)show_file(TRUE, buf, NULL, 0, 0);
2068 * Modify the "window" options
2070 static void do_cmd_options_win(void)
2084 /* Memorize old flags */
2085 for (j = 0; j < 8; j++)
2087 /* Acquire current flags */
2088 old_flag[j] = window_flag[j];
2098 /* Prompt XXX XXX XXX */
2100 prt("¥¦¥£¥ó¥É¥¦¡¦¥Õ¥é¥° (<Êý¸þ>¤Ç°ÜÆ°, t¤Ç¥Á¥§¥ó¥¸, y/n ¤Ç¥»¥Ã¥È, ESC)", 0, 0);
2102 prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
2106 /* Display the windows */
2107 for (j = 0; j < 8; j++)
2109 byte a = TERM_WHITE;
2111 cptr s = angband_term_name[j];
2114 if (j == x) a = TERM_L_BLUE;
2116 /* Window name, staggered, centered */
2117 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
2120 /* Display the options */
2121 for (i = 0; i < 16; i++)
2123 byte a = TERM_WHITE;
2125 cptr str = window_flag_desc[i];
2128 if (i == y) a = TERM_L_BLUE;
2132 if (!str) str = "(̤»ÈÍÑ)";
2134 if (!str) str = "(Unused option)";
2139 Term_putstr(0, i + 5, -1, a, str);
2141 /* Display the windows */
2142 for (j = 0; j < 8; j++)
2144 byte a = TERM_WHITE;
2149 if ((i == y) && (j == x)) a = TERM_L_BLUE;
2152 if (window_flag[j] & (1L << i)) c = 'X';
2155 Term_putch(35 + j * 5, i + 5, a, c);
2160 Term_gotoxy(35 + x * 5, y + 5);
2178 for (j = 0; j < 8; j++)
2180 window_flag[j] &= ~(1L << y);
2184 for (i = 0; i < 16; i++)
2186 window_flag[x] &= ~(1L << i);
2199 window_flag[x] |= (1L << y);
2207 window_flag[x] &= ~(1L << y);
2214 (void)show_file(TRUE, "joption.txt#Window", NULL, 0, 0);
2216 (void)show_file(TRUE, "option.txt#Window", NULL, 0, 0);
2226 d = get_keymap_dir(ch);
2228 x = (x + ddx[d] + 8) % 8;
2229 y = (y + ddy[d] + 16) % 16;
2236 /* Notice changes */
2237 for (j = 0; j < 8; j++)
2242 if (!angband_term[j]) continue;
2244 /* Ignore non-changes */
2245 if (window_flag[j] == old_flag[j]) continue;
2248 Term_activate(angband_term[j]);
2265 * Set or unset various options.
2267 * The user must use the "Ctrl-R" command to "adapt" to changes
2268 * in any options which control "visual" aspects of the game.
2270 void do_cmd_options(void)
2275 /* Save the screen */
2284 /* Why are we here */
2286 prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 1, 0);
2288 prt("Options", 1, 0);
2292 /* Give some choices */
2294 prt("(1) ¥¡¼ÆþÎÏ ¥ª¥×¥·¥ç¥ó", 2, 5);
2295 prt("(2) ²èÌ̽ÐÎÏ ¥ª¥×¥·¥ç¥ó", 3, 5);
2296 prt("(3) ¥²¡¼¥à¥×¥ì¥¤ ¥ª¥×¥·¥ç¥ó", 4, 5);
2297 prt("(4) ¹ÔÆ°Ãæ»ß´Ø·¸ ¥ª¥×¥·¥ç¥ó", 5, 5);
2298 prt("(5) ¸úΨ²½ ¥ª¥×¥·¥ç¥ó", 6, 5);
2299 prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ ¥ª¥×¥·¥ç¥ó", 7, 5);
2300 prt("(R) ¥×¥ì¥¤µÏ¿ ¥ª¥×¥·¥ç¥ó", 8, 5);
2302 /* Special choices */
2303 prt("(P) ¼«Æ°½¦¤¤¥¨¥Ç¥£¥¿", 10, 5);
2304 prt("(D) ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 11, 5);
2305 prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 12, 5);
2306 prt("(M) ÄãËâÎÏ¿§ïçÃÍ", 13, 5);
2307 prt("(A) ¼«Æ°¥»¡¼¥Ö ¥ª¥×¥·¥ç¥ó", 14, 5);
2309 prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
2311 prt("(1) Input Options", 2, 5);
2312 prt("(2) Output Options", 3, 5);
2313 prt("(3) Game-Play Options", 4, 5);
2314 prt("(4) Disturbance Options", 5, 5);
2315 prt("(5) Efficiency Options", 6, 5);
2316 prt("(6) Easy Auto-Destroyer Options", 7, 5);
2317 prt("(R) Play-record Options", 8, 5);
2318 /* Special choices */
2319 prt("(P) Auto-picker/destroyer editor", 10, 5);
2320 prt("(D) Base Delay Factor", 11, 5);
2321 prt("(H) Hitpoint Warning", 12, 5);
2322 prt("(M) Mana Color Threshold", 13, 5);
2323 prt("(A) Autosave Options", 14, 5);
2325 prt("(W) Window Flags", 15, 5);
2328 if (!p_ptr->wizard || !allow_debug_opts)
2332 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó (»²¾È¤Î¤ß)", 16, 5);
2334 prt("(B) Birth Options (Browse Only)", 16, 5);
2341 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó", 16, 5);
2343 prt("(B) Birth Options", 16, 5);
2348 if (p_ptr->noscore || allow_debug_opts)
2352 prt("(C) º¾µ½ ¥ª¥×¥·¥ç¥ó", 17, 5);
2354 prt("(C) Cheating Options", 17, 5);
2361 prt("¥³¥Þ¥ó¥É:", 19, 0);
2363 prt("Command: ", 19, 0);
2371 if (k == ESCAPE) break;
2376 /* General Options */
2379 /* Process the general options */
2381 do_cmd_options_aux(OPT_PAGE_INPUT, "¥¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2383 do_cmd_options_aux(OPT_PAGE_INPUT, "Input Options");
2389 /* General Options */
2392 /* Process the general options */
2394 do_cmd_options_aux(OPT_PAGE_OUTPUT, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
2396 do_cmd_options_aux(OPT_PAGE_OUTPUT, "Output Options");
2402 /* Inventory Options */
2407 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2409 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "Game-Play Options");
2415 /* Disturbance Options */
2420 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2422 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "Disturbance Options");
2428 /* Efficiency Options */
2433 do_cmd_options_aux(OPT_PAGE_EFFICIENCY, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
2435 do_cmd_options_aux(OPT_PAGE_EFFICIENCY, "Efficiency Options");
2441 /* Object auto-destruction Options */
2446 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2448 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "Easy Auto-Destroyer Options");
2453 /* Play-record Options */
2459 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "¥×¥ì¥¤µÏ¿¥ª¥×¥·¥ç¥ó");
2461 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "Play-record Options");
2472 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
2474 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
2480 /* Cheating Options */
2483 if (!p_ptr->noscore && !allow_debug_opts)
2485 /* Cheat options are not permitted */
2492 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤¤Ê¤¤¡ª");
2494 do_cmd_options_cheat("Cheaters never win");
2504 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2506 do_cmd_options_autosave("Autosave");
2517 do_cmd_options_win();
2518 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2519 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2520 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2521 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2525 /* Auto-picker/destroyer editor */
2529 do_cmd_edit_autopick();
2533 /* Hack -- Delay Speed */
2539 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
2541 prt("Command: Base Delay Factor", 19, 0);
2545 /* Get a new value */
2548 int msec = delay_factor * delay_factor * delay_factor;
2550 prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2551 delay_factor, msec), 22, 0);
2553 prt(format("Current base delay factor: %d (%d msec)",
2554 delay_factor, msec), 22, 0);
2558 prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2560 prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2564 if (k == ESCAPE) break;
2568 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2570 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2574 else if (isdigit(k)) delay_factor = D2I(k);
2581 /* Hack -- hitpoint warning factor */
2587 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
2589 prt("Command: Hitpoint Warning", 19, 0);
2593 /* Get a new value */
2597 prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2598 hitpoint_warn), 22, 0);
2600 prt(format("Current hitpoint warning: %d0%%",
2601 hitpoint_warn), 22, 0);
2605 prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2607 prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2611 if (k == ESCAPE) break;
2615 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2617 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2621 else if (isdigit(k)) hitpoint_warn = D2I(k);
2628 /* Hack -- mana color factor */
2634 prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
2636 prt("Command: Mana Color Threshold", 19, 0);
2640 /* Get a new value */
2644 prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
2647 prt(format("Current mana color threshold: %d0%%",
2652 prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
2654 prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
2658 if (k == ESCAPE) break;
2662 (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
2664 (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
2668 else if (isdigit(k)) mana_warn = D2I(k);
2677 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2679 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2684 /* Unknown option */
2693 /* Flush messages */
2698 /* Restore the screen */
2701 /* Hack - Redraw equippy chars */
2702 p_ptr->redraw |= (PR_EQUIPPY);
2708 * Ask for a "user pref line" and process it
2710 * XXX XXX XXX Allow absolute file names?
2712 void do_cmd_pref(void)
2719 /* Ask for a "user pref command" */
2721 if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2723 if (!get_string("Pref: ", buf, 80)) return;
2727 /* Process that pref command */
2728 (void)process_pref_file_command(buf);
2731 void do_cmd_pickpref(void)
2737 if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2739 if(!get_check("Reload auto-pick preference file? ")) return;
2742 /* Free old entries */
2745 /* ¥¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2747 sprintf(buf, "picktype-%s.prf", player_name);
2749 sprintf(buf, "pickpref-%s.prf", player_name);
2751 err = process_pickpref_file(buf);
2756 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2758 msg_format("loaded '%s'.", buf);
2762 /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2764 /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2768 err = process_pickpref_file("picktype.prf");
2770 err = process_pickpref_file("pickpref.prf");
2776 msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2778 msg_print("loaded 'pickpref.prf'.");
2785 if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2787 if(err) msg_print("Failed to reload autopick preference.");
2794 * Hack -- append all current macros to the given file
2796 static errr macro_dump(cptr fname)
2798 static cptr mark = "Macro Dump";
2804 /* Build the filename */
2805 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2807 /* File type is "TEXT" */
2808 FILE_TYPE(FILE_TYPE_TEXT);
2810 /* Append to the file */
2811 if (!open_auto_dump(buf, mark)) return (-1);
2815 auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2817 auto_dump_printf("\n# Automatic macro dump\n\n");
2821 for (i = 0; i < macro__num; i++)
2823 /* Extract the action */
2824 ascii_to_text(buf, macro__act[i]);
2826 /* Dump the macro */
2827 auto_dump_printf("A:%s\n", buf);
2829 /* Extract the action */
2830 ascii_to_text(buf, macro__pat[i]);
2832 /* Dump normal macros */
2833 auto_dump_printf("P:%s\n", buf);
2836 auto_dump_printf("\n");
2848 * Hack -- ask for a "trigger" (see below)
2850 * Note the complex use of the "inkey()" function from "util.c".
2852 * Note that both "flush()" calls are extremely important.
2854 static void do_cmd_macro_aux(char *buf)
2864 /* Do not process macros */
2870 /* Read the pattern */
2876 /* Do not process macros */
2879 /* Do not wait for keys */
2882 /* Attempt to read a key */
2893 /* Convert the trigger */
2894 ascii_to_text(tmp, buf);
2896 /* Hack -- display the trigger */
2897 Term_addstr(-1, TERM_WHITE, tmp);
2904 * Hack -- ask for a keymap "trigger" (see below)
2906 * Note that both "flush()" calls are extremely important. This may
2907 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2909 static void do_cmd_macro_aux_keymap(char *buf)
2923 /* Convert to ascii */
2924 ascii_to_text(tmp, buf);
2926 /* Hack -- display the trigger */
2927 Term_addstr(-1, TERM_WHITE, tmp);
2936 * Hack -- append all keymaps to the given file
2938 static errr keymap_dump(cptr fname)
2940 static cptr mark = "Keymap Dump";
2949 if (rogue_like_commands)
2951 mode = KEYMAP_MODE_ROGUE;
2957 mode = KEYMAP_MODE_ORIG;
2961 /* Build the filename */
2962 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2964 /* File type is "TEXT" */
2965 FILE_TYPE(FILE_TYPE_TEXT);
2967 /* Append to the file */
2968 if (!open_auto_dump(buf, mark)) return -1;
2972 auto_dump_printf("\n# ¼«Æ°¥¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2974 auto_dump_printf("\n# Automatic keymap dump\n\n");
2978 for (i = 0; i < 256; i++)
2982 /* Loop up the keymap */
2983 act = keymap_act[mode][i];
2985 /* Skip empty keymaps */
2988 /* Encode the key */
2991 ascii_to_text(key, buf);
2993 /* Encode the action */
2994 ascii_to_text(buf, act);
2996 /* Dump the macro */
2997 auto_dump_printf("A:%s\n", buf);
2998 auto_dump_printf("C:%d:%s\n", mode, key);
3011 * Interact with "macros"
3013 * Note that the macro "action" must be defined before the trigger.
3015 * Could use some helpful instructions on this page. XXX XXX XXX
3017 void do_cmd_macros(void)
3029 if (rogue_like_commands)
3031 mode = KEYMAP_MODE_ROGUE;
3037 mode = KEYMAP_MODE_ORIG;
3040 /* File type is "TEXT" */
3041 FILE_TYPE(FILE_TYPE_TEXT);
3048 /* Process requests until done */
3056 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
3058 prt("Interact with Macros", 2, 0);
3063 /* Describe that action */
3065 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3067 prt("Current action (if any) shown below:", 20, 0);
3071 /* Analyze the current action */
3072 ascii_to_text(buf, macro__buf);
3074 /* Display the current action */
3080 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3082 prt("(1) Load a user pref file", 4, 5);
3087 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
3088 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
3089 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
3090 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
3091 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3092 prt("(7) ¥¡¼ÇÛÃ֤γÎǧ", 10, 5);
3093 prt("(8) ¥¡¼ÇÛÃ֤κîÀ®", 11, 5);
3094 prt("(9) ¥¡¼ÇÛÃ֤κï½ü", 12, 5);
3095 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3097 prt("(2) Append macros to a file", 5, 5);
3098 prt("(3) Query a macro", 6, 5);
3099 prt("(4) Create a macro", 7, 5);
3100 prt("(5) Remove a macro", 8, 5);
3101 prt("(6) Append keymaps to a file", 9, 5);
3102 prt("(7) Query a keymap", 10, 5);
3103 prt("(8) Create a keymap", 11, 5);
3104 prt("(9) Remove a keymap", 12, 5);
3105 prt("(0) Enter a new action", 13, 5);
3108 #endif /* ALLOW_MACROS */
3112 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3114 prt("Command: ", 16, 0);
3122 if (i == ESCAPE) break;
3124 /* Load a 'macro' file */
3131 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3133 prt("Command: Load a user pref file", 16, 0);
3139 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3141 prt("File: ", 18, 0);
3145 /* Default filename */
3146 sprintf(tmp, "%s.prf", player_name);
3148 /* Ask for a file */
3149 if (!askfor_aux(tmp, 80)) continue;
3151 /* Process the given filename */
3152 err = process_pref_file(tmp);
3156 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3158 msg_format("Loaded default '%s'.", tmp);
3165 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3167 msg_format("Failed to load '%s'!");
3173 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3175 msg_format("Loaded '%s'.", tmp);
3187 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3189 prt("Command: Append macros to a file", 16, 0);
3195 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3197 prt("File: ", 18, 0);
3201 /* Default filename */
3202 sprintf(tmp, "%s.prf", player_name);
3204 /* Ask for a file */
3205 if (!askfor_aux(tmp, 80)) continue;
3207 /* Dump the macros */
3208 (void)macro_dump(tmp);
3212 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3214 msg_print("Appended macros.");
3226 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3228 prt("Command: Query a macro", 16, 0);
3234 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3236 prt("Trigger: ", 18, 0);
3240 /* Get a macro trigger */
3241 do_cmd_macro_aux(buf);
3243 /* Acquire action */
3244 k = macro_find_exact(buf);
3251 msg_print("¤½¤Î¥¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3253 msg_print("Found no macro.");
3261 /* Obtain the action */
3262 strcpy(macro__buf, macro__act[k]);
3264 /* Analyze the current action */
3265 ascii_to_text(buf, macro__buf);
3267 /* Display the current action */
3272 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3274 msg_print("Found a macro.");
3280 /* Create a macro */
3285 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3287 prt("Command: Create a macro", 16, 0);
3293 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3295 prt("Trigger: ", 18, 0);
3299 /* Get a macro trigger */
3300 do_cmd_macro_aux(buf);
3307 prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3309 prt("Action: ", 20, 0);
3313 /* Convert to text */
3314 ascii_to_text(tmp, macro__buf);
3316 /* Get an encoded action */
3317 if (askfor_aux(tmp, 80))
3319 /* Convert to ascii */
3320 text_to_ascii(macro__buf, tmp);
3322 /* Link the macro */
3323 macro_add(buf, macro__buf);
3327 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3329 msg_print("Added a macro.");
3335 /* Remove a macro */
3340 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3342 prt("Command: Remove a macro", 16, 0);
3348 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3350 prt("Trigger: ", 18, 0);
3354 /* Get a macro trigger */
3355 do_cmd_macro_aux(buf);
3357 /* Link the macro */
3358 macro_add(buf, buf);
3362 msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3364 msg_print("Removed a macro.");
3374 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3376 prt("Command: Append keymaps to a file", 16, 0);
3382 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3384 prt("File: ", 18, 0);
3388 /* Default filename */
3389 sprintf(tmp, "%s.prf", player_name);
3391 /* Ask for a file */
3392 if (!askfor_aux(tmp, 80)) continue;
3394 /* Dump the macros */
3395 (void)keymap_dump(tmp);
3399 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3401 msg_print("Appended keymaps.");
3406 /* Query a keymap */
3413 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤γÎǧ", 16, 0);
3415 prt("Command: Query a keymap", 16, 0);
3421 prt("²¡¤¹¥¡¼: ", 18, 0);
3423 prt("Keypress: ", 18, 0);
3427 /* Get a keymap trigger */
3428 do_cmd_macro_aux_keymap(buf);
3430 /* Look up the keymap */
3431 act = keymap_act[mode][(byte)(buf[0])];
3438 msg_print("¥¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3440 msg_print("Found no keymap.");
3448 /* Obtain the action */
3449 strcpy(macro__buf, act);
3451 /* Analyze the current action */
3452 ascii_to_text(buf, macro__buf);
3454 /* Display the current action */
3459 msg_print("¥¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3461 msg_print("Found a keymap.");
3467 /* Create a keymap */
3472 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κîÀ®", 16, 0);
3474 prt("Command: Create a keymap", 16, 0);
3480 prt("²¡¤¹¥¡¼: ", 18, 0);
3482 prt("Keypress: ", 18, 0);
3486 /* Get a keymap trigger */
3487 do_cmd_macro_aux_keymap(buf);
3494 prt("¹ÔÆ°: ", 20, 0);
3496 prt("Action: ", 20, 0);
3500 /* Convert to text */
3501 ascii_to_text(tmp, macro__buf);
3503 /* Get an encoded action */
3504 if (askfor_aux(tmp, 80))
3506 /* Convert to ascii */
3507 text_to_ascii(macro__buf, tmp);
3509 /* Free old keymap */
3510 string_free(keymap_act[mode][(byte)(buf[0])]);
3512 /* Make new keymap */
3513 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3517 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3519 msg_print("Added a keymap.");
3525 /* Remove a keymap */
3530 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κï½ü", 16, 0);
3532 prt("Command: Remove a keymap", 16, 0);
3538 prt("²¡¤¹¥¡¼: ", 18, 0);
3540 prt("Keypress: ", 18, 0);
3544 /* Get a keymap trigger */
3545 do_cmd_macro_aux_keymap(buf);
3547 /* Free old keymap */
3548 string_free(keymap_act[mode][(byte)(buf[0])]);
3550 /* Make new keymap */
3551 keymap_act[mode][(byte)(buf[0])] = NULL;
3555 msg_print("¥¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3557 msg_print("Removed a keymap.");
3562 /* Enter a new action */
3567 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3569 prt("Command: Enter a new action", 16, 0);
3573 /* Go to the correct location */
3576 /* Hack -- limit the value */
3579 /* Get an encoded action */
3580 if (!askfor_aux(buf, 80)) continue;
3582 /* Extract an action */
3583 text_to_ascii(macro__buf, buf);
3586 #endif /* ALLOW_MACROS */
3595 /* Flush messages */
3604 static void cmd_visuals_aux(int i, int *num, int max)
3611 sprintf(str, "%d", *num);
3613 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3616 tmp = strtol(str, NULL, 0);
3617 if (tmp >= 0 && tmp < max)
3621 else if (isupper(i))
3622 *num = (*num + max - 1) % max;
3624 *num = (*num + 1) % max;
3630 * Interact with "visuals"
3632 void do_cmd_visuals(void)
3640 const char *empty_symbol = "<< ? >>";
3642 if (use_bigtile) empty_symbol = "<< ?? >>";
3645 /* File type is "TEXT" */
3646 FILE_TYPE(FILE_TYPE_TEXT);
3649 /* Save the screen */
3653 /* Interact until done */
3659 /* Ask for a choice */
3661 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3663 prt("Interact with Visuals", 2, 0);
3667 /* Give some choices */
3669 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3671 prt("(1) Load a user pref file", 4, 5);
3674 #ifdef ALLOW_VISUALS
3676 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
3677 prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 6, 5);
3678 prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 7, 5);
3679 prt("(5) (̤»ÈÍÑ)", 8, 5);
3680 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3681 prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3682 prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3683 prt("(9) (̤»ÈÍÑ)", 12, 5);
3685 prt("(2) Dump monster attr/chars", 5, 5);
3686 prt("(3) Dump object attr/chars", 6, 5);
3687 prt("(4) Dump feature attr/chars", 7, 5);
3688 prt("(5) (unused)", 8, 5);
3689 prt("(6) Change monster attr/chars", 9, 5);
3690 prt("(7) Change object attr/chars", 10, 5);
3691 prt("(8) Change feature attr/chars", 11, 5);
3692 prt("(9) (unused)", 12, 5);
3697 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3699 prt("(0) Reset visuals", 13, 5);
3705 prt("¥³¥Þ¥ó¥É:", 18, 0);
3707 prt("Command: ", 15, 0);
3715 if (i == ESCAPE) break;
3717 /* Load a 'pref' file */
3722 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3724 prt("Command: Load a user pref file", 15, 0);
3730 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3732 prt("File: ", 17, 0);
3736 /* Default filename */
3737 sprintf(tmp, "%s.prf", player_name);
3740 if (!askfor_aux(tmp, 70)) continue;
3742 /* Process the given filename */
3743 (void)process_pref_file(tmp);
3746 #ifdef ALLOW_VISUALS
3748 /* Dump monster attr/chars */
3751 static cptr mark = "Monster attr/chars";
3755 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3757 prt("Command: Dump monster attr/chars", 15, 0);
3763 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3765 prt("File: ", 17, 0);
3769 /* Default filename */
3770 sprintf(tmp, "%s.prf", player_name);
3772 /* Get a filename */
3773 if (!askfor_aux(tmp, 70)) continue;
3775 /* Build the filename */
3776 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3778 /* Append to the file */
3779 if (!open_auto_dump(buf, mark)) continue;
3783 auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3785 auto_dump_printf("\n# Monster attr/char definitions\n\n");
3789 for (i = 1; i < max_r_idx; i++)
3791 monster_race *r_ptr = &r_info[i];
3793 /* Skip non-entries */
3794 if (!r_ptr->name) continue;
3796 /* Dump a comment */
3797 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3799 /* Dump the monster attr/char info */
3800 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3801 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3809 msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3811 msg_print("Dumped monster attr/chars.");
3816 /* Dump object attr/chars */
3819 static cptr mark = "Object attr/chars";
3823 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3825 prt("Command: Dump object attr/chars", 15, 0);
3831 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3833 prt("File: ", 17, 0);
3837 /* Default filename */
3838 sprintf(tmp, "%s.prf", player_name);
3840 /* Get a filename */
3841 if (!askfor_aux(tmp, 70)) continue;
3843 /* Build the filename */
3844 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3846 /* Append to the file */
3847 if (!open_auto_dump(buf, mark)) continue;
3851 auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3853 auto_dump_printf("\n# Object attr/char definitions\n\n");
3857 for (i = 1; i < max_k_idx; i++)
3860 object_kind *k_ptr = &k_info[i];
3862 /* Skip non-entries */
3863 if (!k_ptr->name) continue;
3865 /* Skip entries with flavor */
3866 if (k_ptr->flavor) continue;
3869 strip_name(o_name, i);
3871 /* Dump a comment */
3872 auto_dump_printf("# %s\n", o_name);
3874 /* Dump the object attr/char info */
3875 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3876 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3884 msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3886 msg_print("Dumped object attr/chars.");
3891 /* Dump feature attr/chars */
3894 static cptr mark = "Feature attr/chars";
3898 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3900 prt("Command: Dump feature attr/chars", 15, 0);
3906 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3908 prt("File: ", 17, 0);
3912 /* Default filename */
3913 sprintf(tmp, "%s.prf", player_name);
3915 /* Get a filename */
3916 if (!askfor_aux(tmp, 70)) continue;
3918 /* Build the filename */
3919 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3921 /* Append to the file */
3922 if (!open_auto_dump(buf, mark)) continue;
3926 auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3928 auto_dump_printf("\n# Feature attr/char definitions\n\n");
3932 for (i = 1; i < max_f_idx; i++)
3934 feature_type *f_ptr = &f_info[i];
3936 /* Skip non-entries */
3937 if (!f_ptr->name) continue;
3939 /* Skip mimiccing features */
3940 if (f_ptr->mimic != i) continue;
3942 /* Dump a comment */
3943 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3945 /* Dump the feature attr/char info */
3946 auto_dump_printf("F:%d:0x%02X/0x%02X\n\n", i,
3947 (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3955 msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3957 msg_print("Dumped feature attr/chars.");
3962 /* Modify monster attr/chars */
3969 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3971 prt("Command: Change monster attr/chars", 15, 0);
3975 /* Hack -- query until done */
3978 monster_race *r_ptr = &r_info[r];
3982 byte da = (r_ptr->d_attr);
3983 byte dc = (r_ptr->d_char);
3984 byte ca = (r_ptr->x_attr);
3985 byte cc = (r_ptr->x_char);
3987 /* Label the object */
3989 Term_putstr(5, 17, -1, TERM_WHITE,
3990 format("¥â¥ó¥¹¥¿¡¼ = %d, ̾Á° = %-40.40s",
3991 r, (r_name + r_ptr->name)));
3993 Term_putstr(5, 17, -1, TERM_WHITE,
3994 format("Monster = %d, Name = %-40.40s",
3995 r, (r_name + r_ptr->name)));
3999 /* Label the Default values */
4001 Term_putstr(10, 19, -1, TERM_WHITE,
4002 format("½é´üÃÍ ¿§ / ʸ»ú = %3u / %3u", da, dc));
4004 Term_putstr(10, 19, -1, TERM_WHITE,
4005 format("Default attr/char = %3u / %3u", da, dc));
4008 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4009 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4011 /* Label the Current values */
4013 Term_putstr(10, 20, -1, TERM_WHITE,
4014 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3u / %3u", ca, cc));
4016 Term_putstr(10, 20, -1, TERM_WHITE,
4017 format("Current attr/char = %3u / %3u", ca, cc));
4020 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4021 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4025 Term_putstr(0, 22, -1, TERM_WHITE,
4026 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4028 Term_putstr(0, 22, -1, TERM_WHITE,
4029 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4036 if (i == ESCAPE) break;
4038 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4039 else if (isupper(i)) c = 'a' + i - 'A';
4045 cmd_visuals_aux(i, &r, max_r_idx);
4048 t = (int)r_ptr->x_attr;
4049 cmd_visuals_aux(i, &t, 256);
4050 r_ptr->x_attr = (byte)t;
4053 t = (int)r_ptr->x_char;
4054 cmd_visuals_aux(i, &t, 256);
4055 r_ptr->x_char = (byte)t;
4061 /* Modify object attr/chars */
4068 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4070 prt("Command: Change object attr/chars", 15, 0);
4074 /* Hack -- query until done */
4077 object_kind *k_ptr = &k_info[k];
4081 byte da = (byte)k_ptr->d_attr;
4082 byte dc = (byte)k_ptr->d_char;
4083 byte ca = (byte)k_ptr->x_attr;
4084 byte cc = (byte)k_ptr->x_char;
4086 /* Label the object */
4088 Term_putstr(5, 17, -1, TERM_WHITE,
4089 format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s",
4090 k, (k_name + k_ptr->name)));
4092 Term_putstr(5, 17, -1, TERM_WHITE,
4093 format("Object = %d, Name = %-40.40s",
4094 k, (k_name + k_ptr->name)));
4098 /* Label the Default values */
4100 Term_putstr(10, 19, -1, TERM_WHITE,
4101 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4103 Term_putstr(10, 19, -1, TERM_WHITE,
4104 format("Default attr/char = %3d / %3d", da, dc));
4107 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4108 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4110 /* Label the Current values */
4112 Term_putstr(10, 20, -1, TERM_WHITE,
4113 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4115 Term_putstr(10, 20, -1, TERM_WHITE,
4116 format("Current attr/char = %3d / %3d", ca, cc));
4119 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4120 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4124 Term_putstr(0, 22, -1, TERM_WHITE,
4125 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4127 Term_putstr(0, 22, -1, TERM_WHITE,
4128 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4135 if (i == ESCAPE) break;
4137 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4138 else if (isupper(i)) c = 'a' + i - 'A';
4144 cmd_visuals_aux(i, &k, max_k_idx);
4147 t = (int)k_info[k].x_attr;
4148 cmd_visuals_aux(i, &t, 256);
4149 k_info[k].x_attr = (byte)t;
4152 t = (int)k_info[k].x_char;
4153 cmd_visuals_aux(i, &t, 256);
4154 k_info[k].x_char = (byte)t;
4160 /* Modify feature attr/chars */
4167 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4169 prt("Command: Change feature attr/chars", 15, 0);
4173 /* Hack -- query until done */
4176 feature_type *f_ptr = &f_info[f];
4180 byte da = (byte)f_ptr->d_attr;
4181 byte dc = (byte)f_ptr->d_char;
4182 byte ca = (byte)f_ptr->x_attr;
4183 byte cc = (byte)f_ptr->x_char;
4185 /* Label the object */
4187 Term_putstr(5, 17, -1, TERM_WHITE,
4188 format("ÃÏ·Á = %d, ̾Á° = %-40.40s",
4189 f, (f_name + f_ptr->name)));
4191 Term_putstr(5, 17, -1, TERM_WHITE,
4192 format("Terrain = %d, Name = %-40.40s",
4193 f, (f_name + f_ptr->name)));
4197 /* Label the Default values */
4199 Term_putstr(10, 19, -1, TERM_WHITE,
4200 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4202 Term_putstr(10, 19, -1, TERM_WHITE,
4203 format("Default attr/char = %3d / %3d", da, dc));
4206 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4208 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4211 /* Label the Current values */
4213 Term_putstr(10, 20, -1, TERM_WHITE,
4214 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4216 Term_putstr(10, 20, -1, TERM_WHITE,
4217 format("Current attr/char = %3d / %3d", ca, cc));
4220 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4221 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4225 Term_putstr(0, 22, -1, TERM_WHITE,
4226 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4228 Term_putstr(0, 22, -1, TERM_WHITE,
4229 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4236 if (i == ESCAPE) break;
4238 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4239 else if (isupper(i)) c = 'a' + i - 'A';
4245 cmd_visuals_aux(i, &f, max_f_idx);
4248 t = (int)f_info[f].x_attr;
4249 cmd_visuals_aux(i, &t, 256);
4250 f_info[f].x_attr = (byte)t;
4253 t = (int)f_info[f].x_char;
4254 cmd_visuals_aux(i, &t, 256);
4255 f_info[f].x_char = (byte)t;
4271 msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4273 msg_print("Visual attr/char tables reset.");
4278 /* Unknown option */
4284 /* Flush messages */
4289 /* Restore the screen */
4295 * Interact with "colors"
4297 void do_cmd_colors(void)
4306 /* File type is "TEXT" */
4307 FILE_TYPE(FILE_TYPE_TEXT);
4310 /* Save the screen */
4314 /* Interact until done */
4320 /* Ask for a choice */
4322 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4324 prt("Interact with Colors", 2, 0);
4328 /* Give some choices */
4330 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4332 prt("(1) Load a user pref file", 4, 5);
4337 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
4338 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4340 prt("(2) Dump colors", 5, 5);
4341 prt("(3) Modify colors", 6, 5);
4348 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4350 prt("Command: ", 8, 0);
4358 if (i == ESCAPE) break;
4360 /* Load a 'pref' file */
4365 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4367 prt("Command: Load a user pref file", 8, 0);
4373 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4375 prt("File: ", 10, 0);
4380 sprintf(tmp, "%s.prf", player_name);
4383 if (!askfor_aux(tmp, 70)) continue;
4385 /* Process the given filename */
4386 (void)process_pref_file(tmp);
4388 /* Mega-Hack -- react to changes */
4389 Term_xtra(TERM_XTRA_REACT, 0);
4391 /* Mega-Hack -- redraw */
4400 static cptr mark = "Colors";
4404 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 8, 0);
4406 prt("Command: Dump colors", 8, 0);
4412 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4414 prt("File: ", 10, 0);
4418 /* Default filename */
4419 sprintf(tmp, "%s.prf", player_name);
4421 /* Get a filename */
4422 if (!askfor_aux(tmp, 70)) continue;
4424 /* Build the filename */
4425 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4427 /* Append to the file */
4428 if (!open_auto_dump(buf, mark)) continue;
4432 auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4434 auto_dump_printf("\n# Color redefinitions\n\n");
4438 for (i = 0; i < 256; i++)
4440 int kv = angband_color_table[i][0];
4441 int rv = angband_color_table[i][1];
4442 int gv = angband_color_table[i][2];
4443 int bv = angband_color_table[i][3];
4448 cptr name = "unknown";
4452 /* Skip non-entries */
4453 if (!kv && !rv && !gv && !bv) continue;
4455 /* Extract the color name */
4456 if (i < 16) name = color_names[i];
4458 /* Dump a comment */
4460 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4462 auto_dump_printf("# Color '%s'\n", name);
4465 /* Dump the monster attr/char info */
4466 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4475 msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
4477 msg_print("Dumped color redefinitions.");
4489 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4491 prt("Command: Modify colors", 8, 0);
4495 /* Hack -- query until done */
4504 /* Exhibit the normal colors */
4505 for (j = 0; j < 16; j++)
4507 /* Exhibit this color */
4508 Term_putstr(j*4, 20, -1, a, "###");
4510 /* Exhibit all colors */
4511 Term_putstr(j*4, 22, -1, j, format("%3d", j));
4514 /* Describe the color */
4516 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4518 name = ((a < 16) ? color_names[a] : "undefined");
4522 /* Describe the color */
4524 Term_putstr(5, 10, -1, TERM_WHITE,
4525 format("¥«¥é¡¼ = %d, ̾Á° = %s", a, name));
4527 Term_putstr(5, 10, -1, TERM_WHITE,
4528 format("Color = %d, Name = %s", a, name));
4532 /* Label the Current values */
4533 Term_putstr(5, 12, -1, TERM_WHITE,
4534 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4535 angband_color_table[a][0],
4536 angband_color_table[a][1],
4537 angband_color_table[a][2],
4538 angband_color_table[a][3]));
4542 Term_putstr(0, 14, -1, TERM_WHITE,
4543 "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4545 Term_putstr(0, 14, -1, TERM_WHITE,
4546 "Command (n/N/k/K/r/R/g/G/b/B): ");
4554 if (i == ESCAPE) break;
4557 if (i == 'n') a = (byte)(a + 1);
4558 if (i == 'N') a = (byte)(a - 1);
4559 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4560 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4561 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4562 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4563 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4564 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4565 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4566 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4568 /* Hack -- react to changes */
4569 Term_xtra(TERM_XTRA_REACT, 0);
4571 /* Hack -- redraw */
4578 /* Unknown option */
4584 /* Flush messages */
4589 /* Restore the screen */
4595 * Note something in the message recall
4597 void do_cmd_note(void)
4606 if (!get_string("¥á¥â: ", buf, 60)) return;
4608 if (!get_string("Note: ", buf, 60)) return;
4612 /* Ignore empty notes */
4613 if (!buf[0] || (buf[0] == ' ')) return;
4615 /* Add the note to the message recall */
4617 msg_format("¥á¥â: %s", buf);
4619 msg_format("Note: %s", buf);
4626 * Mention the current version
4628 void do_cmd_version(void)
4633 msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4634 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4636 msg_format("You are playing Hengband %d.%d.%d.",
4637 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4644 * Array of feeling strings
4646 static cptr do_cmd_feeling_text[11] =
4649 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4651 "Looks like any other level.",
4655 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4657 "You feel there is something special about this level.",
4661 "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4663 "You nearly faint as horrible visions of death fill your mind!",
4667 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4669 "This level looks very dangerous.",
4673 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4675 "You have a very bad feeling...",
4679 "°¤¤Í½´¶¤¬¤¹¤ë...",
4681 "You have a bad feeling...",
4687 "You feel nervous.",
4691 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4693 "You feel your luck is turning...",
4697 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4699 "You don't like the look of this place.",
4703 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4705 "This level looks reasonably safe.",
4709 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4711 "What a boring place..."
4716 static cptr do_cmd_feeling_text_combat[11] =
4719 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4721 "Looks like any other level.",
4725 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4727 "You feel there is something special about this level.",
4731 "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4733 "You nearly faint as horrible visions of death fill your mind!",
4737 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4739 "This level looks very dangerous.",
4743 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4745 "You have a very bad feeling...",
4749 "°¤¤Í½´¶¤¬¤¹¤ë...",
4751 "You have a bad feeling...",
4757 "You feel nervous.",
4761 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4763 "You feel your luck is turning...",
4767 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4769 "You don't like the look of this place.",
4773 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4775 "This level looks reasonably safe.",
4779 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4781 "What a boring place..."
4786 static cptr do_cmd_feeling_text_lucky[11] =
4789 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4790 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4791 "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4792 "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4793 "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4794 "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4795 "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4796 "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤¤¿¤«...",
4797 "¸«¤¿´¶¤¸°¤¯¤Ï¤Ê¤¤...",
4798 "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4799 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4801 "Looks like any other level.",
4802 "You feel there is something special about this level.",
4803 "You have a superb feeling about this level.",
4804 "You have an excellent feeling...",
4805 "You have a very good feeling...",
4806 "You have a good feeling...",
4807 "You feel strangely lucky...",
4808 "You feel your luck is turning...",
4809 "You like the look of this place...",
4810 "This level can't be all bad...",
4811 "What a boring place..."
4817 * Note that "feeling" is set to zero unless some time has passed.
4818 * Note that this is done when the level is GENERATED, not entered.
4820 void do_cmd_feeling(void)
4822 /* Verify the feeling */
4823 if (feeling > 10) feeling = 10;
4825 /* No useful feeling in quests */
4826 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4829 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4831 msg_print("Looks like a typical quest level.");
4837 /* No useful feeling in town */
4838 else if (p_ptr->town_num && !dun_level)
4841 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4843 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4847 msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4849 msg_print("Looks like a strange wilderness.");
4857 msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4859 msg_print("Looks like a typical town.");
4866 /* No useful feeling in the wilderness */
4867 else if (!dun_level)
4870 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4872 msg_print("Looks like a typical wilderness.");
4878 /* Display the feeling */
4879 if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4881 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4883 if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4884 msg_print(do_cmd_feeling_text_combat[feeling]);
4886 msg_print(do_cmd_feeling_text[feeling]);
4891 msg_print(do_cmd_feeling_text[0]);
4898 * Description of each monster group.
4900 static cptr monster_group_text[] =
4903 "¥æ¥Ë¡¼¥¯", /* "Uniques" */
4904 "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
4933 /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4950 /* "¾åµé¥Ç¡¼¥â¥ó", */
4991 /* "Ancient Dragon/Wyrm", */
5000 "Multi-Headed Reptile",
5005 "Reptile/Amphibian",
5006 "Spider/Scorpion/Tick",
5008 /* "Major Demon", */
5024 * Symbols of monsters in each group. Note the "Uniques" group
5025 * is handled differently.
5027 static cptr monster_group_char[] =
5082 "$!?=&`.|/\\~[]()>",
5091 * hook function to sort monsters by level
5093 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5095 u16b *who = (u16b*)(u);
5100 monster_race *r_ptr1 = &r_info[w1];
5101 monster_race *r_ptr2 = &r_info[w2];
5106 if (r_ptr2->level > r_ptr1->level) return TRUE;
5107 if (r_ptr1->level > r_ptr2->level) return FALSE;
5109 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5110 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5115 * Build a list of monster indexes in the given group. Return the number
5116 * of monsters in the group.
5118 * mode & 0x01 : check for non-empty group
5119 * mode & 0x02 : cheat?
5121 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5126 /* Get a list of x_char in this group */
5127 cptr group_char = monster_group_char[grp_cur];
5129 /* XXX Hack -- Check if this is the "Uniques" group */
5130 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5132 /* XXX Hack -- Check if this is the "Riding" group */
5133 bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
5135 /* Check every race */
5136 for (i = 0; i < max_r_idx; i++)
5138 /* Access the race */
5139 monster_race *r_ptr = &r_info[i];
5141 /* Skip empty race */
5142 if (!r_ptr->name) continue ;
5144 /* Require known monsters */
5145 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5149 if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5152 else if (grp_riding)
5154 if (!(r_ptr->flags7 & RF7_RIDING)) continue;
5159 /* Check for race in the group */
5160 if (!my_strchr(group_char, r_ptr->d_char)) continue;
5164 mon_idx[mon_cnt++] = i;
5166 /* XXX Hack -- Just checking for non-empty group */
5167 if (mode & 0x01) break;
5170 /* Terminate the list */
5171 mon_idx[mon_cnt] = 0;
5173 /* Select the sort method */
5174 ang_sort_comp = ang_sort_comp_monster_level;
5175 ang_sort_swap = ang_sort_swap_hook;
5177 /* Sort by monster level */
5178 ang_sort(mon_idx, &dummy_why, mon_cnt);
5180 /* Return the number of races */
5186 * Description of each monster group.
5188 static cptr object_group_text[] =
5191 "¥¥Î¥³", /* "Mushrooms" */
5192 "Ìô", /* "Potions" */
5193 "Ìý¤Ä¤Ü", /* "Flasks" */
5194 "´¬Êª", /* "Scrolls" */
5195 "»ØÎØ", /* "Rings" */
5196 "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5197 "ū", /* "Whistle" */
5198 "¸÷¸»", /* "Lanterns" */
5199 "ËâË¡ËÀ", /* "Wands" */
5200 "¾ó", /* "Staffs" */
5201 "¥í¥Ã¥É", /* "Rods" */
5202 "¥«¡¼¥É", /* "Cards" */
5203 "¥¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5212 "Åá·õÎà", /* "Swords" */
5213 "Æß´ï", /* "Blunt Weapons" */
5214 "ĹÊÁÉð´ï", /* "Polearms" */
5215 "ºÎ·¡Æ»¶ñ", /* "Diggers" */
5216 "Èô¤ÓÆ»¶ñ", /* "Bows" */
5220 "·ÚÁõ³»", /* "Soft Armor" */
5221 "½ÅÁõ³»", /* "Hard Armor" */
5222 "¥É¥é¥´¥ó³»", /* "Dragon Armor" */
5223 "½â", /* "Shields" */
5224 "¥¯¥í¡¼¥¯", /* "Cloaks" */
5225 "äƼê", /* "Gloves" */
5226 "¥Ø¥ë¥á¥Ã¥È", /* "Helms" */
5227 "´§", /* "Crowns" */
5228 "¥Ö¡¼¥Ä", /* "Boots" */
5276 * TVALs of items in each group
5278 static byte object_group_tval[] =
5318 TV_LIFE_BOOK, /* Hack -- all spellbooks */
5324 * Build a list of monster indexes in the given group. Return the number
5325 * of monsters in the group.
5327 static int collect_objects(int grp_cur, int object_idx[])
5329 int i, j, k, object_cnt = 0;
5331 /* Get a list of x_char in this group */
5332 byte group_tval = object_group_tval[grp_cur];
5334 /* Check every object */
5335 for (i = 0; i < max_k_idx; i++)
5337 /* Access the race */
5338 object_kind *k_ptr = &k_info[i];
5340 /* Skip empty objects */
5341 if (!k_ptr->name) continue;
5343 /* Skip non-flavoured objects */
5344 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5346 /* Skip items with no distribution (special artifacts) */
5347 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5350 /* Require objects ever seen*/
5351 if (!k_ptr->aware && !p_ptr->wizard) continue;
5353 /* Check for race in the group */
5354 if (TV_LIFE_BOOK == group_tval)
5356 /* Hack -- All spell books */
5357 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5360 object_idx[object_cnt++] = i;
5363 else if (k_ptr->tval == group_tval)
5366 object_idx[object_cnt++] = i;
5370 /* Terminate the list */
5371 object_idx[object_cnt] = 0;
5373 /* Return the number of races */
5379 * Description of each feature group.
5381 static cptr feature_group_text[] =
5389 * Build a list of feature indexes in the given group. Return the number
5390 * of features in the group.
5392 static int collect_features(int grp_cur, int *feat_idx)
5394 int i, feat_cnt = 0;
5396 /* Unused; There is a single group. */
5399 /* Check every feature */
5400 for (i = 1; i < max_f_idx; i++)
5402 /* Access the index */
5403 feature_type *f_ptr = &f_info[i];
5405 /* Skip empty index */
5406 if (!f_ptr->name) continue;
5408 /* Skip mimiccing features */
5409 if (f_ptr->mimic != i) continue;
5412 feat_idx[feat_cnt++] = i;
5415 /* Terminate the list */
5416 feat_idx[feat_cnt] = 0;
5418 /* Return the number of races */
5425 * Build a list of monster indexes in the given group. Return the number
5426 * of monsters in the group.
5428 static int collect_artifacts(int grp_cur, int object_idx[])
5430 int i, object_cnt = 0;
5432 /* Get a list of x_char in this group */
5433 byte group_tval = object_group_tval[grp_cur];
5435 /* Check every object */
5436 for (i = 0; i < max_a_idx; i++)
5438 /* Access the artifact */
5439 artifact_type *a_ptr = &a_info[i];
5441 /* Skip empty artifacts */
5442 if (!a_ptr->name) continue;
5444 /* Skip "uncreated" artifacts */
5445 if (!a_ptr->cur_num) continue;
5447 /* Check for race in the group */
5448 if (a_ptr->tval == group_tval)
5451 object_idx[object_cnt++] = i;
5455 /* Terminate the list */
5456 object_idx[object_cnt] = 0;
5458 /* Return the number of races */
5465 * Encode the screen colors
5467 static char hack[17] = "dwsorgbuDWvyRGBU";
5471 * Hack -- load a screen dump from a file
5473 void do_cmd_load_screen(void)
5488 Term_get_size(&wid, &hgt);
5490 /* Build the filename */
5491 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5493 /* Append to the file */
5494 fff = my_fopen(buf, "r");
5499 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5501 msg_format("Failed to open %s.", buf);
5508 /* Save the screen */
5511 /* Clear the screen */
5515 /* Load the screen */
5516 for (y = 0; okay; y++)
5518 /* Get a line of data including control code */
5519 if (!fgets(buf, 1024, fff)) okay = FALSE;
5521 /* Get the blank line */
5522 if (buf[0] == '\n' || buf[0] == '\0') break;
5524 /* Ignore too large screen image */
5525 if (y >= hgt) continue;
5528 for (x = 0; x < wid - 1; x++)
5531 if (buf[x] == '\n' || buf[x] == '\0') break;
5533 /* Put the attr/char */
5534 Term_draw(x, y, TERM_WHITE, buf[x]);
5538 /* Dump the screen */
5539 for (y = 0; okay; y++)
5541 /* Get a line of data including control code */
5542 if (!fgets(buf, 1024, fff)) okay = FALSE;
5544 /* Get the blank line */
5545 if (buf[0] == '\n' || buf[0] == '\0') break;
5547 /* Ignore too large screen image */
5548 if (y >= hgt) continue;
5551 for (x = 0; x < wid - 1; x++)
5554 if (buf[x] == '\n' || buf[x] == '\0') break;
5556 /* Get the attr/char */
5557 (void)(Term_what(x, y, &a, &c));
5559 /* Look up the attr */
5560 for (i = 0; i < 16; i++)
5562 /* Use attr matches */
5563 if (hack[i] == buf[x]) a = i;
5566 /* Put the attr/char */
5567 Term_draw(x, y, a, c);
5578 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5580 msg_print("Screen dump loaded.");
5587 /* Restore the screen */
5594 cptr inven_res_label =
5596 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5598 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5603 #define IM_FLAG_STR "¡ö"
5604 #define HAS_FLAG_STR "¡Ü"
5605 #define NO_FLAG_STR "¡¦"
5607 #define IM_FLAG_STR "* "
5608 #define HAS_FLAG_STR "+ "
5609 #define NO_FLAG_STR ". "
5612 #define print_im_or_res_flag(IM, RES) \
5614 fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5615 (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5618 #define print_flag(TR) \
5620 fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5624 /* XTRA HACK RESLIST */
5625 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5627 char o_name[MAX_NLEN];
5628 u32b flgs[TR_FLAG_SIZE];
5630 if (!o_ptr->k_idx) return;
5631 if (o_ptr->tval != tval) return;
5633 /* Identified items only */
5634 if (!object_known_p(o_ptr)) return;
5637 * HACK:Ring of Lordly protection and Dragon equipment
5638 * have random resistances.
5640 if (((TV_EQUIP_BEGIN <= tval) && (tval <= TV_EQUIP_END) && o_ptr->name2)
5641 || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5642 || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5643 || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5644 || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5645 || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5646 || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5647 || o_ptr->art_name || o_ptr->name1)
5650 object_desc(o_name, o_ptr, TRUE, 0);
5652 while (o_name[i] && (i < 26))
5655 if (iskanji(o_name[i])) i++;
5664 o_name[i] = ' '; i++;
5669 fprintf(fff, "%s %s", where, o_name);
5671 if (!(o_ptr->ident & (IDENT_MENTAL)))
5674 fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5676 fputs("-------unknown------------ -------unknown------\n", fff);
5681 object_flags_known(o_ptr, flgs);
5683 print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5684 print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5685 print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5686 print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5687 print_flag(TR_RES_POIS);
5688 print_flag(TR_RES_LITE);
5689 print_flag(TR_RES_DARK);
5690 print_flag(TR_RES_SHARDS);
5691 print_flag(TR_RES_SOUND);
5692 print_flag(TR_RES_NETHER);
5693 print_flag(TR_RES_NEXUS);
5694 print_flag(TR_RES_CHAOS);
5695 print_flag(TR_RES_DISEN);
5699 print_flag(TR_RES_BLIND);
5700 print_flag(TR_RES_FEAR);
5701 print_flag(TR_RES_CONF);
5702 print_flag(TR_FREE_ACT);
5703 print_flag(TR_SEE_INVIS);
5704 print_flag(TR_HOLD_LIFE);
5705 print_flag(TR_TELEPATHY);
5706 print_flag(TR_SLOW_DIGEST);
5707 print_flag(TR_REGEN);
5708 print_flag(TR_FEATHER);
5716 fprintf(fff, "%s\n", inven_res_label);
5722 * Display *ID* ed weapons/armors's resistances
5724 static void do_cmd_knowledge_inven(void)
5728 char file_name[1024];
5738 /* Open a new file */
5739 fff = my_fopen_temp(file_name, 1024);
5743 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5745 msg_format("Failed to create temporary file %s.", file_name);
5750 fprintf(fff, "%s\n", inven_res_label);
5752 for (tval = TV_EQUIP_BEGIN; tval <= TV_EQUIP_END; tval++)
5756 for (; j < 9; j++) fputc('\n', fff);
5758 fprintf(fff, "%s\n", inven_res_label);
5762 strcpy(where, "Áõ");
5764 strcpy(where, "E ");
5766 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5768 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5772 strcpy(where, "»ý");
5774 strcpy(where, "I ");
5776 for (i = 0; i < INVEN_PACK; i++)
5778 do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5781 st_ptr = &town[1].store[STORE_HOME];
5783 strcpy(where, "²È");
5785 strcpy(where, "H ");
5788 for (i = 0; i < st_ptr->stock_num; i++)
5790 do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5794 /* Close the file */
5797 /* Display the file contents */
5799 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5801 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5804 /* Remove the file */
5809 void do_cmd_save_screen_html_aux(char *filename, int message)
5813 byte a = 0, old_a = 0;
5827 cptr html_head[] = {
5828 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5832 cptr html_foot[] = {
5834 "</body>\n</html>\n",
5840 Term_get_size(&wid, &hgt);
5842 /* File type is "TEXT" */
5843 FILE_TYPE(FILE_TYPE_TEXT);
5845 /* Append to the file */
5846 fff = my_fopen(filename, "w");
5852 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5854 msg_format("Failed to open file %s.", filename);
5862 /* Save the screen */
5866 /* Build the filename */
5867 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5868 tmpfff = my_fopen(buf, "r");
5870 for (i = 0; html_head[i]; i++)
5871 fprintf(fff, html_head[i]);
5875 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5877 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5881 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5883 fprintf(fff, "%s\n", buf);
5888 /* Dump the screen */
5889 for (y = 0; y < hgt; y++)
5896 for (x = 0; x < wid - 1; x++)
5900 /* Get the attr/char */
5901 (void)(Term_what(x, y, &a, &c));
5905 case '&': cc = "&"; break;
5906 case '<': cc = "<"; break;
5907 case '>': cc = ">"; break;
5909 case 0x1f: c = '.'; break;
5910 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5915 if ((y == 0 && x == 0) || a != old_a) {
5916 rv = angband_color_table[a][1];
5917 gv = angband_color_table[a][2];
5918 bv = angband_color_table[a][3];
5919 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
5920 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5924 fprintf(fff, "%s", cc);
5926 fprintf(fff, "%c", c);
5929 fprintf(fff, "</font>");
5932 for (i = 0; html_foot[i]; i++)
5933 fprintf(fff, html_foot[i]);
5938 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5940 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5944 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5946 fprintf(fff, "%s\n", buf);
5961 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
5963 msg_print("Screen dump saved.");
5968 /* Restore the screen */
5974 * Hack -- save a screen dump to a file
5976 static void do_cmd_save_screen_html(void)
5978 char buf[1024], tmp[256] = "screen.html";
5981 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
5983 if (!get_string("File name: ", tmp, 80))
5987 /* Build the filename */
5988 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5992 do_cmd_save_screen_html_aux(buf, 1);
5997 * Redefinable "save_screen" action
5999 void (*screendump_aux)(void) = NULL;
6003 * Hack -- save a screen dump to a file
6005 void do_cmd_save_screen(void)
6007 bool old_use_graphics = use_graphics;
6008 bool html_dump = FALSE;
6013 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6015 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6020 if (c == 'Y' || c == 'y')
6022 else if (c == 'H' || c == 'h')
6034 Term_get_size(&wid, &hgt);
6036 if (old_use_graphics)
6038 use_graphics = FALSE;
6041 /* Redraw everything */
6042 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6044 /* Hack -- update */
6050 do_cmd_save_screen_html();
6054 /* Do we use a special screendump function ? */
6055 else if (screendump_aux)
6057 /* Dump the screen to a graphics file */
6058 (*screendump_aux)();
6060 else /* Dump the screen as text */
6071 /* Build the filename */
6072 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6074 /* File type is "TEXT" */
6075 FILE_TYPE(FILE_TYPE_TEXT);
6077 /* Append to the file */
6078 fff = my_fopen(buf, "w");
6084 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6086 msg_format("Failed to open file %s.", buf);
6093 /* Save the screen */
6097 /* Dump the screen */
6098 for (y = 0; y < hgt; y++)
6101 for (x = 0; x < wid - 1; x++)
6103 /* Get the attr/char */
6104 (void)(Term_what(x, y, &a, &c));
6114 fprintf(fff, "%s\n", buf);
6121 /* Dump the screen */
6122 for (y = 0; y < hgt; y++)
6125 for (x = 0; x < wid - 1; x++)
6127 /* Get the attr/char */
6128 (void)(Term_what(x, y, &a, &c));
6131 buf[x] = hack[a&0x0F];
6138 fprintf(fff, "%s\n", buf);
6150 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6152 msg_print("Screen dump saved.");
6158 /* Restore the screen */
6162 if (old_use_graphics)
6164 use_graphics = TRUE;
6167 /* Redraw everything */
6168 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6170 /* Hack -- update */
6177 * Sorting hook -- Comp function -- see below
6179 * We use "u" to point to array of monster indexes,
6180 * and "v" to select the type of sorting to perform on "u".
6182 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6184 u16b *who = (u16b*)(u);
6186 u16b *why = (u16b*)(v);
6193 /* Sort by total kills */
6196 /* Extract total kills */
6197 z1 = a_info[w1].tval;
6198 z2 = a_info[w2].tval;
6200 /* Compare total kills */
6201 if (z1 < z2) return (TRUE);
6202 if (z1 > z2) return (FALSE);
6206 /* Sort by monster level */
6209 /* Extract levels */
6210 z1 = a_info[w1].sval;
6211 z2 = a_info[w2].sval;
6213 /* Compare levels */
6214 if (z1 < z2) return (TRUE);
6215 if (z1 > z2) return (FALSE);
6219 /* Sort by monster experience */
6222 /* Extract experience */
6223 z1 = a_info[w1].level;
6224 z2 = a_info[w2].level;
6226 /* Compare experience */
6227 if (z1 < z2) return (TRUE);
6228 if (z1 > z2) return (FALSE);
6232 /* Compare indexes */
6238 * Sorting hook -- Swap function -- see below
6240 * We use "u" to point to array of monster indexes,
6241 * and "v" to select the type of sorting to perform.
6243 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6245 u16b *who = (u16b*)(u);
6260 * Check the status of "artifacts"
6262 static void do_cmd_knowledge_artifacts(void)
6264 int i, k, z, x, y, n = 0;
6270 char file_name[1024];
6272 char base_name[MAX_NLEN];
6276 /* Open a new file */
6277 fff = my_fopen_temp(file_name, 1024);
6281 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6283 msg_format("Failed to create temporary file %s.", file_name);
6289 /* Allocate the "who" array */
6290 C_MAKE(who, max_a_idx, s16b);
6292 /* Allocate the "okay" array */
6293 C_MAKE(okay, max_a_idx, bool);
6295 /* Scan the artifacts */
6296 for (k = 0; k < max_a_idx; k++)
6298 artifact_type *a_ptr = &a_info[k];
6303 /* Skip "empty" artifacts */
6304 if (!a_ptr->name) continue;
6306 /* Skip "uncreated" artifacts */
6307 if (!a_ptr->cur_num) continue;
6313 /* Check the dungeon */
6314 for (y = 0; y < cur_hgt; y++)
6316 for (x = 0; x < cur_wid; x++)
6318 cave_type *c_ptr = &cave[y][x];
6320 s16b this_o_idx, next_o_idx = 0;
6322 /* Scan all objects in the grid */
6323 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6327 /* Acquire object */
6328 o_ptr = &o_list[this_o_idx];
6330 /* Acquire next object */
6331 next_o_idx = o_ptr->next_o_idx;
6333 /* Ignore non-artifacts */
6334 if (!artifact_p(o_ptr)) continue;
6336 /* Ignore known items */
6337 if (object_known_p(o_ptr)) continue;
6339 /* Note the artifact */
6340 okay[o_ptr->name1] = FALSE;
6345 /* Check the inventory and equipment */
6346 for (i = 0; i < INVEN_TOTAL; i++)
6348 object_type *o_ptr = &inventory[i];
6350 /* Ignore non-objects */
6351 if (!o_ptr->k_idx) continue;
6353 /* Ignore non-artifacts */
6354 if (!artifact_p(o_ptr)) continue;
6356 /* Ignore known items */
6357 if (object_known_p(o_ptr)) continue;
6359 /* Note the artifact */
6360 okay[o_ptr->name1] = FALSE;
6363 for (k = 0; k < max_a_idx; k++)
6365 if (okay[k]) who[n++] = k;
6368 /* Select the sort method */
6369 ang_sort_comp = ang_sort_art_comp;
6370 ang_sort_swap = ang_sort_art_swap;
6372 /* Sort the array by dungeon depth of monsters */
6373 ang_sort(who, &why, n);
6375 /* Scan the artifacts */
6376 for (k = 0; k < n; k++)
6378 artifact_type *a_ptr = &a_info[who[k]];
6382 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6384 strcpy(base_name, "Unknown Artifact");
6388 /* Obtain the base object type */
6389 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6397 /* Get local object */
6400 /* Create fake object */
6401 object_prep(q_ptr, z);
6403 /* Make it an artifact */
6404 q_ptr->name1 = (byte)who[k];
6406 /* Describe the artifact */
6407 object_desc_store(base_name, q_ptr, FALSE, 0);
6410 /* Hack -- Build the artifact name */
6412 fprintf(fff, " %s\n", base_name);
6414 fprintf(fff, " The %s\n", base_name);
6419 /* Free the "who" array */
6420 C_KILL(who, max_a_idx, s16b);
6422 /* Free the "okay" array */
6423 C_KILL(okay, max_a_idx, bool);
6425 /* Close the file */
6428 /* Display the file contents */
6430 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6432 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6436 /* Remove the file */
6442 * Display known uniques
6444 static void do_cmd_knowledge_uniques(void)
6452 char file_name[1024];
6454 /* Open a new file */
6455 fff = my_fopen_temp(file_name, 1024);
6459 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6461 msg_format("Failed to create temporary file %s.", file_name);
6467 /* Allocate the "who" array */
6468 C_MAKE(who, max_r_idx, s16b);
6470 /* Scan the monsters */
6471 for (i = 1; i < max_r_idx; i++)
6473 monster_race *r_ptr = &r_info[i];
6475 /* Use that monster */
6476 if (r_ptr->name) who[n++] = i;
6479 /* Select the sort method */
6480 ang_sort_comp = ang_sort_comp_hook;
6481 ang_sort_swap = ang_sort_swap_hook;
6483 /* Sort the array by dungeon depth of monsters */
6484 ang_sort(who, &why, n);
6486 /* Scan the monster races */
6487 for (k = 0; k < n; k++)
6489 monster_race *r_ptr = &r_info[who[k]];
6491 /* Only print Uniques */
6492 if (r_ptr->flags1 & (RF1_UNIQUE))
6494 bool dead = (r_ptr->max_num == 0);
6498 /* Only display "known" uniques */
6499 if (dead || cheat_know || r_ptr->r_sights)
6501 /* Print a message */
6503 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6504 (r_name + r_ptr->name));
6506 fprintf(fff, " %s is alive\n",
6507 (r_name + r_ptr->name));
6514 /* Free the "who" array */
6515 C_KILL(who, max_r_idx, s16b);
6517 /* Close the file */
6520 /* Display the file contents */
6522 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6524 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6528 /* Remove the file */
6534 * Display weapon-exp
6536 static void do_cmd_knowledge_weapon_exp(void)
6538 int i, j, num, weapon_exp;
6542 char file_name[1024];
6545 /* Open a new file */
6546 fff = my_fopen_temp(file_name, 1024);
6549 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6551 msg_format("Failed to create temporary file %s.", file_name);
6557 for (i = 0; i < 5; i++)
6559 for (num = 0; num < 64; num++)
6561 for (j = 0; j < max_k_idx; j++)
6563 object_kind *k_ptr = &k_info[j];
6565 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6567 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6569 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6571 fprintf(fff, "%-25s ", tmp);
6572 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6573 else fprintf(fff, " ");
6574 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6575 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6583 /* Close the file */
6586 /* Display the file contents */
6588 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6590 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6594 /* Remove the file */
6602 static void do_cmd_knowledge_spell_exp(void)
6604 int i = 0, spell_exp, exp_level;
6609 char file_name[1024];
6611 /* Open a new file */
6612 fff = my_fopen_temp(file_name, 1024);
6615 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6617 msg_format("Failed to create temporary file %s.", file_name);
6623 if (p_ptr->realm1 != REALM_NONE)
6626 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6628 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6630 for (i = 0; i < 32; i++)
6632 if (!is_magic(p_ptr->realm1))
6634 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6638 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6640 if (s_ptr->slevel >= 99) continue;
6641 spell_exp = p_ptr->spell_exp[i];
6642 exp_level = spell_exp_level(spell_exp);
6643 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6644 if (p_ptr->realm1 == REALM_HISSATSU)
6645 fprintf(fff, "[--]");
6648 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6649 else fprintf(fff, " ");
6650 fprintf(fff, "%s", exp_level_str[exp_level]);
6652 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6657 if (p_ptr->realm2 != REALM_NONE)
6660 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6662 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6664 for (i = 0; i < 32; i++)
6666 if (!is_magic(p_ptr->realm1))
6668 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6672 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6674 if (s_ptr->slevel >= 99) continue;
6676 spell_exp = p_ptr->spell_exp[i + 32];
6677 exp_level = spell_exp_level(spell_exp);
6678 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6679 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6680 else fprintf(fff, " ");
6681 fprintf(fff, "%s", exp_level_str[exp_level]);
6682 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6687 /* Close the file */
6690 /* Display the file contents */
6692 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6694 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6698 /* Remove the file */
6706 static void do_cmd_knowledge_skill_exp(void)
6708 int i = 0, skill_exp;
6712 char file_name[1024];
6714 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6716 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6719 /* Open a new file */
6720 fff = my_fopen_temp(file_name, 1024);
6723 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6725 msg_format("Failed to create temporary file %s.", file_name);
6731 for (i = 0; i < 3; i++)
6733 skill_exp = p_ptr->skill_exp[i];
6734 fprintf(fff, "%-20s ", skill_name[i]);
6735 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6736 else fprintf(fff, " ");
6737 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6738 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6742 /* Close the file */
6745 /* Display the file contents */
6747 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6749 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6753 /* Remove the file */
6759 * Pluralize a monster name
6761 void plural_aux(char *Name)
6763 int NameLen = strlen(Name);
6765 if (my_strstr(Name, "Disembodied hand"))
6767 strcpy(Name, "Disembodied hands that strangled people");
6769 else if (my_strstr(Name, "Colour out of space"))
6771 strcpy(Name, "Colours out of space");
6773 else if (my_strstr(Name, "stairway to hell"))
6775 strcpy(Name, "stairways to hell");
6777 else if (my_strstr(Name, "Dweller on the threshold"))
6779 strcpy(Name, "Dwellers on the threshold");
6781 else if (my_strstr(Name, " of "))
6783 cptr aider = my_strstr(Name, " of ");
6794 if (dummy[i-1] == 's')
6796 strcpy(&(dummy[i]), "es");
6801 strcpy(&(dummy[i]), "s");
6804 strcpy(&(dummy[i+1]), aider);
6805 strcpy(Name, dummy);
6807 else if (my_strstr(Name, "coins"))
6810 strcpy(dummy, "piles of ");
6811 strcat(dummy, Name);
6812 strcpy(Name, dummy);
6815 else if (my_strstr(Name, "Manes"))
6819 else if (streq(&(Name[NameLen - 2]), "ey"))
6821 strcpy(&(Name[NameLen - 2]), "eys");
6823 else if (Name[NameLen - 1] == 'y')
6825 strcpy(&(Name[NameLen - 1]), "ies");
6827 else if (streq(&(Name[NameLen - 4]), "ouse"))
6829 strcpy(&(Name[NameLen - 4]), "ice");
6831 else if (streq(&(Name[NameLen - 2]), "us"))
6833 strcpy(&(Name[NameLen - 2]), "i");
6835 else if (streq(&(Name[NameLen - 6]), "kelman"))
6837 strcpy(&(Name[NameLen - 6]), "kelmen");
6839 else if (streq(&(Name[NameLen - 8]), "wordsman"))
6841 strcpy(&(Name[NameLen - 8]), "wordsmen");
6843 else if (streq(&(Name[NameLen - 7]), "oodsman"))
6845 strcpy(&(Name[NameLen - 7]), "oodsmen");
6847 else if (streq(&(Name[NameLen - 7]), "eastman"))
6849 strcpy(&(Name[NameLen - 7]), "eastmen");
6851 else if (streq(&(Name[NameLen - 8]), "izardman"))
6853 strcpy(&(Name[NameLen - 8]), "izardmen");
6855 else if (streq(&(Name[NameLen - 5]), "geist"))
6857 strcpy(&(Name[NameLen - 5]), "geister");
6859 else if (streq(&(Name[NameLen - 2]), "ex"))
6861 strcpy(&(Name[NameLen - 2]), "ices");
6863 else if (streq(&(Name[NameLen - 2]), "lf"))
6865 strcpy(&(Name[NameLen - 2]), "lves");
6867 else if (suffix(Name, "ch") ||
6868 suffix(Name, "sh") ||
6869 suffix(Name, "nx") ||
6870 suffix(Name, "s") ||
6873 strcpy(&(Name[NameLen]), "es");
6877 strcpy(&(Name[NameLen]), "s");
6882 * Display current pets
6884 static void do_cmd_knowledge_pets(void)
6888 monster_type *m_ptr;
6891 int show_upkeep = 0;
6892 char file_name[1024];
6895 /* Open a new file */
6896 fff = my_fopen_temp(file_name, 1024);
6899 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6901 msg_format("Failed to create temporary file %s.", file_name);
6907 /* Process the monsters (backwards) */
6908 for (i = m_max - 1; i >= 1; i--)
6910 /* Access the monster */
6913 /* Ignore "dead" monsters */
6914 if (!m_ptr->r_idx) continue;
6916 /* Calculate "upkeep" for pets */
6920 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6921 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6925 show_upkeep = calculate_upkeep();
6927 fprintf(fff, "----------------------------------------------\n");
6929 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
6930 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6932 fprintf(fff, " Total: %d pet%s.\n",
6933 t_friends, (t_friends == 1 ? "" : "s"));
6934 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
6939 /* Close the file */
6942 /* Display the file contents */
6944 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6946 show_file(TRUE, file_name, "Current Pets", 0, 0);
6950 /* Remove the file */
6958 * Note that the player ghosts are ignored. XXX XXX XXX
6960 static void do_cmd_knowledge_kill_count(void)
6968 char file_name[1024];
6973 /* Open a new file */
6974 fff = my_fopen_temp(file_name, 1024);
6978 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6980 msg_format("Failed to create temporary file %s.", file_name);
6986 /* Allocate the "who" array */
6987 C_MAKE(who, max_r_idx, s16b);
6990 /* Monsters slain */
6993 for (kk = 1; kk < max_r_idx; kk++)
6995 monster_race *r_ptr = &r_info[kk];
6997 if (r_ptr->flags1 & (RF1_UNIQUE))
6999 bool dead = (r_ptr->max_num == 0);
7008 s16b This = r_ptr->r_pkills;
7019 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7021 fprintf(fff,"You have defeated no enemies yet.\n\n");
7024 else if (Total == 1)
7026 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7028 fprintf(fff,"You have defeated one enemy.\n\n");
7033 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7035 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7042 /* Scan the monsters */
7043 for (i = 1; i < max_r_idx; i++)
7045 monster_race *r_ptr = &r_info[i];
7047 /* Use that monster */
7048 if (r_ptr->name) who[n++] = i;
7051 /* Select the sort method */
7052 ang_sort_comp = ang_sort_comp_hook;
7053 ang_sort_swap = ang_sort_swap_hook;
7055 /* Sort the array by dungeon depth of monsters */
7056 ang_sort(who, &why, n);
7058 /* Scan the monster races */
7059 for (k = 0; k < n; k++)
7061 monster_race *r_ptr = &r_info[who[k]];
7063 if (r_ptr->flags1 & (RF1_UNIQUE))
7065 bool dead = (r_ptr->max_num == 0);
7069 /* Print a message */
7070 fprintf(fff, " %s\n",
7071 (r_name + r_ptr->name));
7077 s16b This = r_ptr->r_pkills;
7082 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7083 if(my_strchr("pt",r_ptr->d_char))
7084 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7086 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7090 if (my_strstr(r_name + r_ptr->name, "coins"))
7092 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7096 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7102 strcpy(ToPlural, (r_name + r_ptr->name));
7103 plural_aux(ToPlural);
7104 fprintf(fff, " %d %s\n", This, ToPlural);
7114 fprintf(fff,"----------------------------------------------\n");
7116 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7118 fprintf(fff," Total: %lu creature%s killed.\n",
7119 Total, (Total == 1 ? "" : "s"));
7123 /* Free the "who" array */
7124 C_KILL(who, max_r_idx, s16b);
7126 /* Close the file */
7129 /* Display the file contents */
7131 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7133 show_file(TRUE, file_name, "Kill Count", 0, 0);
7137 /* Remove the file */
7143 * Display the object groups.
7145 static void display_group_list(int col, int row, int wid, int per_page,
7146 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7150 /* Display lines until done */
7151 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7153 /* Get the group index */
7154 int grp = grp_idx[grp_top + i];
7156 /* Choose a color */
7157 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7159 /* Erase the entire line */
7160 Term_erase(col, row + i, wid);
7162 /* Display the group label */
7163 c_put_str(attr, group_text[grp], row + i, col);
7169 * Move the cursor in a browser window
7171 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7172 int *list_cur, int list_cnt)
7177 int list = *list_cur;
7179 /* Extract direction */
7182 /* Hack -- scroll up full screen */
7187 /* Hack -- scroll down full screen */
7192 d = get_keymap_dir(ch);
7197 /* Diagonals - hack */
7198 if ((ddx[d] > 0) && ddy[d])
7204 Term_get_size(&wid, &hgt);
7206 browser_rows = hgt - 8;
7208 /* Browse group list */
7213 /* Move up or down */
7214 grp += ddy[d] * (browser_rows - 1);
7217 if (grp >= grp_cnt) grp = grp_cnt - 1;
7218 if (grp < 0) grp = 0;
7219 if (grp != old_grp) list = 0;
7222 /* Browse sub-list list */
7225 /* Move up or down */
7226 list += ddy[d] * browser_rows;
7229 if (list >= list_cnt) list = list_cnt - 1;
7230 if (list < 0) list = 0;
7242 if (col < 0) col = 0;
7243 if (col > 1) col = 1;
7250 /* Browse group list */
7255 /* Move up or down */
7259 if (grp >= grp_cnt) grp = grp_cnt - 1;
7260 if (grp < 0) grp = 0;
7261 if (grp != old_grp) list = 0;
7264 /* Browse sub-list list */
7267 /* Move up or down */
7271 if (list >= list_cnt) list = list_cnt - 1;
7272 if (list < 0) list = 0;
7283 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7287 /* Clear the display lines */
7288 for (i = 0; i < height; i++)
7290 Term_erase(col, row + i, width);
7293 /* Bigtile mode uses double width */
7294 if (use_bigtile) width /= 2;
7296 /* Display lines until done */
7297 for (i = 0; i < height; i++)
7299 /* Display columns until done */
7300 for (j = 0; j < width; j++)
7308 /* Bigtile mode uses double width */
7309 if (use_bigtile) x += j;
7314 /* Ignore illegal characters */
7315 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7316 (!use_graphics && ic > 0x7f))
7322 /* Force correct code for both ASCII character and tile */
7323 if (c & 0x80) a |= 0x80;
7325 /* Display symbol */
7326 Term_queue_bigchar(x, y, a, c, 0, 0);
7333 * Place the cursor at the collect position for visual mode
7335 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7337 int i = (a & 0x7f) - attr_top;
7338 int j = c - char_left;
7343 /* Bigtile mode uses double width */
7344 if (use_bigtile) x += j;
7346 /* Place the cursor */
7352 * Clipboard variables for copy&paste in visual mode
7354 static byte attr_idx = 0;
7355 static byte char_idx = 0;
7358 * Do visual mode command -- Change symbols
7360 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7361 int height, int width,
7362 byte *attr_top_ptr, byte *char_left_ptr,
7363 byte *cur_attr_ptr, byte *cur_char_ptr)
7365 static byte attr_old = 0, char_old = 0;
7370 if (*visual_list_ptr)
7373 *cur_attr_ptr = attr_old;
7374 *cur_char_ptr = char_old;
7375 *visual_list_ptr = FALSE;
7384 if (*visual_list_ptr)
7387 *visual_list_ptr = FALSE;
7395 if (!*visual_list_ptr)
7397 *visual_list_ptr = TRUE;
7399 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7400 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7402 attr_old = *cur_attr_ptr;
7403 char_old = *cur_char_ptr;
7411 /* Set the visual */
7412 attr_idx = *cur_attr_ptr;
7413 char_idx = *cur_char_ptr;
7422 *cur_attr_ptr = attr_idx;
7423 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7429 *cur_char_ptr = char_idx;
7430 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7436 if (*visual_list_ptr)
7439 int d = get_keymap_dir(ch);
7440 byte a = (*cur_attr_ptr & 0x7f);
7441 byte c = *cur_char_ptr;
7443 if (use_bigtile) eff_width = width / 2;
7444 else eff_width = width;
7446 /* Restrict direction */
7447 if ((a == 0) && (ddy[d] < 0)) d = 0;
7448 if ((c == 0) && (ddx[d] < 0)) d = 0;
7449 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7450 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7455 /* Force correct code for both ASCII character and tile */
7456 if (c & 0x80) a |= 0x80;
7458 /* Set the visual */
7463 /* Move the frame */
7464 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7465 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7466 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7467 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7474 /* Visual mode command is not used */
7480 * Display the monsters in a group.
7482 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7483 int mon_cur, int mon_top)
7487 /* Display lines until done */
7488 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7492 /* Get the race index */
7493 int r_idx = mon_idx[mon_top + i] ;
7495 /* Access the race */
7496 monster_race *r_ptr = &r_info[r_idx];
7499 /* Choose a color */
7500 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7502 /* Display the name */
7503 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7505 /* Hack -- visual_list mode */
7508 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7510 else if (p_ptr->wizard)
7512 c_prt(attr, format("%d", r_idx), row + i, 60);
7515 /* Display symbol */
7516 Term_queue_bigchar(70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
7520 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7522 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7524 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7529 /* Clear remaining lines */
7530 for (; i < per_page; i++)
7532 Term_erase(col, row + i, 255);
7538 * Display known monsters.
7540 static void do_cmd_knowledge_monsters(void)
7543 int grp_cur, grp_top, old_grp_cur;
7544 int mon_cur, mon_top;
7545 int grp_cnt, grp_idx[100];
7553 bool visual_list = FALSE;
7554 byte attr_top = 0, char_left = 0;
7560 Term_get_size(&wid, &hgt);
7562 browser_rows = hgt - 8;
7564 /* Allocate the "mon_idx" array */
7565 C_MAKE(mon_idx, max_r_idx, s16b);
7570 /* Check every group */
7571 for (i = 0; monster_group_text[i] != NULL; i++)
7573 /* Measure the label */
7574 len = strlen(monster_group_text[i]);
7576 /* Save the maximum length */
7577 if (len > max) max = len;
7579 /* See if any monsters are known */
7580 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7582 /* Build a list of groups with known monsters */
7583 grp_idx[grp_cnt++] = i;
7587 /* Terminate the list */
7588 grp_idx[grp_cnt] = -1;
7591 grp_cur = grp_top = 0;
7592 mon_cur = mon_top = 0;
7601 monster_race *r_ptr;
7608 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7609 prt("¥°¥ë¡¼¥×", 4, 0);
7610 prt("̾Á°", 4, max + 3);
7611 if (p_ptr->wizard) prt("Idx", 4, 60);
7612 prt("ʸ»ú »¦³²¿ô", 4, 67);
7614 prt("Knowledge - Monsters", 2, 0);
7616 prt("Name", 4, max + 3);
7617 if (p_ptr->wizard) prt("Idx", 4, 60);
7618 prt("Sym Kills", 4, 67);
7621 for (i = 0; i < 78; i++)
7623 Term_putch(i, 5, TERM_WHITE, '=');
7626 for (i = 0; i < browser_rows; i++)
7628 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7634 /* Scroll group list */
7635 if (grp_cur < grp_top) grp_top = grp_cur;
7636 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7638 /* Display a list of monster groups */
7639 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7641 if (old_grp_cur != grp_cur)
7643 old_grp_cur = grp_cur;
7645 /* Get a list of monsters in the current group */
7646 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7649 /* Scroll monster list */
7650 while (mon_cur < mon_top)
7651 mon_top = MAX(0, mon_top - browser_rows/2);
7652 while (mon_cur >= mon_top + browser_rows)
7653 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7657 /* Display a list of monsters in the current group */
7658 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7664 /* Display a monster name */
7665 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7667 /* Display visual list below first monster */
7668 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7673 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7675 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);
7678 /* Get the current monster */
7679 r_ptr = &r_info[mon_idx[mon_cur]];
7681 /* Mega Hack -- track this monster race */
7682 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7684 /* Hack -- handle stuff */
7689 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7693 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7697 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7702 /* Do visual mode command if needed */
7703 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;
7716 /* Recall on screen */
7717 if (mon_idx[mon_cur])
7719 screen_roff(mon_idx[mon_cur], 0);
7730 /* Move the cursor */
7731 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7738 /* Free the "mon_idx" array */
7739 C_KILL(mon_idx, max_r_idx, s16b);
7744 * Display the objects in a group.
7746 static void display_object_list(int col, int row, int per_page, int object_idx[],
7747 int object_cur, int object_top)
7751 /* Display lines until done */
7752 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7757 /* Get the object index */
7758 int k_idx = object_idx[object_top + i];
7760 /* Access the object */
7761 object_kind *k_ptr = &k_info[k_idx];
7763 /* Choose a color */
7764 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7765 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7767 attr = ((i + object_top == object_cur) ? cursor : attr);
7770 strip_name(o_name, k_idx);
7772 /* Display the name */
7773 c_prt(attr, o_name, row + i, col);
7775 /* Hack -- visual_list mode */
7778 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7780 else if (p_ptr->wizard)
7782 c_prt(attr, format ("%d", k_idx), row + i, 70);
7785 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7786 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7788 /* Symbol is unknown */
7789 if (!k_ptr->aware && !p_ptr->wizard)
7795 /* Display symbol */
7796 Term_queue_bigchar(76, row + i, a, c, 0, 0);
7799 /* Clear remaining lines */
7800 for (; i < per_page; i++)
7802 Term_erase(col, row + i, 255);
7807 * Describe fake object
7809 static void desc_obj_fake(int k_idx)
7812 object_type object_type_body;
7814 /* Get local object */
7815 o_ptr = &object_type_body;
7817 /* Wipe the object */
7820 /* Create the artifact */
7821 object_prep(o_ptr, k_idx);
7823 /* It's fully know */
7824 o_ptr->ident |= IDENT_KNOWN;
7826 /* Track the object */
7827 /* object_actual_track(o_ptr); */
7829 /* Hack - mark as fake */
7830 /* term_obj_real = FALSE; */
7832 /* Hack -- Handle stuff */
7835 if (!screen_object(o_ptr, FALSE))
7838 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7840 msg_print("You see nothing special.");
7849 * Display known objects
7851 static void do_cmd_knowledge_objects(void)
7854 int grp_cur, grp_top, old_grp_cur;
7855 int object_old, object_cur, object_top;
7856 int grp_cnt, grp_idx[100];
7864 bool visual_list = FALSE;
7865 byte attr_top = 0, char_left = 0;
7871 Term_get_size(&wid, &hgt);
7873 browser_rows = hgt - 8;
7875 /* Allocate the "object_idx" array */
7876 C_MAKE(object_idx, max_k_idx, int);
7881 /* Check every group */
7882 for (i = 0; object_group_text[i] != NULL; i++)
7884 /* Measure the label */
7885 len = strlen(object_group_text[i]);
7887 /* Save the maximum length */
7888 if (len > max) max = len;
7890 /* See if any monsters are known */
7891 if (collect_objects(i, object_idx))
7893 /* Build a list of groups with known monsters */
7894 grp_idx[grp_cnt++] = i;
7898 /* Terminate the list */
7899 grp_idx[grp_cnt] = -1;
7902 grp_cur = grp_top = 0;
7903 object_cur = object_top = 0;
7920 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
7921 prt("¥°¥ë¡¼¥×", 4, 0);
7922 prt("̾Á°", 4, max + 3);
7923 if (p_ptr->wizard) prt("Idx", 4, 70);
7926 prt("Knowledge - objects", 2, 0);
7928 prt("Name", 4, max + 3);
7929 if (p_ptr->wizard) prt("Idx", 4, 70);
7933 for (i = 0; i < 78; i++)
7935 Term_putch(i, 5, TERM_WHITE, '=');
7938 for (i = 0; i < browser_rows; i++)
7940 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7946 /* Scroll group list */
7947 if (grp_cur < grp_top) grp_top = grp_cur;
7948 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7950 /* Display a list of object groups */
7951 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7953 if (old_grp_cur != grp_cur)
7955 old_grp_cur = grp_cur;
7957 /* Get a list of objects in the current group */
7958 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
7961 /* Scroll object list */
7962 while (object_cur < object_top)
7963 object_top = MAX(0, object_top - browser_rows/2);
7964 while (object_cur >= object_top + browser_rows)
7965 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7969 /* Display a list of objects in the current group */
7970 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
7974 object_top = object_cur;
7976 /* Display a list of objects in the current group */
7977 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
7979 /* Display visual list below first object */
7980 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7983 /* Get the current object */
7984 k_ptr = &k_info[object_idx[object_cur]];
7986 /* Mega Hack -- track this object */
7987 if (object_cnt) object_kind_track(object_idx[object_cur]);
7991 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7993 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);
7996 /* The "current" object changed */
7997 if (object_old != object_idx[object_cur])
7999 /* Hack -- handle stuff */
8002 /* Remember the "current" object */
8003 object_old = object_idx[object_cur];
8008 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8012 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8016 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8021 /* Do visual mode command if needed */
8022 /* Symbol of objects with flavor cannot be changed */
8023 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;
8036 /* Recall on screen */
8038 desc_obj_fake(object_idx[object_cur]);
8046 /* Move the cursor */
8047 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8053 /* Free the "object_idx" array */
8054 C_KILL(object_idx, max_k_idx, int);
8060 * Display the features in a group.
8062 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8063 int feat_cur, int feat_top)
8067 /* Display lines until done */
8068 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8073 int f_idx = feat_idx[feat_top + i];
8075 /* Access the index */
8076 feature_type *f_ptr = &f_info[f_idx];
8078 /* Choose a color */
8079 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8081 /* Display the name */
8082 c_prt(attr, f_name + f_ptr->name, row + i, col);
8084 /* Hack -- visual_list mode */
8087 c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
8090 /* Display symbol */
8091 Term_queue_bigchar(68, row + i, f_ptr->x_attr, f_ptr->x_char, 0, 0);
8094 /* Clear remaining lines */
8095 for (; i < per_page; i++)
8097 Term_erase(col, row + i, 255);
8103 * Interact with feature visuals.
8105 static void do_cmd_knowledge_features(void)
8108 int grp_cur, grp_top, old_grp_cur;
8109 int feat_cur, feat_top;
8110 int grp_cnt, grp_idx[100];
8118 bool visual_list = FALSE;
8119 byte attr_top = 0, char_left = 0;
8125 Term_get_size(&wid, &hgt);
8127 browser_rows = hgt - 8;
8129 /* Allocate the "feat_idx" array */
8130 C_MAKE(feat_idx, max_f_idx, int);
8135 /* Check every group */
8136 for (i = 0; feature_group_text[i] != NULL; i++)
8138 /* Measure the label */
8139 len = strlen(feature_group_text[i]);
8141 /* Save the maximum length */
8142 if (len > max) max = len;
8144 /* See if any features are known */
8145 if (collect_features(i, feat_idx))
8147 /* Build a list of groups with known features */
8148 grp_idx[grp_cnt++] = i;
8152 /* Terminate the list */
8153 grp_idx[grp_cnt] = -1;
8156 grp_cur = grp_top = 0;
8157 feat_cur = feat_top = 0;
8163 while ((!flag) && (grp_cnt))
8166 feature_type *f_ptr;
8172 prt("Visuals - features", 2, 0);
8174 prt("Name", 4, max + 3);
8177 for (i = 0; i < 78; i++)
8179 Term_putch(i, 5, TERM_WHITE, '=');
8182 for (i = 0; i < browser_rows; i++)
8184 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8190 /* Scroll group list */
8191 if (grp_cur < grp_top) grp_top = grp_cur;
8192 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8194 /* Display a list of feature groups */
8195 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8197 if (old_grp_cur != grp_cur)
8199 old_grp_cur = grp_cur;
8201 /* Get a list of features in the current group */
8202 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8205 /* Scroll feature list */
8206 while (feat_cur < feat_top)
8207 feat_top = MAX(0, feat_top - browser_rows/2);
8208 while (feat_cur >= feat_top + browser_rows)
8209 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8213 /* Display a list of features in the current group */
8214 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
8218 feat_top = feat_cur;
8220 /* Display a list of features in the current group */
8221 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
8223 /* Display visual list below first object */
8224 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8229 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8231 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);
8234 /* Get the current feature */
8235 f_ptr = &f_info[feat_idx[feat_cur]];
8239 place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
8243 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8247 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8252 /* Do visual mode command if needed */
8253 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;
8265 /* Move the cursor */
8266 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8273 if (!grp_cnt) msg_print("No features known.");
8275 /* Free the "feat_idx" array */
8276 C_KILL(feat_idx, max_f_idx, int);
8281 * List wanted monsters
8283 static void do_cmd_knowledge_kubi(void)
8288 char file_name[1024];
8291 /* Open a new file */
8292 fff = my_fopen_temp(file_name, 1024);
8295 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8297 msg_format("Failed to create temporary file %s.", file_name);
8305 bool listed = FALSE;
8308 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8310 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8312 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8314 fprintf(fff, "List of wanted monsters\n");
8316 fprintf(fff, "----------------------------------------------\n");
8318 for (i = 0; i < MAX_KUBI; i++)
8320 if (kubi_r_idx[i] <= 10000)
8322 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8331 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8333 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8338 /* Close the file */
8341 /* Display the file contents */
8343 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8345 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8349 /* Remove the file */
8354 * List virtues & status
8356 static void do_cmd_knowledge_virtues(void)
8360 char file_name[1024];
8363 /* Open a new file */
8364 fff = my_fopen_temp(file_name, 1024);
8367 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8369 msg_format("Failed to create temporary file %s.", file_name);
8378 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8380 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8385 /* Close the file */
8388 /* Display the file contents */
8390 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8392 show_file(TRUE, file_name, "Virtues", 0, 0);
8396 /* Remove the file */
8404 static void do_cmd_knowledge_dungeon(void)
8408 char file_name[1024];
8412 /* Open a new file */
8413 fff = my_fopen_temp(file_name, 1024);
8416 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8418 msg_format("Failed to create temporary file %s.", file_name);
8426 for (i = 1; i < max_d_idx; i++)
8430 if (!d_info[i].maxdepth) continue;
8431 if (!max_dlv[i]) continue;
8432 if (d_info[i].final_guardian)
8434 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8436 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8438 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8440 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8445 /* Close the file */
8448 /* Display the file contents */
8450 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8452 show_file(TRUE, file_name, "Dungeon", 0, 0);
8456 /* Remove the file */
8461 * List virtues & status
8464 static void do_cmd_knowledge_stat(void)
8468 char file_name[1024];
8471 /* Open a new file */
8472 fff = my_fopen_temp(file_name, 1024);
8475 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8477 msg_format("Failed to create temporary file %s.", file_name);
8485 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8486 (2 * p_ptr->hitdie +
8487 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8490 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8491 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8492 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8494 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8495 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8496 fprintf(fff, "Limits of maximum stats\n\n");
8498 for (v_nr = 0; v_nr < 6; v_nr++)
8500 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);
8501 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8507 /* Close the file */
8510 /* Display the file contents */
8512 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8514 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8518 /* Remove the file */
8524 * Print all active quests
8526 static void do_cmd_knowledge_quests_current(FILE *fff)
8529 char rand_tmp_str[120] = "\0";
8531 monster_race *r_ptr;
8533 int rand_level = 100;
8537 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8539 fprintf(fff, "< Current Quest >\n");
8542 for (i = 1; i < max_quests; i++)
8544 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8546 /* Set the quest number temporary */
8547 int old_quest = p_ptr->inside_quest;
8550 /* Clear the text */
8551 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8552 quest_text_line = 0;
8554 p_ptr->inside_quest = i;
8556 /* Get the quest text */
8557 init_flags = INIT_SHOW_TEXT;
8559 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8561 /* Reset the old quest number */
8562 p_ptr->inside_quest = old_quest;
8564 /* No info from "silent" quests */
8565 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8569 if (quest[i].type != QUEST_TYPE_RANDOM)
8571 char note[80] = "\0";
8573 if (quest[i].status == QUEST_STATUS_TAKEN)
8575 switch (quest[i].type)
8577 case QUEST_TYPE_KILL_LEVEL:
8578 case QUEST_TYPE_KILL_ANY_LEVEL:
8579 r_ptr = &r_info[quest[i].r_idx];
8580 strcpy(name, r_name + r_ptr->name);
8581 if (quest[i].max_num > 1)
8584 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8585 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8588 sprintf(note," - kill %d %s, have killed %d.",
8589 quest[i].max_num, name, quest[i].cur_num);
8594 sprintf(note," - %s¤òÅݤ¹¡£",name);
8596 sprintf(note," - kill %s.",name);
8600 case QUEST_TYPE_FIND_ARTIFACT:
8601 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8603 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8605 sprintf(note," - Find out %s.", name);
8609 case QUEST_TYPE_FIND_EXIT:
8611 sprintf(note," - õº÷¤¹¤ë¡£");
8613 sprintf(note," - Search.");
8617 case QUEST_TYPE_KILL_NUMBER:
8619 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8620 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8622 sprintf(note," - Kill %d monsters, have killed %d.",
8623 quest[i].max_num, quest[i].cur_num);
8627 case QUEST_TYPE_KILL_ALL:
8629 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8631 sprintf(note," - Kill all monsters.");
8637 /* Print the quest info */
8639 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8640 quest[i].name, quest[i].level, note);
8642 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8643 quest[i].name, quest[i].level, note);
8646 fprintf(fff, tmp_str);
8648 if (quest[i].status == QUEST_STATUS_COMPLETED)
8651 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8653 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8655 fprintf(fff, tmp_str);
8661 while (quest_text[j][0] && j < 10)
8663 fprintf(fff, " %s\n", quest_text[j]);
8668 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8671 rand_level = quest[i].level;
8673 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8675 /* Print the quest info */
8676 r_ptr = &r_info[quest[i].r_idx];
8677 strcpy(name, r_name + r_ptr->name);
8679 if (quest[i].max_num > 1)
8682 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8683 quest[i].name, quest[i].level,
8684 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8688 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8689 quest[i].name, quest[i].level,
8690 quest[i].max_num, name, quest[i].cur_num);
8696 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8697 quest[i].name, quest[i].level, name);
8699 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8700 quest[i].name, quest[i].level, name);
8708 /* Print the current random quest */
8709 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8712 if (!total) fprintf(fff, " ¤Ê¤·\n");
8714 if (!total) fprintf(fff, " Nothing.\n");
8720 * Print all finished quests
8722 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8729 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8731 fprintf(fff, "< Completed Quest >\n");
8733 for (i = 1; i < max_quests; i++)
8735 int q_idx = quest_num[i];
8737 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8739 if (is_fixed_quest_idx(q_idx))
8741 /* Set the quest number temporary */
8742 int old_quest = p_ptr->inside_quest;
8744 p_ptr->inside_quest = q_idx;
8747 init_flags = INIT_ASSIGN;
8749 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8751 /* Reset the old quest number */
8752 p_ptr->inside_quest = old_quest;
8754 /* No info from "silent" quests */
8755 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8760 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8762 /* Print the quest info */
8764 if (quest[q_idx].complev == 0)
8768 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8770 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8772 r_name+r_info[quest[q_idx].r_idx].name,
8773 quest[q_idx].level);
8779 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8781 " %-40s (Dungeon level: %3d) - level %2d\n",
8783 r_name+r_info[quest[q_idx].r_idx].name,
8785 quest[q_idx].complev);
8790 /* Print the quest info */
8792 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8793 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8795 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8796 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8800 fprintf(fff, tmp_str);
8804 if (!total) fprintf(fff, " ¤Ê¤·\n");
8806 if (!total) fprintf(fff, " Nothing.\n");
8812 * Print all failed quests
8814 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8821 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8823 fprintf(fff, "< Failed Quest >\n");
8825 for (i = 1; i < max_quests; i++)
8827 int q_idx = quest_num[i];
8829 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8831 if (is_fixed_quest_idx(q_idx))
8833 /* Set the quest number temporary */
8834 int old_quest = p_ptr->inside_quest;
8836 p_ptr->inside_quest = q_idx;
8838 /* Get the quest text */
8839 init_flags = INIT_ASSIGN;
8841 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8843 /* Reset the old quest number */
8844 p_ptr->inside_quest = old_quest;
8846 /* No info from "silent" quests */
8847 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8852 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8854 /* Print the quest info */
8856 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
8857 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8859 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
8860 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8865 /* Print the quest info */
8867 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8868 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8870 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
8871 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8874 fprintf(fff, tmp_str);
8878 if (!total) fprintf(fff, " ¤Ê¤·\n");
8880 if (!total) fprintf(fff, " Nothing.\n");
8886 * Print all random quests
8888 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8895 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
8897 fprintf(fff, "< Remaining Random Quest >\n");
8899 for (i = 1; i < max_quests; i++)
8901 /* No info from "silent" quests */
8902 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8904 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8908 /* Print the quest info */
8910 sprintf(tmp_str, " %s (%d³¬, %s)\n",
8911 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8913 sprintf(tmp_str, " %s (%d, %s)\n",
8914 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8916 fprintf(fff, tmp_str);
8920 if (!total) fprintf(fff, " ¤Ê¤·\n");
8922 if (!total) fprintf(fff, " Nothing.\n");
8927 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8929 int *q_num = (int *)u;
8930 quest_type *qa = &quest[q_num[a]];
8931 quest_type *qb = &quest[q_num[b]];
8936 if (qa->complev < qb->complev) return TRUE;
8937 if (qa->complev > qb->complev) return FALSE;
8938 if (qa->level <= qb->level) return TRUE;
8942 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8944 int *q_num = (int *)u;
8951 q_num[a] = q_num[b];
8957 * Print quest status of all active quests
8959 static void do_cmd_knowledge_quests(void)
8962 char file_name[1024];
8963 int *quest_num, dummy, i;
8965 /* Open a new file */
8966 fff = my_fopen_temp(file_name, 1024);
8970 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8972 msg_format("Failed to create temporary file %s.", file_name);
8978 /* Allocate Memory */
8979 C_MAKE(quest_num, max_quests, int);
8981 /* Sort by compete level */
8982 for (i = 1; i < max_quests; i++) quest_num[i] = i;
8983 ang_sort_comp = ang_sort_comp_quest_num;
8984 ang_sort_swap = ang_sort_swap_quest_num;
8985 ang_sort(quest_num, &dummy, max_quests);
8987 /* Dump Quest Information */
8988 do_cmd_knowledge_quests_current(fff);
8990 do_cmd_knowledge_quests_completed(fff, quest_num);
8992 do_cmd_knowledge_quests_failed(fff, quest_num);
8996 do_cmd_knowledge_quests_wiz_random(fff);
8999 /* Close the file */
9002 /* Display the file contents */
9004 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9006 show_file(TRUE, file_name, "Quest status", 0, 0);
9009 /* Remove the file */
9013 C_KILL(quest_num, max_quests, int);
9020 static void do_cmd_knowledge_home(void)
9025 char file_name[1024];
9027 char o_name[MAX_NLEN];
9030 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9032 /* Open a new file */
9033 fff = my_fopen_temp(file_name, 1024);
9036 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9038 msg_format("Failed to create temporary file %s.", file_name);
9046 /* Print all homes in the different towns */
9047 st_ptr = &town[1].store[STORE_HOME];
9049 /* Home -- if anything there */
9050 if (st_ptr->stock_num)
9055 /* Header with name of the town */
9057 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9059 fprintf(fff, " [Home Inventory]\n");
9062 /* Dump all available items */
9063 for (i = 0; i < st_ptr->stock_num; i++)
9066 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9067 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9068 if (strlen(o_name) <= 80-3)
9070 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9076 for (n = 0, t = o_name; n < 80-3; n++, t++)
9077 if(iskanji(*t)) {t++; n++;}
9078 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9080 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9081 fprintf(fff, " %.77s\n", o_name+n);
9084 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9085 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9090 /* Add an empty line */
9091 fprintf(fff, "\n\n");
9095 /* Close the file */
9098 /* Display the file contents */
9100 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9102 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9106 /* Remove the file */
9112 * Check the status of "autopick"
9114 static void do_cmd_knowledge_autopick(void)
9118 char file_name[1024];
9120 /* Open a new file */
9121 fff = my_fopen_temp(file_name, 1024);
9126 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9128 msg_format("Failed to create temporary file %s.", file_name);
9137 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9139 fprintf(fff, "No preference for auto picker/destroyer.");
9145 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9147 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9151 for (k = 0; k < max_autopick; k++)
9154 byte act = autopick_list[k].action;
9155 if (act & DONT_AUTOPICK)
9163 else if (act & DO_AUTODESTROY)
9171 else if (act & DO_AUTOPICK)
9179 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9188 if (act & DO_DISPLAY)
9189 fprintf(fff, "%11s", format("[%s]", tmp));
9191 fprintf(fff, "%11s", format("(%s)", tmp));
9193 tmp = autopick_line_from_entry(&autopick_list[k]);
9194 fprintf(fff, " %s", tmp);
9198 /* Close the file */
9200 /* Display the file contents */
9202 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9204 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9207 /* Remove the file */
9213 * Interact with "knowledge"
9215 void do_cmd_knowledge(void)
9218 /* File type is "TEXT" */
9219 FILE_TYPE(FILE_TYPE_TEXT);
9220 /* Save the screen */
9222 /* Interact until done */
9227 /* Ask for a choice */
9229 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9230 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9232 prt(format("page %d/2", (p+1)), 2, 65);
9233 prt("Display current knowledge", 3, 0);
9236 /* Give some choices */
9239 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9240 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9241 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9242 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9243 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9244 if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9245 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9246 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9247 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9248 prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5);
9250 prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5);
9251 prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5);
9252 prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5);
9253 prt("(d) ËâË¡¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 9, 5);
9254 prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 10, 5);
9255 prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ ¤Î°ìÍ÷", 11, 5);
9256 prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó ¤Î°ìÍ÷", 12, 5);
9257 prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È ¤Î°ìÍ÷", 13, 5);
9258 prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5);
9262 prt("(1) Display known artifacts", 6, 5);
9263 prt("(2) Display known objects", 7, 5);
9264 prt("(3) Display remaining uniques", 8, 5);
9265 prt("(4) Display known monster", 9, 5);
9266 prt("(5) Display kill count", 10, 5);
9267 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9268 prt("(7) Display current pets", 12, 5);
9269 prt("(8) Display home inventory", 13, 5);
9270 prt("(9) Display *identified* equip.", 14, 5);
9271 prt("(0) Display terrain symbols.", 15, 5);
9273 prt("(a) Display about yourself", 6, 5);
9274 prt("(b) Display mutations", 7, 5);
9275 prt("(c) Display weapon proficiency", 8, 5);
9276 prt("(d) Display spell proficiency", 9, 5);
9277 prt("(e) Display misc. proficiency", 10, 5);
9278 prt("(f) Display virtues", 11, 5);
9279 prt("(g) Display dungeons", 12, 5);
9280 prt("(h) Display current quests", 13, 5);
9281 prt("(i) Display auto pick/destroy", 14, 5);
9286 prt("-³¤¯-", 17, 8);
9287 prt("ESC) È´¤±¤ë", 21, 1);
9288 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9289 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9290 prt("¥³¥Þ¥ó¥É:", 20, 0);
9292 prt("-more-", 17, 8);
9293 prt("ESC) Exit menu", 21, 1);
9294 prt("SPACE) Next page", 21, 30);
9295 /*prt("-) Previous page", 21, 60);*/
9296 prt("Command: ", 20, 0);
9302 if (i == ESCAPE) break;
9305 case ' ': /* Page change */
9309 case '1': /* Artifacts */
9310 do_cmd_knowledge_artifacts();
9312 case '2': /* Objects */
9313 do_cmd_knowledge_objects();
9315 case '3': /* Uniques */
9316 do_cmd_knowledge_uniques();
9318 case '4': /* Monsters */
9319 do_cmd_knowledge_monsters();
9321 case '5': /* Kill count */
9322 do_cmd_knowledge_kill_count();
9324 case '6': /* wanted */
9325 if (!vanilla_town) do_cmd_knowledge_kubi();
9327 case '7': /* Pets */
9328 do_cmd_knowledge_pets();
9330 case '8': /* Home */
9331 do_cmd_knowledge_home();
9333 case '9': /* Resist list */
9334 do_cmd_knowledge_inven();
9336 case '0': /* Feature list */
9337 do_cmd_knowledge_features();
9340 case 'a': /* Max stat */
9341 do_cmd_knowledge_stat();
9343 case 'b': /* Mutations */
9344 do_cmd_knowledge_mutations();
9346 case 'c': /* weapon-exp */
9347 do_cmd_knowledge_weapon_exp();
9349 case 'd': /* spell-exp */
9350 do_cmd_knowledge_spell_exp();
9352 case 'e': /* skill-exp */
9353 do_cmd_knowledge_skill_exp();
9355 case 'f': /* Virtues */
9356 do_cmd_knowledge_virtues();
9358 case 'g': /* Dungeon */
9359 do_cmd_knowledge_dungeon();
9361 case 'h': /* Quests */
9362 do_cmd_knowledge_quests();
9364 case 'i': /* Autopick */
9365 do_cmd_knowledge_autopick();
9367 default: /* Unknown option */
9370 /* Flush messages */
9373 /* Restore the screen */
9379 * Check on the status of an active quest
9381 void do_cmd_checkquest(void)
9383 /* File type is "TEXT" */
9384 FILE_TYPE(FILE_TYPE_TEXT);
9386 /* Save the screen */
9390 do_cmd_knowledge_quests();
9392 /* Restore the screen */
9398 * Display the time and date
9400 void do_cmd_time(void)
9402 int day, hour, min, full, start, end, num;
9409 extract_day_hour_min(&day, &hour, &min);
9411 full = hour * 100 + min;
9419 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9421 strcpy(desc, "It is a strange time.");
9427 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9428 day, (hour % 12 == 0) ? 12 : (hour % 12),
9429 min, (hour < 12) ? "AM" : "PM");
9431 msg_format("This is day %d. The time is %d:%02d %s.",
9432 day, (hour % 12 == 0) ? 12 : (hour % 12),
9433 min, (hour < 12) ? "AM" : "PM");
9438 if (!randint0(10) || p_ptr->image)
9441 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9443 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9450 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9452 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9457 /* Open this file */
9458 fff = my_fopen(buf, "rt");
9463 /* Find this time */
9464 while (!my_fgets(fff, buf, sizeof(buf)))
9466 /* Ignore comments */
9467 if (!buf[0] || (buf[0] == '#')) continue;
9469 /* Ignore invalid lines */
9470 if (buf[1] != ':') continue;
9472 /* Process 'Start' */
9475 /* Extract the starting time */
9476 start = atoi(buf + 2);
9478 /* Assume valid for an hour */
9488 /* Extract the ending time */
9489 end = atoi(buf + 2);
9495 /* Ignore incorrect range */
9496 if ((start > full) || (full > end)) continue;
9498 /* Process 'Description' */
9503 /* Apply the randomizer */
9504 if (!randint0(num)) strcpy(desc, buf + 2);
9514 /* Close the file */