4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
11 /* Purpose: Interface commands */
18 * A set of functions to maintain automatic dumps of various kinds.
21 * remove_auto_dump(orig_file, mark)
22 * Remove the old automatic dump of type "mark".
23 * auto_dump_printf(fmt, ...)
24 * Dump a formatted string using fprintf().
25 * open_auto_dump(buf, mark)
26 * Open a file, remove old dump, and add new header.
27 * close_auto_dump(void)
28 * Add a footer, and close the file.
30 * The dump commands of original Angband simply add new lines to
31 * existing files; these files will become bigger and bigger unless
32 * an user deletes some or all of these files by hand at some
35 * These three functions automatically delete old dumped lines
36 * before adding new ones. Since there are various kinds of automatic
37 * dumps in a single file, we add a header and a footer with a type
38 * name for every automatic dump, and kill old lines only when the
39 * lines have the correct type of header and footer.
41 * We need to be quite paranoid about correctness; the user might
42 * (mistakenly) edit the file by hand, and see all their work come
43 * to nothing on the next auto dump otherwise. The current code only
44 * detects changes by noting inconsistencies between the actual number
45 * of lines and the number written in the footer. Note that this will
46 * not catch single-line edits.
50 * Mark strings for auto dump
52 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
53 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
56 * Variables for auto dump
58 static FILE *auto_dump_stream;
59 static cptr auto_dump_mark;
60 static int auto_dump_line_num;
63 * Remove old lines automatically generated before.
65 static void remove_auto_dump(cptr orig_file)
67 FILE *tmp_fff, *orig_fff;
71 bool between_mark = FALSE;
74 long header_location = 0;
75 char header_mark_str[80];
76 char footer_mark_str[80];
79 /* Prepare a header/footer mark string */
80 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
81 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
83 mark_len = strlen(footer_mark_str);
85 /* Open an old dump file in read-only mode */
86 orig_fff = my_fopen(orig_file, "r");
88 /* If original file does not exist, nothing to do */
89 if (!orig_fff) return;
91 /* Open a new (temporary) file */
92 tmp_fff = my_fopen_temp(tmp_file, 1024);
97 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", tmp_file);
99 msg_format("Failed to create temporary file %s.", tmp_file);
105 /* Loop for every line */
109 if (my_fgets(orig_fff, buf, sizeof(buf)))
111 /* Read error: Assume End of File */
114 * Was looking for the footer, but not found.
116 * Since automatic dump might be edited by hand,
117 * it's dangerous to kill these lines.
118 * Seek back to the next line of the (pseudo) header,
123 fseek(orig_fff, header_location, SEEK_SET);
124 between_mark = FALSE;
128 /* Success -- End the loop */
135 /* We are looking for the header mark of automatic dump */
138 /* Is this line a header? */
139 if (!strcmp(buf, header_mark_str))
141 /* Memorise seek point of this line */
142 header_location = ftell(orig_fff);
144 /* Initialize counter for number of lines */
147 /* Look for the footer from now */
150 /* There are some changes */
157 /* Copy orginally lines */
158 fprintf(tmp_fff, "%s\n", buf);
162 /* We are looking for the footer mark of automatic dump */
165 /* Is this line a footer? */
166 if (!strncmp(buf, footer_mark_str, mark_len))
171 * Compare the number of lines
173 * If there is an inconsistency between
174 * actual number of lines and the
175 * number here, the automatic dump
176 * might be edited by hand. So it's
177 * dangerous to kill these lines.
178 * Seek back to the next line of the
179 * (pseudo) header, and read again.
181 if (!sscanf(buf + mark_len, " (%d)", &tmp)
184 fseek(orig_fff, header_location, SEEK_SET);
187 /* Look for another header */
188 between_mark = FALSE;
194 /* Ignore old line, and count number of lines */
204 /* If there are some changes, overwrite the original file with new one */
207 /* Copy contents of temporary file */
209 tmp_fff = my_fopen(tmp_file, "r");
210 orig_fff = my_fopen(orig_file, "w");
212 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
213 fprintf(orig_fff, "%s\n", buf);
219 /* Kill the temporary file */
227 * Dump a formatted line, using "vstrnfmt()".
229 static void auto_dump_printf(cptr fmt, ...)
236 /* Begin the Varargs Stuff */
239 /* Format the args, save the length */
240 (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
242 /* End the Varargs Stuff */
245 /* Count number of lines */
246 for (p = buf; *p; p++)
248 if (*p == '\n') auto_dump_line_num++;
252 fprintf(auto_dump_stream, "%s", buf);
257 * Open file to append auto dump.
259 static bool open_auto_dump(cptr buf, cptr mark)
262 char header_mark_str[80];
264 /* Save the mark string */
265 auto_dump_mark = mark;
267 /* Prepare a header mark string */
268 sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
270 /* Remove old macro dumps */
271 remove_auto_dump(buf);
273 /* Append to the file */
274 auto_dump_stream = my_fopen(buf, "a");
277 if (!auto_dump_stream) {
279 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
281 msg_format("Failed to open %s.", buf);
290 fprintf(auto_dump_stream, "%s\n", header_mark_str);
292 /* Initialize counter */
293 auto_dump_line_num = 0;
296 auto_dump_printf("# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
297 auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
299 auto_dump_printf("# *Warning!* The lines below are an automatic dump.\n");
300 auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n");
308 * Append foot part and close auto dump.
310 static void close_auto_dump(void)
312 char footer_mark_str[80];
314 /* Prepare a footer mark string */
315 sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
318 auto_dump_printf("# *·Ù¹ð!!* °Ê¾å¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
319 auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
321 auto_dump_printf("# *Warning!* The lines above are an automatic dump.\n");
322 auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n");
326 fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
329 my_fclose(auto_dump_stream);
337 * Return suffix of ordinal number
339 cptr get_ordinal_number_suffix(int num)
341 num = ABS(num) % 100;
345 return (num == 11) ? "th" : "st";
347 return (num == 12) ? "th" : "nd";
349 return (num == 13) ? "th" : "rd";
358 * Take note to the diary.
360 errr do_cmd_write_nikki(int type, int num, cptr note)
366 cptr note_level = "";
367 bool do_level = TRUE;
368 char note_level_buf[40];
371 static bool disable_nikki = FALSE;
373 extract_day_hour_min(&day, &hour, &min);
375 if (disable_nikki) return(-1);
377 if (type == NIKKI_FIX_QUEST_C ||
378 type == NIKKI_FIX_QUEST_F ||
379 type == NIKKI_RAND_QUEST_C ||
380 type == NIKKI_RAND_QUEST_F ||
381 type == NIKKI_TO_QUEST)
385 old_quest = p_ptr->inside_quest;
386 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
388 /* Get the quest text */
389 init_flags = INIT_ASSIGN;
391 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
393 /* Reset the old quest number */
394 p_ptr->inside_quest = old_quest;
398 sprintf(file_name,"playrecord-%s.txt",savefile_base);
400 /* different filne name to avoid mixing */
401 sprintf(file_name,"playrec-%s.txt",savefile_base);
404 /* Build the filename */
405 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
407 /* File type is "TEXT" */
408 FILE_TYPE(FILE_TYPE_TEXT);
410 fff = my_fopen(buf, "a");
416 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¥×¥ì¥¤µÏ¿¤ò°ì»þÄä»ß¤·¤Þ¤¹¡£", buf);
418 msg_format("Failed to open %s. Play-Record is disabled temporally.", buf);
425 q_idx = quest_number(dun_level);
429 if (p_ptr->inside_arena)
431 note_level = "¥¢¥ê¡¼¥Ê:";
433 note_level = "Arane:";
437 note_level = "ÃϾå:";
439 note_level = "Surface:";
441 else if (q_idx && (is_fixed_quest_idx(q_idx)
442 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
444 note_level = "¥¯¥¨¥¹¥È:";
446 note_level = "Quest:";
451 sprintf(note_level_buf, "%d³¬(%s):", dun_level, d_name+d_info[dungeon_type].name);
453 sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, dun_level);
455 note_level = note_level_buf;
464 fprintf(fff, "%dÆüÌÜ\n",day);
466 fprintf(fff, "Day %d\n",day);
475 fprintf(fff, "%s\n",note);
479 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
485 fprintf(fff, " %2d:%02d %20s %s¤òȯ¸«¤·¤¿¡£\n", hour, min, note_level, note);
487 fprintf(fff, " %2d:%02d %20s discovered %s.\n", hour, min, note_level, note);
494 fprintf(fff, " %2d:%02d %20s %s¤òÅݤ·¤¿¡£\n", hour, min, note_level, note);
496 fprintf(fff, " %2d:%02d %20s defeated %s.\n", hour, min, note_level, note);
500 case NIKKI_FIX_QUEST_C:
502 if (quest[num].flags & QUEST_FLAG_SILENT) break;
504 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
506 fprintf(fff, " %2d:%02d %20s completed quest '%s'.\n", hour, min, note_level, quest[num].name);
510 case NIKKI_FIX_QUEST_F:
512 if (quest[num].flags & QUEST_FLAG_SILENT) break;
514 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤«¤éÌ¿¤«¤é¤¬¤éƨ¤²µ¢¤Ã¤¿¡£\n", hour, min, note_level, quest[num].name);
516 fprintf(fff, " %2d:%02d %20s run away from quest '%s'.\n", hour, min, note_level, quest[num].name);
520 case NIKKI_RAND_QUEST_C:
523 strcpy(name, r_name+r_info[quest[num].r_idx].name);
525 fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, name);
527 fprintf(fff, " %2d:%02d %20s completed randome quest '%s'\n", hour, min, note_level, name);
531 case NIKKI_RAND_QUEST_F:
534 strcpy(name, r_name+r_info[quest[num].r_idx].name);
536 fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤«¤éƨ¤²½Ð¤·¤¿¡£\n", hour, min, note_level, name);
538 fprintf(fff, " %2d:%02d %20s ran away from quest '%s'.\n", hour, min, note_level, name);
542 case NIKKI_MAXDEAPTH:
545 fprintf(fff, " %2d:%02d %20s %s¤ÎºÇ¿¼³¬%d³¬¤ËÅþ㤷¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, num);
547 fprintf(fff, " %2d:%02d %20s reached level %d of %s for the first time.\n", hour, min, note_level, num, d_name+d_info[dungeon_type].name);
554 fprintf(fff, " %2d:%02d %20s %s%s¤ÎºÇ¿¼³¬¤ò%d³¬¤Ë¥»¥Ã¥È¤·¤¿¡£\n", hour, min, note_level, note, d_name + d_info[num].name, max_dlv[num]);
556 fprintf(fff, " %2d:%02d %20s reset recall level of %s to %d %s.\n", hour, min, note_level, d_name + d_info[num].name, max_dlv[num], note);
563 if (q_idx && (is_fixed_quest_idx(q_idx)
564 && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
575 if (!(dun_level+num)) to = "ÃϾå";
576 else to = format("%d³¬", dun_level+num);
578 if (!(dun_level+num)) to = "the surface";
579 else to = format("level %d", dun_level+num);
584 fprintf(fff, " %2d:%02d %20s %s¤Ø%s¡£\n", hour, min, note_level, to, note);
586 fprintf(fff, " %2d:%02d %20s %s %s.\n", hour, min, note_level, note, to);
594 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤Æ%s¤Î%d³¬¤Ø²¼¤ê¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, max_dlv[dungeon_type]);
596 fprintf(fff, " %2d:%02d %20s recalled to dungeon level %d of %s.\n", hour, min, note_level, max_dlv[dungeon_type], d_name+d_info[dungeon_type].name);
600 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤ÆÃϾå¤Ø¤ÈÌá¤Ã¤¿¡£\n", hour, min, note_level);
602 fprintf(fff, " %2d:%02d %20s recalled from dungeon to surface.\n", hour, min, note_level);
608 if (quest[num].flags & QUEST_FLAG_SILENT) break;
610 fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤Ø¤ÈÆÍÆþ¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
612 fprintf(fff, " %2d:%02d %20s entered the quest '%s'.\n", hour, min, note_level, quest[num].name);
619 fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¡¦¥Æ¥ì¥Ý¡¼¥È¤Çæ½Ð¤·¤¿¡£\n", hour, min, note_level);
621 fprintf(fff, " %2d:%02d %20s Got out using teleport level.\n", hour, min, note_level);
628 fprintf(fff, " %2d:%02d %20s %s¤ò¹ØÆþ¤·¤¿¡£\n", hour, min, note_level, note);
630 fprintf(fff, " %2d:%02d %20s bought %s.\n", hour, min, note_level, note);
637 fprintf(fff, " %2d:%02d %20s %s¤òÇäµÑ¤·¤¿¡£\n", hour, min, note_level, note);
639 fprintf(fff, " %2d:%02d %20s sold %s.\n", hour, min, note_level, note);
648 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï¤Ç¡¢%s¤ÎÁ°¤ËÇÔ¤ìµî¤Ã¤¿¡£\n", hour, min, note_level, -num, note);
651 fprintf(fff, " %2d:%02d %20s beaten by %s in the %d%s fight.\n", hour, min, note_level, note, n, get_ordinal_number_suffix(n));
656 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï(%s)¤Ë¾¡Íø¤·¤¿¡£\n", hour, min, note_level, num, note);
658 fprintf(fff, " %2d:%02d %20s won the %d%s fight (%s).\n", hour, min, note_level, num, get_ordinal_number_suffix(num), note);
660 if (num == MAX_ARENA_MONS)
663 fprintf(fff, " Æ®µ»¾ì¤Î¤¹¤Ù¤Æ¤ÎŨ¤Ë¾¡Íø¤·¡¢¥Á¥ã¥ó¥Ô¥ª¥ó¤È¤Ê¤Ã¤¿¡£\n");
665 fprintf(fff, " won all fight to become a Chanpion.\n");
674 fprintf(fff, " %2d:%02d %20s %s¤ò¼±Ê̤·¤¿¡£\n", hour, min, note_level, note);
676 fprintf(fff, " %2d:%02d %20s identified %s.\n", hour, min, note_level, note);
691 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
693 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
697 fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥¦¥£¥¶¡¼¥É¡¦¥Æ¥ì¥Ý¡¼¥È¤Ç°ÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
699 fprintf(fff, " %2d:%02d %20s wizard-teleport to %s.\n", hour, min, note_level, to);
714 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
716 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
720 fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥Ñ¥¿¡¼¥ó¤ÎÎϤǰÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
722 fprintf(fff, " %2d:%02d %20s used Pattern to teleport to %s.\n", hour, min, note_level, to);
729 fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¤¬%d¤Ë¾å¤¬¤Ã¤¿¡£\n", hour, min, note_level, num);
731 fprintf(fff, " %2d:%02d %20s reached player level %d.\n", hour, min, note_level, num);
735 case NIKKI_GAMESTART:
737 time_t ct = time((time_t*)0);
741 fprintf(fff, "%s %s",note, ctime(&ct));
744 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
747 case NIKKI_NAMED_PET:
749 fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
754 fprintf(fff, "%s¤òι¤Îͧ¤Ë¤¹¤ë¤³¤È¤Ë·è¤á¤¿¡£\n", note);
756 fprintf(fff, "decided to travel together with %s.\n", note);
761 fprintf(fff, "%s¤Î̾Á°¤ò¾Ã¤·¤¿¡£\n", note);
763 fprintf(fff, "unnamed %s.\n", note);
768 fprintf(fff, "%s¤ò²òÊü¤·¤¿¡£\n", note);
770 fprintf(fff, "dismissed %s.\n", note);
775 fprintf(fff, "%s¤¬»à¤ó¤Ç¤·¤Þ¤Ã¤¿¡£\n", note);
777 fprintf(fff, "%s died.\n", note);
782 fprintf(fff, "%s¤ò¤ª¤¤¤ÆÊ̤ΥޥåפذÜÆ°¤·¤¿¡£\n", note);
784 fprintf(fff, "moved to another map leaving %s behind.\n", note);
789 fprintf(fff, "%s¤È¤Ï¤°¤ì¤Æ¤·¤Þ¤Ã¤¿¡£\n", note);
791 fprintf(fff, "lost sight of %s.\n", note);
796 fprintf(fff, "%s¤¬*Ç˲õ*¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note);
798 fprintf(fff, "%s was made disappeared by *destruction*.\n", note);
803 fprintf(fff, "%s¤¬´äÀФ˲¡¤·ÄÙ¤µ¤ì¤¿¡£\n", note);
805 fprintf(fff, "%s was crushed by falling rocks.\n", note);
820 if (do_level) write_level = FALSE;
826 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
828 static void do_cmd_disp_nikki(void)
830 char nikki_title[256];
835 static const char subtitle[][30] = {"ºÇ¶¯¤ÎÆùÂΤòµá¤á¤Æ",
836 "¿ÍÀ¸¤½¤ì¤Ï¤Ï¤«¤Ê¤¤",
847 "Åݤ¹¤Ù¤Å¨¤Ï¥²¡û¥Ä",
848 "¤ó¡Á¡©Ê¹¤³¤¨¤ó¤Ê¤¡",
849 "¥ª¥ì¤Î̾¤ò¸À¤Ã¤Æ¤ß¤í",
850 "Ƭ¤¬ÊѤˤʤäÁ¤ã¤Ã¤¿",
855 "¤³¤ó¤Ê¤â¤ó¤¸¤ã¤Ê¤¤",
864 "ºÇ¹â¤ÎƬǾ¤òµá¤á¤Æ"};
866 static const char subtitle[][51] ={"Quest of The World's Toughest Body",
867 "Attack is the best form of defence.",
869 "An unexpected windfall",
870 "A drowning man will catch at a straw",
871 "Don't count your chickens before they are hatched.",
872 "It is no use crying over spilt milk.",
873 "Seeing is believing.",
874 "Strike the iron while it is hot.",
875 "I don't care what follows.",
876 "To dig a well to put out a house on fire.",
877 "Tomorrow is another day.",
878 "Easy come, easy go.",
879 "The more haste, the less speed.",
880 "Where there is life, there is hope.",
881 "There is no royal road to *WINNER*.",
882 "Danger past, God forgotten.",
883 "The best thing to do now is to run away.",
884 "Life is but an empty dream.",
885 "Dead men tell no tales.",
886 "A book that remains shut is but a block.",
887 "Misfortunes never come singly.",
888 "A little knowledge is a dangerous thing.",
889 "History repeats itself.",
890 "*WINNER* was not built in a day.",
891 "Ignorance is bliss.",
892 "To lose is to win?",
893 "No medicine can cure folly.",
894 "All good things come to an end.",
895 "M$ Empire strikes back.",
896 "To see is to believe",
898 "Quest of The World's Greatest Brain"};
901 sprintf(file_name,"playrecord-%s.txt",savefile_base);
903 sprintf(file_name,"playrec-%s.txt",savefile_base);
906 /* Build the filename */
907 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
909 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
910 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
911 else if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
912 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
913 else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
916 sprintf(nikki_title, "¡Ö%s%s%s¤ÎÅÁÀâ -%s-¡×",
917 ap_ptr->title, ap_ptr->no ? "¤Î" : "", player_name, tmp);
919 sprintf(nikki_title, "Legend of %s %s '%s'",
920 ap_ptr->title, player_name, tmp);
923 /* Display the file contents */
924 show_file(FALSE, buf, nikki_title, -1, 0);
927 static void do_cmd_bunshou(void)
930 char bunshou[80] = "\0";
933 if (get_string("ÆâÍÆ: ", tmp, 79))
935 if (get_string("diary note: ", tmp, 79))
938 strcpy(bunshou, tmp);
940 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
944 static void do_cmd_last_get(void)
949 if (record_o_name[0] == '\0') return;
952 sprintf(buf,"%s¤ÎÆþ¼ê¤òµÏ¿¤·¤Þ¤¹¡£",record_o_name);
954 sprintf(buf,"Do you really want to record getting %s? ",record_o_name);
956 if (!get_check(buf)) return;
961 sprintf(buf,"%s¤ò¼ê¤ËÆþ¤ì¤¿¡£", record_o_name);
963 sprintf(buf,"descover %s.", record_o_name);
965 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
969 static void do_cmd_erase_nikki(void)
976 if (!get_check("ËÜÅö¤ËµÏ¿¤ò¾Ãµî¤·¤Þ¤¹¤«¡©")) return;
978 if (!get_check("Do you really want to delete all your record? ")) return;
982 sprintf(file_name,"playrecord-%s.txt",savefile_base);
984 sprintf(file_name,"playrec-%s.txt",savefile_base);
987 /* Build the filename */
988 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
990 /* Remove the file */
993 fff = my_fopen(buf, "w");
997 msg_format("µÏ¿¤ò¾Ãµî¤·¤Þ¤·¤¿¡£");
999 msg_format("deleted record.");
1003 msg_format("%s ¤Î¾Ãµî¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", buf);
1005 msg_format("failed to delete %s.", buf);
1012 void do_cmd_nikki(void)
1016 /* File type is "TEXT" */
1017 FILE_TYPE(FILE_TYPE_TEXT);
1019 /* Save the screen */
1022 /* Interact until done */
1028 /* Ask for a choice */
1030 prt("[ µÏ¿¤ÎÀßÄê ]", 2, 0);
1032 prt("[ Play Record ]", 2, 0);
1036 /* Give some choices */
1038 prt("(1) µÏ¿¤ò¸«¤ë", 4, 5);
1039 prt("(2) ʸ¾Ï¤òµÏ¿¤¹¤ë", 5, 5);
1040 prt("(3) ľÁ°¤ËÆþ¼êËô¤Ï´ÕÄꤷ¤¿¤â¤Î¤òµÏ¿¤¹¤ë", 6, 5);
1041 prt("(4) µÏ¿¤ò¾Ãµî¤¹¤ë", 7, 5);
1043 prt("(1) Display your record", 4, 5);
1044 prt("(2) Add record", 5, 5);
1045 prt("(3) Record item you last get/identify", 6, 5);
1046 prt("(4) Delete your record", 7, 5);
1052 prt("¥³¥Þ¥ó¥É:", 18, 0);
1054 prt("Command: ", 18, 0);
1062 if (i == ESCAPE) break;
1067 do_cmd_disp_nikki();
1076 do_cmd_erase_nikki();
1078 default: /* Unknown option */
1082 /* Flush messages */
1086 /* Restore the screen */
1091 * Hack -- redraw the screen
1093 * This command performs various low level updates, clears all the "extra"
1094 * windows, does a total redraw of the main window, and requests all of the
1095 * interesting updates and redraws that I can think of.
1097 * This command is also used to "instantiate" the results of the user
1098 * selecting various things, such as graphics mode, so it must call
1099 * the "TERM_XTRA_REACT" hook before redrawing the windows.
1101 void do_cmd_redraw(void)
1108 /* Hack -- react to changes */
1109 Term_xtra(TERM_XTRA_REACT, 0);
1112 /* Combine and Reorder the pack (later) */
1113 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
1117 p_ptr->update |= (PU_TORCH);
1120 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
1122 /* Forget lite/view */
1123 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
1125 /* Update lite/view */
1126 p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
1128 /* Update monsters */
1129 p_ptr->update |= (PU_MONSTERS);
1131 /* Redraw everything */
1132 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1135 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1138 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1142 /* Hack -- update */
1145 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1148 /* Redraw every window */
1149 for (j = 0; j < 8; j++)
1152 if (!angband_term[j]) continue;
1155 Term_activate(angband_term[j]);
1170 * Hack -- change name
1172 void do_cmd_change_name(void)
1181 /* Save the screen */
1189 /* Display the player */
1190 display_player(mode);
1195 display_player(mode);
1200 Term_putstr(2, 23, -1, TERM_WHITE,
1201 "['c'¤Ç̾Á°Êѹ¹, 'f'¤Ç¥Õ¥¡¥¤¥ë¤Ø½ñ½Ð, 'h'¤Ç¥â¡¼¥ÉÊѹ¹, ESC¤Ç½ªÎ»]");
1203 Term_putstr(2, 23, -1, TERM_WHITE,
1204 "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1212 if (c == ESCAPE) break;
1219 /* Process the player name */
1220 process_player_name(FALSE);
1226 sprintf(tmp, "%s.txt", player_base);
1228 if (get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
1230 if (get_string("File name: ", tmp, 80))
1234 if (tmp[0] && (tmp[0] != ' '))
1236 file_character(tmp);
1253 /* Flush messages */
1257 /* Restore the screen */
1260 /* Redraw everything */
1261 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1268 * Recall the most recent message
1270 void do_cmd_message_one(void)
1272 /* Recall one message XXX XXX XXX */
1273 prt(format("> %s", message_str(0)), 0, 0);
1278 * Show previous messages to the user -BEN-
1280 * The screen format uses line 0 and 23 for headers and prompts,
1281 * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1283 * This command shows you which commands you are viewing, and allows
1284 * you to "search" for strings in the recall.
1286 * Note that messages may be longer than 80 characters, but they are
1287 * displayed using "infinite" length, with a special sub-command to
1288 * "slide" the virtual display to the left or right.
1290 * Attempt to only hilite the matching portions of the string.
1292 void do_cmd_messages(int num_now)
1303 Term_get_size(&wid, &hgt);
1312 /* Total messages */
1315 /* Start on first message */
1318 /* Start at leftmost edge */
1321 /* Save the screen */
1324 /* Process requests until done */
1330 /* Dump up to 20 lines of messages */
1331 for (j = 0; (j < hgt - 4) && (i + j < n); j++)
1333 cptr msg = message_str(i+j);
1335 /* Apply horizontal scroll */
1336 msg = (strlen(msg) >= q) ? (msg + q) : "";
1338 /* Dump the messages, bottom to top */
1339 Term_putstr(0, hgt-j-3, -1, (bool)(i+j < num_now ? TERM_WHITE : TERM_SLATE), msg);
1341 /* Hilite "shower" */
1346 /* Display matches */
1347 while ((str = strstr(str, shower)) != NULL)
1349 int len = strlen(shower);
1351 /* Display the match */
1352 Term_putstr(str-msg, hgt-j-3, len, TERM_YELLOW, shower);
1360 /* Display header XXX XXX XXX */
1363 prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d) ¥ª¥Õ¥»¥Ã¥È(%d)",
1364 i, i+j-1, n, q), 0, 0);
1366 prt(format("Message Recall (%d-%d of %d), Offset %d",
1367 i, i+j-1, n, q), 0, 0);
1371 /* Display prompt (not very informative) */
1373 prt("[ 'p' ¤Ç¹¹¤Ë¸Å¤¤¤â¤Î, 'n' ¤Ç¹¹¤Ë¿·¤·¤¤¤â¤Î, '/' ¤Ç¸¡º÷, ESC ¤ÇÃæÃÇ ]", hgt - 1, 0);
1375 prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0);
1382 /* Exit on Escape */
1383 if (k == ESCAPE) break;
1385 /* Hack -- Save the old index */
1388 /* Horizontal scroll */
1392 q = (q >= 40) ? (q - 40) : 0;
1398 /* Horizontal scroll */
1408 /* Hack -- handle show */
1413 prt("¶¯Ä´: ", hgt - 1, 0);
1415 prt("Show: ", hgt - 1, 0);
1419 /* Get a "shower" string, or continue */
1420 if (!askfor_aux(shower, 80)) continue;
1426 /* Hack -- handle find */
1433 prt("¸¡º÷: ", hgt - 1, 0);
1435 prt("Find: ", hgt - 1, 0);
1439 /* Get a "finder" string, or continue */
1440 if (!askfor_aux(finder, 80)) continue;
1443 strcpy(shower, finder);
1446 for (z = i + 1; z < n; z++)
1448 cptr msg = message_str(z);
1451 if (strstr(msg, finder))
1462 /* Recall 1 older message */
1463 if ((k == '8') || (k == '\n') || (k == '\r'))
1465 /* Go newer if legal */
1466 if (i + 1 < n) i += 1;
1469 /* Recall 10 older messages */
1472 /* Go older if legal */
1473 if (i + 10 < n) i += 10;
1476 /* Recall 20 older messages */
1477 if ((k == 'p') || (k == KTRL('P')) || (k == ' '))
1479 /* Go older if legal */
1480 if (i + 20 < n) i += 20;
1483 /* Recall 20 newer messages */
1484 if ((k == 'n') || (k == KTRL('N')))
1486 /* Go newer (if able) */
1487 i = (i >= 20) ? (i - 20) : 0;
1490 /* Recall 10 newer messages */
1493 /* Go newer (if able) */
1494 i = (i >= 20) ? (i - 20) : 0;
1497 /* Recall 1 newer messages */
1500 /* Go newer (if able) */
1501 i = (i >= 1) ? (i - 1) : 0;
1504 /* Hack -- Error of some kind */
1508 /* Restore the screen */
1515 * Number of cheating options
1522 static option_type cheat_info[CHEAT_MAX] =
1524 { &cheat_peek, FALSE, 255, 0x01, 0x00,
1526 "cheat_peek", "¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1528 "cheat_peek", "Peek into object creation"
1532 { &cheat_hear, FALSE, 255, 0x02, 0x00,
1534 "cheat_hear", "¥â¥ó¥¹¥¿¡¼¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1536 "cheat_hear", "Peek into monster creation"
1540 { &cheat_room, FALSE, 255, 0x04, 0x00,
1542 "cheat_room", "¥À¥ó¥¸¥ç¥ó¤ÎÀ¸À®¤ò¤Î¤¾¤¸«¤ë"
1544 "cheat_room", "Peek into dungeon creation"
1548 { &cheat_xtra, FALSE, 255, 0x08, 0x00,
1550 "cheat_xtra", "¤½¤Î¾¤Î»ö¤ò¤Î¤¾¤¸«¤ë"
1552 "cheat_xtra", "Peek into something else"
1556 { &cheat_know, FALSE, 255, 0x10, 0x00,
1558 "cheat_know", "´°Á´¤Ê¥â¥ó¥¹¥¿¡¼¤Î»×¤¤½Ð¤òÃΤë"
1560 "cheat_know", "Know complete monster info"
1564 { &cheat_live, FALSE, 255, 0x20, 0x00,
1566 "cheat_live", "»à¤ò²óÈò¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤¹¤ë"
1568 "cheat_live", "Allow player to avoid death"
1572 { &cheat_save, FALSE, 255, 0x40, 0x00,
1574 "cheat_save", "»à¤ó¤À»þ¥»¡¼¥Ö¤¹¤ë¤«³Îǧ¤¹¤ë"
1576 "cheat_save", "Ask for saving death"
1582 * Interact with some options for cheating
1584 static void do_cmd_options_cheat(cptr info)
1588 int i, k = 0, n = CHEAT_MAX;
1596 /* Interact with the player */
1601 /* Prompt XXX XXX XXX */
1603 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, ESC ¤Ç·èÄê )", info);
1605 sprintf(buf, "%s (RET to advance, y/n to set, ESC to accept) ", info);
1611 /* º¾µ½¥ª¥×¥·¥ç¥ó¤ò¤¦¤Ã¤«¤ê¤¤¤¸¤Ã¤Æ¤·¤Þ¤¦¿Í¤¬¤¤¤ë¤è¤¦¤Ê¤Î¤ÇÃí°Õ */
1612 prt(" << Ãí°Õ >>", 11, 0);
1613 prt(" º¾µ½¥ª¥×¥·¥ç¥ó¤ò°ìÅ٤ǤâÀßÄꤹ¤ë¤È¡¢¥¹¥³¥¢µÏ¿¤¬»Ä¤é¤Ê¤¯¤Ê¤ê¤Þ¤¹¡ª", 12, 0);
1614 prt(" ¸å¤Ë²ò½ü¤·¤Æ¤â¥À¥á¤Ç¤¹¤Î¤Ç¡¢¾¡Íø¼Ô¤òÌܻؤ¹Êý¤Ï¤³¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¤", 13, 0);
1615 prt(" ¤¸¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£", 14, 0);
1617 /* Display the options */
1618 for (i = 0; i < n; i++)
1620 byte a = TERM_WHITE;
1622 /* Color current option */
1623 if (i == k) a = TERM_L_BLUE;
1625 /* Display the option text */
1626 sprintf(buf, "%-48s: %s (%s)",
1627 cheat_info[i].o_desc,
1629 (*cheat_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1631 (*cheat_info[i].o_var ? "yes" : "no "),
1634 cheat_info[i].o_text);
1635 c_prt(a, buf, i + 2, 0);
1638 /* Hilite current option */
1639 move_cursor(k + 2, 50);
1645 * HACK - Try to translate the key into a direction
1646 * to allow using the roguelike keys for navigation.
1648 dir = get_keymap_dir(ch);
1649 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1663 k = (n + k - 1) % n;
1682 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "º¾µ½¥ª¥×¥·¥ç¥ó¤òON¤Ë¤·¤Æ¡¢¥¹¥³¥¢¤ò»Ä¤»¤Ê¤¯¤Ê¤Ã¤¿¡£");
1684 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "give up sending score to use cheating options.");
1686 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1687 (*cheat_info[k].o_var) = TRUE;
1696 (*cheat_info[k].o_var) = FALSE;
1704 strnfmt(buf, sizeof(buf), "joption.txt#%s", cheat_info[k].o_text);
1706 strnfmt(buf, sizeof(buf), "option.txt#%s", cheat_info[k].o_text);
1708 /* Peruse the help file */
1709 (void)show_file(TRUE, buf, NULL, 0, 0);
1725 static option_type autosave_info[2] =
1727 { &autosave_l, FALSE, 255, 0x01, 0x00,
1729 "autosave_l", "¿·¤·¤¤³¬¤ËÆþ¤ëÅ٤˼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1731 "autosave_l", "Autosave when entering new levels" },
1735 { &autosave_t, FALSE, 255, 0x02, 0x00,
1737 "autosave_t", "°ìÄ꥿¡¼¥óËè¤Ë¼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1739 "autosave_t", "Timed autosave" },
1745 static s16b toggle_frequency(s16b current)
1750 case 50: return 100;
1751 case 100: return 250;
1752 case 250: return 500;
1753 case 500: return 1000;
1754 case 1000: return 2500;
1755 case 2500: return 5000;
1756 case 5000: return 10000;
1757 case 10000: return 25000;
1764 * Interact with some options for cheating
1766 static void do_cmd_options_autosave(cptr info)
1770 int i, k = 0, n = 2;
1778 /* Interact with the player */
1781 /* Prompt XXX XXX XXX */
1783 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, F ¤ÇÉÑÅÙ¤òÆþÎÏ, ESC ¤Ç·èÄê ) ", info);
1785 sprintf(buf, "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) ", info);
1790 /* Display the options */
1791 for (i = 0; i < n; i++)
1793 byte a = TERM_WHITE;
1795 /* Color current option */
1796 if (i == k) a = TERM_L_BLUE;
1798 /* Display the option text */
1799 sprintf(buf, "%-48s: %s (%s)",
1800 autosave_info[i].o_desc,
1802 (*autosave_info[i].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1804 (*autosave_info[i].o_var ? "yes" : "no "),
1807 autosave_info[i].o_text);
1808 c_prt(a, buf, i + 2, 0);
1812 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè", autosave_freq), 5, 0);
1814 prt(format("Timed autosave frequency: every %d turns", autosave_freq), 5, 0);
1819 /* Hilite current option */
1820 move_cursor(k + 2, 50);
1836 k = (n + k - 1) % n;
1854 (*autosave_info[k].o_var) = TRUE;
1863 (*autosave_info[k].o_var) = FALSE;
1871 autosave_freq = toggle_frequency(autosave_freq);
1873 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè",
1874 autosave_freq), 5, 0);
1876 prt(format("Timed autosave frequency: every %d turns",
1877 autosave_freq), 5, 0);
1885 (void)show_file(TRUE, "joption.txt#Autosave", NULL, 0, 0);
1887 (void)show_file(TRUE, "option.txt#Autosave", NULL, 0, 0);
1905 #define PAGE_BIRTH 6
1906 #define PAGE_AUTODESTROY 7
1909 * Interact with some options
1911 void do_cmd_options_aux(int page, cptr info)
1914 int i, k = 0, n = 0, l;
1917 bool browse_only = (page == PAGE_BIRTH) && character_generated &&
1918 (!p_ptr->wizard || !allow_debug_opts);
1921 /* Lookup the options */
1922 for (i = 0; i < 24; i++) opt[i] = 0;
1924 /* Scan the options */
1925 for (i = 0; option_info[i].o_desc; i++)
1927 /* Notice options on this "page" */
1928 if (option_info[i].o_page == page) opt[n++] = i;
1935 /* Interact with the player */
1940 /* Prompt XXX XXX XXX */
1942 sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, %sESC:½ªÎ», ?:¥Ø¥ë¥×) ", info, browse_only ? "" : "y/n:Êѹ¹, ");
1944 sprintf(buf, "%s (RET:next, %s, ?:help) ", info, browse_only ? "ESC:exit" : "y/n:change, ESC:accept");
1950 /* HACK -- description for easy-auto-destroy options */
1952 if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤¤Î¤ß͸ú", 6, 6);
1954 if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
1957 /* Display the options */
1958 for (i = 0; i < n; i++)
1960 byte a = TERM_WHITE;
1962 /* Color current option */
1963 if (i == k) a = TERM_L_BLUE;
1965 /* Display the option text */
1966 sprintf(buf, "%-48s: %s (%.19s)",
1967 option_info[opt[i]].o_desc,
1969 (*option_info[opt[i]].o_var ? "¤Ï¤¤ " : "¤¤¤¤¤¨"),
1971 (*option_info[opt[i]].o_var ? "yes" : "no "),
1974 option_info[opt[i]].o_text);
1975 if ((page == PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1976 else c_prt(a, buf, i + 2, 0);
1979 if ((page == PAGE_AUTODESTROY) && (k > 2)) l = 3;
1982 /* Hilite current option */
1983 move_cursor(k + 2 + l, 50);
1989 * HACK - Try to translate the key into a direction
1990 * to allow using the roguelike keys for navigation.
1992 dir = get_keymap_dir(ch);
1993 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
2007 k = (n + k - 1) % n;
2024 if (browse_only) break;
2025 (*option_info[opt[k]].o_var) = TRUE;
2034 if (browse_only) break;
2035 (*option_info[opt[k]].o_var) = FALSE;
2043 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
2050 strnfmt(buf, sizeof(buf), "joption.txt#%s", option_info[opt[k]].o_text);
2052 strnfmt(buf, sizeof(buf), "option.txt#%s", option_info[opt[k]].o_text);
2054 /* Peruse the help file */
2055 (void)show_file(TRUE, buf, NULL, 0, 0);
2072 * Modify the "window" options
2074 static void do_cmd_options_win(void)
2088 /* Memorize old flags */
2089 for (j = 0; j < 8; j++)
2091 /* Acquire current flags */
2092 old_flag[j] = window_flag[j];
2102 /* Prompt XXX XXX XXX */
2104 prt("¥¦¥£¥ó¥É¥¦¡¦¥Õ¥é¥° (<Êý¸þ>¤Ç°ÜÆ°, t¤Ç¥Á¥§¥ó¥¸, y/n ¤Ç¥»¥Ã¥È, ESC)", 0, 0);
2106 prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
2110 /* Display the windows */
2111 for (j = 0; j < 8; j++)
2113 byte a = TERM_WHITE;
2115 cptr s = angband_term_name[j];
2118 if (j == x) a = TERM_L_BLUE;
2120 /* Window name, staggered, centered */
2121 Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
2124 /* Display the options */
2125 for (i = 0; i < 16; i++)
2127 byte a = TERM_WHITE;
2129 cptr str = window_flag_desc[i];
2132 if (i == y) a = TERM_L_BLUE;
2136 if (!str) str = "(̤»ÈÍÑ)";
2138 if (!str) str = "(Unused option)";
2143 Term_putstr(0, i + 5, -1, a, str);
2145 /* Display the windows */
2146 for (j = 0; j < 8; j++)
2148 byte a = TERM_WHITE;
2153 if ((i == y) && (j == x)) a = TERM_L_BLUE;
2156 if (window_flag[j] & (1L << i)) c = 'X';
2159 Term_putch(35 + j * 5, i + 5, a, c);
2164 Term_gotoxy(35 + x * 5, y + 5);
2182 for (j = 0; j < 8; j++)
2184 window_flag[j] &= ~(1L << y);
2188 for (i = 0; i < 16; i++)
2190 window_flag[x] &= ~(1L << i);
2203 window_flag[x] |= (1L << y);
2211 window_flag[x] &= ~(1L << y);
2218 (void)show_file(TRUE, "joption.txt#Window", NULL, 0, 0);
2220 (void)show_file(TRUE, "option.txt#Window", NULL, 0, 0);
2230 d = get_keymap_dir(ch);
2232 x = (x + ddx[d] + 8) % 8;
2233 y = (y + ddy[d] + 16) % 16;
2240 /* Notice changes */
2241 for (j = 0; j < 8; j++)
2246 if (!angband_term[j]) continue;
2248 /* Ignore non-changes */
2249 if (window_flag[j] == old_flag[j]) continue;
2252 Term_activate(angband_term[j]);
2269 * Set or unset various options.
2271 * The user must use the "Ctrl-R" command to "adapt" to changes
2272 * in any options which control "visual" aspects of the game.
2274 void do_cmd_options(void)
2279 /* Save the screen */
2288 /* Why are we here */
2290 prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 2, 0);
2292 prt("Options", 2, 0);
2296 /* Give some choices */
2298 prt("(1) ¥¡¼ÆþÎÏ ¥ª¥×¥·¥ç¥ó", 3, 5);
2299 prt("(2) ²èÌ̽ÐÎÏ ¥ª¥×¥·¥ç¥ó", 4, 5);
2300 prt("(3) ¥²¡¼¥à¥×¥ì¥¤ ¥ª¥×¥·¥ç¥ó", 5, 5);
2301 prt("(4) ¹ÔÆ°Ãæ»ß´Ø·¸ ¥ª¥×¥·¥ç¥ó", 6, 5);
2302 prt("(5) ¸úΨ²½ ¥ª¥×¥·¥ç¥ó", 7, 5);
2303 prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ ¥ª¥×¥·¥ç¥ó", 8, 5);
2304 prt("(R) ¥×¥ì¥¤µÏ¿ ¥ª¥×¥·¥ç¥ó", 9, 5);
2305 /* Special choices */
2306 prt("(D) ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 11, 5);
2307 prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 12, 5);
2308 prt("(M) ÄãËâÎÏ¿§ïçÃÍ", 13, 5);
2309 prt("(A) ¼«Æ°¥»¡¼¥Ö ¥ª¥×¥·¥ç¥ó", 14, 5);
2311 prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
2313 prt("(1) Input Options", 3, 5);
2314 prt("(2) Output Options", 4, 5);
2315 prt("(3) Game-Play Options", 5, 5);
2316 prt("(4) Disturbance Options", 6, 5);
2317 prt("(5) Efficiency Options", 7, 5);
2318 prt("(6) Easy Auto-Destroyer Options", 8, 5);
2319 prt("(R) Play-record Options", 9, 5);
2320 /* Special choices */
2321 prt("(D) Base Delay Factor", 11, 5);
2322 prt("(H) Hitpoint Warning", 12, 5);
2323 prt("(M) Mana Color Threshold", 13, 5);
2324 prt("(A) Autosave Options", 14, 5);
2326 prt("(W) Window Flags", 15, 5);
2329 if (!p_ptr->wizard || !allow_debug_opts)
2333 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó (»²¾È¤Î¤ß)", 16, 5);
2335 prt("(B) Birth Options (Browse Only)", 16, 5);
2342 prt("(B) ½é´ü ¥ª¥×¥·¥ç¥ó", 16, 5);
2344 prt("(B) Birth Options", 16, 5);
2349 if (p_ptr->noscore || allow_debug_opts)
2353 prt("(C) º¾µ½ ¥ª¥×¥·¥ç¥ó", 17, 5);
2355 prt("(C) Cheating Options", 17, 5);
2362 prt("¥³¥Þ¥ó¥É:", 19, 0);
2364 prt("Command: ", 19, 0);
2372 if (k == ESCAPE) break;
2377 /* General Options */
2380 /* Process the general options */
2382 do_cmd_options_aux(1, "¥¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2384 do_cmd_options_aux(1, "Input Options");
2390 /* General Options */
2393 /* Process the general options */
2395 do_cmd_options_aux(2, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
2397 do_cmd_options_aux(2, "Output Options");
2403 /* Inventory Options */
2408 do_cmd_options_aux(3, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2410 do_cmd_options_aux(3, "Game-Play Options");
2416 /* Disturbance Options */
2421 do_cmd_options_aux(4, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2423 do_cmd_options_aux(4, "Disturbance Options");
2429 /* Efficiency Options */
2434 do_cmd_options_aux(5, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
2436 do_cmd_options_aux(5, "Efficiency Options");
2442 /* Object auto-destruction Options */
2447 do_cmd_options_aux(7, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2449 do_cmd_options_aux(7, "Easy Auto-Destroyer Options");
2454 /* Play-record Options */
2460 do_cmd_options_aux(10, "¥×¥ì¥¤µÏ¿¥ª¥×¥·¥ç¥ó");
2462 do_cmd_options_aux(10, "Play-record Options");
2473 do_cmd_options_aux(6, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
2475 do_cmd_options_aux(6, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
2481 /* Cheating Options */
2484 if (!p_ptr->noscore && !allow_debug_opts)
2486 /* Cheat options are not permitted */
2493 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤¤Ê¤¤¡ª");
2495 do_cmd_options_cheat("Cheaters never win");
2505 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2507 do_cmd_options_autosave("Autosave");
2518 do_cmd_options_win();
2519 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2520 PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2521 PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2522 PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2526 /* Hack -- Delay Speed */
2532 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
2534 prt("Command: Base Delay Factor", 19, 0);
2538 /* Get a new value */
2541 int msec = delay_factor * delay_factor * delay_factor;
2543 prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2544 delay_factor, msec), 22, 0);
2546 prt(format("Current base delay factor: %d (%d msec)",
2547 delay_factor, msec), 22, 0);
2551 prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2553 prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2557 if (k == ESCAPE) break;
2561 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2563 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2567 else if (isdigit(k)) delay_factor = D2I(k);
2574 /* Hack -- hitpoint warning factor */
2580 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
2582 prt("Command: Hitpoint Warning", 19, 0);
2586 /* Get a new value */
2590 prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2591 hitpoint_warn), 22, 0);
2593 prt(format("Current hitpoint warning: %d0%%",
2594 hitpoint_warn), 22, 0);
2598 prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2600 prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2604 if (k == ESCAPE) break;
2608 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2610 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2614 else if (isdigit(k)) hitpoint_warn = D2I(k);
2621 /* Hack -- mana color factor */
2627 prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
2629 prt("Command: Mana Color Threshold", 19, 0);
2633 /* Get a new value */
2637 prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
2640 prt(format("Current mana color threshold: %d0%%",
2645 prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
2647 prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
2651 if (k == ESCAPE) break;
2655 (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
2657 (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
2661 else if (isdigit(k)) mana_warn = D2I(k);
2670 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2672 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2677 /* Unknown option */
2686 /* Flush messages */
2691 /* Restore the screen */
2694 /* Hack - Redraw equippy chars */
2695 p_ptr->redraw |= (PR_EQUIPPY);
2701 * Ask for a "user pref line" and process it
2703 * XXX XXX XXX Allow absolute file names?
2705 void do_cmd_pref(void)
2712 /* Ask for a "user pref command" */
2714 if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2716 if (!get_string("Pref: ", buf, 80)) return;
2720 /* Process that pref command */
2721 (void)process_pref_file_command(buf);
2724 void do_cmd_pickpref(void)
2730 if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2732 if(!get_check("Reload auto-pick preference file? ")) return;
2735 /* Free old entries */
2738 /* ¥¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2740 sprintf(buf, "picktype-%s.prf", player_name);
2742 sprintf(buf, "pickpref-%s.prf", player_name);
2744 err = process_pickpref_file(buf);
2749 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2751 msg_format("loaded '%s'.", buf);
2755 /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2757 /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2761 err = process_pickpref_file("picktype.prf");
2763 err = process_pickpref_file("pickpref.prf");
2769 msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2771 msg_print("loaded 'pickpref.prf'.");
2778 if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2780 if(err) msg_print("Failed to reload autopick preference.");
2787 * Hack -- append all current macros to the given file
2789 static errr macro_dump(cptr fname)
2791 static cptr mark = "Macro Dump";
2797 /* Build the filename */
2798 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2800 /* File type is "TEXT" */
2801 FILE_TYPE(FILE_TYPE_TEXT);
2803 /* Append to the file */
2804 if (!open_auto_dump(buf, mark)) return (-1);
2808 auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2810 auto_dump_printf("\n# Automatic macro dump\n\n");
2814 for (i = 0; i < macro__num; i++)
2816 /* Extract the action */
2817 ascii_to_text(buf, macro__act[i]);
2819 /* Dump the macro */
2820 auto_dump_printf("A:%s\n", buf);
2822 /* Extract the action */
2823 ascii_to_text(buf, macro__pat[i]);
2825 /* Dump normal macros */
2826 auto_dump_printf("P:%s\n", buf);
2829 auto_dump_printf("\n");
2841 * Hack -- ask for a "trigger" (see below)
2843 * Note the complex use of the "inkey()" function from "util.c".
2845 * Note that both "flush()" calls are extremely important.
2847 static void do_cmd_macro_aux(char *buf)
2857 /* Do not process macros */
2863 /* Read the pattern */
2869 /* Do not process macros */
2872 /* Do not wait for keys */
2875 /* Attempt to read a key */
2886 /* Convert the trigger */
2887 ascii_to_text(tmp, buf);
2889 /* Hack -- display the trigger */
2890 Term_addstr(-1, TERM_WHITE, tmp);
2897 * Hack -- ask for a keymap "trigger" (see below)
2899 * Note that both "flush()" calls are extremely important. This may
2900 * no longer be true, since "util.c" is much simpler now. XXX XXX XXX
2902 static void do_cmd_macro_aux_keymap(char *buf)
2916 /* Convert to ascii */
2917 ascii_to_text(tmp, buf);
2919 /* Hack -- display the trigger */
2920 Term_addstr(-1, TERM_WHITE, tmp);
2929 * Hack -- append all keymaps to the given file
2931 static errr keymap_dump(cptr fname)
2933 static cptr mark = "Keymap Dump";
2942 if (rogue_like_commands)
2944 mode = KEYMAP_MODE_ROGUE;
2950 mode = KEYMAP_MODE_ORIG;
2954 /* Build the filename */
2955 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2957 /* File type is "TEXT" */
2958 FILE_TYPE(FILE_TYPE_TEXT);
2960 /* Append to the file */
2961 if (!open_auto_dump(buf, mark)) return -1;
2965 auto_dump_printf("\n# ¼«Æ°¥¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2967 auto_dump_printf("\n# Automatic keymap dump\n\n");
2971 for (i = 0; i < 256; i++)
2975 /* Loop up the keymap */
2976 act = keymap_act[mode][i];
2978 /* Skip empty keymaps */
2981 /* Encode the key */
2984 ascii_to_text(key, buf);
2986 /* Encode the action */
2987 ascii_to_text(buf, act);
2989 /* Dump the macro */
2990 auto_dump_printf("A:%s\n", buf);
2991 auto_dump_printf("C:%d:%s\n", mode, key);
3004 * Interact with "macros"
3006 * Note that the macro "action" must be defined before the trigger.
3008 * Could use some helpful instructions on this page. XXX XXX XXX
3010 void do_cmd_macros(void)
3022 if (rogue_like_commands)
3024 mode = KEYMAP_MODE_ROGUE;
3030 mode = KEYMAP_MODE_ORIG;
3033 /* File type is "TEXT" */
3034 FILE_TYPE(FILE_TYPE_TEXT);
3041 /* Process requests until done */
3049 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
3051 prt("Interact with Macros", 2, 0);
3056 /* Describe that action */
3058 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3060 prt("Current action (if any) shown below:", 20, 0);
3064 /* Analyze the current action */
3065 ascii_to_text(buf, macro__buf);
3067 /* Display the current action */
3073 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3075 prt("(1) Load a user pref file", 4, 5);
3080 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
3081 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
3082 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
3083 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
3084 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3085 prt("(7) ¥¡¼ÇÛÃ֤γÎǧ", 10, 5);
3086 prt("(8) ¥¡¼ÇÛÃ֤κîÀ®", 11, 5);
3087 prt("(9) ¥¡¼ÇÛÃ֤κï½ü", 12, 5);
3088 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3090 prt("(2) Append macros to a file", 5, 5);
3091 prt("(3) Query a macro", 6, 5);
3092 prt("(4) Create a macro", 7, 5);
3093 prt("(5) Remove a macro", 8, 5);
3094 prt("(6) Append keymaps to a file", 9, 5);
3095 prt("(7) Query a keymap", 10, 5);
3096 prt("(8) Create a keymap", 11, 5);
3097 prt("(9) Remove a keymap", 12, 5);
3098 prt("(0) Enter a new action", 13, 5);
3101 #endif /* ALLOW_MACROS */
3105 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3107 prt("Command: ", 16, 0);
3115 if (i == ESCAPE) break;
3117 /* Load a 'macro' file */
3124 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3126 prt("Command: Load a user pref file", 16, 0);
3132 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3134 prt("File: ", 18, 0);
3138 /* Default filename */
3139 sprintf(tmp, "%s.prf", player_name);
3141 /* Ask for a file */
3142 if (!askfor_aux(tmp, 80)) continue;
3144 /* Process the given filename */
3145 err = process_pref_file(tmp);
3149 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3151 msg_format("Loaded default '%s'.", tmp);
3158 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3160 msg_format("Failed to load '%s'!");
3166 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3168 msg_format("Loaded '%s'.", tmp);
3180 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3182 prt("Command: Append macros to a file", 16, 0);
3188 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3190 prt("File: ", 18, 0);
3194 /* Default filename */
3195 sprintf(tmp, "%s.prf", player_name);
3197 /* Ask for a file */
3198 if (!askfor_aux(tmp, 80)) continue;
3200 /* Dump the macros */
3201 (void)macro_dump(tmp);
3205 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3207 msg_print("Appended macros.");
3219 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3221 prt("Command: Query a macro", 16, 0);
3227 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3229 prt("Trigger: ", 18, 0);
3233 /* Get a macro trigger */
3234 do_cmd_macro_aux(buf);
3236 /* Acquire action */
3237 k = macro_find_exact(buf);
3244 msg_print("¤½¤Î¥¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3246 msg_print("Found no macro.");
3254 /* Obtain the action */
3255 strcpy(macro__buf, macro__act[k]);
3257 /* Analyze the current action */
3258 ascii_to_text(buf, macro__buf);
3260 /* Display the current action */
3265 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3267 msg_print("Found a macro.");
3273 /* Create a macro */
3278 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3280 prt("Command: Create a macro", 16, 0);
3286 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3288 prt("Trigger: ", 18, 0);
3292 /* Get a macro trigger */
3293 do_cmd_macro_aux(buf);
3300 prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3302 prt("Action: ", 20, 0);
3306 /* Convert to text */
3307 ascii_to_text(tmp, macro__buf);
3309 /* Get an encoded action */
3310 if (askfor_aux(tmp, 80))
3312 /* Convert to ascii */
3313 text_to_ascii(macro__buf, tmp);
3315 /* Link the macro */
3316 macro_add(buf, macro__buf);
3320 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3322 msg_print("Added a macro.");
3328 /* Remove a macro */
3333 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3335 prt("Command: Remove a macro", 16, 0);
3341 prt("¥È¥ê¥¬¡¼¥¡¼: ", 18, 0);
3343 prt("Trigger: ", 18, 0);
3347 /* Get a macro trigger */
3348 do_cmd_macro_aux(buf);
3350 /* Link the macro */
3351 macro_add(buf, buf);
3355 msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3357 msg_print("Removed a macro.");
3367 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3369 prt("Command: Append keymaps to a file", 16, 0);
3375 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3377 prt("File: ", 18, 0);
3381 /* Default filename */
3382 sprintf(tmp, "%s.prf", player_name);
3384 /* Ask for a file */
3385 if (!askfor_aux(tmp, 80)) continue;
3387 /* Dump the macros */
3388 (void)keymap_dump(tmp);
3392 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3394 msg_print("Appended keymaps.");
3399 /* Query a keymap */
3406 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤γÎǧ", 16, 0);
3408 prt("Command: Query a keymap", 16, 0);
3414 prt("²¡¤¹¥¡¼: ", 18, 0);
3416 prt("Keypress: ", 18, 0);
3420 /* Get a keymap trigger */
3421 do_cmd_macro_aux_keymap(buf);
3423 /* Look up the keymap */
3424 act = keymap_act[mode][(byte)(buf[0])];
3431 msg_print("¥¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3433 msg_print("Found no keymap.");
3441 /* Obtain the action */
3442 strcpy(macro__buf, act);
3444 /* Analyze the current action */
3445 ascii_to_text(buf, macro__buf);
3447 /* Display the current action */
3452 msg_print("¥¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3454 msg_print("Found a keymap.");
3460 /* Create a keymap */
3465 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κîÀ®", 16, 0);
3467 prt("Command: Create a keymap", 16, 0);
3473 prt("²¡¤¹¥¡¼: ", 18, 0);
3475 prt("Keypress: ", 18, 0);
3479 /* Get a keymap trigger */
3480 do_cmd_macro_aux_keymap(buf);
3487 prt("¹ÔÆ°: ", 20, 0);
3489 prt("Action: ", 20, 0);
3493 /* Convert to text */
3494 ascii_to_text(tmp, macro__buf);
3496 /* Get an encoded action */
3497 if (askfor_aux(tmp, 80))
3499 /* Convert to ascii */
3500 text_to_ascii(macro__buf, tmp);
3502 /* Free old keymap */
3503 string_free(keymap_act[mode][(byte)(buf[0])]);
3505 /* Make new keymap */
3506 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3510 msg_print("¥¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3512 msg_print("Added a keymap.");
3518 /* Remove a keymap */
3523 prt("¥³¥Þ¥ó¥É: ¥¡¼ÇÛÃ֤κï½ü", 16, 0);
3525 prt("Command: Remove a keymap", 16, 0);
3531 prt("²¡¤¹¥¡¼: ", 18, 0);
3533 prt("Keypress: ", 18, 0);
3537 /* Get a keymap trigger */
3538 do_cmd_macro_aux_keymap(buf);
3540 /* Free old keymap */
3541 string_free(keymap_act[mode][(byte)(buf[0])]);
3543 /* Make new keymap */
3544 keymap_act[mode][(byte)(buf[0])] = NULL;
3548 msg_print("¥¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3550 msg_print("Removed a keymap.");
3555 /* Enter a new action */
3560 prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3562 prt("Command: Enter a new action", 16, 0);
3566 /* Go to the correct location */
3569 /* Hack -- limit the value */
3572 /* Get an encoded action */
3573 if (!askfor_aux(buf, 80)) continue;
3575 /* Extract an action */
3576 text_to_ascii(macro__buf, buf);
3579 #endif /* ALLOW_MACROS */
3588 /* Flush messages */
3597 static void cmd_visuals_aux(int i, int *num, int max)
3604 sprintf(str, "%d", *num);
3606 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3609 tmp = strtol(str, NULL, 0);
3610 if (tmp >= 0 && tmp < max)
3614 else if (isupper(i))
3615 *num = (*num + max - 1) % max;
3617 *num = (*num + 1) % max;
3623 * Interact with "visuals"
3625 void do_cmd_visuals(void)
3633 const char *empty_symbol = "<< ? >>";
3635 if (use_bigtile) empty_symbol = "<< ?? >>";
3637 /* File type is "TEXT" */
3638 FILE_TYPE(FILE_TYPE_TEXT);
3641 /* Save the screen */
3645 /* Interact until done */
3651 /* Ask for a choice */
3653 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3655 prt("Interact with Visuals", 2, 0);
3659 /* Give some choices */
3661 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3663 prt("(1) Load a user pref file", 4, 5);
3666 #ifdef ALLOW_VISUALS
3668 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
3669 prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 6, 5);
3670 prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 7, 5);
3671 prt("(5) (̤»ÈÍÑ)", 8, 5);
3672 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3673 prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3674 prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3675 prt("(9) (̤»ÈÍÑ)", 12, 5);
3677 prt("(2) Dump monster attr/chars", 5, 5);
3678 prt("(3) Dump object attr/chars", 6, 5);
3679 prt("(4) Dump feature attr/chars", 7, 5);
3680 prt("(5) (unused)", 8, 5);
3681 prt("(6) Change monster attr/chars", 9, 5);
3682 prt("(7) Change object attr/chars", 10, 5);
3683 prt("(8) Change feature attr/chars", 11, 5);
3684 prt("(9) (unused)", 12, 5);
3689 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3691 prt("(0) Reset visuals", 13, 5);
3697 prt("¥³¥Þ¥ó¥É:", 18, 0);
3699 prt("Command: ", 15, 0);
3707 if (i == ESCAPE) break;
3709 /* Load a 'pref' file */
3714 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3716 prt("Command: Load a user pref file", 15, 0);
3722 prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3724 prt("File: ", 17, 0);
3728 /* Default filename */
3729 sprintf(tmp, "%s.prf", player_name);
3732 if (!askfor_aux(tmp, 70)) continue;
3734 /* Process the given filename */
3735 (void)process_pref_file(tmp);
3738 #ifdef ALLOW_VISUALS
3740 /* Dump monster attr/chars */
3743 static cptr mark = "Monster attr/chars";
3747 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3749 prt("Command: Dump monster attr/chars", 15, 0);
3755 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3757 prt("File: ", 17, 0);
3761 /* Default filename */
3762 sprintf(tmp, "%s.prf", player_name);
3764 /* Get a filename */
3765 if (!askfor_aux(tmp, 70)) continue;
3767 /* Build the filename */
3768 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3770 /* Append to the file */
3771 if (!open_auto_dump(buf, mark)) continue;
3775 auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3777 auto_dump_printf("\n# Monster attr/char definitions\n\n");
3781 for (i = 1; i < max_r_idx; i++)
3783 monster_race *r_ptr = &r_info[i];
3785 /* Skip non-entries */
3786 if (!r_ptr->name) continue;
3788 /* Dump a comment */
3789 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3791 /* Dump the monster attr/char info */
3792 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3793 (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3801 msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3803 msg_print("Dumped monster attr/chars.");
3808 /* Dump object attr/chars */
3811 static cptr mark = "Object attr/chars";
3815 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3817 prt("Command: Dump object attr/chars", 15, 0);
3823 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3825 prt("File: ", 17, 0);
3829 /* Default filename */
3830 sprintf(tmp, "%s.prf", player_name);
3832 /* Get a filename */
3833 if (!askfor_aux(tmp, 70)) continue;
3835 /* Build the filename */
3836 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3838 /* Append to the file */
3839 if (!open_auto_dump(buf, mark)) continue;
3843 auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3845 auto_dump_printf("\n# Object attr/char definitions\n\n");
3849 for (i = 1; i < max_k_idx; i++)
3852 object_kind *k_ptr = &k_info[i];
3854 /* Skip non-entries */
3855 if (!k_ptr->name) continue;
3857 /* Skip entries with flavor */
3858 if (k_ptr->flavor) continue;
3861 strip_name(o_name, i);
3863 /* Dump a comment */
3864 auto_dump_printf("# %s\n", o_name);
3866 /* Dump the object attr/char info */
3867 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3868 (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3876 msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3878 msg_print("Dumped object attr/chars.");
3883 /* Dump feature attr/chars */
3886 static cptr mark = "Feature attr/chars";
3890 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 15, 0);
3892 prt("Command: Dump feature attr/chars", 15, 0);
3898 prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3900 prt("File: ", 17, 0);
3904 /* Default filename */
3905 sprintf(tmp, "%s.prf", player_name);
3907 /* Get a filename */
3908 if (!askfor_aux(tmp, 70)) continue;
3910 /* Build the filename */
3911 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3913 /* Append to the file */
3914 if (!open_auto_dump(buf, mark)) continue;
3918 auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3920 auto_dump_printf("\n# Feature attr/char definitions\n\n");
3924 for (i = 1; i < max_f_idx; i++)
3926 feature_type *f_ptr = &f_info[i];
3928 /* Skip non-entries */
3929 if (!f_ptr->name) continue;
3931 /* Skip mimiccing features */
3932 if (f_ptr->mimic != i) continue;
3934 /* Dump a comment */
3935 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3937 /* Dump the feature attr/char info */
3938 auto_dump_printf("F:%d:0x%02X/0x%02X\n\n", i,
3939 (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3947 msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
3949 msg_print("Dumped feature attr/chars.");
3954 /* Modify monster attr/chars */
3961 prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3963 prt("Command: Change monster attr/chars", 15, 0);
3967 /* Hack -- query until done */
3970 monster_race *r_ptr = &r_info[r];
3975 byte da = (r_ptr->d_attr);
3976 byte dc = (r_ptr->d_char);
3977 byte ca = (r_ptr->x_attr);
3978 byte cc = (r_ptr->x_char);
3980 /* Label the object */
3982 Term_putstr(5, 17, -1, TERM_WHITE,
3983 format("¥â¥ó¥¹¥¿¡¼ = %d, ̾Á° = %-40.40s",
3984 r, (r_name + r_ptr->name)));
3986 Term_putstr(5, 17, -1, TERM_WHITE,
3987 format("Monster = %d, Name = %-40.40s",
3988 r, (r_name + r_ptr->name)));
3992 /* Label the Default values */
3994 Term_putstr(10, 19, -1, TERM_WHITE,
3995 format("½é´üÃÍ ¿§ / ʸ»ú = %3u / %3u", da, dc));
3997 Term_putstr(10, 19, -1, TERM_WHITE,
3998 format("Default attr/char = %3u / %3u", da, dc));
4001 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4005 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4007 Term_putch(43, 19, a, c);
4008 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4010 /* Label the Current values */
4012 Term_putstr(10, 20, -1, TERM_WHITE,
4013 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3u / %3u", ca, cc));
4015 Term_putstr(10, 20, -1, TERM_WHITE,
4016 format("Current attr/char = %3u / %3u", ca, cc));
4019 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4023 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4025 Term_putch(43, 20, a, c);
4026 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4031 Term_putstr(0, 22, -1, TERM_WHITE,
4032 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4034 Term_putstr(0, 22, -1, TERM_WHITE,
4035 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4042 if (i == ESCAPE) break;
4044 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4045 else if (isupper(i)) c = 'a' + i - 'A';
4051 cmd_visuals_aux(i, &r, max_r_idx);
4054 t = (int)r_ptr->x_attr;
4055 cmd_visuals_aux(i, &t, 256);
4056 r_ptr->x_attr = (byte)t;
4059 t = (int)r_ptr->x_char;
4060 cmd_visuals_aux(i, &t, 256);
4061 r_ptr->x_char = (byte)t;
4067 /* Modify object attr/chars */
4074 prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4076 prt("Command: Change object attr/chars", 15, 0);
4080 /* Hack -- query until done */
4083 object_kind *k_ptr = &k_info[k];
4088 byte da = (byte)k_ptr->d_attr;
4089 byte dc = (byte)k_ptr->d_char;
4090 byte ca = (byte)k_ptr->x_attr;
4091 byte cc = (byte)k_ptr->x_char;
4093 /* Label the object */
4095 Term_putstr(5, 17, -1, TERM_WHITE,
4096 format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s",
4097 k, (k_name + k_ptr->name)));
4099 Term_putstr(5, 17, -1, TERM_WHITE,
4100 format("Object = %d, Name = %-40.40s",
4101 k, (k_name + k_ptr->name)));
4105 /* Label the Default values */
4107 Term_putstr(10, 19, -1, TERM_WHITE,
4108 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4110 Term_putstr(10, 19, -1, TERM_WHITE,
4111 format("Default attr/char = %3d / %3d", da, dc));
4114 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4117 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4119 Term_putch(43, 19, a, c);
4120 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4123 /* Label the Current values */
4125 Term_putstr(10, 20, -1, TERM_WHITE,
4126 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4128 Term_putstr(10, 20, -1, TERM_WHITE,
4129 format("Current attr/char = %3d / %3d", ca, cc));
4132 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4135 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4137 Term_putch(43, 20, a, c);
4138 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4143 Term_putstr(0, 22, -1, TERM_WHITE,
4144 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4146 Term_putstr(0, 22, -1, TERM_WHITE,
4147 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4154 if (i == ESCAPE) break;
4156 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4157 else if (isupper(i)) c = 'a' + i - 'A';
4163 cmd_visuals_aux(i, &k, max_k_idx);
4166 t = (int)k_info[k].x_attr;
4167 cmd_visuals_aux(i, &t, 256);
4168 k_info[k].x_attr = (byte)t;
4171 t = (int)k_info[k].x_char;
4172 cmd_visuals_aux(i, &t, 256);
4173 k_info[k].x_char = (byte)t;
4179 /* Modify feature attr/chars */
4186 prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4188 prt("Command: Change feature attr/chars", 15, 0);
4192 /* Hack -- query until done */
4195 feature_type *f_ptr = &f_info[f];
4200 byte da = (byte)f_ptr->d_attr;
4201 byte dc = (byte)f_ptr->d_char;
4202 byte ca = (byte)f_ptr->x_attr;
4203 byte cc = (byte)f_ptr->x_char;
4205 /* Label the object */
4207 Term_putstr(5, 17, -1, TERM_WHITE,
4208 format("ÃÏ·Á = %d, ̾Á° = %-40.40s",
4209 f, (f_name + f_ptr->name)));
4211 Term_putstr(5, 17, -1, TERM_WHITE,
4212 format("Terrain = %d, Name = %-40.40s",
4213 f, (f_name + f_ptr->name)));
4217 /* Label the Default values */
4219 Term_putstr(10, 19, -1, TERM_WHITE,
4220 format("½é´üÃÍ ¿§ / ʸ»ú = %3d / %3d", da, dc));
4222 Term_putstr(10, 19, -1, TERM_WHITE,
4223 format("Default attr/char = %3d / %3d", da, dc));
4226 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4229 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4231 Term_putch(43, 19, a, c);
4232 if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
4235 /* Label the Current values */
4237 Term_putstr(10, 20, -1, TERM_WHITE,
4238 format("¸½ºßÃÍ ¿§ / ʸ»ú = %3d / %3d", ca, cc));
4240 Term_putstr(10, 20, -1, TERM_WHITE,
4241 format("Current attr/char = %3d / %3d", ca, cc));
4244 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4247 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
4249 Term_putch(43, 20, a, c);
4250 if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
4255 Term_putstr(0, 22, -1, TERM_WHITE,
4256 "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4258 Term_putstr(0, 22, -1, TERM_WHITE,
4259 "Command (n/N/^N/a/A/^A/c/C/^C): ");
4266 if (i == ESCAPE) break;
4268 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4269 else if (isupper(i)) c = 'a' + i - 'A';
4275 cmd_visuals_aux(i, &f, max_f_idx);
4278 t = (int)f_info[f].x_attr;
4279 cmd_visuals_aux(i, &t, 256);
4280 f_info[f].x_attr = (byte)t;
4283 t = (int)f_info[f].x_char;
4284 cmd_visuals_aux(i, &t, 256);
4285 f_info[f].x_char = (byte)t;
4301 msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4303 msg_print("Visual attr/char tables reset.");
4308 /* Unknown option */
4314 /* Flush messages */
4319 /* Restore the screen */
4325 * Interact with "colors"
4327 void do_cmd_colors(void)
4336 /* File type is "TEXT" */
4337 FILE_TYPE(FILE_TYPE_TEXT);
4340 /* Save the screen */
4344 /* Interact until done */
4350 /* Ask for a choice */
4352 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4354 prt("Interact with Colors", 2, 0);
4358 /* Give some choices */
4360 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4362 prt("(1) Load a user pref file", 4, 5);
4367 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤¹", 5, 5);
4368 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4370 prt("(2) Dump colors", 5, 5);
4371 prt("(3) Modify colors", 6, 5);
4378 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4380 prt("Command: ", 8, 0);
4388 if (i == ESCAPE) break;
4390 /* Load a 'pref' file */
4395 prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4397 prt("Command: Load a user pref file", 8, 0);
4403 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4405 prt("File: ", 10, 0);
4410 sprintf(tmp, "%s.prf", player_name);
4413 if (!askfor_aux(tmp, 70)) continue;
4415 /* Process the given filename */
4416 (void)process_pref_file(tmp);
4418 /* Mega-Hack -- react to changes */
4419 Term_xtra(TERM_XTRA_REACT, 0);
4421 /* Mega-Hack -- redraw */
4430 static cptr mark = "Colors";
4434 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤¹", 8, 0);
4436 prt("Command: Dump colors", 8, 0);
4442 prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4444 prt("File: ", 10, 0);
4448 /* Default filename */
4449 sprintf(tmp, "%s.prf", player_name);
4451 /* Get a filename */
4452 if (!askfor_aux(tmp, 70)) continue;
4454 /* Build the filename */
4455 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4457 /* Append to the file */
4458 if (!open_auto_dump(buf, mark)) continue;
4462 auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4464 auto_dump_printf("\n# Color redefinitions\n\n");
4468 for (i = 0; i < 256; i++)
4470 int kv = angband_color_table[i][0];
4471 int rv = angband_color_table[i][1];
4472 int gv = angband_color_table[i][2];
4473 int bv = angband_color_table[i][3];
4478 cptr name = "unknown";
4482 /* Skip non-entries */
4483 if (!kv && !rv && !gv && !bv) continue;
4485 /* Extract the color name */
4486 if (i < 16) name = color_names[i];
4488 /* Dump a comment */
4490 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4492 auto_dump_printf("# Color '%s'\n", name);
4495 /* Dump the monster attr/char info */
4496 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4505 msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
4507 msg_print("Dumped color redefinitions.");
4519 prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4521 prt("Command: Modify colors", 8, 0);
4525 /* Hack -- query until done */
4534 /* Exhibit the normal colors */
4535 for (j = 0; j < 16; j++)
4537 /* Exhibit this color */
4538 Term_putstr(j*4, 20, -1, a, "###");
4540 /* Exhibit all colors */
4541 Term_putstr(j*4, 22, -1, j, format("%3d", j));
4544 /* Describe the color */
4546 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4548 name = ((a < 16) ? color_names[a] : "undefined");
4552 /* Describe the color */
4554 Term_putstr(5, 10, -1, TERM_WHITE,
4555 format("¥«¥é¡¼ = %d, ̾Á° = %s", a, name));
4557 Term_putstr(5, 10, -1, TERM_WHITE,
4558 format("Color = %d, Name = %s", a, name));
4562 /* Label the Current values */
4563 Term_putstr(5, 12, -1, TERM_WHITE,
4564 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4565 angband_color_table[a][0],
4566 angband_color_table[a][1],
4567 angband_color_table[a][2],
4568 angband_color_table[a][3]));
4572 Term_putstr(0, 14, -1, TERM_WHITE,
4573 "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4575 Term_putstr(0, 14, -1, TERM_WHITE,
4576 "Command (n/N/k/K/r/R/g/G/b/B): ");
4584 if (i == ESCAPE) break;
4587 if (i == 'n') a = (byte)(a + 1);
4588 if (i == 'N') a = (byte)(a - 1);
4589 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4590 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4591 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4592 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4593 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4594 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4595 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4596 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4598 /* Hack -- react to changes */
4599 Term_xtra(TERM_XTRA_REACT, 0);
4601 /* Hack -- redraw */
4608 /* Unknown option */
4614 /* Flush messages */
4619 /* Restore the screen */
4625 * Note something in the message recall
4627 void do_cmd_note(void)
4636 if (!get_string("¥á¥â: ", buf, 60)) return;
4638 if (!get_string("Note: ", buf, 60)) return;
4642 /* Ignore empty notes */
4643 if (!buf[0] || (buf[0] == ' ')) return;
4645 /* Add the note to the message recall */
4647 msg_format("¥á¥â: %s", buf);
4649 msg_format("Note: %s", buf);
4656 * Mention the current version
4658 void do_cmd_version(void)
4663 msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4664 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4666 msg_format("You are playing Hengband %d.%d.%d.",
4667 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4674 * Array of feeling strings
4676 static cptr do_cmd_feeling_text[11] =
4679 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4681 "Looks like any other level.",
4685 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4687 "You feel there is something special about this level.",
4691 "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4693 "You nearly faint as horrible visions of death fill your mind!",
4697 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4699 "This level looks very dangerous.",
4703 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4705 "You have a very bad feeling...",
4709 "°¤¤Í½´¶¤¬¤¹¤ë...",
4711 "You have a bad feeling...",
4717 "You feel nervous.",
4721 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4723 "You feel your luck is turning...",
4727 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4729 "You don't like the look of this place.",
4733 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4735 "This level looks reasonably safe.",
4739 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4741 "What a boring place..."
4746 static cptr do_cmd_feeling_text_combat[11] =
4749 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4751 "Looks like any other level.",
4755 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4757 "You feel there is something special about this level.",
4761 "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4763 "You nearly faint as horrible visions of death fill your mind!",
4767 "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4769 "This level looks very dangerous.",
4773 "¤È¤Æ¤â°¤¤Í½´¶¤¬¤¹¤ë...",
4775 "You have a very bad feeling...",
4779 "°¤¤Í½´¶¤¬¤¹¤ë...",
4781 "You have a bad feeling...",
4787 "You feel nervous.",
4791 "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4793 "You feel your luck is turning...",
4797 "¤³¤Î¾ì½ê¤Ï¹¥¤¤Ë¤Ê¤ì¤Ê¤¤¡£",
4799 "You don't like the look of this place.",
4803 "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4805 "This level looks reasonably safe.",
4809 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4811 "What a boring place..."
4816 static cptr do_cmd_feeling_text_lucky[11] =
4819 "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4820 "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4821 "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4822 "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4823 "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4824 "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4825 "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4826 "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤¤¿¤«...",
4827 "¸«¤¿´¶¤¸°¤¯¤Ï¤Ê¤¤...",
4828 "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4829 "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4831 "Looks like any other level.",
4832 "You feel there is something special about this level.",
4833 "You have a superb feeling about this level.",
4834 "You have an excellent feeling...",
4835 "You have a very good feeling...",
4836 "You have a good feeling...",
4837 "You feel strangely lucky...",
4838 "You feel your luck is turning...",
4839 "You like the look of this place...",
4840 "This level can't be all bad...",
4841 "What a boring place..."
4847 * Note that "feeling" is set to zero unless some time has passed.
4848 * Note that this is done when the level is GENERATED, not entered.
4850 void do_cmd_feeling(void)
4852 /* Verify the feeling */
4853 if (feeling > 10) feeling = 10;
4855 /* No useful feeling in quests */
4856 if (p_ptr->inside_quest && !random_quest_number(dun_level))
4859 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4861 msg_print("Looks like a typical quest level.");
4867 /* No useful feeling in town */
4868 else if (p_ptr->town_num && !dun_level)
4871 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4873 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4877 msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4879 msg_print("Looks like a strange wilderness.");
4887 msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4889 msg_print("Looks like a typical town.");
4896 /* No useful feeling in the wilderness */
4897 else if (!dun_level)
4900 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4902 msg_print("Looks like a typical wilderness.");
4908 /* Display the feeling */
4909 if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4911 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4913 if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4914 msg_print(do_cmd_feeling_text_combat[feeling]);
4916 msg_print(do_cmd_feeling_text[feeling]);
4921 msg_print(do_cmd_feeling_text[0]);
4928 * Description of each monster group.
4930 static cptr monster_group_text[] =
4933 "¥æ¥Ë¡¼¥¯", /* "Uniques" */
4962 /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4979 /* "¾åµé¥Ç¡¼¥â¥ó", */
5019 /* "Ancient Dragon/Wyrm", */
5028 "Multi-Headed Reptile",
5033 "Reptile/Amphibian",
5034 "Spider/Scorpion/Tick",
5036 /* "Major Demon", */
5052 * Symbols of monsters in each group. Note the "Uniques" group
5053 * is handled differently.
5055 static cptr monster_group_char[] =
5109 "$!?=&`.|/\\~[]()>",
5118 * hook function to sort monsters by level
5120 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5122 u16b *who = (u16b*)(u);
5127 monster_race *r_ptr1 = &r_info[w1];
5128 monster_race *r_ptr2 = &r_info[w2];
5133 if (r_ptr2->level > r_ptr1->level) return TRUE;
5134 if (r_ptr1->level > r_ptr2->level) return FALSE;
5136 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5137 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5142 * Build a list of monster indexes in the given group. Return the number
5143 * of monsters in the group.
5145 * mode & 0x01 : check for non-empty group
5146 * mode & 0x02 : cheat?
5148 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5153 /* Get a list of x_char in this group */
5154 cptr group_char = monster_group_char[grp_cur];
5156 /* XXX Hack -- Check if this is the "Uniques" group */
5157 bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5159 /* Check every race */
5160 for (i = 0; i < max_r_idx; i++)
5162 /* Access the race */
5163 monster_race *r_ptr = &r_info[i];
5165 /* Skip empty race */
5166 if (!r_ptr->name) continue ;
5168 /* Require known monsters */
5169 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5171 if (grp_unique && !(r_ptr->flags1 & RF1_UNIQUE)) continue;
5173 /* Check for race in the group */
5174 if (grp_unique || strchr(group_char, r_ptr->d_char))
5177 mon_idx[mon_cnt++] = i;
5179 /* XXX Hack -- Just checking for non-empty group */
5180 if (mode & 0x01) break;
5184 /* Terminate the list */
5185 mon_idx[mon_cnt] = 0;
5187 /* Select the sort method */
5188 ang_sort_comp = ang_sort_comp_monster_level;
5189 ang_sort_swap = ang_sort_swap_hook;
5191 /* Sort by monster level */
5192 ang_sort(mon_idx, &dummy_why, mon_cnt);
5194 /* Return the number of races */
5200 * Description of each monster group.
5202 static cptr object_group_text[] =
5205 "¥¥Î¥³", /* "Mushrooms" */
5206 "Ìô", /* "Potions" */
5207 "Ìý¤Ä¤Ü", /* "Flasks" */
5208 "´¬Êª", /* "Scrolls" */
5209 "»ØÎØ", /* "Rings" */
5210 "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5211 "ū", /* "Whistle" */
5212 "¸÷¸»", /* "Lanterns" */
5213 "ËâË¡ËÀ", /* "Wands" */
5214 "¾ó", /* "Staffs" */
5215 "¥í¥Ã¥É", /* "Rods" */
5216 "¥«¡¼¥É", /* "Cards" */
5217 "¥¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5226 "Åá·õÎà", /* "Swords" */
5227 "Æß´ï", /* "Blunt Weapons" */
5228 "ĹÊÁÉð´ï", /* "Polearms" */
5229 "ºÎ·¡Æ»¶ñ", /* "Diggers" */
5230 "Èô¤ÓÆ»¶ñ", /* "Bows" */
5234 "·ÚÁõ³»", /* "Soft Armor" */
5235 "½ÅÁõ³»", /* "Hard Armor" */
5236 "¥É¥é¥´¥ó³»", /* "Dragon Armor" */
5237 "½â", /* "Shields" */
5238 "¥¯¥í¡¼¥¯", /* "Cloaks" */
5239 "äƼê", /* "Gloves" */
5240 "¥Ø¥ë¥á¥Ã¥È", /* "Helms" */
5241 "´§", /* "Crowns" */
5242 "¥Ö¡¼¥Ä", /* "Boots" */
5290 * TVALs of items in each group
5292 static byte object_group_tval[] =
5332 TV_LIFE_BOOK, /* Hack -- all spellbooks */
5338 * Build a list of monster indexes in the given group. Return the number
5339 * of monsters in the group.
5341 static int collect_objects(int grp_cur, int object_idx[])
5343 int i, j, k, object_cnt = 0;
5345 /* Get a list of x_char in this group */
5346 byte group_tval = object_group_tval[grp_cur];
5348 /* Check every object */
5349 for (i = 0; i < max_k_idx; i++)
5351 /* Access the race */
5352 object_kind *k_ptr = &k_info[i];
5354 /* Skip empty objects */
5355 if (!k_ptr->name) continue;
5357 /* Skip non-flavoured objects */
5358 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5360 /* Skip items with no distribution (special artifacts) */
5361 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5364 /* Require objects ever seen*/
5365 if (!k_ptr->aware && !p_ptr->wizard) continue;
5367 /* Check for race in the group */
5368 if (TV_LIFE_BOOK == group_tval)
5370 /* Hack -- All spell books */
5371 if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5374 object_idx[object_cnt++] = i;
5377 else if (k_ptr->tval == group_tval)
5380 object_idx[object_cnt++] = i;
5384 /* Terminate the list */
5385 object_idx[object_cnt] = 0;
5387 /* Return the number of races */
5393 * Description of each feature group.
5395 static cptr feature_group_text[] =
5403 * Build a list of feature indexes in the given group. Return the number
5404 * of features in the group.
5406 static int collect_features(int grp_cur, int *feat_idx)
5408 int i, feat_cnt = 0;
5410 /* Unused; There is a single group. */
5413 /* Check every feature */
5414 for (i = 1; i < max_f_idx; i++)
5416 /* Access the index */
5417 feature_type *f_ptr = &f_info[i];
5419 /* Skip empty index */
5420 if (!f_ptr->name) continue;
5422 /* Skip mimiccing features */
5423 if (f_ptr->mimic != i) continue;
5426 feat_idx[feat_cnt++] = i;
5429 /* Terminate the list */
5430 feat_idx[feat_cnt] = 0;
5432 /* Return the number of races */
5439 * Build a list of monster indexes in the given group. Return the number
5440 * of monsters in the group.
5442 static int collect_artifacts(int grp_cur, int object_idx[])
5444 int i, object_cnt = 0;
5446 /* Get a list of x_char in this group */
5447 byte group_tval = object_group_tval[grp_cur];
5449 /* Check every object */
5450 for (i = 0; i < max_a_idx; i++)
5452 /* Access the artifact */
5453 artifact_type *a_ptr = &a_info[i];
5455 /* Skip empty artifacts */
5456 if (!a_ptr->name) continue;
5458 /* Skip "uncreated" artifacts */
5459 if (!a_ptr->cur_num) continue;
5461 /* Check for race in the group */
5462 if (a_ptr->tval == group_tval)
5465 object_idx[object_cnt++] = i;
5469 /* Terminate the list */
5470 object_idx[object_cnt] = 0;
5472 /* Return the number of races */
5479 * Encode the screen colors
5481 static char hack[17] = "dwsorgbuDWvyRGBU";
5484 static errr photo_fgets(FILE *fff, char *buf, huge n)
5493 if (fgets(tmp, 1024, fff))
5495 /* Convert weirdness */
5496 for (s = tmp; *s; s++)
5498 /* Handle newline */
5509 else if (*s == '\t')
5511 /* Hack -- require room */
5512 if (i + 8 >= n) break;
5514 /* Append a space */
5517 /* Append some more spaces */
5518 while (!(i % 8)) buf[i++] = ' ';
5522 else if (iskanji(*s))
5529 /* Ⱦ³Ñ¤«¤Ê¤ËÂбþ */
5530 else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf))
5537 /* Handle printables */
5558 * Hack -- load a screen dump from a file
5560 void do_cmd_load_screen(void)
5575 Term_get_size(&wid, &hgt);
5577 /* Build the filename */
5578 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5580 /* Append to the file */
5581 fff = my_fopen(buf, "r");
5586 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5588 msg_format("Failed to open %s.", buf);
5595 /* Save the screen */
5598 /* Clear the screen */
5602 /* Load the screen */
5603 for (y = 0; okay && (y < hgt); y++)
5605 /* Get a line of data */
5606 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5609 for (x = 0; x < wid - 1; x++)
5611 /* Put the attr/char */
5612 Term_draw(x, y, TERM_WHITE, buf[x]);
5616 /* Get the blank line */
5617 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5620 /* Dump the screen */
5621 for (y = 0; okay && (y < hgt); y++)
5623 /* Get a line of data */
5624 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
5627 for (x = 0; x < wid - 1; x++)
5629 /* Get the attr/char */
5630 (void)(Term_what(x, y, &a, &c));
5632 /* Look up the attr */
5633 for (i = 0; i < 16; i++)
5635 /* Use attr matches */
5636 if (hack[i] == buf[x]) a = i;
5639 /* Put the attr/char */
5640 Term_draw(x, y, a, c);
5645 /* Get the blank line */
5646 if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
5655 prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤µ¤ì¤¿²èÌÌ(µÇ°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5657 msg_print("Screen dump loaded.");
5664 /* Restore the screen */
5671 cptr inven_res_label =
5673 " »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5675 " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5678 /* XTRA HACK RESLIST */
5679 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr,
5680 int *j, byte tval, char *where)
5682 char o_name[MAX_NLEN];
5683 u32b flgs[TR_FLAG_SIZE];
5685 if (!o_ptr->k_idx)return;
5686 if (o_ptr->tval != tval)return;
5689 * HACK:Ring of Lordly protection and Dragon shield/helm
5690 * have random resistances.
5692 if ( ((o_ptr->tval >= TV_BOW && o_ptr->tval<= TV_DRAG_ARMOR && o_ptr->name2)
5693 || (o_ptr->tval == TV_RING && o_ptr->sval == SV_RING_LORDLY)
5694 || (o_ptr->tval == TV_SHIELD && o_ptr->sval == SV_DRAGON_SHIELD)
5695 || (o_ptr->tval == TV_HELM && o_ptr->sval == SV_DRAGON_HELM)
5696 || (o_ptr->tval == TV_GLOVES && o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
5697 || (o_ptr->tval == TV_BOOTS && o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
5698 || o_ptr->art_name || o_ptr->name1) && object_known_p(o_ptr))
5701 object_desc(o_name, o_ptr, TRUE, 0);
5703 while ( o_name[i] && i < 26 ){
5705 if (iskanji(o_name[i])) i++;
5709 if(i<28) while(i<28){o_name[i]=' ';i++;}
5712 fprintf(fff,"%s %s", where, o_name);
5714 if (!(o_ptr->ident & (IDENT_MENTAL)))
5717 fprintf(fff, "-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n");
5719 fprintf(fff, "-------unknown------------ -------unknown------\n");
5723 object_flags_known(o_ptr, flgs);
5726 if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"¡ö");
5727 else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"¡Ü");
5728 else fprintf(fff,"¡¦");
5730 if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"¡ö");
5731 else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"¡Ü");
5732 else fprintf(fff,"¡¦");
5734 if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"¡ö");
5735 else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"¡Ü");
5736 else fprintf(fff,"¡¦");
5738 if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"¡ö");
5739 else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"¡Ü");
5740 else fprintf(fff,"¡¦");
5742 if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"¡Ü");
5743 else fprintf(fff,"¡¦");
5745 if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"¡Ü");
5746 else fprintf(fff,"¡¦");
5748 if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"¡Ü");
5749 else fprintf(fff,"¡¦");
5751 if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"¡Ü");
5752 else fprintf(fff,"¡¦");
5754 if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"¡Ü");
5755 else fprintf(fff,"¡¦");
5757 if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"¡Ü");
5758 else fprintf(fff,"¡¦");
5760 if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"¡Ü");
5761 else fprintf(fff,"¡¦");
5763 if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"¡Ü");
5764 else fprintf(fff,"¡¦");
5766 if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"¡Ü");
5767 else fprintf(fff,"¡¦");
5771 if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"¡Ü");
5772 else fprintf(fff,"¡¦");
5774 if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"¡Ü");
5775 else fprintf(fff,"¡¦");
5777 if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"¡Ü");
5778 else fprintf(fff,"¡¦");
5780 if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"¡Ü");
5781 else fprintf(fff,"¡¦");
5783 if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"¡Ü");
5784 else fprintf(fff,"¡¦");
5786 if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"¡Ü");
5787 else fprintf(fff,"¡¦");
5789 if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"¡Ü");
5790 else fprintf(fff,"¡¦");
5792 if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"¡Ü");
5793 else fprintf(fff,"¡¦");
5796 if (have_flag(flgs, TR_REGEN)) fprintf(fff,"¡Ü");
5797 else fprintf(fff,"¡¦");
5799 if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"¡Ü");
5800 else fprintf(fff,"¡¦");
5802 if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"* ");
5803 else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"+ ");
5804 else fprintf(fff,". ");
5806 if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"* ");
5807 else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"+ ");
5808 else fprintf(fff,". ");
5810 if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"* ");
5811 else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"+ ");
5812 else fprintf(fff,". ");
5814 if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"* ");
5815 else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"+ ");
5816 else fprintf(fff,". ");
5818 if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"+ ");
5819 else fprintf(fff,". ");
5821 if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"+ ");
5822 else fprintf(fff,". ");
5824 if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"+ ");
5825 else fprintf(fff,". ");
5827 if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"+ ");
5828 else fprintf(fff,". ");
5830 if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"+ ");
5831 else fprintf(fff,". ");
5833 if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"+ ");
5834 else fprintf(fff,". ");
5836 if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"+ ");
5837 else fprintf(fff,". ");
5839 if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"+ ");
5840 else fprintf(fff,". ");
5842 if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"+ ");
5843 else fprintf(fff,". ");
5847 if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"+ ");
5848 else fprintf(fff,". ");
5850 if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"+ ");
5851 else fprintf(fff,". ");
5853 if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"+ ");
5854 else fprintf(fff,". ");
5856 if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"+ ");
5857 else fprintf(fff,". ");
5859 if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"+ ");
5860 else fprintf(fff,". ");
5862 if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"+ ");
5863 else fprintf(fff,". ");
5865 if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"+ ");
5866 else fprintf(fff,". ");
5868 if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"+ ");
5869 else fprintf(fff,". ");
5872 if (have_flag(flgs, TR_REGEN)) fprintf(fff,"+ ");
5873 else fprintf(fff,". ");
5875 if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"+ ");
5876 else fprintf(fff,". ");
5884 fprintf(fff,"%s\n", inven_res_label);
5890 * Display *ID* ed weapons/armors's resistances
5892 static void do_cmd_knowledge_inven(void)
5897 char file_name[1024];
5908 /* Open a new file */
5909 fff = my_fopen_temp(file_name, 1024);
5912 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5914 msg_format("Failed to create temporary file %s.", file_name);
5919 fprintf(fff,"%s\n",inven_res_label);
5921 for (tval=TV_BOW; tval <= TV_RING; tval++){
5924 for (;j<9;j++) fprintf(fff, "\n");
5926 fprintf(fff,"%s\n",inven_res_label);
5930 strcpy(where, "Áõ");
5932 strcpy(where, "E ");
5934 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5936 o_ptr = &inventory[i];
5937 do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5941 strcpy(where, "»ý");
5943 strcpy(where, "I ");
5945 for (i = 0; i < INVEN_PACK; i++)
5947 o_ptr = &inventory[i];
5948 do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5952 /* Print all homes in the different towns */
5953 st_ptr = &town[1].store[STORE_HOME];
5955 strcpy(where, "²È");
5957 strcpy(where, "H ");
5960 /* Dump all available items */
5961 for (i = 0; i < st_ptr->stock_num; i++)
5963 o_ptr = &st_ptr->stock[i];
5964 do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5968 /* Close the file */
5971 /* Display the file contents */
5973 show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ¥ê¥¹¥È", 0, 0);
5975 show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5978 /* Remove the file */
5983 void do_cmd_save_screen_html_aux(char *filename, int message)
5987 byte a = 0, old_a = 0;
6001 cptr html_head[] = {
6002 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
6006 cptr html_foot[] = {
6008 "</body>\n</html>\n",
6014 Term_get_size(&wid, &hgt);
6016 /* File type is "TEXT" */
6017 FILE_TYPE(FILE_TYPE_TEXT);
6019 /* Append to the file */
6020 fff = my_fopen(filename, "w");
6026 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
6028 msg_format("Failed to open file %s.", filename);
6036 /* Save the screen */
6040 /* Build the filename */
6041 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
6042 tmpfff = my_fopen(buf, "r");
6044 for (i = 0; html_head[i]; i++)
6045 fprintf(fff, html_head[i]);
6049 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
6051 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
6055 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
6057 fprintf(fff, "%s\n", buf);
6062 /* Dump the screen */
6063 for (y = 0; y < hgt; y++)
6070 for (x = 0; x < wid - 1; x++)
6074 /* Get the attr/char */
6075 (void)(Term_what(x, y, &a, &c));
6079 case '&': cc = "&"; break;
6080 case '<': cc = "<"; break;
6081 case '>': cc = ">"; break;
6083 case 0x1f: c = '.'; break;
6084 case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
6089 if ((y == 0 && x == 0) || a != old_a) {
6090 rv = angband_color_table[a][1];
6091 gv = angband_color_table[a][2];
6092 bv = angband_color_table[a][3];
6093 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">",
6094 ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
6098 fprintf(fff, "%s", cc);
6100 fprintf(fff, "%c", c);
6103 fprintf(fff, "</font>");
6106 for (i = 0; html_foot[i]; i++)
6107 fprintf(fff, html_foot[i]);
6112 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
6114 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
6118 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
6120 fprintf(fff, "%s\n", buf);
6135 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6137 msg_print("Screen dump saved.");
6142 /* Restore the screen */
6148 * Hack -- save a screen dump to a file
6150 static void do_cmd_save_screen_html(void)
6152 char buf[1024], tmp[256] = "screen.html";
6155 if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
6157 if (!get_string("File name: ", tmp, 80))
6161 /* Build the filename */
6162 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
6166 do_cmd_save_screen_html_aux(buf, 1);
6171 * Redefinable "save_screen" action
6173 void (*screendump_aux)(void) = NULL;
6177 * Hack -- save a screen dump to a file
6179 void do_cmd_save_screen(void)
6181 bool old_use_graphics = use_graphics;
6182 bool html_dump = FALSE;
6187 prt("µÇ°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6189 prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6194 if (c == 'Y' || c == 'y')
6196 else if (c == 'H' || c == 'h')
6208 Term_get_size(&wid, &hgt);
6210 if (old_use_graphics)
6212 use_graphics = FALSE;
6215 /* Redraw everything */
6216 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6218 /* Hack -- update */
6224 do_cmd_save_screen_html();
6228 /* Do we use a special screendump function ? */
6229 else if (screendump_aux)
6231 /* Dump the screen to a graphics file */
6232 (*screendump_aux)();
6234 else /* Dump the screen as text */
6245 /* Build the filename */
6246 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6248 /* File type is "TEXT" */
6249 FILE_TYPE(FILE_TYPE_TEXT);
6251 /* Append to the file */
6252 fff = my_fopen(buf, "w");
6258 msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6260 msg_format("Failed to open file %s.", buf);
6267 /* Save the screen */
6271 /* Dump the screen */
6272 for (y = 0; y < hgt; y++)
6275 for (x = 0; x < wid - 1; x++)
6277 /* Get the attr/char */
6278 (void)(Term_what(x, y, &a, &c));
6288 fprintf(fff, "%s\n", buf);
6295 /* Dump the screen */
6296 for (y = 0; y < hgt; y++)
6299 for (x = 0; x < wid - 1; x++)
6301 /* Get the attr/char */
6302 (void)(Term_what(x, y, &a, &c));
6305 buf[x] = hack[a&0x0F];
6312 fprintf(fff, "%s\n", buf);
6324 msg_print("²èÌÌ(µÇ°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤½Ð¤·¤Þ¤·¤¿¡£");
6326 msg_print("Screen dump saved.");
6332 /* Restore the screen */
6336 if (old_use_graphics)
6338 use_graphics = TRUE;
6341 /* Redraw everything */
6342 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6344 /* Hack -- update */
6351 * Sorting hook -- Comp function -- see below
6353 * We use "u" to point to array of monster indexes,
6354 * and "v" to select the type of sorting to perform on "u".
6356 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6358 u16b *who = (u16b*)(u);
6360 u16b *why = (u16b*)(v);
6367 /* Sort by total kills */
6370 /* Extract total kills */
6371 z1 = a_info[w1].tval;
6372 z2 = a_info[w2].tval;
6374 /* Compare total kills */
6375 if (z1 < z2) return (TRUE);
6376 if (z1 > z2) return (FALSE);
6380 /* Sort by monster level */
6383 /* Extract levels */
6384 z1 = a_info[w1].sval;
6385 z2 = a_info[w2].sval;
6387 /* Compare levels */
6388 if (z1 < z2) return (TRUE);
6389 if (z1 > z2) return (FALSE);
6393 /* Sort by monster experience */
6396 /* Extract experience */
6397 z1 = a_info[w1].level;
6398 z2 = a_info[w2].level;
6400 /* Compare experience */
6401 if (z1 < z2) return (TRUE);
6402 if (z1 > z2) return (FALSE);
6406 /* Compare indexes */
6412 * Sorting hook -- Swap function -- see below
6414 * We use "u" to point to array of monster indexes,
6415 * and "v" to select the type of sorting to perform.
6417 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6419 u16b *who = (u16b*)(u);
6434 * Check the status of "artifacts"
6436 static void do_cmd_knowledge_artifacts(void)
6438 int i, k, z, x, y, n = 0;
6444 char file_name[1024];
6446 char base_name[MAX_NLEN];
6450 /* Open a new file */
6451 fff = my_fopen_temp(file_name, 1024);
6455 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6457 msg_format("Failed to create temporary file %s.", file_name);
6463 /* Allocate the "who" array */
6464 C_MAKE(who, max_a_idx, s16b);
6466 /* Allocate the "okay" array */
6467 C_MAKE(okay, max_a_idx, bool);
6469 /* Scan the artifacts */
6470 for (k = 0; k < max_a_idx; k++)
6472 artifact_type *a_ptr = &a_info[k];
6477 /* Skip "empty" artifacts */
6478 if (!a_ptr->name) continue;
6480 /* Skip "uncreated" artifacts */
6481 if (!a_ptr->cur_num) continue;
6487 /* Check the dungeon */
6488 for (y = 0; y < cur_hgt; y++)
6490 for (x = 0; x < cur_wid; x++)
6492 cave_type *c_ptr = &cave[y][x];
6494 s16b this_o_idx, next_o_idx = 0;
6496 /* Scan all objects in the grid */
6497 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6501 /* Acquire object */
6502 o_ptr = &o_list[this_o_idx];
6504 /* Acquire next object */
6505 next_o_idx = o_ptr->next_o_idx;
6507 /* Ignore non-artifacts */
6508 if (!artifact_p(o_ptr)) continue;
6510 /* Ignore known items */
6511 if (object_known_p(o_ptr)) continue;
6513 /* Note the artifact */
6514 okay[o_ptr->name1] = FALSE;
6519 /* Check the inventory and equipment */
6520 for (i = 0; i < INVEN_TOTAL; i++)
6522 object_type *o_ptr = &inventory[i];
6524 /* Ignore non-objects */
6525 if (!o_ptr->k_idx) continue;
6527 /* Ignore non-artifacts */
6528 if (!artifact_p(o_ptr)) continue;
6530 /* Ignore known items */
6531 if (object_known_p(o_ptr)) continue;
6533 /* Note the artifact */
6534 okay[o_ptr->name1] = FALSE;
6537 for (k = 0; k < max_a_idx; k++)
6539 if (okay[k]) who[n++] = k;
6542 /* Select the sort method */
6543 ang_sort_comp = ang_sort_art_comp;
6544 ang_sort_swap = ang_sort_art_swap;
6546 /* Sort the array by dungeon depth of monsters */
6547 ang_sort(who, &why, n);
6549 /* Scan the artifacts */
6550 for (k = 0; k < n; k++)
6552 artifact_type *a_ptr = &a_info[who[k]];
6556 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6558 strcpy(base_name, "Unknown Artifact");
6562 /* Obtain the base object type */
6563 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6571 /* Get local object */
6574 /* Create fake object */
6575 object_prep(q_ptr, z);
6577 /* Make it an artifact */
6578 q_ptr->name1 = (byte)who[k];
6580 /* Describe the artifact */
6581 object_desc_store(base_name, q_ptr, FALSE, 0);
6584 /* Hack -- Build the artifact name */
6586 fprintf(fff, " %s\n", base_name);
6588 fprintf(fff, " The %s\n", base_name);
6593 /* Free the "who" array */
6594 C_KILL(who, max_a_idx, s16b);
6596 /* Free the "okay" array */
6597 C_KILL(okay, max_a_idx, bool);
6599 /* Close the file */
6602 /* Display the file contents */
6604 show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6606 show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6610 /* Remove the file */
6616 * Display known uniques
6618 static void do_cmd_knowledge_uniques(void)
6626 char file_name[1024];
6628 /* Open a new file */
6629 fff = my_fopen_temp(file_name, 1024);
6633 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6635 msg_format("Failed to create temporary file %s.", file_name);
6641 /* Allocate the "who" array */
6642 C_MAKE(who, max_r_idx, s16b);
6644 /* Scan the monsters */
6645 for (i = 1; i < max_r_idx; i++)
6647 monster_race *r_ptr = &r_info[i];
6649 /* Use that monster */
6650 if (r_ptr->name) who[n++] = i;
6653 /* Select the sort method */
6654 ang_sort_comp = ang_sort_comp_hook;
6655 ang_sort_swap = ang_sort_swap_hook;
6657 /* Sort the array by dungeon depth of monsters */
6658 ang_sort(who, &why, n);
6660 /* Scan the monster races */
6661 for (k = 0; k < n; k++)
6663 monster_race *r_ptr = &r_info[who[k]];
6665 /* Only print Uniques */
6666 if (r_ptr->flags1 & (RF1_UNIQUE))
6668 bool dead = (r_ptr->max_num == 0);
6672 /* Only display "known" uniques */
6673 if (dead || cheat_know || r_ptr->r_sights)
6675 /* Print a message */
6677 fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¡£\n",
6678 (r_name + r_ptr->name));
6680 fprintf(fff, " %s is alive\n",
6681 (r_name + r_ptr->name));
6688 /* Free the "who" array */
6689 C_KILL(who, max_r_idx, s16b);
6691 /* Close the file */
6694 /* Display the file contents */
6696 show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6698 show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6702 /* Remove the file */
6708 * Display weapon-exp
6710 static void do_cmd_knowledge_weapon_exp(void)
6712 int i, j, num, weapon_exp;
6716 char file_name[1024];
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 < 5; i++)
6733 for (num = 0; num < 64; num++)
6735 for (j = 0; j < max_k_idx; j++)
6737 object_kind *k_ptr = &k_info[j];
6739 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6741 if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6743 weapon_exp = p_ptr->weapon_exp[4 - i][num];
6745 fprintf(fff, "%-25s ", tmp);
6746 if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6747 else fprintf(fff, " ");
6748 fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6749 if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6757 /* Close the file */
6760 /* Display the file contents */
6762 show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6764 show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6768 /* Remove the file */
6776 static void do_cmd_knowledge_spell_exp(void)
6778 int i = 0, spell_exp, exp_level;
6783 char file_name[1024];
6785 /* Open a new file */
6786 fff = my_fopen_temp(file_name, 1024);
6789 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6791 msg_format("Failed to create temporary file %s.", file_name);
6797 if (p_ptr->realm1 != REALM_NONE)
6800 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6802 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6804 for (i = 0; i < 32; i++)
6806 if (!is_magic(p_ptr->realm1))
6808 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6812 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6814 if (s_ptr->slevel >= 99) continue;
6815 spell_exp = p_ptr->spell_exp[i];
6816 exp_level = spell_exp_level(spell_exp);
6817 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6818 if (p_ptr->realm1 == REALM_HISSATSU)
6819 fprintf(fff, "[--]");
6822 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6823 else fprintf(fff, " ");
6824 fprintf(fff, "%s", exp_level_str[exp_level]);
6826 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6831 if (p_ptr->realm2 != REALM_NONE)
6834 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6836 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6838 for (i = 0; i < 32; i++)
6840 if (!is_magic(p_ptr->realm1))
6842 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6846 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6848 if (s_ptr->slevel >= 99) continue;
6850 spell_exp = p_ptr->spell_exp[i + 32];
6851 exp_level = spell_exp_level(spell_exp);
6852 fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6853 if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6854 else fprintf(fff, " ");
6855 fprintf(fff, "%s", exp_level_str[exp_level]);
6856 if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6861 /* Close the file */
6864 /* Display the file contents */
6866 show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6868 show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6872 /* Remove the file */
6880 static void do_cmd_knowledge_skill_exp(void)
6882 int i = 0, skill_exp;
6886 char file_name[1024];
6888 char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή ", "¾èÇÏ "};
6890 char skill_name[3][20]={"Martial Arts ", "Dual Wielding ", "Riding "};
6893 /* Open a new file */
6894 fff = my_fopen_temp(file_name, 1024);
6897 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6899 msg_format("Failed to create temporary file %s.", file_name);
6905 for (i = 0; i < 3; i++)
6907 skill_exp = p_ptr->skill_exp[i];
6908 fprintf(fff, "%-20s ", skill_name[i]);
6909 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6910 else fprintf(fff, " ");
6911 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6912 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6916 /* Close the file */
6919 /* Display the file contents */
6921 show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6923 show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6927 /* Remove the file */
6933 * Pluralize a monster name
6935 void plural_aux(char *Name)
6937 int NameLen = strlen(Name);
6939 if (strstr(Name, "Disembodied hand"))
6941 strcpy(Name, "Disembodied hands that strangled people");
6943 else if (strstr(Name, "Colour out of space"))
6945 strcpy(Name, "Colours out of space");
6947 else if (strstr(Name, "stairway to hell"))
6949 strcpy(Name, "stairways to hell");
6951 else if (strstr(Name, "Dweller on the threshold"))
6953 strcpy(Name, "Dwellers on the threshold");
6955 else if (strstr(Name, " of "))
6957 cptr aider = strstr(Name, " of ");
6968 if (dummy[i-1] == 's')
6970 strcpy(&(dummy[i]), "es");
6975 strcpy(&(dummy[i]), "s");
6978 strcpy(&(dummy[i+1]), aider);
6979 strcpy(Name, dummy);
6981 else if (strstr(Name, "coins"))
6984 strcpy(dummy, "piles of ");
6985 strcat(dummy, Name);
6986 strcpy(Name, dummy);
6989 else if (strstr(Name, "Manes"))
6993 else if (streq(&(Name[NameLen - 2]), "ey"))
6995 strcpy(&(Name[NameLen - 2]), "eys");
6997 else if (Name[NameLen - 1] == 'y')
6999 strcpy(&(Name[NameLen - 1]), "ies");
7001 else if (streq(&(Name[NameLen - 4]), "ouse"))
7003 strcpy(&(Name[NameLen - 4]), "ice");
7005 else if (streq(&(Name[NameLen - 2]), "us"))
7007 strcpy(&(Name[NameLen - 2]), "i");
7009 else if (streq(&(Name[NameLen - 6]), "kelman"))
7011 strcpy(&(Name[NameLen - 6]), "kelmen");
7013 else if (streq(&(Name[NameLen - 8]), "wordsman"))
7015 strcpy(&(Name[NameLen - 8]), "wordsmen");
7017 else if (streq(&(Name[NameLen - 7]), "oodsman"))
7019 strcpy(&(Name[NameLen - 7]), "oodsmen");
7021 else if (streq(&(Name[NameLen - 7]), "eastman"))
7023 strcpy(&(Name[NameLen - 7]), "eastmen");
7025 else if (streq(&(Name[NameLen - 8]), "izardman"))
7027 strcpy(&(Name[NameLen - 8]), "izardmen");
7029 else if (streq(&(Name[NameLen - 5]), "geist"))
7031 strcpy(&(Name[NameLen - 5]), "geister");
7033 else if (streq(&(Name[NameLen - 2]), "ex"))
7035 strcpy(&(Name[NameLen - 2]), "ices");
7037 else if (streq(&(Name[NameLen - 2]), "lf"))
7039 strcpy(&(Name[NameLen - 2]), "lves");
7041 else if (suffix(Name, "ch") ||
7042 suffix(Name, "sh") ||
7043 suffix(Name, "nx") ||
7044 suffix(Name, "s") ||
7047 strcpy(&(Name[NameLen]), "es");
7051 strcpy(&(Name[NameLen]), "s");
7056 * Display current pets
7058 static void do_cmd_knowledge_pets(void)
7062 monster_type *m_ptr;
7065 int show_upkeep = 0;
7066 char file_name[1024];
7069 /* Open a new file */
7070 fff = my_fopen_temp(file_name, 1024);
7073 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7075 msg_format("Failed to create temporary file %s.", file_name);
7081 /* Process the monsters (backwards) */
7082 for (i = m_max - 1; i >= 1; i--)
7084 /* Access the monster */
7087 /* Ignore "dead" monsters */
7088 if (!m_ptr->r_idx) continue;
7090 /* Calculate "upkeep" for pets */
7094 monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
7095 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
7099 /* Process the waiting pets (backwards) */
7100 for (i = MAX_PARTY_MON - 1; i >= 0; i--)
7102 /* Access the monster */
7103 m_ptr = &party_mon[i];
7105 /* Ignore "dead" monsters */
7106 if (!m_ptr->r_idx) continue;
7110 /* List waiting pets */
7111 monster_desc(pet_name, m_ptr, MD_ASSUME_OUTSIDE | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
7112 fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
7115 show_upkeep = calculate_upkeep();
7117 fprintf(fff, "----------------------------------------------\n");
7119 fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends);
7120 fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
7122 fprintf(fff, " Total: %d pet%s.\n",
7123 t_friends, (t_friends == 1 ? "" : "s"));
7124 fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
7129 /* Close the file */
7132 /* Display the file contents */
7134 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
7136 show_file(TRUE, file_name, "Current Pets", 0, 0);
7140 /* Remove the file */
7148 * Note that the player ghosts are ignored. XXX XXX XXX
7150 static void do_cmd_knowledge_kill_count(void)
7158 char file_name[1024];
7163 /* Open a new file */
7164 fff = my_fopen_temp(file_name, 1024);
7168 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7170 msg_format("Failed to create temporary file %s.", file_name);
7176 /* Allocate the "who" array */
7177 C_MAKE(who, max_r_idx, s16b);
7180 /* Monsters slain */
7183 for (kk = 1; kk < max_r_idx; kk++)
7185 monster_race *r_ptr = &r_info[kk];
7187 if (r_ptr->flags1 & (RF1_UNIQUE))
7189 bool dead = (r_ptr->max_num == 0);
7198 s16b This = r_ptr->r_pkills;
7209 fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7211 fprintf(fff,"You have defeated no enemies yet.\n\n");
7214 else if (Total == 1)
7216 fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7218 fprintf(fff,"You have defeated one enemy.\n\n");
7223 fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7225 fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7232 /* Scan the monsters */
7233 for (i = 1; i < max_r_idx; i++)
7235 monster_race *r_ptr = &r_info[i];
7237 /* Use that monster */
7238 if (r_ptr->name) who[n++] = i;
7241 /* Select the sort method */
7242 ang_sort_comp = ang_sort_comp_hook;
7243 ang_sort_swap = ang_sort_swap_hook;
7245 /* Sort the array by dungeon depth of monsters */
7246 ang_sort(who, &why, n);
7248 /* Scan the monster races */
7249 for (k = 0; k < n; k++)
7251 monster_race *r_ptr = &r_info[who[k]];
7253 if (r_ptr->flags1 & (RF1_UNIQUE))
7255 bool dead = (r_ptr->max_num == 0);
7259 /* Print a message */
7260 fprintf(fff, " %s\n",
7261 (r_name + r_ptr->name));
7267 s16b This = r_ptr->r_pkills;
7272 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7273 if(strchr("pt",r_ptr->d_char))
7274 fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7276 fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name);
7280 if (strstr(r_name + r_ptr->name, "coins"))
7282 fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name));
7286 fprintf(fff, " 1 %s\n", (r_name + r_ptr->name));
7292 strcpy(ToPlural, (r_name + r_ptr->name));
7293 plural_aux(ToPlural);
7294 fprintf(fff, " %d %s\n", This, ToPlural);
7304 fprintf(fff,"----------------------------------------------\n");
7306 fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total);
7308 fprintf(fff," Total: %lu creature%s killed.\n",
7309 Total, (Total == 1 ? "" : "s"));
7313 /* Free the "who" array */
7314 C_KILL(who, max_r_idx, s16b);
7316 /* Close the file */
7319 /* Display the file contents */
7321 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7323 show_file(TRUE, file_name, "Kill Count", 0, 0);
7327 /* Remove the file */
7333 * Display the object groups.
7335 static void display_group_list(int col, int row, int wid, int per_page,
7336 int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7340 /* Display lines until done */
7341 for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7343 /* Get the group index */
7344 int grp = grp_idx[grp_top + i];
7346 /* Choose a color */
7347 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7349 /* Erase the entire line */
7350 Term_erase(col, row + i, wid);
7352 /* Display the group label */
7353 c_put_str(attr, group_text[grp], row + i, col);
7359 * Move the cursor in a browser window
7361 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt,
7362 int *list_cur, int list_cnt)
7367 int list = *list_cur;
7369 /* Extract direction */
7372 /* Hack -- scroll up full screen */
7377 /* Hack -- scroll down full screen */
7382 d = get_keymap_dir(ch);
7387 /* Diagonals - hack */
7388 if ((ddx[d] > 0) && ddy[d])
7394 Term_get_size(&wid, &hgt);
7396 browser_rows = hgt - 8;
7398 /* Browse group list */
7403 /* Move up or down */
7404 grp += ddy[d] * (browser_rows - 1);
7407 if (grp >= grp_cnt) grp = grp_cnt - 1;
7408 if (grp < 0) grp = 0;
7409 if (grp != old_grp) list = 0;
7412 /* Browse sub-list list */
7415 /* Move up or down */
7416 list += ddy[d] * browser_rows;
7419 if (list >= list_cnt) list = list_cnt - 1;
7420 if (list < 0) list = 0;
7432 if (col < 0) col = 0;
7433 if (col > 1) col = 1;
7440 /* Browse group list */
7445 /* Move up or down */
7449 if (grp >= grp_cnt) grp = grp_cnt - 1;
7450 if (grp < 0) grp = 0;
7451 if (grp != old_grp) list = 0;
7454 /* Browse sub-list list */
7457 /* Move up or down */
7461 if (list >= list_cnt) list = list_cnt - 1;
7462 if (list < 0) list = 0;
7473 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7477 /* Clear the display lines */
7478 for (i = 0; i < height; i++)
7480 Term_erase(col, row + i, width);
7483 /* Bigtile mode uses double width */
7484 if (use_bigtile) width /= 2;
7486 /* Display lines until done */
7487 for (i = 0; i < height; i++)
7489 /* Display columns until done */
7490 for (j = 0; j < width; j++)
7498 /* Bigtile mode uses double width */
7499 if (use_bigtile) x += j;
7504 /* Ignore illegal characters */
7505 if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7506 (!use_graphics && ic > 0x7f))
7512 /* Force correct code for both ASCII character and tile */
7513 if (c & 0x80) a |= 0x80;
7515 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7517 /* Display symbol */
7518 Term_putch(x, y, a, c);
7521 if (use_bigtile) Term_putch(x + 1, y, a2, c2);
7528 * Place the cursor at the collect position for visual mode
7530 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7532 int i = (a & 0x7f) - attr_top;
7533 int j = c - char_left;
7538 /* Bigtile mode uses double width */
7539 if (use_bigtile) x += j;
7541 /* Place the cursor */
7547 * Clipboard variables for copy&paste in visual mode
7549 static byte attr_idx = 0;
7550 static byte char_idx = 0;
7553 * Do visual mode command -- Change symbols
7555 static bool visual_mode_command(char ch, bool *visual_list_ptr,
7556 int height, int width,
7557 byte *attr_top_ptr, byte *char_left_ptr,
7558 byte *cur_attr_ptr, byte *cur_char_ptr)
7560 static byte attr_old = 0, char_old = 0;
7565 if (*visual_list_ptr)
7568 *cur_attr_ptr = attr_old;
7569 *cur_char_ptr = char_old;
7570 *visual_list_ptr = FALSE;
7579 if (*visual_list_ptr)
7582 *visual_list_ptr = FALSE;
7590 if (!*visual_list_ptr)
7592 *visual_list_ptr = TRUE;
7594 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7595 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7597 attr_old = *cur_attr_ptr;
7598 char_old = *cur_char_ptr;
7606 /* Set the visual */
7607 attr_idx = *cur_attr_ptr;
7608 char_idx = *cur_char_ptr;
7617 *cur_attr_ptr = attr_idx;
7618 *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7624 *cur_char_ptr = char_idx;
7625 *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7631 if (*visual_list_ptr)
7634 int d = get_keymap_dir(ch);
7635 byte a = (*cur_attr_ptr & 0x7f);
7636 byte c = *cur_char_ptr;
7638 if (use_bigtile) eff_width = width / 2;
7639 else eff_width = width;
7641 /* Restrict direction */
7642 if ((a == 0) && (ddy[d] < 0)) d = 0;
7643 if ((c == 0) && (ddx[d] < 0)) d = 0;
7644 if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7645 if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7650 /* Force correct code for both ASCII character and tile */
7651 if (c & 0x80) a |= 0x80;
7653 /* Set the visual */
7658 /* Move the frame */
7659 if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7660 if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7661 if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7662 if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7669 /* Visual mode command is not used */
7675 * Display the monsters in a group.
7677 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7678 int mon_cur, int mon_top)
7682 /* Display lines until done */
7683 for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7689 /* Get the race index */
7690 int r_idx = mon_idx[mon_top + i] ;
7692 /* Access the race */
7693 monster_race *r_ptr = &r_info[r_idx];
7696 /* Choose a color */
7697 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7699 /* Display the name */
7700 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7702 /* Hack -- visual_list mode */
7705 c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7707 else if (p_ptr->wizard)
7709 c_prt(attr, format("%d", r_idx), row + i, 60);
7714 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
7716 /* Display symbol */
7717 Term_putch(70, row + i, a, c);
7720 if (use_bigtile) Term_putch(70 + 1, row + i, a2, c2);
7723 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7725 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7727 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7732 /* Clear remaining lines */
7733 for (; i < per_page; i++)
7735 Term_erase(col, row + i, 255);
7741 * Display known monsters.
7743 static void do_cmd_knowledge_monsters(void)
7746 int grp_cur, grp_top, old_grp_cur;
7747 int mon_cur, mon_top;
7748 int grp_cnt, grp_idx[100];
7756 bool visual_list = FALSE;
7757 byte attr_top = 0, char_left = 0;
7763 Term_get_size(&wid, &hgt);
7765 browser_rows = hgt - 8;
7767 /* Allocate the "mon_idx" array */
7768 C_MAKE(mon_idx, max_r_idx, s16b);
7773 /* Check every group */
7774 for (i = 0; monster_group_text[i] != NULL; i++)
7776 /* Measure the label */
7777 len = strlen(monster_group_text[i]);
7779 /* Save the maximum length */
7780 if (len > max) max = len;
7782 /* See if any monsters are known */
7783 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7785 /* Build a list of groups with known monsters */
7786 grp_idx[grp_cnt++] = i;
7790 /* Terminate the list */
7791 grp_idx[grp_cnt] = -1;
7794 grp_cur = grp_top = 0;
7795 mon_cur = mon_top = 0;
7804 monster_race *r_ptr;
7811 prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7812 prt("¥°¥ë¡¼¥×", 4, 0);
7813 prt("̾Á°", 4, max + 3);
7814 if (p_ptr->wizard) prt("Idx", 4, 60);
7815 prt("ʸ»ú »¦³²¿ô", 4, 67);
7817 prt("Knowledge - Monsters", 2, 0);
7819 prt("Name", 4, max + 3);
7820 if (p_ptr->wizard) prt("Idx", 4, 60);
7821 prt("Sym Kills", 4, 67);
7824 for (i = 0; i < 78; i++)
7826 Term_putch(i, 5, TERM_WHITE, '=');
7829 for (i = 0; i < browser_rows; i++)
7831 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7837 /* Scroll group list */
7838 if (grp_cur < grp_top) grp_top = grp_cur;
7839 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7841 /* Display a list of monster groups */
7842 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7844 if (old_grp_cur != grp_cur)
7846 old_grp_cur = grp_cur;
7848 /* Get a list of monsters in the current group */
7849 mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7852 /* Scroll monster list */
7853 while (mon_cur < mon_top)
7854 mon_top = MAX(0, mon_top - browser_rows/2);
7855 while (mon_cur >= mon_top + browser_rows)
7856 mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7860 /* Display a list of monsters in the current group */
7861 display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7867 /* Display a monster name */
7868 display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7870 /* Display visual list below first monster */
7871 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7876 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7878 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);
7881 /* Get the current monster */
7882 r_ptr = &r_info[mon_idx[mon_cur]];
7884 /* Mega Hack -- track this monster race */
7885 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7887 /* Hack -- handle stuff */
7892 place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7896 Term_gotoxy(0, 6 + (grp_cur - grp_top));
7900 Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7905 /* Do visual mode command if needed */
7906 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;
7919 /* Recall on screen */
7920 if (mon_idx[mon_cur])
7922 screen_roff(mon_idx[mon_cur], 0);
7933 /* Move the cursor */
7934 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7941 /* Free the "mon_idx" array */
7942 C_KILL(mon_idx, max_r_idx, s16b);
7947 * Display the objects in a group.
7949 static void display_object_list(int col, int row, int per_page, int object_idx[],
7950 int object_cur, int object_top)
7954 /* Display lines until done */
7955 for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7961 /* Get the object index */
7962 int k_idx = object_idx[object_top + i];
7964 /* Access the object */
7965 object_kind *k_ptr = &k_info[k_idx];
7967 /* Choose a color */
7968 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7969 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7971 attr = ((i + object_top == object_cur) ? cursor : attr);
7974 strip_name(o_name, k_idx);
7976 /* Display the name */
7977 c_prt(attr, o_name, row + i, col);
7979 /* Hack -- visual_list mode */
7982 c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7984 else if (p_ptr->wizard)
7986 c_prt(attr, format ("%d", k_idx), row + i, 70);
7989 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7990 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7992 /* Symbol is unknown */
7993 if (!k_ptr->aware && !p_ptr->wizard)
7999 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
8001 /* Display symbol */
8002 Term_putch(76, row + i, a, c);
8005 if (use_bigtile) Term_putch(76 + 1, row + i, a2, c2);
8008 /* Clear remaining lines */
8009 for (; i < per_page; i++)
8011 Term_erase(col, row + i, 255);
8016 * Describe fake object
8018 static void desc_obj_fake(int k_idx)
8021 object_type object_type_body;
8023 /* Get local object */
8024 o_ptr = &object_type_body;
8026 /* Wipe the object */
8029 /* Create the artifact */
8030 object_prep(o_ptr, k_idx);
8032 /* It's fully know */
8033 o_ptr->ident |= IDENT_KNOWN;
8035 /* Track the object */
8036 /* object_actual_track(o_ptr); */
8038 /* Hack - mark as fake */
8039 /* term_obj_real = FALSE; */
8041 /* Hack -- Handle stuff */
8044 if (!screen_object(o_ptr, FALSE))
8047 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
8049 msg_print("You see nothing special.");
8058 * Display known objects
8060 static void do_cmd_knowledge_objects(void)
8063 int grp_cur, grp_top, old_grp_cur;
8064 int object_old, object_cur, object_top;
8065 int grp_cnt, grp_idx[100];
8073 bool visual_list = FALSE;
8074 byte attr_top = 0, char_left = 0;
8080 Term_get_size(&wid, &hgt);
8082 browser_rows = hgt - 8;
8084 /* Allocate the "object_idx" array */
8085 C_MAKE(object_idx, max_k_idx, int);
8090 /* Check every group */
8091 for (i = 0; object_group_text[i] != NULL; i++)
8093 /* Measure the label */
8094 len = strlen(object_group_text[i]);
8096 /* Save the maximum length */
8097 if (len > max) max = len;
8099 /* See if any monsters are known */
8100 if (collect_objects(i, object_idx))
8102 /* Build a list of groups with known monsters */
8103 grp_idx[grp_cnt++] = i;
8107 /* Terminate the list */
8108 grp_idx[grp_cnt] = -1;
8111 grp_cur = grp_top = 0;
8112 object_cur = object_top = 0;
8129 prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
8130 prt("¥°¥ë¡¼¥×", 4, 0);
8131 prt("̾Á°", 4, max + 3);
8132 if (p_ptr->wizard) prt("Idx", 4, 70);
8135 prt("Knowledge - objects", 2, 0);
8137 prt("Name", 4, max + 3);
8138 if (p_ptr->wizard) prt("Idx", 4, 70);
8142 for (i = 0; i < 78; i++)
8144 Term_putch(i, 5, TERM_WHITE, '=');
8147 for (i = 0; i < browser_rows; i++)
8149 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8155 /* Scroll group list */
8156 if (grp_cur < grp_top) grp_top = grp_cur;
8157 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8159 /* Display a list of object groups */
8160 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
8162 if (old_grp_cur != grp_cur)
8164 old_grp_cur = grp_cur;
8166 /* Get a list of objects in the current group */
8167 object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
8170 /* Scroll object list */
8171 while (object_cur < object_top)
8172 object_top = MAX(0, object_top - browser_rows/2);
8173 while (object_cur >= object_top + browser_rows)
8174 object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
8178 /* Display a list of objects in the current group */
8179 display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
8183 object_top = object_cur;
8185 /* Display a list of objects in the current group */
8186 display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
8188 /* Display visual list below first object */
8189 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8192 /* Get the current object */
8193 k_ptr = &k_info[object_idx[object_cur]];
8195 /* Mega Hack -- track this object */
8196 if (object_cnt) object_kind_track(object_idx[object_cur]);
8200 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8202 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);
8205 /* The "current" object changed */
8206 if (object_old != object_idx[object_cur])
8208 /* Hack -- handle stuff */
8211 /* Remember the "current" object */
8212 object_old = object_idx[object_cur];
8217 place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8221 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8225 Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8230 /* Do visual mode command if needed */
8231 /* Symbol of objects with flavor cannot be changed */
8232 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;
8245 /* Recall on screen */
8247 desc_obj_fake(object_idx[object_cur]);
8255 /* Move the cursor */
8256 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8262 /* Free the "object_idx" array */
8263 C_KILL(object_idx, max_k_idx, int);
8269 * Display the features in a group.
8271 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8272 int feat_cur, int feat_top)
8276 /* Display lines until done */
8277 for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8284 int f_idx = feat_idx[feat_top + i];
8286 /* Access the index */
8287 feature_type *f_ptr = &f_info[f_idx];
8289 /* Choose a color */
8290 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8292 /* Display the name */
8293 c_prt(attr, f_name + f_ptr->name, row + i, col);
8295 /* Hack -- visual_list mode */
8298 c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
8304 if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
8306 /* Display symbol */
8307 Term_putch(68, row + i, a, c);
8310 if (use_bigtile) Term_putch(68 + 1, row + i, a2, c2);
8313 /* Clear remaining lines */
8314 for (; i < per_page; i++)
8316 Term_erase(col, row + i, 255);
8322 * Interact with feature visuals.
8324 static void do_cmd_knowledge_features(void)
8327 int grp_cur, grp_top, old_grp_cur;
8328 int feat_cur, feat_top;
8329 int grp_cnt, grp_idx[100];
8337 bool visual_list = FALSE;
8338 byte attr_top = 0, char_left = 0;
8344 Term_get_size(&wid, &hgt);
8346 browser_rows = hgt - 8;
8348 /* Allocate the "feat_idx" array */
8349 C_MAKE(feat_idx, max_f_idx, int);
8354 /* Check every group */
8355 for (i = 0; feature_group_text[i] != NULL; i++)
8357 /* Measure the label */
8358 len = strlen(feature_group_text[i]);
8360 /* Save the maximum length */
8361 if (len > max) max = len;
8363 /* See if any features are known */
8364 if (collect_features(i, feat_idx))
8366 /* Build a list of groups with known features */
8367 grp_idx[grp_cnt++] = i;
8371 /* Terminate the list */
8372 grp_idx[grp_cnt] = -1;
8375 grp_cur = grp_top = 0;
8376 feat_cur = feat_top = 0;
8382 while ((!flag) && (grp_cnt))
8385 feature_type *f_ptr;
8391 prt("Visuals - features", 2, 0);
8393 prt("Name", 4, max + 3);
8396 for (i = 0; i < 78; i++)
8398 Term_putch(i, 5, TERM_WHITE, '=');
8401 for (i = 0; i < browser_rows; i++)
8403 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8409 /* Scroll group list */
8410 if (grp_cur < grp_top) grp_top = grp_cur;
8411 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8413 /* Display a list of feature groups */
8414 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8416 if (old_grp_cur != grp_cur)
8418 old_grp_cur = grp_cur;
8420 /* Get a list of features in the current group */
8421 feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8424 /* Scroll feature list */
8425 while (feat_cur < feat_top)
8426 feat_top = MAX(0, feat_top - browser_rows/2);
8427 while (feat_cur >= feat_top + browser_rows)
8428 feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8432 /* Display a list of features in the current group */
8433 display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
8437 feat_top = feat_cur;
8439 /* Display a list of features in the current group */
8440 display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
8442 /* Display visual list below first object */
8443 display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8448 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8450 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);
8453 /* Get the current feature */
8454 f_ptr = &f_info[feat_idx[feat_cur]];
8458 place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
8462 Term_gotoxy(0, 6 + (grp_cur - grp_top));
8466 Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8471 /* Do visual mode command if needed */
8472 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;
8484 /* Move the cursor */
8485 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8492 if (!grp_cnt) msg_print("No features known.");
8494 /* Free the "feat_idx" array */
8495 C_KILL(feat_idx, max_f_idx, int);
8500 * List wanted monsters
8502 static void do_cmd_knowledge_kubi(void)
8507 char file_name[1024];
8510 /* Open a new file */
8511 fff = my_fopen_temp(file_name, 1024);
8514 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8516 msg_format("Failed to create temporary file %s.", file_name);
8524 bool listed = FALSE;
8527 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8529 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8531 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8533 fprintf(fff, "List of wanted monsters\n");
8535 fprintf(fff, "----------------------------------------------\n");
8537 for (i = 0; i < MAX_KUBI; i++)
8539 if (kubi_r_idx[i] <= 10000)
8541 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8550 fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8552 fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8557 /* Close the file */
8560 /* Display the file contents */
8562 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8564 show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8568 /* Remove the file */
8573 * List virtues & status
8575 static void do_cmd_knowledge_virtues(void)
8579 char file_name[1024];
8582 /* Open a new file */
8583 fff = my_fopen_temp(file_name, 1024);
8586 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8588 msg_format("Failed to create temporary file %s.", file_name);
8597 fprintf(fff, "¸½ºß¤Î°À : %s\n\n", your_alignment());
8599 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8604 /* Close the file */
8607 /* Display the file contents */
8609 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8611 show_file(TRUE, file_name, "Virtues", 0, 0);
8615 /* Remove the file */
8623 static void do_cmd_knowledge_dungeon(void)
8627 char file_name[1024];
8631 /* Open a new file */
8632 fff = my_fopen_temp(file_name, 1024);
8635 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8637 msg_format("Failed to create temporary file %s.", file_name);
8645 for (i = 1; i < max_d_idx; i++)
8649 if (!d_info[i].maxdepth) continue;
8650 if (!max_dlv[i]) continue;
8651 if (d_info[i].final_guardian)
8653 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8655 else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8657 fprintf(fff,"%c%-12s : %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8659 fprintf(fff,"%c%-16s : level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8664 /* Close the file */
8667 /* Display the file contents */
8669 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8671 show_file(TRUE, file_name, "Dungeon", 0, 0);
8675 /* Remove the file */
8680 * List virtues & status
8683 static void do_cmd_knowledge_stat(void)
8687 char file_name[1024];
8690 /* Open a new file */
8691 fff = my_fopen_temp(file_name, 1024);
8694 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8696 msg_format("Failed to create temporary file %s.", file_name);
8704 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8705 (2 * p_ptr->hitdie +
8706 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8709 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8710 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8711 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8713 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8714 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8715 fprintf(fff, "Limits of maximum stats\n\n");
8717 for (v_nr = 0; v_nr < 6; v_nr++)
8719 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);
8720 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8726 /* Close the file */
8729 /* Display the file contents */
8731 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8733 show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8737 /* Remove the file */
8743 * Print all active quests
8745 static void do_cmd_knowledge_quests_current(FILE *fff)
8748 char rand_tmp_str[120] = "\0";
8750 monster_race *r_ptr;
8752 int rand_level = 100;
8756 fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8758 fprintf(fff, "< Current Quest >\n");
8761 for (i = 1; i < max_quests; i++)
8763 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8765 /* Set the quest number temporary */
8766 int old_quest = p_ptr->inside_quest;
8769 /* Clear the text */
8770 for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8771 quest_text_line = 0;
8773 p_ptr->inside_quest = i;
8775 /* Get the quest text */
8776 init_flags = INIT_SHOW_TEXT;
8778 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8780 /* Reset the old quest number */
8781 p_ptr->inside_quest = old_quest;
8783 /* No info from "silent" quests */
8784 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8788 if (quest[i].type != QUEST_TYPE_RANDOM)
8790 char note[80] = "\0";
8792 if (quest[i].status == QUEST_STATUS_TAKEN)
8794 switch (quest[i].type)
8796 case QUEST_TYPE_KILL_LEVEL:
8797 case QUEST_TYPE_KILL_ANY_LEVEL:
8798 r_ptr = &r_info[quest[i].r_idx];
8799 strcpy(name, r_name + r_ptr->name);
8800 if (quest[i].max_num > 1)
8803 sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8804 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8807 sprintf(note," - kill %d %s, have killed %d.",
8808 quest[i].max_num, name, quest[i].cur_num);
8813 sprintf(note," - %s¤òÅݤ¹¡£",name);
8815 sprintf(note," - kill %s.",name);
8819 case QUEST_TYPE_FIND_ARTIFACT:
8820 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8822 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8824 sprintf(note," - Find out %s.", name);
8828 case QUEST_TYPE_FIND_EXIT:
8830 sprintf(note," - õº÷¤¹¤ë¡£");
8832 sprintf(note," - Search.");
8836 case QUEST_TYPE_KILL_NUMBER:
8838 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8839 quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8841 sprintf(note," - Kill %d monsters, have killed %d.",
8842 quest[i].max_num, quest[i].cur_num);
8846 case QUEST_TYPE_KILL_ALL:
8848 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8850 sprintf(note," - Kill all monsters.");
8856 /* Print the quest info */
8858 sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8859 quest[i].name, quest[i].level, note);
8861 sprintf(tmp_str, " %s (Danger level: %d)%s\n",
8862 quest[i].name, quest[i].level, note);
8865 fprintf(fff, tmp_str);
8867 if (quest[i].status == QUEST_STATUS_COMPLETED)
8870 sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8872 sprintf(tmp_str, " Quest Completed - Unrewarded\n");
8874 fprintf(fff, tmp_str);
8880 while (quest_text[j][0] && j < 10)
8882 fprintf(fff, " %s\n", quest_text[j]);
8887 else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8890 rand_level = quest[i].level;
8892 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8894 /* Print the quest info */
8895 r_ptr = &r_info[quest[i].r_idx];
8896 strcpy(name, r_name + r_ptr->name);
8898 if (quest[i].max_num > 1)
8901 sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8902 quest[i].name, quest[i].level,
8903 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8907 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n",
8908 quest[i].name, quest[i].level,
8909 quest[i].max_num, name, quest[i].cur_num);
8915 sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8916 quest[i].name, quest[i].level, name);
8918 sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n",
8919 quest[i].name, quest[i].level, name);
8927 /* Print the current random quest */
8928 if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8931 if (!total) fprintf(fff, " ¤Ê¤·\n");
8933 if (!total) fprintf(fff, " Nothing.\n");
8939 * Print all finished quests
8941 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8948 fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8950 fprintf(fff, "< Completed Quest >\n");
8952 for (i = 1; i < max_quests; i++)
8954 int q_idx = quest_num[i];
8956 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8958 if (is_fixed_quest_idx(q_idx))
8960 /* Set the quest number temporary */
8961 int old_quest = p_ptr->inside_quest;
8963 p_ptr->inside_quest = q_idx;
8966 init_flags = INIT_ASSIGN;
8968 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8970 /* Reset the old quest number */
8971 p_ptr->inside_quest = old_quest;
8973 /* No info from "silent" quests */
8974 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8979 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8981 /* Print the quest info */
8983 if (quest[q_idx].complev == 0)
8987 " %-40s (%3d³¬) - ÉÔÀᄀ\n",
8989 " %-40s (Dungeon level: %3d) - (Cancelled)\n",
8991 r_name+r_info[quest[q_idx].r_idx].name,
8992 quest[q_idx].level);
8998 " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
9000 " %-40s (Dungeon level: %3d) - level %2d\n",
9002 r_name+r_info[quest[q_idx].r_idx].name,
9004 quest[q_idx].complev);
9009 /* Print the quest info */
9011 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
9012 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9014 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
9015 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9019 fprintf(fff, tmp_str);
9023 if (!total) fprintf(fff, " ¤Ê¤·\n");
9025 if (!total) fprintf(fff, " Nothing.\n");
9031 * Print all failed quests
9033 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
9040 fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
9042 fprintf(fff, "< Failed Quest >\n");
9044 for (i = 1; i < max_quests; i++)
9046 int q_idx = quest_num[i];
9048 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
9050 if (is_fixed_quest_idx(q_idx))
9052 /* Set the quest number temporary */
9053 int old_quest = p_ptr->inside_quest;
9055 p_ptr->inside_quest = q_idx;
9057 /* Get the quest text */
9058 init_flags = INIT_ASSIGN;
9060 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
9062 /* Reset the old quest number */
9063 p_ptr->inside_quest = old_quest;
9065 /* No info from "silent" quests */
9066 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
9071 if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
9073 /* Print the quest info */
9075 sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n",
9076 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
9078 sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n",
9079 r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
9084 /* Print the quest info */
9086 sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
9087 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9089 sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n",
9090 quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
9093 fprintf(fff, tmp_str);
9097 if (!total) fprintf(fff, " ¤Ê¤·\n");
9099 if (!total) fprintf(fff, " Nothing.\n");
9105 * Print all random quests
9107 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
9114 fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
9116 fprintf(fff, "< Remaining Random Quest >\n");
9118 for (i = 1; i < max_quests; i++)
9120 /* No info from "silent" quests */
9121 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
9123 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
9127 /* Print the quest info */
9129 sprintf(tmp_str, " %s (%d³¬, %s)\n",
9130 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9132 sprintf(tmp_str, " %s (%d, %s)\n",
9133 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9135 fprintf(fff, tmp_str);
9139 if (!total) fprintf(fff, " ¤Ê¤·\n");
9141 if (!total) fprintf(fff, " Nothing.\n");
9146 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
9148 int *q_num = (int *)u;
9149 quest_type *qa = &quest[q_num[a]];
9150 quest_type *qb = &quest[q_num[b]];
9155 if (qa->complev < qb->complev) return TRUE;
9156 if (qa->complev > qb->complev) return FALSE;
9157 if (qa->level <= qb->level) return TRUE;
9161 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9163 int *q_num = (int *)u;
9170 q_num[a] = q_num[b];
9176 * Print quest status of all active quests
9178 static void do_cmd_knowledge_quests(void)
9181 char file_name[1024];
9182 int *quest_num, dummy, i;
9184 /* Open a new file */
9185 fff = my_fopen_temp(file_name, 1024);
9189 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9191 msg_format("Failed to create temporary file %s.", file_name);
9197 /* Allocate Memory */
9198 C_MAKE(quest_num, max_quests, int);
9200 /* Sort by compete level */
9201 for (i = 1; i < max_quests; i++) quest_num[i] = i;
9202 ang_sort_comp = ang_sort_comp_quest_num;
9203 ang_sort_swap = ang_sort_swap_quest_num;
9204 ang_sort(quest_num, &dummy, max_quests);
9206 /* Dump Quest Information */
9207 do_cmd_knowledge_quests_current(fff);
9209 do_cmd_knowledge_quests_completed(fff, quest_num);
9211 do_cmd_knowledge_quests_failed(fff, quest_num);
9215 do_cmd_knowledge_quests_wiz_random(fff);
9218 /* Close the file */
9221 /* Display the file contents */
9223 show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9225 show_file(TRUE, file_name, "Quest status", 0, 0);
9228 /* Remove the file */
9232 C_KILL(quest_num, max_quests, int);
9239 static void do_cmd_knowledge_home(void)
9244 char file_name[1024];
9246 char o_name[MAX_NLEN];
9249 process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9251 /* Open a new file */
9252 fff = my_fopen_temp(file_name, 1024);
9255 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9257 msg_format("Failed to create temporary file %s.", file_name);
9265 /* Print all homes in the different towns */
9266 st_ptr = &town[1].store[STORE_HOME];
9268 /* Home -- if anything there */
9269 if (st_ptr->stock_num)
9274 /* Header with name of the town */
9276 fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9278 fprintf(fff, " [Home Inventory]\n");
9281 /* Dump all available items */
9282 for (i = 0; i < st_ptr->stock_num; i++)
9285 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9286 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9287 if (strlen(o_name) <= 80-3)
9289 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9295 for (n = 0, t = o_name; n < 80-3; n++, t++)
9296 if(iskanji(*t)) {t++; n++;}
9297 if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9299 fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9300 fprintf(fff, " %.77s\n", o_name+n);
9303 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9304 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9309 /* Add an empty line */
9310 fprintf(fff, "\n\n");
9314 /* Close the file */
9317 /* Display the file contents */
9319 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9321 show_file(TRUE, file_name, "Home Inventory", 0, 0);
9325 /* Remove the file */
9331 * Check the status of "autopick"
9333 static void do_cmd_knowledge_autopick(void)
9337 char file_name[1024];
9339 /* Open a new file */
9340 fff = my_fopen_temp(file_name, 1024);
9345 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9347 msg_format("Failed to create temporary file %s.", file_name);
9356 fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9358 fprintf(fff, "No preference for auto picker/destroyer.");
9364 fprintf(fff, " ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9366 fprintf(fff, " There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9370 for (k = 0; k < max_autopick; k++)
9373 byte act = autopick_list[k].action;
9374 if (act & DONT_AUTOPICK)
9382 else if (act & DO_AUTODESTROY)
9390 else if (act & DO_AUTOPICK)
9398 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9407 if (act & DO_DISPLAY)
9408 fprintf(fff, "%11s", format("[%s]", tmp));
9410 fprintf(fff, "%11s", format("(%s)", tmp));
9412 tmp = autopick_line_from_entry(&autopick_list[k]);
9413 fprintf(fff, " %s", tmp);
9417 /* Close the file */
9419 /* Display the file contents */
9421 show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9423 show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9426 /* Remove the file */
9432 * Interact with "knowledge"
9434 void do_cmd_knowledge(void)
9437 /* File type is "TEXT" */
9438 FILE_TYPE(FILE_TYPE_TEXT);
9439 /* Save the screen */
9441 /* Interact until done */
9446 /* Ask for a choice */
9448 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9449 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9451 prt(format("page %d/2", (p+1)), 2, 65);
9452 prt("Display current knowledge", 3, 0);
9455 /* Give some choices */
9458 prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5);
9459 prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5);
9460 prt("(3) ´ûÃΤÎÀ¸¤¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9461 prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5);
9462 prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5);
9463 if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5);
9464 prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5);
9465 prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5);
9466 prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ ¤Î°ìÍ÷", 14, 5);
9467 prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5);
9469 prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5);
9470 prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5);
9471 prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5);
9472 prt("(d) ËâË¡¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 9, 5);
9473 prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 10, 5);
9474 prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ ¤Î°ìÍ÷", 11, 5);
9475 prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó ¤Î°ìÍ÷", 12, 5);
9476 prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È ¤Î°ìÍ÷", 13, 5);
9477 prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5);
9481 prt("(1) Display known artifacts", 6, 5);
9482 prt("(2) Display known objects", 7, 5);
9483 prt("(3) Display remaining uniques", 8, 5);
9484 prt("(4) Display known monster", 9, 5);
9485 prt("(5) Display kill count", 10, 5);
9486 if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9487 prt("(7) Display current pets", 12, 5);
9488 prt("(8) Display home inventory", 13, 5);
9489 prt("(9) Display *identified* equip.", 14, 5);
9490 prt("(0) Display terrain symbols.", 15, 5);
9492 prt("(a) Display about yourself", 6, 5);
9493 prt("(b) Display mutations", 7, 5);
9494 prt("(c) Display weapon proficiency", 8, 5);
9495 prt("(d) Display spell proficiency", 9, 5);
9496 prt("(e) Display misc. proficiency", 10, 5);
9497 prt("(f) Display virtues", 11, 5);
9498 prt("(g) Display dungeons", 12, 5);
9499 prt("(h) Display current quests", 13, 5);
9500 prt("(i) Display auto pick/destroy", 14, 5);
9505 prt("-³¤¯-", 17, 8);
9506 prt("ESC) È´¤±¤ë", 21, 1);
9507 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9508 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9509 prt("¥³¥Þ¥ó¥É:", 20, 0);
9511 prt("-more-", 17, 8);
9512 prt("ESC) Exit menu", 21, 1);
9513 prt("SPACE) Next page", 21, 30);
9514 /*prt("-) Previous page", 21, 60);*/
9515 prt("Command: ", 20, 0);
9521 if (i == ESCAPE) break;
9524 case ' ': /* Page change */
9528 case '1': /* Artifacts */
9529 do_cmd_knowledge_artifacts();
9531 case '2': /* Objects */
9532 do_cmd_knowledge_objects();
9534 case '3': /* Uniques */
9535 do_cmd_knowledge_uniques();
9537 case '4': /* Monsters */
9538 do_cmd_knowledge_monsters();
9540 case '5': /* Kill count */
9541 do_cmd_knowledge_kill_count();
9543 case '6': /* wanted */
9544 if (!vanilla_town) do_cmd_knowledge_kubi();
9546 case '7': /* Pets */
9547 do_cmd_knowledge_pets();
9549 case '8': /* Home */
9550 do_cmd_knowledge_home();
9552 case '9': /* Resist list */
9553 do_cmd_knowledge_inven();
9555 case '0': /* Feature list */
9556 do_cmd_knowledge_features();
9559 case 'a': /* Max stat */
9560 do_cmd_knowledge_stat();
9562 case 'b': /* Mutations */
9563 do_cmd_knowledge_mutations();
9565 case 'c': /* weapon-exp */
9566 do_cmd_knowledge_weapon_exp();
9568 case 'd': /* spell-exp */
9569 do_cmd_knowledge_spell_exp();
9571 case 'e': /* skill-exp */
9572 do_cmd_knowledge_skill_exp();
9574 case 'f': /* Virtues */
9575 do_cmd_knowledge_virtues();
9577 case 'g': /* Dungeon */
9578 do_cmd_knowledge_dungeon();
9580 case 'h': /* Quests */
9581 do_cmd_knowledge_quests();
9583 case 'i': /* Autopick */
9584 do_cmd_knowledge_autopick();
9586 default: /* Unknown option */
9589 /* Flush messages */
9592 /* Restore the screen */
9598 * Check on the status of an active quest
9600 void do_cmd_checkquest(void)
9602 /* File type is "TEXT" */
9603 FILE_TYPE(FILE_TYPE_TEXT);
9605 /* Save the screen */
9609 do_cmd_knowledge_quests();
9611 /* Restore the screen */
9617 * Display the time and date
9619 void do_cmd_time(void)
9621 int day, hour, min, full, start, end, num;
9628 extract_day_hour_min(&day, &hour, &min);
9630 full = hour * 100 + min;
9638 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9640 strcpy(desc, "It is a strange time.");
9646 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9647 day, (hour % 12 == 0) ? 12 : (hour % 12),
9648 min, (hour < 12) ? "AM" : "PM");
9650 msg_format("This is day %d. The time is %d:%02d %s.",
9651 day, (hour % 12 == 0) ? 12 : (hour % 12),
9652 min, (hour < 12) ? "AM" : "PM");
9657 if (!randint0(10) || p_ptr->image)
9660 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9662 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9669 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9671 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9676 /* Open this file */
9677 fff = my_fopen(buf, "rt");
9682 /* Find this time */
9683 while (!my_fgets(fff, buf, sizeof(buf)))
9685 /* Ignore comments */
9686 if (!buf[0] || (buf[0] == '#')) continue;
9688 /* Ignore invalid lines */
9689 if (buf[1] != ':') continue;
9691 /* Process 'Start' */
9694 /* Extract the starting time */
9695 start = atoi(buf + 2);
9697 /* Assume valid for an hour */
9707 /* Extract the ending time */
9708 end = atoi(buf + 2);
9714 /* Ignore incorrect range */
9715 if ((start > full) || (full > end)) continue;
9717 /* Process 'Description' */
9722 /* Apply the randomizer */
9723 if (!randint0(num)) strcpy(desc, buf + 2);
9733 /* Close the file */