OSDN Git Service

ワーニング除去と、エンバグ修正。
[hengband/hengband.git] / src / cmd4.c
1 /* File: cmd4.c */
2
3 /*
4  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
5  *
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.
9  */
10
11 /* Purpose: Interface commands */
12
13 #include "angband.h"
14
15
16
17 /*
18  * A set of functions to maintain automatic dumps of various kinds.
19  * -Mogami-
20  *
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.
29  *
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
33  * point.
34  *
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.
40  *
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.
47  */
48
49 /*
50  *  Mark strings for auto dump
51  */
52 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
53 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
54
55 /*
56  * Variables for auto dump
57  */
58 static FILE *auto_dump_stream;
59 static cptr auto_dump_mark;
60 static int auto_dump_line_num;
61
62 /*
63  * Remove old lines automatically generated before.
64  */
65 static void remove_auto_dump(cptr orig_file)
66 {
67         FILE *tmp_fff, *orig_fff;
68
69         char tmp_file[1024];
70         char buf[1024];
71         bool between_mark = FALSE;
72         bool changed = FALSE;
73         int line_num = 0;
74         long header_location = 0;
75         char header_mark_str[80];
76         char footer_mark_str[80];
77         size_t mark_len;
78
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);
82
83         mark_len = strlen(footer_mark_str);
84
85         /* Open an old dump file in read-only mode */
86         orig_fff = my_fopen(orig_file, "r");
87
88         /* If original file does not exist, nothing to do */
89         if (!orig_fff) return;
90
91         /* Open a new (temporary) file */
92         tmp_fff = my_fopen_temp(tmp_file, 1024);
93
94         if (!tmp_fff)
95         {
96 #ifdef JP
97             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", tmp_file);
98 #else
99             msg_format("Failed to create temporary file %s.", tmp_file);
100 #endif
101             msg_print(NULL);
102             return;
103         }
104
105         /* Loop for every line */
106         while (TRUE)
107         {
108                 /* Read a line */
109                 if (my_fgets(orig_fff, buf, sizeof(buf)))
110                 {
111                         /* Read error: Assume End of File */
112
113                         /*
114                          * Was looking for the footer, but not found.
115                          *
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,
119                          * and read again.
120                          */
121                         if (between_mark)
122                         {
123                                 fseek(orig_fff, header_location, SEEK_SET);
124                                 between_mark = FALSE;
125                                 continue;
126                         }
127
128                         /* Success -- End the loop */
129                         else
130                         {
131                                 break;
132                         }
133                 }
134
135                 /* We are looking for the header mark of automatic dump */
136                 if (!between_mark)
137                 {
138                         /* Is this line a header? */
139                         if (!strcmp(buf, header_mark_str))
140                         {
141                                 /* Memorise seek point of this line */
142                                 header_location = ftell(orig_fff);
143
144                                 /* Initialize counter for number of lines */
145                                 line_num = 0;
146
147                                 /* Look for the footer from now */
148                                 between_mark = TRUE;
149
150                                 /* There are some changes */
151                                 changed = TRUE;
152                         }
153
154                         /* Not a header */
155                         else
156                         {
157                                 /* Copy orginally lines */
158                                 fprintf(tmp_fff, "%s\n", buf);
159                         }
160                 }
161
162                 /* We are looking for the footer mark of automatic dump */
163                 else
164                 {
165                         /* Is this line a footer? */
166                         if (!strncmp(buf, footer_mark_str, mark_len))
167                         {
168                                 int tmp;
169
170                                 /*
171                                  * Compare the number of lines
172                                  *
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.
180                                  */
181                                 if (!sscanf(buf + mark_len, " (%d)", &tmp)
182                                     || tmp != line_num)
183                                 {
184                                         fseek(orig_fff, header_location, SEEK_SET);
185                                 }
186
187                                 /* Look for another header */
188                                 between_mark = FALSE;
189                         }
190
191                         /* Not a footer */
192                         else
193                         {
194                                 /* Ignore old line, and count number of lines */
195                                 line_num++;
196                         }
197                 }
198         }
199
200         /* Close files */
201         my_fclose(orig_fff);
202         my_fclose(tmp_fff);
203
204         /* If there are some changes, overwrite the original file with new one */
205         if (changed)
206         {
207                 /* Copy contents of temporary file */
208
209                 tmp_fff = my_fopen(tmp_file, "r");
210                 orig_fff = my_fopen(orig_file, "w");
211
212                 while (!my_fgets(tmp_fff, buf, sizeof(buf)))
213                         fprintf(orig_fff, "%s\n", buf);
214
215                 my_fclose(orig_fff);
216                 my_fclose(tmp_fff);
217         }
218
219         /* Kill the temporary file */
220         fd_kill(tmp_file);
221
222         return;
223 }
224
225
226 /*
227  * Dump a formatted line, using "vstrnfmt()".
228  */
229 static void auto_dump_printf(cptr fmt, ...)
230 {
231         cptr p;
232         va_list vp;
233
234         char buf[1024];
235
236         /* Begin the Varargs Stuff */
237         va_start(vp, fmt);
238
239         /* Format the args, save the length */
240         (void)vstrnfmt(buf, sizeof(buf), fmt, vp);
241
242         /* End the Varargs Stuff */
243         va_end(vp);
244
245         /* Count number of lines */
246         for (p = buf; *p; p++)
247         {
248                 if (*p == '\n') auto_dump_line_num++;
249         }
250
251         /* Dump it */
252         fprintf(auto_dump_stream, "%s", buf);
253 }
254
255
256 /*
257  *  Open file to append auto dump.
258  */
259 static bool open_auto_dump(cptr buf, cptr mark)
260 {
261
262         char header_mark_str[80];
263
264         /* Save the mark string */
265         auto_dump_mark = mark;
266
267         /* Prepare a header mark string */
268         sprintf(header_mark_str, auto_dump_header, auto_dump_mark);
269
270         /* Remove old macro dumps */
271         remove_auto_dump(buf);
272
273         /* Append to the file */
274         auto_dump_stream = my_fopen(buf, "a");
275
276         /* Failure */
277         if (!auto_dump_stream) {
278 #ifdef JP
279                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
280 #else
281                 msg_format("Failed to open %s.", buf);
282 #endif
283                 msg_print(NULL);
284
285                 /* Failed */
286                 return FALSE;
287         }
288
289         /* Start dumping */
290         fprintf(auto_dump_stream, "%s\n", header_mark_str);
291
292         /* Initialize counter */
293         auto_dump_line_num = 0;
294
295 #ifdef JP
296         auto_dump_printf("# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
297         auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
298 #else
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");
301 #endif
302
303         /* Success */
304         return TRUE;
305 }
306
307 /*
308  *  Append foot part and close auto dump.
309  */
310 static void close_auto_dump(void)
311 {
312         char footer_mark_str[80];
313
314         /* Prepare a footer mark string */
315         sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark);
316
317 #ifdef JP
318         auto_dump_printf("# *·Ù¹ð!!* °Ê¾å¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
319         auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
320 #else
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");
323 #endif
324
325         /* End of dump */
326         fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num);
327
328         /* Close */
329         my_fclose(auto_dump_stream);
330
331         return;
332 }
333
334
335 #ifndef JP
336 /*
337  * Return suffix of ordinal number
338  */
339 cptr get_ordinal_number_suffix(int num)
340 {
341         num = ABS(num) % 100;
342         switch (num % 10)
343         {
344         case 1:
345                 return (num == 11) ? "th" : "st";
346         case 2:
347                 return (num == 12) ? "th" : "nd";
348         case 3:
349                 return (num == 13) ? "th" : "rd";
350         default:
351                 return "th";
352         }
353 }
354 #endif
355
356
357 /*
358  *   Take note to the diary.
359  */
360 errr do_cmd_write_nikki(int type, int num, cptr note)
361 {
362         int day, hour, min;
363         FILE *fff = NULL;
364         char file_name[80];
365         char buf[1024];
366         cptr note_level = "";
367         bool do_level = TRUE;
368         char note_level_buf[40];
369         int q_idx;
370
371         static bool disable_nikki = FALSE;
372
373         extract_day_hour_min(&day, &hour, &min);
374
375         if (disable_nikki) return(-1);
376
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)
382         {
383                 int old_quest;
384
385                 old_quest = p_ptr->inside_quest;
386                 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
387
388                 /* Get the quest text */
389                 init_flags = INIT_ASSIGN;
390
391                 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
392
393                 /* Reset the old quest number */
394                 p_ptr->inside_quest = old_quest;
395         }
396
397 #ifdef JP
398         sprintf(file_name,"playrecord-%s.txt",savefile_base);
399 #else
400         /* different filne name to avoid mixing */
401         sprintf(file_name,"playrec-%s.txt",savefile_base);
402 #endif
403
404         /* Build the filename */
405         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
406
407         /* File type is "TEXT" */
408         FILE_TYPE(FILE_TYPE_TEXT);
409
410         fff = my_fopen(buf, "a");
411
412         /* Failure */
413         if (!fff)
414         {
415 #ifdef JP
416                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£¥×¥ì¥¤µ­Ï¿¤ò°ì»þÄä»ß¤·¤Þ¤¹¡£", buf);
417 #else
418                 msg_format("Failed to open %s. Play-Record is disabled temporally.", buf);
419 #endif
420                 msg_format(NULL);
421                 disable_nikki=TRUE;
422                 return (-1);
423         }
424
425         q_idx = quest_number(dun_level);
426
427         if (write_level)
428         {
429                 if (p_ptr->inside_arena)
430 #ifdef JP
431                         note_level = "¥¢¥ê¡¼¥Ê:";
432 #else
433                         note_level = "Arane:";
434 #endif
435                 else if (!dun_level)
436 #ifdef JP
437                         note_level = "ÃϾå:";
438 #else
439                         note_level = "Surface:";
440 #endif
441                 else if (q_idx && (is_fixed_quest_idx(q_idx)
442                          && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
443 #ifdef JP
444                         note_level = "¥¯¥¨¥¹¥È:";
445 #else
446                         note_level = "Quest:";
447 #endif
448                 else
449                 {
450 #ifdef JP
451                         sprintf(note_level_buf, "%d³¬(%s):", dun_level, d_name+d_info[dungeon_type].name);
452 #else
453                         sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, dun_level);
454 #endif
455                         note_level = note_level_buf;
456                 }
457         }
458
459         switch(type)
460         {
461                 case NIKKI_HIGAWARI:
462                 {
463 #ifdef JP
464                         fprintf(fff, "%dÆüÌÜ\n",day);
465 #else
466                         fprintf(fff, "Day %d\n",day);
467 #endif
468                         do_level = FALSE;
469                         break;
470                 }
471                 case NIKKI_BUNSHOU:
472                 {
473                         if (num)
474                         {
475                                 fprintf(fff, "%s\n",note);
476                                 do_level = FALSE;
477                         }
478                         else
479                                 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
480                         break;
481                 }
482                 case NIKKI_ART:
483                 {
484 #ifdef JP
485                         fprintf(fff, " %2d:%02d %20s %s¤òȯ¸«¤·¤¿¡£\n", hour, min, note_level, note);
486 #else
487                         fprintf(fff, " %2d:%02d %20s discovered %s.\n", hour, min, note_level, note);
488 #endif
489                         break;
490                 }
491                 case NIKKI_UNIQUE:
492                 {
493 #ifdef JP
494                         fprintf(fff, " %2d:%02d %20s %s¤òÅݤ·¤¿¡£\n", hour, min, note_level, note);
495 #else
496                         fprintf(fff, " %2d:%02d %20s defeated %s.\n", hour, min, note_level, note);
497 #endif
498                         break;
499                 }
500                 case NIKKI_FIX_QUEST_C:
501                 {
502                         if (quest[num].flags & QUEST_FLAG_SILENT) break;
503 #ifdef JP
504                         fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
505 #else
506                         fprintf(fff, " %2d:%02d %20s completed quest '%s'.\n", hour, min, note_level, quest[num].name);
507 #endif
508                         break;
509                 }
510                 case NIKKI_FIX_QUEST_F:
511                 {
512                         if (quest[num].flags & QUEST_FLAG_SILENT) break;
513 #ifdef JP
514                         fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤«¤éÌ¿¤«¤é¤¬¤éƨ¤²µ¢¤Ã¤¿¡£\n", hour, min, note_level, quest[num].name);
515 #else
516                         fprintf(fff, " %2d:%02d %20s run away from quest '%s'.\n", hour, min, note_level, quest[num].name);
517 #endif
518                         break;
519                 }
520                 case NIKKI_RAND_QUEST_C:
521                 {
522                         char name[80];
523                         strcpy(name, r_name+r_info[quest[num].r_idx].name);
524 #ifdef JP
525                         fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, name);
526 #else
527                         fprintf(fff, " %2d:%02d %20s completed randome quest '%s'\n", hour, min, note_level, name);
528 #endif
529                         break;
530                 }
531                 case NIKKI_RAND_QUEST_F:
532                 {
533                         char name[80];
534                         strcpy(name, r_name+r_info[quest[num].r_idx].name);
535 #ifdef JP
536                         fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤«¤éƨ¤²½Ð¤·¤¿¡£\n", hour, min, note_level, name);
537 #else
538                         fprintf(fff, " %2d:%02d %20s ran away from quest '%s'.\n", hour, min, note_level, name);
539 #endif
540                         break;
541                 }
542                 case NIKKI_MAXDEAPTH:
543                 {
544 #ifdef JP
545                         fprintf(fff, " %2d:%02d %20s %s¤ÎºÇ¿¼³¬%d³¬¤ËÅþ㤷¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, num);
546 #else
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);
548 #endif
549                         break;
550                 }
551                 case NIKKI_TRUMP:
552                 {
553 #ifdef JP
554                         fprintf(fff, " %2d:%02d %20s %s%s¤ÎºÇ¿¼³¬¤ò%d³¬¤Ë¥»¥Ã¥È¤·¤¿¡£\n", hour, min, note_level, note, d_name + d_info[num].name, max_dlv[num]);
555 #else
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);
557 #endif
558                         break;
559                 }
560                 case NIKKI_STAIR:
561                 {
562                         cptr to;
563                         if (q_idx && (is_fixed_quest_idx(q_idx)
564                              && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
565                         {
566 #ifdef JP
567                                 to = "ÃϾå";
568 #else
569                                 to = "the surface";
570 #endif
571                         }
572                         else
573                         {
574 #ifdef JP
575                                 if (!(dun_level+num)) to = "ÃϾå";
576                                 else to = format("%d³¬", dun_level+num);
577 #else
578                                 if (!(dun_level+num)) to = "the surface";
579                                 else to = format("level %d", dun_level+num);
580 #endif
581                         }
582
583 #ifdef JP 
584                         fprintf(fff, " %2d:%02d %20s %s¤Ø%s¡£\n", hour, min, note_level, to, note);
585 #else
586                         fprintf(fff, " %2d:%02d %20s %s %s.\n", hour, min, note_level, note, to);
587 #endif
588                         break;
589                 }
590                 case NIKKI_RECALL:
591                 {
592                         if (!num)
593 #ifdef JP
594                                 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤Æ%s¤Î%d³¬¤Ø²¼¤ê¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, max_dlv[dungeon_type]);
595 #else
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);
597 #endif
598                         else
599 #ifdef JP
600                                 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤ÆÃϾå¤Ø¤ÈÌá¤Ã¤¿¡£\n", hour, min, note_level);
601 #else
602                                 fprintf(fff, " %2d:%02d %20s recalled from dungeon to surface.\n", hour, min, note_level);
603 #endif
604                         break;
605                 }
606                 case NIKKI_TO_QUEST:
607                 {
608                         if (quest[num].flags & QUEST_FLAG_SILENT) break;
609 #ifdef JP
610                         fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤Ø¤ÈÆÍÆþ¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
611 #else
612                         fprintf(fff, " %2d:%02d %20s entered the quest '%s'.\n", hour, min, note_level, quest[num].name);
613 #endif
614                         break;
615                 }
616                 case NIKKI_TELE_LEV:
617                 {
618 #ifdef JP
619                         fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¡¦¥Æ¥ì¥Ý¡¼¥È¤Çæ½Ð¤·¤¿¡£\n", hour, min, note_level);
620 #else
621                         fprintf(fff, " %2d:%02d %20s Got out using teleport level.\n", hour, min, note_level);
622 #endif
623                         break;
624                 }
625                 case NIKKI_BUY:
626                 {
627 #ifdef JP
628                         fprintf(fff, " %2d:%02d %20s %s¤ò¹ØÆþ¤·¤¿¡£\n", hour, min, note_level, note);
629 #else
630                         fprintf(fff, " %2d:%02d %20s bought %s.\n", hour, min, note_level, note);
631 #endif
632                         break;
633                 }
634                 case NIKKI_SELL:
635                 {
636 #ifdef JP
637                         fprintf(fff, " %2d:%02d %20s %s¤òÇäµÑ¤·¤¿¡£\n", hour, min, note_level, note);
638 #else
639                         fprintf(fff, " %2d:%02d %20s sold %s.\n", hour, min, note_level, note);
640 #endif
641                         break;
642                 }
643                 case NIKKI_ARENA:
644                 {
645                         if (num < 0)
646                         {
647 #ifdef JP
648                                 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï¤Ç¡¢%s¤ÎÁ°¤ËÇÔ¤ìµî¤Ã¤¿¡£\n", hour, min, note_level, -num, note);
649 #else
650                                 int n = -num;
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));
652 #endif
653                                 break;
654                         }
655 #ifdef JP
656                         fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï(%s)¤Ë¾¡Íø¤·¤¿¡£\n", hour, min, note_level, num, note);
657 #else
658                         fprintf(fff, " %2d:%02d %20s won the %d%s fight (%s).\n", hour, min, note_level, num, get_ordinal_number_suffix(num), note);
659 #endif
660                         if (num == MAX_ARENA_MONS)
661                         {
662 #ifdef JP
663                                 fprintf(fff, "                 Æ®µ»¾ì¤Î¤¹¤Ù¤Æ¤ÎŨ¤Ë¾¡Íø¤·¡¢¥Á¥ã¥ó¥Ô¥ª¥ó¤È¤Ê¤Ã¤¿¡£\n");
664 #else
665                                 fprintf(fff, "                 won all fight to become a Chanpion.\n");
666 #endif
667                                 do_level = FALSE;
668                         }
669                         break;
670                 }
671                 case NIKKI_HANMEI:
672                 {
673 #ifdef JP
674                         fprintf(fff, " %2d:%02d %20s %s¤ò¼±Ê̤·¤¿¡£\n", hour, min, note_level, note);
675 #else
676                         fprintf(fff, " %2d:%02d %20s identified %s.\n", hour, min, note_level, note);
677 #endif
678                         break;
679                 }
680                 case NIKKI_WIZ_TELE:
681                 {
682                         cptr to;
683                         if (!dun_level)
684 #ifdef JP
685                                 to = "ÃϾå";
686 #else
687                                 to = "the surface";
688 #endif
689                         else
690 #ifdef JP
691                                 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
692 #else
693                                 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
694 #endif
695
696 #ifdef JP
697                         fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥¦¥£¥¶¡¼¥É¡¦¥Æ¥ì¥Ý¡¼¥È¤Ç°ÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
698 #else
699                         fprintf(fff, " %2d:%02d %20s wizard-teleport to %s.\n", hour, min, note_level, to);
700 #endif
701                         break;
702                 }
703                 case NIKKI_PAT_TELE:
704                 {
705                         cptr to;
706                         if (!dun_level)
707 #ifdef JP
708                                 to = "ÃϾå";
709 #else
710                                 to = "the surface";
711 #endif
712                         else
713 #ifdef JP
714                                 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
715 #else
716                                 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
717 #endif
718
719 #ifdef JP
720                         fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥Ñ¥¿¡¼¥ó¤ÎÎϤǰÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
721 #else
722                         fprintf(fff, " %2d:%02d %20s used Pattern to teleport to %s.\n", hour, min, note_level, to);
723 #endif
724                         break;
725                 }
726                 case NIKKI_LEVELUP:
727                 {
728 #ifdef JP
729                         fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¤¬%d¤Ë¾å¤¬¤Ã¤¿¡£\n", hour, min, note_level, num);
730 #else
731                         fprintf(fff, " %2d:%02d %20s reached player level %d.\n", hour, min, note_level, num);
732 #endif
733                         break;
734                 }
735                 case NIKKI_GAMESTART:
736                 {
737                         time_t ct = time((time_t*)0);
738                         do_level = FALSE;
739                         if (num)
740                         {
741                                 fprintf(fff, "%s %s",note, ctime(&ct));
742                         }
743                         else
744                                 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
745                         break;
746                 }
747                 case NIKKI_NAMED_PET:
748                 {
749                         fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
750                         switch (num)
751                         {
752                                 case 0:
753 #ifdef JP
754                                         fprintf(fff, "%s¤òι¤Îͧ¤Ë¤¹¤ë¤³¤È¤Ë·è¤á¤¿¡£\n", note);
755 #else
756                                         fprintf(fff, "decided to travel together with %s.\n", note);
757 #endif
758                                         break;
759                                 case 1:
760 #ifdef JP
761                                         fprintf(fff, "%s¤Î̾Á°¤ò¾Ã¤·¤¿¡£\n", note);
762 #else
763                                         fprintf(fff, "unnamed %s.\n", note);
764 #endif
765                                         break;
766                                 case 2:
767 #ifdef JP
768                                         fprintf(fff, "%s¤ò²òÊü¤·¤¿¡£\n", note);
769 #else
770                                         fprintf(fff, "dismissed %s.\n", note);
771 #endif
772                                         break;
773                                 case 3:
774 #ifdef JP
775                                         fprintf(fff, "%s¤¬»à¤ó¤Ç¤·¤Þ¤Ã¤¿¡£\n", note);
776 #else
777                                         fprintf(fff, "%s died.\n", note);
778 #endif
779                                         break;
780                                 case 4:
781 #ifdef JP
782                                         fprintf(fff, "%s¤ò¤ª¤¤¤ÆÊ̤ΥޥåפذÜÆ°¤·¤¿¡£\n", note);
783 #else
784                                         fprintf(fff, "moved to another map leaving %s behind.\n", note);
785 #endif
786                                         break;
787                                 case 5:
788 #ifdef JP
789                                         fprintf(fff, "%s¤È¤Ï¤°¤ì¤Æ¤·¤Þ¤Ã¤¿¡£\n", note);
790 #else
791                                         fprintf(fff, "lost sight of %s.\n", note);
792 #endif
793                                         break;
794                                 case 6:
795 #ifdef JP
796                                         fprintf(fff, "%s¤¬*Ç˲õ*¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note);
797 #else
798                                         fprintf(fff, "%s was made disappeared by *destruction*.\n", note);
799 #endif
800                                         break;
801                                 case 7:
802 #ifdef JP
803                                         fprintf(fff, "%s¤¬´äÀФ˲¡¤·ÄÙ¤µ¤ì¤¿¡£\n", note);
804 #else
805                                         fprintf(fff, "%s was crushed by falling rocks.\n", note);
806 #endif
807                                         break;
808                                 default:
809                                         fprintf(fff, "\n");
810                                         break;
811                         }
812                         break;
813                 }
814                 default:
815                         break;
816         }
817
818         my_fclose(fff);
819
820         if (do_level) write_level = FALSE;
821
822         return (0);
823 }
824
825
826 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
827
828 static void do_cmd_disp_nikki(void)
829 {
830         char nikki_title[256];
831         char file_name[80];
832         char buf[1024];
833         char tmp[80];
834 #ifdef JP
835         static const char subtitle[][30] = {"ºÇ¶¯¤ÎÆùÂΤòµá¤á¤Æ",
836                                            "¿ÍÀ¸¤½¤ì¤Ï¤Ï¤«¤Ê¤¤",
837                                            "ÌÀÆü¤Ë¸þ¤«¤Ã¤Æ",
838                                            "꤫¤é¤Ü¤¿¤â¤Á",
839                                            "¤¢¤È¤Îº×¤ê",
840                                            "¤½¤ì¤Ï¤¤¤¤¹Í¤¨¤À",
841                                            "²¿¤È¤Ç¤â¸À¤¨",
842                                            "ÅƤˤâ³Ñ¤Ë¤â",
843                                            "¥¦¥½¤À¤±¤É",
844                                            "¤â¤Ï¤ä¤³¤ì¤Þ¤Ç",
845                                            "¤Ê¤ó¤Ç¤³¤¦¤Ê¤ë¤Î",
846                                            "¤½¤ì¤Ï̵Íý¤À",
847                                            "Åݤ¹¤Ù¤­Å¨¤Ï¥²¡û¥Ä",
848                                            "¤ó¡Á¡©Ê¹¤³¤¨¤ó¤Ê¤¡",
849                                            "¥ª¥ì¤Î̾¤ò¸À¤Ã¤Æ¤ß¤í",
850                                            "Ƭ¤¬ÊѤˤʤäÁ¤ã¤Ã¤¿",
851                                            "¸ß´¹¤·¤Þ¤»¤ó",
852                                            "¤»¤Ã¤«¤¯¤À¤«¤é",
853                                            "¤Þ¤À¤Þ¤À´Å¤¤¤Í",
854                                            "¤à¤´¤¤¤à¤´¤¹¤®¤ë",
855                                            "¤³¤ó¤Ê¤â¤ó¤¸¤ã¤Ê¤¤",
856                                            "¤À¤á¤À¤³¤ê¤ã",
857                                            "¼¡¤¤¤Ã¤Æ¤ß¤è¤¦",
858                                            "¤Á¤ç¤Ã¤È¤À¤±¤è",
859                                            "°¥¤·¤­ËÁ¸±¼Ô",
860                                            "Ìî˾¤Î²Ì¤Æ",
861                                            "̵¸ÂÃϹö",
862                                            "¿À¤Ë·ö²Þ¤òÇä¤ë¼Ô",
863                                            "̤ÃΤÎÀ¤³¦¤Ø",
864                                            "ºÇ¹â¤ÎƬǾ¤òµá¤á¤Æ"};
865 #else
866         static const char subtitle[][51] ={"Quest of The World's Toughest Body",
867                                            "Attack is the best form of defence.",
868                                            "Might is right.",
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",
897                                            "Time is money.",
898                                            "Quest of The World's Greatest Brain"};
899 #endif
900 #ifdef JP
901         sprintf(file_name,"playrecord-%s.txt",savefile_base);
902 #else
903         sprintf(file_name,"playrec-%s.txt",savefile_base);
904 #endif
905
906         /* Build the filename */
907         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
908
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]);
914
915 #ifdef JP
916         sprintf(nikki_title, "¡Ö%s%s%s¤ÎÅÁÀâ -%s-¡×",
917                 ap_ptr->title, ap_ptr->no ? "¤Î" : "", player_name, tmp);
918 #else
919         sprintf(nikki_title, "Legend of %s %s '%s'",
920                 ap_ptr->title, player_name, tmp);
921 #endif
922
923         /* Display the file contents */
924         show_file(FALSE, buf, nikki_title, -1, 0);
925 }
926
927 static void do_cmd_bunshou(void)
928 {
929         char tmp[80] = "\0";
930         char bunshou[80] = "\0";
931
932 #ifdef JP
933         if (get_string("ÆâÍÆ: ", tmp, 79))
934 #else
935         if (get_string("diary note: ", tmp, 79))
936 #endif
937         {
938                 strcpy(bunshou, tmp);
939
940                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
941         }
942 }
943
944 static void do_cmd_last_get(void)
945 {
946         char buf[256];
947         s32b turn_tmp;
948
949         if (record_o_name[0] == '\0') return;
950
951 #ifdef JP
952         sprintf(buf,"%s¤ÎÆþ¼ê¤òµ­Ï¿¤·¤Þ¤¹¡£",record_o_name);
953 #else
954         sprintf(buf,"Do you really want to record getting %s? ",record_o_name);
955 #endif
956         if (!get_check(buf)) return;
957
958         turn_tmp = turn;
959         turn = record_turn;
960 #ifdef JP
961         sprintf(buf,"%s¤ò¼ê¤ËÆþ¤ì¤¿¡£", record_o_name);
962 #else
963         sprintf(buf,"descover %s.", record_o_name);
964 #endif
965         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
966         turn = turn_tmp;
967 }
968
969 static void do_cmd_erase_nikki(void)
970 {
971         char file_name[80];
972         char buf[256];
973         FILE *fff = NULL;
974
975 #ifdef JP
976         if (!get_check("ËÜÅö¤Ëµ­Ï¿¤ò¾Ãµî¤·¤Þ¤¹¤«¡©")) return;
977 #else
978         if (!get_check("Do you really want to delete all your record? ")) return;
979 #endif
980
981 #ifdef JP
982         sprintf(file_name,"playrecord-%s.txt",savefile_base);
983 #else
984         sprintf(file_name,"playrec-%s.txt",savefile_base);
985 #endif
986
987         /* Build the filename */
988         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name);
989
990         /* Remove the file */
991         fd_kill(buf);
992
993         fff = my_fopen(buf, "w");
994         if(fff){
995                 my_fclose(fff);
996 #ifdef JP
997                 msg_format("µ­Ï¿¤ò¾Ãµî¤·¤Þ¤·¤¿¡£");
998 #else
999                 msg_format("deleted record.");
1000 #endif
1001         }else{
1002 #ifdef JP
1003                 msg_format("%s ¤Î¾Ãµî¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", buf);
1004 #else
1005                 msg_format("failed to delete %s.", buf);
1006 #endif
1007         }
1008         msg_print(NULL);
1009 }
1010
1011
1012 void do_cmd_nikki(void)
1013 {
1014         int i;
1015
1016         /* File type is "TEXT" */
1017         FILE_TYPE(FILE_TYPE_TEXT);
1018
1019         /* Save the screen */
1020         screen_save();
1021
1022         /* Interact until done */
1023         while (1)
1024         {
1025                 /* Clear screen */
1026                 Term_clear();
1027
1028                 /* Ask for a choice */
1029 #ifdef JP
1030                 prt("[ µ­Ï¿¤ÎÀßÄê ]", 2, 0);
1031 #else
1032                 prt("[ Play Record ]", 2, 0);
1033 #endif
1034
1035
1036                 /* Give some choices */
1037 #ifdef JP
1038                 prt("(1) µ­Ï¿¤ò¸«¤ë", 4, 5);
1039                 prt("(2) Ê¸¾Ï¤òµ­Ï¿¤¹¤ë", 5, 5);
1040                 prt("(3) Ä¾Á°¤ËÆþ¼êËô¤Ï´ÕÄꤷ¤¿¤â¤Î¤òµ­Ï¿¤¹¤ë", 6, 5);
1041                 prt("(4) µ­Ï¿¤ò¾Ãµî¤¹¤ë", 7, 5);
1042 #else
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);
1047 #endif
1048
1049
1050                 /* Prompt */
1051 #ifdef JP
1052                 prt("¥³¥Þ¥ó¥É:", 18, 0);
1053 #else
1054                 prt("Command: ", 18, 0);
1055 #endif
1056
1057
1058                 /* Prompt */
1059                 i = inkey();
1060
1061                 /* Done */
1062                 if (i == ESCAPE) break;
1063
1064                 switch (i)
1065                 {
1066                 case '1':
1067                         do_cmd_disp_nikki();
1068                         break;
1069                 case '2':
1070                         do_cmd_bunshou();
1071                         break;
1072                 case '3':
1073                         do_cmd_last_get();
1074                         break;
1075                 case '4':
1076                         do_cmd_erase_nikki();
1077                         break;
1078                 default: /* Unknown option */
1079                         bell();
1080                 }
1081
1082                 /* Flush messages */
1083                 msg_print(NULL);
1084         }
1085
1086         /* Restore the screen */
1087         screen_load();
1088 }
1089
1090 /*
1091  * Hack -- redraw the screen
1092  *
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.
1096  *
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.
1100  */
1101 void do_cmd_redraw(void)
1102 {
1103         int j;
1104
1105         term *old = Term;
1106
1107
1108         /* Hack -- react to changes */
1109         Term_xtra(TERM_XTRA_REACT, 0);
1110
1111
1112         /* Combine and Reorder the pack (later) */
1113         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
1114
1115
1116         /* Update torch */
1117         p_ptr->update |= (PU_TORCH);
1118
1119         /* Update stuff */
1120         p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
1121
1122         /* Forget lite/view */
1123         p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
1124
1125         /* Update lite/view */
1126         p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
1127
1128         /* Update monsters */
1129         p_ptr->update |= (PU_MONSTERS);
1130
1131         /* Redraw everything */
1132         p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1133
1134         /* Window stuff */
1135         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1136
1137         /* Window stuff */
1138         p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1139
1140         update_playtime();
1141
1142         /* Hack -- update */
1143         handle_stuff();
1144
1145         if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1146
1147
1148         /* Redraw every window */
1149         for (j = 0; j < 8; j++)
1150         {
1151                 /* Dead window */
1152                 if (!angband_term[j]) continue;
1153
1154                 /* Activate */
1155                 Term_activate(angband_term[j]);
1156
1157                 /* Redraw */
1158                 Term_redraw();
1159
1160                 /* Refresh */
1161                 Term_fresh();
1162
1163                 /* Restore */
1164                 Term_activate(old);
1165         }
1166 }
1167
1168
1169 /*
1170  * Hack -- change name
1171  */
1172 void do_cmd_change_name(void)
1173 {
1174         char    c;
1175
1176         int             mode = 0;
1177
1178         char    tmp[160];
1179
1180
1181         /* Save the screen */
1182         screen_save();
1183
1184         /* Forever */
1185         while (1)
1186         {
1187                 update_playtime();
1188
1189                 /* Display the player */
1190                 display_player(mode);
1191
1192                 if (mode == 4)
1193                 {
1194                         mode = 0;
1195                         display_player(mode);
1196                 }
1197
1198                 /* Prompt */
1199 #ifdef JP
1200                 Term_putstr(2, 23, -1, TERM_WHITE,
1201                             "['c'¤Ç̾Á°Êѹ¹, 'f'¤Ç¥Õ¥¡¥¤¥ë¤Ø½ñ½Ð, 'h'¤Ç¥â¡¼¥ÉÊѹ¹, ESC¤Ç½ªÎ»]");
1202 #else
1203                 Term_putstr(2, 23, -1, TERM_WHITE,
1204                         "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1205 #endif
1206
1207
1208                 /* Query */
1209                 c = inkey();
1210
1211                 /* Exit */
1212                 if (c == ESCAPE) break;
1213
1214                 /* Change name */
1215                 if (c == 'c')
1216                 {
1217                         get_name();
1218
1219                         /* Process the player name */
1220                         process_player_name(FALSE);
1221                 }
1222
1223                 /* File dump */
1224                 else if (c == 'f')
1225                 {
1226                         sprintf(tmp, "%s.txt", player_base);
1227 #ifdef JP
1228                         if (get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
1229 #else
1230                         if (get_string("File name: ", tmp, 80))
1231 #endif
1232
1233                         {
1234                                 if (tmp[0] && (tmp[0] != ' '))
1235                                 {
1236                                         file_character(tmp);
1237                                 }
1238                         }
1239                 }
1240
1241                 /* Toggle mode */
1242                 else if (c == 'h')
1243                 {
1244                         mode++;
1245                 }
1246
1247                 /* Oops */
1248                 else
1249                 {
1250                         bell();
1251                 }
1252
1253                 /* Flush messages */
1254                 msg_print(NULL);
1255         }
1256
1257         /* Restore the screen */
1258         screen_load();
1259
1260         /* Redraw everything */
1261         p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1262
1263         handle_stuff();
1264 }
1265
1266
1267 /*
1268  * Recall the most recent message
1269  */
1270 void do_cmd_message_one(void)
1271 {
1272         /* Recall one message XXX XXX XXX */
1273         prt(format("> %s", message_str(0)), 0, 0);
1274 }
1275
1276
1277 /*
1278  * Show previous messages to the user   -BEN-
1279  *
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.
1282  *
1283  * This command shows you which commands you are viewing, and allows
1284  * you to "search" for strings in the recall.
1285  *
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.
1289  *
1290  * Attempt to only hilite the matching portions of the string.
1291  */
1292 void do_cmd_messages(int num_now)
1293 {
1294         int i, n;
1295
1296         char shower[80];
1297         char finder[80];
1298         int wid, hgt;
1299         int num_lines;
1300
1301         /* Get size */
1302         Term_get_size(&wid, &hgt);
1303
1304         /* Number of message lines in a screen */
1305         num_lines = hgt - 4;
1306
1307         /* Wipe finder */
1308         strcpy(finder, "");
1309
1310         /* Wipe shower */
1311         strcpy(shower, "");
1312
1313
1314         /* Total messages */
1315         n = message_num();
1316
1317         /* Start on first message */
1318         i = 0;
1319
1320         /* Save the screen */
1321         screen_save();
1322
1323         /* Clear screen */
1324         Term_clear();
1325
1326         /* Process requests until done */
1327         while (1)
1328         {
1329                 int j;
1330                 int skey;
1331
1332                 /* Dump up to 20 lines of messages */
1333                 for (j = 0; (j < num_lines) && (i + j < n); j++)
1334                 {
1335                         cptr msg = message_str(i+j);
1336
1337                         /* Dump the messages, bottom to top */
1338                         c_prt((i+j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
1339
1340                         /* Hilite "shower" */
1341                         if (shower[0])
1342                         {
1343                                 cptr str = msg;
1344
1345                                 /* Display matches */
1346                                 while ((str = my_strstr(str, shower)) != NULL)
1347                                 {
1348                                         int len = strlen(shower);
1349
1350                                         /* Display the match */
1351                                         Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
1352
1353                                         /* Advance */
1354                                         str += len;
1355                                 }
1356                         }
1357                 }
1358
1359                 /* Erase remaining lines */
1360                 for (; j < num_lines; j++)
1361                 {
1362                         Term_erase(0, num_lines + 1 - j, 255);
1363                 }
1364
1365                 /* Display header XXX XXX XXX */
1366 #ifdef JP
1367                 /* translation */
1368                 prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d)",
1369                            i, i+j-1, n), 0, 0);
1370 #else
1371                 prt(format("Message Recall (%d-%d of %d)",
1372                            i, i+j-1, n), 0, 0);
1373 #endif
1374
1375
1376                 /* Display prompt (not very informative) */
1377 #ifdef JP
1378                 prt("[ 'p' ¤Ç¹¹¤Ë¸Å¤¤¤â¤Î, 'n' ¤Ç¹¹¤Ë¿·¤·¤¤¤â¤Î, '/' ¤Ç¸¡º÷, ESC ¤ÇÃæÃÇ ]", hgt - 1, 0);
1379 #else
1380                 prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0);
1381 #endif
1382
1383
1384                 /* Get a command */
1385                 skey = inkey_special();
1386
1387                 /* Exit on Escape */
1388                 if (skey == ESCAPE) break;
1389
1390                 /* Hack -- Save the old index */
1391                 j = i;
1392
1393                 /* Hack -- handle show */
1394                 if (skey == '=')
1395                 {
1396                         /* Prompt */
1397 #ifdef JP
1398                         prt("¶¯Ä´: ", hgt - 1, 0);
1399 #else
1400                         prt("Show: ", hgt - 1, 0);
1401 #endif
1402
1403
1404                         /* Get a "shower" string, or continue */
1405                         if (!askfor_aux(shower, 80)) continue;
1406
1407                         /* Okay */
1408                         continue;
1409                 }
1410
1411                 /* Hack -- handle find */
1412                 if (skey == '/' || skey == KTRL('s'))
1413                 {
1414                         int z;
1415
1416                         /* Prompt */
1417 #ifdef JP
1418                         prt("¸¡º÷: ", hgt - 1, 0);
1419 #else
1420                         prt("Find: ", hgt - 1, 0);
1421 #endif
1422
1423
1424                         /* Get a "finder" string, or continue */
1425                         if (!askfor_aux(finder, 80)) continue;
1426
1427                         /* Show it */
1428                         strcpy(shower, finder);
1429
1430                         /* Scan messages */
1431                         for (z = i + 1; z < n; z++)
1432                         {
1433                                 cptr msg = message_str(z);
1434
1435                                 /* Search for it */
1436                                 if (my_strstr(msg, finder))
1437                                 {
1438                                         /* New location */
1439                                         i = z;
1440
1441                                         /* Done */
1442                                         break;
1443                                 }
1444                         }
1445                 }
1446
1447                 /* Recall 1 older message */
1448                 if (skey == SKEY_TOP)
1449                 {
1450                         /* Go to the oldest line */
1451                         i = n - num_lines;
1452                 }
1453
1454                 /* Recall 1 newer message */
1455                 if (skey == SKEY_BOTTOM)
1456                 {
1457                         /* Go to the newest line */
1458                         i = 0;
1459                 }
1460
1461                 /* Recall 1 older message */
1462                 if (skey == '8' || skey == SKEY_UP || skey == '\n' || skey == '\r')
1463                 {
1464                         /* Go older if legal */
1465                         i = MIN(i + 1, n - num_lines);
1466                 }
1467
1468                 /* Recall 10 older messages */
1469                 if (skey == '+')
1470                 {
1471                         /* Go older if legal */
1472                         i = MIN(i + 10, n - num_lines);
1473                 }
1474
1475                 /* Recall 20 older messages */
1476                 if (skey == 'p' || skey == KTRL('P') || skey == ' ' || skey == SKEY_PGUP)
1477                 {
1478                         /* Go older if legal */
1479                         i = MIN(i + num_lines, n - num_lines);
1480                 }
1481
1482                 /* Recall 20 newer messages */
1483                 if (skey == 'n' || skey == KTRL('N') || skey == SKEY_PGDOWN)
1484                 {
1485                         /* Go newer (if able) */
1486                         i = MAX(0, i - num_lines);
1487                 }
1488
1489                 /* Recall 10 newer messages */
1490                 if (skey == '-')
1491                 {
1492                         /* Go newer (if able) */
1493                         i = MAX(0, i - 10);
1494                 }
1495
1496                 /* Recall 1 newer messages */
1497                 if (skey == '2' || skey == SKEY_DOWN)
1498                 {
1499                         /* Go newer (if able) */
1500                         i = MAX(0, i - 1);
1501                 }
1502
1503                 /* Hack -- Error of some kind */
1504                 if (i == j) bell();
1505         }
1506
1507         /* Restore the screen */
1508         screen_load();
1509 }
1510
1511
1512
1513 /*
1514  * Number of cheating options
1515  */
1516 #define CHEAT_MAX 7
1517
1518 /*
1519  * Cheating options
1520  */
1521 static option_type cheat_info[CHEAT_MAX] =
1522 {
1523         { &cheat_peek,          FALSE,  255,    0x01, 0x00,
1524 #ifdef JP
1525         "cheat_peek",           "¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¤Î¤¾¤­¸«¤ë"
1526 #else
1527         "cheat_peek",           "Peek into object creation"
1528 #endif
1529         },
1530
1531         { &cheat_hear,          FALSE,  255,    0x02, 0x00,
1532 #ifdef JP
1533         "cheat_hear",           "¥â¥ó¥¹¥¿¡¼¤ÎÀ¸À®¤ò¤Î¤¾¤­¸«¤ë"
1534 #else
1535         "cheat_hear",           "Peek into monster creation"
1536 #endif
1537         },
1538
1539         { &cheat_room,          FALSE,  255,    0x04, 0x00,
1540 #ifdef JP
1541         "cheat_room",           "¥À¥ó¥¸¥ç¥ó¤ÎÀ¸À®¤ò¤Î¤¾¤­¸«¤ë"
1542 #else
1543         "cheat_room",           "Peek into dungeon creation"
1544 #endif
1545         },
1546
1547         { &cheat_xtra,          FALSE,  255,    0x08, 0x00,
1548 #ifdef JP
1549         "cheat_xtra",           "¤½¤Î¾¤Î»ö¤ò¤Î¤¾¤­¸«¤ë"
1550 #else
1551         "cheat_xtra",           "Peek into something else"
1552 #endif
1553         },
1554
1555         { &cheat_know,          FALSE,  255,    0x10, 0x00,
1556 #ifdef JP
1557         "cheat_know",           "´°Á´¤Ê¥â¥ó¥¹¥¿¡¼¤Î»×¤¤½Ð¤òÃΤë"
1558 #else
1559         "cheat_know",           "Know complete monster info"
1560 #endif
1561         },
1562
1563         { &cheat_live,          FALSE,  255,    0x20, 0x00,
1564 #ifdef JP
1565         "cheat_live",           "»à¤ò²óÈò¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤¹¤ë"
1566 #else
1567         "cheat_live",           "Allow player to avoid death"
1568 #endif
1569         },
1570
1571         { &cheat_save,          FALSE,  255,    0x40, 0x00,
1572 #ifdef JP
1573         "cheat_save",           "»à¤ó¤À»þ¥»¡¼¥Ö¤¹¤ë¤«³Îǧ¤¹¤ë"
1574 #else
1575         "cheat_save",           "Ask for saving death"
1576 #endif
1577         }
1578 };
1579
1580 /*
1581  * Interact with some options for cheating
1582  */
1583 static void do_cmd_options_cheat(cptr info)
1584 {
1585         char    ch;
1586
1587         int             i, k = 0, n = CHEAT_MAX;
1588
1589         char    buf[80];
1590
1591
1592         /* Clear screen */
1593         Term_clear();
1594
1595         /* Interact with the player */
1596         while (TRUE)
1597         {
1598                 int dir;
1599
1600                 /* Prompt XXX XXX XXX */
1601 #ifdef JP
1602                 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, ESC ¤Ç·èÄê )", info);
1603 #else
1604                 sprintf(buf, "%s (RET to advance, y/n to set, ESC to accept) ", info);
1605 #endif
1606
1607                 prt(buf, 0, 0);
1608
1609 #ifdef JP
1610                 /* º¾µ½¥ª¥×¥·¥ç¥ó¤ò¤¦¤Ã¤«¤ê¤¤¤¸¤Ã¤Æ¤·¤Þ¤¦¿Í¤¬¤¤¤ë¤è¤¦¤Ê¤Î¤ÇÃí°Õ */
1611                 prt("                                 <<  Ãí°Õ  >>", 11, 0);
1612                 prt("      º¾µ½¥ª¥×¥·¥ç¥ó¤ò°ìÅ٤ǤâÀßÄꤹ¤ë¤È¡¢¥¹¥³¥¢µ­Ï¿¤¬»Ä¤é¤Ê¤¯¤Ê¤ê¤Þ¤¹¡ª", 12, 0);
1613                 prt("      ¸å¤Ë²ò½ü¤·¤Æ¤â¥À¥á¤Ç¤¹¤Î¤Ç¡¢¾¡Íø¼Ô¤òÌܻؤ¹Êý¤Ï¤³¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¤", 13, 0);
1614                 prt("      ¤¸¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£", 14, 0);
1615 #endif
1616                 /* Display the options */
1617                 for (i = 0; i < n; i++)
1618                 {
1619                         byte a = TERM_WHITE;
1620
1621                         /* Color current option */
1622                         if (i == k) a = TERM_L_BLUE;
1623
1624                         /* Display the option text */
1625                         sprintf(buf, "%-48s: %s (%s)",
1626                             cheat_info[i].o_desc,
1627 #ifdef JP
1628                             (*cheat_info[i].o_var ? "¤Ï¤¤  " : "¤¤¤¤¤¨"),
1629 #else
1630                             (*cheat_info[i].o_var ? "yes" : "no "),
1631 #endif
1632
1633                             cheat_info[i].o_text);
1634                         c_prt(a, buf, i + 2, 0);
1635                 }
1636
1637                 /* Hilite current option */
1638                 move_cursor(k + 2, 50);
1639
1640                 /* Get a key */
1641                 ch = inkey();
1642
1643                 /*
1644                  * HACK - Try to translate the key into a direction
1645                  * to allow using the roguelike keys for navigation.
1646                  */
1647                 dir = get_keymap_dir(ch);
1648                 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1649                         ch = I2D(dir);
1650
1651                 /* Analyze */
1652                 switch (ch)
1653                 {
1654                         case ESCAPE:
1655                         {
1656                                 return;
1657                         }
1658
1659                         case '-':
1660                         case '8':
1661                         {
1662                                 k = (n + k - 1) % n;
1663                                 break;
1664                         }
1665
1666                         case ' ':
1667                         case '\n':
1668                         case '\r':
1669                         case '2':
1670                         {
1671                                 k = (k + 1) % n;
1672                                 break;
1673                         }
1674
1675                         case 'y':
1676                         case 'Y':
1677                         case '6':
1678                         {
1679                                 if(!p_ptr->noscore)
1680 #ifdef JP
1681                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "º¾µ½¥ª¥×¥·¥ç¥ó¤òON¤Ë¤·¤Æ¡¢¥¹¥³¥¢¤ò»Ä¤»¤Ê¤¯¤Ê¤Ã¤¿¡£");
1682 #else
1683                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "give up sending score to use cheating options.");
1684 #endif
1685                                 p_ptr->noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1686                                 (*cheat_info[k].o_var) = TRUE;
1687                                 k = (k + 1) % n;
1688                                 break;
1689                         }
1690
1691                         case 'n':
1692                         case 'N':
1693                         case '4':
1694                         {
1695                                 (*cheat_info[k].o_var) = FALSE;
1696                                 k = (k + 1) % n;
1697                                 break;
1698                         }
1699
1700                         case '?':
1701                         {
1702 #ifdef JP
1703                                 strnfmt(buf, sizeof(buf), "joption.txt#%s", cheat_info[k].o_text);
1704 #else
1705                                 strnfmt(buf, sizeof(buf), "option.txt#%s", cheat_info[k].o_text);
1706 #endif
1707                                 /* Peruse the help file */
1708                                 (void)show_file(TRUE, buf, NULL, 0, 0);
1709
1710                                 Term_clear(); 
1711                                 break;
1712                         }
1713
1714                         default:
1715                         {
1716                                 bell();
1717                                 break;
1718                         }
1719                 }
1720         }
1721 }
1722
1723
1724 static option_type autosave_info[2] =
1725 {
1726         { &autosave_l,      FALSE, 255, 0x01, 0x00,
1727 #ifdef JP
1728             "autosave_l",    "¿·¤·¤¤³¬¤ËÆþ¤ëÅ٤˼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1729 #else
1730             "autosave_l",    "Autosave when entering new levels" },
1731 #endif
1732
1733
1734         { &autosave_t,      FALSE, 255, 0x02, 0x00,
1735 #ifdef JP
1736             "autosave_t",   "°ìÄ꥿¡¼¥óËè¤Ë¼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1737 #else
1738             "autosave_t",   "Timed autosave" },
1739 #endif
1740
1741 };
1742
1743
1744 static s16b toggle_frequency(s16b current)
1745 {
1746         switch (current)
1747         {
1748         case 0: return 50;
1749         case 50: return 100;
1750         case 100: return 250;
1751         case 250: return 500;
1752         case 500: return 1000;
1753         case 1000: return 2500;
1754         case 2500: return 5000;
1755         case 5000: return 10000;
1756         case 10000: return 25000;
1757         default: return 0;
1758         }
1759 }
1760
1761
1762 /*
1763  * Interact with some options for cheating
1764  */
1765 static void do_cmd_options_autosave(cptr info)
1766 {
1767         char    ch;
1768
1769         int     i, k = 0, n = 2;
1770
1771         char    buf[80];
1772
1773
1774         /* Clear screen */
1775         Term_clear();
1776
1777         /* Interact with the player */
1778         while (TRUE)
1779         {
1780                 /* Prompt XXX XXX XXX */
1781 #ifdef JP
1782                 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, F ¤ÇÉÑÅÙ¤òÆþÎÏ, ESC ¤Ç·èÄê ) ", info);
1783 #else
1784                 sprintf(buf, "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) ", info);
1785 #endif
1786
1787                 prt(buf, 0, 0);
1788
1789                 /* Display the options */
1790                 for (i = 0; i < n; i++)
1791                 {
1792                         byte a = TERM_WHITE;
1793
1794                         /* Color current option */
1795                         if (i == k) a = TERM_L_BLUE;
1796
1797                         /* Display the option text */
1798                         sprintf(buf, "%-48s: %s (%s)",
1799                             autosave_info[i].o_desc,
1800 #ifdef JP
1801                             (*autosave_info[i].o_var ? "¤Ï¤¤  " : "¤¤¤¤¤¨"),
1802 #else
1803                             (*autosave_info[i].o_var ? "yes" : "no "),
1804 #endif
1805
1806                             autosave_info[i].o_text);
1807                         c_prt(a, buf, i + 2, 0);
1808                 }
1809
1810 #ifdef JP
1811                 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè",  autosave_freq), 5, 0);
1812 #else
1813                 prt(format("Timed autosave frequency: every %d turns",  autosave_freq), 5, 0);
1814 #endif
1815
1816
1817
1818                 /* Hilite current option */
1819                 move_cursor(k + 2, 50);
1820
1821                 /* Get a key */
1822                 ch = inkey();
1823
1824                 /* Analyze */
1825                 switch (ch)
1826                 {
1827                         case ESCAPE:
1828                         {
1829                                 return;
1830                         }
1831
1832                         case '-':
1833                         case '8':
1834                         {
1835                                 k = (n + k - 1) % n;
1836                                 break;
1837                         }
1838
1839                         case ' ':
1840                         case '\n':
1841                         case '\r':
1842                         case '2':
1843                         {
1844                                 k = (k + 1) % n;
1845                                 break;
1846                         }
1847
1848                         case 'y':
1849                         case 'Y':
1850                         case '6':
1851                         {
1852
1853                                 (*autosave_info[k].o_var) = TRUE;
1854                                 k = (k + 1) % n;
1855                                 break;
1856                         }
1857
1858                         case 'n':
1859                         case 'N':
1860                         case '4':
1861                         {
1862                                 (*autosave_info[k].o_var) = FALSE;
1863                                 k = (k + 1) % n;
1864                                 break;
1865                         }
1866
1867                         case 'f':
1868                         case 'F':
1869                         {
1870                                 autosave_freq = toggle_frequency(autosave_freq);
1871 #ifdef JP
1872                                 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè", 
1873                                            autosave_freq), 5, 0);
1874 #else
1875                                 prt(format("Timed autosave frequency: every %d turns",
1876                                            autosave_freq), 5, 0);
1877 #endif
1878                                 break;
1879                         }
1880
1881                         case '?':
1882                         {
1883 #ifdef JP
1884                                 (void)show_file(TRUE, "joption.txt#Autosave", NULL, 0, 0);
1885 #else
1886                                 (void)show_file(TRUE, "option.txt#Autosave", NULL, 0, 0);
1887 #endif
1888
1889
1890                                 Term_clear(); 
1891                                 break;
1892                         }
1893
1894                         default:
1895                         {
1896                                 bell();
1897                                 break;
1898                         }
1899                 }
1900         }
1901 }
1902
1903
1904 /*
1905  * Interact with some options
1906  */
1907 void do_cmd_options_aux(int page, cptr info)
1908 {
1909         char    ch;
1910         int     i, k = 0, n = 0, l;
1911         int     opt[24];
1912         char    buf[80];
1913         bool    browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
1914                               (!p_ptr->wizard || !allow_debug_opts);
1915
1916
1917         /* Lookup the options */
1918         for (i = 0; i < 24; i++) opt[i] = 0;
1919
1920         /* Scan the options */
1921         for (i = 0; option_info[i].o_desc; i++)
1922         {
1923                 /* Notice options on this "page" */
1924                 if (option_info[i].o_page == page) opt[n++] = i;
1925         }
1926
1927
1928         /* Clear screen */
1929         Term_clear();
1930
1931         /* Interact with the player */
1932         while (TRUE)
1933         {
1934                 int dir;
1935
1936                 /* Prompt XXX XXX XXX */
1937 #ifdef JP
1938                 sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, %sESC:½ªÎ», ?:¥Ø¥ë¥×) ", info, browse_only ? "" : "y/n:Êѹ¹, ");
1939 #else
1940                 sprintf(buf, "%s (RET:next, %s, ?:help) ", info, browse_only ? "ESC:exit" : "y/n:change, ESC:accept");
1941 #endif
1942
1943                 prt(buf, 0, 0);
1944
1945
1946                 /* HACK -- description for easy-auto-destroy options */
1947 #ifdef JP
1948                 if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤­¤Î¤ßÍ­¸ú", 6, 6);
1949 #else
1950                 if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
1951 #endif
1952
1953                 /* Display the options */
1954                 for (i = 0; i < n; i++)
1955                 {
1956                         byte a = TERM_WHITE;
1957
1958                         /* Color current option */
1959                         if (i == k) a = TERM_L_BLUE;
1960
1961                         /* Display the option text */
1962                         sprintf(buf, "%-48s: %s (%.19s)",
1963                                 option_info[opt[i]].o_desc,
1964 #ifdef JP
1965                                 (*option_info[opt[i]].o_var ? "¤Ï¤¤  " : "¤¤¤¤¤¨"),
1966 #else
1967                                 (*option_info[opt[i]].o_var ? "yes" : "no "),
1968 #endif
1969
1970                                 option_info[opt[i]].o_text);
1971                         if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
1972                         else c_prt(a, buf, i + 2, 0);
1973                 }
1974
1975                 if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
1976                 else l = 0;
1977
1978                 /* Hilite current option */
1979                 move_cursor(k + 2 + l, 50);
1980
1981                 /* Get a key */
1982                 ch = inkey();
1983
1984                 /*
1985                  * HACK - Try to translate the key into a direction
1986                  * to allow using the roguelike keys for navigation.
1987                  */
1988                 dir = get_keymap_dir(ch);
1989                 if ((dir == 2) || (dir == 4) || (dir == 6) || (dir == 8))
1990                         ch = I2D(dir);
1991
1992                 /* Analyze */
1993                 switch (ch)
1994                 {
1995                         case ESCAPE:
1996                         {
1997                                 return;
1998                         }
1999
2000                         case '-':
2001                         case '8':
2002                         {
2003                                 k = (n + k - 1) % n;
2004                                 break;
2005                         }
2006
2007                         case ' ':
2008                         case '\n':
2009                         case '\r':
2010                         case '2':
2011                         {
2012                                 k = (k + 1) % n;
2013                                 break;
2014                         }
2015
2016                         case 'y':
2017                         case 'Y':
2018                         case '6':
2019                         {
2020                                 if (browse_only) break;
2021                                 (*option_info[opt[k]].o_var) = TRUE;
2022                                 k = (k + 1) % n;
2023                                 break;
2024                         }
2025
2026                         case 'n':
2027                         case 'N':
2028                         case '4':
2029                         {
2030                                 if (browse_only) break;
2031                                 (*option_info[opt[k]].o_var) = FALSE;
2032                                 k = (k + 1) % n;
2033                                 break;
2034                         }
2035
2036                         case 't':
2037                         case 'T':
2038                         {
2039                                 if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
2040                                 break;
2041                         }
2042
2043                         case '?':
2044                         {
2045 #ifdef JP
2046                                 strnfmt(buf, sizeof(buf), "joption.txt#%s", option_info[opt[k]].o_text);
2047 #else
2048                                 strnfmt(buf, sizeof(buf), "option.txt#%s", option_info[opt[k]].o_text);
2049 #endif
2050                                 /* Peruse the help file */
2051                                 (void)show_file(TRUE, buf, NULL, 0, 0);
2052
2053                                 Term_clear();
2054                                 break;
2055                         }
2056
2057                         default:
2058                         {
2059                                 bell();
2060                                 break;
2061                         }
2062                 }
2063         }
2064 }
2065
2066
2067 /*
2068  * Modify the "window" options
2069  */
2070 static void do_cmd_options_win(void)
2071 {
2072         int i, j, d;
2073
2074         int y = 0;
2075         int x = 0;
2076
2077         char ch;
2078
2079         bool go = TRUE;
2080
2081         u32b old_flag[8];
2082
2083
2084         /* Memorize old flags */
2085         for (j = 0; j < 8; j++)
2086         {
2087                 /* Acquire current flags */
2088                 old_flag[j] = window_flag[j];
2089         }
2090
2091
2092         /* Clear screen */
2093         Term_clear();
2094
2095         /* Interact */
2096         while (go)
2097         {
2098                 /* Prompt XXX XXX XXX */
2099 #ifdef JP
2100                 prt("¥¦¥£¥ó¥É¥¦¡¦¥Õ¥é¥° (<Êý¸þ>¤Ç°ÜÆ°, t¤Ç¥Á¥§¥ó¥¸, y/n ¤Ç¥»¥Ã¥È, ESC)", 0, 0);
2101 #else
2102                 prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
2103 #endif
2104
2105
2106                 /* Display the windows */
2107                 for (j = 0; j < 8; j++)
2108                 {
2109                         byte a = TERM_WHITE;
2110
2111                         cptr s = angband_term_name[j];
2112
2113                         /* Use color */
2114                         if (j == x) a = TERM_L_BLUE;
2115
2116                         /* Window name, staggered, centered */
2117                         Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
2118                 }
2119
2120                 /* Display the options */
2121                 for (i = 0; i < 16; i++)
2122                 {
2123                         byte a = TERM_WHITE;
2124
2125                         cptr str = window_flag_desc[i];
2126
2127                         /* Use color */
2128                         if (i == y) a = TERM_L_BLUE;
2129
2130                         /* Unused option */
2131 #ifdef JP
2132                         if (!str) str = "(̤»ÈÍÑ)";
2133 #else
2134                         if (!str) str = "(Unused option)";
2135 #endif
2136
2137
2138                         /* Flag name */
2139                         Term_putstr(0, i + 5, -1, a, str);
2140
2141                         /* Display the windows */
2142                         for (j = 0; j < 8; j++)
2143                         {
2144                                 byte a = TERM_WHITE;
2145
2146                                 char c = '.';
2147
2148                                 /* Use color */
2149                                 if ((i == y) && (j == x)) a = TERM_L_BLUE;
2150
2151                                 /* Active flag */
2152                                 if (window_flag[j] & (1L << i)) c = 'X';
2153
2154                                 /* Flag value */
2155                                 Term_putch(35 + j * 5, i + 5, a, c);
2156                         }
2157                 }
2158
2159                 /* Place Cursor */
2160                 Term_gotoxy(35 + x * 5, y + 5);
2161
2162                 /* Get key */
2163                 ch = inkey();
2164
2165                 /* Analyze */
2166                 switch (ch)
2167                 {
2168                         case ESCAPE:
2169                         {
2170                                 go = FALSE;
2171                                 break;
2172                         }
2173
2174                         case 'T':
2175                         case 't':
2176                         {
2177                                 /* Clear windows */
2178                                 for (j = 0; j < 8; j++)
2179                                 {
2180                                         window_flag[j] &= ~(1L << y);
2181                                 }
2182
2183                                 /* Clear flags */
2184                                 for (i = 0; i < 16; i++)
2185                                 {
2186                                         window_flag[x] &= ~(1L << i);
2187                                 }
2188
2189                                 /* Fall through */
2190                         }
2191
2192                         case 'y':
2193                         case 'Y':
2194                         {
2195                                 /* Ignore screen */
2196                                 if (x == 0) break;
2197
2198                                 /* Set flag */
2199                                 window_flag[x] |= (1L << y);
2200                                 break;
2201                         }
2202
2203                         case 'n':
2204                         case 'N':
2205                         {
2206                                 /* Clear flag */
2207                                 window_flag[x] &= ~(1L << y);
2208                                 break;
2209                         }
2210
2211                         case '?':
2212                         {
2213 #ifdef JP
2214                                 (void)show_file(TRUE, "joption.txt#Window", NULL, 0, 0);
2215 #else
2216                                 (void)show_file(TRUE, "option.txt#Window", NULL, 0, 0);
2217 #endif
2218
2219
2220                                 Term_clear(); 
2221                                 break;
2222                         }
2223
2224                         default:
2225                         {
2226                                 d = get_keymap_dir(ch);
2227
2228                                 x = (x + ddx[d] + 8) % 8;
2229                                 y = (y + ddy[d] + 16) % 16;
2230
2231                                 if (!d) bell();
2232                         }
2233                 }
2234         }
2235
2236         /* Notice changes */
2237         for (j = 0; j < 8; j++)
2238         {
2239                 term *old = Term;
2240
2241                 /* Dead window */
2242                 if (!angband_term[j]) continue;
2243
2244                 /* Ignore non-changes */
2245                 if (window_flag[j] == old_flag[j]) continue;
2246
2247                 /* Activate */
2248                 Term_activate(angband_term[j]);
2249
2250                 /* Erase */
2251                 Term_clear();
2252
2253                 /* Refresh */
2254                 Term_fresh();
2255
2256                 /* Restore */
2257                 Term_activate(old);
2258         }
2259 }
2260
2261
2262
2263
2264 /*
2265  * Set or unset various options.
2266  *
2267  * The user must use the "Ctrl-R" command to "adapt" to changes
2268  * in any options which control "visual" aspects of the game.
2269  */
2270 void do_cmd_options(void)
2271 {
2272         int k;
2273
2274
2275         /* Save the screen */
2276         screen_save();
2277
2278         /* Interact */
2279         while (1)
2280         {
2281                 /* Clear screen */
2282                 Term_clear();
2283
2284                 /* Why are we here */
2285 #ifdef JP
2286                 prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 1, 0);
2287 #else
2288                 prt("Options", 1, 0);
2289 #endif
2290
2291
2292                 /* Give some choices */
2293 #ifdef JP
2294                 prt("(1)     ¥­¡¼ÆþÎÏ          ¥ª¥×¥·¥ç¥ó", 2, 5);
2295                 prt("(2)     ²èÌ̽ÐÎÏ          ¥ª¥×¥·¥ç¥ó", 3, 5);
2296                 prt("(3)   ¥²¡¼¥à¥×¥ì¥¤        ¥ª¥×¥·¥ç¥ó", 4, 5);
2297                 prt("(4)   ¹ÔÆ°Ãæ»ß´Ø·¸        ¥ª¥×¥·¥ç¥ó", 5, 5);
2298                 prt("(5)      ¸úΨ²½           ¥ª¥×¥·¥ç¥ó", 6, 5);
2299                 prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ  ¥ª¥×¥·¥ç¥ó", 7, 5);
2300                 prt("(R)    ¥×¥ì¥¤µ­Ï¿         ¥ª¥×¥·¥ç¥ó", 8, 5);
2301
2302                 /* Special choices */
2303                 prt("(P) ¼«Æ°½¦¤¤¥¨¥Ç¥£¥¿", 10, 5);
2304                 prt("(D)  ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 11, 5);
2305                 prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 12, 5);
2306                 prt("(M)   ÄãËâÎÏ¿§ïçÃÍ", 13, 5);
2307                 prt("(A)    ¼«Æ°¥»¡¼¥Ö         ¥ª¥×¥·¥ç¥ó", 14, 5);
2308                 /* Window flags */
2309                 prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
2310 #else
2311                 prt("(1) Input Options", 2, 5);
2312                 prt("(2) Output Options", 3, 5);
2313                 prt("(3) Game-Play Options", 4, 5);
2314                 prt("(4) Disturbance Options", 5, 5);
2315                 prt("(5) Efficiency Options", 6, 5);
2316                 prt("(6) Easy Auto-Destroyer Options", 7, 5);
2317                 prt("(R) Play-record Options", 8, 5);
2318                 /* Special choices */
2319                 prt("(P) Auto-picker/destroyer editor", 10, 5);
2320                 prt("(D) Base Delay Factor", 11, 5);
2321                 prt("(H) Hitpoint Warning", 12, 5);
2322                 prt("(M) Mana Color Threshold", 13, 5);
2323                 prt("(A) Autosave Options", 14, 5);
2324                 /* Window flags */
2325                 prt("(W) Window Flags", 15, 5);
2326 #endif
2327
2328                 if (!p_ptr->wizard || !allow_debug_opts)
2329                 {
2330                         /* Birth */
2331 #ifdef JP
2332                         prt("(B)       ½é´ü            ¥ª¥×¥·¥ç¥ó (»²¾È¤Î¤ß)", 16, 5);
2333 #else
2334                         prt("(B) Birth Options (Browse Only)", 16, 5);
2335 #endif
2336                 }
2337                 else
2338                 {
2339                         /* Birth */
2340 #ifdef JP
2341                         prt("(B)       ½é´ü            ¥ª¥×¥·¥ç¥ó", 16, 5);
2342 #else
2343                         prt("(B) Birth Options", 16, 5);
2344 #endif
2345                 }
2346
2347
2348                 if (p_ptr->noscore || allow_debug_opts)
2349                 {
2350                         /* Cheating */
2351 #ifdef JP
2352                         prt("(C)       º¾µ½            ¥ª¥×¥·¥ç¥ó", 17, 5);
2353 #else
2354                         prt("(C) Cheating Options", 17, 5);
2355 #endif
2356                 }
2357
2358
2359                 /* Prompt */
2360 #ifdef JP
2361                 prt("¥³¥Þ¥ó¥É:", 19, 0);
2362 #else
2363                 prt("Command: ", 19, 0);
2364 #endif
2365
2366
2367                 /* Get command */
2368                 k = inkey();
2369
2370                 /* Exit */
2371                 if (k == ESCAPE) break;
2372
2373                 /* Analyze */
2374                 switch (k)
2375                 {
2376                         /* General Options */
2377                         case '1':
2378                         {
2379                                 /* Process the general options */
2380 #ifdef JP
2381                                 do_cmd_options_aux(OPT_PAGE_INPUT, "¥­¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2382 #else
2383                                 do_cmd_options_aux(OPT_PAGE_INPUT, "Input Options");
2384 #endif
2385
2386                                 break;
2387                         }
2388
2389                         /* General Options */
2390                         case '2':
2391                         {
2392                                 /* Process the general options */
2393 #ifdef JP
2394                                 do_cmd_options_aux(OPT_PAGE_OUTPUT, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
2395 #else
2396                                 do_cmd_options_aux(OPT_PAGE_OUTPUT, "Output Options");
2397 #endif
2398
2399                                 break;
2400                         }
2401
2402                         /* Inventory Options */
2403                         case '3':
2404                         {
2405                                 /* Spawn */
2406 #ifdef JP
2407                                 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2408 #else
2409                                 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "Game-Play Options");
2410 #endif
2411
2412                                 break;
2413                         }
2414
2415                         /* Disturbance Options */
2416                         case '4':
2417                         {
2418                                 /* Spawn */
2419 #ifdef JP
2420                                 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2421 #else
2422                                 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "Disturbance Options");
2423 #endif
2424
2425                                 break;
2426                         }
2427
2428                         /* Efficiency Options */
2429                         case '5':
2430                         {
2431                                 /* Spawn */
2432 #ifdef JP
2433                                 do_cmd_options_aux(OPT_PAGE_EFFICIENCY, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
2434 #else
2435                                 do_cmd_options_aux(OPT_PAGE_EFFICIENCY, "Efficiency Options");
2436 #endif
2437
2438                                 break;
2439                         }
2440
2441                         /* Object auto-destruction Options */
2442                         case '6':
2443                         {
2444                                 /* Spawn */
2445 #ifdef JP
2446                                 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2447 #else
2448                                 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "Easy Auto-Destroyer Options");
2449 #endif
2450                                 break;
2451                         }
2452
2453                         /* Play-record Options */
2454                         case 'R':
2455                         case 'r':
2456                         {
2457                                 /* Spawn */
2458 #ifdef JP
2459                                 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "¥×¥ì¥¤µ­Ï¿¥ª¥×¥·¥ç¥ó");
2460 #else
2461                                 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "Play-record Options");
2462 #endif
2463                                 break;
2464                         }
2465
2466                         /* Birth Options */
2467                         case 'B':
2468                         case 'b':
2469                         {
2470                                 /* Spawn */
2471 #ifdef JP
2472                                 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
2473 #else
2474                                 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
2475 #endif
2476
2477                                 break;
2478                         }
2479
2480                         /* Cheating Options */
2481                         case 'C':
2482                         {
2483                                 if (!p_ptr->noscore && !allow_debug_opts)
2484                                 {
2485                                         /* Cheat options are not permitted */
2486                                         bell();
2487                                         break;
2488                                 }
2489
2490                                 /* Spawn */
2491 #ifdef JP
2492                                 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤­¤Ê¤¤¡ª");
2493 #else
2494                                 do_cmd_options_cheat("Cheaters never win");
2495 #endif
2496
2497                                 break;
2498                         }
2499
2500                         case 'a':
2501                         case 'A':
2502                         {
2503 #ifdef JP
2504                                 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2505 #else
2506                                 do_cmd_options_autosave("Autosave");
2507 #endif
2508
2509                                 break;
2510                         }
2511
2512                         /* Window flags */
2513                         case 'W':
2514                         case 'w':
2515                         {
2516                                 /* Spawn */
2517                                 do_cmd_options_win();
2518                                 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2519                                                   PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2520                                                   PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2521                                                   PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2522                                 break;
2523                         }
2524
2525                         /* Auto-picker/destroyer editor */
2526                         case 'P':
2527                         case 'p':
2528                         {
2529                                 do_cmd_edit_autopick();
2530                                 break;
2531                         }
2532
2533                         /* Hack -- Delay Speed */
2534                         case 'D':
2535                         case 'd':
2536                         {
2537                                 /* Prompt */
2538 #ifdef JP
2539                                 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
2540 #else
2541                                 prt("Command: Base Delay Factor", 19, 0);
2542 #endif
2543
2544
2545                                 /* Get a new value */
2546                                 while (1)
2547                                 {
2548                                         int msec = delay_factor * delay_factor * delay_factor;
2549 #ifdef JP
2550                                         prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2551                                                    delay_factor, msec), 22, 0);
2552 #else
2553                                         prt(format("Current base delay factor: %d (%d msec)",
2554                                                    delay_factor, msec), 22, 0);
2555 #endif
2556
2557 #ifdef JP
2558                                         prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2559 #else
2560                                         prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2561 #endif
2562
2563                                         k = inkey();
2564                                         if (k == ESCAPE) break;
2565                                         else if (k == '?')
2566                                         {
2567 #ifdef JP
2568                                                 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2569 #else
2570                                                 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2571 #endif
2572                                                 Term_clear(); 
2573                                         }
2574                                         else if (isdigit(k)) delay_factor = D2I(k);
2575                                         else bell();
2576                                 }
2577
2578                                 break;
2579                         }
2580
2581                         /* Hack -- hitpoint warning factor */
2582                         case 'H':
2583                         case 'h':
2584                         {
2585                                 /* Prompt */
2586 #ifdef JP
2587                                 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
2588 #else
2589                                 prt("Command: Hitpoint Warning", 19, 0);
2590 #endif
2591
2592
2593                                 /* Get a new value */
2594                                 while (1)
2595                                 {
2596 #ifdef JP
2597                                         prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2598                                                    hitpoint_warn), 22, 0);
2599 #else
2600                                         prt(format("Current hitpoint warning: %d0%%",
2601                                                    hitpoint_warn), 22, 0);
2602 #endif
2603
2604 #ifdef JP
2605                                         prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2606 #else
2607                                         prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2608 #endif
2609
2610                                         k = inkey();
2611                                         if (k == ESCAPE) break;
2612                                         else if (k == '?')
2613                                         {
2614 #ifdef JP
2615                                                 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2616 #else
2617                                                 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2618 #endif
2619                                                 Term_clear(); 
2620                                         }
2621                                         else if (isdigit(k)) hitpoint_warn = D2I(k);
2622                                         else bell();
2623                                 }
2624
2625                                 break;
2626                         }
2627
2628                         /* Hack -- mana color factor */
2629                         case 'M':
2630                         case 'm':
2631                         {
2632                                 /* Prompt */
2633 #ifdef JP
2634                                 prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
2635 #else
2636                                 prt("Command: Mana Color Threshold", 19, 0);
2637 #endif
2638
2639
2640                                 /* Get a new value */
2641                                 while (1)
2642                                 {
2643 #ifdef JP
2644                                         prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
2645                                                    mana_warn), 22, 0);
2646 #else
2647                                         prt(format("Current mana color threshold: %d0%%",
2648                                                    mana_warn), 22, 0);
2649 #endif
2650
2651 #ifdef JP
2652                                         prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
2653 #else
2654                                         prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
2655 #endif
2656
2657                                         k = inkey();
2658                                         if (k == ESCAPE) break;
2659                                         else if (k == '?')
2660                                         {
2661 #ifdef JP
2662                                                 (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
2663 #else
2664                                                 (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
2665 #endif
2666                                                 Term_clear(); 
2667                                         }
2668                                         else if (isdigit(k)) mana_warn = D2I(k);
2669                                         else bell();
2670                                 }
2671
2672                                 break;
2673                         }
2674
2675                         case '?':
2676 #ifdef JP
2677                                 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2678 #else
2679                                 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2680 #endif
2681                                 Term_clear(); 
2682                                 break;
2683
2684                         /* Unknown option */
2685                         default:
2686                         {
2687                                 /* Oops */
2688                                 bell();
2689                                 break;
2690                         }
2691                 }
2692
2693                 /* Flush messages */
2694                 msg_print(NULL);
2695         }
2696
2697
2698         /* Restore the screen */
2699         screen_load();
2700
2701         /* Hack - Redraw equippy chars */
2702         p_ptr->redraw |= (PR_EQUIPPY);
2703 }
2704
2705
2706
2707 /*
2708  * Ask for a "user pref line" and process it
2709  *
2710  * XXX XXX XXX Allow absolute file names?
2711  */
2712 void do_cmd_pref(void)
2713 {
2714         char buf[80];
2715
2716         /* Default */
2717         strcpy(buf, "");
2718
2719         /* Ask for a "user pref command" */
2720 #ifdef JP
2721         if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2722 #else
2723         if (!get_string("Pref: ", buf, 80)) return;
2724 #endif
2725
2726
2727         /* Process that pref command */
2728         (void)process_pref_file_command(buf);
2729 }
2730
2731 void do_cmd_pickpref(void)
2732 {
2733         char buf[80];
2734         errr err;
2735
2736 #ifdef JP
2737         if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2738 #else
2739         if(!get_check("Reload auto-pick preference file? ")) return;
2740 #endif
2741
2742         /* Free old entries */
2743         init_autopicker();
2744
2745         /* ¥­¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2746 #ifdef JP
2747         sprintf(buf, "picktype-%s.prf", player_name);
2748 #else
2749         sprintf(buf, "pickpref-%s.prf", player_name);
2750 #endif
2751         err = process_pickpref_file(buf);
2752
2753         if(err == 0)
2754         {
2755 #ifdef JP
2756                 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2757 #else
2758                 msg_format("loaded '%s'.", buf);
2759 #endif
2760         }
2761
2762         /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2763
2764         /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2765         if (0 > err)
2766         {
2767 #ifdef JP
2768                 err = process_pickpref_file("picktype.prf");
2769 #else
2770                 err = process_pickpref_file("pickpref.prf");
2771 #endif
2772
2773                 if(err == 0)
2774                 {
2775 #ifdef JP
2776                         msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2777 #else
2778                         msg_print("loaded 'pickpref.prf'.");
2779 #endif
2780                 }
2781         }
2782
2783
2784 #ifdef JP
2785         if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2786 #else
2787         if(err) msg_print("Failed to reload autopick preference.");
2788 #endif
2789 }
2790
2791 #ifdef ALLOW_MACROS
2792
2793 /*
2794  * Hack -- append all current macros to the given file
2795  */
2796 static errr macro_dump(cptr fname)
2797 {
2798         static cptr mark = "Macro Dump";
2799
2800         int i;
2801
2802         char buf[1024];
2803
2804         /* Build the filename */
2805         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2806
2807         /* File type is "TEXT" */
2808         FILE_TYPE(FILE_TYPE_TEXT);
2809
2810         /* Append to the file */
2811         if (!open_auto_dump(buf, mark)) return (-1);
2812
2813         /* Start dumping */
2814 #ifdef JP
2815         auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2816 #else
2817         auto_dump_printf("\n# Automatic macro dump\n\n");
2818 #endif
2819
2820         /* Dump them */
2821         for (i = 0; i < macro__num; i++)
2822         {
2823                 /* Extract the action */
2824                 ascii_to_text(buf, macro__act[i]);
2825
2826                 /* Dump the macro */
2827                 auto_dump_printf("A:%s\n", buf);
2828
2829                 /* Extract the action */
2830                 ascii_to_text(buf, macro__pat[i]);
2831
2832                 /* Dump normal macros */
2833                 auto_dump_printf("P:%s\n", buf);
2834
2835                 /* End the macro */
2836                 auto_dump_printf("\n");
2837         }
2838
2839         /* Close */
2840         close_auto_dump();
2841
2842         /* Success */
2843         return (0);
2844 }
2845
2846
2847 /*
2848  * Hack -- ask for a "trigger" (see below)
2849  *
2850  * Note the complex use of the "inkey()" function from "util.c".
2851  *
2852  * Note that both "flush()" calls are extremely important.
2853  */
2854 static void do_cmd_macro_aux(char *buf)
2855 {
2856         int i, n = 0;
2857
2858         char tmp[1024];
2859
2860
2861         /* Flush */
2862         flush();
2863
2864         /* Do not process macros */
2865         inkey_base = TRUE;
2866
2867         /* First key */
2868         i = inkey();
2869
2870         /* Read the pattern */
2871         while (i)
2872         {
2873                 /* Save the key */
2874                 buf[n++] = i;
2875
2876                 /* Do not process macros */
2877                 inkey_base = TRUE;
2878
2879                 /* Do not wait for keys */
2880                 inkey_scan = TRUE;
2881
2882                 /* Attempt to read a key */
2883                 i = inkey();
2884         }
2885
2886         /* Terminate */
2887         buf[n] = '\0';
2888
2889         /* Flush */
2890         flush();
2891
2892
2893         /* Convert the trigger */
2894         ascii_to_text(tmp, buf);
2895
2896         /* Hack -- display the trigger */
2897         Term_addstr(-1, TERM_WHITE, tmp);
2898 }
2899
2900 #endif
2901
2902
2903 /*
2904  * Hack -- ask for a keymap "trigger" (see below)
2905  *
2906  * Note that both "flush()" calls are extremely important.  This may
2907  * no longer be true, since "util.c" is much simpler now.  XXX XXX XXX
2908  */
2909 static void do_cmd_macro_aux_keymap(char *buf)
2910 {
2911         char tmp[1024];
2912
2913
2914         /* Flush */
2915         flush();
2916
2917
2918         /* Get a key */
2919         buf[0] = inkey();
2920         buf[1] = '\0';
2921
2922
2923         /* Convert to ascii */
2924         ascii_to_text(tmp, buf);
2925
2926         /* Hack -- display the trigger */
2927         Term_addstr(-1, TERM_WHITE, tmp);
2928
2929
2930         /* Flush */
2931         flush();
2932 }
2933
2934
2935 /*
2936  * Hack -- append all keymaps to the given file
2937  */
2938 static errr keymap_dump(cptr fname)
2939 {
2940         static cptr mark = "Keymap Dump";
2941         int i;
2942
2943         char key[1024];
2944         char buf[1024];
2945
2946         int mode;
2947
2948         /* Roguelike */
2949         if (rogue_like_commands)
2950         {
2951                 mode = KEYMAP_MODE_ROGUE;
2952         }
2953
2954         /* Original */
2955         else
2956         {
2957                 mode = KEYMAP_MODE_ORIG;
2958         }
2959
2960
2961         /* Build the filename */
2962         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2963
2964         /* File type is "TEXT" */
2965         FILE_TYPE(FILE_TYPE_TEXT);
2966
2967         /* Append to the file */
2968         if (!open_auto_dump(buf, mark)) return -1;
2969
2970         /* Start dumping */
2971 #ifdef JP
2972         auto_dump_printf("\n# ¼«Æ°¥­¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2973 #else
2974         auto_dump_printf("\n# Automatic keymap dump\n\n");
2975 #endif
2976
2977         /* Dump them */
2978         for (i = 0; i < 256; i++)
2979         {
2980                 cptr act;
2981
2982                 /* Loop up the keymap */
2983                 act = keymap_act[mode][i];
2984
2985                 /* Skip empty keymaps */
2986                 if (!act) continue;
2987
2988                 /* Encode the key */
2989                 buf[0] = i;
2990                 buf[1] = '\0';
2991                 ascii_to_text(key, buf);
2992
2993                 /* Encode the action */
2994                 ascii_to_text(buf, act);
2995
2996                 /* Dump the macro */
2997                 auto_dump_printf("A:%s\n", buf);
2998                 auto_dump_printf("C:%d:%s\n", mode, key);
2999         }
3000
3001         /* Close */
3002         close_auto_dump();
3003
3004         /* Success */
3005         return (0);
3006 }
3007
3008
3009
3010 /*
3011  * Interact with "macros"
3012  *
3013  * Note that the macro "action" must be defined before the trigger.
3014  *
3015  * Could use some helpful instructions on this page.  XXX XXX XXX
3016  */
3017 void do_cmd_macros(void)
3018 {
3019         int i;
3020
3021         char tmp[1024];
3022
3023         char buf[1024];
3024
3025         int mode;
3026
3027
3028         /* Roguelike */
3029         if (rogue_like_commands)
3030         {
3031                 mode = KEYMAP_MODE_ROGUE;
3032         }
3033
3034         /* Original */
3035         else
3036         {
3037                 mode = KEYMAP_MODE_ORIG;
3038         }
3039
3040         /* File type is "TEXT" */
3041         FILE_TYPE(FILE_TYPE_TEXT);
3042
3043
3044         /* Save screen */
3045         screen_save();
3046
3047
3048         /* Process requests until done */
3049         while (1)
3050         {
3051                 /* Clear screen */
3052                 Term_clear();
3053
3054                 /* Describe */
3055 #ifdef JP
3056                 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
3057 #else
3058                 prt("Interact with Macros", 2, 0);
3059 #endif
3060
3061
3062
3063                 /* Describe that action */
3064 #ifdef JP
3065                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3066 #else
3067                 prt("Current action (if any) shown below:", 20, 0);
3068 #endif
3069
3070
3071                 /* Analyze the current action */
3072                 ascii_to_text(buf, macro__buf);
3073
3074                 /* Display the current action */
3075                 prt(buf, 22, 0);
3076
3077
3078                 /* Selections */
3079 #ifdef JP
3080                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3081 #else
3082                 prt("(1) Load a user pref file", 4, 5);
3083 #endif
3084
3085 #ifdef ALLOW_MACROS
3086 #ifdef JP
3087                 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
3088                 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
3089                 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
3090                 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
3091                 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥­¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3092                 prt("(7) ¥­¡¼ÇÛÃ֤γÎǧ", 10, 5);
3093                 prt("(8) ¥­¡¼ÇÛÃ֤κîÀ®", 11, 5);
3094                 prt("(9) ¥­¡¼ÇÛÃ֤κï½ü", 12, 5);
3095                 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3096 #else
3097                 prt("(2) Append macros to a file", 5, 5);
3098                 prt("(3) Query a macro", 6, 5);
3099                 prt("(4) Create a macro", 7, 5);
3100                 prt("(5) Remove a macro", 8, 5);
3101                 prt("(6) Append keymaps to a file", 9, 5);
3102                 prt("(7) Query a keymap", 10, 5);
3103                 prt("(8) Create a keymap", 11, 5);
3104                 prt("(9) Remove a keymap", 12, 5);
3105                 prt("(0) Enter a new action", 13, 5);
3106 #endif
3107
3108 #endif /* ALLOW_MACROS */
3109
3110                 /* Prompt */
3111 #ifdef JP
3112                 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3113 #else
3114                 prt("Command: ", 16, 0);
3115 #endif
3116
3117
3118                 /* Get a command */
3119                 i = inkey();
3120
3121                 /* Leave */
3122                 if (i == ESCAPE) break;
3123
3124                 /* Load a 'macro' file */
3125                 else if (i == '1')
3126                 {
3127                         errr err;
3128
3129                         /* Prompt */
3130 #ifdef JP
3131                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3132 #else
3133                         prt("Command: Load a user pref file", 16, 0);
3134 #endif
3135
3136
3137                         /* Prompt */
3138 #ifdef JP
3139                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3140 #else
3141                         prt("File: ", 18, 0);
3142 #endif
3143
3144
3145                         /* Default filename */
3146                         sprintf(tmp, "%s.prf", player_name);
3147
3148                         /* Ask for a file */
3149                         if (!askfor_aux(tmp, 80)) continue;
3150
3151                         /* Process the given filename */
3152                         err = process_pref_file(tmp);
3153                         if (-2 == err)
3154                         {
3155 #ifdef JP
3156                                 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3157 #else
3158                                 msg_format("Loaded default '%s'.", tmp);
3159 #endif
3160                         }
3161                         else if (err)
3162                         {
3163                                 /* Prompt */
3164 #ifdef JP
3165                                 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3166 #else
3167                                 msg_format("Failed to load '%s'!");
3168 #endif
3169                         }
3170                         else
3171                         {
3172 #ifdef JP
3173                                 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3174 #else
3175                                 msg_format("Loaded '%s'.", tmp);
3176 #endif
3177                         }
3178                 }
3179
3180 #ifdef ALLOW_MACROS
3181
3182                 /* Save macros */
3183                 else if (i == '2')
3184                 {
3185                         /* Prompt */
3186 #ifdef JP
3187                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3188 #else
3189                         prt("Command: Append macros to a file", 16, 0);
3190 #endif
3191
3192
3193                         /* Prompt */
3194 #ifdef JP
3195                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3196 #else
3197                         prt("File: ", 18, 0);
3198 #endif
3199
3200
3201                         /* Default filename */
3202                         sprintf(tmp, "%s.prf", player_name);
3203
3204                         /* Ask for a file */
3205                         if (!askfor_aux(tmp, 80)) continue;
3206
3207                         /* Dump the macros */
3208                         (void)macro_dump(tmp);
3209
3210                         /* Prompt */
3211 #ifdef JP
3212                         msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3213 #else
3214                         msg_print("Appended macros.");
3215 #endif
3216
3217                 }
3218
3219                 /* Query a macro */
3220                 else if (i == '3')
3221                 {
3222                         int k;
3223
3224                         /* Prompt */
3225 #ifdef JP
3226                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3227 #else
3228                         prt("Command: Query a macro", 16, 0);
3229 #endif
3230
3231
3232                         /* Prompt */
3233 #ifdef JP
3234                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3235 #else
3236                         prt("Trigger: ", 18, 0);
3237 #endif
3238
3239
3240                         /* Get a macro trigger */
3241                         do_cmd_macro_aux(buf);
3242
3243                         /* Acquire action */
3244                         k = macro_find_exact(buf);
3245
3246                         /* Nothing found */
3247                         if (k < 0)
3248                         {
3249                                 /* Prompt */
3250 #ifdef JP
3251                                 msg_print("¤½¤Î¥­¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3252 #else
3253                                 msg_print("Found no macro.");
3254 #endif
3255
3256                         }
3257
3258                         /* Found one */
3259                         else
3260                         {
3261                                 /* Obtain the action */
3262                                 strcpy(macro__buf, macro__act[k]);
3263
3264                                 /* Analyze the current action */
3265                                 ascii_to_text(buf, macro__buf);
3266
3267                                 /* Display the current action */
3268                                 prt(buf, 22, 0);
3269
3270                                 /* Prompt */
3271 #ifdef JP
3272                                 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3273 #else
3274                                 msg_print("Found a macro.");
3275 #endif
3276
3277                         }
3278                 }
3279
3280                 /* Create a macro */
3281                 else if (i == '4')
3282                 {
3283                         /* Prompt */
3284 #ifdef JP
3285                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3286 #else
3287                         prt("Command: Create a macro", 16, 0);
3288 #endif
3289
3290
3291                         /* Prompt */
3292 #ifdef JP
3293                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3294 #else
3295                         prt("Trigger: ", 18, 0);
3296 #endif
3297
3298
3299                         /* Get a macro trigger */
3300                         do_cmd_macro_aux(buf);
3301
3302                         /* Clear */
3303                         clear_from(20);
3304
3305                         /* Prompt */
3306 #ifdef JP
3307                         prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3308 #else
3309                         prt("Action: ", 20, 0);
3310 #endif
3311
3312
3313                         /* Convert to text */
3314                         ascii_to_text(tmp, macro__buf);
3315
3316                         /* Get an encoded action */
3317                         if (askfor_aux(tmp, 80))
3318                         {
3319                                 /* Convert to ascii */
3320                                 text_to_ascii(macro__buf, tmp);
3321
3322                                 /* Link the macro */
3323                                 macro_add(buf, macro__buf);
3324
3325                                 /* Prompt */
3326 #ifdef JP
3327                                 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3328 #else
3329                                 msg_print("Added a macro.");
3330 #endif
3331
3332                         }
3333                 }
3334
3335                 /* Remove a macro */
3336                 else if (i == '5')
3337                 {
3338                         /* Prompt */
3339 #ifdef JP
3340                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3341 #else
3342                         prt("Command: Remove a macro", 16, 0);
3343 #endif
3344
3345
3346                         /* Prompt */
3347 #ifdef JP
3348                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3349 #else
3350                         prt("Trigger: ", 18, 0);
3351 #endif
3352
3353
3354                         /* Get a macro trigger */
3355                         do_cmd_macro_aux(buf);
3356
3357                         /* Link the macro */
3358                         macro_add(buf, buf);
3359
3360                         /* Prompt */
3361 #ifdef JP
3362                         msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3363 #else
3364                         msg_print("Removed a macro.");
3365 #endif
3366
3367                 }
3368
3369                 /* Save keymaps */
3370                 else if (i == '6')
3371                 {
3372                         /* Prompt */
3373 #ifdef JP
3374                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3375 #else
3376                         prt("Command: Append keymaps to a file", 16, 0);
3377 #endif
3378
3379
3380                         /* Prompt */
3381 #ifdef JP
3382                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3383 #else
3384                         prt("File: ", 18, 0);
3385 #endif
3386
3387
3388                         /* Default filename */
3389                         sprintf(tmp, "%s.prf", player_name);
3390
3391                         /* Ask for a file */
3392                         if (!askfor_aux(tmp, 80)) continue;
3393
3394                         /* Dump the macros */
3395                         (void)keymap_dump(tmp);
3396
3397                         /* Prompt */
3398 #ifdef JP
3399                         msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3400 #else
3401                         msg_print("Appended keymaps.");
3402 #endif
3403
3404                 }
3405
3406                 /* Query a keymap */
3407                 else if (i == '7')
3408                 {
3409                         cptr act;
3410
3411                         /* Prompt */
3412 #ifdef JP
3413                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤γÎǧ", 16, 0);
3414 #else
3415                         prt("Command: Query a keymap", 16, 0);
3416 #endif
3417
3418
3419                         /* Prompt */
3420 #ifdef JP
3421                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3422 #else
3423                         prt("Keypress: ", 18, 0);
3424 #endif
3425
3426
3427                         /* Get a keymap trigger */
3428                         do_cmd_macro_aux_keymap(buf);
3429
3430                         /* Look up the keymap */
3431                         act = keymap_act[mode][(byte)(buf[0])];
3432
3433                         /* Nothing found */
3434                         if (!act)
3435                         {
3436                                 /* Prompt */
3437 #ifdef JP
3438                                 msg_print("¥­¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3439 #else
3440                                 msg_print("Found no keymap.");
3441 #endif
3442
3443                         }
3444
3445                         /* Found one */
3446                         else
3447                         {
3448                                 /* Obtain the action */
3449                                 strcpy(macro__buf, act);
3450
3451                                 /* Analyze the current action */
3452                                 ascii_to_text(buf, macro__buf);
3453
3454                                 /* Display the current action */
3455                                 prt(buf, 22, 0);
3456
3457                                 /* Prompt */
3458 #ifdef JP
3459                                 msg_print("¥­¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3460 #else
3461                                 msg_print("Found a keymap.");
3462 #endif
3463
3464                         }
3465                 }
3466
3467                 /* Create a keymap */
3468                 else if (i == '8')
3469                 {
3470                         /* Prompt */
3471 #ifdef JP
3472                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κîÀ®", 16, 0);
3473 #else
3474                         prt("Command: Create a keymap", 16, 0);
3475 #endif
3476
3477
3478                         /* Prompt */
3479 #ifdef JP
3480                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3481 #else
3482                         prt("Keypress: ", 18, 0);
3483 #endif
3484
3485
3486                         /* Get a keymap trigger */
3487                         do_cmd_macro_aux_keymap(buf);
3488
3489                         /* Clear */
3490                         clear_from(20);
3491
3492                         /* Prompt */
3493 #ifdef JP
3494                         prt("¹ÔÆ°: ", 20, 0);
3495 #else
3496                         prt("Action: ", 20, 0);
3497 #endif
3498
3499
3500                         /* Convert to text */
3501                         ascii_to_text(tmp, macro__buf);
3502
3503                         /* Get an encoded action */
3504                         if (askfor_aux(tmp, 80))
3505                         {
3506                                 /* Convert to ascii */
3507                                 text_to_ascii(macro__buf, tmp);
3508
3509                                 /* Free old keymap */
3510                                 string_free(keymap_act[mode][(byte)(buf[0])]);
3511
3512                                 /* Make new keymap */
3513                                 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3514
3515                                 /* Prompt */
3516 #ifdef JP
3517                                 msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3518 #else
3519                                 msg_print("Added a keymap.");
3520 #endif
3521
3522                         }
3523                 }
3524
3525                 /* Remove a keymap */
3526                 else if (i == '9')
3527                 {
3528                         /* Prompt */
3529 #ifdef JP
3530                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κï½ü", 16, 0);
3531 #else
3532                         prt("Command: Remove a keymap", 16, 0);
3533 #endif
3534
3535
3536                         /* Prompt */
3537 #ifdef JP
3538                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3539 #else
3540                         prt("Keypress: ", 18, 0);
3541 #endif
3542
3543
3544                         /* Get a keymap trigger */
3545                         do_cmd_macro_aux_keymap(buf);
3546
3547                         /* Free old keymap */
3548                         string_free(keymap_act[mode][(byte)(buf[0])]);
3549
3550                         /* Make new keymap */
3551                         keymap_act[mode][(byte)(buf[0])] = NULL;
3552
3553                         /* Prompt */
3554 #ifdef JP
3555                         msg_print("¥­¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3556 #else
3557                         msg_print("Removed a keymap.");
3558 #endif
3559
3560                 }
3561
3562                 /* Enter a new action */
3563                 else if (i == '0')
3564                 {
3565                         /* Prompt */
3566 #ifdef JP
3567                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3568 #else
3569                         prt("Command: Enter a new action", 16, 0);
3570 #endif
3571
3572
3573                         /* Go to the correct location */
3574                         Term_gotoxy(0, 22);
3575
3576                         /* Hack -- limit the value */
3577                         tmp[80] = '\0';
3578
3579                         /* Get an encoded action */
3580                         if (!askfor_aux(buf, 80)) continue;
3581
3582                         /* Extract an action */
3583                         text_to_ascii(macro__buf, buf);
3584                 }
3585
3586 #endif /* ALLOW_MACROS */
3587
3588                 /* Oops */
3589                 else
3590                 {
3591                         /* Oops */
3592                         bell();
3593                 }
3594
3595                 /* Flush messages */
3596                 msg_print(NULL);
3597         }
3598
3599         /* Load screen */
3600         screen_load();
3601 }
3602
3603
3604 static void cmd_visuals_aux(int i, int *num, int max)
3605 {
3606         if (iscntrl(i))
3607         {
3608                 char str[10] = "";
3609                 int tmp;
3610
3611                 sprintf(str, "%d", *num);
3612
3613                 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3614                         return;
3615
3616                 tmp = strtol(str, NULL, 0);
3617                 if (tmp >= 0 && tmp < max)
3618                         *num = tmp;
3619                 return;
3620         }
3621         else if (isupper(i))
3622                 *num = (*num + max - 1) % max;
3623         else
3624                 *num = (*num + 1) % max;
3625
3626         return;
3627 }
3628
3629 /*
3630  * Interact with "visuals"
3631  */
3632 void do_cmd_visuals(void)
3633 {
3634         int i;
3635
3636         char tmp[160];
3637
3638         char buf[1024];
3639
3640         const char *empty_symbol = "<< ? >>";
3641
3642         if (use_bigtile) empty_symbol = "<< ?? >>";
3643
3644
3645         /* File type is "TEXT" */
3646         FILE_TYPE(FILE_TYPE_TEXT);
3647
3648
3649         /* Save the screen */
3650         screen_save();
3651
3652
3653         /* Interact until done */
3654         while (1)
3655         {
3656                 /* Clear screen */
3657                 Term_clear();
3658
3659                 /* Ask for a choice */
3660 #ifdef JP
3661                 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3662 #else
3663                 prt("Interact with Visuals", 2, 0);
3664 #endif
3665
3666
3667                 /* Give some choices */
3668 #ifdef JP
3669                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3670 #else
3671                 prt("(1) Load a user pref file", 4, 5);
3672 #endif
3673
3674 #ifdef ALLOW_VISUALS
3675 #ifdef JP
3676                 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
3677                 prt("(3) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 6, 5);
3678                 prt("(4) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 7, 5);
3679                 prt("(5) (̤»ÈÍÑ)", 8, 5);
3680                 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3681                 prt("(7) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3682                 prt("(8) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3683                 prt("(9) (̤»ÈÍÑ)", 12, 5);
3684 #else
3685                 prt("(2) Dump monster attr/chars", 5, 5);
3686                 prt("(3) Dump object attr/chars", 6, 5);
3687                 prt("(4) Dump feature attr/chars", 7, 5);
3688                 prt("(5) (unused)", 8, 5);
3689                 prt("(6) Change monster attr/chars", 9, 5);
3690                 prt("(7) Change object attr/chars", 10, 5);
3691                 prt("(8) Change feature attr/chars", 11, 5);
3692                 prt("(9) (unused)", 12, 5);
3693 #endif
3694
3695 #endif
3696 #ifdef JP
3697                 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3698 #else
3699                 prt("(0) Reset visuals", 13, 5);
3700 #endif
3701
3702
3703                 /* Prompt */
3704 #ifdef JP
3705                 prt("¥³¥Þ¥ó¥É:", 18, 0);
3706 #else
3707                 prt("Command: ", 15, 0);
3708 #endif
3709
3710
3711                 /* Prompt */
3712                 i = inkey();
3713
3714                 /* Done */
3715                 if (i == ESCAPE) break;
3716
3717                 /* Load a 'pref' file */
3718                 else if (i == '1')
3719                 {
3720                         /* Prompt */
3721 #ifdef JP
3722                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3723 #else
3724                         prt("Command: Load a user pref file", 15, 0);
3725 #endif
3726
3727
3728                         /* Prompt */
3729 #ifdef JP
3730                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3731 #else
3732                         prt("File: ", 17, 0);
3733 #endif
3734
3735
3736                         /* Default filename */
3737                         sprintf(tmp, "%s.prf", player_name);
3738
3739                         /* Query */
3740                         if (!askfor_aux(tmp, 70)) continue;
3741
3742                         /* Process the given filename */
3743                         (void)process_pref_file(tmp);
3744                 }
3745
3746 #ifdef ALLOW_VISUALS
3747
3748                 /* Dump monster attr/chars */
3749                 else if (i == '2')
3750                 {
3751                         static cptr mark = "Monster attr/chars";
3752
3753                         /* Prompt */
3754 #ifdef JP
3755                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3756 #else
3757                         prt("Command: Dump monster attr/chars", 15, 0);
3758 #endif
3759
3760
3761                         /* Prompt */
3762 #ifdef JP
3763                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3764 #else
3765                         prt("File: ", 17, 0);
3766 #endif
3767
3768
3769                         /* Default filename */
3770                         sprintf(tmp, "%s.prf", player_name);
3771                         
3772                         /* Get a filename */
3773                         if (!askfor_aux(tmp, 70)) continue;
3774
3775                         /* Build the filename */
3776                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3777
3778                         /* Append to the file */
3779                         if (!open_auto_dump(buf, mark)) continue;
3780
3781                         /* Start dumping */
3782 #ifdef JP
3783                         auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3784 #else
3785                         auto_dump_printf("\n# Monster attr/char definitions\n\n");
3786 #endif
3787
3788                         /* Dump monsters */
3789                         for (i = 1; i < max_r_idx; i++)
3790                         {
3791                                 monster_race *r_ptr = &r_info[i];
3792
3793                                 /* Skip non-entries */
3794                                 if (!r_ptr->name) continue;
3795
3796                                 /* Dump a comment */
3797                                 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3798
3799                                 /* Dump the monster attr/char info */
3800                                 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3801                                         (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3802                         }
3803
3804                         /* Close */
3805                         close_auto_dump();
3806
3807                         /* Message */
3808 #ifdef JP
3809                         msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3810 #else
3811                         msg_print("Dumped monster attr/chars.");
3812 #endif
3813
3814                 }
3815
3816                 /* Dump object attr/chars */
3817                 else if (i == '3')
3818                 {
3819                         static cptr mark = "Object attr/chars";
3820
3821                         /* Prompt */
3822 #ifdef JP
3823                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3824 #else
3825                         prt("Command: Dump object attr/chars", 15, 0);
3826 #endif
3827
3828
3829                         /* Prompt */
3830 #ifdef JP
3831                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3832 #else
3833                         prt("File: ", 17, 0);
3834 #endif
3835
3836
3837                         /* Default filename */
3838                         sprintf(tmp, "%s.prf", player_name);
3839
3840                         /* Get a filename */
3841                         if (!askfor_aux(tmp, 70)) continue;
3842
3843                         /* Build the filename */
3844                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3845
3846                         /* Append to the file */
3847                         if (!open_auto_dump(buf, mark)) continue;
3848
3849                         /* Start dumping */
3850 #ifdef JP
3851                         auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3852 #else
3853                         auto_dump_printf("\n# Object attr/char definitions\n\n");
3854 #endif
3855
3856                         /* Dump objects */
3857                         for (i = 1; i < max_k_idx; i++)
3858                         {
3859                                 char o_name[80];
3860                                 object_kind *k_ptr = &k_info[i];
3861
3862                                 /* Skip non-entries */
3863                                 if (!k_ptr->name) continue;
3864
3865                                 /* Skip entries with flavor */
3866                                 if (k_ptr->flavor) continue;
3867
3868                                 /* Tidy name */
3869                                 strip_name(o_name, i);
3870
3871                                 /* Dump a comment */
3872                                 auto_dump_printf("# %s\n", o_name);
3873
3874                                 /* Dump the object attr/char info */
3875                                 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3876                                         (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3877                         }
3878
3879                         /* Close */
3880                         close_auto_dump();
3881
3882                         /* Message */
3883 #ifdef JP
3884                         msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3885 #else
3886                         msg_print("Dumped object attr/chars.");
3887 #endif
3888
3889                 }
3890
3891                 /* Dump feature attr/chars */
3892                 else if (i == '4')
3893                 {
3894                         static cptr mark = "Feature attr/chars";
3895
3896                         /* Prompt */
3897 #ifdef JP
3898                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3899 #else
3900                         prt("Command: Dump feature attr/chars", 15, 0);
3901 #endif
3902
3903
3904                         /* Prompt */
3905 #ifdef JP
3906                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3907 #else
3908                         prt("File: ", 17, 0);
3909 #endif
3910
3911
3912                         /* Default filename */
3913                         sprintf(tmp, "%s.prf", player_name);
3914
3915                         /* Get a filename */
3916                         if (!askfor_aux(tmp, 70)) continue;
3917
3918                         /* Build the filename */
3919                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3920
3921                         /* Append to the file */
3922                         if (!open_auto_dump(buf, mark)) continue;
3923
3924                         /* Start dumping */
3925 #ifdef JP
3926                         auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3927 #else
3928                         auto_dump_printf("\n# Feature attr/char definitions\n\n");
3929 #endif
3930
3931                         /* Dump features */
3932                         for (i = 1; i < max_f_idx; i++)
3933                         {
3934                                 feature_type *f_ptr = &f_info[i];
3935
3936                                 /* Skip non-entries */
3937                                 if (!f_ptr->name) continue;
3938
3939                                 /* Skip mimiccing features */
3940                                 if (f_ptr->mimic != i) continue;
3941
3942                                 /* Dump a comment */
3943                                 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3944
3945                                 /* Dump the feature attr/char info */
3946                                 auto_dump_printf("F:%d:0x%02X/0x%02X\n\n", i,
3947                                         (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3948                         }
3949
3950                         /* Close */
3951                         close_auto_dump();
3952
3953                         /* Message */
3954 #ifdef JP
3955                         msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3956 #else
3957                         msg_print("Dumped feature attr/chars.");
3958 #endif
3959
3960                 }
3961
3962                 /* Modify monster attr/chars */
3963                 else if (i == '6')
3964                 {
3965                         static int r = 0;
3966
3967                         /* Prompt */
3968 #ifdef JP
3969                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3970 #else
3971                         prt("Command: Change monster attr/chars", 15, 0);
3972 #endif
3973
3974
3975                         /* Hack -- query until done */
3976                         while (1)
3977                         {
3978                                 monster_race *r_ptr = &r_info[r];
3979                                 char c;
3980                                 int t;
3981
3982                                 byte da = (r_ptr->d_attr);
3983                                 byte dc = (r_ptr->d_char);
3984                                 byte ca = (r_ptr->x_attr);
3985                                 byte cc = (r_ptr->x_char);
3986
3987                                 /* Label the object */
3988 #ifdef JP
3989                                 Term_putstr(5, 17, -1, TERM_WHITE,
3990                                             format("¥â¥ó¥¹¥¿¡¼ = %d, Ì¾Á° = %-40.40s",
3991                                                    r, (r_name + r_ptr->name)));
3992 #else
3993                                 Term_putstr(5, 17, -1, TERM_WHITE,
3994                                             format("Monster = %d, Name = %-40.40s",
3995                                                    r, (r_name + r_ptr->name)));
3996 #endif
3997
3998
3999                                 /* Label the Default values */
4000 #ifdef JP
4001                                 Term_putstr(10, 19, -1, TERM_WHITE,
4002                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3u / %3u", da, dc));
4003 #else
4004                                 Term_putstr(10, 19, -1, TERM_WHITE,
4005                                             format("Default attr/char = %3u / %3u", da, dc));
4006 #endif
4007
4008                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4009                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4010
4011                                 /* Label the Current values */
4012 #ifdef JP
4013                                 Term_putstr(10, 20, -1, TERM_WHITE,
4014                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3u / %3u", ca, cc));
4015 #else
4016                                 Term_putstr(10, 20, -1, TERM_WHITE,
4017                                             format("Current attr/char = %3u / %3u", ca, cc));
4018 #endif
4019
4020                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4021                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4022
4023                                 /* Prompt */
4024 #ifdef JP
4025                                 Term_putstr(0, 22, -1, TERM_WHITE,
4026                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4027 #else
4028                                 Term_putstr(0, 22, -1, TERM_WHITE,
4029                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
4030 #endif
4031
4032                                 /* Get a command */
4033                                 i = inkey();
4034
4035                                 /* All done */
4036                                 if (i == ESCAPE) break;
4037
4038                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4039                                 else if (isupper(i)) c = 'a' + i - 'A';
4040                                 else c = i;
4041
4042                                 switch (c)
4043                                 {
4044                                 case 'n':
4045                                         cmd_visuals_aux(i, &r, max_r_idx);
4046                                         break;
4047                                 case 'a':
4048                                         t = (int)r_ptr->x_attr;
4049                                         cmd_visuals_aux(i, &t, 256);
4050                                         r_ptr->x_attr = (byte)t;
4051                                         break;
4052                                 case 'c':
4053                                         t = (int)r_ptr->x_char;
4054                                         cmd_visuals_aux(i, &t, 256);
4055                                         r_ptr->x_char = (byte)t;
4056                                         break;
4057                                 }
4058                         }
4059                 }
4060
4061                 /* Modify object attr/chars */
4062                 else if (i == '7')
4063                 {
4064                         static int k = 0;
4065
4066                         /* Prompt */
4067 #ifdef JP
4068                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4069 #else
4070                         prt("Command: Change object attr/chars", 15, 0);
4071 #endif
4072
4073
4074                         /* Hack -- query until done */
4075                         while (1)
4076                         {
4077                                 object_kind *k_ptr = &k_info[k];
4078                                 char c;
4079                                 int t;
4080
4081                                 byte da = (byte)k_ptr->d_attr;
4082                                 byte dc = (byte)k_ptr->d_char;
4083                                 byte ca = (byte)k_ptr->x_attr;
4084                                 byte cc = (byte)k_ptr->x_char;
4085
4086                                 /* Label the object */
4087 #ifdef JP
4088                                 Term_putstr(5, 17, -1, TERM_WHITE,
4089                                             format("¥¢¥¤¥Æ¥à = %d, Ì¾Á° = %-40.40s",
4090                                                    k, (k_name + k_ptr->name)));
4091 #else
4092                                 Term_putstr(5, 17, -1, TERM_WHITE,
4093                                             format("Object = %d, Name = %-40.40s",
4094                                                    k, (k_name + k_ptr->name)));
4095 #endif
4096
4097
4098                                 /* Label the Default values */
4099 #ifdef JP
4100                                 Term_putstr(10, 19, -1, TERM_WHITE,
4101                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
4102 #else
4103                                 Term_putstr(10, 19, -1, TERM_WHITE,
4104                                             format("Default attr/char = %3d / %3d", da, dc));
4105 #endif
4106
4107                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4108                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4109
4110                                 /* Label the Current values */
4111 #ifdef JP
4112                                 Term_putstr(10, 20, -1, TERM_WHITE,
4113                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
4114 #else
4115                                 Term_putstr(10, 20, -1, TERM_WHITE,
4116                                             format("Current attr/char = %3d / %3d", ca, cc));
4117 #endif
4118
4119                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4120                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4121
4122                                 /* Prompt */
4123 #ifdef JP
4124                                 Term_putstr(0, 22, -1, TERM_WHITE,
4125                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4126 #else
4127                                 Term_putstr(0, 22, -1, TERM_WHITE,
4128                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
4129 #endif
4130
4131                                 /* Get a command */
4132                                 i = inkey();
4133
4134                                 /* All done */
4135                                 if (i == ESCAPE) break;
4136
4137                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4138                                 else if (isupper(i)) c = 'a' + i - 'A';
4139                                 else c = i;
4140
4141                                 switch (c)
4142                                 {
4143                                 case 'n':
4144                                         cmd_visuals_aux(i, &k, max_k_idx);
4145                                         break;
4146                                 case 'a':
4147                                         t = (int)k_info[k].x_attr;
4148                                         cmd_visuals_aux(i, &t, 256);
4149                                         k_info[k].x_attr = (byte)t;
4150                                         break;
4151                                 case 'c':
4152                                         t = (int)k_info[k].x_char;
4153                                         cmd_visuals_aux(i, &t, 256);
4154                                         k_info[k].x_char = (byte)t;
4155                                         break;
4156                                 }
4157                         }
4158                 }
4159
4160                 /* Modify feature attr/chars */
4161                 else if (i == '8')
4162                 {
4163                         static int f = 0;
4164
4165                         /* Prompt */
4166 #ifdef JP
4167                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4168 #else
4169                         prt("Command: Change feature attr/chars", 15, 0);
4170 #endif
4171
4172
4173                         /* Hack -- query until done */
4174                         while (1)
4175                         {
4176                                 feature_type *f_ptr = &f_info[f];
4177                                 char c;
4178                                 int t;
4179
4180                                 byte da = (byte)f_ptr->d_attr;
4181                                 byte dc = (byte)f_ptr->d_char;
4182                                 byte ca = (byte)f_ptr->x_attr;
4183                                 byte cc = (byte)f_ptr->x_char;
4184
4185                                 /* Label the object */
4186 #ifdef JP
4187                                 Term_putstr(5, 17, -1, TERM_WHITE,
4188                                             format("ÃÏ·Á = %d, Ì¾Á° = %-40.40s",
4189                                                    f, (f_name + f_ptr->name)));
4190 #else
4191                                 Term_putstr(5, 17, -1, TERM_WHITE,
4192                                             format("Terrain = %d, Name = %-40.40s",
4193                                                    f, (f_name + f_ptr->name)));
4194 #endif
4195
4196
4197                                 /* Label the Default values */
4198 #ifdef JP
4199                                 Term_putstr(10, 19, -1, TERM_WHITE,
4200                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
4201 #else
4202                                 Term_putstr(10, 19, -1, TERM_WHITE,
4203                                             format("Default attr/char = %3d / %3d", da, dc));
4204 #endif
4205
4206                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4207
4208                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4209
4210
4211                                 /* Label the Current values */
4212 #ifdef JP
4213                                 Term_putstr(10, 20, -1, TERM_WHITE,
4214                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
4215 #else
4216                                 Term_putstr(10, 20, -1, TERM_WHITE,
4217                                             format("Current attr/char = %3d / %3d", ca, cc));
4218 #endif
4219
4220                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4221                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4222
4223                                 /* Prompt */
4224 #ifdef JP
4225                                 Term_putstr(0, 22, -1, TERM_WHITE,
4226                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4227 #else
4228                                 Term_putstr(0, 22, -1, TERM_WHITE,
4229                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
4230 #endif
4231
4232                                 /* Get a command */
4233                                 i = inkey();
4234
4235                                 /* All done */
4236                                 if (i == ESCAPE) break;
4237
4238                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4239                                 else if (isupper(i)) c = 'a' + i - 'A';
4240                                 else c = i;
4241
4242                                 switch (c)
4243                                 {
4244                                 case 'n':
4245                                         cmd_visuals_aux(i, &f, max_f_idx);
4246                                         break;
4247                                 case 'a':
4248                                         t = (int)f_info[f].x_attr;
4249                                         cmd_visuals_aux(i, &t, 256);
4250                                         f_info[f].x_attr = (byte)t;
4251                                         break;
4252                                 case 'c':
4253                                         t = (int)f_info[f].x_char;
4254                                         cmd_visuals_aux(i, &t, 256);
4255                                         f_info[f].x_char = (byte)t;
4256                                         break;
4257                                 }
4258                         }
4259                 }
4260
4261 #endif
4262
4263                 /* Reset visuals */
4264                 else if (i == '0')
4265                 {
4266                         /* Reset */
4267                         reset_visuals();
4268
4269                         /* Message */
4270 #ifdef JP
4271                         msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4272 #else
4273                         msg_print("Visual attr/char tables reset.");
4274 #endif
4275
4276                 }
4277
4278                 /* Unknown option */
4279                 else
4280                 {
4281                         bell();
4282                 }
4283
4284                 /* Flush messages */
4285                 msg_print(NULL);
4286         }
4287
4288
4289         /* Restore the screen */
4290         screen_load();
4291 }
4292
4293
4294 /*
4295  * Interact with "colors"
4296  */
4297 void do_cmd_colors(void)
4298 {
4299         int i;
4300
4301         char tmp[160];
4302
4303         char buf[1024];
4304
4305
4306         /* File type is "TEXT" */
4307         FILE_TYPE(FILE_TYPE_TEXT);
4308
4309
4310         /* Save the screen */
4311         screen_save();
4312
4313
4314         /* Interact until done */
4315         while (1)
4316         {
4317                 /* Clear screen */
4318                 Term_clear();
4319
4320                 /* Ask for a choice */
4321 #ifdef JP
4322                 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4323 #else
4324                 prt("Interact with Colors", 2, 0);
4325 #endif
4326
4327
4328                 /* Give some choices */
4329 #ifdef JP
4330                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4331 #else
4332                 prt("(1) Load a user pref file", 4, 5);
4333 #endif
4334
4335 #ifdef ALLOW_COLORS
4336 #ifdef JP
4337                 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
4338                 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4339 #else
4340                 prt("(2) Dump colors", 5, 5);
4341                 prt("(3) Modify colors", 6, 5);
4342 #endif
4343
4344 #endif
4345
4346                 /* Prompt */
4347 #ifdef JP
4348                 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4349 #else
4350                 prt("Command: ", 8, 0);
4351 #endif
4352
4353
4354                 /* Prompt */
4355                 i = inkey();
4356
4357                 /* Done */
4358                 if (i == ESCAPE) break;
4359
4360                 /* Load a 'pref' file */
4361                 if (i == '1')
4362                 {
4363                         /* Prompt */
4364 #ifdef JP
4365                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4366 #else
4367                         prt("Command: Load a user pref file", 8, 0);
4368 #endif
4369
4370
4371                         /* Prompt */
4372 #ifdef JP
4373                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4374 #else
4375                         prt("File: ", 10, 0);
4376 #endif
4377
4378
4379                         /* Default file */
4380                         sprintf(tmp, "%s.prf", player_name);
4381
4382                         /* Query */
4383                         if (!askfor_aux(tmp, 70)) continue;
4384
4385                         /* Process the given filename */
4386                         (void)process_pref_file(tmp);
4387
4388                         /* Mega-Hack -- react to changes */
4389                         Term_xtra(TERM_XTRA_REACT, 0);
4390
4391                         /* Mega-Hack -- redraw */
4392                         Term_redraw();
4393                 }
4394
4395 #ifdef ALLOW_COLORS
4396
4397                 /* Dump colors */
4398                 else if (i == '2')
4399                 {
4400                         static cptr mark = "Colors";
4401
4402                         /* Prompt */
4403 #ifdef JP
4404                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 8, 0);
4405 #else
4406                         prt("Command: Dump colors", 8, 0);
4407 #endif
4408
4409
4410                         /* Prompt */
4411 #ifdef JP
4412                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4413 #else
4414                         prt("File: ", 10, 0);
4415 #endif
4416
4417
4418                         /* Default filename */
4419                         sprintf(tmp, "%s.prf", player_name);
4420
4421                         /* Get a filename */
4422                         if (!askfor_aux(tmp, 70)) continue;
4423
4424                         /* Build the filename */
4425                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4426
4427                         /* Append to the file */
4428                         if (!open_auto_dump(buf, mark)) continue;
4429
4430                         /* Start dumping */
4431 #ifdef JP
4432                         auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4433 #else
4434                         auto_dump_printf("\n# Color redefinitions\n\n");
4435 #endif
4436
4437                         /* Dump colors */
4438                         for (i = 0; i < 256; i++)
4439                         {
4440                                 int kv = angband_color_table[i][0];
4441                                 int rv = angband_color_table[i][1];
4442                                 int gv = angband_color_table[i][2];
4443                                 int bv = angband_color_table[i][3];
4444
4445 #ifdef JP
4446                                 cptr name = "̤ÃÎ";
4447 #else
4448                                 cptr name = "unknown";
4449 #endif
4450
4451
4452                                 /* Skip non-entries */
4453                                 if (!kv && !rv && !gv && !bv) continue;
4454
4455                                 /* Extract the color name */
4456                                 if (i < 16) name = color_names[i];
4457
4458                                 /* Dump a comment */
4459 #ifdef JP
4460                                 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4461 #else
4462                                 auto_dump_printf("# Color '%s'\n", name);
4463 #endif
4464
4465                                 /* Dump the monster attr/char info */
4466                                 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4467                                         i, kv, rv, gv, bv);
4468                         }
4469
4470                         /* Close */
4471                         close_auto_dump();
4472
4473                         /* Message */
4474 #ifdef JP
4475                         msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
4476 #else
4477                         msg_print("Dumped color redefinitions.");
4478 #endif
4479
4480                 }
4481
4482                 /* Edit colors */
4483                 else if (i == '3')
4484                 {
4485                         static byte a = 0;
4486
4487                         /* Prompt */
4488 #ifdef JP
4489                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4490 #else
4491                         prt("Command: Modify colors", 8, 0);
4492 #endif
4493
4494
4495                         /* Hack -- query until done */
4496                         while (1)
4497                         {
4498                                 cptr name;
4499                                 byte j;
4500
4501                                 /* Clear */
4502                                 clear_from(10);
4503
4504                                 /* Exhibit the normal colors */
4505                                 for (j = 0; j < 16; j++)
4506                                 {
4507                                         /* Exhibit this color */
4508                                         Term_putstr(j*4, 20, -1, a, "###");
4509
4510                                         /* Exhibit all colors */
4511                                         Term_putstr(j*4, 22, -1, j, format("%3d", j));
4512                                 }
4513
4514                                 /* Describe the color */
4515 #ifdef JP
4516                                 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4517 #else
4518                                 name = ((a < 16) ? color_names[a] : "undefined");
4519 #endif
4520
4521
4522                                 /* Describe the color */
4523 #ifdef JP
4524                                 Term_putstr(5, 10, -1, TERM_WHITE,
4525                                             format("¥«¥é¡¼ = %d, Ì¾Á° = %s", a, name));
4526 #else
4527                                 Term_putstr(5, 10, -1, TERM_WHITE,
4528                                             format("Color = %d, Name = %s", a, name));
4529 #endif
4530
4531
4532                                 /* Label the Current values */
4533                                 Term_putstr(5, 12, -1, TERM_WHITE,
4534                                             format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4535                                                    angband_color_table[a][0],
4536                                                    angband_color_table[a][1],
4537                                                    angband_color_table[a][2],
4538                                                    angband_color_table[a][3]));
4539
4540                                 /* Prompt */
4541 #ifdef JP
4542                                 Term_putstr(0, 14, -1, TERM_WHITE,
4543                                             "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4544 #else
4545                                 Term_putstr(0, 14, -1, TERM_WHITE,
4546                                             "Command (n/N/k/K/r/R/g/G/b/B): ");
4547 #endif
4548
4549
4550                                 /* Get a command */
4551                                 i = inkey();
4552
4553                                 /* All done */
4554                                 if (i == ESCAPE) break;
4555
4556                                 /* Analyze */
4557                                 if (i == 'n') a = (byte)(a + 1);
4558                                 if (i == 'N') a = (byte)(a - 1);
4559                                 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4560                                 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4561                                 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4562                                 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4563                                 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4564                                 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4565                                 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4566                                 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4567
4568                                 /* Hack -- react to changes */
4569                                 Term_xtra(TERM_XTRA_REACT, 0);
4570
4571                                 /* Hack -- redraw */
4572                                 Term_redraw();
4573                         }
4574                 }
4575
4576 #endif
4577
4578                 /* Unknown option */
4579                 else
4580                 {
4581                         bell();
4582                 }
4583
4584                 /* Flush messages */
4585                 msg_print(NULL);
4586         }
4587
4588
4589         /* Restore the screen */
4590         screen_load();
4591 }
4592
4593
4594 /*
4595  * Note something in the message recall
4596  */
4597 void do_cmd_note(void)
4598 {
4599         char buf[80];
4600
4601         /* Default */
4602         strcpy(buf, "");
4603
4604         /* Input */
4605 #ifdef JP
4606         if (!get_string("¥á¥â: ", buf, 60)) return;
4607 #else
4608         if (!get_string("Note: ", buf, 60)) return;
4609 #endif
4610
4611
4612         /* Ignore empty notes */
4613         if (!buf[0] || (buf[0] == ' ')) return;
4614
4615         /* Add the note to the message recall */
4616 #ifdef JP
4617         msg_format("¥á¥â: %s", buf);
4618 #else
4619         msg_format("Note: %s", buf);
4620 #endif
4621
4622 }
4623
4624
4625 /*
4626  * Mention the current version
4627  */
4628 void do_cmd_version(void)
4629 {
4630
4631         /* Silly message */
4632 #ifdef JP
4633         msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4634                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4635 #else
4636         msg_format("You are playing Hengband %d.%d.%d.",
4637                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4638 #endif
4639 }
4640
4641
4642
4643 /*
4644  * Array of feeling strings
4645  */
4646 static cptr do_cmd_feeling_text[11] =
4647 {
4648 #ifdef JP
4649         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4650 #else
4651         "Looks like any other level.",
4652 #endif
4653
4654 #ifdef JP
4655         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4656 #else
4657         "You feel there is something special about this level.",
4658 #endif
4659
4660 #ifdef JP
4661         "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4662 #else
4663         "You nearly faint as horrible visions of death fill your mind!",
4664 #endif
4665
4666 #ifdef JP
4667         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4668 #else
4669         "This level looks very dangerous.",
4670 #endif
4671
4672 #ifdef JP
4673         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4674 #else
4675         "You have a very bad feeling...",
4676 #endif
4677
4678 #ifdef JP
4679         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4680 #else
4681         "You have a bad feeling...",
4682 #endif
4683
4684 #ifdef JP
4685         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4686 #else
4687         "You feel nervous.",
4688 #endif
4689
4690 #ifdef JP
4691         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4692 #else
4693         "You feel your luck is turning...",
4694 #endif
4695
4696 #ifdef JP
4697         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4698 #else
4699         "You don't like the look of this place.",
4700 #endif
4701
4702 #ifdef JP
4703         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4704 #else
4705         "This level looks reasonably safe.",
4706 #endif
4707
4708 #ifdef JP
4709         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4710 #else
4711         "What a boring place..."
4712 #endif
4713
4714 };
4715
4716 static cptr do_cmd_feeling_text_combat[11] =
4717 {
4718 #ifdef JP
4719         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4720 #else
4721         "Looks like any other level.",
4722 #endif
4723
4724 #ifdef JP
4725         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4726 #else
4727         "You feel there is something special about this level.",
4728 #endif
4729
4730 #ifdef JP
4731         "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4732 #else
4733         "You nearly faint as horrible visions of death fill your mind!",
4734 #endif
4735
4736 #ifdef JP
4737         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4738 #else
4739         "This level looks very dangerous.",
4740 #endif
4741
4742 #ifdef JP
4743         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4744 #else
4745         "You have a very bad feeling...",
4746 #endif
4747
4748 #ifdef JP
4749         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4750 #else
4751         "You have a bad feeling...",
4752 #endif
4753
4754 #ifdef JP
4755         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4756 #else
4757         "You feel nervous.",
4758 #endif
4759
4760 #ifdef JP
4761         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4762 #else
4763         "You feel your luck is turning...",
4764 #endif
4765
4766 #ifdef JP
4767         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4768 #else
4769         "You don't like the look of this place.",
4770 #endif
4771
4772 #ifdef JP
4773         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4774 #else
4775         "This level looks reasonably safe.",
4776 #endif
4777
4778 #ifdef JP
4779         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4780 #else
4781         "What a boring place..."
4782 #endif
4783
4784 };
4785
4786 static cptr do_cmd_feeling_text_lucky[11] =
4787 {
4788 #ifdef JP
4789         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4790         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4791         "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4792         "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4793         "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4794         "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4795         "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4796         "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤­¤¿¤«...",
4797         "¸«¤¿´¶¤¸°­¤¯¤Ï¤Ê¤¤...",
4798         "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4799         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4800 #else
4801         "Looks like any other level.",
4802         "You feel there is something special about this level.",
4803         "You have a superb feeling about this level.",
4804         "You have an excellent feeling...",
4805         "You have a very good feeling...",
4806         "You have a good feeling...",
4807         "You feel strangely lucky...",
4808         "You feel your luck is turning...",
4809         "You like the look of this place...",
4810         "This level can't be all bad...",
4811         "What a boring place..."
4812 #endif
4813 };
4814
4815
4816 /*
4817  * Note that "feeling" is set to zero unless some time has passed.
4818  * Note that this is done when the level is GENERATED, not entered.
4819  */
4820 void do_cmd_feeling(void)
4821 {
4822         /* Verify the feeling */
4823         if (feeling > 10) feeling = 10;
4824
4825         /* No useful feeling in quests */
4826         if (p_ptr->inside_quest && !random_quest_number(dun_level))
4827         {
4828 #ifdef JP
4829                 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4830 #else
4831                 msg_print("Looks like a typical quest level.");
4832 #endif
4833
4834                 return;
4835         }
4836
4837         /* No useful feeling in town */
4838         else if (p_ptr->town_num && !dun_level)
4839         {
4840 #ifdef JP
4841                 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4842 #else
4843                 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4844 #endif
4845                 {
4846 #ifdef JP
4847                         msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4848 #else
4849                         msg_print("Looks like a strange wilderness.");
4850 #endif
4851
4852                         return;
4853                 }
4854                 else
4855                 {
4856 #ifdef JP
4857                         msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4858 #else
4859                         msg_print("Looks like a typical town.");
4860 #endif
4861
4862                         return;
4863                 }
4864         }
4865
4866         /* No useful feeling in the wilderness */
4867         else if (!dun_level)
4868         {
4869 #ifdef JP
4870                 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4871 #else
4872                 msg_print("Looks like a typical wilderness.");
4873 #endif
4874
4875                 return;
4876         }
4877
4878         /* Display the feeling */
4879         if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4880         {
4881                 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4882                 else {
4883                                         if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4884                                                 msg_print(do_cmd_feeling_text_combat[feeling]);
4885                                         }else
4886                                                 msg_print(do_cmd_feeling_text[feeling]);
4887                                 }
4888         }
4889         else
4890         {
4891                 msg_print(do_cmd_feeling_text[0]);
4892         }
4893 }
4894
4895
4896
4897 /*
4898  * Description of each monster group.
4899  */
4900 static cptr monster_group_text[] = 
4901 {
4902 #ifdef JP
4903         "¥æ¥Ë¡¼¥¯",     /* "Uniques" */
4904         "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
4905         "¥¢¥ê",
4906         "¥³¥¦¥â¥ê",
4907         "¥à¥«¥Ç",
4908         "¥É¥é¥´¥ó",
4909         "ÌܶÌ",
4910         "¥Í¥³",
4911         "¥´¡¼¥ì¥à",
4912         "ɸ½à¿Í´Ö·¿À¸Êª",
4913         "¥Ù¥È¥Ù¥È",
4914         "¥¼¥ê¡¼",
4915         "¥³¥Ü¥ë¥É",
4916         "¿åÀ³À¸Êª",
4917         "¥â¥ë¥É",
4918         "¥Ê¡¼¥¬",
4919         "¥ª¡¼¥¯",
4920         "¿Í´Ö",
4921         "»Í­½Ã",
4922         "¥Í¥º¥ß",
4923         "¥¹¥±¥ë¥È¥ó",
4924         "¥Ç¡¼¥â¥ó",
4925         "¥Ü¥ë¥Æ¥Ã¥¯¥¹",
4926         "¥¤¥â¥à¥·/Âç·²",
4927         /* "unused", */
4928         "¥¤¡¼¥¯",
4929         "¥¾¥ó¥Ó/¥ß¥¤¥é",
4930         "Å·»È",
4931         "Ļ",
4932         "¸¤",
4933         /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4934         "¥¨¥ì¥á¥ó¥¿¥ë",
4935         "¥È¥ó¥Ü",
4936         "¥´¡¼¥¹¥È",
4937         "»¨¼ï",
4938         "º«Ãî",
4939         "¥Ø¥Ó",
4940         "¥­¥é¡¼¡¦¥Ó¡¼¥È¥ë",
4941         "¥ê¥Ã¥Á",
4942         "¿¼ó¤Îà¨ÃîÎà",
4943         "Ææ¤ÎÀ¸Êª",
4944         "¥ª¡¼¥¬",
4945         "µðÂç¿Í´Ö·¿À¸Êª",
4946         "¥¯¥¤¥ë¥¹¥ë¥°",
4947         "à¨ÃîÎà/ξÀ¸Îà",
4948         "ÃØéá/¥µ¥½¥ê/¥À¥Ë",
4949         "¥È¥í¥ë",
4950         /* "¾åµé¥Ç¡¼¥â¥ó", */
4951         "¥Ð¥ó¥Ñ¥¤¥¢",
4952         "¥ï¥¤¥È/¥ì¥¤¥¹/Åù",
4953         "¥¾¡¼¥ó/¥¶¥ì¥ó/Åù",
4954         "¥¤¥¨¥Æ¥£",
4955         "¥Ï¥¦¥ó¥É",
4956         "¥ß¥ß¥Ã¥¯",
4957         "ÊÉ/¿¢Êª/µ¤ÂÎ",
4958         "¤ª¤Ð¤±¥­¥Î¥³",
4959         "µåÂÎ",
4960 #else
4961         "Uniques",
4962         "Ridable monsters",
4963         "Ant",
4964         "Bat",
4965         "Centipede",
4966         "Dragon",
4967         "Floating Eye",
4968         "Feline",
4969         "Golem",
4970         "Hobbit/Elf/Dwarf",
4971         "Icky Thing",
4972         "Jelly",
4973         "Kobold",
4974         "Aquatic monster",
4975         "Mold",
4976         "Naga",
4977         "Orc",
4978         "Person/Human",
4979         "Quadruped",
4980         "Rodent",
4981         "Skeleton",
4982         "Demon",
4983         "Vortex",
4984         "Worm/Worm-Mass",
4985         /* "unused", */
4986         "Yeek",
4987         "Zombie/Mummy",
4988         "Angel",
4989         "Bird",
4990         "Canine",
4991         /* "Ancient Dragon/Wyrm", */
4992         "Elemental",
4993         "Dragon Fly",
4994         "Ghost",
4995         "Hybrid",
4996         "Insect",
4997         "Snake",
4998         "Killer Beetle",
4999         "Lich",
5000         "Multi-Headed Reptile",
5001         "Mystery Living",
5002         "Ogre",
5003         "Giant Humanoid",
5004         "Quylthulg",
5005         "Reptile/Amphibian",
5006         "Spider/Scorpion/Tick",
5007         "Troll",
5008         /* "Major Demon", */
5009         "Vampire",
5010         "Wight/Wraith/etc",
5011         "Xorn/Xaren/etc",
5012         "Yeti",
5013         "Zephyr Hound",
5014         "Mimic",
5015         "Wall/Plant/Gas",
5016         "Mushroom patch",
5017         "Ball",
5018 #endif
5019         NULL
5020 };
5021
5022
5023 /*
5024  * Symbols of monsters in each group. Note the "Uniques" group
5025  * is handled differently.
5026  */
5027 static cptr monster_group_char[] = 
5028 {
5029         (char *) -1L,
5030         (char *) -2L,
5031         "a",
5032         "b",
5033         "c",
5034         "dD",
5035         "e",
5036         "f",
5037         "g",
5038         "h",
5039         "i",
5040         "j",
5041         "k",
5042         "l",
5043         "m",
5044         "n",
5045         "o",
5046         "pt",
5047         "q",
5048         "r",
5049         "s",
5050         "uU",
5051         "v",
5052         "w",
5053         /* "x", */
5054         "y",
5055         "z",
5056         "A",
5057         "B",
5058         "C",
5059         /* "D", */
5060         "E",
5061         "F",
5062         "G",
5063         "H",
5064         "I",
5065         "J",
5066         "K",
5067         "L",
5068         "M",
5069         "N",
5070         "O",
5071         "P",
5072         "Q",
5073         "R",
5074         "S",
5075         "T",
5076         /* "U", */
5077         "V",
5078         "W",
5079         "X",
5080         "Y",
5081         "Z",
5082         "$!?=&`.|/\\~[]()>",
5083         "#",
5084         ",",
5085         "*",
5086         NULL
5087 };
5088
5089
5090 /*
5091  * hook function to sort monsters by level
5092  */
5093 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5094 {
5095         u16b *who = (u16b*)(u);
5096
5097         int w1 = who[a];
5098         int w2 = who[b];
5099
5100         monster_race *r_ptr1 = &r_info[w1];
5101         monster_race *r_ptr2 = &r_info[w2];
5102
5103         /* Unused */
5104         (void)v;
5105
5106         if (r_ptr2->level > r_ptr1->level) return TRUE;
5107         if (r_ptr1->level > r_ptr2->level) return FALSE;
5108
5109         if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5110         if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5111         return w1 <= w2;
5112 }
5113
5114 /*
5115  * Build a list of monster indexes in the given group. Return the number
5116  * of monsters in the group.
5117  *
5118  * mode & 0x01 : check for non-empty group
5119  * mode & 0x02 : cheat?
5120  */
5121 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5122 {
5123         int i, mon_cnt = 0;
5124         int dummy_why;
5125
5126         /* Get a list of x_char in this group */
5127         cptr group_char = monster_group_char[grp_cur];
5128
5129         /* XXX Hack -- Check if this is the "Uniques" group */
5130         bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5131
5132         /* XXX Hack -- Check if this is the "Riding" group */
5133         bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
5134
5135         /* Check every race */
5136         for (i = 0; i < max_r_idx; i++)
5137         {
5138                 /* Access the race */
5139                 monster_race *r_ptr = &r_info[i];
5140
5141                 /* Skip empty race */
5142                 if (!r_ptr->name) continue ;
5143
5144                 /* Require known monsters */
5145                 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5146
5147                 if (grp_unique)
5148                 {
5149                         if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5150                 }
5151
5152                 else if (grp_riding)
5153                 {
5154                         if (!(r_ptr->flags7 & RF7_RIDING)) continue;
5155                 }
5156
5157                 else
5158                 {
5159                         /* Check for race in the group */
5160                         if (!my_strchr(group_char, r_ptr->d_char)) continue;
5161                 }
5162
5163                 /* Add the race */
5164                 mon_idx[mon_cnt++] = i;
5165
5166                 /* XXX Hack -- Just checking for non-empty group */
5167                 if (mode & 0x01) break;
5168         }
5169
5170         /* Terminate the list */
5171         mon_idx[mon_cnt] = 0;
5172
5173         /* Select the sort method */
5174         ang_sort_comp = ang_sort_comp_monster_level;
5175         ang_sort_swap = ang_sort_swap_hook;
5176
5177         /* Sort by monster level */
5178         ang_sort(mon_idx, &dummy_why, mon_cnt);
5179
5180         /* Return the number of races */
5181         return mon_cnt;
5182 }
5183
5184
5185 /*
5186  * Description of each monster group.
5187  */
5188 static cptr object_group_text[] = 
5189 {
5190 #ifdef JP
5191         "¥­¥Î¥³",       /* "Mushrooms" */
5192         "Ìô",           /* "Potions" */
5193         "Ìý¤Ä¤Ü",       /* "Flasks" */
5194         "´¬Êª",         /* "Scrolls" */
5195         "»ØÎØ",         /* "Rings" */
5196         "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5197         "ū",           /* "Whistle" */
5198         "¸÷¸»",         /* "Lanterns" */
5199         "ËâË¡ËÀ",       /* "Wands" */
5200         "¾ó",           /* "Staffs" */
5201         "¥í¥Ã¥É",       /* "Rods" */
5202         "¥«¡¼¥É",       /* "Cards" */
5203         "¥­¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5204         "ÍÓÈé»æ",       
5205         "¤¯¤µ¤Ó",
5206         "Ȣ",
5207         "¿Í·Á",
5208         "Áü",
5209         "¥´¥ß",
5210         "¶õ¤Î¥Ó¥ó",
5211         "¹ü",
5212         "Åá·õÎà",       /* "Swords" */
5213         "Æß´ï",         /* "Blunt Weapons" */
5214         "ĹÊÁÉð´ï",     /* "Polearms" */
5215         "ºÎ·¡Æ»¶ñ",     /* "Diggers" */
5216         "Èô¤ÓÆ»¶ñ",     /* "Bows" */
5217         "ÃÆ",
5218         "Ìð",
5219         "¥Ü¥ë¥È",
5220         "·ÚÁõ³»",       /* "Soft Armor" */
5221         "½ÅÁõ³»",       /* "Hard Armor" */
5222         "¥É¥é¥´¥ó³»",   /* "Dragon Armor" */
5223         "½â",   /* "Shields" */
5224         "¥¯¥í¡¼¥¯",     /* "Cloaks" */
5225         "äƼê", /* "Gloves" */
5226         "¥Ø¥ë¥á¥Ã¥È",   /* "Helms" */
5227         "´§",   /* "Crowns" */
5228         "¥Ö¡¼¥Ä",       /* "Boots" */
5229         "ËâË¡½ñ",
5230 #else
5231         "Mushrooms",
5232         "Potions",
5233         "Flasks",
5234         "Scrolls",
5235         "Rings",
5236         "Amulets",
5237         "Whistle",
5238         "Lanterns",
5239         "Wands",
5240         "Staves",
5241         "Rods",
5242         "Cards",
5243         "Capture Balls",
5244         "Parchments",
5245         "Spikes",
5246         "Boxs",
5247         "Figurines",
5248         "Statues",
5249         "Junks",
5250         "Bottles",
5251         "Skeletons",
5252         "Swords",
5253         "Blunt Weapons",
5254         "Polearms",
5255         "Diggers",
5256         "Bows",
5257         "Shots",
5258         "Arrows",
5259         "Bolts",
5260         "Soft Armor",
5261         "Hard Armor",
5262         "Dragon Armor",
5263         "Shields",
5264         "Cloaks",
5265         "Gloves",
5266         "Helms",
5267         "Crowns",
5268         "Boots",
5269         "Spellbooks",
5270 #endif
5271         NULL
5272 };
5273
5274
5275 /*
5276  * TVALs of items in each group
5277  */
5278 static byte object_group_tval[] = 
5279 {
5280         TV_FOOD,
5281         TV_POTION,
5282         TV_FLASK,
5283         TV_SCROLL,
5284         TV_RING,
5285         TV_AMULET,
5286         TV_WHISTLE,
5287         TV_LITE,
5288         TV_WAND,
5289         TV_STAFF,
5290         TV_ROD,
5291         TV_CARD,
5292         TV_CAPTURE,
5293         TV_PARCHMENT,
5294         TV_SPIKE,
5295         TV_CHEST,
5296         TV_FIGURINE,
5297         TV_STATUE,
5298         TV_JUNK,
5299         TV_BOTTLE,
5300         TV_SKELETON,
5301         TV_SWORD,
5302         TV_HAFTED,
5303         TV_POLEARM,
5304         TV_DIGGING,
5305         TV_BOW,
5306         TV_SHOT,
5307         TV_ARROW,
5308         TV_BOLT,
5309         TV_SOFT_ARMOR,
5310         TV_HARD_ARMOR,
5311         TV_DRAG_ARMOR,
5312         TV_SHIELD,
5313         TV_CLOAK,
5314         TV_GLOVES,
5315         TV_HELM,
5316         TV_CROWN,
5317         TV_BOOTS,
5318         TV_LIFE_BOOK, /* Hack -- all spellbooks */
5319         0
5320 };
5321
5322
5323 /*
5324  * Build a list of monster indexes in the given group. Return the number
5325  * of monsters in the group.
5326  */
5327 static int collect_objects(int grp_cur, int object_idx[])
5328 {
5329         int i, j, k, object_cnt = 0;
5330
5331         /* Get a list of x_char in this group */
5332         byte group_tval = object_group_tval[grp_cur];
5333
5334         /* Check every object */
5335         for (i = 0; i < max_k_idx; i++)
5336         {
5337                 /* Access the race */
5338                 object_kind *k_ptr = &k_info[i];
5339
5340                 /* Skip empty objects */
5341                 if (!k_ptr->name) continue;
5342
5343                 /* Skip non-flavoured objects */
5344                 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5345
5346                 /* Skip items with no distribution (special artifacts) */
5347                 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5348                 if (!(k))  continue; 
5349
5350                 /* Require objects ever seen*/
5351                 if (!k_ptr->aware && !p_ptr->wizard) continue;
5352
5353                 /* Check for race in the group */
5354                 if (TV_LIFE_BOOK == group_tval)
5355                 {
5356                         /* Hack -- All spell books */
5357                         if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5358                         {
5359                                 /* Add the race */
5360                                 object_idx[object_cnt++] = i;
5361                         }
5362                 }
5363                 else if (k_ptr->tval == group_tval)
5364                 {
5365                         /* Add the race */
5366                         object_idx[object_cnt++] = i;
5367                 }
5368         }
5369
5370         /* Terminate the list */
5371         object_idx[object_cnt] = 0;
5372
5373         /* Return the number of races */
5374         return object_cnt;
5375 }
5376
5377
5378 /*
5379  * Description of each feature group.
5380  */
5381 static cptr feature_group_text[] = 
5382 {
5383         "terrains",
5384         NULL
5385 };
5386
5387
5388 /*
5389  * Build a list of feature indexes in the given group. Return the number
5390  * of features in the group.
5391  */
5392 static int collect_features(int grp_cur, int *feat_idx)
5393 {
5394         int i, feat_cnt = 0;
5395
5396         /* Unused;  There is a single group. */
5397         (void)grp_cur;
5398
5399         /* Check every feature */
5400         for (i = 1; i < max_f_idx; i++)
5401         {
5402                 /* Access the index */
5403                 feature_type *f_ptr = &f_info[i];
5404
5405                 /* Skip empty index */
5406                 if (!f_ptr->name) continue;
5407
5408                 /* Skip mimiccing features */
5409                 if (f_ptr->mimic != i) continue;
5410
5411                 /* Add the index */
5412                 feat_idx[feat_cnt++] = i;
5413         }
5414
5415         /* Terminate the list */
5416         feat_idx[feat_cnt] = 0;
5417
5418         /* Return the number of races */
5419         return feat_cnt;
5420 }
5421
5422
5423 #if 0
5424 /*
5425  * Build a list of monster indexes in the given group. Return the number
5426  * of monsters in the group.
5427  */
5428 static int collect_artifacts(int grp_cur, int object_idx[])
5429 {
5430         int i, object_cnt = 0;
5431
5432         /* Get a list of x_char in this group */
5433         byte group_tval = object_group_tval[grp_cur];
5434
5435         /* Check every object */
5436         for (i = 0; i < max_a_idx; i++)
5437         {
5438                 /* Access the artifact */
5439                 artifact_type *a_ptr = &a_info[i];
5440
5441                 /* Skip empty artifacts */
5442                 if (!a_ptr->name) continue;
5443
5444                 /* Skip "uncreated" artifacts */
5445                 if (!a_ptr->cur_num) continue;
5446
5447                 /* Check for race in the group */
5448                 if (a_ptr->tval == group_tval)
5449                 {
5450                         /* Add the race */
5451                         object_idx[object_cnt++] = i;
5452                 }
5453         }
5454
5455         /* Terminate the list */
5456         object_idx[object_cnt] = 0;
5457
5458         /* Return the number of races */
5459         return object_cnt;
5460 }
5461 #endif /* 0 */
5462
5463
5464 /*
5465  * Encode the screen colors
5466  */
5467 static char hack[17] = "dwsorgbuDWvyRGBU";
5468
5469
5470 /*
5471  * Hack -- load a screen dump from a file
5472  */
5473 void do_cmd_load_screen(void)
5474 {
5475         int i, y, x;
5476
5477         byte a = 0;
5478         char c = ' ';
5479
5480         bool okay = TRUE;
5481
5482         FILE *fff;
5483
5484         char buf[1024];
5485
5486         int wid, hgt;
5487
5488         Term_get_size(&wid, &hgt);
5489
5490         /* Build the filename */
5491         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5492
5493         /* Append to the file */
5494         fff = my_fopen(buf, "r");
5495
5496         /* Oops */
5497         if (!fff) {
5498 #ifdef JP
5499                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5500 #else
5501                 msg_format("Failed to open %s.", buf);
5502 #endif
5503                 msg_print(NULL);
5504                 return;
5505         }
5506
5507
5508         /* Save the screen */
5509         screen_save();
5510
5511         /* Clear the screen */
5512         Term_clear();
5513
5514
5515         /* Load the screen */
5516         for (y = 0; okay; y++)
5517         {
5518                 /* Get a line of data including control code */
5519                 if (!fgets(buf, 1024, fff)) okay = FALSE;
5520
5521                 /* Get the blank line */
5522                 if (buf[0] == '\n' || buf[0] == '\0') break;
5523
5524                 /* Ignore too large screen image */
5525                 if (y >= hgt) continue;
5526
5527                 /* Show each row */
5528                 for (x = 0; x < wid - 1; x++)
5529                 {
5530                         /* End of line */
5531                         if (buf[x] == '\n' || buf[x] == '\0') break;
5532
5533                         /* Put the attr/char */
5534                         Term_draw(x, y, TERM_WHITE, buf[x]);
5535                 }
5536         }
5537
5538         /* Dump the screen */
5539         for (y = 0; okay; y++)
5540         {
5541                 /* Get a line of data including control code */
5542                 if (!fgets(buf, 1024, fff)) okay = FALSE;
5543
5544                 /* Get the blank line */
5545                 if (buf[0] == '\n' || buf[0] == '\0') break;
5546
5547                 /* Ignore too large screen image */
5548                 if (y >= hgt) continue;
5549
5550                 /* Dump each row */
5551                 for (x = 0; x < wid - 1; x++)
5552                 {
5553                         /* End of line */
5554                         if (buf[x] == '\n' || buf[x] == '\0') break;
5555
5556                         /* Get the attr/char */
5557                         (void)(Term_what(x, y, &a, &c));
5558
5559                         /* Look up the attr */
5560                         for (i = 0; i < 16; i++)
5561                         {
5562                                 /* Use attr matches */
5563                                 if (hack[i] == buf[x]) a = i;
5564                         }
5565
5566                         /* Put the attr/char */
5567                         Term_draw(x, y, a, c);
5568                 }
5569         }
5570
5571
5572         /* Close it */
5573         my_fclose(fff);
5574
5575
5576         /* Message */
5577 #ifdef JP
5578         prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤µ¤ì¤¿²èÌÌ(µ­Ç°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5579 #else
5580         msg_print("Screen dump loaded.");
5581 #endif
5582
5583         flush();
5584         inkey();
5585
5586
5587         /* Restore the screen */
5588         screen_load();
5589 }
5590
5591
5592
5593
5594 cptr inven_res_label = 
5595 #ifdef JP
5596  "                               »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5597 #else
5598  "                               AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5599 #endif
5600
5601
5602 #ifdef JP
5603 #define IM_FLAG_STR  "¡ö"
5604 #define HAS_FLAG_STR "¡Ü"
5605 #define NO_FLAG_STR  "¡¦"
5606 #else
5607 #define IM_FLAG_STR  "* "
5608 #define HAS_FLAG_STR "+ "
5609 #define NO_FLAG_STR  ". "
5610 #endif
5611
5612 #define print_im_or_res_flag(IM, RES) \
5613 { \
5614         fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5615               (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5616 }
5617
5618 #define print_flag(TR) \
5619 { \
5620         fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5621 }
5622
5623
5624 /* XTRA HACK RESLIST */
5625 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5626 {
5627         char o_name[MAX_NLEN];
5628         u32b flgs[TR_FLAG_SIZE];
5629
5630         if (!o_ptr->k_idx) return;
5631         if (o_ptr->tval != tval) return;
5632
5633         /* Identified items only */
5634         if (!object_known_p(o_ptr)) return;
5635
5636         /*
5637          * HACK:Ring of Lordly protection and Dragon equipment
5638          * have random resistances.
5639          */
5640         if (((TV_EQUIP_BEGIN <= tval) && (tval <= TV_EQUIP_END) && o_ptr->name2)
5641             || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5642             || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5643             || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5644             || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5645             || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5646             || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5647             || o_ptr->art_name || o_ptr->name1)
5648         {
5649                 int i = 0;
5650                 object_desc(o_name, o_ptr, TRUE, 0);
5651
5652                 while (o_name[i] && (i < 26))
5653                 {
5654 #ifdef JP
5655                         if (iskanji(o_name[i])) i++;
5656 #endif
5657                         i++;
5658                 }
5659
5660                 if (i < 28)
5661                 {
5662                         while (i < 28)
5663                         {
5664                                 o_name[i] = ' '; i++;
5665                         }
5666                 }
5667                 o_name[i] = '\0';
5668
5669                 fprintf(fff, "%s %s", where, o_name);
5670
5671                 if (!(o_ptr->ident & (IDENT_MENTAL)))
5672                 {
5673 #ifdef JP
5674                         fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5675 #else
5676                         fputs("-------unknown------------ -------unknown------\n", fff);
5677 #endif
5678                 }
5679                 else
5680                 {
5681                         object_flags_known(o_ptr, flgs);
5682
5683                         print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5684                         print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5685                         print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5686                         print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5687                         print_flag(TR_RES_POIS);
5688                         print_flag(TR_RES_LITE);
5689                         print_flag(TR_RES_DARK);
5690                         print_flag(TR_RES_SHARDS);
5691                         print_flag(TR_RES_SOUND);
5692                         print_flag(TR_RES_NETHER);
5693                         print_flag(TR_RES_NEXUS);
5694                         print_flag(TR_RES_CHAOS);
5695                         print_flag(TR_RES_DISEN);
5696
5697                         fputs(" ", fff);
5698
5699                         print_flag(TR_RES_BLIND);
5700                         print_flag(TR_RES_FEAR);
5701                         print_flag(TR_RES_CONF);
5702                         print_flag(TR_FREE_ACT);
5703                         print_flag(TR_SEE_INVIS);
5704                         print_flag(TR_HOLD_LIFE);
5705                         print_flag(TR_TELEPATHY);
5706                         print_flag(TR_SLOW_DIGEST);
5707                         print_flag(TR_REGEN);
5708                         print_flag(TR_FEATHER);
5709
5710                         fputc('\n', fff);
5711                 }
5712                 (*j)++;
5713                 if (*j == 9)
5714                 {
5715                         *j = 0;
5716                         fprintf(fff, "%s\n", inven_res_label);
5717                 }
5718         }
5719 }
5720
5721 /*
5722  * Display *ID* ed weapons/armors's resistances
5723  */
5724 static void do_cmd_knowledge_inven(void)
5725 {
5726         FILE *fff;
5727
5728         char file_name[1024];
5729
5730         store_type  *st_ptr;
5731
5732         byte tval;
5733         int i = 0;
5734         int j = 0;
5735
5736         char  where[32];
5737
5738         /* Open a new file */
5739         fff = my_fopen_temp(file_name, 1024);
5740         if (!fff)
5741         {
5742 #ifdef JP
5743             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5744 #else
5745             msg_format("Failed to create temporary file %s.", file_name);
5746 #endif
5747             msg_print(NULL);
5748             return;
5749         }
5750         fprintf(fff, "%s\n", inven_res_label);
5751
5752         for (tval = TV_EQUIP_BEGIN; tval <= TV_EQUIP_END; tval++)
5753         {
5754                 if (j != 0)
5755                 {
5756                         for (; j < 9; j++) fputc('\n', fff);
5757                         j = 0;
5758                         fprintf(fff, "%s\n", inven_res_label);
5759                 }
5760
5761 #ifdef JP
5762                 strcpy(where, "Áõ");
5763 #else
5764                 strcpy(where, "E ");
5765 #endif
5766                 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5767                 {
5768                         do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5769                 }
5770
5771 #ifdef JP
5772                 strcpy(where, "»ý");
5773 #else
5774                 strcpy(where, "I ");
5775 #endif
5776                 for (i = 0; i < INVEN_PACK; i++)
5777                 {
5778                         do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5779                 }
5780
5781                 st_ptr = &town[1].store[STORE_HOME];
5782 #ifdef JP
5783                 strcpy(where, "²È");
5784 #else
5785                 strcpy(where, "H ");
5786 #endif
5787
5788                 for (i = 0; i < st_ptr->stock_num; i++)
5789                 {
5790                         do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5791                 }
5792         }
5793
5794         /* Close the file */
5795         my_fclose(fff);
5796
5797         /* Display the file contents */
5798 #ifdef JP
5799         show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ­¥ê¥¹¥È", 0, 0);
5800 #else
5801         show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5802 #endif
5803
5804         /* Remove the file */
5805         fd_kill(file_name);
5806 }
5807
5808
5809 void do_cmd_save_screen_html_aux(char *filename, int message)
5810 {
5811         int y, x, i;
5812
5813         byte a = 0, old_a = 0;
5814         char c = ' ';
5815
5816         FILE *fff, *tmpfff;
5817         char buf[2048];
5818
5819         int yomikomu = 0;
5820         cptr tags[4] = {
5821                 "HEADER_START:",
5822                 "HEADER_END:",
5823                 "FOOTER_START:",
5824                 "FOOTER_END:",
5825         };
5826
5827         cptr html_head[] = {
5828                 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5829                 "<pre>",
5830                 0,
5831         };
5832         cptr html_foot[] = {
5833                 "</pre>\n",
5834                 "</body>\n</html>\n",
5835                 0,
5836         };
5837
5838         int wid, hgt;
5839
5840         Term_get_size(&wid, &hgt);
5841
5842         /* File type is "TEXT" */
5843         FILE_TYPE(FILE_TYPE_TEXT);
5844
5845         /* Append to the file */
5846         fff = my_fopen(filename, "w");
5847
5848         /* Oops */
5849         if (!fff) {
5850                 if (message) {
5851 #ifdef JP
5852                     msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5853 #else
5854                     msg_format("Failed to open file %s.", filename);
5855 #endif
5856                     msg_print(NULL);
5857                 }
5858                 
5859                 return;
5860         }
5861
5862         /* Save the screen */
5863         if (message)
5864                 screen_save();
5865
5866         /* Build the filename */
5867         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5868         tmpfff = my_fopen(buf, "r");
5869         if (!tmpfff) {
5870                 for (i = 0; html_head[i]; i++)
5871                         fprintf(fff, html_head[i]);
5872         }
5873         else {
5874                 yomikomu = 0;
5875                 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5876                         if (!yomikomu) {
5877                                 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5878                                         yomikomu = 1;
5879                         }
5880                         else {
5881                                 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5882                                         break;
5883                                 fprintf(fff, "%s\n", buf);
5884                         }
5885                 }
5886         }
5887
5888         /* Dump the screen */
5889         for (y = 0; y < hgt; y++)
5890         {
5891                 /* Start the row */
5892                 if (y != 0)
5893                         fprintf(fff, "\n");
5894
5895                 /* Dump each row */
5896                 for (x = 0; x < wid - 1; x++)
5897                 {
5898                         int rv, gv, bv;
5899                         cptr cc = NULL;
5900                         /* Get the attr/char */
5901                         (void)(Term_what(x, y, &a, &c));
5902
5903                         switch (c)
5904                         {
5905                         case '&': cc = "&amp;"; break;
5906                         case '<': cc = "&lt;"; break;
5907                         case '>': cc = "&gt;"; break;
5908 #ifdef WINDOWS
5909                         case 0x1f: c = '.'; break;
5910                         case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5911 #endif
5912                         }
5913
5914                         a = a & 0x0F;
5915                         if ((y == 0 && x == 0) || a != old_a) {
5916                                 rv = angband_color_table[a][1];
5917                                 gv = angband_color_table[a][2];
5918                                 bv = angband_color_table[a][3];
5919                                 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">", 
5920                                         ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5921                                 old_a = a;
5922                         }
5923                         if (cc)
5924                                 fprintf(fff, "%s", cc);
5925                         else
5926                                 fprintf(fff, "%c", c);
5927                 }
5928         }
5929         fprintf(fff, "</font>");
5930
5931         if (!tmpfff) {
5932                 for (i = 0; html_foot[i]; i++)
5933                         fprintf(fff, html_foot[i]);
5934         }
5935         else {
5936                 rewind(tmpfff);
5937                 yomikomu = 0;
5938                 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5939                         if (!yomikomu) {
5940                                 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5941                                         yomikomu = 1;
5942                         }
5943                         else {
5944                                 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5945                                         break;
5946                                 fprintf(fff, "%s\n", buf);
5947                         }
5948                 }
5949                 my_fclose(tmpfff);
5950         }
5951
5952         /* Skip a line */
5953         fprintf(fff, "\n");
5954
5955         /* Close it */
5956         my_fclose(fff);
5957
5958         /* Message */
5959         if (message) {
5960 #ifdef JP
5961         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
5962 #else
5963                 msg_print("Screen dump saved.");
5964 #endif
5965                 msg_print(NULL);
5966         }
5967
5968         /* Restore the screen */
5969         if (message)
5970                 screen_load();
5971 }
5972
5973 /*
5974  * Hack -- save a screen dump to a file
5975  */
5976 static void do_cmd_save_screen_html(void)
5977 {
5978         char buf[1024], tmp[256] = "screen.html";
5979
5980 #ifdef JP
5981         if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
5982 #else
5983         if (!get_string("File name: ", tmp, 80))
5984 #endif
5985                 return;
5986
5987         /* Build the filename */
5988         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5989
5990         msg_print(NULL);
5991
5992         do_cmd_save_screen_html_aux(buf, 1);
5993 }
5994
5995
5996 /*
5997  * Redefinable "save_screen" action
5998  */
5999 void (*screendump_aux)(void) = NULL;
6000
6001
6002 /*
6003  * Hack -- save a screen dump to a file
6004  */
6005 void do_cmd_save_screen(void)
6006 {
6007         bool old_use_graphics = use_graphics;
6008         bool html_dump = FALSE;
6009
6010         int wid, hgt;
6011
6012 #ifdef JP
6013         prt("µ­Ç°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
6014 #else
6015         prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6016 #endif
6017         while(TRUE)
6018         {
6019                 char c = inkey();
6020                 if (c == 'Y' || c == 'y')
6021                         break;
6022                 else if (c == 'H' || c == 'h')
6023                 {
6024                         html_dump = TRUE;
6025                         break;
6026                 }
6027                 else
6028                 {
6029                         prt("", 0, 0);
6030                         return;
6031                 }
6032         }
6033
6034         Term_get_size(&wid, &hgt);
6035
6036         if (old_use_graphics)
6037         {
6038                 use_graphics = FALSE;
6039                 reset_visuals();
6040
6041                 /* Redraw everything */
6042                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6043
6044                 /* Hack -- update */
6045                 handle_stuff();
6046         }
6047
6048         if (html_dump)
6049         {
6050                 do_cmd_save_screen_html();
6051                 do_cmd_redraw();
6052         }
6053
6054         /* Do we use a special screendump function ? */
6055         else if (screendump_aux)
6056         {
6057                 /* Dump the screen to a graphics file */
6058                 (*screendump_aux)();
6059         }
6060         else /* Dump the screen as text */
6061         {
6062                 int y, x;
6063
6064                 byte a = 0;
6065                 char c = ' ';
6066
6067                 FILE *fff;
6068
6069                 char buf[1024];
6070
6071                 /* Build the filename */
6072                 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6073
6074                 /* File type is "TEXT" */
6075                 FILE_TYPE(FILE_TYPE_TEXT);
6076
6077                 /* Append to the file */
6078                 fff = my_fopen(buf, "w");
6079
6080                 /* Oops */
6081                 if (!fff)
6082                 {
6083 #ifdef JP
6084                         msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6085 #else
6086                         msg_format("Failed to open file %s.", buf);
6087 #endif
6088                         msg_print(NULL);
6089                         return;
6090                 }
6091
6092
6093                 /* Save the screen */
6094                 screen_save();
6095
6096
6097                 /* Dump the screen */
6098                 for (y = 0; y < hgt; y++)
6099                 {
6100                         /* Dump each row */
6101                         for (x = 0; x < wid - 1; x++)
6102                         {
6103                                 /* Get the attr/char */
6104                                 (void)(Term_what(x, y, &a, &c));
6105
6106                                 /* Dump it */
6107                                 buf[x] = c;
6108                         }
6109
6110                         /* Terminate */
6111                         buf[x] = '\0';
6112
6113                         /* End the row */
6114                         fprintf(fff, "%s\n", buf);
6115                 }
6116
6117                 /* Skip a line */
6118                 fprintf(fff, "\n");
6119
6120
6121                 /* Dump the screen */
6122                 for (y = 0; y < hgt; y++)
6123                 {
6124                         /* Dump each row */
6125                         for (x = 0; x < wid - 1; x++)
6126                         {
6127                                 /* Get the attr/char */
6128                                 (void)(Term_what(x, y, &a, &c));
6129
6130                                 /* Dump it */
6131                                 buf[x] = hack[a&0x0F];
6132                         }
6133
6134                         /* Terminate */
6135                         buf[x] = '\0';
6136
6137                         /* End the row */
6138                         fprintf(fff, "%s\n", buf);
6139                 }
6140
6141                 /* Skip a line */
6142                 fprintf(fff, "\n");
6143
6144
6145                 /* Close it */
6146                 my_fclose(fff);
6147
6148                 /* Message */
6149 #ifdef JP
6150         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
6151 #else
6152                 msg_print("Screen dump saved.");
6153 #endif
6154
6155                 msg_print(NULL);
6156
6157
6158                 /* Restore the screen */
6159                 screen_load();
6160         }
6161
6162         if (old_use_graphics)
6163         {
6164                 use_graphics = TRUE;
6165                 reset_visuals();
6166
6167                 /* Redraw everything */
6168                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6169
6170                 /* Hack -- update */
6171                 handle_stuff();
6172         }
6173 }
6174
6175
6176 /*
6177  * Sorting hook -- Comp function -- see below
6178  *
6179  * We use "u" to point to array of monster indexes,
6180  * and "v" to select the type of sorting to perform on "u".
6181  */
6182 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6183 {
6184         u16b *who = (u16b*)(u);
6185
6186         u16b *why = (u16b*)(v);
6187
6188         int w1 = who[a];
6189         int w2 = who[b];
6190
6191         int z1, z2;
6192
6193         /* Sort by total kills */
6194         if (*why >= 3)
6195         {
6196                 /* Extract total kills */
6197                 z1 = a_info[w1].tval;
6198                 z2 = a_info[w2].tval;
6199
6200                 /* Compare total kills */
6201                 if (z1 < z2) return (TRUE);
6202                 if (z1 > z2) return (FALSE);
6203         }
6204
6205
6206         /* Sort by monster level */
6207         if (*why >= 2)
6208         {
6209                 /* Extract levels */
6210                 z1 = a_info[w1].sval;
6211                 z2 = a_info[w2].sval;
6212
6213                 /* Compare levels */
6214                 if (z1 < z2) return (TRUE);
6215                 if (z1 > z2) return (FALSE);
6216         }
6217
6218
6219         /* Sort by monster experience */
6220         if (*why >= 1)
6221         {
6222                 /* Extract experience */
6223                 z1 = a_info[w1].level;
6224                 z2 = a_info[w2].level;
6225
6226                 /* Compare experience */
6227                 if (z1 < z2) return (TRUE);
6228                 if (z1 > z2) return (FALSE);
6229         }
6230
6231
6232         /* Compare indexes */
6233         return (w1 <= w2);
6234 }
6235
6236
6237 /*
6238  * Sorting hook -- Swap function -- see below
6239  *
6240  * We use "u" to point to array of monster indexes,
6241  * and "v" to select the type of sorting to perform.
6242  */
6243 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6244 {
6245         u16b *who = (u16b*)(u);
6246
6247         u16b holder;
6248
6249         /* Unused */
6250         (void)v;
6251
6252         /* Swap */
6253         holder = who[a];
6254         who[a] = who[b];
6255         who[b] = holder;
6256 }
6257
6258
6259 /*
6260  * Check the status of "artifacts"
6261  */
6262 static void do_cmd_knowledge_artifacts(void)
6263 {
6264         int i, k, z, x, y, n = 0;
6265         u16b why = 3;
6266         s16b *who;
6267
6268         FILE *fff;
6269
6270         char file_name[1024];
6271
6272         char base_name[MAX_NLEN];
6273
6274         bool *okay;
6275
6276         /* Open a new file */
6277         fff = my_fopen_temp(file_name, 1024);
6278
6279         if (!fff) {
6280 #ifdef JP
6281             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6282 #else
6283             msg_format("Failed to create temporary file %s.", file_name);
6284 #endif
6285             msg_print(NULL);
6286             return;
6287         }
6288
6289         /* Allocate the "who" array */
6290         C_MAKE(who, max_a_idx, s16b);
6291
6292         /* Allocate the "okay" array */
6293         C_MAKE(okay, max_a_idx, bool);
6294
6295         /* Scan the artifacts */
6296         for (k = 0; k < max_a_idx; k++)
6297         {
6298                 artifact_type *a_ptr = &a_info[k];
6299
6300                 /* Default */
6301                 okay[k] = FALSE;
6302
6303                 /* Skip "empty" artifacts */
6304                 if (!a_ptr->name) continue;
6305
6306                 /* Skip "uncreated" artifacts */
6307                 if (!a_ptr->cur_num) continue;
6308
6309                 /* Assume okay */
6310                 okay[k] = TRUE;
6311         }
6312
6313         /* Check the dungeon */
6314         for (y = 0; y < cur_hgt; y++)
6315         {
6316                 for (x = 0; x < cur_wid; x++)
6317                 {
6318                         cave_type *c_ptr = &cave[y][x];
6319
6320                         s16b this_o_idx, next_o_idx = 0;
6321
6322                         /* Scan all objects in the grid */
6323                         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6324                         {
6325                                 object_type *o_ptr;
6326
6327                                 /* Acquire object */
6328                                 o_ptr = &o_list[this_o_idx];
6329
6330                                 /* Acquire next object */
6331                                 next_o_idx = o_ptr->next_o_idx;
6332
6333                                 /* Ignore non-artifacts */
6334                                 if (!artifact_p(o_ptr)) continue;
6335
6336                                 /* Ignore known items */
6337                                 if (object_known_p(o_ptr)) continue;
6338
6339                                 /* Note the artifact */
6340                                 okay[o_ptr->name1] = FALSE;
6341                         }
6342                 }
6343         }
6344
6345         /* Check the inventory and equipment */
6346         for (i = 0; i < INVEN_TOTAL; i++)
6347         {
6348                 object_type *o_ptr = &inventory[i];
6349
6350                 /* Ignore non-objects */
6351                 if (!o_ptr->k_idx) continue;
6352
6353                 /* Ignore non-artifacts */
6354                 if (!artifact_p(o_ptr)) continue;
6355
6356                 /* Ignore known items */
6357                 if (object_known_p(o_ptr)) continue;
6358
6359                 /* Note the artifact */
6360                 okay[o_ptr->name1] = FALSE;
6361         }
6362
6363         for (k = 0; k < max_a_idx; k++)
6364         {
6365                 if (okay[k]) who[n++] = k;
6366         }
6367
6368         /* Select the sort method */
6369         ang_sort_comp = ang_sort_art_comp;
6370         ang_sort_swap = ang_sort_art_swap;
6371
6372         /* Sort the array by dungeon depth of monsters */
6373         ang_sort(who, &why, n);
6374
6375         /* Scan the artifacts */
6376         for (k = 0; k < n; k++)
6377         {
6378                 artifact_type *a_ptr = &a_info[who[k]];
6379
6380                 /* Paranoia */
6381 #ifdef JP
6382                 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6383 #else
6384                 strcpy(base_name, "Unknown Artifact");
6385 #endif
6386
6387
6388                 /* Obtain the base object type */
6389                 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6390
6391                 /* Real object */
6392                 if (z)
6393                 {
6394                         object_type forge;
6395                         object_type *q_ptr;
6396
6397                         /* Get local object */
6398                         q_ptr = &forge;
6399
6400                         /* Create fake object */
6401                         object_prep(q_ptr, z);
6402
6403                         /* Make it an artifact */
6404                         q_ptr->name1 = (byte)who[k];
6405
6406                         /* Describe the artifact */
6407                         object_desc_store(base_name, q_ptr, FALSE, 0);
6408                 }
6409
6410                 /* Hack -- Build the artifact name */
6411 #ifdef JP
6412                 fprintf(fff, "     %s\n", base_name);
6413 #else
6414                 fprintf(fff, "     The %s\n", base_name);
6415 #endif
6416
6417         }
6418
6419         /* Free the "who" array */
6420         C_KILL(who, max_a_idx, s16b);
6421
6422         /* Free the "okay" array */
6423         C_KILL(okay, max_a_idx, bool);
6424
6425         /* Close the file */
6426         my_fclose(fff);
6427
6428         /* Display the file contents */
6429 #ifdef JP
6430         show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6431 #else
6432         show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6433 #endif
6434
6435
6436         /* Remove the file */
6437         fd_kill(file_name);
6438 }
6439
6440
6441 /*
6442  * Display known uniques
6443  */
6444 static void do_cmd_knowledge_uniques(void)
6445 {
6446         int i, k, n = 0;
6447         u16b why = 2;
6448         s16b *who;
6449
6450         FILE *fff;
6451
6452         char file_name[1024];
6453
6454         /* Open a new file */
6455         fff = my_fopen_temp(file_name, 1024);
6456
6457         if (!fff) {
6458 #ifdef JP
6459             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6460 #else
6461             msg_format("Failed to create temporary file %s.", file_name);
6462 #endif
6463             msg_print(NULL);
6464             return;
6465         }
6466
6467         /* Allocate the "who" array */
6468         C_MAKE(who, max_r_idx, s16b);
6469
6470         /* Scan the monsters */
6471         for (i = 1; i < max_r_idx; i++)
6472         {
6473                 monster_race *r_ptr = &r_info[i];
6474
6475                 /* Use that monster */
6476                 if (r_ptr->name) who[n++] = i;
6477         }
6478
6479         /* Select the sort method */
6480         ang_sort_comp = ang_sort_comp_hook;
6481         ang_sort_swap = ang_sort_swap_hook;
6482
6483         /* Sort the array by dungeon depth of monsters */
6484         ang_sort(who, &why, n);
6485
6486         /* Scan the monster races */
6487         for (k = 0; k < n; k++)
6488         {
6489                 monster_race *r_ptr = &r_info[who[k]];
6490
6491                 /* Only print Uniques */
6492                 if (r_ptr->flags1 & (RF1_UNIQUE))
6493                 {
6494                         bool dead = (r_ptr->max_num == 0);
6495
6496                         if (dead) continue;
6497
6498                         /* Only display "known" uniques */
6499                         if (dead || cheat_know || r_ptr->r_sights)
6500                         {
6501                                 /* Print a message */
6502 #ifdef JP
6503                                 fprintf(fff, "     %s¤Ï¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¡£\n",
6504                                         (r_name + r_ptr->name));
6505 #else
6506                                 fprintf(fff, "     %s is alive\n",
6507                                         (r_name + r_ptr->name));
6508 #endif
6509
6510                         }
6511                 }
6512         }
6513
6514         /* Free the "who" array */
6515         C_KILL(who, max_r_idx, s16b);
6516
6517         /* Close the file */
6518         my_fclose(fff);
6519
6520         /* Display the file contents */
6521 #ifdef JP
6522         show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6523 #else
6524         show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6525 #endif
6526
6527
6528         /* Remove the file */
6529         fd_kill(file_name);
6530 }
6531
6532
6533 /*
6534  * Display weapon-exp
6535  */
6536 static void do_cmd_knowledge_weapon_exp(void)
6537 {
6538         int i, j, num, weapon_exp;
6539
6540         FILE *fff;
6541
6542         char file_name[1024];
6543         char tmp[30];
6544
6545         /* Open a new file */
6546         fff = my_fopen_temp(file_name, 1024);
6547         if (!fff) {
6548 #ifdef JP
6549             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6550 #else
6551             msg_format("Failed to create temporary file %s.", file_name);
6552 #endif
6553             msg_print(NULL);
6554             return;
6555         }
6556
6557         for (i = 0; i < 5; i++)
6558         {
6559                 for (num = 0; num < 64; num++)
6560                 {
6561                         for (j = 0; j < max_k_idx; j++)
6562                         {
6563                                 object_kind *k_ptr = &k_info[j];
6564
6565                                 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6566                                 {
6567                                         if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6568
6569                                         weapon_exp = p_ptr->weapon_exp[4 - i][num];
6570                                         strip_name(tmp, j);
6571                                         fprintf(fff, "%-25s ", tmp);
6572                                         if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6573                                         else fprintf(fff, " ");
6574                                         fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6575                                         if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6576                                         fprintf(fff, "\n");
6577                                         break;
6578                                 }
6579                         }
6580                 }
6581         }
6582
6583         /* Close the file */
6584         my_fclose(fff);
6585
6586         /* Display the file contents */
6587 #ifdef JP
6588         show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6589 #else
6590         show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6591 #endif
6592
6593
6594         /* Remove the file */
6595         fd_kill(file_name);
6596 }
6597
6598
6599 /*
6600  * Display spell-exp
6601  */
6602 static void do_cmd_knowledge_spell_exp(void)
6603 {
6604         int i = 0, spell_exp, exp_level;
6605
6606         FILE *fff;
6607         magic_type *s_ptr;
6608
6609         char file_name[1024];
6610
6611         /* Open a new file */
6612         fff = my_fopen_temp(file_name, 1024);
6613         if (!fff) {
6614 #ifdef JP
6615             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6616 #else
6617             msg_format("Failed to create temporary file %s.", file_name);
6618 #endif
6619             msg_print(NULL);
6620             return;
6621         }
6622
6623         if (p_ptr->realm1 != REALM_NONE)
6624         {
6625 #ifdef JP
6626                 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6627 #else
6628                 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6629 #endif
6630                 for (i = 0; i < 32; i++)
6631                 {
6632                         if (!is_magic(p_ptr->realm1))
6633                         {
6634                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6635                         }
6636                         else
6637                         {
6638                                 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6639                         }
6640                         if (s_ptr->slevel >= 99) continue;
6641                         spell_exp = p_ptr->spell_exp[i];
6642                         exp_level = spell_exp_level(spell_exp);
6643                         fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6644                         if (p_ptr->realm1 == REALM_HISSATSU)
6645                                 fprintf(fff, "[--]");
6646                         else
6647                         {
6648                                 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6649                                 else fprintf(fff, " ");
6650                                 fprintf(fff, "%s", exp_level_str[exp_level]);
6651                         }
6652                         if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6653                         fprintf(fff, "\n");
6654                 }
6655         }
6656
6657         if (p_ptr->realm2 != REALM_NONE)
6658         {
6659 #ifdef JP
6660                 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6661 #else
6662                 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6663 #endif
6664                 for (i = 0; i < 32; i++)
6665                 {
6666                         if (!is_magic(p_ptr->realm1))
6667                         {
6668                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6669                         }
6670                         else
6671                         {
6672                                 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6673                         }
6674                         if (s_ptr->slevel >= 99) continue;
6675
6676                         spell_exp = p_ptr->spell_exp[i + 32];
6677                         exp_level = spell_exp_level(spell_exp);
6678                         fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6679                         if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6680                         else fprintf(fff, " ");
6681                         fprintf(fff, "%s", exp_level_str[exp_level]);
6682                         if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6683                         fprintf(fff, "\n");
6684                 }
6685         }
6686
6687         /* Close the file */
6688         my_fclose(fff);
6689
6690         /* Display the file contents */
6691 #ifdef JP
6692         show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6693 #else
6694         show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6695 #endif
6696
6697
6698         /* Remove the file */
6699         fd_kill(file_name);
6700 }
6701
6702
6703 /*
6704  * Display skill-exp
6705  */
6706 static void do_cmd_knowledge_skill_exp(void)
6707 {
6708         int i = 0, skill_exp;
6709
6710         FILE *fff;
6711
6712         char file_name[1024];
6713 #ifdef JP
6714         char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή          ", "¾èÇÏ            "};
6715 #else
6716         char skill_name[3][20]={"Martial Arts    ", "Dual Wielding   ", "Riding          "};
6717 #endif
6718
6719         /* Open a new file */
6720         fff = my_fopen_temp(file_name, 1024);
6721         if (!fff) {
6722 #ifdef JP
6723             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6724 #else
6725             msg_format("Failed to create temporary file %s.", file_name);
6726 #endif
6727             msg_print(NULL);
6728             return;
6729         }
6730
6731         for (i = 0; i < 3; i++)
6732         {
6733                 skill_exp = p_ptr->skill_exp[i];
6734                 fprintf(fff, "%-20s ", skill_name[i]);
6735                 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6736                 else fprintf(fff, " ");
6737                 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6738                 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6739                 fprintf(fff, "\n");
6740         }
6741
6742         /* Close the file */
6743         my_fclose(fff);
6744
6745         /* Display the file contents */
6746 #ifdef JP
6747         show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6748 #else
6749         show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6750 #endif
6751
6752
6753         /* Remove the file */
6754         fd_kill(file_name);
6755 }
6756
6757
6758 /*
6759  * Pluralize a monster name
6760  */
6761 void plural_aux(char *Name)
6762 {
6763         int NameLen = strlen(Name);
6764
6765         if (my_strstr(Name, "Disembodied hand"))
6766         {
6767                 strcpy(Name, "Disembodied hands that strangled people");
6768         }
6769         else if (my_strstr(Name, "Colour out of space"))
6770         {
6771                 strcpy(Name, "Colours out of space");
6772         }
6773         else if (my_strstr(Name, "stairway to hell"))
6774         {
6775                 strcpy(Name, "stairways to hell");
6776         }
6777         else if (my_strstr(Name, "Dweller on the threshold"))
6778         {
6779                 strcpy(Name, "Dwellers on the threshold");
6780         }
6781         else if (my_strstr(Name, " of "))
6782         {
6783                 cptr aider = my_strstr(Name, " of ");
6784                 char dummy[80];
6785                 int i = 0;
6786                 cptr ctr = Name;
6787
6788                 while (ctr < aider)
6789                 {
6790                         dummy[i] = *ctr;
6791                         ctr++; i++;
6792                 }
6793
6794                 if (dummy[i-1] == 's')
6795                 {
6796                         strcpy(&(dummy[i]), "es");
6797                         i++;
6798                 }
6799                 else
6800                 {
6801                         strcpy(&(dummy[i]), "s");
6802                 }
6803
6804                 strcpy(&(dummy[i+1]), aider);
6805                 strcpy(Name, dummy);
6806         }
6807         else if (my_strstr(Name, "coins"))
6808         {
6809                 char dummy[80];
6810                 strcpy(dummy, "piles of ");
6811                 strcat(dummy, Name);
6812                 strcpy(Name, dummy);
6813                 return;
6814         }
6815         else if (my_strstr(Name, "Manes"))
6816         {
6817                 return;
6818         }
6819         else if (streq(&(Name[NameLen - 2]), "ey"))
6820         {
6821                 strcpy(&(Name[NameLen - 2]), "eys");
6822         }
6823         else if (Name[NameLen - 1] == 'y')
6824         {
6825                 strcpy(&(Name[NameLen - 1]), "ies");
6826         }
6827         else if (streq(&(Name[NameLen - 4]), "ouse"))
6828         {
6829                 strcpy(&(Name[NameLen - 4]), "ice");
6830         }
6831         else if (streq(&(Name[NameLen - 2]), "us"))
6832         {
6833                 strcpy(&(Name[NameLen - 2]), "i");
6834         }
6835         else if (streq(&(Name[NameLen - 6]), "kelman"))
6836         {
6837                 strcpy(&(Name[NameLen - 6]), "kelmen");
6838         }
6839         else if (streq(&(Name[NameLen - 8]), "wordsman"))
6840         {
6841                 strcpy(&(Name[NameLen - 8]), "wordsmen");
6842         }
6843         else if (streq(&(Name[NameLen - 7]), "oodsman"))
6844         {
6845                 strcpy(&(Name[NameLen - 7]), "oodsmen");
6846         }
6847         else if (streq(&(Name[NameLen - 7]), "eastman"))
6848         {
6849                 strcpy(&(Name[NameLen - 7]), "eastmen");
6850         }
6851         else if (streq(&(Name[NameLen - 8]), "izardman"))
6852         {
6853                 strcpy(&(Name[NameLen - 8]), "izardmen");
6854         }
6855         else if (streq(&(Name[NameLen - 5]), "geist"))
6856         {
6857                 strcpy(&(Name[NameLen - 5]), "geister");
6858         }
6859         else if (streq(&(Name[NameLen - 2]), "ex"))
6860         {
6861                 strcpy(&(Name[NameLen - 2]), "ices");
6862         }
6863         else if (streq(&(Name[NameLen - 2]), "lf"))
6864         {
6865                 strcpy(&(Name[NameLen - 2]), "lves");
6866         }
6867         else if (suffix(Name, "ch") ||
6868                  suffix(Name, "sh") ||
6869                          suffix(Name, "nx") ||
6870                          suffix(Name, "s") ||
6871                          suffix(Name, "o"))
6872         {
6873                 strcpy(&(Name[NameLen]), "es");
6874         }
6875         else
6876         {
6877                 strcpy(&(Name[NameLen]), "s");
6878         }
6879 }
6880
6881 /*
6882  * Display current pets
6883  */
6884 static void do_cmd_knowledge_pets(void)
6885 {
6886         int             i;
6887         FILE            *fff;
6888         monster_type    *m_ptr;
6889         char            pet_name[80];
6890         int             t_friends = 0;
6891         int             show_upkeep = 0;
6892         char            file_name[1024];
6893
6894
6895         /* Open a new file */
6896         fff = my_fopen_temp(file_name, 1024);
6897         if (!fff) {
6898 #ifdef JP
6899             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6900 #else
6901             msg_format("Failed to create temporary file %s.", file_name);
6902 #endif
6903             msg_print(NULL);
6904             return;
6905         }
6906
6907         /* Process the monsters (backwards) */
6908         for (i = m_max - 1; i >= 1; i--)
6909         {
6910                 /* Access the monster */
6911                 m_ptr = &m_list[i];
6912
6913                 /* Ignore "dead" monsters */
6914                 if (!m_ptr->r_idx) continue;
6915
6916                 /* Calculate "upkeep" for pets */
6917                 if (is_pet(m_ptr))
6918                 {
6919                         t_friends++;
6920                         monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6921                         fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6922                 }
6923         }
6924
6925         show_upkeep = calculate_upkeep();
6926
6927         fprintf(fff, "----------------------------------------------\n");
6928 #ifdef JP
6929         fprintf(fff, "    ¹ç·×: %d É¤¤Î¥Ú¥Ã¥È\n", t_friends);
6930         fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6931 #else
6932         fprintf(fff, "   Total: %d pet%s.\n",
6933                 t_friends, (t_friends == 1 ? "" : "s"));
6934         fprintf(fff, "   Upkeep: %d%% mana.\n", show_upkeep);
6935 #endif
6936
6937
6938
6939         /* Close the file */
6940         my_fclose(fff);
6941
6942         /* Display the file contents */
6943 #ifdef JP
6944         show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6945 #else
6946         show_file(TRUE, file_name, "Current Pets", 0, 0);
6947 #endif
6948
6949
6950         /* Remove the file */
6951         fd_kill(file_name);
6952 }
6953
6954
6955 /*
6956  * Total kill count
6957  *
6958  * Note that the player ghosts are ignored.  XXX XXX XXX
6959  */
6960 static void do_cmd_knowledge_kill_count(void)
6961 {
6962         int i, k, n = 0;
6963         u16b why = 2;
6964         s16b *who;
6965
6966         FILE *fff;
6967
6968         char file_name[1024];
6969
6970         s32b Total = 0;
6971
6972
6973         /* Open a new file */
6974         fff = my_fopen_temp(file_name, 1024);
6975
6976         if (!fff) {
6977 #ifdef JP
6978             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6979 #else
6980             msg_format("Failed to create temporary file %s.", file_name);
6981 #endif
6982             msg_print(NULL);
6983             return;
6984         }
6985
6986         /* Allocate the "who" array */
6987         C_MAKE(who, max_r_idx, s16b);
6988
6989         {
6990                 /* Monsters slain */
6991                 int kk;
6992
6993                 for (kk = 1; kk < max_r_idx; kk++)
6994                 {
6995                         monster_race *r_ptr = &r_info[kk];
6996
6997                         if (r_ptr->flags1 & (RF1_UNIQUE))
6998                         {
6999                                 bool dead = (r_ptr->max_num == 0);
7000
7001                                 if (dead)
7002                                 {
7003                                         Total++;
7004                                 }
7005                         }
7006                         else
7007                         {
7008                                 s16b This = r_ptr->r_pkills;
7009
7010                                 if (This > 0)
7011                                 {
7012                                         Total += This;
7013                                 }
7014                         }
7015                 }
7016
7017                 if (Total < 1)
7018 #ifdef JP
7019                         fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7020 #else
7021                         fprintf(fff,"You have defeated no enemies yet.\n\n");
7022 #endif
7023
7024                 else if (Total == 1)
7025 #ifdef JP
7026                         fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7027 #else
7028                         fprintf(fff,"You have defeated one enemy.\n\n");
7029 #endif
7030
7031                 else
7032 #ifdef JP
7033                         fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu É¤¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7034 #else
7035                         fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7036 #endif
7037
7038         }
7039
7040         Total = 0;
7041
7042         /* Scan the monsters */
7043         for (i = 1; i < max_r_idx; i++)
7044         {
7045                 monster_race *r_ptr = &r_info[i];
7046
7047                 /* Use that monster */
7048                 if (r_ptr->name) who[n++] = i;
7049         }
7050
7051         /* Select the sort method */
7052         ang_sort_comp = ang_sort_comp_hook;
7053         ang_sort_swap = ang_sort_swap_hook;
7054
7055         /* Sort the array by dungeon depth of monsters */
7056         ang_sort(who, &why, n);
7057
7058         /* Scan the monster races */
7059         for (k = 0; k < n; k++)
7060         {
7061                 monster_race *r_ptr = &r_info[who[k]];
7062
7063                 if (r_ptr->flags1 & (RF1_UNIQUE))
7064                 {
7065                         bool dead = (r_ptr->max_num == 0);
7066
7067                         if (dead)
7068                         {
7069                                 /* Print a message */
7070                                 fprintf(fff, "     %s\n",
7071                                     (r_name + r_ptr->name));
7072                                 Total++;
7073                         }
7074                 }
7075                 else
7076                 {
7077                         s16b This = r_ptr->r_pkills;
7078
7079                         if (This > 0)
7080                         {
7081 #ifdef JP
7082                                 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7083                                 if(my_strchr("pt",r_ptr->d_char))
7084                                         fprintf(fff, "     %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7085                                 else
7086                                         fprintf(fff, "     %3d É¤¤Î %s\n", This, r_name + r_ptr->name);
7087 #else
7088                                 if (This < 2)
7089                                 {
7090                                         if (my_strstr(r_name + r_ptr->name, "coins"))
7091                                         {
7092                                                 fprintf(fff, "     1 pile of %s\n", (r_name + r_ptr->name));
7093                                         }
7094                                         else
7095                                         {
7096                                                 fprintf(fff, "     1 %s\n", (r_name + r_ptr->name));
7097                                         }
7098                                 }
7099                                 else
7100                                 {
7101                                         char ToPlural[80];
7102                                         strcpy(ToPlural, (r_name + r_ptr->name));
7103                                         plural_aux(ToPlural);
7104                                         fprintf(fff, "     %d %s\n", This, ToPlural);
7105                                 }
7106 #endif
7107
7108
7109                                 Total += This;
7110                         }
7111                 }
7112         }
7113
7114         fprintf(fff,"----------------------------------------------\n");
7115 #ifdef JP
7116         fprintf(fff,"    ¹ç·×: %lu É¤¤òÅݤ·¤¿¡£\n", Total);
7117 #else
7118         fprintf(fff,"   Total: %lu creature%s killed.\n",
7119                 Total, (Total == 1 ? "" : "s"));
7120 #endif
7121
7122
7123         /* Free the "who" array */
7124         C_KILL(who, max_r_idx, s16b);
7125
7126         /* Close the file */
7127         my_fclose(fff);
7128
7129         /* Display the file contents */
7130 #ifdef JP
7131         show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7132 #else
7133         show_file(TRUE, file_name, "Kill Count", 0, 0);
7134 #endif
7135
7136
7137         /* Remove the file */
7138         fd_kill(file_name);
7139 }
7140
7141
7142 /*
7143  * Display the object groups.
7144  */
7145 static void display_group_list(int col, int row, int wid, int per_page,
7146         int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7147 {
7148         int i;
7149
7150         /* Display lines until done */
7151         for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7152         {
7153                 /* Get the group index */
7154                 int grp = grp_idx[grp_top + i];
7155
7156                 /* Choose a color */
7157                 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7158
7159                 /* Erase the entire line */
7160                 Term_erase(col, row + i, wid);
7161
7162                 /* Display the group label */
7163                 c_put_str(attr, group_text[grp], row + i, col);
7164         }
7165 }
7166
7167
7168 /* 
7169  * Move the cursor in a browser window 
7170  */
7171 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt, 
7172                                                    int *list_cur, int list_cnt)
7173 {
7174         int d;
7175         int col = *column;
7176         int grp = *grp_cur;
7177         int list = *list_cur;
7178
7179         /* Extract direction */
7180         if (ch == ' ')
7181         {
7182                 /* Hack -- scroll up full screen */
7183                 d = 3;
7184         }
7185         else if (ch == '-')
7186         {
7187                 /* Hack -- scroll down full screen */
7188                 d = 9;
7189         }
7190         else
7191         {
7192                 d = get_keymap_dir(ch);
7193         }
7194
7195         if (!d) return;
7196
7197         /* Diagonals - hack */
7198         if ((ddx[d] > 0) && ddy[d])
7199         {
7200                 int browser_rows;
7201                 int wid, hgt;
7202
7203                 /* Get size */
7204                 Term_get_size(&wid, &hgt);
7205
7206                 browser_rows = hgt - 8;
7207
7208                 /* Browse group list */
7209                 if (!col)
7210                 {
7211                         int old_grp = grp;
7212
7213                         /* Move up or down */
7214                         grp += ddy[d] * (browser_rows - 1);
7215
7216                         /* Verify */
7217                         if (grp >= grp_cnt)     grp = grp_cnt - 1;
7218                         if (grp < 0) grp = 0;
7219                         if (grp != old_grp)     list = 0;
7220                 }
7221
7222                 /* Browse sub-list list */
7223                 else
7224                 {
7225                         /* Move up or down */
7226                         list += ddy[d] * browser_rows;
7227
7228                         /* Verify */
7229                         if (list >= list_cnt) list = list_cnt - 1;
7230                         if (list < 0) list = 0;
7231                 }
7232
7233                 (*grp_cur) = grp;
7234                 (*list_cur) = list;
7235
7236                 return;
7237         }
7238
7239         if (ddx[d])
7240         {
7241                 col += ddx[d];
7242                 if (col < 0) col = 0;
7243                 if (col > 1) col = 1;
7244
7245                 (*column) = col;
7246
7247                 return;
7248         }
7249
7250         /* Browse group list */
7251         if (!col)
7252         {
7253                 int old_grp = grp;
7254
7255                 /* Move up or down */
7256                 grp += ddy[d];
7257
7258                 /* Verify */
7259                 if (grp >= grp_cnt)     grp = grp_cnt - 1;
7260                 if (grp < 0) grp = 0;
7261                 if (grp != old_grp)     list = 0;
7262         }
7263
7264         /* Browse sub-list list */
7265         else
7266         {
7267                 /* Move up or down */
7268                 list += ddy[d];
7269
7270                 /* Verify */
7271                 if (list >= list_cnt) list = list_cnt - 1;
7272                 if (list < 0) list = 0;
7273         }
7274
7275         (*grp_cur) = grp;
7276         (*list_cur) = list;
7277 }
7278
7279
7280 /*
7281  * Display visuals.
7282  */
7283 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7284 {
7285         int i, j;
7286
7287         /* Clear the display lines */
7288         for (i = 0; i < height; i++)
7289         {
7290                 Term_erase(col, row + i, width);
7291         }
7292
7293         /* Bigtile mode uses double width */
7294         if (use_bigtile) width /= 2;
7295
7296         /* Display lines until done */
7297         for (i = 0; i < height; i++)
7298         {
7299                 /* Display columns until done */
7300                 for (j = 0; j < width; j++)
7301                 {
7302                         byte a;
7303                         char c;
7304                         int x = col + j;
7305                         int y = row + i;
7306                         int ia, ic;
7307
7308                         /* Bigtile mode uses double width */
7309                         if (use_bigtile) x += j;
7310
7311                         ia = attr_top + i;
7312                         ic = char_left + j;
7313
7314                         /* Ignore illegal characters */
7315                         if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7316                             (!use_graphics && ic > 0x7f))
7317                                 continue;
7318
7319                         a = (byte)ia;
7320                         c = (char)ic;
7321
7322                         /* Force correct code for both ASCII character and tile */
7323                         if (c & 0x80) a |= 0x80;
7324
7325                         /* Display symbol */
7326                         Term_queue_bigchar(x, y, a, c, 0, 0);
7327                 }
7328         }
7329 }
7330
7331
7332 /*
7333  * Place the cursor at the collect position for visual mode
7334  */
7335 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7336 {
7337         int i = (a & 0x7f) - attr_top;
7338         int j = c - char_left;
7339
7340         int x = col + j;
7341         int y = row + i;
7342
7343         /* Bigtile mode uses double width */
7344         if (use_bigtile) x += j;
7345
7346         /* Place the cursor */
7347         Term_gotoxy(x, y);
7348 }
7349
7350
7351 /*
7352  *  Clipboard variables for copy&paste in visual mode
7353  */
7354 static byte attr_idx = 0;
7355 static byte char_idx = 0;
7356
7357 /*
7358  *  Do visual mode command -- Change symbols
7359  */
7360 static bool visual_mode_command(char ch, bool *visual_list_ptr, 
7361                                 int height, int width, 
7362                                 byte *attr_top_ptr, byte *char_left_ptr, 
7363                                 byte *cur_attr_ptr, byte *cur_char_ptr)
7364 {
7365         static byte attr_old = 0, char_old = 0;
7366
7367         switch (ch)
7368         {
7369         case ESCAPE:
7370                 if (*visual_list_ptr)
7371                 {
7372                         /* Cancel change */
7373                         *cur_attr_ptr = attr_old;
7374                         *cur_char_ptr = char_old;
7375                         *visual_list_ptr = FALSE;
7376
7377                         return TRUE;
7378                 }
7379
7380                 break;
7381
7382         case '\n':
7383         case '\r':
7384                 if (*visual_list_ptr)
7385                 {
7386                         /* Accept change */
7387                         *visual_list_ptr = FALSE;
7388
7389                         return TRUE;
7390                 }
7391                 break;
7392
7393         case 'V':
7394         case 'v':
7395                 if (!*visual_list_ptr)
7396                 {
7397                         *visual_list_ptr = TRUE;
7398
7399                         *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7400                         *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7401
7402                         attr_old = *cur_attr_ptr;
7403                         char_old = *cur_char_ptr;
7404
7405                         return TRUE;
7406                 }
7407                 break;
7408
7409         case 'C':
7410         case 'c':
7411                 /* Set the visual */
7412                 attr_idx = *cur_attr_ptr;
7413                 char_idx = *cur_char_ptr;
7414
7415                 return TRUE;
7416
7417         case 'P':
7418         case 'p':
7419                 if (attr_idx)
7420                 {
7421                         /* Set the char */
7422                         *cur_attr_ptr = attr_idx;
7423                         *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7424                 }
7425
7426                 if (char_idx)
7427                 {
7428                         /* Set the char */
7429                         *cur_char_ptr = char_idx;
7430                         *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7431                 }
7432
7433                 return TRUE;
7434
7435         default:
7436                 if (*visual_list_ptr)
7437                 {
7438                         int eff_width;
7439                         int d = get_keymap_dir(ch);
7440                         byte a = (*cur_attr_ptr & 0x7f);
7441                         byte c = *cur_char_ptr;
7442
7443                         if (use_bigtile) eff_width = width / 2;
7444                         else eff_width = width;
7445                                         
7446                         /* Restrict direction */
7447                         if ((a == 0) && (ddy[d] < 0)) d = 0;
7448                         if ((c == 0) && (ddx[d] < 0)) d = 0;
7449                         if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7450                         if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7451
7452                         a += ddy[d];
7453                         c += ddx[d];
7454
7455                         /* Force correct code for both ASCII character and tile */
7456                         if (c & 0x80) a |= 0x80;
7457
7458                         /* Set the visual */
7459                         *cur_attr_ptr = a;
7460                         *cur_char_ptr = c;
7461
7462
7463                         /* Move the frame */
7464                         if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7465                         if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7466                         if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7467                         if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7468                         return TRUE;
7469                 }
7470                                 
7471                 break;
7472         }
7473
7474         /* Visual mode command is not used */
7475         return FALSE;
7476 }
7477
7478
7479 /*
7480  * Display the monsters in a group.
7481  */
7482 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7483         int mon_cur, int mon_top)
7484 {
7485         int i;
7486
7487         /* Display lines until done */
7488         for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7489         {
7490                 byte attr;
7491
7492                 /* Get the race index */
7493                 int r_idx = mon_idx[mon_top + i] ;
7494
7495                 /* Access the race */
7496                 monster_race *r_ptr = &r_info[r_idx];
7497
7498
7499                 /* Choose a color */
7500                 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7501
7502                 /* Display the name */
7503                 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7504
7505                 /* Hack -- visual_list mode */
7506                 if (per_page == 1)
7507                 {
7508                         c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7509                 }
7510                 else if (p_ptr->wizard) 
7511                 {
7512                         c_prt(attr, format("%d", r_idx), row + i, 60);
7513                 }
7514
7515                 /* Display symbol */
7516                 Term_queue_bigchar(70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
7517
7518
7519                 /* Display kills */
7520                 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7521 #ifdef JP
7522                 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7523 #else
7524                 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7525 #endif
7526         
7527         }
7528
7529         /* Clear remaining lines */
7530         for (; i < per_page; i++)
7531         {
7532                 Term_erase(col, row + i, 255);
7533         }
7534 }
7535
7536
7537 /*
7538  * Display known monsters.
7539  */
7540 static void do_cmd_knowledge_monsters(void)
7541 {
7542         int i, len, max;
7543         int grp_cur, grp_top, old_grp_cur;
7544         int mon_cur, mon_top;
7545         int grp_cnt, grp_idx[100];
7546         int mon_cnt;
7547         s16b *mon_idx;
7548         
7549         int column = 0;
7550         bool flag;
7551         bool redraw;
7552
7553         bool visual_list = FALSE;
7554         byte attr_top = 0, char_left = 0;
7555
7556         int browser_rows;
7557         int wid, hgt;
7558
7559         /* Get size */
7560         Term_get_size(&wid, &hgt);
7561
7562         browser_rows = hgt - 8;
7563
7564         /* Allocate the "mon_idx" array */
7565         C_MAKE(mon_idx, max_r_idx, s16b);
7566
7567         max = 0;
7568         grp_cnt = 0;
7569
7570         /* Check every group */
7571         for (i = 0; monster_group_text[i] != NULL; i++)
7572         {
7573                 /* Measure the label */
7574                 len = strlen(monster_group_text[i]);
7575
7576                 /* Save the maximum length */
7577                 if (len > max) max = len;
7578
7579                 /* See if any monsters are known */
7580                 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7581                 {
7582                         /* Build a list of groups with known monsters */
7583                         grp_idx[grp_cnt++] = i;
7584                 }
7585         }
7586
7587         /* Terminate the list */
7588         grp_idx[grp_cnt] = -1;
7589
7590         old_grp_cur = -1;
7591         grp_cur = grp_top = 0;
7592         mon_cur = mon_top = 0;
7593         mon_cnt = 0;
7594
7595         flag = FALSE;
7596         redraw = TRUE;
7597
7598         while (!flag)
7599         {
7600                 char ch;
7601                 monster_race *r_ptr;
7602
7603                 if (redraw)
7604                 {
7605                         clear_from(0);
7606                 
7607 #ifdef JP
7608                         prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7609                         prt("¥°¥ë¡¼¥×", 4, 0);
7610                         prt("̾Á°", 4, max + 3);
7611                         if (p_ptr->wizard) prt("Idx", 4, 60);
7612                         prt("ʸ»ú »¦³²¿ô", 4, 67);
7613 #else
7614                         prt("Knowledge - Monsters", 2, 0);
7615                         prt("Group", 4, 0);
7616                         prt("Name", 4, max + 3);
7617                         if (p_ptr->wizard) prt("Idx", 4, 60);
7618                         prt("Sym   Kills", 4, 67);
7619 #endif
7620
7621                         for (i = 0; i < 78; i++)
7622                         {
7623                                 Term_putch(i, 5, TERM_WHITE, '=');
7624                         }
7625
7626                         for (i = 0; i < browser_rows; i++)
7627                         {
7628                                 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7629                         }
7630
7631                         redraw = FALSE;
7632                 }
7633
7634                 /* Scroll group list */
7635                 if (grp_cur < grp_top) grp_top = grp_cur;
7636                 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7637
7638                 /* Display a list of monster groups */
7639                 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7640
7641                 if (old_grp_cur != grp_cur)
7642                 {
7643                         old_grp_cur = grp_cur;
7644
7645                         /* Get a list of monsters in the current group */
7646                         mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7647                 }
7648
7649                 /* Scroll monster list */
7650                 while (mon_cur < mon_top)
7651                         mon_top = MAX(0, mon_top - browser_rows/2);
7652                 while (mon_cur >= mon_top + browser_rows)
7653                         mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7654
7655                 if (!visual_list)
7656                 {
7657                         /* Display a list of monsters in the current group */
7658                         display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7659                 }
7660                 else
7661                 {
7662                         mon_top = mon_cur;
7663
7664                         /* Display a monster name */
7665                         display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7666
7667                         /* Display visual list below first monster */
7668                         display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7669                 }
7670
7671                 /* Prompt */
7672 #ifdef JP
7673                 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7674 #else
7675                 prt(format("<dir>, 'r' to recall%s%s, ESC", visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
7676 #endif
7677
7678                 /* Get the current monster */
7679                 r_ptr = &r_info[mon_idx[mon_cur]];
7680
7681                 /* Mega Hack -- track this monster race */
7682                 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7683
7684                 /* Hack -- handle stuff */
7685                 handle_stuff();
7686
7687                 if (visual_list)
7688                 {
7689                         place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7690                 }
7691                 else if (!column)
7692                 {
7693                         Term_gotoxy(0, 6 + (grp_cur - grp_top));
7694                 }
7695                 else
7696                 {
7697                         Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7698                 }
7699         
7700                 ch = inkey();
7701
7702                 /* Do visual mode command if needed */
7703                 if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &r_ptr->x_attr, &r_ptr->x_char)) continue;
7704
7705                 switch (ch)
7706                 {
7707                         case ESCAPE:
7708                         {
7709                                 flag = TRUE;
7710                                 break;
7711                         }
7712
7713                         case 'R':
7714                         case 'r':
7715                         {
7716                                 /* Recall on screen */
7717                                 if (mon_idx[mon_cur])
7718                                 {
7719                                         screen_roff(mon_idx[mon_cur], 0);
7720
7721                                         (void)inkey();
7722         
7723                                         redraw = TRUE;
7724                                 }
7725                                 break;
7726                         }
7727
7728                         default:
7729                         {
7730                                 /* Move the cursor */
7731                                 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7732
7733                                 break;
7734                         }
7735                 }
7736         }
7737
7738         /* Free the "mon_idx" array */
7739         C_KILL(mon_idx, max_r_idx, s16b);
7740 }
7741
7742
7743 /*
7744  * Display the objects in a group.
7745  */
7746 static void display_object_list(int col, int row, int per_page, int object_idx[],
7747         int object_cur, int object_top)
7748 {
7749         int i;
7750
7751         /* Display lines until done */
7752         for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7753         {
7754                 char o_name[80];
7755                 byte a, c;
7756
7757                 /* Get the object index */
7758                 int k_idx = object_idx[object_top + i];
7759
7760                 /* Access the object */
7761                 object_kind *k_ptr = &k_info[k_idx];
7762
7763                 /* Choose a color */
7764                 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7765                 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7766
7767                 attr = ((i + object_top == object_cur) ? cursor : attr);
7768                 
7769                 /* Tidy name */
7770                 strip_name(o_name, k_idx);
7771
7772                 /* Display the name */
7773                 c_prt(attr, o_name, row + i, col);
7774
7775                 /* Hack -- visual_list mode */
7776                 if (per_page == 1)
7777                 {
7778                         c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7779                 }
7780                 else if (p_ptr->wizard)
7781                 {
7782                         c_prt(attr, format ("%d", k_idx), row + i, 70);
7783                 }
7784
7785                 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7786                 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7787
7788                 /* Symbol is unknown */ 
7789                 if (!k_ptr->aware && !p_ptr->wizard)
7790                 {
7791                         c = ' ';
7792                         a = TERM_DARK;
7793                 }
7794
7795                 /* Display symbol */
7796                 Term_queue_bigchar(76, row + i, a, c, 0, 0);
7797         }
7798
7799         /* Clear remaining lines */
7800         for (; i < per_page; i++)
7801         {
7802                 Term_erase(col, row + i, 255);
7803         }
7804 }
7805
7806 /*
7807  * Describe fake object
7808  */
7809 static void desc_obj_fake(int k_idx)
7810 {
7811         object_type *o_ptr;
7812         object_type object_type_body;
7813
7814         /* Get local object */
7815         o_ptr = &object_type_body;
7816
7817         /* Wipe the object */
7818         object_wipe(o_ptr);
7819
7820         /* Create the artifact */
7821         object_prep(o_ptr, k_idx);
7822
7823         /* It's fully know */
7824         o_ptr->ident |= IDENT_KNOWN;
7825
7826         /* Track the object */
7827         /* object_actual_track(o_ptr); */
7828
7829         /* Hack - mark as fake */
7830         /* term_obj_real = FALSE; */
7831
7832         /* Hack -- Handle stuff */
7833         handle_stuff();
7834
7835         if (!screen_object(o_ptr, FALSE))
7836         {
7837 #ifdef JP
7838                 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7839 #else
7840                 msg_print("You see nothing special.");
7841 #endif
7842                 msg_print(NULL);
7843         }
7844 }
7845
7846
7847
7848 /*
7849  * Display known objects
7850  */
7851 static void do_cmd_knowledge_objects(void)
7852 {
7853         int i, len, max;
7854         int grp_cur, grp_top, old_grp_cur;
7855         int object_old, object_cur, object_top;
7856         int grp_cnt, grp_idx[100];
7857         int object_cnt;
7858         int *object_idx;
7859
7860         int column = 0;
7861         bool flag;
7862         bool redraw;
7863
7864         bool visual_list = FALSE;
7865         byte attr_top = 0, char_left = 0;
7866
7867         int browser_rows;
7868         int wid, hgt;
7869
7870         /* Get size */
7871         Term_get_size(&wid, &hgt);
7872
7873         browser_rows = hgt - 8;
7874
7875         /* Allocate the "object_idx" array */
7876         C_MAKE(object_idx, max_k_idx, int);
7877
7878         max = 0;
7879         grp_cnt = 0;
7880
7881         /* Check every group */
7882         for (i = 0; object_group_text[i] != NULL; i++)
7883         {
7884                 /* Measure the label */
7885                 len = strlen(object_group_text[i]);
7886
7887                 /* Save the maximum length */
7888                 if (len > max) max = len;
7889
7890                 /* See if any monsters are known */
7891                 if (collect_objects(i, object_idx))
7892                 {
7893                         /* Build a list of groups with known monsters */
7894                         grp_idx[grp_cnt++] = i;
7895                 }
7896         }
7897
7898         /* Terminate the list */
7899         grp_idx[grp_cnt] = -1;
7900
7901         old_grp_cur = -1;
7902         grp_cur = grp_top = 0;
7903         object_cur = object_top = 0;
7904         object_old = -1;
7905         object_cnt = 0;
7906
7907         flag = FALSE;
7908         redraw = TRUE;
7909
7910         while (!flag)
7911         {
7912                 char ch;
7913                 object_kind *k_ptr;
7914
7915                 if (redraw)
7916                 {
7917                         clear_from(0);
7918                 
7919 #ifdef JP
7920                         prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
7921                         prt("¥°¥ë¡¼¥×", 4, 0);
7922                         prt("̾Á°", 4, max + 3);
7923                         if (p_ptr->wizard) prt("Idx", 4, 70);
7924                         prt("ʸ»ú", 4, 75);
7925 #else
7926                         prt("Knowledge - objects", 2, 0);
7927                         prt("Group", 4, 0);
7928                         prt("Name", 4, max + 3);
7929                         if (p_ptr->wizard) prt("Idx", 4, 70);
7930                         prt("Sym", 4, 75);
7931 #endif
7932
7933                         for (i = 0; i < 78; i++)
7934                         {
7935                                 Term_putch(i, 5, TERM_WHITE, '=');
7936                         }
7937
7938                         for (i = 0; i < browser_rows; i++)
7939                         {
7940                                 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7941                         }
7942
7943                         redraw = FALSE;
7944                 }
7945
7946                 /* Scroll group list */
7947                 if (grp_cur < grp_top) grp_top = grp_cur;
7948                 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7949
7950                 /* Display a list of object groups */
7951                 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7952
7953                 if (old_grp_cur != grp_cur)
7954                 {
7955                         old_grp_cur = grp_cur;
7956
7957                         /* Get a list of objects in the current group */
7958                         object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
7959                 }
7960
7961                 /* Scroll object list */
7962                 while (object_cur < object_top)
7963                         object_top = MAX(0, object_top - browser_rows/2);
7964                 while (object_cur >= object_top + browser_rows)
7965                         object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7966
7967                 if (!visual_list)
7968                 {
7969                         /* Display a list of objects in the current group */
7970                         display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
7971                 }
7972                 else
7973                 {
7974                         object_top = object_cur;
7975
7976                         /* Display a list of objects in the current group */
7977                         display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
7978
7979                         /* Display visual list below first object */
7980                         display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7981                 }
7982
7983                 /* Get the current object */
7984                 k_ptr = &k_info[object_idx[object_cur]];
7985
7986                 /* Mega Hack -- track this object */
7987                 if (object_cnt) object_kind_track(object_idx[object_cur]);
7988
7989                 /* Prompt */
7990 #ifdef JP
7991                 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7992 #else
7993                 prt(format("<dir>, 'r' to recall%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
7994 #endif
7995
7996                 /* The "current" object changed */
7997                 if (object_old != object_idx[object_cur])
7998                 {
7999                         /* Hack -- handle stuff */
8000                         handle_stuff();
8001
8002                         /* Remember the "current" object */
8003                         object_old = object_idx[object_cur];
8004                 }
8005
8006                 if (visual_list)
8007                 {
8008                         place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8009                 }
8010                 else if (!column)
8011                 {
8012                         Term_gotoxy(0, 6 + (grp_cur - grp_top));
8013                 }
8014                 else
8015                 {
8016                         Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8017                 }
8018         
8019                 ch = inkey();
8020
8021                 /* Do visual mode command if needed */
8022                 /* Symbol of objects with flavor cannot be changed */
8023                 if (!k_ptr->flavor && visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &k_ptr->x_attr, &k_ptr->x_char)) continue;
8024
8025                 switch (ch)
8026                 {
8027                         case ESCAPE:
8028                         {
8029                                 flag = TRUE;
8030                                 break;
8031                         }
8032
8033                         case 'R':
8034                         case 'r':
8035                         {
8036                                 /* Recall on screen */
8037                                 if (grp_cnt > 0)
8038                                         desc_obj_fake(object_idx[object_cur]);
8039
8040                                 redraw = TRUE;
8041                                 break;
8042                         }
8043
8044                         default:
8045                         {
8046                                 /* Move the cursor */
8047                                 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8048                                 break;
8049                         }
8050                 }
8051         }
8052
8053         /* Free the "object_idx" array */
8054         C_KILL(object_idx, max_k_idx, int);
8055 }
8056
8057
8058
8059 /*
8060  * Display the features in a group.
8061  */
8062 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8063         int feat_cur, int feat_top)
8064 {
8065         int i;
8066
8067         /* Display lines until done */
8068         for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8069         {
8070                 byte attr;
8071
8072                 /* Get the index */
8073                 int f_idx = feat_idx[feat_top + i];
8074
8075                 /* Access the index */
8076                 feature_type *f_ptr = &f_info[f_idx];
8077
8078                 /* Choose a color */
8079                 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8080
8081                 /* Display the name */
8082                 c_prt(attr, f_name + f_ptr->name, row + i, col);
8083
8084                 /* Hack -- visual_list mode */
8085                 if (per_page == 1)
8086                 {
8087                         c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
8088                 }
8089
8090                 /* Display symbol */
8091                 Term_queue_bigchar(68, row + i, f_ptr->x_attr, f_ptr->x_char, 0, 0);
8092         }
8093
8094         /* Clear remaining lines */
8095         for (; i < per_page; i++)
8096         {
8097                 Term_erase(col, row + i, 255);
8098         }
8099 }
8100
8101
8102 /*
8103  * Interact with feature visuals.
8104  */
8105 static void do_cmd_knowledge_features(void)
8106 {
8107         int i, len, max;
8108         int grp_cur, grp_top, old_grp_cur;
8109         int feat_cur, feat_top;
8110         int grp_cnt, grp_idx[100];
8111         int feat_cnt;
8112         int *feat_idx;
8113         
8114         int column = 0;
8115         bool flag;
8116         bool redraw;
8117
8118         bool visual_list = FALSE;
8119         byte attr_top = 0, char_left = 0;
8120
8121         int browser_rows;
8122         int wid, hgt;
8123
8124         /* Get size */
8125         Term_get_size(&wid, &hgt);
8126
8127         browser_rows = hgt - 8;
8128
8129         /* Allocate the "feat_idx" array */
8130         C_MAKE(feat_idx, max_f_idx, int);
8131
8132         max = 0;
8133         grp_cnt = 0;
8134
8135         /* Check every group */
8136         for (i = 0; feature_group_text[i] != NULL; i++)
8137         {
8138                 /* Measure the label */
8139                 len = strlen(feature_group_text[i]);
8140
8141                 /* Save the maximum length */
8142                 if (len > max) max = len;
8143
8144                 /* See if any features are known */
8145                 if (collect_features(i, feat_idx))
8146                 {
8147                         /* Build a list of groups with known features */
8148                         grp_idx[grp_cnt++] = i;
8149                 }
8150         }
8151
8152         /* Terminate the list */
8153         grp_idx[grp_cnt] = -1;
8154
8155         old_grp_cur = -1;
8156         grp_cur = grp_top = 0;
8157         feat_cur = feat_top = 0;
8158         feat_cnt = 0;
8159
8160         flag = FALSE;
8161         redraw = TRUE;
8162
8163         while ((!flag) && (grp_cnt))
8164         {
8165                 char ch;
8166                 feature_type *f_ptr;
8167
8168                 if (redraw)
8169                 {
8170                         clear_from(0);
8171                 
8172                         prt("Visuals - features", 2, 0);
8173                         prt("Group", 4, 0);
8174                         prt("Name", 4, max + 3);
8175                         prt("Sym", 4, 67);
8176
8177                         for (i = 0; i < 78; i++)
8178                         {
8179                                 Term_putch(i, 5, TERM_WHITE, '=');
8180                         }
8181
8182                         for (i = 0; i < browser_rows; i++)
8183                         {
8184                                 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8185                         }
8186
8187                         redraw = FALSE;
8188                 }
8189
8190                 /* Scroll group list */
8191                 if (grp_cur < grp_top) grp_top = grp_cur;
8192                 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8193
8194                 /* Display a list of feature groups */
8195                 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8196
8197                 if (old_grp_cur != grp_cur)
8198                 {
8199                         old_grp_cur = grp_cur;
8200
8201                         /* Get a list of features in the current group */
8202                         feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8203                 }
8204
8205                 /* Scroll feature list */
8206                 while (feat_cur < feat_top)
8207                         feat_top = MAX(0, feat_top - browser_rows/2);
8208                 while (feat_cur >= feat_top + browser_rows)
8209                         feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8210
8211                 if (!visual_list)
8212                 {
8213                         /* Display a list of features in the current group */
8214                         display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
8215                 }
8216                 else
8217                 {
8218                         feat_top = feat_cur;
8219
8220                         /* Display a list of features in the current group */
8221                         display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
8222
8223                         /* Display visual list below first object */
8224                         display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8225                 }
8226
8227                 /* Prompt */
8228 #ifdef JP
8229                 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8230 #else
8231                 prt(format("<dir>%s%s, ESC", visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
8232 #endif
8233
8234                 /* Get the current feature */
8235                 f_ptr = &f_info[feat_idx[feat_cur]];
8236
8237                 if (visual_list)
8238                 {
8239                         place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
8240                 }
8241                 else if (!column)
8242                 {
8243                         Term_gotoxy(0, 6 + (grp_cur - grp_top));
8244                 }
8245                 else
8246                 {
8247                         Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8248                 }
8249         
8250                 ch = inkey();
8251
8252                 /* Do visual mode command if needed */
8253                 if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &f_ptr->x_attr, &f_ptr->x_char)) continue;
8254
8255                 switch (ch)
8256                 {
8257                         case ESCAPE:
8258                         {
8259                                 flag = TRUE;
8260                                 break;
8261                         }
8262
8263                         default:
8264                         {
8265                                 /* Move the cursor */
8266                                 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8267                                 break;
8268                         }
8269                 }
8270         }
8271
8272         /* Prompt */
8273         if (!grp_cnt) msg_print("No features known.");
8274
8275         /* Free the "feat_idx" array */
8276         C_KILL(feat_idx, max_f_idx, int);
8277 }
8278
8279
8280 /*
8281  * List wanted monsters
8282  */
8283 static void do_cmd_knowledge_kubi(void)
8284 {
8285         int i;
8286         FILE *fff;
8287         
8288         char file_name[1024];
8289         
8290         
8291         /* Open a new file */
8292         fff = my_fopen_temp(file_name, 1024);
8293         if (!fff) {
8294 #ifdef JP
8295             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8296 #else
8297             msg_format("Failed to create temporary file %s.", file_name);
8298 #endif
8299             msg_print(NULL);
8300             return;
8301         }
8302         
8303         if (fff)
8304         {
8305                 bool listed = FALSE;
8306
8307 #ifdef JP
8308                 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8309                 fprintf(fff, "\n");
8310                 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8311 #else
8312                 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8313                 fprintf(fff, "\n");
8314                 fprintf(fff, "List of wanted monsters\n");
8315 #endif
8316                 fprintf(fff, "----------------------------------------------\n");
8317
8318                 for (i = 0; i < MAX_KUBI; i++)
8319                 {
8320                         if (kubi_r_idx[i] <= 10000)
8321                         {
8322                                 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8323
8324                                 listed = TRUE;
8325                         }
8326                 }
8327
8328                 if (!listed)
8329                 {
8330 #ifdef JP
8331                         fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8332 #else
8333                         fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8334 #endif
8335                 }
8336         }
8337         
8338         /* Close the file */
8339         my_fclose(fff);
8340         
8341         /* Display the file contents */
8342 #ifdef JP
8343         show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8344 #else
8345         show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8346 #endif
8347
8348         
8349         /* Remove the file */
8350         fd_kill(file_name);
8351 }
8352
8353 /*
8354  * List virtues & status
8355  */
8356 static void do_cmd_knowledge_virtues(void)
8357 {
8358         FILE *fff;
8359         
8360         char file_name[1024];
8361         
8362         
8363         /* Open a new file */
8364         fff = my_fopen_temp(file_name, 1024);
8365         if (!fff) {
8366 #ifdef JP
8367             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8368 #else
8369             msg_format("Failed to create temporary file %s.", file_name);
8370 #endif
8371             msg_print(NULL);
8372             return;
8373         }
8374         
8375         if (fff)
8376         {
8377 #ifdef JP
8378                 fprintf(fff, "¸½ºß¤Î°À­ : %s\n\n", your_alignment());
8379 #else
8380                 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8381 #endif
8382                 dump_virtues(fff);
8383         }
8384         
8385         /* Close the file */
8386         my_fclose(fff);
8387         
8388         /* Display the file contents */
8389 #ifdef JP
8390         show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8391 #else
8392         show_file(TRUE, file_name, "Virtues", 0, 0);
8393 #endif
8394
8395         
8396         /* Remove the file */
8397         fd_kill(file_name);
8398 }
8399
8400 /*
8401 * Dungeon
8402 *
8403 */
8404 static void do_cmd_knowledge_dungeon(void)
8405 {
8406         FILE *fff;
8407         
8408         char file_name[1024];
8409         int i;
8410         
8411         
8412         /* Open a new file */
8413         fff = my_fopen_temp(file_name, 1024);
8414         if (!fff) {
8415 #ifdef JP
8416             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8417 #else
8418             msg_format("Failed to create temporary file %s.", file_name);
8419 #endif
8420             msg_print(NULL);
8421             return;
8422         }
8423         
8424         if (fff)
8425         {
8426                 for (i = 1; i < max_d_idx; i++)
8427                 {
8428                         bool seiha = FALSE;
8429
8430                         if (!d_info[i].maxdepth) continue;
8431                         if (!max_dlv[i]) continue;
8432                         if (d_info[i].final_guardian)
8433                         {
8434                                 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8435                         }
8436                         else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8437 #ifdef JP
8438                         fprintf(fff,"%c%-12s :  %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8439 #else
8440                         fprintf(fff,"%c%-16s :  level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8441 #endif
8442                 }
8443         }
8444         
8445         /* Close the file */
8446         my_fclose(fff);
8447         
8448         /* Display the file contents */
8449 #ifdef JP
8450         show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8451 #else
8452         show_file(TRUE, file_name, "Dungeon", 0, 0);
8453 #endif
8454
8455         
8456         /* Remove the file */
8457         fd_kill(file_name);
8458 }
8459
8460 /*
8461 * List virtues & status
8462 *
8463 */
8464 static void do_cmd_knowledge_stat(void)
8465 {
8466         FILE *fff;
8467         
8468         char file_name[1024];
8469         int percent, v_nr;
8470         
8471         /* Open a new file */
8472         fff = my_fopen_temp(file_name, 1024);
8473         if (!fff) {
8474 #ifdef JP
8475             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8476 #else
8477             msg_format("Failed to create temporary file %s.", file_name);
8478 #endif
8479             msg_print(NULL);
8480             return;
8481         }
8482         
8483         if (fff)
8484         {
8485                 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8486                         (2 * p_ptr->hitdie +
8487                         ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8488
8489 #ifdef JP
8490                 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8491                 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8492                 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8493 #else
8494                 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8495                 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8496                 fprintf(fff, "Limits of maximum stats\n\n");
8497 #endif
8498                 for (v_nr = 0; v_nr < 6; v_nr++)
8499                 {
8500                         if ((p_ptr->knowledge & KNOW_STAT) || p_ptr->stat_max[v_nr] == p_ptr->stat_max_max[v_nr]) fprintf(fff, "%s 18/%d\n", stat_names[v_nr], p_ptr->stat_max_max[v_nr]-18);
8501                         else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8502                 }
8503         }
8504
8505         dump_yourself(fff);
8506
8507         /* Close the file */
8508         my_fclose(fff);
8509         
8510         /* Display the file contents */
8511 #ifdef JP
8512         show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8513 #else
8514         show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8515 #endif
8516
8517         
8518         /* Remove the file */
8519         fd_kill(file_name);
8520 }
8521
8522
8523 /*
8524  * Print all active quests
8525  */
8526 static void do_cmd_knowledge_quests_current(FILE *fff)
8527 {
8528         char tmp_str[120];
8529         char rand_tmp_str[120] = "\0";
8530         char name[80];
8531         monster_race *r_ptr;
8532         int i;
8533         int rand_level = 100;
8534         int total = 0;
8535
8536 #ifdef JP
8537         fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8538 #else
8539         fprintf(fff, "< Current Quest >\n");
8540 #endif
8541
8542         for (i = 1; i < max_quests; i++)
8543         {
8544                 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8545                 {
8546                         /* Set the quest number temporary */
8547                         int old_quest = p_ptr->inside_quest;
8548                         int j;
8549
8550                         /* Clear the text */
8551                         for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8552                         quest_text_line = 0;
8553
8554                         p_ptr->inside_quest = i;
8555
8556                         /* Get the quest text */
8557                         init_flags = INIT_SHOW_TEXT;
8558
8559                         process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8560
8561                         /* Reset the old quest number */
8562                         p_ptr->inside_quest = old_quest;
8563
8564                         /* No info from "silent" quests */
8565                         if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8566
8567                         total++;
8568
8569                         if (quest[i].type != QUEST_TYPE_RANDOM)
8570                         {
8571                                 char note[80] = "\0";
8572
8573                                 if (quest[i].status == QUEST_STATUS_TAKEN)
8574                                 {
8575                                         switch (quest[i].type)
8576                                         {
8577                                         case QUEST_TYPE_KILL_LEVEL:
8578                                         case QUEST_TYPE_KILL_ANY_LEVEL:
8579                                                 r_ptr = &r_info[quest[i].r_idx];
8580                                                 strcpy(name, r_name + r_ptr->name);
8581                                                 if (quest[i].max_num > 1)
8582                                                 {
8583 #ifdef JP
8584                                                         sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8585                                                                 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8586 #else
8587                                                         plural_aux(name);
8588                                                         sprintf(note," - kill %d %s, have killed %d.",
8589                                                                 quest[i].max_num, name, quest[i].cur_num);
8590 #endif
8591                                                 }
8592                                                 else
8593 #ifdef JP
8594                                                         sprintf(note," - %s¤òÅݤ¹¡£",name);
8595 #else
8596                                                         sprintf(note," - kill %s.",name);
8597 #endif
8598                                                 break;
8599
8600                                         case QUEST_TYPE_FIND_ARTIFACT:
8601                                                 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8602 #ifdef JP
8603                                                 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8604 #else
8605                                                 sprintf(note," - Find out %s.", name);
8606 #endif
8607                                                 break;
8608
8609                                         case QUEST_TYPE_FIND_EXIT:
8610 #ifdef JP
8611                                                 sprintf(note," - Ãµº÷¤¹¤ë¡£");
8612 #else
8613                                                 sprintf(note," - Search.");
8614 #endif
8615                                                 break;
8616
8617                                         case QUEST_TYPE_KILL_NUMBER:
8618 #ifdef JP
8619                                                 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8620                                                         quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8621 #else
8622                                                 sprintf(note," - Kill %d monsters, have killed %d.",
8623                                                         quest[i].max_num, quest[i].cur_num);
8624 #endif
8625                                                 break;
8626
8627                                         case QUEST_TYPE_KILL_ALL:
8628 #ifdef JP
8629                                                 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8630 #else
8631                                                 sprintf(note," - Kill all monsters.");
8632 #endif
8633                                                 break;
8634                                         }
8635                                 }
8636
8637                                 /* Print the quest info */
8638 #ifdef JP
8639                                 sprintf(tmp_str, "  %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8640                                         quest[i].name, quest[i].level, note);
8641 #else
8642                                 sprintf(tmp_str, "  %s (Danger level: %d)%s\n",
8643                                         quest[i].name, quest[i].level, note);
8644 #endif
8645
8646                                 fprintf(fff, tmp_str);
8647
8648                                 if (quest[i].status == QUEST_STATUS_COMPLETED)
8649                                 {
8650 #ifdef JP
8651                                         sprintf(tmp_str, "    ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8652 #else
8653                                         sprintf(tmp_str, "    Quest Completed - Unrewarded\n");
8654 #endif
8655                                         fprintf(fff, tmp_str);
8656                                 }
8657                                 else
8658                                 {
8659                                         j = 0;
8660
8661                                         while (quest_text[j][0] && j < 10)
8662                                         {
8663                                                 fprintf(fff, "    %s\n", quest_text[j]);
8664                                                 j++;
8665                                         }
8666                                 }
8667                         }
8668                         else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8669                         {
8670                                 /* New random */
8671                                 rand_level = quest[i].level;
8672
8673                                 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8674                                 {
8675                                         /* Print the quest info */
8676                                         r_ptr = &r_info[quest[i].r_idx];
8677                                         strcpy(name, r_name + r_ptr->name);
8678
8679                                         if (quest[i].max_num > 1)
8680                                         {
8681 #ifdef JP
8682                                                 sprintf(rand_tmp_str,"  %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8683                                                         quest[i].name, quest[i].level,
8684                                                         quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8685 #else
8686                                                 plural_aux(name);
8687
8688                                                 sprintf(rand_tmp_str,"  %s (Dungeon level: %d)\n  Kill %d %s, have killed %d.\n",
8689                                                         quest[i].name, quest[i].level,
8690                                                         quest[i].max_num, name, quest[i].cur_num);
8691 #endif
8692                                         }
8693                                         else
8694                                         {
8695 #ifdef JP
8696                                                 sprintf(rand_tmp_str,"  %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8697                                                         quest[i].name, quest[i].level, name);
8698 #else
8699                                                 sprintf(rand_tmp_str,"  %s (Dungeon level: %d)\n  Kill %s.\n",
8700                                                         quest[i].name, quest[i].level, name);
8701 #endif
8702                                         }
8703                                 }
8704                         }
8705                 }
8706         }
8707
8708         /* Print the current random quest  */
8709         if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8710
8711 #ifdef JP
8712         if (!total) fprintf(fff, "  ¤Ê¤·\n");
8713 #else
8714         if (!total) fprintf(fff, "  Nothing.\n");
8715 #endif
8716 }
8717
8718
8719 /*
8720  * Print all finished quests
8721  */
8722 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8723 {
8724         char tmp_str[120];
8725         int i;
8726         int total = 0;
8727
8728 #ifdef JP
8729         fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8730 #else
8731         fprintf(fff, "< Completed Quest >\n");
8732 #endif
8733         for (i = 1; i < max_quests; i++)
8734         {
8735                 int q_idx = quest_num[i];
8736
8737                 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8738                 {
8739                         if (is_fixed_quest_idx(q_idx))
8740                         {
8741                                 /* Set the quest number temporary */
8742                                 int old_quest = p_ptr->inside_quest;
8743
8744                                 p_ptr->inside_quest = q_idx;
8745
8746                                 /* Get the quest */
8747                                 init_flags = INIT_ASSIGN;
8748
8749                                 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8750
8751                                 /* Reset the old quest number */
8752                                 p_ptr->inside_quest = old_quest;
8753
8754                                 /* No info from "silent" quests */
8755                                 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8756                         }
8757
8758                         total++;
8759
8760                         if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8761                         {
8762                                 /* Print the quest info */
8763
8764                                 if (quest[q_idx].complev == 0)
8765                                 {
8766                                         sprintf(tmp_str,
8767 #ifdef JP
8768                                                 "  %-40s (%3d³¬)            -   ÉÔÀᄀ\n",
8769 #else
8770                                                 "  %-40s (Dungeon level: %3d) - (Cancelled)\n",
8771 #endif
8772                                                 r_name+r_info[quest[q_idx].r_idx].name,
8773                                                 quest[q_idx].level);
8774                                 }
8775                                 else
8776                                 {
8777                                         sprintf(tmp_str,
8778 #ifdef JP
8779                                                 "  %-40s (%3d³¬)            - ¥ì¥Ù¥ë%2d\n",
8780 #else
8781                                                 "  %-40s (Dungeon level: %3d) - level %2d\n",
8782 #endif
8783                                                 r_name+r_info[quest[q_idx].r_idx].name,
8784                                                 quest[q_idx].level,
8785                                                 quest[q_idx].complev);
8786                                 }
8787                         }
8788                         else
8789                         {
8790                                 /* Print the quest info */
8791 #ifdef JP
8792                                 sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8793                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8794 #else
8795                                 sprintf(tmp_str, "  %-40s (Danger  level: %3d) - level %2d\n",
8796                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8797 #endif
8798                         }
8799
8800                         fprintf(fff, tmp_str);
8801                 }
8802         }
8803 #ifdef JP
8804         if (!total) fprintf(fff, "  ¤Ê¤·\n");
8805 #else
8806         if (!total) fprintf(fff, "  Nothing.\n");
8807 #endif
8808 }
8809
8810
8811 /*
8812  * Print all failed quests
8813  */
8814 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8815 {
8816         char tmp_str[120];
8817         int i;
8818         int total = 0;
8819
8820 #ifdef JP
8821         fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8822 #else
8823         fprintf(fff, "< Failed Quest >\n");
8824 #endif
8825         for (i = 1; i < max_quests; i++)
8826         {
8827                 int q_idx = quest_num[i];
8828
8829                 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8830                 {
8831                         if (is_fixed_quest_idx(q_idx))
8832                         {
8833                                 /* Set the quest number temporary */
8834                                 int old_quest = p_ptr->inside_quest;
8835
8836                                 p_ptr->inside_quest = q_idx;
8837
8838                                 /* Get the quest text */
8839                                 init_flags = INIT_ASSIGN;
8840
8841                                 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8842
8843                                 /* Reset the old quest number */
8844                                 p_ptr->inside_quest = old_quest;
8845
8846                                 /* No info from "silent" quests */
8847                                 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8848                         }
8849
8850                         total++;
8851
8852                         if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8853                         {
8854                                 /* Print the quest info */
8855 #ifdef JP
8856                                 sprintf(tmp_str, "  %-40s (%3d³¬)            - ¥ì¥Ù¥ë%2d\n",
8857                                         r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8858 #else
8859                                 sprintf(tmp_str, "  %-40s (Dungeon level: %3d) - level %2d\n",
8860                                         r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8861 #endif
8862                         }
8863                         else
8864                         {
8865                                 /* Print the quest info */
8866 #ifdef JP
8867                                 sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8868                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8869 #else
8870                                 sprintf(tmp_str, "  %-40s (Danger  level: %3d) - level %2d\n",
8871                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8872 #endif
8873                         }
8874                         fprintf(fff, tmp_str);
8875                 }
8876         }
8877 #ifdef JP
8878         if (!total) fprintf(fff, "  ¤Ê¤·\n");
8879 #else
8880         if (!total) fprintf(fff, "  Nothing.\n");
8881 #endif
8882 }
8883
8884
8885 /*
8886  * Print all random quests
8887  */
8888 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
8889 {
8890         char tmp_str[120];
8891         int i;
8892         int total = 0;
8893
8894 #ifdef JP
8895         fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
8896 #else
8897         fprintf(fff, "< Remaining Random Quest >\n");
8898 #endif
8899         for (i = 1; i < max_quests; i++)
8900         {
8901                 /* No info from "silent" quests */
8902                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8903
8904                 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
8905                 {
8906                         total++;
8907
8908                         /* Print the quest info */
8909 #ifdef JP
8910                         sprintf(tmp_str, "  %s (%d³¬, %s)\n",
8911                                 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8912 #else
8913                         sprintf(tmp_str, "  %s (%d, %s)\n",
8914                                 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
8915 #endif
8916                         fprintf(fff, tmp_str);
8917                 }
8918         }
8919 #ifdef JP
8920         if (!total) fprintf(fff, "  ¤Ê¤·\n");
8921 #else
8922         if (!total) fprintf(fff, "  Nothing.\n");
8923 #endif
8924 }
8925
8926
8927 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
8928 {
8929         int *q_num = (int *)u;
8930         quest_type *qa = &quest[q_num[a]];
8931         quest_type *qb = &quest[q_num[b]];
8932
8933         /* Unused */
8934         (void)v;
8935
8936         if (qa->complev < qb->complev) return TRUE;
8937         if (qa->complev > qb->complev) return FALSE;
8938         if (qa->level <= qb->level) return TRUE;
8939         return FALSE;
8940 }
8941
8942 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
8943 {
8944         int *q_num = (int *)u;
8945         int tmp;
8946
8947         /* Unused */
8948         (void)v;
8949
8950         tmp = q_num[a];
8951         q_num[a] = q_num[b];
8952         q_num[b] = tmp;
8953 }
8954
8955
8956 /*
8957  * Print quest status of all active quests
8958  */
8959 static void do_cmd_knowledge_quests(void)
8960 {
8961         FILE *fff;
8962         char file_name[1024];
8963         int *quest_num, dummy, i;
8964
8965         /* Open a new file */
8966         fff = my_fopen_temp(file_name, 1024);
8967         if (!fff)
8968         {
8969 #ifdef JP
8970             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8971 #else
8972             msg_format("Failed to create temporary file %s.", file_name);
8973 #endif
8974             msg_print(NULL);
8975             return;
8976         }
8977
8978         /* Allocate Memory */
8979         C_MAKE(quest_num, max_quests, int);
8980
8981         /* Sort by compete level */
8982         for (i = 1; i < max_quests; i++) quest_num[i] = i;
8983         ang_sort_comp = ang_sort_comp_quest_num;
8984         ang_sort_swap = ang_sort_swap_quest_num;
8985         ang_sort(quest_num, &dummy, max_quests);
8986
8987         /* Dump Quest Information */
8988         do_cmd_knowledge_quests_current(fff);
8989         fputc('\n', fff);
8990         do_cmd_knowledge_quests_completed(fff, quest_num);
8991         fputc('\n', fff);
8992         do_cmd_knowledge_quests_failed(fff, quest_num);
8993         if (p_ptr->wizard)
8994         {
8995                 fputc('\n', fff);
8996                 do_cmd_knowledge_quests_wiz_random(fff);
8997         }
8998
8999         /* Close the file */
9000         my_fclose(fff);
9001
9002         /* Display the file contents */
9003 #ifdef JP
9004         show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9005 #else
9006         show_file(TRUE, file_name, "Quest status", 0, 0);
9007 #endif
9008
9009         /* Remove the file */
9010         fd_kill(file_name);
9011
9012         /* Free Memory */
9013         C_KILL(quest_num, max_quests, int);
9014 }
9015
9016
9017 /*
9018  * List my home
9019  */
9020 static void do_cmd_knowledge_home(void)
9021 {
9022         FILE *fff;
9023
9024         int i;
9025         char file_name[1024];
9026         store_type  *st_ptr;
9027         char o_name[MAX_NLEN];
9028         cptr            paren = ")";
9029
9030         process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9031
9032         /* Open a new file */
9033         fff = my_fopen_temp(file_name, 1024);
9034         if (!fff) {
9035 #ifdef JP
9036                 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9037 #else
9038                 msg_format("Failed to create temporary file %s.", file_name);
9039 #endif
9040                 msg_print(NULL);
9041                 return;
9042         }
9043
9044         if (fff)
9045         {
9046                 /* Print all homes in the different towns */
9047                 st_ptr = &town[1].store[STORE_HOME];
9048
9049                 /* Home -- if anything there */
9050                 if (st_ptr->stock_num)
9051                 {
9052 #ifdef JP
9053                         int x = 1;
9054 #endif
9055                         /* Header with name of the town */
9056 #ifdef JP
9057                         fprintf(fff, "  [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9058 #else
9059                         fprintf(fff, "  [Home Inventory]\n");
9060 #endif
9061
9062                         /* Dump all available items */
9063                         for (i = 0; i < st_ptr->stock_num; i++)
9064                         {
9065 #ifdef JP
9066                                 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9067                                 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9068                                 if (strlen(o_name) <= 80-3)
9069                                 {
9070                                         fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9071                                 }
9072                                 else
9073                                 {
9074                                         int n;
9075                                         char *t;
9076                                         for (n = 0, t = o_name; n < 80-3; n++, t++)
9077                                                 if(iskanji(*t)) {t++; n++;}
9078                                         if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9079
9080                                         fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9081                                         fprintf(fff, "   %.77s\n", o_name+n);
9082                                 }
9083 #else
9084                                 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
9085                                 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9086 #endif
9087
9088                         }
9089
9090                         /* Add an empty line */
9091                         fprintf(fff, "\n\n");
9092                 }
9093         }
9094
9095         /* Close the file */
9096         my_fclose(fff);
9097
9098         /* Display the file contents */
9099 #ifdef JP
9100         show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9101 #else
9102         show_file(TRUE, file_name, "Home Inventory", 0, 0);
9103 #endif
9104
9105
9106         /* Remove the file */
9107         fd_kill(file_name);
9108 }
9109
9110
9111 /*
9112  * Check the status of "autopick"
9113  */
9114 static void do_cmd_knowledge_autopick(void)
9115 {
9116         int k;
9117         FILE *fff;
9118         char file_name[1024];
9119
9120         /* Open a new file */
9121         fff = my_fopen_temp(file_name, 1024);
9122
9123         if (!fff)
9124         {
9125 #ifdef JP
9126             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9127 #else
9128             msg_format("Failed to create temporary file %s.", file_name);
9129 #endif
9130             msg_print(NULL);
9131             return;
9132         }
9133
9134         if (!max_autopick)
9135         {
9136 #ifdef JP
9137             fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9138 #else
9139             fprintf(fff, "No preference for auto picker/destroyer.");
9140 #endif
9141         }
9142         else
9143         {
9144 #ifdef JP
9145             fprintf(fff, "   ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9146 #else
9147             fprintf(fff, "   There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9148 #endif
9149         }
9150
9151         for (k = 0; k < max_autopick; k++)
9152         {
9153                 cptr tmp;
9154                 byte act = autopick_list[k].action;
9155                 if (act & DONT_AUTOPICK)
9156                 {
9157 #ifdef JP
9158                         tmp = "ÊüÃÖ";
9159 #else
9160                         tmp = "Leave";
9161 #endif
9162                 }
9163                 else if (act & DO_AUTODESTROY)
9164                 {
9165 #ifdef JP
9166                         tmp = "Ç˲õ";
9167 #else
9168                         tmp = "Destroy";
9169 #endif
9170                 }
9171                 else if (act & DO_AUTOPICK)
9172                 {
9173 #ifdef JP
9174                         tmp = "½¦¤¦";
9175 #else
9176                         tmp = "Pickup";
9177 #endif
9178                 }
9179                 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9180                 {
9181 #ifdef JP
9182                         tmp = "³Îǧ";
9183 #else
9184                         tmp = "Query";
9185 #endif
9186                 }
9187
9188                 if (act & DO_DISPLAY)
9189                         fprintf(fff, "%11s", format("[%s]", tmp));
9190                 else
9191                         fprintf(fff, "%11s", format("(%s)", tmp));
9192
9193                 tmp = autopick_line_from_entry(&autopick_list[k]);
9194                 fprintf(fff, " %s", tmp);
9195                 string_free(tmp);
9196                 fprintf(fff, "\n");
9197         }
9198         /* Close the file */
9199         my_fclose(fff);
9200         /* Display the file contents */
9201 #ifdef JP
9202         show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9203 #else
9204         show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9205 #endif
9206
9207         /* Remove the file */
9208         fd_kill(file_name);
9209 }
9210
9211
9212 /*
9213  * Interact with "knowledge"
9214  */
9215 void do_cmd_knowledge(void)
9216 {
9217         int i,p=0;
9218         /* File type is "TEXT" */
9219         FILE_TYPE(FILE_TYPE_TEXT);
9220         /* Save the screen */
9221         screen_save();
9222         /* Interact until done */
9223         while (1)
9224         {
9225                 /* Clear screen */
9226                 Term_clear();
9227                 /* Ask for a choice */
9228 #ifdef JP
9229                 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9230                 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9231 #else
9232                 prt(format("page %d/2", (p+1)), 2, 65);
9233                 prt("Display current knowledge", 3, 0);
9234 #endif
9235
9236                 /* Give some choices */
9237 #ifdef JP
9238                 if (p == 0) {
9239                         prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à                 ¤Î°ìÍ÷", 6, 5);
9240                         prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à                       ¤Î°ìÍ÷", 7, 5);
9241                         prt("(3) ´ûÃΤÎÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9242                         prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼                     ¤Î°ìÍ÷", 9, 5);
9243                         prt("(5) Åݤ·¤¿Å¨¤Î¿ô                         ¤Î°ìÍ÷", 10, 5);
9244                         if (!vanilla_town) prt("(6) ¾Þ¶â¼ó                               ¤Î°ìÍ÷", 11, 5);
9245                         prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È                         ¤Î°ìÍ÷", 12, 5);
9246                         prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à                     ¤Î°ìÍ÷", 13, 5);
9247                         prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ­                 ¤Î°ìÍ÷", 14, 5);
9248                         prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë                ¤Î°ìÍ÷", 15, 5);
9249                 } else {
9250                         prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó                     ¤Î°ìÍ÷", 6, 5);
9251                         prt("(b) ÆÍÁ³ÊÑ°Û                             ¤Î°ìÍ÷", 7, 5);
9252                         prt("(c) Éð´ï¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 8, 5);
9253                         prt("(d) ËâË¡¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 9, 5);
9254                         prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 10, 5);
9255                         prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ                       ¤Î°ìÍ÷", 11, 5);
9256                         prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó                     ¤Î°ìÍ÷", 12, 5);
9257                         prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È                     ¤Î°ìÍ÷", 13, 5);
9258                         prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê              ¤Î°ìÍ÷", 14, 5);
9259                 }
9260 #else
9261                 if (p == 0) {
9262                         prt("(1) Display known artifacts", 6, 5);
9263                         prt("(2) Display known objects", 7, 5);
9264                         prt("(3) Display remaining uniques", 8, 5);
9265                         prt("(4) Display known monster", 9, 5);
9266                         prt("(5) Display kill count", 10, 5);
9267                         if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9268                         prt("(7) Display current pets", 12, 5);
9269                         prt("(8) Display home inventory", 13, 5);
9270                         prt("(9) Display *identified* equip.", 14, 5);
9271                         prt("(0) Display terrain symbols.", 15, 5);
9272                 } else {
9273                         prt("(a) Display about yourself", 6, 5);
9274                         prt("(b) Display mutations", 7, 5);
9275                         prt("(c) Display weapon proficiency", 8, 5);
9276                         prt("(d) Display spell proficiency", 9, 5);
9277                         prt("(e) Display misc. proficiency", 10, 5);
9278                         prt("(f) Display virtues", 11, 5);
9279                         prt("(g) Display dungeons", 12, 5);
9280                         prt("(h) Display current quests", 13, 5);
9281                         prt("(i) Display auto pick/destroy", 14, 5);
9282                 }
9283 #endif
9284                 /* Prompt */
9285 #ifdef JP
9286                 prt("-³¤¯-", 17, 8);
9287                 prt("ESC) È´¤±¤ë", 21, 1);
9288                 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9289                 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9290                 prt("¥³¥Þ¥ó¥É:", 20, 0);
9291 #else
9292                 prt("-more-", 17, 8);
9293                 prt("ESC) Exit menu", 21, 1);
9294                 prt("SPACE) Next page", 21, 30);
9295                 /*prt("-) Previous page", 21, 60);*/
9296                 prt("Command: ", 20, 0);
9297 #endif
9298
9299                 /* Prompt */
9300                 i = inkey();
9301                 /* Done */
9302                 if (i == ESCAPE) break;
9303                 switch (i)
9304                 {
9305                 case ' ': /* Page change */
9306                 case '-':
9307                         p = 1 - p;
9308                         break;
9309                 case '1': /* Artifacts */
9310                         do_cmd_knowledge_artifacts();
9311                         break;
9312                 case '2': /* Objects */
9313                         do_cmd_knowledge_objects();
9314                         break;
9315                 case '3': /* Uniques */
9316                         do_cmd_knowledge_uniques();
9317                         break;
9318                 case '4': /* Monsters */
9319                         do_cmd_knowledge_monsters();
9320                         break;
9321                 case '5': /* Kill count  */
9322                         do_cmd_knowledge_kill_count();
9323                         break;
9324                 case '6': /* wanted */
9325                         if (!vanilla_town) do_cmd_knowledge_kubi();
9326                         break;
9327                 case '7': /* Pets */
9328                         do_cmd_knowledge_pets();
9329                         break;
9330                 case '8': /* Home */
9331                         do_cmd_knowledge_home();
9332                         break;
9333                 case '9': /* Resist list */
9334                         do_cmd_knowledge_inven();
9335                         break;
9336                 case '0': /* Feature list */
9337                         do_cmd_knowledge_features();
9338                         break;
9339                 /* Next page */
9340                 case 'a': /* Max stat */
9341                         do_cmd_knowledge_stat();
9342                         break;
9343                 case 'b': /* Mutations */
9344                         do_cmd_knowledge_mutations();
9345                         break;
9346                 case 'c': /* weapon-exp */
9347                         do_cmd_knowledge_weapon_exp();
9348                         break;
9349                 case 'd': /* spell-exp */
9350                         do_cmd_knowledge_spell_exp();
9351                         break;
9352                 case 'e': /* skill-exp */
9353                         do_cmd_knowledge_skill_exp();
9354                         break;
9355                 case 'f': /* Virtues */
9356                         do_cmd_knowledge_virtues();
9357                         break;
9358                 case 'g': /* Dungeon */
9359                         do_cmd_knowledge_dungeon();
9360                         break;
9361                 case 'h': /* Quests */
9362                         do_cmd_knowledge_quests();
9363                         break;
9364                 case 'i': /* Autopick */
9365                         do_cmd_knowledge_autopick();
9366                         break;
9367                 default: /* Unknown option */
9368                         bell();
9369                 }
9370                 /* Flush messages */
9371                 msg_print(NULL);
9372         }
9373         /* Restore the screen */
9374         screen_load();
9375 }
9376
9377
9378 /*
9379  * Check on the status of an active quest
9380  */
9381 void do_cmd_checkquest(void)
9382 {
9383         /* File type is "TEXT" */
9384         FILE_TYPE(FILE_TYPE_TEXT);
9385
9386         /* Save the screen */
9387         screen_save();
9388
9389         /* Quest info */
9390         do_cmd_knowledge_quests();
9391
9392         /* Restore the screen */
9393         screen_load();
9394 }
9395
9396
9397 /*
9398  * Display the time and date
9399  */
9400 void do_cmd_time(void)
9401 {
9402         int day, hour, min, full, start, end, num;
9403         char desc[1024];
9404
9405         char buf[1024];
9406
9407         FILE *fff;
9408
9409         extract_day_hour_min(&day, &hour, &min);
9410
9411         full = hour * 100 + min;
9412
9413         start = 9999;
9414         end = -9999;
9415
9416         num = 0;
9417
9418 #ifdef JP
9419         strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9420 #else
9421         strcpy(desc, "It is a strange time.");
9422 #endif
9423
9424
9425         /* Message */
9426 #ifdef JP
9427         msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9428                    day, (hour % 12 == 0) ? 12 : (hour % 12),
9429                    min, (hour < 12) ? "AM" : "PM");
9430 #else
9431         msg_format("This is day %d. The time is %d:%02d %s.",
9432                    day, (hour % 12 == 0) ? 12 : (hour % 12),
9433                    min, (hour < 12) ? "AM" : "PM");
9434 #endif
9435
9436
9437         /* Find the path */
9438         if (!randint0(10) || p_ptr->image)
9439         {
9440 #ifdef JP
9441                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9442 #else
9443                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9444 #endif
9445
9446         }
9447         else
9448         {
9449 #ifdef JP
9450                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9451 #else
9452                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9453 #endif
9454
9455         }
9456
9457         /* Open this file */
9458         fff = my_fopen(buf, "rt");
9459
9460         /* Oops */
9461         if (!fff) return;
9462
9463         /* Find this time */
9464         while (!my_fgets(fff, buf, sizeof(buf)))
9465         {
9466                 /* Ignore comments */
9467                 if (!buf[0] || (buf[0] == '#')) continue;
9468
9469                 /* Ignore invalid lines */
9470                 if (buf[1] != ':') continue;
9471
9472                 /* Process 'Start' */
9473                 if (buf[0] == 'S')
9474                 {
9475                         /* Extract the starting time */
9476                         start = atoi(buf + 2);
9477
9478                         /* Assume valid for an hour */
9479                         end = start + 59;
9480
9481                         /* Next... */
9482                         continue;
9483                 }
9484
9485                 /* Process 'End' */
9486                 if (buf[0] == 'E')
9487                 {
9488                         /* Extract the ending time */
9489                         end = atoi(buf + 2);
9490
9491                         /* Next... */
9492                         continue;
9493                 }
9494
9495                 /* Ignore incorrect range */
9496                 if ((start > full) || (full > end)) continue;
9497
9498                 /* Process 'Description' */
9499                 if (buf[0] == 'D')
9500                 {
9501                         num++;
9502
9503                         /* Apply the randomizer */
9504                         if (!randint0(num)) strcpy(desc, buf + 2);
9505
9506                         /* Next... */
9507                         continue;
9508                 }
9509         }
9510
9511         /* Message */
9512         msg_print(desc);
9513
9514         /* Close the file */
9515         my_fclose(fff);
9516 }