OSDN Git Service

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