OSDN Git Service

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