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(TRUE);
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(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(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) Map Screen Options", 3, 5);
2313                 prt("(3) Text Display Options", 4, 5);
2314                 prt("(4) Game-Play Options", 5, 5);
2315                 prt("(5) Disturbance 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                         case '1':
2377                         {
2378                                 /* Process the general options */
2379 #ifdef JP
2380                                 do_cmd_options_aux(OPT_PAGE_INPUT, "¥­¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2381 #else
2382                                 do_cmd_options_aux(OPT_PAGE_INPUT, "Input Options");
2383 #endif
2384
2385                                 break;
2386                         }
2387
2388                         case '2':
2389                         {
2390                                 /* Process the general options */
2391 #ifdef JP
2392                                 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "¥Þ¥Ã¥×²èÌÌ¥ª¥×¥·¥ç¥ó");
2393 #else
2394                                 do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "Map Screen Options");
2395 #endif
2396
2397                                 break;
2398                         }
2399
2400                         case '3':
2401                         {
2402                                 /* Spawn */
2403 #ifdef JP
2404                                 do_cmd_options_aux(OPT_PAGE_TEXT, "¥Æ¥­¥¹¥Èɽ¼¨¥ª¥×¥·¥ç¥ó");
2405 #else
2406                                 do_cmd_options_aux(OPT_PAGE_TEXT, "Text Display Options");
2407 #endif
2408
2409                                 break;
2410                         }
2411
2412                         case '4':
2413                         {
2414                                 /* Spawn */
2415 #ifdef JP
2416                                 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2417 #else
2418                                 do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "Game-Play Options");
2419 #endif
2420
2421                                 break;
2422                         }
2423
2424                         case '5':
2425                         {
2426                                 /* Spawn */
2427 #ifdef JP
2428                                 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2429 #else
2430                                 do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "Disturbance Options");
2431 #endif
2432
2433                                 break;
2434                         }
2435
2436                         case '6':
2437                         {
2438                                 /* Spawn */
2439 #ifdef JP
2440                                 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "´Ê°×¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2441 #else
2442                                 do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "Easy Auto-Destroyer Options");
2443 #endif
2444                                 break;
2445                         }
2446
2447                         /* Play-record Options */
2448                         case 'R':
2449                         case 'r':
2450                         {
2451                                 /* Spawn */
2452 #ifdef JP
2453                                 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "¥×¥ì¥¤µ­Ï¿¥ª¥×¥·¥ç¥ó");
2454 #else
2455                                 do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "Play-record Options");
2456 #endif
2457                                 break;
2458                         }
2459
2460                         /* Birth Options */
2461                         case 'B':
2462                         case 'b':
2463                         {
2464                                 /* Spawn */
2465 #ifdef JP
2466                                 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
2467 #else
2468                                 do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
2469 #endif
2470
2471                                 break;
2472                         }
2473
2474                         /* Cheating Options */
2475                         case 'C':
2476                         {
2477                                 if (!p_ptr->noscore && !allow_debug_opts)
2478                                 {
2479                                         /* Cheat options are not permitted */
2480                                         bell();
2481                                         break;
2482                                 }
2483
2484                                 /* Spawn */
2485 #ifdef JP
2486                                 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤­¤Ê¤¤¡ª");
2487 #else
2488                                 do_cmd_options_cheat("Cheaters never win");
2489 #endif
2490
2491                                 break;
2492                         }
2493
2494                         case 'a':
2495                         case 'A':
2496                         {
2497 #ifdef JP
2498                                 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2499 #else
2500                                 do_cmd_options_autosave("Autosave");
2501 #endif
2502
2503                                 break;
2504                         }
2505
2506                         /* Window flags */
2507                         case 'W':
2508                         case 'w':
2509                         {
2510                                 /* Spawn */
2511                                 do_cmd_options_win();
2512                                 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2513                                                   PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2514                                                   PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2515                                                   PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2516                                 break;
2517                         }
2518
2519                         /* Auto-picker/destroyer editor */
2520                         case 'P':
2521                         case 'p':
2522                         {
2523                                 do_cmd_edit_autopick();
2524                                 break;
2525                         }
2526
2527                         /* Hack -- Delay Speed */
2528                         case 'D':
2529                         case 'd':
2530                         {
2531                                 /* Prompt */
2532 #ifdef JP
2533                                 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
2534 #else
2535                                 prt("Command: Base Delay Factor", 19, 0);
2536 #endif
2537
2538
2539                                 /* Get a new value */
2540                                 while (1)
2541                                 {
2542                                         int msec = delay_factor * delay_factor * delay_factor;
2543 #ifdef JP
2544                                         prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2545                                                    delay_factor, msec), 22, 0);
2546 #else
2547                                         prt(format("Current base delay factor: %d (%d msec)",
2548                                                    delay_factor, msec), 22, 0);
2549 #endif
2550
2551 #ifdef JP
2552                                         prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2553 #else
2554                                         prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2555 #endif
2556
2557                                         k = inkey();
2558                                         if (k == ESCAPE) break;
2559                                         else if (k == '?')
2560                                         {
2561 #ifdef JP
2562                                                 (void)show_file(TRUE, "joption.txt#BaseDelay", NULL, 0, 0);
2563 #else
2564                                                 (void)show_file(TRUE, "option.txt#BaseDelay", NULL, 0, 0);
2565 #endif
2566                                                 Term_clear(); 
2567                                         }
2568                                         else if (isdigit(k)) delay_factor = D2I(k);
2569                                         else bell();
2570                                 }
2571
2572                                 break;
2573                         }
2574
2575                         /* Hack -- hitpoint warning factor */
2576                         case 'H':
2577                         case 'h':
2578                         {
2579                                 /* Prompt */
2580 #ifdef JP
2581                                 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
2582 #else
2583                                 prt("Command: Hitpoint Warning", 19, 0);
2584 #endif
2585
2586
2587                                 /* Get a new value */
2588                                 while (1)
2589                                 {
2590 #ifdef JP
2591                                         prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2592                                                    hitpoint_warn), 22, 0);
2593 #else
2594                                         prt(format("Current hitpoint warning: %d0%%",
2595                                                    hitpoint_warn), 22, 0);
2596 #endif
2597
2598 #ifdef JP
2599                                         prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2600 #else
2601                                         prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2602 #endif
2603
2604                                         k = inkey();
2605                                         if (k == ESCAPE) break;
2606                                         else if (k == '?')
2607                                         {
2608 #ifdef JP
2609                                                 (void)show_file(TRUE, "joption.txt#Hitpoint", NULL, 0, 0);
2610 #else
2611                                                 (void)show_file(TRUE, "option.txt#Hitpoint", NULL, 0, 0);
2612 #endif
2613                                                 Term_clear(); 
2614                                         }
2615                                         else if (isdigit(k)) hitpoint_warn = D2I(k);
2616                                         else bell();
2617                                 }
2618
2619                                 break;
2620                         }
2621
2622                         /* Hack -- mana color factor */
2623                         case 'M':
2624                         case 'm':
2625                         {
2626                                 /* Prompt */
2627 #ifdef JP
2628                                 prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
2629 #else
2630                                 prt("Command: Mana Color Threshold", 19, 0);
2631 #endif
2632
2633
2634                                 /* Get a new value */
2635                                 while (1)
2636                                 {
2637 #ifdef JP
2638                                         prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
2639                                                    mana_warn), 22, 0);
2640 #else
2641                                         prt(format("Current mana color threshold: %d0%%",
2642                                                    mana_warn), 22, 0);
2643 #endif
2644
2645 #ifdef JP
2646                                         prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
2647 #else
2648                                         prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
2649 #endif
2650
2651                                         k = inkey();
2652                                         if (k == ESCAPE) break;
2653                                         else if (k == '?')
2654                                         {
2655 #ifdef JP
2656                                                 (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
2657 #else
2658                                                 (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
2659 #endif
2660                                                 Term_clear(); 
2661                                         }
2662                                         else if (isdigit(k)) mana_warn = D2I(k);
2663                                         else bell();
2664                                 }
2665
2666                                 break;
2667                         }
2668
2669                         case '?':
2670 #ifdef JP
2671                                 (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
2672 #else
2673                                 (void)show_file(TRUE, "option.txt", NULL, 0, 0);
2674 #endif
2675                                 Term_clear(); 
2676                                 break;
2677
2678                         /* Unknown option */
2679                         default:
2680                         {
2681                                 /* Oops */
2682                                 bell();
2683                                 break;
2684                         }
2685                 }
2686
2687                 /* Flush messages */
2688                 msg_print(NULL);
2689         }
2690
2691
2692         /* Restore the screen */
2693         screen_load();
2694
2695         /* Hack - Redraw equippy chars */
2696         p_ptr->redraw |= (PR_EQUIPPY);
2697 }
2698
2699
2700
2701 /*
2702  * Ask for a "user pref line" and process it
2703  *
2704  * XXX XXX XXX Allow absolute file names?
2705  */
2706 void do_cmd_pref(void)
2707 {
2708         char buf[80];
2709
2710         /* Default */
2711         strcpy(buf, "");
2712
2713         /* Ask for a "user pref command" */
2714 #ifdef JP
2715         if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2716 #else
2717         if (!get_string("Pref: ", buf, 80)) return;
2718 #endif
2719
2720
2721         /* Process that pref command */
2722         (void)process_pref_file_command(buf);
2723 }
2724
2725 void do_cmd_reload_autopick(void)
2726 {
2727 #ifdef JP
2728         if (!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2729 #else
2730         if (!get_check("Reload auto-pick preference file? ")) return;
2731 #endif
2732
2733         /* Load the file with messages */
2734         autopick_load_pref(TRUE);
2735 }
2736
2737 #ifdef ALLOW_MACROS
2738
2739 /*
2740  * Hack -- append all current macros to the given file
2741  */
2742 static errr macro_dump(cptr fname)
2743 {
2744         static cptr mark = "Macro Dump";
2745
2746         int i;
2747
2748         char buf[1024];
2749
2750         /* Build the filename */
2751         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2752
2753         /* File type is "TEXT" */
2754         FILE_TYPE(FILE_TYPE_TEXT);
2755
2756         /* Append to the file */
2757         if (!open_auto_dump(buf, mark)) return (-1);
2758
2759         /* Start dumping */
2760 #ifdef JP
2761         auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2762 #else
2763         auto_dump_printf("\n# Automatic macro dump\n\n");
2764 #endif
2765
2766         /* Dump them */
2767         for (i = 0; i < macro__num; i++)
2768         {
2769                 /* Extract the action */
2770                 ascii_to_text(buf, macro__act[i]);
2771
2772                 /* Dump the macro */
2773                 auto_dump_printf("A:%s\n", buf);
2774
2775                 /* Extract the action */
2776                 ascii_to_text(buf, macro__pat[i]);
2777
2778                 /* Dump normal macros */
2779                 auto_dump_printf("P:%s\n", buf);
2780
2781                 /* End the macro */
2782                 auto_dump_printf("\n");
2783         }
2784
2785         /* Close */
2786         close_auto_dump();
2787
2788         /* Success */
2789         return (0);
2790 }
2791
2792
2793 /*
2794  * Hack -- ask for a "trigger" (see below)
2795  *
2796  * Note the complex use of the "inkey()" function from "util.c".
2797  *
2798  * Note that both "flush()" calls are extremely important.
2799  */
2800 static void do_cmd_macro_aux(char *buf)
2801 {
2802         int i, n = 0;
2803
2804         char tmp[1024];
2805
2806
2807         /* Flush */
2808         flush();
2809
2810         /* Do not process macros */
2811         inkey_base = TRUE;
2812
2813         /* First key */
2814         i = inkey();
2815
2816         /* Read the pattern */
2817         while (i)
2818         {
2819                 /* Save the key */
2820                 buf[n++] = i;
2821
2822                 /* Do not process macros */
2823                 inkey_base = TRUE;
2824
2825                 /* Do not wait for keys */
2826                 inkey_scan = TRUE;
2827
2828                 /* Attempt to read a key */
2829                 i = inkey();
2830         }
2831
2832         /* Terminate */
2833         buf[n] = '\0';
2834
2835         /* Flush */
2836         flush();
2837
2838
2839         /* Convert the trigger */
2840         ascii_to_text(tmp, buf);
2841
2842         /* Hack -- display the trigger */
2843         Term_addstr(-1, TERM_WHITE, tmp);
2844 }
2845
2846 #endif
2847
2848
2849 /*
2850  * Hack -- ask for a keymap "trigger" (see below)
2851  *
2852  * Note that both "flush()" calls are extremely important.  This may
2853  * no longer be true, since "util.c" is much simpler now.  XXX XXX XXX
2854  */
2855 static void do_cmd_macro_aux_keymap(char *buf)
2856 {
2857         char tmp[1024];
2858
2859
2860         /* Flush */
2861         flush();
2862
2863
2864         /* Get a key */
2865         buf[0] = inkey();
2866         buf[1] = '\0';
2867
2868
2869         /* Convert to ascii */
2870         ascii_to_text(tmp, buf);
2871
2872         /* Hack -- display the trigger */
2873         Term_addstr(-1, TERM_WHITE, tmp);
2874
2875
2876         /* Flush */
2877         flush();
2878 }
2879
2880
2881 /*
2882  * Hack -- append all keymaps to the given file
2883  */
2884 static errr keymap_dump(cptr fname)
2885 {
2886         static cptr mark = "Keymap Dump";
2887         int i;
2888
2889         char key[1024];
2890         char buf[1024];
2891
2892         int mode;
2893
2894         /* Roguelike */
2895         if (rogue_like_commands)
2896         {
2897                 mode = KEYMAP_MODE_ROGUE;
2898         }
2899
2900         /* Original */
2901         else
2902         {
2903                 mode = KEYMAP_MODE_ORIG;
2904         }
2905
2906
2907         /* Build the filename */
2908         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
2909
2910         /* File type is "TEXT" */
2911         FILE_TYPE(FILE_TYPE_TEXT);
2912
2913         /* Append to the file */
2914         if (!open_auto_dump(buf, mark)) return -1;
2915
2916         /* Start dumping */
2917 #ifdef JP
2918         auto_dump_printf("\n# ¼«Æ°¥­¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2919 #else
2920         auto_dump_printf("\n# Automatic keymap dump\n\n");
2921 #endif
2922
2923         /* Dump them */
2924         for (i = 0; i < 256; i++)
2925         {
2926                 cptr act;
2927
2928                 /* Loop up the keymap */
2929                 act = keymap_act[mode][i];
2930
2931                 /* Skip empty keymaps */
2932                 if (!act) continue;
2933
2934                 /* Encode the key */
2935                 buf[0] = i;
2936                 buf[1] = '\0';
2937                 ascii_to_text(key, buf);
2938
2939                 /* Encode the action */
2940                 ascii_to_text(buf, act);
2941
2942                 /* Dump the macro */
2943                 auto_dump_printf("A:%s\n", buf);
2944                 auto_dump_printf("C:%d:%s\n", mode, key);
2945         }
2946
2947         /* Close */
2948         close_auto_dump();
2949
2950         /* Success */
2951         return (0);
2952 }
2953
2954
2955
2956 /*
2957  * Interact with "macros"
2958  *
2959  * Note that the macro "action" must be defined before the trigger.
2960  *
2961  * Could use some helpful instructions on this page.  XXX XXX XXX
2962  */
2963 void do_cmd_macros(void)
2964 {
2965         int i;
2966
2967         char tmp[1024];
2968
2969         char buf[1024];
2970
2971         int mode;
2972
2973
2974         /* Roguelike */
2975         if (rogue_like_commands)
2976         {
2977                 mode = KEYMAP_MODE_ROGUE;
2978         }
2979
2980         /* Original */
2981         else
2982         {
2983                 mode = KEYMAP_MODE_ORIG;
2984         }
2985
2986         /* File type is "TEXT" */
2987         FILE_TYPE(FILE_TYPE_TEXT);
2988
2989
2990         /* Save screen */
2991         screen_save();
2992
2993
2994         /* Process requests until done */
2995         while (1)
2996         {
2997                 /* Clear screen */
2998                 Term_clear();
2999
3000                 /* Describe */
3001 #ifdef JP
3002                 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
3003 #else
3004                 prt("Interact with Macros", 2, 0);
3005 #endif
3006
3007
3008
3009                 /* Describe that action */
3010 #ifdef JP
3011                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3012 #else
3013                 prt("Current action (if any) shown below:", 20, 0);
3014 #endif
3015
3016
3017                 /* Analyze the current action */
3018                 ascii_to_text(buf, macro__buf);
3019
3020                 /* Display the current action */
3021                 prt(buf, 22, 0);
3022
3023
3024                 /* Selections */
3025 #ifdef JP
3026                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3027 #else
3028                 prt("(1) Load a user pref file", 4, 5);
3029 #endif
3030
3031 #ifdef ALLOW_MACROS
3032 #ifdef JP
3033                 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
3034                 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
3035                 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
3036                 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
3037                 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥­¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
3038                 prt("(7) ¥­¡¼ÇÛÃ֤γÎǧ", 10, 5);
3039                 prt("(8) ¥­¡¼ÇÛÃ֤κîÀ®", 11, 5);
3040                 prt("(9) ¥­¡¼ÇÛÃ֤κï½ü", 12, 5);
3041                 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
3042 #else
3043                 prt("(2) Append macros to a file", 5, 5);
3044                 prt("(3) Query a macro", 6, 5);
3045                 prt("(4) Create a macro", 7, 5);
3046                 prt("(5) Remove a macro", 8, 5);
3047                 prt("(6) Append keymaps to a file", 9, 5);
3048                 prt("(7) Query a keymap", 10, 5);
3049                 prt("(8) Create a keymap", 11, 5);
3050                 prt("(9) Remove a keymap", 12, 5);
3051                 prt("(0) Enter a new action", 13, 5);
3052 #endif
3053
3054 #endif /* ALLOW_MACROS */
3055
3056                 /* Prompt */
3057 #ifdef JP
3058                 prt("¥³¥Þ¥ó¥É: ", 16, 0);
3059 #else
3060                 prt("Command: ", 16, 0);
3061 #endif
3062
3063
3064                 /* Get a command */
3065                 i = inkey();
3066
3067                 /* Leave */
3068                 if (i == ESCAPE) break;
3069
3070                 /* Load a 'macro' file */
3071                 else if (i == '1')
3072                 {
3073                         errr err;
3074
3075                         /* Prompt */
3076 #ifdef JP
3077                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
3078 #else
3079                         prt("Command: Load a user pref file", 16, 0);
3080 #endif
3081
3082
3083                         /* Prompt */
3084 #ifdef JP
3085                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3086 #else
3087                         prt("File: ", 18, 0);
3088 #endif
3089
3090
3091                         /* Default filename */
3092                         sprintf(tmp, "%s.prf", player_name);
3093
3094                         /* Ask for a file */
3095                         if (!askfor(tmp, 80)) continue;
3096
3097                         /* Process the given filename */
3098                         err = process_pref_file(tmp);
3099                         if (-2 == err)
3100                         {
3101 #ifdef JP
3102                                 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3103 #else
3104                                 msg_format("Loaded default '%s'.", tmp);
3105 #endif
3106                         }
3107                         else if (err)
3108                         {
3109                                 /* Prompt */
3110 #ifdef JP
3111                                 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
3112 #else
3113                                 msg_format("Failed to load '%s'!");
3114 #endif
3115                         }
3116                         else
3117                         {
3118 #ifdef JP
3119                                 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
3120 #else
3121                                 msg_format("Loaded '%s'.", tmp);
3122 #endif
3123                         }
3124                 }
3125
3126 #ifdef ALLOW_MACROS
3127
3128                 /* Save macros */
3129                 else if (i == '2')
3130                 {
3131                         /* Prompt */
3132 #ifdef JP
3133                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3134 #else
3135                         prt("Command: Append macros to a file", 16, 0);
3136 #endif
3137
3138
3139                         /* Prompt */
3140 #ifdef JP
3141                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3142 #else
3143                         prt("File: ", 18, 0);
3144 #endif
3145
3146
3147                         /* Default filename */
3148                         sprintf(tmp, "%s.prf", player_name);
3149
3150                         /* Ask for a file */
3151                         if (!askfor(tmp, 80)) continue;
3152
3153                         /* Dump the macros */
3154                         (void)macro_dump(tmp);
3155
3156                         /* Prompt */
3157 #ifdef JP
3158                         msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3159 #else
3160                         msg_print("Appended macros.");
3161 #endif
3162
3163                 }
3164
3165                 /* Query a macro */
3166                 else if (i == '3')
3167                 {
3168                         int k;
3169
3170                         /* Prompt */
3171 #ifdef JP
3172                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
3173 #else
3174                         prt("Command: Query a macro", 16, 0);
3175 #endif
3176
3177
3178                         /* Prompt */
3179 #ifdef JP
3180                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3181 #else
3182                         prt("Trigger: ", 18, 0);
3183 #endif
3184
3185
3186                         /* Get a macro trigger */
3187                         do_cmd_macro_aux(buf);
3188
3189                         /* Acquire action */
3190                         k = macro_find_exact(buf);
3191
3192                         /* Nothing found */
3193                         if (k < 0)
3194                         {
3195                                 /* Prompt */
3196 #ifdef JP
3197                                 msg_print("¤½¤Î¥­¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3198 #else
3199                                 msg_print("Found no macro.");
3200 #endif
3201
3202                         }
3203
3204                         /* Found one */
3205                         else
3206                         {
3207                                 /* Obtain the action */
3208                                 strcpy(macro__buf, macro__act[k]);
3209
3210                                 /* Analyze the current action */
3211                                 ascii_to_text(buf, macro__buf);
3212
3213                                 /* Display the current action */
3214                                 prt(buf, 22, 0);
3215
3216                                 /* Prompt */
3217 #ifdef JP
3218                                 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3219 #else
3220                                 msg_print("Found a macro.");
3221 #endif
3222
3223                         }
3224                 }
3225
3226                 /* Create a macro */
3227                 else if (i == '4')
3228                 {
3229                         /* Prompt */
3230 #ifdef JP
3231                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
3232 #else
3233                         prt("Command: Create a macro", 16, 0);
3234 #endif
3235
3236
3237                         /* Prompt */
3238 #ifdef JP
3239                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3240 #else
3241                         prt("Trigger: ", 18, 0);
3242 #endif
3243
3244
3245                         /* Get a macro trigger */
3246                         do_cmd_macro_aux(buf);
3247
3248                         /* Clear */
3249                         clear_from(20);
3250
3251                         /* Help message */
3252 #ifdef JP
3253                         c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
3254 #else
3255                         c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace or Delete to delete a char.", 22, 0);
3256 #endif
3257
3258                         /* Prompt */
3259 #ifdef JP
3260                         prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
3261 #else
3262                         prt("Action: ", 20, 0);
3263 #endif
3264
3265
3266                         /* Convert to text */
3267                         ascii_to_text(tmp, macro__buf);
3268
3269                         /* Get an encoded action */
3270                         if (askfor(tmp, 80))
3271                         {
3272                                 /* Convert to ascii */
3273                                 text_to_ascii(macro__buf, tmp);
3274
3275                                 /* Link the macro */
3276                                 macro_add(buf, macro__buf);
3277
3278                                 /* Prompt */
3279 #ifdef JP
3280                                 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3281 #else
3282                                 msg_print("Added a macro.");
3283 #endif
3284
3285                         }
3286                 }
3287
3288                 /* Remove a macro */
3289                 else if (i == '5')
3290                 {
3291                         /* Prompt */
3292 #ifdef JP
3293                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3294 #else
3295                         prt("Command: Remove a macro", 16, 0);
3296 #endif
3297
3298
3299                         /* Prompt */
3300 #ifdef JP
3301                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3302 #else
3303                         prt("Trigger: ", 18, 0);
3304 #endif
3305
3306
3307                         /* Get a macro trigger */
3308                         do_cmd_macro_aux(buf);
3309
3310                         /* Link the macro */
3311                         macro_add(buf, buf);
3312
3313                         /* Prompt */
3314 #ifdef JP
3315                         msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3316 #else
3317                         msg_print("Removed a macro.");
3318 #endif
3319
3320                 }
3321
3322                 /* Save keymaps */
3323                 else if (i == '6')
3324                 {
3325                         /* Prompt */
3326 #ifdef JP
3327                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3328 #else
3329                         prt("Command: Append keymaps to a file", 16, 0);
3330 #endif
3331
3332
3333                         /* Prompt */
3334 #ifdef JP
3335                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3336 #else
3337                         prt("File: ", 18, 0);
3338 #endif
3339
3340
3341                         /* Default filename */
3342                         sprintf(tmp, "%s.prf", player_name);
3343
3344                         /* Ask for a file */
3345                         if (!askfor(tmp, 80)) continue;
3346
3347                         /* Dump the macros */
3348                         (void)keymap_dump(tmp);
3349
3350                         /* Prompt */
3351 #ifdef JP
3352                         msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3353 #else
3354                         msg_print("Appended keymaps.");
3355 #endif
3356
3357                 }
3358
3359                 /* Query a keymap */
3360                 else if (i == '7')
3361                 {
3362                         cptr act;
3363
3364                         /* Prompt */
3365 #ifdef JP
3366                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤γÎǧ", 16, 0);
3367 #else
3368                         prt("Command: Query a keymap", 16, 0);
3369 #endif
3370
3371
3372                         /* Prompt */
3373 #ifdef JP
3374                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3375 #else
3376                         prt("Keypress: ", 18, 0);
3377 #endif
3378
3379
3380                         /* Get a keymap trigger */
3381                         do_cmd_macro_aux_keymap(buf);
3382
3383                         /* Look up the keymap */
3384                         act = keymap_act[mode][(byte)(buf[0])];
3385
3386                         /* Nothing found */
3387                         if (!act)
3388                         {
3389                                 /* Prompt */
3390 #ifdef JP
3391                                 msg_print("¥­¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3392 #else
3393                                 msg_print("Found no keymap.");
3394 #endif
3395
3396                         }
3397
3398                         /* Found one */
3399                         else
3400                         {
3401                                 /* Obtain the action */
3402                                 strcpy(macro__buf, act);
3403
3404                                 /* Analyze the current action */
3405                                 ascii_to_text(buf, macro__buf);
3406
3407                                 /* Display the current action */
3408                                 prt(buf, 22, 0);
3409
3410                                 /* Prompt */
3411 #ifdef JP
3412                                 msg_print("¥­¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3413 #else
3414                                 msg_print("Found a keymap.");
3415 #endif
3416
3417                         }
3418                 }
3419
3420                 /* Create a keymap */
3421                 else if (i == '8')
3422                 {
3423                         /* Prompt */
3424 #ifdef JP
3425                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κîÀ®", 16, 0);
3426 #else
3427                         prt("Command: Create a keymap", 16, 0);
3428 #endif
3429
3430
3431                         /* Prompt */
3432 #ifdef JP
3433                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3434 #else
3435                         prt("Keypress: ", 18, 0);
3436 #endif
3437
3438
3439                         /* Get a keymap trigger */
3440                         do_cmd_macro_aux_keymap(buf);
3441
3442                         /* Clear */
3443                         clear_from(20);
3444
3445                         /* Help message */
3446 #ifdef JP
3447                         c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
3448 #else
3449                         c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace or Delete to delete a char.", 22, 0);
3450 #endif
3451
3452                         /* Prompt */
3453 #ifdef JP
3454                         prt("¹ÔÆ°: ", 20, 0);
3455 #else
3456                         prt("Action: ", 20, 0);
3457 #endif
3458
3459
3460                         /* Convert to text */
3461                         ascii_to_text(tmp, macro__buf);
3462
3463                         /* Get an encoded action */
3464                         if (askfor(tmp, 80))
3465                         {
3466                                 /* Convert to ascii */
3467                                 text_to_ascii(macro__buf, tmp);
3468
3469                                 /* Free old keymap */
3470                                 string_free(keymap_act[mode][(byte)(buf[0])]);
3471
3472                                 /* Make new keymap */
3473                                 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3474
3475                                 /* Prompt */
3476 #ifdef JP
3477                                 msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3478 #else
3479                                 msg_print("Added a keymap.");
3480 #endif
3481
3482                         }
3483                 }
3484
3485                 /* Remove a keymap */
3486                 else if (i == '9')
3487                 {
3488                         /* Prompt */
3489 #ifdef JP
3490                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κï½ü", 16, 0);
3491 #else
3492                         prt("Command: Remove a keymap", 16, 0);
3493 #endif
3494
3495
3496                         /* Prompt */
3497 #ifdef JP
3498                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3499 #else
3500                         prt("Keypress: ", 18, 0);
3501 #endif
3502
3503
3504                         /* Get a keymap trigger */
3505                         do_cmd_macro_aux_keymap(buf);
3506
3507                         /* Free old keymap */
3508                         string_free(keymap_act[mode][(byte)(buf[0])]);
3509
3510                         /* Make new keymap */
3511                         keymap_act[mode][(byte)(buf[0])] = NULL;
3512
3513                         /* Prompt */
3514 #ifdef JP
3515                         msg_print("¥­¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3516 #else
3517                         msg_print("Removed a keymap.");
3518 #endif
3519
3520                 }
3521
3522                 /* Enter a new action */
3523                 else if (i == '0')
3524                 {
3525                         /* Prompt */
3526 #ifdef JP
3527                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3528 #else
3529                         prt("Command: Enter a new action", 16, 0);
3530 #endif
3531
3532
3533                         /* Go to the correct location */
3534                         Term_gotoxy(0, 22);
3535
3536                         /* Hack -- limit the value */
3537                         tmp[80] = '\0';
3538
3539                         /* Get an encoded action */
3540                         if (!askfor(buf, 80)) continue;
3541
3542                         /* Extract an action */
3543                         text_to_ascii(macro__buf, buf);
3544                 }
3545
3546 #endif /* ALLOW_MACROS */
3547
3548                 /* Oops */
3549                 else
3550                 {
3551                         /* Oops */
3552                         bell();
3553                 }
3554
3555                 /* Flush messages */
3556                 msg_print(NULL);
3557         }
3558
3559         /* Load screen */
3560         screen_load();
3561 }
3562
3563
3564 static cptr lighting_level_str[F_LIT_MAX] =
3565 {
3566 #ifdef JP
3567         "ɸ½à¿§",
3568         "ÌÀ¿§",
3569         "°Å¿§",
3570         "°Å°Å¿§",
3571 #else
3572         "standard",
3573         "brightly lit",
3574         "darkened",
3575         "darkly darkened",
3576 #endif
3577 };
3578
3579
3580 static void cmd_visuals_aux(int i, int *num, int max)
3581 {
3582         if (iscntrl(i))
3583         {
3584                 char str[10] = "";
3585                 int tmp;
3586
3587                 sprintf(str, "%d", *num);
3588
3589                 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3590                         return;
3591
3592                 tmp = strtol(str, NULL, 0);
3593                 if (tmp >= 0 && tmp < max)
3594                         *num = tmp;
3595                 return;
3596         }
3597         else if (isupper(i))
3598                 *num = (*num + max - 1) % max;
3599         else
3600                 *num = (*num + 1) % max;
3601
3602         return;
3603 }
3604
3605 /*
3606  * Interact with "visuals"
3607  */
3608 void do_cmd_visuals(void)
3609 {
3610         int i;
3611
3612         char tmp[160];
3613
3614         char buf[1024];
3615
3616         const char *empty_symbol = "<< ? >>";
3617
3618         if (use_bigtile) empty_symbol = "<< ?? >>";
3619
3620
3621         /* File type is "TEXT" */
3622         FILE_TYPE(FILE_TYPE_TEXT);
3623
3624
3625         /* Save the screen */
3626         screen_save();
3627
3628
3629         /* Interact until done */
3630         while (1)
3631         {
3632                 /* Clear screen */
3633                 Term_clear();
3634
3635                 /* Ask for a choice */
3636 #ifdef JP
3637                 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3638 #else
3639                 prt("Interact with Visuals", 2, 0);
3640 #endif
3641
3642
3643                 /* Give some choices */
3644 #ifdef JP
3645                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3646 #else
3647                 prt("(1) Load a user pref file", 4, 5);
3648 #endif
3649
3650 #ifdef ALLOW_VISUALS
3651 #ifdef JP
3652                 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
3653                 prt("(3) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 6, 5);
3654                 prt("(4) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 7, 5);
3655                 prt("(5) (̤»ÈÍÑ)", 8, 5);
3656                 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3657                 prt("(7) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3658                 prt("(8) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3659                 prt("(9) (̤»ÈÍÑ)", 12, 5);
3660 #else
3661                 prt("(2) Dump monster attr/chars", 5, 5);
3662                 prt("(3) Dump object attr/chars", 6, 5);
3663                 prt("(4) Dump feature attr/chars", 7, 5);
3664                 prt("(5) (unused)", 8, 5);
3665                 prt("(6) Change monster attr/chars", 9, 5);
3666                 prt("(7) Change object attr/chars", 10, 5);
3667                 prt("(8) Change feature attr/chars", 11, 5);
3668                 prt("(9) (unused)", 12, 5);
3669 #endif
3670
3671 #endif
3672 #ifdef JP
3673                 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3674 #else
3675                 prt("(0) Reset visuals", 13, 5);
3676 #endif
3677
3678
3679                 /* Prompt */
3680 #ifdef JP
3681                 prt("¥³¥Þ¥ó¥É:", 15, 0);
3682 #else
3683                 prt("Command: ", 15, 0);
3684 #endif
3685
3686
3687                 /* Prompt */
3688                 i = inkey();
3689
3690                 /* Done */
3691                 if (i == ESCAPE) break;
3692
3693                 /* Load a 'pref' file */
3694                 else if (i == '1')
3695                 {
3696                         /* Prompt */
3697 #ifdef JP
3698                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3699 #else
3700                         prt("Command: Load a user pref file", 15, 0);
3701 #endif
3702
3703
3704                         /* Prompt */
3705 #ifdef JP
3706                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3707 #else
3708                         prt("File: ", 17, 0);
3709 #endif
3710
3711
3712                         /* Default filename */
3713                         sprintf(tmp, "%s.prf", player_name);
3714
3715                         /* Query */
3716                         if (!askfor(tmp, 70)) continue;
3717
3718                         /* Process the given filename */
3719                         (void)process_pref_file(tmp);
3720                 }
3721
3722 #ifdef ALLOW_VISUALS
3723
3724                 /* Dump monster attr/chars */
3725                 else if (i == '2')
3726                 {
3727                         static cptr mark = "Monster attr/chars";
3728
3729                         /* Prompt */
3730 #ifdef JP
3731                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3732 #else
3733                         prt("Command: Dump monster attr/chars", 15, 0);
3734 #endif
3735
3736
3737                         /* Prompt */
3738 #ifdef JP
3739                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3740 #else
3741                         prt("File: ", 17, 0);
3742 #endif
3743
3744
3745                         /* Default filename */
3746                         sprintf(tmp, "%s.prf", player_name);
3747                         
3748                         /* Get a filename */
3749                         if (!askfor(tmp, 70)) continue;
3750
3751                         /* Build the filename */
3752                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3753
3754                         /* Append to the file */
3755                         if (!open_auto_dump(buf, mark)) continue;
3756
3757                         /* Start dumping */
3758 #ifdef JP
3759                         auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3760 #else
3761                         auto_dump_printf("\n# Monster attr/char definitions\n\n");
3762 #endif
3763
3764                         /* Dump monsters */
3765                         for (i = 1; i < max_r_idx; i++)
3766                         {
3767                                 monster_race *r_ptr = &r_info[i];
3768
3769                                 /* Skip non-entries */
3770                                 if (!r_ptr->name) continue;
3771
3772                                 /* Dump a comment */
3773                                 auto_dump_printf("# %s\n", (r_name + r_ptr->name));
3774
3775                                 /* Dump the monster attr/char info */
3776                                 auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i,
3777                                         (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3778                         }
3779
3780                         /* Close */
3781                         close_auto_dump();
3782
3783                         /* Message */
3784 #ifdef JP
3785                         msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3786 #else
3787                         msg_print("Dumped monster attr/chars.");
3788 #endif
3789
3790                 }
3791
3792                 /* Dump object attr/chars */
3793                 else if (i == '3')
3794                 {
3795                         static cptr mark = "Object attr/chars";
3796
3797                         /* Prompt */
3798 #ifdef JP
3799                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3800 #else
3801                         prt("Command: Dump object attr/chars", 15, 0);
3802 #endif
3803
3804
3805                         /* Prompt */
3806 #ifdef JP
3807                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3808 #else
3809                         prt("File: ", 17, 0);
3810 #endif
3811
3812
3813                         /* Default filename */
3814                         sprintf(tmp, "%s.prf", player_name);
3815
3816                         /* Get a filename */
3817                         if (!askfor(tmp, 70)) continue;
3818
3819                         /* Build the filename */
3820                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3821
3822                         /* Append to the file */
3823                         if (!open_auto_dump(buf, mark)) continue;
3824
3825                         /* Start dumping */
3826 #ifdef JP
3827                         auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3828 #else
3829                         auto_dump_printf("\n# Object attr/char definitions\n\n");
3830 #endif
3831
3832                         /* Dump objects */
3833                         for (i = 1; i < max_k_idx; i++)
3834                         {
3835                                 char o_name[80];
3836                                 object_kind *k_ptr = &k_info[i];
3837
3838                                 /* Skip non-entries */
3839                                 if (!k_ptr->name) continue;
3840
3841                                 /* Skip entries with flavor */
3842                                 if (k_ptr->flavor) continue;
3843
3844                                 /* Tidy name */
3845                                 strip_name(o_name, i);
3846
3847                                 /* Dump a comment */
3848                                 auto_dump_printf("# %s\n", o_name);
3849
3850                                 /* Dump the object attr/char info */
3851                                 auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i,
3852                                         (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3853                         }
3854
3855                         /* Close */
3856                         close_auto_dump();
3857
3858                         /* Message */
3859 #ifdef JP
3860                         msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3861 #else
3862                         msg_print("Dumped object attr/chars.");
3863 #endif
3864
3865                 }
3866
3867                 /* Dump feature attr/chars */
3868                 else if (i == '4')
3869                 {
3870                         static cptr mark = "Feature attr/chars";
3871
3872                         /* Prompt */
3873 #ifdef JP
3874                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3875 #else
3876                         prt("Command: Dump feature attr/chars", 15, 0);
3877 #endif
3878
3879
3880                         /* Prompt */
3881 #ifdef JP
3882                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3883 #else
3884                         prt("File: ", 17, 0);
3885 #endif
3886
3887
3888                         /* Default filename */
3889                         sprintf(tmp, "%s.prf", player_name);
3890
3891                         /* Get a filename */
3892                         if (!askfor(tmp, 70)) continue;
3893
3894                         /* Build the filename */
3895                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
3896
3897                         /* Append to the file */
3898                         if (!open_auto_dump(buf, mark)) continue;
3899
3900                         /* Start dumping */
3901 #ifdef JP
3902                         auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3903 #else
3904                         auto_dump_printf("\n# Feature attr/char definitions\n\n");
3905 #endif
3906
3907                         /* Dump features */
3908                         for (i = 1; i < max_f_idx; i++)
3909                         {
3910                                 feature_type *f_ptr = &f_info[i];
3911
3912                                 /* Skip non-entries */
3913                                 if (!f_ptr->name) continue;
3914
3915                                 /* Skip mimiccing features */
3916                                 if (f_ptr->mimic != i) continue;
3917
3918                                 /* Dump a comment */
3919                                 auto_dump_printf("# %s\n", (f_name + f_ptr->name));
3920
3921                                 /* Dump the feature attr/char info */
3922                                 auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
3923                                         (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
3924                                         (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
3925                                         (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]),
3926                                         (byte)(f_ptr->x_attr[F_LIT_DARKDARK]), (byte)(f_ptr->x_char[F_LIT_DARKDARK]));
3927                         }
3928
3929                         /* Close */
3930                         close_auto_dump();
3931
3932                         /* Message */
3933 #ifdef JP
3934                         msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3935 #else
3936                         msg_print("Dumped feature attr/chars.");
3937 #endif
3938
3939                 }
3940
3941                 /* Modify monster attr/chars */
3942                 else if (i == '6')
3943                 {
3944                         static int r = 0;
3945
3946                         /* Prompt */
3947 #ifdef JP
3948                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3949 #else
3950                         prt("Command: Change monster attr/chars", 15, 0);
3951 #endif
3952
3953
3954                         /* Hack -- query until done */
3955                         while (1)
3956                         {
3957                                 monster_race *r_ptr = &r_info[r];
3958                                 char c;
3959                                 int t;
3960
3961                                 byte da = (r_ptr->d_attr);
3962                                 byte dc = (r_ptr->d_char);
3963                                 byte ca = (r_ptr->x_attr);
3964                                 byte cc = (r_ptr->x_char);
3965
3966                                 /* Label the object */
3967 #ifdef JP
3968                                 Term_putstr(5, 17, -1, TERM_WHITE,
3969                                             format("¥â¥ó¥¹¥¿¡¼ = %d, Ì¾Á° = %-40.40s",
3970                                                    r, (r_name + r_ptr->name)));
3971 #else
3972                                 Term_putstr(5, 17, -1, TERM_WHITE,
3973                                             format("Monster = %d, Name = %-40.40s",
3974                                                    r, (r_name + r_ptr->name)));
3975 #endif
3976
3977
3978                                 /* Label the Default values */
3979 #ifdef JP
3980                                 Term_putstr(10, 19, -1, TERM_WHITE,
3981                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3u / %3u", da, dc));
3982 #else
3983                                 Term_putstr(10, 19, -1, TERM_WHITE,
3984                                             format("Default attr/char = %3u / %3u", da, dc));
3985 #endif
3986
3987                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
3988                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
3989
3990                                 /* Label the Current values */
3991 #ifdef JP
3992                                 Term_putstr(10, 20, -1, TERM_WHITE,
3993                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3u / %3u", ca, cc));
3994 #else
3995                                 Term_putstr(10, 20, -1, TERM_WHITE,
3996                                             format("Current attr/char = %3u / %3u", ca, cc));
3997 #endif
3998
3999                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4000                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4001
4002                                 /* Prompt */
4003 #ifdef JP
4004                                 Term_putstr(0, 22, -1, TERM_WHITE,
4005                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4006 #else
4007                                 Term_putstr(0, 22, -1, TERM_WHITE,
4008                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
4009 #endif
4010
4011                                 /* Get a command */
4012                                 i = inkey();
4013
4014                                 /* All done */
4015                                 if (i == ESCAPE) break;
4016
4017                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4018                                 else if (isupper(i)) c = 'a' + i - 'A';
4019                                 else c = i;
4020
4021                                 switch (c)
4022                                 {
4023                                 case 'n':
4024                                         cmd_visuals_aux(i, &r, max_r_idx);
4025                                         break;
4026                                 case 'a':
4027                                         t = (int)r_ptr->x_attr;
4028                                         cmd_visuals_aux(i, &t, 256);
4029                                         r_ptr->x_attr = (byte)t;
4030                                         break;
4031                                 case 'c':
4032                                         t = (int)r_ptr->x_char;
4033                                         cmd_visuals_aux(i, &t, 256);
4034                                         r_ptr->x_char = (byte)t;
4035                                         break;
4036                                 }
4037                         }
4038                 }
4039
4040                 /* Modify object attr/chars */
4041                 else if (i == '7')
4042                 {
4043                         static int k = 0;
4044
4045                         /* Prompt */
4046 #ifdef JP
4047                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4048 #else
4049                         prt("Command: Change object attr/chars", 15, 0);
4050 #endif
4051
4052
4053                         /* Hack -- query until done */
4054                         while (1)
4055                         {
4056                                 object_kind *k_ptr = &k_info[k];
4057                                 char c;
4058                                 int t;
4059
4060                                 byte da = (byte)k_ptr->d_attr;
4061                                 byte dc = (byte)k_ptr->d_char;
4062                                 byte ca = (byte)k_ptr->x_attr;
4063                                 byte cc = (byte)k_ptr->x_char;
4064
4065                                 /* Label the object */
4066 #ifdef JP
4067                                 Term_putstr(5, 17, -1, TERM_WHITE,
4068                                             format("¥¢¥¤¥Æ¥à = %d, Ì¾Á° = %-40.40s",
4069                                                    k, (k_name + k_ptr->name)));
4070 #else
4071                                 Term_putstr(5, 17, -1, TERM_WHITE,
4072                                             format("Object = %d, Name = %-40.40s",
4073                                                    k, (k_name + k_ptr->name)));
4074 #endif
4075
4076
4077                                 /* Label the Default values */
4078 #ifdef JP
4079                                 Term_putstr(10, 19, -1, TERM_WHITE,
4080                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
4081 #else
4082                                 Term_putstr(10, 19, -1, TERM_WHITE,
4083                                             format("Default attr/char = %3d / %3d", da, dc));
4084 #endif
4085
4086                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4087                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4088
4089                                 /* Label the Current values */
4090 #ifdef JP
4091                                 Term_putstr(10, 20, -1, TERM_WHITE,
4092                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
4093 #else
4094                                 Term_putstr(10, 20, -1, TERM_WHITE,
4095                                             format("Current attr/char = %3d / %3d", ca, cc));
4096 #endif
4097
4098                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4099                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4100
4101                                 /* Prompt */
4102 #ifdef JP
4103                                 Term_putstr(0, 22, -1, TERM_WHITE,
4104                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
4105 #else
4106                                 Term_putstr(0, 22, -1, TERM_WHITE,
4107                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
4108 #endif
4109
4110                                 /* Get a command */
4111                                 i = inkey();
4112
4113                                 /* All done */
4114                                 if (i == ESCAPE) break;
4115
4116                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4117                                 else if (isupper(i)) c = 'a' + i - 'A';
4118                                 else c = i;
4119
4120                                 switch (c)
4121                                 {
4122                                 case 'n':
4123                                         cmd_visuals_aux(i, &k, max_k_idx);
4124                                         break;
4125                                 case 'a':
4126                                         t = (int)k_info[k].x_attr;
4127                                         cmd_visuals_aux(i, &t, 256);
4128                                         k_info[k].x_attr = (byte)t;
4129                                         break;
4130                                 case 'c':
4131                                         t = (int)k_info[k].x_char;
4132                                         cmd_visuals_aux(i, &t, 256);
4133                                         k_info[k].x_char = (byte)t;
4134                                         break;
4135                                 }
4136                         }
4137                 }
4138
4139                 /* Modify feature attr/chars */
4140                 else if (i == '8')
4141                 {
4142                         static int f = 0;
4143                         static int lighting_level = F_LIT_STANDARD;
4144
4145                         /* Prompt */
4146 #ifdef JP
4147                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
4148 #else
4149                         prt("Command: Change feature attr/chars", 15, 0);
4150 #endif
4151
4152
4153                         /* Hack -- query until done */
4154                         while (1)
4155                         {
4156                                 feature_type *f_ptr = &f_info[f];
4157                                 char c;
4158                                 int t;
4159
4160                                 byte da = (byte)f_ptr->d_attr[lighting_level];
4161                                 byte dc = (byte)f_ptr->d_char[lighting_level];
4162                                 byte ca = (byte)f_ptr->x_attr[lighting_level];
4163                                 byte cc = (byte)f_ptr->x_char[lighting_level];
4164
4165                                 /* Label the object */
4166                                 prt("", 17, 5);
4167 #ifdef JP
4168                                 Term_putstr(5, 17, -1, TERM_WHITE,
4169                                             format("ÃÏ·Á = %d, Ì¾Á° = %s, ÌÀÅÙ = %s",
4170                                                    f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
4171 #else
4172                                 Term_putstr(5, 17, -1, TERM_WHITE,
4173                                             format("Terrain = %d, Name = %s, Lighting = %s",
4174                                                    f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
4175 #endif
4176
4177
4178                                 /* Label the Default values */
4179 #ifdef JP
4180                                 Term_putstr(10, 19, -1, TERM_WHITE,
4181                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
4182 #else
4183                                 Term_putstr(10, 19, -1, TERM_WHITE,
4184                                             format("Default attr/char = %3d / %3d", da, dc));
4185 #endif
4186
4187                                 Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
4188
4189                                 Term_queue_bigchar(43, 19, da, dc, 0, 0);
4190
4191
4192                                 /* Label the Current values */
4193 #ifdef JP
4194                                 Term_putstr(10, 20, -1, TERM_WHITE,
4195                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
4196 #else
4197                                 Term_putstr(10, 20, -1, TERM_WHITE,
4198                                             format("Current attr/char = %3d / %3d", ca, cc));
4199 #endif
4200
4201                                 Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
4202                                 Term_queue_bigchar(43, 20, ca, cc, 0, 0);
4203
4204                                 /* Prompt */
4205 #ifdef JP
4206                                 Term_putstr(0, 22, -1, TERM_WHITE,
4207                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C/l/L/^L): ");
4208 #else
4209                                 Term_putstr(0, 22, -1, TERM_WHITE,
4210                                             "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L): ");
4211 #endif
4212
4213                                 /* Get a command */
4214                                 i = inkey();
4215
4216                                 /* All done */
4217                                 if (i == ESCAPE) break;
4218
4219                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
4220                                 else if (isupper(i)) c = 'a' + i - 'A';
4221                                 else c = i;
4222
4223                                 switch (c)
4224                                 {
4225                                 case 'n':
4226                                         cmd_visuals_aux(i, &f, max_f_idx);
4227                                         break;
4228                                 case 'a':
4229                                         t = (int)f_info[f].x_attr[lighting_level];
4230                                         cmd_visuals_aux(i, &t, 256);
4231                                         f_info[f].x_attr[lighting_level] = (byte)t;
4232                                         break;
4233                                 case 'c':
4234                                         t = (int)f_info[f].x_char[lighting_level];
4235                                         cmd_visuals_aux(i, &t, 256);
4236                                         f_info[f].x_char[lighting_level] = (byte)t;
4237                                         break;
4238                                 case 'l':
4239                                         cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
4240                                         break;
4241                                 }
4242                         }
4243                 }
4244
4245 #endif
4246
4247                 /* Reset visuals */
4248                 else if (i == '0')
4249                 {
4250                         /* Reset */
4251                         reset_visuals();
4252
4253                         /* Message */
4254 #ifdef JP
4255                         msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4256 #else
4257                         msg_print("Visual attr/char tables reset.");
4258 #endif
4259
4260                 }
4261
4262                 /* Unknown option */
4263                 else
4264                 {
4265                         bell();
4266                 }
4267
4268                 /* Flush messages */
4269                 msg_print(NULL);
4270         }
4271
4272
4273         /* Restore the screen */
4274         screen_load();
4275 }
4276
4277
4278 /*
4279  * Interact with "colors"
4280  */
4281 void do_cmd_colors(void)
4282 {
4283         int i;
4284
4285         char tmp[160];
4286
4287         char buf[1024];
4288
4289
4290         /* File type is "TEXT" */
4291         FILE_TYPE(FILE_TYPE_TEXT);
4292
4293
4294         /* Save the screen */
4295         screen_save();
4296
4297
4298         /* Interact until done */
4299         while (1)
4300         {
4301                 /* Clear screen */
4302                 Term_clear();
4303
4304                 /* Ask for a choice */
4305 #ifdef JP
4306                 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4307 #else
4308                 prt("Interact with Colors", 2, 0);
4309 #endif
4310
4311
4312                 /* Give some choices */
4313 #ifdef JP
4314                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4315 #else
4316                 prt("(1) Load a user pref file", 4, 5);
4317 #endif
4318
4319 #ifdef ALLOW_COLORS
4320 #ifdef JP
4321                 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
4322                 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4323 #else
4324                 prt("(2) Dump colors", 5, 5);
4325                 prt("(3) Modify colors", 6, 5);
4326 #endif
4327
4328 #endif
4329
4330                 /* Prompt */
4331 #ifdef JP
4332                 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4333 #else
4334                 prt("Command: ", 8, 0);
4335 #endif
4336
4337
4338                 /* Prompt */
4339                 i = inkey();
4340
4341                 /* Done */
4342                 if (i == ESCAPE) break;
4343
4344                 /* Load a 'pref' file */
4345                 if (i == '1')
4346                 {
4347                         /* Prompt */
4348 #ifdef JP
4349                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4350 #else
4351                         prt("Command: Load a user pref file", 8, 0);
4352 #endif
4353
4354
4355                         /* Prompt */
4356 #ifdef JP
4357                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4358 #else
4359                         prt("File: ", 10, 0);
4360 #endif
4361
4362
4363                         /* Default file */
4364                         sprintf(tmp, "%s.prf", player_name);
4365
4366                         /* Query */
4367                         if (!askfor(tmp, 70)) continue;
4368
4369                         /* Process the given filename */
4370                         (void)process_pref_file(tmp);
4371
4372                         /* Mega-Hack -- react to changes */
4373                         Term_xtra(TERM_XTRA_REACT, 0);
4374
4375                         /* Mega-Hack -- redraw */
4376                         Term_redraw();
4377                 }
4378
4379 #ifdef ALLOW_COLORS
4380
4381                 /* Dump colors */
4382                 else if (i == '2')
4383                 {
4384                         static cptr mark = "Colors";
4385
4386                         /* Prompt */
4387 #ifdef JP
4388                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 8, 0);
4389 #else
4390                         prt("Command: Dump colors", 8, 0);
4391 #endif
4392
4393
4394                         /* Prompt */
4395 #ifdef JP
4396                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4397 #else
4398                         prt("File: ", 10, 0);
4399 #endif
4400
4401
4402                         /* Default filename */
4403                         sprintf(tmp, "%s.prf", player_name);
4404
4405                         /* Get a filename */
4406                         if (!askfor(tmp, 70)) continue;
4407
4408                         /* Build the filename */
4409                         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
4410
4411                         /* Append to the file */
4412                         if (!open_auto_dump(buf, mark)) continue;
4413
4414                         /* Start dumping */
4415 #ifdef JP
4416                         auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4417 #else
4418                         auto_dump_printf("\n# Color redefinitions\n\n");
4419 #endif
4420
4421                         /* Dump colors */
4422                         for (i = 0; i < 256; i++)
4423                         {
4424                                 int kv = angband_color_table[i][0];
4425                                 int rv = angband_color_table[i][1];
4426                                 int gv = angband_color_table[i][2];
4427                                 int bv = angband_color_table[i][3];
4428
4429 #ifdef JP
4430                                 cptr name = "̤ÃÎ";
4431 #else
4432                                 cptr name = "unknown";
4433 #endif
4434
4435
4436                                 /* Skip non-entries */
4437                                 if (!kv && !rv && !gv && !bv) continue;
4438
4439                                 /* Extract the color name */
4440                                 if (i < 16) name = color_names[i];
4441
4442                                 /* Dump a comment */
4443 #ifdef JP
4444                                 auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name);
4445 #else
4446                                 auto_dump_printf("# Color '%s'\n", name);
4447 #endif
4448
4449                                 /* Dump the monster attr/char info */
4450                                 auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4451                                         i, kv, rv, gv, bv);
4452                         }
4453
4454                         /* Close */
4455                         close_auto_dump();
4456
4457                         /* Message */
4458 #ifdef JP
4459                         msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
4460 #else
4461                         msg_print("Dumped color redefinitions.");
4462 #endif
4463
4464                 }
4465
4466                 /* Edit colors */
4467                 else if (i == '3')
4468                 {
4469                         static byte a = 0;
4470
4471                         /* Prompt */
4472 #ifdef JP
4473                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4474 #else
4475                         prt("Command: Modify colors", 8, 0);
4476 #endif
4477
4478
4479                         /* Hack -- query until done */
4480                         while (1)
4481                         {
4482                                 cptr name;
4483                                 byte j;
4484
4485                                 /* Clear */
4486                                 clear_from(10);
4487
4488                                 /* Exhibit the normal colors */
4489                                 for (j = 0; j < 16; j++)
4490                                 {
4491                                         /* Exhibit this color */
4492                                         Term_putstr(j*4, 20, -1, a, "###");
4493
4494                                         /* Exhibit all colors */
4495                                         Term_putstr(j*4, 22, -1, j, format("%3d", j));
4496                                 }
4497
4498                                 /* Describe the color */
4499 #ifdef JP
4500                                 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4501 #else
4502                                 name = ((a < 16) ? color_names[a] : "undefined");
4503 #endif
4504
4505
4506                                 /* Describe the color */
4507 #ifdef JP
4508                                 Term_putstr(5, 10, -1, TERM_WHITE,
4509                                             format("¥«¥é¡¼ = %d, Ì¾Á° = %s", a, name));
4510 #else
4511                                 Term_putstr(5, 10, -1, TERM_WHITE,
4512                                             format("Color = %d, Name = %s", a, name));
4513 #endif
4514
4515
4516                                 /* Label the Current values */
4517                                 Term_putstr(5, 12, -1, TERM_WHITE,
4518                                             format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4519                                                    angband_color_table[a][0],
4520                                                    angband_color_table[a][1],
4521                                                    angband_color_table[a][2],
4522                                                    angband_color_table[a][3]));
4523
4524                                 /* Prompt */
4525 #ifdef JP
4526                                 Term_putstr(0, 14, -1, TERM_WHITE,
4527                                             "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4528 #else
4529                                 Term_putstr(0, 14, -1, TERM_WHITE,
4530                                             "Command (n/N/k/K/r/R/g/G/b/B): ");
4531 #endif
4532
4533
4534                                 /* Get a command */
4535                                 i = inkey();
4536
4537                                 /* All done */
4538                                 if (i == ESCAPE) break;
4539
4540                                 /* Analyze */
4541                                 if (i == 'n') a = (byte)(a + 1);
4542                                 if (i == 'N') a = (byte)(a - 1);
4543                                 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4544                                 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4545                                 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4546                                 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4547                                 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4548                                 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4549                                 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4550                                 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4551
4552                                 /* Hack -- react to changes */
4553                                 Term_xtra(TERM_XTRA_REACT, 0);
4554
4555                                 /* Hack -- redraw */
4556                                 Term_redraw();
4557                         }
4558                 }
4559
4560 #endif
4561
4562                 /* Unknown option */
4563                 else
4564                 {
4565                         bell();
4566                 }
4567
4568                 /* Flush messages */
4569                 msg_print(NULL);
4570         }
4571
4572
4573         /* Restore the screen */
4574         screen_load();
4575 }
4576
4577
4578 /*
4579  * Note something in the message recall
4580  */
4581 void do_cmd_note(void)
4582 {
4583         char buf[80];
4584
4585         /* Default */
4586         strcpy(buf, "");
4587
4588         /* Input */
4589 #ifdef JP
4590         if (!get_string("¥á¥â: ", buf, 60)) return;
4591 #else
4592         if (!get_string("Note: ", buf, 60)) return;
4593 #endif
4594
4595
4596         /* Ignore empty notes */
4597         if (!buf[0] || (buf[0] == ' ')) return;
4598
4599         /* Add the note to the message recall */
4600 #ifdef JP
4601         msg_format("¥á¥â: %s", buf);
4602 #else
4603         msg_format("Note: %s", buf);
4604 #endif
4605
4606 }
4607
4608
4609 /*
4610  * Mention the current version
4611  */
4612 void do_cmd_version(void)
4613 {
4614
4615         /* Silly message */
4616 #ifdef JP
4617         msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4618                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4619 #else
4620         msg_format("You are playing Hengband %d.%d.%d.",
4621                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4622 #endif
4623 }
4624
4625
4626
4627 /*
4628  * Array of feeling strings
4629  */
4630 static cptr do_cmd_feeling_text[11] =
4631 {
4632 #ifdef JP
4633         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4634 #else
4635         "Looks like any other level.",
4636 #endif
4637
4638 #ifdef JP
4639         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4640 #else
4641         "You feel there is something special about this level.",
4642 #endif
4643
4644 #ifdef JP
4645         "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4646 #else
4647         "You nearly faint as horrible visions of death fill your mind!",
4648 #endif
4649
4650 #ifdef JP
4651         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4652 #else
4653         "This level looks very dangerous.",
4654 #endif
4655
4656 #ifdef JP
4657         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4658 #else
4659         "You have a very bad feeling...",
4660 #endif
4661
4662 #ifdef JP
4663         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4664 #else
4665         "You have a bad feeling...",
4666 #endif
4667
4668 #ifdef JP
4669         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4670 #else
4671         "You feel nervous.",
4672 #endif
4673
4674 #ifdef JP
4675         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4676 #else
4677         "You feel your luck is turning...",
4678 #endif
4679
4680 #ifdef JP
4681         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4682 #else
4683         "You don't like the look of this place.",
4684 #endif
4685
4686 #ifdef JP
4687         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4688 #else
4689         "This level looks reasonably safe.",
4690 #endif
4691
4692 #ifdef JP
4693         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4694 #else
4695         "What a boring place..."
4696 #endif
4697
4698 };
4699
4700 static cptr do_cmd_feeling_text_combat[11] =
4701 {
4702 #ifdef JP
4703         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4704 #else
4705         "Looks like any other level.",
4706 #endif
4707
4708 #ifdef JP
4709         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4710 #else
4711         "You feel there is something special about this level.",
4712 #endif
4713
4714 #ifdef JP
4715         "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4716 #else
4717         "You nearly faint as horrible visions of death fill your mind!",
4718 #endif
4719
4720 #ifdef JP
4721         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4722 #else
4723         "This level looks very dangerous.",
4724 #endif
4725
4726 #ifdef JP
4727         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4728 #else
4729         "You have a very bad feeling...",
4730 #endif
4731
4732 #ifdef JP
4733         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4734 #else
4735         "You have a bad feeling...",
4736 #endif
4737
4738 #ifdef JP
4739         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4740 #else
4741         "You feel nervous.",
4742 #endif
4743
4744 #ifdef JP
4745         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4746 #else
4747         "You feel your luck is turning...",
4748 #endif
4749
4750 #ifdef JP
4751         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4752 #else
4753         "You don't like the look of this place.",
4754 #endif
4755
4756 #ifdef JP
4757         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4758 #else
4759         "This level looks reasonably safe.",
4760 #endif
4761
4762 #ifdef JP
4763         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4764 #else
4765         "What a boring place..."
4766 #endif
4767
4768 };
4769
4770 static cptr do_cmd_feeling_text_lucky[11] =
4771 {
4772 #ifdef JP
4773         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4774         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4775         "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4776         "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4777         "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4778         "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4779         "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4780         "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤­¤¿¤«...",
4781         "¸«¤¿´¶¤¸°­¤¯¤Ï¤Ê¤¤...",
4782         "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4783         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4784 #else
4785         "Looks like any other level.",
4786         "You feel there is something special about this level.",
4787         "You have a superb feeling about this level.",
4788         "You have an excellent feeling...",
4789         "You have a very good feeling...",
4790         "You have a good feeling...",
4791         "You feel strangely lucky...",
4792         "You feel your luck is turning...",
4793         "You like the look of this place...",
4794         "This level can't be all bad...",
4795         "What a boring place..."
4796 #endif
4797 };
4798
4799
4800 /*
4801  * Note that "feeling" is set to zero unless some time has passed.
4802  * Note that this is done when the level is GENERATED, not entered.
4803  */
4804 void do_cmd_feeling(void)
4805 {
4806         /* Verify the feeling */
4807         if (feeling > 10) feeling = 10;
4808
4809         /* No useful feeling in quests */
4810         if (p_ptr->inside_quest && !random_quest_number(dun_level))
4811         {
4812 #ifdef JP
4813                 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4814 #else
4815                 msg_print("Looks like a typical quest level.");
4816 #endif
4817
4818                 return;
4819         }
4820
4821         /* No useful feeling in town */
4822         else if (p_ptr->town_num && !dun_level)
4823         {
4824 #ifdef JP
4825                 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4826 #else
4827                 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4828 #endif
4829                 {
4830 #ifdef JP
4831                         msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4832 #else
4833                         msg_print("Looks like a strange wilderness.");
4834 #endif
4835
4836                         return;
4837                 }
4838                 else
4839                 {
4840 #ifdef JP
4841                         msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4842 #else
4843                         msg_print("Looks like a typical town.");
4844 #endif
4845
4846                         return;
4847                 }
4848         }
4849
4850         /* No useful feeling in the wilderness */
4851         else if (!dun_level)
4852         {
4853 #ifdef JP
4854                 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4855 #else
4856                 msg_print("Looks like a typical wilderness.");
4857 #endif
4858
4859                 return;
4860         }
4861
4862         /* Display the feeling */
4863         if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4864         {
4865                 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4866                 else {
4867                                         if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4868                                                 msg_print(do_cmd_feeling_text_combat[feeling]);
4869                                         }else
4870                                                 msg_print(do_cmd_feeling_text[feeling]);
4871                                 }
4872         }
4873         else
4874         {
4875                 msg_print(do_cmd_feeling_text[0]);
4876         }
4877 }
4878
4879
4880
4881 /*
4882  * Description of each monster group.
4883  */
4884 static cptr monster_group_text[] = 
4885 {
4886 #ifdef JP
4887         "¥æ¥Ë¡¼¥¯",     /* "Uniques" */
4888         "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
4889         "¥¢¥ê",
4890         "¥³¥¦¥â¥ê",
4891         "¥à¥«¥Ç",
4892         "¥É¥é¥´¥ó",
4893         "ÌܶÌ",
4894         "¥Í¥³",
4895         "¥´¡¼¥ì¥à",
4896         "ɸ½à¿Í´Ö·¿À¸Êª",
4897         "¥Ù¥È¥Ù¥È",
4898         "¥¼¥ê¡¼",
4899         "¥³¥Ü¥ë¥É",
4900         "¿åÀ³À¸Êª",
4901         "¥â¥ë¥É",
4902         "¥Ê¡¼¥¬",
4903         "¥ª¡¼¥¯",
4904         "¿Í´Ö",
4905         "»Í­½Ã",
4906         "¥Í¥º¥ß",
4907         "¥¹¥±¥ë¥È¥ó",
4908         "¥Ç¡¼¥â¥ó",
4909         "¥Ü¥ë¥Æ¥Ã¥¯¥¹",
4910         "¥¤¥â¥à¥·/Âç·²",
4911         /* "unused", */
4912         "¥¤¡¼¥¯",
4913         "¥¾¥ó¥Ó/¥ß¥¤¥é",
4914         "Å·»È",
4915         "Ļ",
4916         "¸¤",
4917         /* "¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à", */
4918         "¥¨¥ì¥á¥ó¥¿¥ë",
4919         "¥È¥ó¥Ü",
4920         "¥´¡¼¥¹¥È",
4921         "»¨¼ï",
4922         "º«Ãî",
4923         "¥Ø¥Ó",
4924         "¥­¥é¡¼¡¦¥Ó¡¼¥È¥ë",
4925         "¥ê¥Ã¥Á",
4926         "¿¼ó¤Îà¨ÃîÎà",
4927         "Ææ¤ÎÀ¸Êª",
4928         "¥ª¡¼¥¬",
4929         "µðÂç¿Í´Ö·¿À¸Êª",
4930         "¥¯¥¤¥ë¥¹¥ë¥°",
4931         "à¨ÃîÎà/ξÀ¸Îà",
4932         "ÃØéá/¥µ¥½¥ê/¥À¥Ë",
4933         "¥È¥í¥ë",
4934         /* "¾åµé¥Ç¡¼¥â¥ó", */
4935         "¥Ð¥ó¥Ñ¥¤¥¢",
4936         "¥ï¥¤¥È/¥ì¥¤¥¹/Åù",
4937         "¥¾¡¼¥ó/¥¶¥ì¥ó/Åù",
4938         "¥¤¥¨¥Æ¥£",
4939         "¥Ï¥¦¥ó¥É",
4940         "¥ß¥ß¥Ã¥¯",
4941         "ÊÉ/¿¢Êª/µ¤ÂÎ",
4942         "¤ª¤Ð¤±¥­¥Î¥³",
4943         "µåÂÎ",
4944 #else
4945         "Uniques",
4946         "Ridable monsters",
4947         "Ant",
4948         "Bat",
4949         "Centipede",
4950         "Dragon",
4951         "Floating Eye",
4952         "Feline",
4953         "Golem",
4954         "Hobbit/Elf/Dwarf",
4955         "Icky Thing",
4956         "Jelly",
4957         "Kobold",
4958         "Aquatic monster",
4959         "Mold",
4960         "Naga",
4961         "Orc",
4962         "Person/Human",
4963         "Quadruped",
4964         "Rodent",
4965         "Skeleton",
4966         "Demon",
4967         "Vortex",
4968         "Worm/Worm-Mass",
4969         /* "unused", */
4970         "Yeek",
4971         "Zombie/Mummy",
4972         "Angel",
4973         "Bird",
4974         "Canine",
4975         /* "Ancient Dragon/Wyrm", */
4976         "Elemental",
4977         "Dragon Fly",
4978         "Ghost",
4979         "Hybrid",
4980         "Insect",
4981         "Snake",
4982         "Killer Beetle",
4983         "Lich",
4984         "Multi-Headed Reptile",
4985         "Mystery Living",
4986         "Ogre",
4987         "Giant Humanoid",
4988         "Quylthulg",
4989         "Reptile/Amphibian",
4990         "Spider/Scorpion/Tick",
4991         "Troll",
4992         /* "Major Demon", */
4993         "Vampire",
4994         "Wight/Wraith/etc",
4995         "Xorn/Xaren/etc",
4996         "Yeti",
4997         "Zephyr Hound",
4998         "Mimic",
4999         "Wall/Plant/Gas",
5000         "Mushroom patch",
5001         "Ball",
5002 #endif
5003         NULL
5004 };
5005
5006
5007 /*
5008  * Symbols of monsters in each group. Note the "Uniques" group
5009  * is handled differently.
5010  */
5011 static cptr monster_group_char[] = 
5012 {
5013         (char *) -1L,
5014         (char *) -2L,
5015         "a",
5016         "b",
5017         "c",
5018         "dD",
5019         "e",
5020         "f",
5021         "g",
5022         "h",
5023         "i",
5024         "j",
5025         "k",
5026         "l",
5027         "m",
5028         "n",
5029         "o",
5030         "pt",
5031         "q",
5032         "r",
5033         "s",
5034         "uU",
5035         "v",
5036         "w",
5037         /* "x", */
5038         "y",
5039         "z",
5040         "A",
5041         "B",
5042         "C",
5043         /* "D", */
5044         "E",
5045         "F",
5046         "G",
5047         "H",
5048         "I",
5049         "J",
5050         "K",
5051         "L",
5052         "M",
5053         "N",
5054         "O",
5055         "P",
5056         "Q",
5057         "R",
5058         "S",
5059         "T",
5060         /* "U", */
5061         "V",
5062         "W",
5063         "X",
5064         "Y",
5065         "Z",
5066         "$!?=&`.|/\\~[]()>",
5067         "#",
5068         ",",
5069         "*",
5070         NULL
5071 };
5072
5073
5074 /*
5075  * hook function to sort monsters by level
5076  */
5077 static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b)
5078 {
5079         u16b *who = (u16b*)(u);
5080
5081         int w1 = who[a];
5082         int w2 = who[b];
5083
5084         monster_race *r_ptr1 = &r_info[w1];
5085         monster_race *r_ptr2 = &r_info[w2];
5086
5087         /* Unused */
5088         (void)v;
5089
5090         if (r_ptr2->level > r_ptr1->level) return TRUE;
5091         if (r_ptr1->level > r_ptr2->level) return FALSE;
5092
5093         if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return TRUE;
5094         if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return FALSE;
5095         return w1 <= w2;
5096 }
5097
5098 /*
5099  * Build a list of monster indexes in the given group. Return the number
5100  * of monsters in the group.
5101  *
5102  * mode & 0x01 : check for non-empty group
5103  * mode & 0x02 : cheat?
5104  */
5105 static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
5106 {
5107         int i, mon_cnt = 0;
5108         int dummy_why;
5109
5110         /* Get a list of x_char in this group */
5111         cptr group_char = monster_group_char[grp_cur];
5112
5113         /* XXX Hack -- Check if this is the "Uniques" group */
5114         bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
5115
5116         /* XXX Hack -- Check if this is the "Riding" group */
5117         bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
5118
5119         /* Check every race */
5120         for (i = 0; i < max_r_idx; i++)
5121         {
5122                 /* Access the race */
5123                 monster_race *r_ptr = &r_info[i];
5124
5125                 /* Skip empty race */
5126                 if (!r_ptr->name) continue ;
5127
5128                 /* Require known monsters */
5129                 if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
5130
5131                 if (grp_unique)
5132                 {
5133                         if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
5134                 }
5135
5136                 else if (grp_riding)
5137                 {
5138                         if (!(r_ptr->flags7 & RF7_RIDING)) continue;
5139                 }
5140
5141                 else
5142                 {
5143                         /* Check for race in the group */
5144                         if (!my_strchr(group_char, r_ptr->d_char)) continue;
5145                 }
5146
5147                 /* Add the race */
5148                 mon_idx[mon_cnt++] = i;
5149
5150                 /* XXX Hack -- Just checking for non-empty group */
5151                 if (mode & 0x01) break;
5152         }
5153
5154         /* Terminate the list */
5155         mon_idx[mon_cnt] = 0;
5156
5157         /* Select the sort method */
5158         ang_sort_comp = ang_sort_comp_monster_level;
5159         ang_sort_swap = ang_sort_swap_hook;
5160
5161         /* Sort by monster level */
5162         ang_sort(mon_idx, &dummy_why, mon_cnt);
5163
5164         /* Return the number of races */
5165         return mon_cnt;
5166 }
5167
5168
5169 /*
5170  * Description of each monster group.
5171  */
5172 static cptr object_group_text[] = 
5173 {
5174 #ifdef JP
5175         "¥­¥Î¥³",       /* "Mushrooms" */
5176         "Ìô",           /* "Potions" */
5177         "Ìý¤Ä¤Ü",       /* "Flasks" */
5178         "´¬Êª",         /* "Scrolls" */
5179         "»ØÎØ",         /* "Rings" */
5180         "¥¢¥ß¥å¥ì¥Ã¥È", /* "Amulets" */
5181         "ū",           /* "Whistle" */
5182         "¸÷¸»",         /* "Lanterns" */
5183         "ËâË¡ËÀ",       /* "Wands" */
5184         "¾ó",           /* "Staffs" */
5185         "¥í¥Ã¥É",       /* "Rods" */
5186         "¥«¡¼¥É",       /* "Cards" */
5187         "¥­¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë",
5188         "ÍÓÈé»æ",       
5189         "¤¯¤µ¤Ó",
5190         "Ȣ",
5191         "¿Í·Á",
5192         "Áü",
5193         "¥´¥ß",
5194         "¶õ¤Î¥Ó¥ó",
5195         "¹ü",
5196         "Åá·õÎà",       /* "Swords" */
5197         "Æß´ï",         /* "Blunt Weapons" */
5198         "ĹÊÁÉð´ï",     /* "Polearms" */
5199         "ºÎ·¡Æ»¶ñ",     /* "Diggers" */
5200         "Èô¤ÓÆ»¶ñ",     /* "Bows" */
5201         "ÃÆ",
5202         "Ìð",
5203         "¥Ü¥ë¥È",
5204         "·ÚÁõ³»",       /* "Soft Armor" */
5205         "½ÅÁõ³»",       /* "Hard Armor" */
5206         "¥É¥é¥´¥ó³»",   /* "Dragon Armor" */
5207         "½â",   /* "Shields" */
5208         "¥¯¥í¡¼¥¯",     /* "Cloaks" */
5209         "äƼê", /* "Gloves" */
5210         "¥Ø¥ë¥á¥Ã¥È",   /* "Helms" */
5211         "´§",   /* "Crowns" */
5212         "¥Ö¡¼¥Ä",       /* "Boots" */
5213         "ËâË¡½ñ",
5214 #else
5215         "Mushrooms",
5216         "Potions",
5217         "Flasks",
5218         "Scrolls",
5219         "Rings",
5220         "Amulets",
5221         "Whistle",
5222         "Lanterns",
5223         "Wands",
5224         "Staves",
5225         "Rods",
5226         "Cards",
5227         "Capture Balls",
5228         "Parchments",
5229         "Spikes",
5230         "Boxs",
5231         "Figurines",
5232         "Statues",
5233         "Junks",
5234         "Bottles",
5235         "Skeletons",
5236         "Swords",
5237         "Blunt Weapons",
5238         "Polearms",
5239         "Diggers",
5240         "Bows",
5241         "Shots",
5242         "Arrows",
5243         "Bolts",
5244         "Soft Armor",
5245         "Hard Armor",
5246         "Dragon Armor",
5247         "Shields",
5248         "Cloaks",
5249         "Gloves",
5250         "Helms",
5251         "Crowns",
5252         "Boots",
5253         "Spellbooks",
5254 #endif
5255         NULL
5256 };
5257
5258
5259 /*
5260  * TVALs of items in each group
5261  */
5262 static byte object_group_tval[] = 
5263 {
5264         TV_FOOD,
5265         TV_POTION,
5266         TV_FLASK,
5267         TV_SCROLL,
5268         TV_RING,
5269         TV_AMULET,
5270         TV_WHISTLE,
5271         TV_LITE,
5272         TV_WAND,
5273         TV_STAFF,
5274         TV_ROD,
5275         TV_CARD,
5276         TV_CAPTURE,
5277         TV_PARCHMENT,
5278         TV_SPIKE,
5279         TV_CHEST,
5280         TV_FIGURINE,
5281         TV_STATUE,
5282         TV_JUNK,
5283         TV_BOTTLE,
5284         TV_SKELETON,
5285         TV_SWORD,
5286         TV_HAFTED,
5287         TV_POLEARM,
5288         TV_DIGGING,
5289         TV_BOW,
5290         TV_SHOT,
5291         TV_ARROW,
5292         TV_BOLT,
5293         TV_SOFT_ARMOR,
5294         TV_HARD_ARMOR,
5295         TV_DRAG_ARMOR,
5296         TV_SHIELD,
5297         TV_CLOAK,
5298         TV_GLOVES,
5299         TV_HELM,
5300         TV_CROWN,
5301         TV_BOOTS,
5302         TV_LIFE_BOOK, /* Hack -- all spellbooks */
5303         0
5304 };
5305
5306
5307 /*
5308  * Build a list of monster indexes in the given group. Return the number
5309  * of monsters in the group.
5310  */
5311 static int collect_objects(int grp_cur, int object_idx[])
5312 {
5313         int i, j, k, object_cnt = 0;
5314
5315         /* Get a list of x_char in this group */
5316         byte group_tval = object_group_tval[grp_cur];
5317
5318         /* Check every object */
5319         for (i = 0; i < max_k_idx; i++)
5320         {
5321                 /* Access the race */
5322                 object_kind *k_ptr = &k_info[i];
5323
5324                 /* Skip empty objects */
5325                 if (!k_ptr->name) continue;
5326
5327                 /* Skip non-flavoured objects */
5328                 if (!k_ptr->flavor && !p_ptr->wizard) continue;
5329
5330                 /* Skip items with no distribution (special artifacts) */
5331                 for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j];
5332                 if (!(k))  continue; 
5333
5334                 /* Require objects ever seen*/
5335                 if (!k_ptr->aware && !p_ptr->wizard) continue;
5336
5337                 /* Check for race in the group */
5338                 if (TV_LIFE_BOOK == group_tval)
5339                 {
5340                         /* Hack -- All spell books */
5341                         if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK)
5342                         {
5343                                 /* Add the race */
5344                                 object_idx[object_cnt++] = i;
5345                         }
5346                 }
5347                 else if (k_ptr->tval == group_tval)
5348                 {
5349                         /* Add the race */
5350                         object_idx[object_cnt++] = i;
5351                 }
5352         }
5353
5354         /* Terminate the list */
5355         object_idx[object_cnt] = 0;
5356
5357         /* Return the number of races */
5358         return object_cnt;
5359 }
5360
5361
5362 /*
5363  * Description of each feature group.
5364  */
5365 static cptr feature_group_text[] = 
5366 {
5367         "terrains",
5368         NULL
5369 };
5370
5371
5372 /*
5373  * Build a list of feature indexes in the given group. Return the number
5374  * of features in the group.
5375  */
5376 static int collect_features(int grp_cur, int *feat_idx)
5377 {
5378         int i, feat_cnt = 0;
5379
5380         /* Unused;  There is a single group. */
5381         (void)grp_cur;
5382
5383         /* Check every feature */
5384         for (i = 1; i < max_f_idx; i++)
5385         {
5386                 /* Access the index */
5387                 feature_type *f_ptr = &f_info[i];
5388
5389                 /* Skip empty index */
5390                 if (!f_ptr->name) continue;
5391
5392                 /* Skip mimiccing features */
5393                 if (f_ptr->mimic != i) continue;
5394
5395                 /* Add the index */
5396                 feat_idx[feat_cnt++] = i;
5397         }
5398
5399         /* Terminate the list */
5400         feat_idx[feat_cnt] = 0;
5401
5402         /* Return the number of races */
5403         return feat_cnt;
5404 }
5405
5406
5407 #if 0
5408 /*
5409  * Build a list of monster indexes in the given group. Return the number
5410  * of monsters in the group.
5411  */
5412 static int collect_artifacts(int grp_cur, int object_idx[])
5413 {
5414         int i, object_cnt = 0;
5415
5416         /* Get a list of x_char in this group */
5417         byte group_tval = object_group_tval[grp_cur];
5418
5419         /* Check every object */
5420         for (i = 0; i < max_a_idx; i++)
5421         {
5422                 /* Access the artifact */
5423                 artifact_type *a_ptr = &a_info[i];
5424
5425                 /* Skip empty artifacts */
5426                 if (!a_ptr->name) continue;
5427
5428                 /* Skip "uncreated" artifacts */
5429                 if (!a_ptr->cur_num) continue;
5430
5431                 /* Check for race in the group */
5432                 if (a_ptr->tval == group_tval)
5433                 {
5434                         /* Add the race */
5435                         object_idx[object_cnt++] = i;
5436                 }
5437         }
5438
5439         /* Terminate the list */
5440         object_idx[object_cnt] = 0;
5441
5442         /* Return the number of races */
5443         return object_cnt;
5444 }
5445 #endif /* 0 */
5446
5447
5448 /*
5449  * Encode the screen colors
5450  */
5451 static char hack[17] = "dwsorgbuDWvyRGBU";
5452
5453
5454 /*
5455  * Hack -- load a screen dump from a file
5456  */
5457 void do_cmd_load_screen(void)
5458 {
5459         int i, y, x;
5460
5461         byte a = 0;
5462         char c = ' ';
5463
5464         bool okay = TRUE;
5465
5466         FILE *fff;
5467
5468         char buf[1024];
5469
5470         int wid, hgt;
5471
5472         Term_get_size(&wid, &hgt);
5473
5474         /* Build the filename */
5475         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
5476
5477         /* Append to the file */
5478         fff = my_fopen(buf, "r");
5479
5480         /* Oops */
5481         if (!fff) {
5482 #ifdef JP
5483                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5484 #else
5485                 msg_format("Failed to open %s.", buf);
5486 #endif
5487                 msg_print(NULL);
5488                 return;
5489         }
5490
5491
5492         /* Save the screen */
5493         screen_save();
5494
5495         /* Clear the screen */
5496         Term_clear();
5497
5498
5499         /* Load the screen */
5500         for (y = 0; okay; y++)
5501         {
5502                 /* Get a line of data including control code */
5503                 if (!fgets(buf, 1024, fff)) okay = FALSE;
5504
5505                 /* Get the blank line */
5506                 if (buf[0] == '\n' || buf[0] == '\0') break;
5507
5508                 /* Ignore too large screen image */
5509                 if (y >= hgt) continue;
5510
5511                 /* Show each row */
5512                 for (x = 0; x < wid - 1; x++)
5513                 {
5514                         /* End of line */
5515                         if (buf[x] == '\n' || buf[x] == '\0') break;
5516
5517                         /* Put the attr/char */
5518                         Term_draw(x, y, TERM_WHITE, buf[x]);
5519                 }
5520         }
5521
5522         /* Dump the screen */
5523         for (y = 0; okay; y++)
5524         {
5525                 /* Get a line of data including control code */
5526                 if (!fgets(buf, 1024, fff)) okay = FALSE;
5527
5528                 /* Get the blank line */
5529                 if (buf[0] == '\n' || buf[0] == '\0') break;
5530
5531                 /* Ignore too large screen image */
5532                 if (y >= hgt) continue;
5533
5534                 /* Dump each row */
5535                 for (x = 0; x < wid - 1; x++)
5536                 {
5537                         /* End of line */
5538                         if (buf[x] == '\n' || buf[x] == '\0') break;
5539
5540                         /* Get the attr/char */
5541                         (void)(Term_what(x, y, &a, &c));
5542
5543                         /* Look up the attr */
5544                         for (i = 0; i < 16; i++)
5545                         {
5546                                 /* Use attr matches */
5547                                 if (hack[i] == buf[x]) a = i;
5548                         }
5549
5550                         /* Put the attr/char */
5551                         Term_draw(x, y, a, c);
5552                 }
5553         }
5554
5555
5556         /* Close it */
5557         my_fclose(fff);
5558
5559
5560         /* Message */
5561 #ifdef JP
5562         prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤µ¤ì¤¿²èÌÌ(µ­Ç°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
5563 #else
5564         msg_print("Screen dump loaded.");
5565 #endif
5566
5567         flush();
5568         inkey();
5569
5570
5571         /* Restore the screen */
5572         screen_load();
5573 }
5574
5575
5576
5577
5578 cptr inven_res_label = 
5579 #ifdef JP
5580  "                               »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
5581 #else
5582  "                               AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
5583 #endif
5584
5585
5586 #ifdef JP
5587 #define IM_FLAG_STR  "¡ö"
5588 #define HAS_FLAG_STR "¡Ü"
5589 #define NO_FLAG_STR  "¡¦"
5590 #else
5591 #define IM_FLAG_STR  "* "
5592 #define HAS_FLAG_STR "+ "
5593 #define NO_FLAG_STR  ". "
5594 #endif
5595
5596 #define print_im_or_res_flag(IM, RES) \
5597 { \
5598         fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
5599               (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
5600 }
5601
5602 #define print_flag(TR) \
5603 { \
5604         fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
5605 }
5606
5607
5608 /* XTRA HACK RESLIST */
5609 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
5610 {
5611         char o_name[MAX_NLEN];
5612         u32b flgs[TR_FLAG_SIZE];
5613
5614         if (!o_ptr->k_idx) return;
5615         if (o_ptr->tval != tval) return;
5616
5617         /* Identified items only */
5618         if (!object_known_p(o_ptr)) return;
5619
5620         /*
5621          * HACK:Ring of Lordly protection and Dragon equipment
5622          * have random resistances.
5623          */
5624         if (((TV_WEARABLE_BEGIN <= tval) && (tval <= TV_WEARABLE_END) && o_ptr->name2)
5625             || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
5626             || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
5627             || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
5628             || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
5629             || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
5630             || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
5631             || o_ptr->art_name || o_ptr->name1)
5632         {
5633                 int i = 0;
5634                 object_desc(o_name, o_ptr, OD_NAME_ONLY);
5635
5636                 while (o_name[i] && (i < 26))
5637                 {
5638 #ifdef JP
5639                         if (iskanji(o_name[i])) i++;
5640 #endif
5641                         i++;
5642                 }
5643
5644                 if (i < 28)
5645                 {
5646                         while (i < 28)
5647                         {
5648                                 o_name[i] = ' '; i++;
5649                         }
5650                 }
5651                 o_name[i] = '\0';
5652
5653                 fprintf(fff, "%s %s", where, o_name);
5654
5655                 if (!(o_ptr->ident & (IDENT_MENTAL)))
5656                 {
5657 #ifdef JP
5658                         fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
5659 #else
5660                         fputs("-------unknown------------ -------unknown------\n", fff);
5661 #endif
5662                 }
5663                 else
5664                 {
5665                         object_flags_known(o_ptr, flgs);
5666
5667                         print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
5668                         print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
5669                         print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
5670                         print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
5671                         print_flag(TR_RES_POIS);
5672                         print_flag(TR_RES_LITE);
5673                         print_flag(TR_RES_DARK);
5674                         print_flag(TR_RES_SHARDS);
5675                         print_flag(TR_RES_SOUND);
5676                         print_flag(TR_RES_NETHER);
5677                         print_flag(TR_RES_NEXUS);
5678                         print_flag(TR_RES_CHAOS);
5679                         print_flag(TR_RES_DISEN);
5680
5681                         fputs(" ", fff);
5682
5683                         print_flag(TR_RES_BLIND);
5684                         print_flag(TR_RES_FEAR);
5685                         print_flag(TR_RES_CONF);
5686                         print_flag(TR_FREE_ACT);
5687                         print_flag(TR_SEE_INVIS);
5688                         print_flag(TR_HOLD_LIFE);
5689                         print_flag(TR_TELEPATHY);
5690                         print_flag(TR_SLOW_DIGEST);
5691                         print_flag(TR_REGEN);
5692                         print_flag(TR_FEATHER);
5693
5694                         fputc('\n', fff);
5695                 }
5696                 (*j)++;
5697                 if (*j == 9)
5698                 {
5699                         *j = 0;
5700                         fprintf(fff, "%s\n", inven_res_label);
5701                 }
5702         }
5703 }
5704
5705 /*
5706  * Display *ID* ed weapons/armors's resistances
5707  */
5708 static void do_cmd_knowledge_inven(void)
5709 {
5710         FILE *fff;
5711
5712         char file_name[1024];
5713
5714         store_type  *st_ptr;
5715
5716         byte tval;
5717         int i = 0;
5718         int j = 0;
5719
5720         char  where[32];
5721
5722         /* Open a new file */
5723         fff = my_fopen_temp(file_name, 1024);
5724         if (!fff)
5725         {
5726 #ifdef JP
5727             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5728 #else
5729             msg_format("Failed to create temporary file %s.", file_name);
5730 #endif
5731             msg_print(NULL);
5732             return;
5733         }
5734         fprintf(fff, "%s\n", inven_res_label);
5735
5736         for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
5737         {
5738                 if (j != 0)
5739                 {
5740                         for (; j < 9; j++) fputc('\n', fff);
5741                         j = 0;
5742                         fprintf(fff, "%s\n", inven_res_label);
5743                 }
5744
5745 #ifdef JP
5746                 strcpy(where, "Áõ");
5747 #else
5748                 strcpy(where, "E ");
5749 #endif
5750                 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5751                 {
5752                         do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5753                 }
5754
5755 #ifdef JP
5756                 strcpy(where, "»ý");
5757 #else
5758                 strcpy(where, "I ");
5759 #endif
5760                 for (i = 0; i < INVEN_PACK; i++)
5761                 {
5762                         do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
5763                 }
5764
5765                 st_ptr = &town[1].store[STORE_HOME];
5766 #ifdef JP
5767                 strcpy(where, "²È");
5768 #else
5769                 strcpy(where, "H ");
5770 #endif
5771
5772                 for (i = 0; i < st_ptr->stock_num; i++)
5773                 {
5774                         do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
5775                 }
5776         }
5777
5778         /* Close the file */
5779         my_fclose(fff);
5780
5781         /* Display the file contents */
5782 #ifdef JP
5783         show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ­¥ê¥¹¥È", 0, 0);
5784 #else
5785         show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5786 #endif
5787
5788         /* Remove the file */
5789         fd_kill(file_name);
5790 }
5791
5792
5793 void do_cmd_save_screen_html_aux(char *filename, int message)
5794 {
5795         int y, x, i;
5796
5797         byte a = 0, old_a = 0;
5798         char c = ' ';
5799
5800         FILE *fff, *tmpfff;
5801         char buf[2048];
5802
5803         int yomikomu = 0;
5804         cptr tags[4] = {
5805                 "HEADER_START:",
5806                 "HEADER_END:",
5807                 "FOOTER_START:",
5808                 "FOOTER_END:",
5809         };
5810
5811         cptr html_head[] = {
5812                 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5813                 "<pre>",
5814                 0,
5815         };
5816         cptr html_foot[] = {
5817                 "</pre>\n",
5818                 "</body>\n</html>\n",
5819                 0,
5820         };
5821
5822         int wid, hgt;
5823
5824         Term_get_size(&wid, &hgt);
5825
5826         /* File type is "TEXT" */
5827         FILE_TYPE(FILE_TYPE_TEXT);
5828
5829         /* Append to the file */
5830         fff = my_fopen(filename, "w");
5831
5832         /* Oops */
5833         if (!fff) {
5834                 if (message) {
5835 #ifdef JP
5836                     msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5837 #else
5838                     msg_format("Failed to open file %s.", filename);
5839 #endif
5840                     msg_print(NULL);
5841                 }
5842                 
5843                 return;
5844         }
5845
5846         /* Save the screen */
5847         if (message)
5848                 screen_save();
5849
5850         /* Build the filename */
5851         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "htmldump.prf");
5852         tmpfff = my_fopen(buf, "r");
5853         if (!tmpfff) {
5854                 for (i = 0; html_head[i]; i++)
5855                         fprintf(fff, html_head[i]);
5856         }
5857         else {
5858                 yomikomu = 0;
5859                 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5860                         if (!yomikomu) {
5861                                 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5862                                         yomikomu = 1;
5863                         }
5864                         else {
5865                                 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5866                                         break;
5867                                 fprintf(fff, "%s\n", buf);
5868                         }
5869                 }
5870         }
5871
5872         /* Dump the screen */
5873         for (y = 0; y < hgt; y++)
5874         {
5875                 /* Start the row */
5876                 if (y != 0)
5877                         fprintf(fff, "\n");
5878
5879                 /* Dump each row */
5880                 for (x = 0; x < wid - 1; x++)
5881                 {
5882                         int rv, gv, bv;
5883                         cptr cc = NULL;
5884                         /* Get the attr/char */
5885                         (void)(Term_what(x, y, &a, &c));
5886
5887                         switch (c)
5888                         {
5889                         case '&': cc = "&amp;"; break;
5890                         case '<': cc = "&lt;"; break;
5891                         case '>': cc = "&gt;"; break;
5892 #ifdef WINDOWS
5893                         case 0x1f: c = '.'; break;
5894                         case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5895 #endif
5896                         }
5897
5898                         a = a & 0x0F;
5899                         if ((y == 0 && x == 0) || a != old_a) {
5900                                 rv = angband_color_table[a][1];
5901                                 gv = angband_color_table[a][2];
5902                                 bv = angband_color_table[a][3];
5903                                 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">", 
5904                                         ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5905                                 old_a = a;
5906                         }
5907                         if (cc)
5908                                 fprintf(fff, "%s", cc);
5909                         else
5910                                 fprintf(fff, "%c", c);
5911                 }
5912         }
5913         fprintf(fff, "</font>");
5914
5915         if (!tmpfff) {
5916                 for (i = 0; html_foot[i]; i++)
5917                         fprintf(fff, html_foot[i]);
5918         }
5919         else {
5920                 rewind(tmpfff);
5921                 yomikomu = 0;
5922                 while (!my_fgets(tmpfff, buf, sizeof(buf))) {
5923                         if (!yomikomu) {
5924                                 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5925                                         yomikomu = 1;
5926                         }
5927                         else {
5928                                 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5929                                         break;
5930                                 fprintf(fff, "%s\n", buf);
5931                         }
5932                 }
5933                 my_fclose(tmpfff);
5934         }
5935
5936         /* Skip a line */
5937         fprintf(fff, "\n");
5938
5939         /* Close it */
5940         my_fclose(fff);
5941
5942         /* Message */
5943         if (message) {
5944 #ifdef JP
5945         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
5946 #else
5947                 msg_print("Screen dump saved.");
5948 #endif
5949                 msg_print(NULL);
5950         }
5951
5952         /* Restore the screen */
5953         if (message)
5954                 screen_load();
5955 }
5956
5957 /*
5958  * Hack -- save a screen dump to a file
5959  */
5960 static void do_cmd_save_screen_html(void)
5961 {
5962         char buf[1024], tmp[256] = "screen.html";
5963
5964 #ifdef JP
5965         if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
5966 #else
5967         if (!get_string("File name: ", tmp, 80))
5968 #endif
5969                 return;
5970
5971         /* Build the filename */
5972         path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
5973
5974         msg_print(NULL);
5975
5976         do_cmd_save_screen_html_aux(buf, 1);
5977 }
5978
5979
5980 /*
5981  * Redefinable "save_screen" action
5982  */
5983 void (*screendump_aux)(void) = NULL;
5984
5985
5986 /*
5987  * Hack -- save a screen dump to a file
5988  */
5989 void do_cmd_save_screen(void)
5990 {
5991         bool old_use_graphics = use_graphics;
5992         bool html_dump = FALSE;
5993
5994         int wid, hgt;
5995
5996 #ifdef JP
5997         prt("µ­Ç°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
5998 #else
5999         prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
6000 #endif
6001         while(TRUE)
6002         {
6003                 char c = inkey();
6004                 if (c == 'Y' || c == 'y')
6005                         break;
6006                 else if (c == 'H' || c == 'h')
6007                 {
6008                         html_dump = TRUE;
6009                         break;
6010                 }
6011                 else
6012                 {
6013                         prt("", 0, 0);
6014                         return;
6015                 }
6016         }
6017
6018         Term_get_size(&wid, &hgt);
6019
6020         if (old_use_graphics)
6021         {
6022                 use_graphics = FALSE;
6023                 reset_visuals();
6024
6025                 /* Redraw everything */
6026                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6027
6028                 /* Hack -- update */
6029                 handle_stuff();
6030         }
6031
6032         if (html_dump)
6033         {
6034                 do_cmd_save_screen_html();
6035                 do_cmd_redraw();
6036         }
6037
6038         /* Do we use a special screendump function ? */
6039         else if (screendump_aux)
6040         {
6041                 /* Dump the screen to a graphics file */
6042                 (*screendump_aux)();
6043         }
6044         else /* Dump the screen as text */
6045         {
6046                 int y, x;
6047
6048                 byte a = 0;
6049                 char c = ' ';
6050
6051                 FILE *fff;
6052
6053                 char buf[1024];
6054
6055                 /* Build the filename */
6056                 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt");
6057
6058                 /* File type is "TEXT" */
6059                 FILE_TYPE(FILE_TYPE_TEXT);
6060
6061                 /* Append to the file */
6062                 fff = my_fopen(buf, "w");
6063
6064                 /* Oops */
6065                 if (!fff)
6066                 {
6067 #ifdef JP
6068                         msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
6069 #else
6070                         msg_format("Failed to open file %s.", buf);
6071 #endif
6072                         msg_print(NULL);
6073                         return;
6074                 }
6075
6076
6077                 /* Save the screen */
6078                 screen_save();
6079
6080
6081                 /* Dump the screen */
6082                 for (y = 0; y < hgt; y++)
6083                 {
6084                         /* Dump each row */
6085                         for (x = 0; x < wid - 1; x++)
6086                         {
6087                                 /* Get the attr/char */
6088                                 (void)(Term_what(x, y, &a, &c));
6089
6090                                 /* Dump it */
6091                                 buf[x] = c;
6092                         }
6093
6094                         /* Terminate */
6095                         buf[x] = '\0';
6096
6097                         /* End the row */
6098                         fprintf(fff, "%s\n", buf);
6099                 }
6100
6101                 /* Skip a line */
6102                 fprintf(fff, "\n");
6103
6104
6105                 /* Dump the screen */
6106                 for (y = 0; y < hgt; y++)
6107                 {
6108                         /* Dump each row */
6109                         for (x = 0; x < wid - 1; x++)
6110                         {
6111                                 /* Get the attr/char */
6112                                 (void)(Term_what(x, y, &a, &c));
6113
6114                                 /* Dump it */
6115                                 buf[x] = hack[a&0x0F];
6116                         }
6117
6118                         /* Terminate */
6119                         buf[x] = '\0';
6120
6121                         /* End the row */
6122                         fprintf(fff, "%s\n", buf);
6123                 }
6124
6125                 /* Skip a line */
6126                 fprintf(fff, "\n");
6127
6128
6129                 /* Close it */
6130                 my_fclose(fff);
6131
6132                 /* Message */
6133 #ifdef JP
6134         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
6135 #else
6136                 msg_print("Screen dump saved.");
6137 #endif
6138
6139                 msg_print(NULL);
6140
6141
6142                 /* Restore the screen */
6143                 screen_load();
6144         }
6145
6146         if (old_use_graphics)
6147         {
6148                 use_graphics = TRUE;
6149                 reset_visuals();
6150
6151                 /* Redraw everything */
6152                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
6153
6154                 /* Hack -- update */
6155                 handle_stuff();
6156         }
6157 }
6158
6159
6160 /*
6161  * Sorting hook -- Comp function -- see below
6162  *
6163  * We use "u" to point to array of monster indexes,
6164  * and "v" to select the type of sorting to perform on "u".
6165  */
6166 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
6167 {
6168         u16b *who = (u16b*)(u);
6169
6170         u16b *why = (u16b*)(v);
6171
6172         int w1 = who[a];
6173         int w2 = who[b];
6174
6175         int z1, z2;
6176
6177         /* Sort by total kills */
6178         if (*why >= 3)
6179         {
6180                 /* Extract total kills */
6181                 z1 = a_info[w1].tval;
6182                 z2 = a_info[w2].tval;
6183
6184                 /* Compare total kills */
6185                 if (z1 < z2) return (TRUE);
6186                 if (z1 > z2) return (FALSE);
6187         }
6188
6189
6190         /* Sort by monster level */
6191         if (*why >= 2)
6192         {
6193                 /* Extract levels */
6194                 z1 = a_info[w1].sval;
6195                 z2 = a_info[w2].sval;
6196
6197                 /* Compare levels */
6198                 if (z1 < z2) return (TRUE);
6199                 if (z1 > z2) return (FALSE);
6200         }
6201
6202
6203         /* Sort by monster experience */
6204         if (*why >= 1)
6205         {
6206                 /* Extract experience */
6207                 z1 = a_info[w1].level;
6208                 z2 = a_info[w2].level;
6209
6210                 /* Compare experience */
6211                 if (z1 < z2) return (TRUE);
6212                 if (z1 > z2) return (FALSE);
6213         }
6214
6215
6216         /* Compare indexes */
6217         return (w1 <= w2);
6218 }
6219
6220
6221 /*
6222  * Sorting hook -- Swap function -- see below
6223  *
6224  * We use "u" to point to array of monster indexes,
6225  * and "v" to select the type of sorting to perform.
6226  */
6227 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
6228 {
6229         u16b *who = (u16b*)(u);
6230
6231         u16b holder;
6232
6233         /* Unused */
6234         (void)v;
6235
6236         /* Swap */
6237         holder = who[a];
6238         who[a] = who[b];
6239         who[b] = holder;
6240 }
6241
6242
6243 /*
6244  * Check the status of "artifacts"
6245  */
6246 static void do_cmd_knowledge_artifacts(void)
6247 {
6248         int i, k, z, x, y, n = 0;
6249         u16b why = 3;
6250         s16b *who;
6251
6252         FILE *fff;
6253
6254         char file_name[1024];
6255
6256         char base_name[MAX_NLEN];
6257
6258         bool *okay;
6259
6260         /* Open a new file */
6261         fff = my_fopen_temp(file_name, 1024);
6262
6263         if (!fff) {
6264 #ifdef JP
6265             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6266 #else
6267             msg_format("Failed to create temporary file %s.", file_name);
6268 #endif
6269             msg_print(NULL);
6270             return;
6271         }
6272
6273         /* Allocate the "who" array */
6274         C_MAKE(who, max_a_idx, s16b);
6275
6276         /* Allocate the "okay" array */
6277         C_MAKE(okay, max_a_idx, bool);
6278
6279         /* Scan the artifacts */
6280         for (k = 0; k < max_a_idx; k++)
6281         {
6282                 artifact_type *a_ptr = &a_info[k];
6283
6284                 /* Default */
6285                 okay[k] = FALSE;
6286
6287                 /* Skip "empty" artifacts */
6288                 if (!a_ptr->name) continue;
6289
6290                 /* Skip "uncreated" artifacts */
6291                 if (!a_ptr->cur_num) continue;
6292
6293                 /* Assume okay */
6294                 okay[k] = TRUE;
6295         }
6296
6297         /* Check the dungeon */
6298         for (y = 0; y < cur_hgt; y++)
6299         {
6300                 for (x = 0; x < cur_wid; x++)
6301                 {
6302                         cave_type *c_ptr = &cave[y][x];
6303
6304                         s16b this_o_idx, next_o_idx = 0;
6305
6306                         /* Scan all objects in the grid */
6307                         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
6308                         {
6309                                 object_type *o_ptr;
6310
6311                                 /* Acquire object */
6312                                 o_ptr = &o_list[this_o_idx];
6313
6314                                 /* Acquire next object */
6315                                 next_o_idx = o_ptr->next_o_idx;
6316
6317                                 /* Ignore non-artifacts */
6318                                 if (!artifact_p(o_ptr)) continue;
6319
6320                                 /* Ignore known items */
6321                                 if (object_known_p(o_ptr)) continue;
6322
6323                                 /* Note the artifact */
6324                                 okay[o_ptr->name1] = FALSE;
6325                         }
6326                 }
6327         }
6328
6329         /* Check the inventory and equipment */
6330         for (i = 0; i < INVEN_TOTAL; i++)
6331         {
6332                 object_type *o_ptr = &inventory[i];
6333
6334                 /* Ignore non-objects */
6335                 if (!o_ptr->k_idx) continue;
6336
6337                 /* Ignore non-artifacts */
6338                 if (!artifact_p(o_ptr)) continue;
6339
6340                 /* Ignore known items */
6341                 if (object_known_p(o_ptr)) continue;
6342
6343                 /* Note the artifact */
6344                 okay[o_ptr->name1] = FALSE;
6345         }
6346
6347         for (k = 0; k < max_a_idx; k++)
6348         {
6349                 if (okay[k]) who[n++] = k;
6350         }
6351
6352         /* Select the sort method */
6353         ang_sort_comp = ang_sort_art_comp;
6354         ang_sort_swap = ang_sort_art_swap;
6355
6356         /* Sort the array by dungeon depth of monsters */
6357         ang_sort(who, &why, n);
6358
6359         /* Scan the artifacts */
6360         for (k = 0; k < n; k++)
6361         {
6362                 artifact_type *a_ptr = &a_info[who[k]];
6363
6364                 /* Paranoia */
6365 #ifdef JP
6366                 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
6367 #else
6368                 strcpy(base_name, "Unknown Artifact");
6369 #endif
6370
6371
6372                 /* Obtain the base object type */
6373                 z = lookup_kind(a_ptr->tval, a_ptr->sval);
6374
6375                 /* Real object */
6376                 if (z)
6377                 {
6378                         object_type forge;
6379                         object_type *q_ptr;
6380
6381                         /* Get local object */
6382                         q_ptr = &forge;
6383
6384                         /* Create fake object */
6385                         object_prep(q_ptr, z);
6386
6387                         /* Make it an artifact */
6388                         q_ptr->name1 = (byte)who[k];
6389
6390                         /* Display as if known */
6391                         q_ptr->ident |= IDENT_STORE;
6392
6393                         /* Describe the artifact */
6394                         object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6395                 }
6396
6397                 /* Hack -- Build the artifact name */
6398 #ifdef JP
6399                 fprintf(fff, "     %s\n", base_name);
6400 #else
6401                 fprintf(fff, "     The %s\n", base_name);
6402 #endif
6403
6404         }
6405
6406         /* Free the "who" array */
6407         C_KILL(who, max_a_idx, s16b);
6408
6409         /* Free the "okay" array */
6410         C_KILL(okay, max_a_idx, bool);
6411
6412         /* Close the file */
6413         my_fclose(fff);
6414
6415         /* Display the file contents */
6416 #ifdef JP
6417         show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
6418 #else
6419         show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
6420 #endif
6421
6422
6423         /* Remove the file */
6424         fd_kill(file_name);
6425 }
6426
6427
6428 /*
6429  * Display known uniques
6430  */
6431 static void do_cmd_knowledge_uniques(void)
6432 {
6433         int i, k, n = 0;
6434         u16b why = 2;
6435         s16b *who;
6436
6437         FILE *fff;
6438
6439         char file_name[1024];
6440
6441         /* Open a new file */
6442         fff = my_fopen_temp(file_name, 1024);
6443
6444         if (!fff) {
6445 #ifdef JP
6446             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6447 #else
6448             msg_format("Failed to create temporary file %s.", file_name);
6449 #endif
6450             msg_print(NULL);
6451             return;
6452         }
6453
6454         /* Allocate the "who" array */
6455         C_MAKE(who, max_r_idx, s16b);
6456
6457         /* Scan the monsters */
6458         for (i = 1; i < max_r_idx; i++)
6459         {
6460                 monster_race *r_ptr = &r_info[i];
6461
6462                 /* Use that monster */
6463                 if (r_ptr->name) who[n++] = i;
6464         }
6465
6466         /* Select the sort method */
6467         ang_sort_comp = ang_sort_comp_hook;
6468         ang_sort_swap = ang_sort_swap_hook;
6469
6470         /* Sort the array by dungeon depth of monsters */
6471         ang_sort(who, &why, n);
6472
6473         /* Scan the monster races */
6474         for (k = 0; k < n; k++)
6475         {
6476                 monster_race *r_ptr = &r_info[who[k]];
6477
6478                 /* Only print Uniques */
6479                 if (r_ptr->flags1 & (RF1_UNIQUE))
6480                 {
6481                         bool dead = (r_ptr->max_num == 0);
6482
6483                         if (dead) continue;
6484
6485                         /* Only display "known" uniques */
6486                         if (dead || cheat_know || r_ptr->r_sights)
6487                         {
6488                                 /* Print a message */
6489 #ifdef JP
6490                                 fprintf(fff, "     %s¤Ï¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¡£\n",
6491                                         (r_name + r_ptr->name));
6492 #else
6493                                 fprintf(fff, "     %s is alive\n",
6494                                         (r_name + r_ptr->name));
6495 #endif
6496
6497                         }
6498                 }
6499         }
6500
6501         /* Free the "who" array */
6502         C_KILL(who, max_r_idx, s16b);
6503
6504         /* Close the file */
6505         my_fclose(fff);
6506
6507         /* Display the file contents */
6508 #ifdef JP
6509         show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
6510 #else
6511         show_file(TRUE, file_name, "Alive Uniques", 0, 0);
6512 #endif
6513
6514
6515         /* Remove the file */
6516         fd_kill(file_name);
6517 }
6518
6519
6520 /*
6521  * Display weapon-exp
6522  */
6523 static void do_cmd_knowledge_weapon_exp(void)
6524 {
6525         int i, j, num, weapon_exp;
6526
6527         FILE *fff;
6528
6529         char file_name[1024];
6530         char tmp[30];
6531
6532         /* Open a new file */
6533         fff = my_fopen_temp(file_name, 1024);
6534         if (!fff) {
6535 #ifdef JP
6536             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6537 #else
6538             msg_format("Failed to create temporary file %s.", file_name);
6539 #endif
6540             msg_print(NULL);
6541             return;
6542         }
6543
6544         for (i = 0; i < 5; i++)
6545         {
6546                 for (num = 0; num < 64; num++)
6547                 {
6548                         for (j = 0; j < max_k_idx; j++)
6549                         {
6550                                 object_kind *k_ptr = &k_info[j];
6551
6552                                 if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num))
6553                                 {
6554                                         if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6555
6556                                         weapon_exp = p_ptr->weapon_exp[4 - i][num];
6557                                         strip_name(tmp, j);
6558                                         fprintf(fff, "%-25s ", tmp);
6559                                         if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!");
6560                                         else fprintf(fff, " ");
6561                                         fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]);
6562                                         if (cheat_xtra) fprintf(fff, " %d", weapon_exp);
6563                                         fprintf(fff, "\n");
6564                                         break;
6565                                 }
6566                         }
6567                 }
6568         }
6569
6570         /* Close the file */
6571         my_fclose(fff);
6572
6573         /* Display the file contents */
6574 #ifdef JP
6575         show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6576 #else
6577         show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6578 #endif
6579
6580
6581         /* Remove the file */
6582         fd_kill(file_name);
6583 }
6584
6585
6586 /*
6587  * Display spell-exp
6588  */
6589 static void do_cmd_knowledge_spell_exp(void)
6590 {
6591         int i = 0, spell_exp, exp_level;
6592
6593         FILE *fff;
6594         magic_type *s_ptr;
6595
6596         char file_name[1024];
6597
6598         /* Open a new file */
6599         fff = my_fopen_temp(file_name, 1024);
6600         if (!fff) {
6601 #ifdef JP
6602             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6603 #else
6604             msg_format("Failed to create temporary file %s.", file_name);
6605 #endif
6606             msg_print(NULL);
6607             return;
6608         }
6609
6610         if (p_ptr->realm1 != REALM_NONE)
6611         {
6612 #ifdef JP
6613                 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]);
6614 #else
6615                 fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]);
6616 #endif
6617                 for (i = 0; i < 32; i++)
6618                 {
6619                         if (!is_magic(p_ptr->realm1))
6620                         {
6621                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6622                         }
6623                         else
6624                         {
6625                                 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6626                         }
6627                         if (s_ptr->slevel >= 99) continue;
6628                         spell_exp = p_ptr->spell_exp[i];
6629                         exp_level = spell_exp_level(spell_exp);
6630                         fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm1) - 1][i]);
6631                         if (p_ptr->realm1 == REALM_HISSATSU)
6632                                 fprintf(fff, "[--]");
6633                         else
6634                         {
6635                                 if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!");
6636                                 else fprintf(fff, " ");
6637                                 fprintf(fff, "%s", exp_level_str[exp_level]);
6638                         }
6639                         if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6640                         fprintf(fff, "\n");
6641                 }
6642         }
6643
6644         if (p_ptr->realm2 != REALM_NONE)
6645         {
6646 #ifdef JP
6647                 fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]);
6648 #else
6649                 fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]);
6650 #endif
6651                 for (i = 0; i < 32; i++)
6652                 {
6653                         if (!is_magic(p_ptr->realm1))
6654                         {
6655                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6656                         }
6657                         else
6658                         {
6659                                 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6660                         }
6661                         if (s_ptr->slevel >= 99) continue;
6662
6663                         spell_exp = p_ptr->spell_exp[i + 32];
6664                         exp_level = spell_exp_level(spell_exp);
6665                         fprintf(fff, "%-25s ", spell_names[technic2magic(p_ptr->realm2) - 1][i]);
6666                         if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!");
6667                         else fprintf(fff, " ");
6668                         fprintf(fff, "%s", exp_level_str[exp_level]);
6669                         if (cheat_xtra) fprintf(fff, " %d", spell_exp);
6670                         fprintf(fff, "\n");
6671                 }
6672         }
6673
6674         /* Close the file */
6675         my_fclose(fff);
6676
6677         /* Display the file contents */
6678 #ifdef JP
6679         show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6680 #else
6681         show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6682 #endif
6683
6684
6685         /* Remove the file */
6686         fd_kill(file_name);
6687 }
6688
6689
6690 /*
6691  * Display skill-exp
6692  */
6693 static void do_cmd_knowledge_skill_exp(void)
6694 {
6695         int i = 0, skill_exp;
6696
6697         FILE *fff;
6698
6699         char file_name[1024];
6700 #ifdef JP
6701         char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή          ", "¾èÇÏ            "};
6702 #else
6703         char skill_name[3][20]={"Martial Arts    ", "Dual Wielding   ", "Riding          "};
6704 #endif
6705
6706         /* Open a new file */
6707         fff = my_fopen_temp(file_name, 1024);
6708         if (!fff) {
6709 #ifdef JP
6710             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6711 #else
6712             msg_format("Failed to create temporary file %s.", file_name);
6713 #endif
6714             msg_print(NULL);
6715             return;
6716         }
6717
6718         for (i = 0; i < 3; i++)
6719         {
6720                 skill_exp = p_ptr->skill_exp[i];
6721                 fprintf(fff, "%-20s ", skill_name[i]);
6722                 if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!");
6723                 else fprintf(fff, " ");
6724                 fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]);
6725                 if (cheat_xtra) fprintf(fff, " %d", skill_exp);
6726                 fprintf(fff, "\n");
6727         }
6728
6729         /* Close the file */
6730         my_fclose(fff);
6731
6732         /* Display the file contents */
6733 #ifdef JP
6734         show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6735 #else
6736         show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6737 #endif
6738
6739
6740         /* Remove the file */
6741         fd_kill(file_name);
6742 }
6743
6744
6745 /*
6746  * Pluralize a monster name
6747  */
6748 void plural_aux(char *Name)
6749 {
6750         int NameLen = strlen(Name);
6751
6752         if (my_strstr(Name, "Disembodied hand"))
6753         {
6754                 strcpy(Name, "Disembodied hands that strangled people");
6755         }
6756         else if (my_strstr(Name, "Colour out of space"))
6757         {
6758                 strcpy(Name, "Colours out of space");
6759         }
6760         else if (my_strstr(Name, "stairway to hell"))
6761         {
6762                 strcpy(Name, "stairways to hell");
6763         }
6764         else if (my_strstr(Name, "Dweller on the threshold"))
6765         {
6766                 strcpy(Name, "Dwellers on the threshold");
6767         }
6768         else if (my_strstr(Name, " of "))
6769         {
6770                 cptr aider = my_strstr(Name, " of ");
6771                 char dummy[80];
6772                 int i = 0;
6773                 cptr ctr = Name;
6774
6775                 while (ctr < aider)
6776                 {
6777                         dummy[i] = *ctr;
6778                         ctr++; i++;
6779                 }
6780
6781                 if (dummy[i-1] == 's')
6782                 {
6783                         strcpy(&(dummy[i]), "es");
6784                         i++;
6785                 }
6786                 else
6787                 {
6788                         strcpy(&(dummy[i]), "s");
6789                 }
6790
6791                 strcpy(&(dummy[i+1]), aider);
6792                 strcpy(Name, dummy);
6793         }
6794         else if (my_strstr(Name, "coins"))
6795         {
6796                 char dummy[80];
6797                 strcpy(dummy, "piles of ");
6798                 strcat(dummy, Name);
6799                 strcpy(Name, dummy);
6800                 return;
6801         }
6802         else if (my_strstr(Name, "Manes"))
6803         {
6804                 return;
6805         }
6806         else if (streq(&(Name[NameLen - 2]), "ey"))
6807         {
6808                 strcpy(&(Name[NameLen - 2]), "eys");
6809         }
6810         else if (Name[NameLen - 1] == 'y')
6811         {
6812                 strcpy(&(Name[NameLen - 1]), "ies");
6813         }
6814         else if (streq(&(Name[NameLen - 4]), "ouse"))
6815         {
6816                 strcpy(&(Name[NameLen - 4]), "ice");
6817         }
6818         else if (streq(&(Name[NameLen - 2]), "us"))
6819         {
6820                 strcpy(&(Name[NameLen - 2]), "i");
6821         }
6822         else if (streq(&(Name[NameLen - 6]), "kelman"))
6823         {
6824                 strcpy(&(Name[NameLen - 6]), "kelmen");
6825         }
6826         else if (streq(&(Name[NameLen - 8]), "wordsman"))
6827         {
6828                 strcpy(&(Name[NameLen - 8]), "wordsmen");
6829         }
6830         else if (streq(&(Name[NameLen - 7]), "oodsman"))
6831         {
6832                 strcpy(&(Name[NameLen - 7]), "oodsmen");
6833         }
6834         else if (streq(&(Name[NameLen - 7]), "eastman"))
6835         {
6836                 strcpy(&(Name[NameLen - 7]), "eastmen");
6837         }
6838         else if (streq(&(Name[NameLen - 8]), "izardman"))
6839         {
6840                 strcpy(&(Name[NameLen - 8]), "izardmen");
6841         }
6842         else if (streq(&(Name[NameLen - 5]), "geist"))
6843         {
6844                 strcpy(&(Name[NameLen - 5]), "geister");
6845         }
6846         else if (streq(&(Name[NameLen - 2]), "ex"))
6847         {
6848                 strcpy(&(Name[NameLen - 2]), "ices");
6849         }
6850         else if (streq(&(Name[NameLen - 2]), "lf"))
6851         {
6852                 strcpy(&(Name[NameLen - 2]), "lves");
6853         }
6854         else if (suffix(Name, "ch") ||
6855                  suffix(Name, "sh") ||
6856                          suffix(Name, "nx") ||
6857                          suffix(Name, "s") ||
6858                          suffix(Name, "o"))
6859         {
6860                 strcpy(&(Name[NameLen]), "es");
6861         }
6862         else
6863         {
6864                 strcpy(&(Name[NameLen]), "s");
6865         }
6866 }
6867
6868 /*
6869  * Display current pets
6870  */
6871 static void do_cmd_knowledge_pets(void)
6872 {
6873         int             i;
6874         FILE            *fff;
6875         monster_type    *m_ptr;
6876         char            pet_name[80];
6877         int             t_friends = 0;
6878         int             show_upkeep = 0;
6879         char            file_name[1024];
6880
6881
6882         /* Open a new file */
6883         fff = my_fopen_temp(file_name, 1024);
6884         if (!fff) {
6885 #ifdef JP
6886             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6887 #else
6888             msg_format("Failed to create temporary file %s.", file_name);
6889 #endif
6890             msg_print(NULL);
6891             return;
6892         }
6893
6894         /* Process the monsters (backwards) */
6895         for (i = m_max - 1; i >= 1; i--)
6896         {
6897                 /* Access the monster */
6898                 m_ptr = &m_list[i];
6899
6900                 /* Ignore "dead" monsters */
6901                 if (!m_ptr->r_idx) continue;
6902
6903                 /* Calculate "upkeep" for pets */
6904                 if (is_pet(m_ptr))
6905                 {
6906                         t_friends++;
6907                         monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
6908                         fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
6909                 }
6910         }
6911
6912         show_upkeep = calculate_upkeep();
6913
6914         fprintf(fff, "----------------------------------------------\n");
6915 #ifdef JP
6916         fprintf(fff, "    ¹ç·×: %d É¤¤Î¥Ú¥Ã¥È\n", t_friends);
6917         fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6918 #else
6919         fprintf(fff, "   Total: %d pet%s.\n",
6920                 t_friends, (t_friends == 1 ? "" : "s"));
6921         fprintf(fff, "   Upkeep: %d%% mana.\n", show_upkeep);
6922 #endif
6923
6924
6925
6926         /* Close the file */
6927         my_fclose(fff);
6928
6929         /* Display the file contents */
6930 #ifdef JP
6931         show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6932 #else
6933         show_file(TRUE, file_name, "Current Pets", 0, 0);
6934 #endif
6935
6936
6937         /* Remove the file */
6938         fd_kill(file_name);
6939 }
6940
6941
6942 /*
6943  * Total kill count
6944  *
6945  * Note that the player ghosts are ignored.  XXX XXX XXX
6946  */
6947 static void do_cmd_knowledge_kill_count(void)
6948 {
6949         int i, k, n = 0;
6950         u16b why = 2;
6951         s16b *who;
6952
6953         FILE *fff;
6954
6955         char file_name[1024];
6956
6957         s32b Total = 0;
6958
6959
6960         /* Open a new file */
6961         fff = my_fopen_temp(file_name, 1024);
6962
6963         if (!fff) {
6964 #ifdef JP
6965             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6966 #else
6967             msg_format("Failed to create temporary file %s.", file_name);
6968 #endif
6969             msg_print(NULL);
6970             return;
6971         }
6972
6973         /* Allocate the "who" array */
6974         C_MAKE(who, max_r_idx, s16b);
6975
6976         {
6977                 /* Monsters slain */
6978                 int kk;
6979
6980                 for (kk = 1; kk < max_r_idx; kk++)
6981                 {
6982                         monster_race *r_ptr = &r_info[kk];
6983
6984                         if (r_ptr->flags1 & (RF1_UNIQUE))
6985                         {
6986                                 bool dead = (r_ptr->max_num == 0);
6987
6988                                 if (dead)
6989                                 {
6990                                         Total++;
6991                                 }
6992                         }
6993                         else
6994                         {
6995                                 s16b This = r_ptr->r_pkills;
6996
6997                                 if (This > 0)
6998                                 {
6999                                         Total += This;
7000                                 }
7001                         }
7002                 }
7003
7004                 if (Total < 1)
7005 #ifdef JP
7006                         fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
7007 #else
7008                         fprintf(fff,"You have defeated no enemies yet.\n\n");
7009 #endif
7010
7011                 else if (Total == 1)
7012 #ifdef JP
7013                         fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
7014 #else
7015                         fprintf(fff,"You have defeated one enemy.\n\n");
7016 #endif
7017
7018                 else
7019 #ifdef JP
7020                         fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu É¤¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
7021 #else
7022                         fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
7023 #endif
7024
7025         }
7026
7027         Total = 0;
7028
7029         /* Scan the monsters */
7030         for (i = 1; i < max_r_idx; i++)
7031         {
7032                 monster_race *r_ptr = &r_info[i];
7033
7034                 /* Use that monster */
7035                 if (r_ptr->name) who[n++] = i;
7036         }
7037
7038         /* Select the sort method */
7039         ang_sort_comp = ang_sort_comp_hook;
7040         ang_sort_swap = ang_sort_swap_hook;
7041
7042         /* Sort the array by dungeon depth of monsters */
7043         ang_sort(who, &why, n);
7044
7045         /* Scan the monster races */
7046         for (k = 0; k < n; k++)
7047         {
7048                 monster_race *r_ptr = &r_info[who[k]];
7049
7050                 if (r_ptr->flags1 & (RF1_UNIQUE))
7051                 {
7052                         bool dead = (r_ptr->max_num == 0);
7053
7054                         if (dead)
7055                         {
7056                                 /* Print a message */
7057                                 fprintf(fff, "     %s\n",
7058                                     (r_name + r_ptr->name));
7059                                 Total++;
7060                         }
7061                 }
7062                 else
7063                 {
7064                         s16b This = r_ptr->r_pkills;
7065
7066                         if (This > 0)
7067                         {
7068 #ifdef JP
7069                                 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
7070                                 if(my_strchr("pt",r_ptr->d_char))
7071                                         fprintf(fff, "     %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
7072                                 else
7073                                         fprintf(fff, "     %3d É¤¤Î %s\n", This, r_name + r_ptr->name);
7074 #else
7075                                 if (This < 2)
7076                                 {
7077                                         if (my_strstr(r_name + r_ptr->name, "coins"))
7078                                         {
7079                                                 fprintf(fff, "     1 pile of %s\n", (r_name + r_ptr->name));
7080                                         }
7081                                         else
7082                                         {
7083                                                 fprintf(fff, "     1 %s\n", (r_name + r_ptr->name));
7084                                         }
7085                                 }
7086                                 else
7087                                 {
7088                                         char ToPlural[80];
7089                                         strcpy(ToPlural, (r_name + r_ptr->name));
7090                                         plural_aux(ToPlural);
7091                                         fprintf(fff, "     %d %s\n", This, ToPlural);
7092                                 }
7093 #endif
7094
7095
7096                                 Total += This;
7097                         }
7098                 }
7099         }
7100
7101         fprintf(fff,"----------------------------------------------\n");
7102 #ifdef JP
7103         fprintf(fff,"    ¹ç·×: %lu É¤¤òÅݤ·¤¿¡£\n", Total);
7104 #else
7105         fprintf(fff,"   Total: %lu creature%s killed.\n",
7106                 Total, (Total == 1 ? "" : "s"));
7107 #endif
7108
7109
7110         /* Free the "who" array */
7111         C_KILL(who, max_r_idx, s16b);
7112
7113         /* Close the file */
7114         my_fclose(fff);
7115
7116         /* Display the file contents */
7117 #ifdef JP
7118         show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
7119 #else
7120         show_file(TRUE, file_name, "Kill Count", 0, 0);
7121 #endif
7122
7123
7124         /* Remove the file */
7125         fd_kill(file_name);
7126 }
7127
7128
7129 /*
7130  * Display the object groups.
7131  */
7132 static void display_group_list(int col, int row, int wid, int per_page,
7133         int grp_idx[], cptr group_text[], int grp_cur, int grp_top)
7134 {
7135         int i;
7136
7137         /* Display lines until done */
7138         for (i = 0; i < per_page && (grp_idx[i] >= 0); i++)
7139         {
7140                 /* Get the group index */
7141                 int grp = grp_idx[grp_top + i];
7142
7143                 /* Choose a color */
7144                 byte attr = (grp_top + i == grp_cur) ? TERM_L_BLUE : TERM_WHITE;
7145
7146                 /* Erase the entire line */
7147                 Term_erase(col, row + i, wid);
7148
7149                 /* Display the group label */
7150                 c_put_str(attr, group_text[grp], row + i, col);
7151         }
7152 }
7153
7154
7155 /* 
7156  * Move the cursor in a browser window 
7157  */
7158 static void browser_cursor(char ch, int *column, int *grp_cur, int grp_cnt, 
7159                                                    int *list_cur, int list_cnt)
7160 {
7161         int d;
7162         int col = *column;
7163         int grp = *grp_cur;
7164         int list = *list_cur;
7165
7166         /* Extract direction */
7167         if (ch == ' ')
7168         {
7169                 /* Hack -- scroll up full screen */
7170                 d = 3;
7171         }
7172         else if (ch == '-')
7173         {
7174                 /* Hack -- scroll down full screen */
7175                 d = 9;
7176         }
7177         else
7178         {
7179                 d = get_keymap_dir(ch);
7180         }
7181
7182         if (!d) return;
7183
7184         /* Diagonals - hack */
7185         if ((ddx[d] > 0) && ddy[d])
7186         {
7187                 int browser_rows;
7188                 int wid, hgt;
7189
7190                 /* Get size */
7191                 Term_get_size(&wid, &hgt);
7192
7193                 browser_rows = hgt - 8;
7194
7195                 /* Browse group list */
7196                 if (!col)
7197                 {
7198                         int old_grp = grp;
7199
7200                         /* Move up or down */
7201                         grp += ddy[d] * (browser_rows - 1);
7202
7203                         /* Verify */
7204                         if (grp >= grp_cnt)     grp = grp_cnt - 1;
7205                         if (grp < 0) grp = 0;
7206                         if (grp != old_grp)     list = 0;
7207                 }
7208
7209                 /* Browse sub-list list */
7210                 else
7211                 {
7212                         /* Move up or down */
7213                         list += ddy[d] * browser_rows;
7214
7215                         /* Verify */
7216                         if (list >= list_cnt) list = list_cnt - 1;
7217                         if (list < 0) list = 0;
7218                 }
7219
7220                 (*grp_cur) = grp;
7221                 (*list_cur) = list;
7222
7223                 return;
7224         }
7225
7226         if (ddx[d])
7227         {
7228                 col += ddx[d];
7229                 if (col < 0) col = 0;
7230                 if (col > 1) col = 1;
7231
7232                 (*column) = col;
7233
7234                 return;
7235         }
7236
7237         /* Browse group list */
7238         if (!col)
7239         {
7240                 int old_grp = grp;
7241
7242                 /* Move up or down */
7243                 grp += ddy[d];
7244
7245                 /* Verify */
7246                 if (grp >= grp_cnt)     grp = grp_cnt - 1;
7247                 if (grp < 0) grp = 0;
7248                 if (grp != old_grp)     list = 0;
7249         }
7250
7251         /* Browse sub-list list */
7252         else
7253         {
7254                 /* Move up or down */
7255                 list += ddy[d];
7256
7257                 /* Verify */
7258                 if (list >= list_cnt) list = list_cnt - 1;
7259                 if (list < 0) list = 0;
7260         }
7261
7262         (*grp_cur) = grp;
7263         (*list_cur) = list;
7264 }
7265
7266
7267 /*
7268  * Display visuals.
7269  */
7270 static void display_visual_list(int col, int row, int height, int width, byte attr_top, byte char_left)
7271 {
7272         int i, j;
7273
7274         /* Clear the display lines */
7275         for (i = 0; i < height; i++)
7276         {
7277                 Term_erase(col, row + i, width);
7278         }
7279
7280         /* Bigtile mode uses double width */
7281         if (use_bigtile) width /= 2;
7282
7283         /* Display lines until done */
7284         for (i = 0; i < height; i++)
7285         {
7286                 /* Display columns until done */
7287                 for (j = 0; j < width; j++)
7288                 {
7289                         byte a;
7290                         char c;
7291                         int x = col + j;
7292                         int y = row + i;
7293                         int ia, ic;
7294
7295                         /* Bigtile mode uses double width */
7296                         if (use_bigtile) x += j;
7297
7298                         ia = attr_top + i;
7299                         ic = char_left + j;
7300
7301                         /* Ignore illegal characters */
7302                         if (ia > 0x7f || ic > 0xff || ic < ' ' ||
7303                             (!use_graphics && ic > 0x7f))
7304                                 continue;
7305
7306                         a = (byte)ia;
7307                         c = (char)ic;
7308
7309                         /* Force correct code for both ASCII character and tile */
7310                         if (c & 0x80) a |= 0x80;
7311
7312                         /* Display symbol */
7313                         Term_queue_bigchar(x, y, a, c, 0, 0);
7314                 }
7315         }
7316 }
7317
7318
7319 /*
7320  * Place the cursor at the collect position for visual mode
7321  */
7322 static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left)
7323 {
7324         int i = (a & 0x7f) - attr_top;
7325         int j = c - char_left;
7326
7327         int x = col + j;
7328         int y = row + i;
7329
7330         /* Bigtile mode uses double width */
7331         if (use_bigtile) x += j;
7332
7333         /* Place the cursor */
7334         Term_gotoxy(x, y);
7335 }
7336
7337
7338 /*
7339  *  Clipboard variables for copy&paste in visual mode
7340  */
7341 static byte attr_idx = 0;
7342 static byte char_idx = 0;
7343
7344 /* Hack -- for feature lighting */
7345 static byte attr_idx_feat[F_LIT_MAX] = {0, 0, 0, 0};
7346 static byte char_idx_feat[F_LIT_MAX] = {0, 0, 0, 0};
7347
7348 /*
7349  *  Do visual mode command -- Change symbols
7350  */
7351 static bool visual_mode_command(char ch, bool *visual_list_ptr, 
7352                                 int height, int width,
7353                                 byte *attr_top_ptr, byte *char_left_ptr,
7354                                 byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
7355 {
7356         static byte attr_old = 0, char_old = 0;
7357
7358         switch (ch)
7359         {
7360         case ESCAPE:
7361                 if (*visual_list_ptr)
7362                 {
7363                         /* Cancel change */
7364                         *cur_attr_ptr = attr_old;
7365                         *cur_char_ptr = char_old;
7366                         *visual_list_ptr = FALSE;
7367
7368                         return TRUE;
7369                 }
7370
7371                 break;
7372
7373         case '\n':
7374         case '\r':
7375                 if (*visual_list_ptr)
7376                 {
7377                         /* Accept change */
7378                         *visual_list_ptr = FALSE;
7379                         *need_redraw = TRUE;
7380
7381                         return TRUE;
7382                 }
7383                 break;
7384
7385         case 'V':
7386         case 'v':
7387                 if (!*visual_list_ptr)
7388                 {
7389                         *visual_list_ptr = TRUE;
7390
7391                         *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7392                         *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7393
7394                         attr_old = *cur_attr_ptr;
7395                         char_old = *cur_char_ptr;
7396
7397                         return TRUE;
7398                 }
7399                 break;
7400
7401         case 'C':
7402         case 'c':
7403                 {
7404                         int i;
7405
7406                         /* Set the visual */
7407                         attr_idx = *cur_attr_ptr;
7408                         char_idx = *cur_char_ptr;
7409
7410                         /* Hack -- for feature lighting */
7411                         for (i = 0; i < F_LIT_MAX; i++)
7412                         {
7413                                 attr_idx_feat[i] = 0;
7414                                 char_idx_feat[i] = 0;
7415                         }
7416                 }
7417                 return TRUE;
7418
7419         case 'P':
7420         case 'p':
7421                 if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow ATTR_DARK text */
7422                 {
7423                         /* Set the char */
7424                         *cur_attr_ptr = attr_idx;
7425                         *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
7426                         if (!*visual_list_ptr) *need_redraw = TRUE;
7427                 }
7428
7429                 if (char_idx)
7430                 {
7431                         /* Set the char */
7432                         *cur_char_ptr = char_idx;
7433                         *char_left_ptr = MAX(0, *cur_char_ptr - 10);
7434                         if (!*visual_list_ptr) *need_redraw = TRUE;
7435                 }
7436
7437                 return TRUE;
7438
7439         default:
7440                 if (*visual_list_ptr)
7441                 {
7442                         int eff_width;
7443                         int d = get_keymap_dir(ch);
7444                         byte a = (*cur_attr_ptr & 0x7f);
7445                         byte c = *cur_char_ptr;
7446
7447                         if (use_bigtile) eff_width = width / 2;
7448                         else eff_width = width;
7449
7450                         /* Restrict direction */
7451                         if ((a == 0) && (ddy[d] < 0)) d = 0;
7452                         if ((c == 0) && (ddx[d] < 0)) d = 0;
7453                         if ((a == 0x7f) && (ddy[d] > 0)) d = 0;
7454                         if ((c == 0xff) && (ddx[d] > 0)) d = 0;
7455
7456                         a += ddy[d];
7457                         c += ddx[d];
7458
7459                         /* Force correct code for both ASCII character and tile */
7460                         if (c & 0x80) a |= 0x80;
7461
7462                         /* Set the visual */
7463                         *cur_attr_ptr = a;
7464                         *cur_char_ptr = c;
7465
7466
7467                         /* Move the frame */
7468                         if ((ddx[d] < 0) && *char_left_ptr > MAX(0, (int)c - 10)) (*char_left_ptr)--;
7469                         if ((ddx[d] > 0) && *char_left_ptr + eff_width < MIN(0xff, (int)c + 10)) (*char_left_ptr)++;
7470                         if ((ddy[d] < 0) && *attr_top_ptr > MAX(0, (int)(a & 0x7f) - 4)) (*attr_top_ptr)--;
7471                         if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++;
7472                         return TRUE;
7473                 }
7474                                 
7475                 break;
7476         }
7477
7478         /* Visual mode command is not used */
7479         return FALSE;
7480 }
7481
7482
7483 /*
7484  * Display the monsters in a group.
7485  */
7486 static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
7487         int mon_cur, int mon_top)
7488 {
7489         int i;
7490
7491         /* Display lines until done */
7492         for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
7493         {
7494                 byte attr;
7495
7496                 /* Get the race index */
7497                 int r_idx = mon_idx[mon_top + i] ;
7498
7499                 /* Access the race */
7500                 monster_race *r_ptr = &r_info[r_idx];
7501
7502
7503                 /* Choose a color */
7504                 attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
7505
7506                 /* Display the name */
7507                 c_prt(attr, (r_name + r_ptr->name), row + i, col);
7508
7509                 /* Hack -- visual_list mode */
7510                 if (per_page == 1)
7511                 {
7512                         c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60);
7513                 }
7514                 else if (p_ptr->wizard) 
7515                 {
7516                         c_prt(attr, format("%d", r_idx), row + i, 60);
7517                 }
7518
7519                 /* Display symbol */
7520                 Term_queue_bigchar(70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
7521
7522
7523                 /* Display kills */
7524                 if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
7525 #ifdef JP
7526                 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73);
7527 #else
7528                 else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73);
7529 #endif
7530         
7531         }
7532
7533         /* Clear remaining lines */
7534         for (; i < per_page; i++)
7535         {
7536                 Term_erase(col, row + i, 255);
7537         }
7538 }
7539
7540
7541 /*
7542  * Display known monsters.
7543  */
7544 static void do_cmd_knowledge_monsters(bool *need_redraw)
7545 {
7546         int i, len, max;
7547         int grp_cur, grp_top, old_grp_cur;
7548         int mon_cur, mon_top;
7549         int grp_cnt, grp_idx[100];
7550         int mon_cnt;
7551         s16b *mon_idx;
7552
7553         int column = 0;
7554         bool flag;
7555         bool redraw;
7556
7557         bool visual_list = FALSE;
7558         byte attr_top = 0, char_left = 0;
7559
7560         int browser_rows;
7561         int wid, hgt;
7562
7563         /* Get size */
7564         Term_get_size(&wid, &hgt);
7565
7566         browser_rows = hgt - 8;
7567
7568         /* Allocate the "mon_idx" array */
7569         C_MAKE(mon_idx, max_r_idx, s16b);
7570
7571         max = 0;
7572         grp_cnt = 0;
7573
7574         /* Check every group */
7575         for (i = 0; monster_group_text[i] != NULL; i++)
7576         {
7577                 /* Measure the label */
7578                 len = strlen(monster_group_text[i]);
7579
7580                 /* Save the maximum length */
7581                 if (len > max) max = len;
7582
7583                 /* See if any monsters are known */
7584                 if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01))
7585                 {
7586                         /* Build a list of groups with known monsters */
7587                         grp_idx[grp_cnt++] = i;
7588                 }
7589         }
7590
7591         /* Terminate the list */
7592         grp_idx[grp_cnt] = -1;
7593
7594         old_grp_cur = -1;
7595         grp_cur = grp_top = 0;
7596         mon_cur = mon_top = 0;
7597         mon_cnt = 0;
7598
7599         flag = FALSE;
7600         redraw = TRUE;
7601
7602         while (!flag)
7603         {
7604                 char ch;
7605                 monster_race *r_ptr;
7606
7607                 if (redraw)
7608                 {
7609                         clear_from(0);
7610                 
7611 #ifdef JP
7612                         prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0);
7613                         prt("¥°¥ë¡¼¥×", 4, 0);
7614                         prt("̾Á°", 4, max + 3);
7615                         if (p_ptr->wizard) prt("Idx", 4, 60);
7616                         prt("ʸ»ú »¦³²¿ô", 4, 67);
7617 #else
7618                         prt("Knowledge - Monsters", 2, 0);
7619                         prt("Group", 4, 0);
7620                         prt("Name", 4, max + 3);
7621                         if (p_ptr->wizard) prt("Idx", 4, 60);
7622                         prt("Sym   Kills", 4, 67);
7623 #endif
7624
7625                         for (i = 0; i < 78; i++)
7626                         {
7627                                 Term_putch(i, 5, TERM_WHITE, '=');
7628                         }
7629
7630                         for (i = 0; i < browser_rows; i++)
7631                         {
7632                                 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7633                         }
7634
7635                         redraw = FALSE;
7636                 }
7637
7638                 /* Scroll group list */
7639                 if (grp_cur < grp_top) grp_top = grp_cur;
7640                 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7641
7642                 /* Display a list of monster groups */
7643                 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
7644
7645                 if (old_grp_cur != grp_cur)
7646                 {
7647                         old_grp_cur = grp_cur;
7648
7649                         /* Get a list of monsters in the current group */
7650                         mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00);
7651                 }
7652
7653                 /* Scroll monster list */
7654                 while (mon_cur < mon_top)
7655                         mon_top = MAX(0, mon_top - browser_rows/2);
7656                 while (mon_cur >= mon_top + browser_rows)
7657                         mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2);
7658
7659                 if (!visual_list)
7660                 {
7661                         /* Display a list of monsters in the current group */
7662                         display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top);
7663                 }
7664                 else
7665                 {
7666                         mon_top = mon_cur;
7667
7668                         /* Display a monster name */
7669                         display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top);
7670
7671                         /* Display visual list below first monster */
7672                         display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7673                 }
7674
7675                 /* Prompt */
7676 #ifdef JP
7677                 prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7678 #else
7679                 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);
7680 #endif
7681
7682                 /* Get the current monster */
7683                 r_ptr = &r_info[mon_idx[mon_cur]];
7684
7685                 /* Mega Hack -- track this monster race */
7686                 if (mon_cnt) monster_race_track(mon_idx[mon_cur]);
7687
7688                 /* Hack -- handle stuff */
7689                 handle_stuff();
7690
7691                 if (visual_list)
7692                 {
7693                         place_visual_list_cursor(max + 3, 7, r_ptr->x_attr, r_ptr->x_char, attr_top, char_left);
7694                 }
7695                 else if (!column)
7696                 {
7697                         Term_gotoxy(0, 6 + (grp_cur - grp_top));
7698                 }
7699                 else
7700                 {
7701                         Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
7702                 }
7703
7704                 ch = inkey();
7705
7706                 /* Do visual mode command if needed */
7707                 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, need_redraw)) continue;
7708
7709                 switch (ch)
7710                 {
7711                         case ESCAPE:
7712                         {
7713                                 flag = TRUE;
7714                                 break;
7715                         }
7716
7717                         case 'R':
7718                         case 'r':
7719                         {
7720                                 /* Recall on screen */
7721                                 if (mon_idx[mon_cur])
7722                                 {
7723                                         screen_roff(mon_idx[mon_cur], 0);
7724
7725                                         (void)inkey();
7726         
7727                                         redraw = TRUE;
7728                                 }
7729                                 break;
7730                         }
7731
7732                         default:
7733                         {
7734                                 /* Move the cursor */
7735                                 browser_cursor(ch, &column, &grp_cur, grp_cnt, &mon_cur, mon_cnt);
7736
7737                                 break;
7738                         }
7739                 }
7740         }
7741
7742         /* Free the "mon_idx" array */
7743         C_KILL(mon_idx, max_r_idx, s16b);
7744 }
7745
7746
7747 /*
7748  * Display the objects in a group.
7749  */
7750 static void display_object_list(int col, int row, int per_page, int object_idx[],
7751         int object_cur, int object_top)
7752 {
7753         int i;
7754
7755         /* Display lines until done */
7756         for (i = 0; i < per_page && object_idx[object_top + i]; i++)
7757         {
7758                 char o_name[80];
7759                 byte a, c;
7760
7761                 /* Get the object index */
7762                 int k_idx = object_idx[object_top + i];
7763
7764                 /* Access the object */
7765                 object_kind *k_ptr = &k_info[k_idx];
7766
7767                 /* Choose a color */
7768                 byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE);
7769                 byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE);
7770
7771                 attr = ((i + object_top == object_cur) ? cursor : attr);
7772                 
7773                 /* Tidy name */
7774                 strip_name(o_name, k_idx);
7775
7776                 /* Display the name */
7777                 c_prt(attr, o_name, row + i, col);
7778
7779                 /* Hack -- visual_list mode */
7780                 if (per_page == 1)
7781                 {
7782                         c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60);
7783                 }
7784                 else if (p_ptr->wizard)
7785                 {
7786                         c_prt(attr, format ("%d", k_idx), row + i, 70);
7787                 }
7788
7789                 a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr;
7790                 c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char;
7791
7792                 /* Symbol is unknown */ 
7793                 if (!k_ptr->aware && !p_ptr->wizard)
7794                 {
7795                         c = ' ';
7796                         a = TERM_DARK;
7797                 }
7798
7799                 /* Display symbol */
7800                 Term_queue_bigchar(76, row + i, a, c, 0, 0);
7801         }
7802
7803         /* Clear remaining lines */
7804         for (; i < per_page; i++)
7805         {
7806                 Term_erase(col, row + i, 255);
7807         }
7808 }
7809
7810 /*
7811  * Describe fake object
7812  */
7813 static void desc_obj_fake(int k_idx)
7814 {
7815         object_type *o_ptr;
7816         object_type object_type_body;
7817
7818         /* Get local object */
7819         o_ptr = &object_type_body;
7820
7821         /* Wipe the object */
7822         object_wipe(o_ptr);
7823
7824         /* Create the artifact */
7825         object_prep(o_ptr, k_idx);
7826
7827         /* It's fully know */
7828         o_ptr->ident |= IDENT_KNOWN;
7829
7830         /* Track the object */
7831         /* object_actual_track(o_ptr); */
7832
7833         /* Hack - mark as fake */
7834         /* term_obj_real = FALSE; */
7835
7836         /* Hack -- Handle stuff */
7837         handle_stuff();
7838
7839         if (!screen_object(o_ptr, FALSE))
7840         {
7841 #ifdef JP
7842                 msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
7843 #else
7844                 msg_print("You see nothing special.");
7845 #endif
7846                 msg_print(NULL);
7847         }
7848 }
7849
7850
7851
7852 /*
7853  * Display known objects
7854  */
7855 static void do_cmd_knowledge_objects(bool *need_redraw)
7856 {
7857         int i, len, max;
7858         int grp_cur, grp_top, old_grp_cur;
7859         int object_old, object_cur, object_top;
7860         int grp_cnt, grp_idx[100];
7861         int object_cnt;
7862         int *object_idx;
7863
7864         int column = 0;
7865         bool flag;
7866         bool redraw;
7867
7868         bool visual_list = FALSE;
7869         byte attr_top = 0, char_left = 0;
7870
7871         int browser_rows;
7872         int wid, hgt;
7873
7874         /* Get size */
7875         Term_get_size(&wid, &hgt);
7876
7877         browser_rows = hgt - 8;
7878
7879         /* Allocate the "object_idx" array */
7880         C_MAKE(object_idx, max_k_idx, int);
7881
7882         max = 0;
7883         grp_cnt = 0;
7884
7885         /* Check every group */
7886         for (i = 0; object_group_text[i] != NULL; i++)
7887         {
7888                 /* Measure the label */
7889                 len = strlen(object_group_text[i]);
7890
7891                 /* Save the maximum length */
7892                 if (len > max) max = len;
7893
7894                 /* See if any monsters are known */
7895                 if (collect_objects(i, object_idx))
7896                 {
7897                         /* Build a list of groups with known monsters */
7898                         grp_idx[grp_cnt++] = i;
7899                 }
7900         }
7901
7902         /* Terminate the list */
7903         grp_idx[grp_cnt] = -1;
7904
7905         old_grp_cur = -1;
7906         grp_cur = grp_top = 0;
7907         object_cur = object_top = 0;
7908         object_old = -1;
7909         object_cnt = 0;
7910
7911         flag = FALSE;
7912         redraw = TRUE;
7913
7914         while (!flag)
7915         {
7916                 char ch;
7917                 object_kind *k_ptr;
7918
7919                 if (redraw)
7920                 {
7921                         clear_from(0);
7922                 
7923 #ifdef JP
7924                         prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0);
7925                         prt("¥°¥ë¡¼¥×", 4, 0);
7926                         prt("̾Á°", 4, max + 3);
7927                         if (p_ptr->wizard) prt("Idx", 4, 70);
7928                         prt("ʸ»ú", 4, 75);
7929 #else
7930                         prt("Knowledge - objects", 2, 0);
7931                         prt("Group", 4, 0);
7932                         prt("Name", 4, max + 3);
7933                         if (p_ptr->wizard) prt("Idx", 4, 70);
7934                         prt("Sym", 4, 75);
7935 #endif
7936
7937                         for (i = 0; i < 78; i++)
7938                         {
7939                                 Term_putch(i, 5, TERM_WHITE, '=');
7940                         }
7941
7942                         for (i = 0; i < browser_rows; i++)
7943                         {
7944                                 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
7945                         }
7946
7947                         redraw = FALSE;
7948                 }
7949
7950                 /* Scroll group list */
7951                 if (grp_cur < grp_top) grp_top = grp_cur;
7952                 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
7953
7954                 /* Display a list of object groups */
7955                 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
7956
7957                 if (old_grp_cur != grp_cur)
7958                 {
7959                         old_grp_cur = grp_cur;
7960
7961                         /* Get a list of objects in the current group */
7962                         object_cnt = collect_objects(grp_idx[grp_cur], object_idx);
7963                 }
7964
7965                 /* Scroll object list */
7966                 while (object_cur < object_top)
7967                         object_top = MAX(0, object_top - browser_rows/2);
7968                 while (object_cur >= object_top + browser_rows)
7969                         object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2);
7970
7971                 if (!visual_list)
7972                 {
7973                         /* Display a list of objects in the current group */
7974                         display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top);
7975                 }
7976                 else
7977                 {
7978                         object_top = object_cur;
7979
7980                         /* Display a list of objects in the current group */
7981                         display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top);
7982
7983                         /* Display visual list below first object */
7984                         display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
7985                 }
7986
7987                 /* Get the current object */
7988                 k_ptr = &k_info[object_idx[object_cur]];
7989
7990                 /* Mega Hack -- track this object */
7991                 if (object_cnt) object_kind_track(object_idx[object_cur]);
7992
7993                 /* Prompt */
7994 #ifdef JP
7995                 prt(format("<Êý¸þ>, 'r'¤Ç¾ÜºÙ¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
7996 #else
7997                 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);
7998 #endif
7999
8000                 /* The "current" object changed */
8001                 if (object_old != object_idx[object_cur])
8002                 {
8003                         /* Hack -- handle stuff */
8004                         handle_stuff();
8005
8006                         /* Remember the "current" object */
8007                         object_old = object_idx[object_cur];
8008                 }
8009
8010                 if (visual_list)
8011                 {
8012                         place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left);
8013                 }
8014                 else if (!column)
8015                 {
8016                         Term_gotoxy(0, 6 + (grp_cur - grp_top));
8017                 }
8018                 else
8019                 {
8020                         Term_gotoxy(max + 3, 6 + (object_cur - object_top));
8021                 }
8022
8023                 ch = inkey();
8024
8025                 /* Do visual mode command if needed */
8026                 /* Symbol of objects with flavor cannot be changed */
8027                 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, need_redraw)) continue;
8028
8029                 switch (ch)
8030                 {
8031                         case ESCAPE:
8032                         {
8033                                 flag = TRUE;
8034                                 break;
8035                         }
8036
8037                         case 'R':
8038                         case 'r':
8039                         {
8040                                 /* Recall on screen */
8041                                 if (grp_cnt > 0)
8042                                         desc_obj_fake(object_idx[object_cur]);
8043
8044                                 redraw = TRUE;
8045                                 break;
8046                         }
8047
8048                         default:
8049                         {
8050                                 /* Move the cursor */
8051                                 browser_cursor(ch, &column, &grp_cur, grp_cnt, &object_cur, object_cnt);
8052                                 break;
8053                         }
8054                 }
8055         }
8056
8057         /* Free the "object_idx" array */
8058         C_KILL(object_idx, max_k_idx, int);
8059 }
8060
8061
8062 /*
8063  * Display the features in a group.
8064  */
8065 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
8066         int feat_cur, int feat_top, int lighting_level)
8067 {
8068         int i;
8069         int col2 = 67;
8070         int col3 = 69;
8071         int col4 = 71;
8072
8073         /* Correct columns 1 and 4 */
8074         if (use_bigtile)
8075         {
8076                 col2++; col3 += 2; col4 += 3;
8077         }
8078
8079         /* Display lines until done */
8080         for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
8081         {
8082                 byte attr;
8083
8084                 /* Get the index */
8085                 int f_idx = feat_idx[feat_top + i];
8086
8087                 /* Access the index */
8088                 feature_type *f_ptr = &f_info[f_idx];
8089
8090                 /* Choose a color */
8091                 attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
8092
8093                 /* Display the name */
8094                 c_prt(attr, f_name + f_ptr->name, row + i, col);
8095
8096                 /* Hack -- visual_list mode */
8097                 if (per_page == 1)
8098                 {
8099                         /* Display lighting level */
8100                         c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row + i, col + 1 + strlen(f_name + f_ptr->name));
8101
8102                         c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row + i, 56);
8103                 }
8104
8105                 /* Display symbol */
8106                 Term_queue_bigchar(65, row + i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0);
8107
8108                 Term_putch(col2, row + i, TERM_SLATE, '(');
8109                 Term_putch(col3, row + i, TERM_SLATE, '/');
8110                 Term_putch(col4, row + i, TERM_SLATE, '/');
8111                 Term_putch(col4 + (use_bigtile ? 3 : 2), row + i, TERM_SLATE, ')');
8112
8113                 /* Mega-hack */
8114
8115                 /* Use lightened colour */
8116                 Term_queue_bigchar(col2 + 1, row + i, f_ptr->x_attr[F_LIT_LITE], f_ptr->x_char[F_LIT_LITE], 0, 0);
8117
8118                 /* Use darkened colour */
8119                 Term_queue_bigchar(col3 + 1, row + i, f_ptr->x_attr[F_LIT_DARK], f_ptr->x_char[F_LIT_DARK], 0, 0);
8120
8121                 /* Use darkly darkened colour */
8122                 Term_queue_bigchar(col4 + 1, row + i, f_ptr->x_attr[F_LIT_DARKDARK], f_ptr->x_char[F_LIT_DARKDARK], 0, 0);
8123         }
8124
8125         /* Clear remaining lines */
8126         for (; i < per_page; i++)
8127         {
8128                 Term_erase(col, row + i, 255);
8129         }
8130 }
8131
8132
8133 /*
8134  * Interact with feature visuals.
8135  */
8136 static void do_cmd_knowledge_features(bool *need_redraw)
8137 {
8138         int i, len, max;
8139         int grp_cur, grp_top, old_grp_cur;
8140         int feat_cur, feat_top;
8141         int grp_cnt, grp_idx[100];
8142         int feat_cnt;
8143         int *feat_idx;
8144
8145         int column = 0;
8146         bool flag;
8147         bool redraw;
8148
8149         bool visual_list = FALSE;
8150         byte attr_top = 0, char_left = 0;
8151
8152         int browser_rows;
8153         int wid, hgt;
8154
8155         byte attr_old[F_LIT_MAX] = {0, 0, 0, 0};
8156         byte char_old[F_LIT_MAX] = {0, 0, 0, 0};
8157         byte *cur_attr_ptr, *cur_char_ptr;
8158         int lighting_level = F_LIT_STANDARD;
8159
8160         /* Get size */
8161         Term_get_size(&wid, &hgt);
8162
8163         browser_rows = hgt - 8;
8164
8165         /* Allocate the "feat_idx" array */
8166         C_MAKE(feat_idx, max_f_idx, int);
8167
8168         max = 0;
8169         grp_cnt = 0;
8170
8171         /* Check every group */
8172         for (i = 0; feature_group_text[i] != NULL; i++)
8173         {
8174                 /* Measure the label */
8175                 len = strlen(feature_group_text[i]);
8176
8177                 /* Save the maximum length */
8178                 if (len > max) max = len;
8179
8180                 /* See if any features are known */
8181                 if (collect_features(i, feat_idx))
8182                 {
8183                         /* Build a list of groups with known features */
8184                         grp_idx[grp_cnt++] = i;
8185                 }
8186         }
8187
8188         /* Terminate the list */
8189         grp_idx[grp_cnt] = -1;
8190
8191         old_grp_cur = -1;
8192         grp_cur = grp_top = 0;
8193         feat_cur = feat_top = 0;
8194         feat_cnt = 0;
8195
8196         flag = FALSE;
8197         redraw = TRUE;
8198
8199         while ((!flag) && (grp_cnt))
8200         {
8201                 char ch;
8202                 feature_type *f_ptr;
8203
8204                 if (redraw)
8205                 {
8206                         clear_from(0);
8207
8208 #ifdef JP
8209                         prt("ɽ¼¨ - ÃÏ·Á", 2, 0);
8210                         prt("¥°¥ë¡¼¥×", 4, 0);
8211                         prt("̾Á°", 4, max + 3);
8212                         if (use_bigtile) prt("ʸ»ú ( l/ d/ D)", 4, 63);
8213                         else prt("ʸ»ú (l/d/D)", 4, 62);
8214 #else
8215                         prt("Visuals - features", 2, 0);
8216                         prt("Group", 4, 0);
8217                         prt("Name", 4, max + 3);
8218                         if (use_bigtile) prt("Sym ( l/ d/ D)", 4, 64);
8219                         else prt("Sym (l/d/D)", 4, 63);
8220 #endif
8221
8222                         for (i = 0; i < 78; i++)
8223                         {
8224                                 Term_putch(i, 5, TERM_WHITE, '=');
8225                         }
8226
8227                         for (i = 0; i < browser_rows; i++)
8228                         {
8229                                 Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
8230                         }
8231
8232                         redraw = FALSE;
8233                 }
8234
8235                 /* Scroll group list */
8236                 if (grp_cur < grp_top) grp_top = grp_cur;
8237                 if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
8238
8239                 /* Display a list of feature groups */
8240                 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
8241
8242                 if (old_grp_cur != grp_cur)
8243                 {
8244                         old_grp_cur = grp_cur;
8245
8246                         /* Get a list of features in the current group */
8247                         feat_cnt = collect_features(grp_idx[grp_cur], feat_idx);
8248                 }
8249
8250                 /* Scroll feature list */
8251                 while (feat_cur < feat_top)
8252                         feat_top = MAX(0, feat_top - browser_rows/2);
8253                 while (feat_cur >= feat_top + browser_rows)
8254                         feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2);
8255
8256                 if (!visual_list)
8257                 {
8258                         /* Display a list of features in the current group */
8259                         display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, F_LIT_STANDARD);
8260                 }
8261                 else
8262                 {
8263                         feat_top = feat_cur;
8264
8265                         /* Display a list of features in the current group */
8266                         display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, lighting_level);
8267
8268                         /* Display visual list below first object */
8269                         display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
8270                 }
8271
8272                 /* Prompt */
8273 #ifdef JP
8274                 prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê, 'a'¤ÇÂоÝÌÀÅÙÊѹ¹" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
8275 #else
8276                 prt(format("<dir>%s%s, ESC", visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
8277 #endif
8278
8279                 /* Get the current feature */
8280                 f_ptr = &f_info[feat_idx[feat_cur]];
8281                 cur_attr_ptr = &f_ptr->x_attr[lighting_level];
8282                 cur_char_ptr = &f_ptr->x_char[lighting_level];
8283
8284                 if (visual_list)
8285                 {
8286                         place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
8287                 }
8288                 else if (!column)
8289                 {
8290                         Term_gotoxy(0, 6 + (grp_cur - grp_top));
8291                 }
8292                 else
8293                 {
8294                         Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
8295                 }
8296
8297                 ch = inkey();
8298
8299                 if ((ch == 'A') && visual_list)
8300                 {
8301                         if (lighting_level <= F_LIT_STANDARD) lighting_level = F_LIT_DARKDARK;
8302                         else lighting_level--;
8303                         attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
8304                         char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
8305                         continue;
8306                 }
8307
8308                 else if ((ch == 'a') && visual_list)
8309                 {
8310                         if (lighting_level >= F_LIT_DARKDARK) lighting_level = F_LIT_STANDARD;
8311                         else lighting_level++;
8312                         attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
8313                         char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
8314                         continue;
8315                 }
8316
8317                 /* Do visual mode command if needed */
8318                 else if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, cur_attr_ptr, cur_char_ptr, need_redraw))
8319                 {
8320                         switch (ch)
8321                         {
8322                         /* Restore previous visual settings */
8323                         case ESCAPE:
8324                                 for (i = 0; i < F_LIT_MAX; i++)
8325                                 {
8326                                         f_ptr->x_attr[i] = attr_old[i];
8327                                         f_ptr->x_char[i] = char_old[i];
8328                                 }
8329
8330                                 /* Fall through */
8331
8332                         case '\n':
8333                         case '\r':
8334                                 lighting_level = F_LIT_STANDARD;
8335                                 break;
8336
8337                         /* Preserve current visual settings */
8338                         case 'V':
8339                         case 'v':
8340                                 for (i = 0; i < F_LIT_MAX; i++)
8341                                 {
8342                                         attr_old[i] = f_ptr->x_attr[i];
8343                                         char_old[i] = f_ptr->x_char[i];
8344                                 }
8345                                 lighting_level = F_LIT_STANDARD;
8346                                 break;
8347
8348                         case 'C':
8349                         case 'c':
8350                                 if (!visual_list)
8351                                 {
8352                                         for (i = 0; i < F_LIT_MAX; i++)
8353                                         {
8354                                                 attr_idx_feat[i] = f_ptr->x_attr[i];
8355                                                 char_idx_feat[i] = f_ptr->x_char[i];
8356                                         }
8357                                 }
8358                                 break;
8359
8360                         case 'P':
8361                         case 'p':
8362                                 if (!visual_list)
8363                                 {
8364                                         /* Allow ATTR_DARK text */
8365                                         for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
8366                                         {
8367                                                 if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
8368                                                 if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
8369                                         }
8370                                 }
8371                                 break;
8372                         }
8373                         continue;
8374                 }
8375
8376                 switch (ch)
8377                 {
8378                         case ESCAPE:
8379                         {
8380                                 flag = TRUE;
8381                                 break;
8382                         }
8383
8384                         default:
8385                         {
8386                                 /* Move the cursor */
8387                                 browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
8388                                 break;
8389                         }
8390                 }
8391         }
8392
8393         /* Prompt */
8394         if (!grp_cnt) msg_print("No features known.");
8395
8396         /* Free the "feat_idx" array */
8397         C_KILL(feat_idx, max_f_idx, int);
8398 }
8399
8400
8401 /*
8402  * List wanted monsters
8403  */
8404 static void do_cmd_knowledge_kubi(void)
8405 {
8406         int i;
8407         FILE *fff;
8408         
8409         char file_name[1024];
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                 bool listed = FALSE;
8427
8428 #ifdef JP
8429                 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
8430                 fprintf(fff, "\n");
8431                 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
8432 #else
8433                 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
8434                 fprintf(fff, "\n");
8435                 fprintf(fff, "List of wanted monsters\n");
8436 #endif
8437                 fprintf(fff, "----------------------------------------------\n");
8438
8439                 for (i = 0; i < MAX_KUBI; i++)
8440                 {
8441                         if (kubi_r_idx[i] <= 10000)
8442                         {
8443                                 fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
8444
8445                                 listed = TRUE;
8446                         }
8447                 }
8448
8449                 if (!listed)
8450                 {
8451 #ifdef JP
8452                         fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
8453 #else
8454                         fprintf(fff,"\n%s\n", "There is no more wanted monster.");
8455 #endif
8456                 }
8457         }
8458         
8459         /* Close the file */
8460         my_fclose(fff);
8461         
8462         /* Display the file contents */
8463 #ifdef JP
8464         show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
8465 #else
8466         show_file(TRUE, file_name, "Wanted monsters", 0, 0);
8467 #endif
8468
8469         
8470         /* Remove the file */
8471         fd_kill(file_name);
8472 }
8473
8474 /*
8475  * List virtues & status
8476  */
8477 static void do_cmd_knowledge_virtues(void)
8478 {
8479         FILE *fff;
8480         
8481         char file_name[1024];
8482         
8483         
8484         /* Open a new file */
8485         fff = my_fopen_temp(file_name, 1024);
8486         if (!fff) {
8487 #ifdef JP
8488             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8489 #else
8490             msg_format("Failed to create temporary file %s.", file_name);
8491 #endif
8492             msg_print(NULL);
8493             return;
8494         }
8495         
8496         if (fff)
8497         {
8498 #ifdef JP
8499                 fprintf(fff, "¸½ºß¤Î°À­ : %s\n\n", your_alignment());
8500 #else
8501                 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
8502 #endif
8503                 dump_virtues(fff);
8504         }
8505         
8506         /* Close the file */
8507         my_fclose(fff);
8508         
8509         /* Display the file contents */
8510 #ifdef JP
8511         show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
8512 #else
8513         show_file(TRUE, file_name, "Virtues", 0, 0);
8514 #endif
8515
8516         
8517         /* Remove the file */
8518         fd_kill(file_name);
8519 }
8520
8521 /*
8522 * Dungeon
8523 *
8524 */
8525 static void do_cmd_knowledge_dungeon(void)
8526 {
8527         FILE *fff;
8528         
8529         char file_name[1024];
8530         int i;
8531         
8532         
8533         /* Open a new file */
8534         fff = my_fopen_temp(file_name, 1024);
8535         if (!fff) {
8536 #ifdef JP
8537             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8538 #else
8539             msg_format("Failed to create temporary file %s.", file_name);
8540 #endif
8541             msg_print(NULL);
8542             return;
8543         }
8544         
8545         if (fff)
8546         {
8547                 for (i = 1; i < max_d_idx; i++)
8548                 {
8549                         bool seiha = FALSE;
8550
8551                         if (!d_info[i].maxdepth) continue;
8552                         if (!max_dlv[i]) continue;
8553                         if (d_info[i].final_guardian)
8554                         {
8555                                 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
8556                         }
8557                         else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
8558 #ifdef JP
8559                         fprintf(fff,"%c%-12s :  %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8560 #else
8561                         fprintf(fff,"%c%-16s :  level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
8562 #endif
8563                 }
8564         }
8565         
8566         /* Close the file */
8567         my_fclose(fff);
8568         
8569         /* Display the file contents */
8570 #ifdef JP
8571         show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
8572 #else
8573         show_file(TRUE, file_name, "Dungeon", 0, 0);
8574 #endif
8575
8576         
8577         /* Remove the file */
8578         fd_kill(file_name);
8579 }
8580
8581 /*
8582 * List virtues & status
8583 *
8584 */
8585 static void do_cmd_knowledge_stat(void)
8586 {
8587         FILE *fff;
8588         
8589         char file_name[1024];
8590         int percent, v_nr;
8591         
8592         /* Open a new file */
8593         fff = my_fopen_temp(file_name, 1024);
8594         if (!fff) {
8595 #ifdef JP
8596             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
8597 #else
8598             msg_format("Failed to create temporary file %s.", file_name);
8599 #endif
8600             msg_print(NULL);
8601             return;
8602         }
8603         
8604         if (fff)
8605         {
8606                 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
8607                         (2 * p_ptr->hitdie +
8608                         ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
8609
8610 #ifdef JP
8611                 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
8612                 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
8613                 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
8614 #else
8615                 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
8616                 else fprintf(fff, "Your current Life Rating is ???.\n\n");
8617                 fprintf(fff, "Limits of maximum stats\n\n");
8618 #endif
8619                 for (v_nr = 0; v_nr < 6; v_nr++)
8620                 {
8621                         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);
8622                         else fprintf(fff, "%s ???\n", stat_names[v_nr]);
8623                 }
8624         }
8625
8626         dump_yourself(fff);
8627
8628         /* Close the file */
8629         my_fclose(fff);
8630         
8631         /* Display the file contents */
8632 #ifdef JP
8633         show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
8634 #else
8635         show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
8636 #endif
8637
8638         
8639         /* Remove the file */
8640         fd_kill(file_name);
8641 }
8642
8643
8644 /*
8645  * Print all active quests
8646  */
8647 static void do_cmd_knowledge_quests_current(FILE *fff)
8648 {
8649         char tmp_str[120];
8650         char rand_tmp_str[120] = "\0";
8651         char name[80];
8652         monster_race *r_ptr;
8653         int i;
8654         int rand_level = 100;
8655         int total = 0;
8656
8657 #ifdef JP
8658         fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
8659 #else
8660         fprintf(fff, "< Current Quest >\n");
8661 #endif
8662
8663         for (i = 1; i < max_quests; i++)
8664         {
8665                 if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED))
8666                 {
8667                         /* Set the quest number temporary */
8668                         int old_quest = p_ptr->inside_quest;
8669                         int j;
8670
8671                         /* Clear the text */
8672                         for (j = 0; j < 10; j++) quest_text[j][0] = '\0';
8673                         quest_text_line = 0;
8674
8675                         p_ptr->inside_quest = i;
8676
8677                         /* Get the quest text */
8678                         init_flags = INIT_SHOW_TEXT;
8679
8680                         process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8681
8682                         /* Reset the old quest number */
8683                         p_ptr->inside_quest = old_quest;
8684
8685                         /* No info from "silent" quests */
8686                         if (quest[i].flags & QUEST_FLAG_SILENT) continue;
8687
8688                         total++;
8689
8690                         if (quest[i].type != QUEST_TYPE_RANDOM)
8691                         {
8692                                 char note[80] = "\0";
8693
8694                                 if (quest[i].status == QUEST_STATUS_TAKEN)
8695                                 {
8696                                         switch (quest[i].type)
8697                                         {
8698                                         case QUEST_TYPE_KILL_LEVEL:
8699                                         case QUEST_TYPE_KILL_ANY_LEVEL:
8700                                                 r_ptr = &r_info[quest[i].r_idx];
8701                                                 strcpy(name, r_name + r_ptr->name);
8702                                                 if (quest[i].max_num > 1)
8703                                                 {
8704 #ifdef JP
8705                                                         sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8706                                                                 quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8707 #else
8708                                                         plural_aux(name);
8709                                                         sprintf(note," - kill %d %s, have killed %d.",
8710                                                                 quest[i].max_num, name, quest[i].cur_num);
8711 #endif
8712                                                 }
8713                                                 else
8714 #ifdef JP
8715                                                         sprintf(note," - %s¤òÅݤ¹¡£",name);
8716 #else
8717                                                         sprintf(note," - kill %s.",name);
8718 #endif
8719                                                 break;
8720
8721                                         case QUEST_TYPE_FIND_ARTIFACT:
8722                                                 strcpy(name, a_name + a_info[quest[i].k_idx].name);
8723 #ifdef JP
8724                                                 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
8725 #else
8726                                                 sprintf(note," - Find out %s.", name);
8727 #endif
8728                                                 break;
8729
8730                                         case QUEST_TYPE_FIND_EXIT:
8731 #ifdef JP
8732                                                 sprintf(note," - Ãµº÷¤¹¤ë¡£");
8733 #else
8734                                                 sprintf(note," - Search.");
8735 #endif
8736                                                 break;
8737
8738                                         case QUEST_TYPE_KILL_NUMBER:
8739 #ifdef JP
8740                                                 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",
8741                                                         quest[i].max_num, quest[i].max_num - quest[i].cur_num);
8742 #else
8743                                                 sprintf(note," - Kill %d monsters, have killed %d.",
8744                                                         quest[i].max_num, quest[i].cur_num);
8745 #endif
8746                                                 break;
8747
8748                                         case QUEST_TYPE_KILL_ALL:
8749 #ifdef JP
8750                                                 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
8751 #else
8752                                                 sprintf(note," - Kill all monsters.");
8753 #endif
8754                                                 break;
8755                                         }
8756                                 }
8757
8758                                 /* Print the quest info */
8759 #ifdef JP
8760                                 sprintf(tmp_str, "  %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
8761                                         quest[i].name, quest[i].level, note);
8762 #else
8763                                 sprintf(tmp_str, "  %s (Danger level: %d)%s\n",
8764                                         quest[i].name, quest[i].level, note);
8765 #endif
8766
8767                                 fprintf(fff, tmp_str);
8768
8769                                 if (quest[i].status == QUEST_STATUS_COMPLETED)
8770                                 {
8771 #ifdef JP
8772                                         sprintf(tmp_str, "    ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
8773 #else
8774                                         sprintf(tmp_str, "    Quest Completed - Unrewarded\n");
8775 #endif
8776                                         fprintf(fff, tmp_str);
8777                                 }
8778                                 else
8779                                 {
8780                                         j = 0;
8781
8782                                         while (quest_text[j][0] && j < 10)
8783                                         {
8784                                                 fprintf(fff, "    %s\n", quest_text[j]);
8785                                                 j++;
8786                                         }
8787                                 }
8788                         }
8789                         else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */
8790                         {
8791                                 /* New random */
8792                                 rand_level = quest[i].level;
8793
8794                                 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
8795                                 {
8796                                         /* Print the quest info */
8797                                         r_ptr = &r_info[quest[i].r_idx];
8798                                         strcpy(name, r_name + r_ptr->name);
8799
8800                                         if (quest[i].max_num > 1)
8801                                         {
8802 #ifdef JP
8803                                                 sprintf(rand_tmp_str,"  %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
8804                                                         quest[i].name, quest[i].level,
8805                                                         quest[i].max_num, name, quest[i].max_num - quest[i].cur_num);
8806 #else
8807                                                 plural_aux(name);
8808
8809                                                 sprintf(rand_tmp_str,"  %s (Dungeon level: %d)\n  Kill %d %s, have killed %d.\n",
8810                                                         quest[i].name, quest[i].level,
8811                                                         quest[i].max_num, name, quest[i].cur_num);
8812 #endif
8813                                         }
8814                                         else
8815                                         {
8816 #ifdef JP
8817                                                 sprintf(rand_tmp_str,"  %s (%d ³¬) - %s¤òÅݤ¹¡£\n",
8818                                                         quest[i].name, quest[i].level, name);
8819 #else
8820                                                 sprintf(rand_tmp_str,"  %s (Dungeon level: %d)\n  Kill %s.\n",
8821                                                         quest[i].name, quest[i].level, name);
8822 #endif
8823                                         }
8824                                 }
8825                         }
8826                 }
8827         }
8828
8829         /* Print the current random quest  */
8830         if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
8831
8832 #ifdef JP
8833         if (!total) fprintf(fff, "  ¤Ê¤·\n");
8834 #else
8835         if (!total) fprintf(fff, "  Nothing.\n");
8836 #endif
8837 }
8838
8839
8840 /*
8841  * Print all finished quests
8842  */
8843 void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
8844 {
8845         char tmp_str[120];
8846         int i;
8847         int total = 0;
8848
8849 #ifdef JP
8850         fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8851 #else
8852         fprintf(fff, "< Completed Quest >\n");
8853 #endif
8854         for (i = 1; i < max_quests; i++)
8855         {
8856                 int q_idx = quest_num[i];
8857
8858                 if (quest[q_idx].status == QUEST_STATUS_FINISHED)
8859                 {
8860                         if (is_fixed_quest_idx(q_idx))
8861                         {
8862                                 /* Set the quest number temporary */
8863                                 int old_quest = p_ptr->inside_quest;
8864
8865                                 p_ptr->inside_quest = q_idx;
8866
8867                                 /* Get the quest */
8868                                 init_flags = INIT_ASSIGN;
8869
8870                                 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8871
8872                                 /* Reset the old quest number */
8873                                 p_ptr->inside_quest = old_quest;
8874
8875                                 /* No info from "silent" quests */
8876                                 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8877                         }
8878
8879                         total++;
8880
8881                         if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8882                         {
8883                                 /* Print the quest info */
8884
8885                                 if (quest[q_idx].complev == 0)
8886                                 {
8887                                         sprintf(tmp_str,
8888 #ifdef JP
8889                                                 "  %-40s (%3d³¬)            -   ÉÔÀᄀ\n",
8890 #else
8891                                                 "  %-40s (Dungeon level: %3d) - (Cancelled)\n",
8892 #endif
8893                                                 r_name+r_info[quest[q_idx].r_idx].name,
8894                                                 quest[q_idx].level);
8895                                 }
8896                                 else
8897                                 {
8898                                         sprintf(tmp_str,
8899 #ifdef JP
8900                                                 "  %-40s (%3d³¬)            - ¥ì¥Ù¥ë%2d\n",
8901 #else
8902                                                 "  %-40s (Dungeon level: %3d) - level %2d\n",
8903 #endif
8904                                                 r_name+r_info[quest[q_idx].r_idx].name,
8905                                                 quest[q_idx].level,
8906                                                 quest[q_idx].complev);
8907                                 }
8908                         }
8909                         else
8910                         {
8911                                 /* Print the quest info */
8912 #ifdef JP
8913                                 sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8914                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8915 #else
8916                                 sprintf(tmp_str, "  %-40s (Danger  level: %3d) - level %2d\n",
8917                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8918 #endif
8919                         }
8920
8921                         fprintf(fff, tmp_str);
8922                 }
8923         }
8924 #ifdef JP
8925         if (!total) fprintf(fff, "  ¤Ê¤·\n");
8926 #else
8927         if (!total) fprintf(fff, "  Nothing.\n");
8928 #endif
8929 }
8930
8931
8932 /*
8933  * Print all failed quests
8934  */
8935 void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
8936 {
8937         char tmp_str[120];
8938         int i;
8939         int total = 0;
8940
8941 #ifdef JP
8942         fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
8943 #else
8944         fprintf(fff, "< Failed Quest >\n");
8945 #endif
8946         for (i = 1; i < max_quests; i++)
8947         {
8948                 int q_idx = quest_num[i];
8949
8950                 if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED))
8951                 {
8952                         if (is_fixed_quest_idx(q_idx))
8953                         {
8954                                 /* Set the quest number temporary */
8955                                 int old_quest = p_ptr->inside_quest;
8956
8957                                 p_ptr->inside_quest = q_idx;
8958
8959                                 /* Get the quest text */
8960                                 init_flags = INIT_ASSIGN;
8961
8962                                 process_dungeon_file("q_info.txt", 0, 0, 0, 0);
8963
8964                                 /* Reset the old quest number */
8965                                 p_ptr->inside_quest = old_quest;
8966
8967                                 /* No info from "silent" quests */
8968                                 if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue;
8969                         }
8970
8971                         total++;
8972
8973                         if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx)
8974                         {
8975                                 /* Print the quest info */
8976 #ifdef JP
8977                                 sprintf(tmp_str, "  %-40s (%3d³¬)            - ¥ì¥Ù¥ë%2d\n",
8978                                         r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8979 #else
8980                                 sprintf(tmp_str, "  %-40s (Dungeon level: %3d) - level %2d\n",
8981                                         r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
8982 #endif
8983                         }
8984                         else
8985                         {
8986                                 /* Print the quest info */
8987 #ifdef JP
8988                                 sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
8989                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8990 #else
8991                                 sprintf(tmp_str, "  %-40s (Danger  level: %3d) - level %2d\n",
8992                                         quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
8993 #endif
8994                         }
8995                         fprintf(fff, tmp_str);
8996                 }
8997         }
8998 #ifdef JP
8999         if (!total) fprintf(fff, "  ¤Ê¤·\n");
9000 #else
9001         if (!total) fprintf(fff, "  Nothing.\n");
9002 #endif
9003 }
9004
9005
9006 /*
9007  * Print all random quests
9008  */
9009 static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
9010 {
9011         char tmp_str[120];
9012         int i;
9013         int total = 0;
9014
9015 #ifdef JP
9016         fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
9017 #else
9018         fprintf(fff, "< Remaining Random Quest >\n");
9019 #endif
9020         for (i = 1; i < max_quests; i++)
9021         {
9022                 /* No info from "silent" quests */
9023                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
9024
9025                 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
9026                 {
9027                         total++;
9028
9029                         /* Print the quest info */
9030 #ifdef JP
9031                         sprintf(tmp_str, "  %s (%d³¬, %s)\n",
9032                                 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9033 #else
9034                         sprintf(tmp_str, "  %s (%d, %s)\n",
9035                                 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
9036 #endif
9037                         fprintf(fff, tmp_str);
9038                 }
9039         }
9040 #ifdef JP
9041         if (!total) fprintf(fff, "  ¤Ê¤·\n");
9042 #else
9043         if (!total) fprintf(fff, "  Nothing.\n");
9044 #endif
9045 }
9046
9047
9048 bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
9049 {
9050         int *q_num = (int *)u;
9051         quest_type *qa = &quest[q_num[a]];
9052         quest_type *qb = &quest[q_num[b]];
9053
9054         /* Unused */
9055         (void)v;
9056
9057         if (qa->complev < qb->complev) return TRUE;
9058         if (qa->complev > qb->complev) return FALSE;
9059         if (qa->level <= qb->level) return TRUE;
9060         return FALSE;
9061 }
9062
9063 void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
9064 {
9065         int *q_num = (int *)u;
9066         int tmp;
9067
9068         /* Unused */
9069         (void)v;
9070
9071         tmp = q_num[a];
9072         q_num[a] = q_num[b];
9073         q_num[b] = tmp;
9074 }
9075
9076
9077 /*
9078  * Print quest status of all active quests
9079  */
9080 static void do_cmd_knowledge_quests(void)
9081 {
9082         FILE *fff;
9083         char file_name[1024];
9084         int *quest_num, dummy, i;
9085
9086         /* Open a new file */
9087         fff = my_fopen_temp(file_name, 1024);
9088         if (!fff)
9089         {
9090 #ifdef JP
9091             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9092 #else
9093             msg_format("Failed to create temporary file %s.", file_name);
9094 #endif
9095             msg_print(NULL);
9096             return;
9097         }
9098
9099         /* Allocate Memory */
9100         C_MAKE(quest_num, max_quests, int);
9101
9102         /* Sort by compete level */
9103         for (i = 1; i < max_quests; i++) quest_num[i] = i;
9104         ang_sort_comp = ang_sort_comp_quest_num;
9105         ang_sort_swap = ang_sort_swap_quest_num;
9106         ang_sort(quest_num, &dummy, max_quests);
9107
9108         /* Dump Quest Information */
9109         do_cmd_knowledge_quests_current(fff);
9110         fputc('\n', fff);
9111         do_cmd_knowledge_quests_completed(fff, quest_num);
9112         fputc('\n', fff);
9113         do_cmd_knowledge_quests_failed(fff, quest_num);
9114         if (p_ptr->wizard)
9115         {
9116                 fputc('\n', fff);
9117                 do_cmd_knowledge_quests_wiz_random(fff);
9118         }
9119
9120         /* Close the file */
9121         my_fclose(fff);
9122
9123         /* Display the file contents */
9124 #ifdef JP
9125         show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
9126 #else
9127         show_file(TRUE, file_name, "Quest status", 0, 0);
9128 #endif
9129
9130         /* Remove the file */
9131         fd_kill(file_name);
9132
9133         /* Free Memory */
9134         C_KILL(quest_num, max_quests, int);
9135 }
9136
9137
9138 /*
9139  * List my home
9140  */
9141 static void do_cmd_knowledge_home(void)
9142 {
9143         FILE *fff;
9144
9145         int i;
9146         char file_name[1024];
9147         store_type  *st_ptr;
9148         char o_name[MAX_NLEN];
9149         cptr            paren = ")";
9150
9151         process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x);
9152
9153         /* Open a new file */
9154         fff = my_fopen_temp(file_name, 1024);
9155         if (!fff) {
9156 #ifdef JP
9157                 msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9158 #else
9159                 msg_format("Failed to create temporary file %s.", file_name);
9160 #endif
9161                 msg_print(NULL);
9162                 return;
9163         }
9164
9165         if (fff)
9166         {
9167                 /* Print all homes in the different towns */
9168                 st_ptr = &town[1].store[STORE_HOME];
9169
9170                 /* Home -- if anything there */
9171                 if (st_ptr->stock_num)
9172                 {
9173 #ifdef JP
9174                         int x = 1;
9175 #endif
9176                         /* Header with name of the town */
9177 #ifdef JP
9178                         fprintf(fff, "  [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
9179 #else
9180                         fprintf(fff, "  [Home Inventory]\n");
9181 #endif
9182
9183                         /* Dump all available items */
9184                         for (i = 0; i < st_ptr->stock_num; i++)
9185                         {
9186 #ifdef JP
9187                                 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
9188                                 object_desc(o_name, &st_ptr->stock[i], 0);
9189                                 if (strlen(o_name) <= 80-3)
9190                                 {
9191                                         fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9192                                 }
9193                                 else
9194                                 {
9195                                         int n;
9196                                         char *t;
9197                                         for (n = 0, t = o_name; n < 80-3; n++, t++)
9198                                                 if(iskanji(*t)) {t++; n++;}
9199                                         if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
9200
9201                                         fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
9202                                         fprintf(fff, "   %.77s\n", o_name+n);
9203                                 }
9204 #else
9205                                 object_desc(o_name, &st_ptr->stock[i], 0);
9206                                 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
9207 #endif
9208
9209                         }
9210
9211                         /* Add an empty line */
9212                         fprintf(fff, "\n\n");
9213                 }
9214         }
9215
9216         /* Close the file */
9217         my_fclose(fff);
9218
9219         /* Display the file contents */
9220 #ifdef JP
9221         show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
9222 #else
9223         show_file(TRUE, file_name, "Home Inventory", 0, 0);
9224 #endif
9225
9226
9227         /* Remove the file */
9228         fd_kill(file_name);
9229 }
9230
9231
9232 /*
9233  * Check the status of "autopick"
9234  */
9235 static void do_cmd_knowledge_autopick(void)
9236 {
9237         int k;
9238         FILE *fff;
9239         char file_name[1024];
9240
9241         /* Open a new file */
9242         fff = my_fopen_temp(file_name, 1024);
9243
9244         if (!fff)
9245         {
9246 #ifdef JP
9247             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
9248 #else
9249             msg_format("Failed to create temporary file %s.", file_name);
9250 #endif
9251             msg_print(NULL);
9252             return;
9253         }
9254
9255         if (!max_autopick)
9256         {
9257 #ifdef JP
9258             fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
9259 #else
9260             fprintf(fff, "No preference for auto picker/destroyer.");
9261 #endif
9262         }
9263         else
9264         {
9265 #ifdef JP
9266             fprintf(fff, "   ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
9267 #else
9268             fprintf(fff, "   There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
9269 #endif
9270         }
9271
9272         for (k = 0; k < max_autopick; k++)
9273         {
9274                 cptr tmp;
9275                 byte act = autopick_list[k].action;
9276                 if (act & DONT_AUTOPICK)
9277                 {
9278 #ifdef JP
9279                         tmp = "ÊüÃÖ";
9280 #else
9281                         tmp = "Leave";
9282 #endif
9283                 }
9284                 else if (act & DO_AUTODESTROY)
9285                 {
9286 #ifdef JP
9287                         tmp = "Ç˲õ";
9288 #else
9289                         tmp = "Destroy";
9290 #endif
9291                 }
9292                 else if (act & DO_AUTOPICK)
9293                 {
9294 #ifdef JP
9295                         tmp = "½¦¤¦";
9296 #else
9297                         tmp = "Pickup";
9298 #endif
9299                 }
9300                 else /* if (act & DO_QUERY_AUTOPICK) */ /* Obvious */
9301                 {
9302 #ifdef JP
9303                         tmp = "³Îǧ";
9304 #else
9305                         tmp = "Query";
9306 #endif
9307                 }
9308
9309                 if (act & DO_DISPLAY)
9310                         fprintf(fff, "%11s", format("[%s]", tmp));
9311                 else
9312                         fprintf(fff, "%11s", format("(%s)", tmp));
9313
9314                 tmp = autopick_line_from_entry(&autopick_list[k]);
9315                 fprintf(fff, " %s", tmp);
9316                 string_free(tmp);
9317                 fprintf(fff, "\n");
9318         }
9319         /* Close the file */
9320         my_fclose(fff);
9321         /* Display the file contents */
9322 #ifdef JP
9323         show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
9324 #else
9325         show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
9326 #endif
9327
9328         /* Remove the file */
9329         fd_kill(file_name);
9330 }
9331
9332
9333 /*
9334  * Interact with "knowledge"
9335  */
9336 void do_cmd_knowledge(void)
9337 {
9338         int i, p = 0;
9339         bool need_redraw = FALSE;
9340
9341         /* File type is "TEXT" */
9342         FILE_TYPE(FILE_TYPE_TEXT);
9343
9344         /* Save the screen */
9345         screen_save();
9346
9347         /* Interact until done */
9348         while (1)
9349         {
9350                 /* Clear screen */
9351                 Term_clear();
9352
9353                 /* Ask for a choice */
9354 #ifdef JP
9355                 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
9356                 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
9357 #else
9358                 prt(format("page %d/2", (p+1)), 2, 65);
9359                 prt("Display current knowledge", 3, 0);
9360 #endif
9361
9362                 /* Give some choices */
9363 #ifdef JP
9364                 if (p == 0)
9365                 {
9366                         prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à                 ¤Î°ìÍ÷", 6, 5);
9367                         prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à                       ¤Î°ìÍ÷", 7, 5);
9368                         prt("(3) ´ûÃΤÎÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
9369                         prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼                     ¤Î°ìÍ÷", 9, 5);
9370                         prt("(5) Åݤ·¤¿Å¨¤Î¿ô                         ¤Î°ìÍ÷", 10, 5);
9371                         if (!vanilla_town) prt("(6) ¾Þ¶â¼ó                               ¤Î°ìÍ÷", 11, 5);
9372                         prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È                         ¤Î°ìÍ÷", 12, 5);
9373                         prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à                     ¤Î°ìÍ÷", 13, 5);
9374                         prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ­                 ¤Î°ìÍ÷", 14, 5);
9375                         prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë                ¤Î°ìÍ÷", 15, 5);
9376                 }
9377                 else
9378                 {
9379                         prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó                     ¤Î°ìÍ÷", 6, 5);
9380                         prt("(b) ÆÍÁ³ÊÑ°Û                             ¤Î°ìÍ÷", 7, 5);
9381                         prt("(c) Éð´ï¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 8, 5);
9382                         prt("(d) ËâË¡¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 9, 5);
9383                         prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 10, 5);
9384                         prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ                       ¤Î°ìÍ÷", 11, 5);
9385                         prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó                     ¤Î°ìÍ÷", 12, 5);
9386                         prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È                     ¤Î°ìÍ÷", 13, 5);
9387                         prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê              ¤Î°ìÍ÷", 14, 5);
9388                 }
9389 #else
9390                 if (p == 0)
9391                 {
9392                         prt("(1) Display known artifacts", 6, 5);
9393                         prt("(2) Display known objects", 7, 5);
9394                         prt("(3) Display remaining uniques", 8, 5);
9395                         prt("(4) Display known monster", 9, 5);
9396                         prt("(5) Display kill count", 10, 5);
9397                         if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
9398                         prt("(7) Display current pets", 12, 5);
9399                         prt("(8) Display home inventory", 13, 5);
9400                         prt("(9) Display *identified* equip.", 14, 5);
9401                         prt("(0) Display terrain symbols.", 15, 5);
9402                 }
9403                 else
9404                 {
9405                         prt("(a) Display about yourself", 6, 5);
9406                         prt("(b) Display mutations", 7, 5);
9407                         prt("(c) Display weapon proficiency", 8, 5);
9408                         prt("(d) Display spell proficiency", 9, 5);
9409                         prt("(e) Display misc. proficiency", 10, 5);
9410                         prt("(f) Display virtues", 11, 5);
9411                         prt("(g) Display dungeons", 12, 5);
9412                         prt("(h) Display current quests", 13, 5);
9413                         prt("(i) Display auto pick/destroy", 14, 5);
9414                 }
9415 #endif
9416                 /* Prompt */
9417 #ifdef JP
9418                 prt("-³¤¯-", 17, 8);
9419                 prt("ESC) È´¤±¤ë", 21, 1);
9420                 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
9421                 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
9422                 prt("¥³¥Þ¥ó¥É:", 20, 0);
9423 #else
9424                 prt("-more-", 17, 8);
9425                 prt("ESC) Exit menu", 21, 1);
9426                 prt("SPACE) Next page", 21, 30);
9427                 /*prt("-) Previous page", 21, 60);*/
9428                 prt("Command: ", 20, 0);
9429 #endif
9430
9431                 /* Prompt */
9432                 i = inkey();
9433
9434                 /* Done */
9435                 if (i == ESCAPE) break;
9436                 switch (i)
9437                 {
9438                 case ' ': /* Page change */
9439                 case '-':
9440                         p = 1 - p;
9441                         break;
9442                 case '1': /* Artifacts */
9443                         do_cmd_knowledge_artifacts();
9444                         break;
9445                 case '2': /* Objects */
9446                         do_cmd_knowledge_objects(&need_redraw);
9447                         break;
9448                 case '3': /* Uniques */
9449                         do_cmd_knowledge_uniques();
9450                         break;
9451                 case '4': /* Monsters */
9452                         do_cmd_knowledge_monsters(&need_redraw);
9453                         break;
9454                 case '5': /* Kill count  */
9455                         do_cmd_knowledge_kill_count();
9456                         break;
9457                 case '6': /* wanted */
9458                         if (!vanilla_town) do_cmd_knowledge_kubi();
9459                         break;
9460                 case '7': /* Pets */
9461                         do_cmd_knowledge_pets();
9462                         break;
9463                 case '8': /* Home */
9464                         do_cmd_knowledge_home();
9465                         break;
9466                 case '9': /* Resist list */
9467                         do_cmd_knowledge_inven();
9468                         break;
9469                 case '0': /* Feature list */
9470                         do_cmd_knowledge_features(&need_redraw);
9471                         break;
9472                 /* Next page */
9473                 case 'a': /* Max stat */
9474                         do_cmd_knowledge_stat();
9475                         break;
9476                 case 'b': /* Mutations */
9477                         do_cmd_knowledge_mutations();
9478                         break;
9479                 case 'c': /* weapon-exp */
9480                         do_cmd_knowledge_weapon_exp();
9481                         break;
9482                 case 'd': /* spell-exp */
9483                         do_cmd_knowledge_spell_exp();
9484                         break;
9485                 case 'e': /* skill-exp */
9486                         do_cmd_knowledge_skill_exp();
9487                         break;
9488                 case 'f': /* Virtues */
9489                         do_cmd_knowledge_virtues();
9490                         break;
9491                 case 'g': /* Dungeon */
9492                         do_cmd_knowledge_dungeon();
9493                         break;
9494                 case 'h': /* Quests */
9495                         do_cmd_knowledge_quests();
9496                         break;
9497                 case 'i': /* Autopick */
9498                         do_cmd_knowledge_autopick();
9499                         break;
9500                 default: /* Unknown option */
9501                         bell();
9502                 }
9503
9504                 /* Flush messages */
9505                 msg_print(NULL);
9506         }
9507
9508         /* Restore the screen */
9509         screen_load();
9510
9511         if (need_redraw) do_cmd_redraw();
9512 }
9513
9514
9515 /*
9516  * Check on the status of an active quest
9517  */
9518 void do_cmd_checkquest(void)
9519 {
9520         /* File type is "TEXT" */
9521         FILE_TYPE(FILE_TYPE_TEXT);
9522
9523         /* Save the screen */
9524         screen_save();
9525
9526         /* Quest info */
9527         do_cmd_knowledge_quests();
9528
9529         /* Restore the screen */
9530         screen_load();
9531 }
9532
9533
9534 /*
9535  * Display the time and date
9536  */
9537 void do_cmd_time(void)
9538 {
9539         int day, hour, min, full, start, end, num;
9540         char desc[1024];
9541
9542         char buf[1024];
9543
9544         FILE *fff;
9545
9546         extract_day_hour_min(&day, &hour, &min);
9547
9548         full = hour * 100 + min;
9549
9550         start = 9999;
9551         end = -9999;
9552
9553         num = 0;
9554
9555 #ifdef JP
9556         strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
9557 #else
9558         strcpy(desc, "It is a strange time.");
9559 #endif
9560
9561
9562         /* Message */
9563 #ifdef JP
9564         msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
9565                    day, (hour % 12 == 0) ? 12 : (hour % 12),
9566                    min, (hour < 12) ? "AM" : "PM");
9567 #else
9568         msg_format("This is day %d. The time is %d:%02d %s.",
9569                    day, (hour % 12 == 0) ? 12 : (hour % 12),
9570                    min, (hour < 12) ? "AM" : "PM");
9571 #endif
9572
9573
9574         /* Find the path */
9575         if (!randint0(10) || p_ptr->image)
9576         {
9577 #ifdef JP
9578                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun_j.txt");
9579 #else
9580                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timefun.txt");
9581 #endif
9582
9583         }
9584         else
9585         {
9586 #ifdef JP
9587                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm_j.txt");
9588 #else
9589                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "timenorm.txt");
9590 #endif
9591
9592         }
9593
9594         /* Open this file */
9595         fff = my_fopen(buf, "rt");
9596
9597         /* Oops */
9598         if (!fff) return;
9599
9600         /* Find this time */
9601         while (!my_fgets(fff, buf, sizeof(buf)))
9602         {
9603                 /* Ignore comments */
9604                 if (!buf[0] || (buf[0] == '#')) continue;
9605
9606                 /* Ignore invalid lines */
9607                 if (buf[1] != ':') continue;
9608
9609                 /* Process 'Start' */
9610                 if (buf[0] == 'S')
9611                 {
9612                         /* Extract the starting time */
9613                         start = atoi(buf + 2);
9614
9615                         /* Assume valid for an hour */
9616                         end = start + 59;
9617
9618                         /* Next... */
9619                         continue;
9620                 }
9621
9622                 /* Process 'End' */
9623                 if (buf[0] == 'E')
9624                 {
9625                         /* Extract the ending time */
9626                         end = atoi(buf + 2);
9627
9628                         /* Next... */
9629                         continue;
9630                 }
9631
9632                 /* Ignore incorrect range */
9633                 if ((start > full) || (full > end)) continue;
9634
9635                 /* Process 'Description' */
9636                 if (buf[0] == 'D')
9637                 {
9638                         num++;
9639
9640                         /* Apply the randomizer */
9641                         if (!randint0(num)) strcpy(desc, buf + 2);
9642
9643                         /* Next... */
9644                         continue;
9645                 }
9646         }
9647
9648         /* Message */
9649         msg_print(desc);
9650
9651         /* Close the file */
9652         my_fclose(fff);
9653 }