OSDN Git Service

0801e5919fb1fc64f469bc5bf9a3d4b47ff7ecaf
[hengbandforosx/hengbandosx.git] / src / cmd4.c
1 /* File: cmd4.c */
2
3 /* Purpose: Interface commands */
4
5 /*
6  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
7  *
8  * This software may be copied and distributed for educational, research, and
9  * not for profit purposes provided that this copyright and statement are
10  * included in all such copies.
11  */
12
13 #include "angband.h"
14
15
16 /*
17  *  mark strings for auto dump
18  */
19 static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv";
20 static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^";
21
22 /*
23  * Remove old lines automatically generated before.
24  */
25 static void remove_auto_dump(cptr orig_file, cptr mark)
26 {
27         FILE *tmp_fff, *orig_fff;
28
29         char tmp_file[1024];
30         char buf[1024];
31         bool between_mark = FALSE;
32         bool success = FALSE;
33         int line_num = 0;
34         long header_location = 0;
35         char header_mark_str[80];
36         char footer_mark_str[80];
37         size_t mark_len;
38
39         sprintf(header_mark_str, auto_dump_header, mark);
40         sprintf(footer_mark_str, auto_dump_footer, mark);
41
42         mark_len = strlen(footer_mark_str);
43
44         /* If original file is not exist, nothing to do */
45         orig_fff = my_fopen(orig_file, "r");
46         if (!orig_fff)
47         {
48                 return;
49         }
50
51         /* Open a new file */
52         tmp_fff = my_fopen_temp(tmp_file, 1024);
53         if (!tmp_fff) {
54 #ifdef JP
55             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", tmp_file);
56 #else
57             msg_format("Failed to create temporary file %s.", tmp_file);
58 #endif
59             msg_print(NULL);
60             return;
61         }
62         
63         while (1)
64         {
65                 if (my_fgets(orig_fff, buf, 1024))
66                 {
67                         if (between_mark)
68                         {
69                                 fseek(orig_fff, header_location, SEEK_SET);
70                                 between_mark = FALSE;
71                                 continue;
72                         }
73                         else
74                         {
75                                 break;
76                         }
77                 }
78
79                 if (!between_mark)
80                 {
81                         if (!strcmp(buf, header_mark_str))
82                         {
83                                 header_location = ftell(orig_fff);
84                                 line_num = 0;
85                                 between_mark = TRUE;
86                                 success = TRUE;
87                         }
88                         else
89                         {
90                                 fprintf(tmp_fff, "%s\n", buf);
91                         }
92                 }
93                 else
94                 {
95                         if (!strncmp(buf, footer_mark_str, mark_len))
96                         {
97                                 int tmp;
98
99                                 if (!sscanf(buf + mark_len, " (%d)", &tmp)
100                                     || tmp != line_num)
101                                 {
102                                         fseek(orig_fff, header_location, SEEK_SET);
103                                 }
104
105                                 between_mark = FALSE;
106                         }
107                         else
108                         {
109                                 line_num++;
110                         }
111                 }
112         }
113         my_fclose(orig_fff);
114         my_fclose(tmp_fff);
115
116         if (success)
117         {
118                 /* copy contents of temporally file */
119
120                 tmp_fff = my_fopen(tmp_file, "r");
121                 orig_fff = my_fopen(orig_file, "w");
122                 
123                 while (!my_fgets(tmp_fff, buf, 1024))
124                         fprintf(orig_fff, "%s\n", buf);
125                 
126                 my_fclose(orig_fff);
127                 my_fclose(tmp_fff);
128         }
129         fd_kill(tmp_file);
130
131         return;
132 }
133
134 /*
135  *  Open file to append auto dump.
136  */
137 static FILE *open_auto_dump(cptr buf, cptr mark, int *line)
138 {
139         FILE *fff;
140
141         char header_mark_str[80];
142
143         /* Drop priv's */
144         safe_setuid_drop();
145
146         sprintf(header_mark_str, auto_dump_header, mark);
147
148         /* Remove old macro dumps */
149         remove_auto_dump(buf, mark);
150
151         /* Append to the file */
152         fff = my_fopen(buf, "a");
153
154         /* Failure */
155         if (!fff) {
156 #ifdef JP
157                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
158 #else
159                 msg_format("Failed to open %s.", buf);
160 #endif
161                 msg_print(NULL);
162
163                 /* Grab priv's */
164                 safe_setuid_grab();
165                 
166                 return NULL;
167         }
168
169         /* Start dumping */
170         fprintf(fff, "%s\n", header_mark_str);
171
172 #ifdef JP
173         fprintf(fff, "# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
174         fprintf(fff, "# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
175 #else
176         fprintf(fff, "# *Warning!!* The lines below are automatic dump.\n");
177         fprintf(fff, "# *Warning!!* Don't edit these! These lines will be deleted automaticaly.\n");
178 #endif
179         *line = 2;
180
181         return fff;
182 }
183
184 /*
185  *  Append foot part and close auto dump.
186  */
187 static void close_auto_dump(FILE *fff, cptr mark, int line_num)
188 {
189         char footer_mark_str[80];
190
191         sprintf(footer_mark_str, auto_dump_footer, mark);
192
193         /* End of dumping */
194 #ifdef JP
195         fprintf(fff, "# *·Ù¹ð!!* °Ê¾å¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n");
196         fprintf(fff, "# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n");
197 #else
198         fprintf(fff, "# *Warning!!* The lines above are automatic dump.\n");
199         fprintf(fff, "# *Warning!!* Don't edit these! These lines will be deleted automaticaly.\n");
200 #endif
201         line_num += 2;
202
203         fprintf(fff, "%s (%d)\n", footer_mark_str, line_num);
204
205         my_fclose(fff);
206
207         /* Grab priv's */
208         safe_setuid_grab();
209                 
210         return;
211 }
212
213
214 /*
215  *   Take note to the dialy.
216  */
217
218 errr do_cmd_write_nikki(int type, int num, cptr note)
219 {
220         int day, hour, min;
221         FILE *fff = NULL;
222         char file_name[80];
223         char buf[1024];
224         cptr note_level = "";
225         bool do_level = TRUE;
226
227         static bool disable_nikki = FALSE;
228
229         extract_day_hour_min(&day, &hour, &min);
230
231         if (disable_nikki) return(-1);
232
233         if (type == NIKKI_FIX_QUEST_C ||
234             type == NIKKI_FIX_QUEST_F ||
235             type == NIKKI_RAND_QUEST_C ||
236             type == NIKKI_RAND_QUEST_F ||
237             type == NIKKI_TO_QUEST)
238         {
239                 int old_quest;
240
241                 old_quest = p_ptr->inside_quest;
242                 p_ptr->inside_quest = (quest[num].type == QUEST_TYPE_RANDOM) ? 0 : num;
243
244                 /* Get the quest text */
245                 init_flags = INIT_ASSIGN;
246
247                 process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
248
249                 /* Reset the old quest number */
250                 p_ptr->inside_quest = old_quest;
251         }
252
253 #ifdef JP
254         sprintf(file_name,"playrecord-%s.txt",savefile_base);
255 #else
256         /* different filne name to avoid mixing */
257         sprintf(file_name,"playrec-%s.txt",savefile_base);
258 #endif
259
260         /* Hack -- drop permissions */
261         safe_setuid_drop();
262
263         /* Build the filename */
264         path_build(buf, 1024, ANGBAND_DIR_USER, file_name);
265
266         /* File type is "TEXT" */
267         FILE_TYPE(FILE_TYPE_TEXT);
268
269         fff = my_fopen(buf, "a");
270
271         /* Failure */
272         if (!fff)
273         {
274                 /* Hack -- grab permissions */
275                 safe_setuid_grab();
276 #ifdef JP
277                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£¥×¥ì¥¤µ­Ï¿¤ò°ì»þÄä»ß¤·¤Þ¤¹¡£", buf);
278 #else
279                 msg_format("Failed to open %s. Play-Record is disabled temporally.", buf);
280 #endif
281                 msg_format(NULL);
282                 disable_nikki=TRUE;
283                 return (-1);
284         }
285
286         if (write_level)
287         {
288                 if (p_ptr->inside_arena)
289 #ifdef JP
290                         note_level = "¥¢¥ê¡¼¥Ê:";
291 #else
292                         note_level = "Arane:";
293 #endif
294                 else if (!dun_level)
295 #ifdef JP
296                         note_level = "ÃϾå:";
297 #else
298                         note_level = "Surface:";
299 #endif
300                 else if (quest_number(dun_level) && ((quest_number(dun_level) < MIN_RANDOM_QUEST) && !(quest_number(dun_level) == QUEST_OBERON || quest_number(dun_level) == QUEST_SERPENT)))
301 #ifdef JP
302                         note_level = "¥¯¥¨¥¹¥È:";
303 #else
304                         note_level = "Quest:";
305 #endif
306                 else
307 #ifdef JP
308                         note_level = format("%d³¬(%s):", dun_level, d_name+d_info[dungeon_type].name);
309 #else
310                         note_level = format("%s L%d:", d_name+d_info[dungeon_type].name, dun_level);
311 #endif
312         }
313
314         switch(type)
315         {
316                 case NIKKI_HIGAWARI:
317                 {
318 #ifdef JP
319                         fprintf(fff, "%dÆüÌÜ\n",day);
320 #else
321                         fprintf(fff, "Day %d\n",day);
322 #endif
323                         do_level = FALSE;
324                         break;
325                 }
326                 case NIKKI_BUNSHOU:
327                 {
328                         if (num)
329                         {
330                                 fprintf(fff, "%s\n",note);
331                                 do_level = FALSE;
332                         }
333                         else
334                                 fprintf(fff, " %2d:%02d %20s %s\n",hour, min, note_level, note);
335                         break;
336                 }
337                 case NIKKI_ART:
338                 {
339 #ifdef JP
340                         fprintf(fff, " %2d:%02d %20s %s¤òȯ¸«¤·¤¿¡£\n", hour, min, note_level, note);
341 #else
342                         fprintf(fff, " %2d:%02d %20s discover %s.\n", hour, min, note_level, note);
343 #endif
344                         break;
345                 }
346                 case NIKKI_UNIQUE:
347                 {
348 #ifdef JP
349                         fprintf(fff, " %2d:%02d %20s %s¤òÅݤ·¤¿¡£\n", hour, min, note_level, note);
350 #else
351                         fprintf(fff, " %2d:%02d %20s defeated %s.\n", hour, min, note_level, note);
352 #endif
353                         break;
354                 }
355                 case NIKKI_FIX_QUEST_C:
356                 {
357                         if (quest[num].flags & QUEST_FLAG_SILENT) break;
358 #ifdef JP
359                         fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
360 #else
361                         fprintf(fff, " %2d:%02d %20s completed quest '%s'.\n", hour, min, note_level, quest[num].name);
362 #endif
363                         break;
364                 }
365                 case NIKKI_FIX_QUEST_F:
366                 {
367                         if (quest[num].flags & QUEST_FLAG_SILENT) break;
368 #ifdef JP
369                         fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤«¤éÌ¿¤«¤é¤¬¤éƨ¤²µ¢¤Ã¤¿¡£\n", hour, min, note_level, quest[num].name);
370 #else
371                         fprintf(fff, " %2d:%02d %20s run away from quest '%s'.\n", hour, min, note_level, quest[num].name);
372 #endif
373                         break;
374                 }
375                 case NIKKI_RAND_QUEST_C:
376                 {
377                         char name[80];
378                         strcpy(name, r_name+r_info[quest[num].r_idx].name);
379 #ifdef JP
380                         fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, name);
381 #else
382                         fprintf(fff, " %2d:%02d %20s completed randome quest '%s'\n", hour, min, note_level, name);
383 #endif
384                         break;
385                 }
386                 case NIKKI_RAND_QUEST_F:
387                 {
388                         char name[80];
389                         strcpy(name, r_name+r_info[quest[num].r_idx].name);
390 #ifdef JP
391                         fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤«¤éƨ¤²½Ð¤·¤¿¡£\n", hour, min, note_level, name);
392 #else
393                         fprintf(fff, " %2d:%02d %20s ran away from quest '%s'.\n", hour, min, note_level, name);
394 #endif
395                         break;
396                 }
397                 case NIKKI_MAXDEAPTH:
398                 {
399 #ifdef JP
400                         fprintf(fff, " %2d:%02d %20s %s¤ÎºÇ¿¼³¬%d³¬¤ËÅþ㤷¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, num);
401 #else
402                         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);
403 #endif
404                         break;
405                 }
406                 case NIKKI_TRUMP:
407                 {
408 #ifdef JP
409                         fprintf(fff, " %2d:%02d %20s %s%s¤ÎºÇ¿¼³¬¤ò%d³¬¤Ë¥»¥Ã¥È¤·¤¿¡£\n", hour, min, note_level, note, d_name + d_info[num].name, max_dlv[num]);
410 #else
411                         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);
412 #endif
413                         break;
414                 }
415                 case NIKKI_STAIR:
416                 {
417                         cptr to;
418                         if (quest_number(dun_level) && ((quest_number(dun_level) < MIN_RANDOM_QUEST) && !(quest_number(dun_level) == QUEST_OBERON || quest_number(dun_level) == QUEST_SERPENT)))
419                         {
420 #ifdef JP
421                                 to = "ÃϾå";
422 #else
423                                 to = "the surface";
424 #endif
425                         }
426                         else
427                         {
428 #ifdef JP
429                                 if (!(dun_level+num)) to = "ÃϾå";
430                                 else to = format("%d³¬", dun_level+num);
431 #else
432                                 if (!(dun_level+num)) to = "the surfice";
433                                 else to = format("level %d", dun_level+num);
434 #endif
435                         }
436                                 
437 #ifdef JP 
438                         fprintf(fff, " %2d:%02d %20s %s¤Ø%s¡£\n", hour, min, note_level, to, note);
439 #else
440                         fprintf(fff, " %2d:%02d %20s %s %s.\n", hour, min, note_level, note, to);
441 #endif
442                         break;
443                 }
444                 case NIKKI_RECALL:
445                 {
446                         if (!num)
447 #ifdef JP
448                                 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤Æ%s¤Î%d³¬¤Ø²¼¤ê¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, max_dlv[dungeon_type]);
449 #else
450                                 fprintf(fff, " %2d:%02d %20s recall to dungeon level %d of %s.\n", hour, min, note_level, max_dlv[dungeon_type], d_name+d_info[dungeon_type].name);
451 #endif
452                         else
453 #ifdef JP
454                                 fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤ÆÃϾå¤Ø¤ÈÌá¤Ã¤¿¡£\n", hour, min, note_level);
455 #else
456                                 fprintf(fff, " %2d:%02d %20s recall from dungeon to surface.\n", hour, min, note_level);
457 #endif
458                         break;
459                 }
460                 case NIKKI_TO_QUEST:
461                 {
462                         if (quest[num].flags & QUEST_FLAG_SILENT) break;
463 #ifdef JP
464                         fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤Ø¤ÈÆÍÆþ¤·¤¿¡£\n", hour, min, note_level, quest[num].name);
465 #else
466                         fprintf(fff, " %2d:%02d %20s enter quest '%s'.\n", hour, min, note_level, quest[num].name);
467 #endif
468                         break;
469                 }
470                 case NIKKI_TELE_LEV:
471                 {
472                         cptr to;
473                         if (!dun_level)
474                         {
475 #ifdef JP
476                                 to = "1³¬";
477 #else
478                                 to = "level 1";
479 #endif
480                         }
481                         else if (quest_number(dun_level) && ((quest_number(dun_level) < MIN_RANDOM_QUEST) && !(quest_number(dun_level) == QUEST_OBERON || quest_number(dun_level) == QUEST_SERPENT)))
482                         {
483 #ifdef JP
484                                 to = "ÃϾå";
485 #else
486                                 to = "the surface";
487 #endif
488                         }
489                         else
490                         {
491 #ifdef JP
492                                 if (!(dun_level+num)) to = "ÃϾå";
493                                 else to = format("%d³¬", dun_level+num);
494 #else
495                                 if (!(dun_level+num)) to = "surface";
496                                 else to = format("level %d", dun_level+num);
497 #endif
498                         }
499                                 
500 #ifdef JP
501                         fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥Æ¥ì¥Ý¡¼¥È¤Ç°ÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
502 #else
503                         fprintf(fff, " %2d:%02d %20s teleport level to %s.\n", hour, min, note_level, to);
504 #endif
505                         break;
506                 }
507                 case NIKKI_BUY:
508                 {
509 #ifdef JP
510                         fprintf(fff, " %2d:%02d %20s %s¤ò¹ØÆþ¤·¤¿¡£\n", hour, min, note_level, note);
511 #else
512                         fprintf(fff, " %2d:%02d %20s buy %s.\n", hour, min, note_level, note);
513 #endif
514                         break;
515                 }
516                 case NIKKI_SELL:
517                 {
518 #ifdef JP
519                         fprintf(fff, " %2d:%02d %20s %s¤òÇäµÑ¤·¤¿¡£\n", hour, min, note_level, note);
520 #else
521                         fprintf(fff, " %2d:%02d %20s sell %s.\n", hour, min, note_level, note);
522 #endif
523                         break;
524                 }
525                 case NIKKI_ARENA:
526                 {
527                         if (num == 99)
528                         {
529
530 #ifdef JP
531                                 fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï¤Ç¡¢%s¤ÎÁ°¤ËÇÔ¤ìµî¤Ã¤¿¡£\n", hour, min, note_level, p_ptr->arena_number + 1, note);
532 #else
533                                 int n =  p_ptr->arena_number + 1;
534                                 fprintf(fff, " %2d:%02d %20s beaten by %s in the %d%s fight.\n", hour, min, note_level, note, n, (n%10==1?"st":n%10==2?"nd":n%10==3?"rd":"th"));
535 #endif
536                                 break;
537                         }
538 #ifdef JP
539                         fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï(%s)¤Ë¾¡Íø¤·¤¿¡£\n", hour, min, note_level, num, note);
540 #else
541                         fprintf(fff, " %2d:%02d %20s win the %d%s fight (%s).\n", hour, min, note_level, num, (num%10==1?"st":num%10==2?"nd":num%10==3?"rd":"th"), note);
542 #endif
543                         if (num == MAX_ARENA_MONS)
544                         {
545 #ifdef JP
546                                 fprintf(fff, "                 Æ®µ»¾ì¤Î¤¹¤Ù¤Æ¤ÎŨ¤Ë¾¡Íø¤·¡¢¥Á¥ã¥ó¥Ô¥ª¥ó¤È¤Ê¤Ã¤¿¡£\n");
547 #else
548                                 fprintf(fff, "                 win all fight to become a Chanpion.\n");
549 #endif
550                                 do_level = FALSE;
551                         }
552                         break;
553                 }
554                 case NIKKI_HANMEI:
555                 {
556 #ifdef JP
557                         fprintf(fff, " %2d:%02d %20s %s¤ò¼±Ê̤·¤¿¡£\n", hour, min, note_level, note);
558 #else
559                         fprintf(fff, " %2d:%02d %20s identify %s.\n", hour, min, note_level, note);
560 #endif
561                         break;
562                 }
563                 case NIKKI_WIZ_TELE:
564                 {
565                         cptr to;
566                         if (!dun_level)
567 #ifdef JP
568                                 to = "ÃϾå";
569 #else
570                                 to = "the surface";
571 #endif
572                         else
573 #ifdef JP
574                                 to = format("%d³¬(%s)", dun_level, d_name+d_info[dungeon_type].name);
575 #else
576                                 to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name);
577 #endif
578                                 
579 #ifdef JP
580                         fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥¦¥£¥¶¡¼¥É¡¦¥Æ¥ì¥Ý¡¼¥È¤Ç°ÜÆ°¤·¤¿¡£\n", hour, min, note_level, to);
581 #else
582                         fprintf(fff, " %2d:%02d %20s wizard-teleport to %s.\n", hour, min, note_level, to);
583 #endif
584                         break;
585                 }
586                 case NIKKI_LEVELUP:
587                 {
588 #ifdef JP
589                         fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¤¬%d¤Ë¾å¤¬¤Ã¤¿¡£\n", hour, min, note_level, num);
590 #else
591                         fprintf(fff, " %2d:%02d %20s reach player level %d.\n", hour, min, note_level, num);
592 #endif
593                         break;
594                 }
595                 case NIKKI_GAMESTART:
596                 {
597                         time_t ct = time((time_t*)0);
598                         do_level = FALSE;
599                         if (num)
600                         {
601                                 fprintf(fff, "%s %s",note, ctime(&ct));
602                         }
603                         else
604                                 fprintf(fff, " %2d:%02d %20s %s %s",hour, min, note_level, note, ctime(&ct));
605                         break;
606                 }
607                 case NIKKI_NAMED_PET:
608                 {
609                         fprintf(fff, " %2d:%02d %20s ", hour, min, note_level);
610                         switch (num)
611                         {
612                                 case 0:
613 #ifdef JP
614                                         fprintf(fff, "%s¤òι¤Îͧ¤Ë¤¹¤ë¤³¤È¤Ë·è¤á¤¿¡£\n", note);
615 #else
616                                         fprintf(fff, "decide to travel together with %s.\n", note);
617 #endif
618                                         break;
619                                 case 1:
620 #ifdef JP
621                                         fprintf(fff, "%s¤Î̾Á°¤ò¾Ã¤·¤¿¡£\n", note);
622 #else
623                                         fprintf(fff, "unname %s.\n", note);
624 #endif
625                                         break;
626                                 case 2:
627 #ifdef JP
628                                         fprintf(fff, "%s¤ò²òÊü¤·¤¿¡£\n", note);
629 #else
630                                         fprintf(fff, "dismiss %s.\n", note);
631 #endif
632                                         break;
633                                 case 3:
634 #ifdef JP
635                                         fprintf(fff, "%s¤¬»à¤ó¤Ç¤·¤Þ¤Ã¤¿¡£\n", note);
636 #else
637                                         fprintf(fff, "%s die.\n", note);
638 #endif
639                                         break;
640                                 case 4:
641 #ifdef JP
642                                         fprintf(fff, "%s¤ò¤ª¤¤¤ÆÊ̤ΥޥåפذÜÆ°¤·¤¿¡£\n", note);
643 #else
644                                         fprintf(fff, "move to other map leaving %s behind.\n", note);
645 #endif
646                                         break;
647                                 case 5:
648 #ifdef JP
649                                         fprintf(fff, "%s¤È¤Ï¤°¤ì¤Æ¤·¤Þ¤Ã¤¿¡£\n", note);
650 #else
651                                         fprintf(fff, "lose sight of %s.\n", note);
652 #endif
653                                         break;
654                                 case 6:
655 #ifdef JP
656                                         fprintf(fff, "%s¤¬*Ç˲õ*¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note);
657 #else
658                                         fprintf(fff, "%s is made disappeared by *destruction*.\n", note);
659 #endif
660                                         break;
661                                 case 7:
662 #ifdef JP
663                                         fprintf(fff, "%s¤¬´äÀФ˲¡¤·ÄÙ¤µ¤ì¤¿¡£\n", note);
664 #else
665                                         fprintf(fff, "%s is crushed by falling rocks.\n", note);
666 #endif
667                                         break;
668                                 default:
669                                         fprintf(fff, "\n");
670                                         break;
671                         }
672                         break;
673                 }
674                 default:
675                         break;
676         }
677
678         my_fclose(fff);
679
680         /* Hack -- grab permissions */
681         safe_setuid_grab();
682
683         if (do_level) write_level = FALSE;
684
685         return (0);
686 }
687
688
689 #define MAX_SUBTITLE (sizeof(subtitle)/sizeof(subtitle[0]))
690
691 static void do_cmd_disp_nikki(void)
692 {
693         char nikki_title[256];
694         char file_name[80];
695         char buf[1024];
696         char tmp[80];
697 #ifdef JP
698         static const char subtitle[][30] = {"ºÇ¶¯¤ÎÆùÂΤòµá¤á¤Æ",
699                                            "¿ÍÀ¸¤½¤ì¤Ï¤Ï¤«¤Ê¤¤",
700                                            "ÌÀÆü¤Ë¸þ¤«¤Ã¤Æ",
701                                            "꤫¤é¤Ü¤¿¤â¤Á",
702                                            "¤¢¤È¤Îº×¤ê",
703                                            "¤½¤ì¤Ï¤¤¤¤¹Í¤¨¤À",
704                                            "²¿¤È¤Ç¤â¸À¤¨",
705                                            "ÅƤˤâ³Ñ¤Ë¤â",
706                                            "¥¦¥½¤À¤±¤É",
707                                            "¤â¤Ï¤ä¤³¤ì¤Þ¤Ç",
708                                            "¤Ê¤ó¤Ç¤³¤¦¤Ê¤ë¤Î",
709                                            "¤½¤ì¤Ï̵Íý¤À",
710                                            "Åݤ¹¤Ù¤­Å¨¤Ï¥²¡û¥Ä",
711                                            "¤ó¡Á¡©Ê¹¤³¤¨¤ó¤Ê¤¡",
712                                            "¥ª¥ì¤Î̾¤ò¸À¤Ã¤Æ¤ß¤í",
713                                            "Ƭ¤¬ÊѤˤʤäÁ¤ã¤Ã¤¿",
714                                            "¸ß´¹¤·¤Þ¤»¤ó",
715                                            "¤»¤Ã¤«¤¯¤À¤«¤é",
716                                            "¤Þ¤À¤Þ¤À´Å¤¤¤Í",
717                                            "¤à¤´¤¤¤à¤´¤¹¤®¤ë",
718                                            "¤³¤ó¤Ê¤â¤ó¤¸¤ã¤Ê¤¤",
719                                            "¤À¤á¤À¤³¤ê¤ã",
720                                            "¼¡¤¤¤Ã¤Æ¤ß¤è¤¦",
721                                            "¤Á¤ç¤Ã¤È¤À¤±¤è",
722                                            "°¥¤·¤­ËÁ¸±¼Ô",
723                                            "Ìî˾¤Î²Ì¤Æ",
724                                            "̵¸ÂÃϹö",
725                                            "¿À¤Ë·ö²Þ¤òÇä¤ë¼Ô",
726                                            "̤ÃΤÎÀ¤³¦¤Ø",
727                                            "ºÇ¹â¤ÎƬǾ¤òµá¤á¤Æ"};
728 #else
729         static const char subtitle[][51] ={"Quest of The World's Toughest Body",
730                                            "Attack is the best form of defence.",
731                                            "Might is right.",
732                                            "An unexpected windfall",
733                                            "A drowning man will catch at a straw",
734                                            "Don't count your chickens before they are hatched.",
735                                            "It is no use crying over spilt milk.",
736                                            "Seeing is believing.",
737                                            "Strike the iron while it is hot.",
738                                            "I don't care what follows.",
739                                            "To dig a well to put out a house on fire.",
740                                            "Tomorrow is another day.",
741                                            "Easy come, easy go.",
742                                            "The more haste, the less speed.",
743                                            "Where there is life, there is hope.",
744                                            "There is no royal road to *WINNER*.",
745                                            "Danger past, God forgotten.",
746                                            "The best thing to do now is to run away.",
747                                            "Life is but an empty dream.",
748                                            "Dead men tell no tales.",
749                                            "A book that remains shut is but a block.",
750                                            "Misfortunes never come singly.",
751                                            "A little knowledge is a dangerous thing.",
752                                            "History repeats itself.",
753                                            "*WINNER* was not built in a day.",
754                                            "Ignorance is bliss.",
755                                            "To lose is to win?",
756                                            "No medicine can cure folly.",
757                                            "All good things come to an end.",
758                                            "M$ Empire strikes back.",
759                                            "To see is to believe",
760                                            "Time is money.",
761                                            "Quest of The World's Greatest Brain"};
762 #endif
763 #ifdef JP
764         sprintf(file_name,"playrecord-%s.txt",savefile_base);
765 #else
766         sprintf(file_name,"playrec-%s.txt",savefile_base);
767 #endif
768
769         /* Hack -- drop permissions */
770         safe_setuid_drop();
771
772         /* Build the filename */
773         path_build(buf, 1024, ANGBAND_DIR_USER, file_name);
774
775         if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_MONK || p_ptr->pclass == CLASS_SAMURAI || p_ptr->pclass == CLASS_BERSERKER)
776                 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)]);
777         else if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
778                 strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-1)+1]);
779         else strcpy(tmp,subtitle[randint0(MAX_SUBTITLE-2)+1]);
780
781 #ifdef JP
782         sprintf(nikki_title, "¡Ö%s%s%s¤ÎÅÁÀâ -%s-¡×",
783                 ap_ptr->title, ap_ptr->no ? "¤Î" : "", player_name, tmp);
784 #else
785         sprintf(nikki_title, "Legend of %s %s '%s'",
786                 ap_ptr->title, player_name, tmp);
787 #endif
788
789         /* Display the file contents */
790         show_file(FALSE, buf, nikki_title, -1, 0);
791
792         /* Hack -- grab permissions */
793         safe_setuid_grab();
794 }
795
796 static void do_cmd_bunshou(void)
797 {
798         char tmp[80] = "\0";
799         char bunshou[80] = "\0";
800
801 #ifdef JP
802         if (get_string("ÆâÍÆ: ", tmp, 79))
803 #else
804         if (get_string("diary note: ", tmp, 79))
805 #endif
806         {
807                 strcpy(bunshou, tmp);
808
809                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, bunshou);
810         }
811 }
812
813 static void do_cmd_last_get(void)
814 {
815         char buf[256];
816         s32b turn_tmp;
817
818         if (record_o_name[0] == '\0') return;
819
820 #ifdef JP
821         sprintf(buf,"%s¤ÎÆþ¼ê¤òµ­Ï¿¤·¤Þ¤¹¡£",record_o_name);
822 #else
823         sprintf(buf,"Do you really want to record getting %s? ",record_o_name);
824 #endif
825         if (!get_check(buf)) return;
826
827         turn_tmp = turn;
828         turn = record_turn;
829 #ifdef JP
830         sprintf(buf,"%s¤ò¼ê¤ËÆþ¤ì¤¿¡£", record_o_name);
831 #else
832         sprintf(buf,"descover %s.", record_o_name);
833 #endif
834         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
835         turn = turn_tmp;
836 }
837
838 static void do_cmd_erase_nikki(void)
839 {
840         char file_name[80];
841         char buf[256];
842         FILE *fff = NULL;
843
844 #ifdef JP
845         if (!get_check("ËÜÅö¤Ëµ­Ï¿¤ò¾Ãµî¤·¤Þ¤¹¤«¡©")) return;
846 #else
847         if (!get_check("Do you really want to delete all your record? ")) return;
848 #endif
849
850 #ifdef JP
851         sprintf(file_name,"playrecord-%s.txt",savefile_base);
852 #else
853         sprintf(file_name,"playrec-%s.txt",savefile_base);
854 #endif
855
856         /* Hack -- drop permissions */
857         safe_setuid_drop();
858
859         /* Build the filename */
860         path_build(buf, 1024, ANGBAND_DIR_USER, file_name);
861
862         /* Remove the file */
863         fd_kill(buf);
864
865         fff = my_fopen(buf, "w");
866         if(fff){
867                 my_fclose(fff);
868 #ifdef JP
869                 msg_format("µ­Ï¿¤ò¾Ãµî¤·¤Þ¤·¤¿¡£");
870 #else
871                 msg_format("deleted record.");
872 #endif
873         }else{
874 #ifdef JP
875                 msg_format("%s ¤Î¾Ãµî¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£", buf);
876 #else
877                 msg_format("failed to delete %s.", buf);
878 #endif
879         }
880         msg_print(NULL);
881
882         /* Hack -- grab permissions */
883         safe_setuid_grab();
884 }
885
886 #if 0
887 void do_debug(void)
888 {
889         msg_format("%d %d %d:%d",py,px, p_ptr->energy, p_ptr->skill_dis);
890         msg_print(NULL);
891         battle_monsters();
892 }
893 #endif
894
895 void do_cmd_nikki(void)
896 {
897         int i;
898
899         /* File type is "TEXT" */
900         FILE_TYPE(FILE_TYPE_TEXT);
901
902         /* Save the screen */
903         screen_save();
904
905         /* Interact until done */
906         while (1)
907         {
908                 /* Clear screen */
909                 Term_clear();
910
911                 /* Ask for a choice */
912 #ifdef JP
913                 prt("[ µ­Ï¿¤ÎÀßÄê ]", 2, 0);
914 #else
915                 prt("[ Play Record ]", 2, 0);
916 #endif
917
918
919                 /* Give some choices */
920 #ifdef JP
921                 prt("(1) µ­Ï¿¤ò¸«¤ë", 4, 5);
922                 prt("(2) Ê¸¾Ï¤òµ­Ï¿¤¹¤ë", 5, 5);
923                 prt("(3) Ä¾Á°¤ËÆþ¼êËô¤Ï´ÕÄꤷ¤¿¤â¤Î¤òµ­Ï¿¤¹¤ë", 6, 5);
924                 prt("(4) µ­Ï¿¤ò¾Ãµî¤¹¤ë", 7, 5);
925 #else
926                 prt("(1) Display your record", 4, 5);
927                 prt("(2) Add record", 5, 5);
928                 prt("(3) Record item you last get/identify", 6, 5);
929                 prt("(4) Delete your record", 7, 5);
930 #endif
931
932
933                 /* Prompt */
934 #ifdef JP
935                 prt("¥³¥Þ¥ó¥É:", 18, 0);
936 #else
937                 prt("Command: ", 18, 0);
938 #endif
939
940
941                 /* Prompt */
942                 i = inkey();
943
944                 /* Done */
945                 if (i == ESCAPE) break;
946
947                 switch (i)
948                 {
949                 case '1':
950                         do_cmd_disp_nikki();
951                         break;
952                 case '2':
953                         do_cmd_bunshou();
954                         break;
955                 case '3':
956                         do_cmd_last_get();
957                         break;
958                 case '4':
959                         do_cmd_erase_nikki();
960                         break;
961 #if 0
962                 case ':':
963                         do_debug();
964                         break;
965 #endif
966                 default: /* Unknown option */
967                         bell();
968                 }
969
970                 /* Flush messages */
971                 msg_print(NULL);
972         }
973
974         /* Restore the screen */
975         screen_load();
976 }
977
978 /*
979  * Hack -- redraw the screen
980  *
981  * This command performs various low level updates, clears all the "extra"
982  * windows, does a total redraw of the main window, and requests all of the
983  * interesting updates and redraws that I can think of.
984  *
985  * This command is also used to "instantiate" the results of the user
986  * selecting various things, such as graphics mode, so it must call
987  * the "TERM_XTRA_REACT" hook before redrawing the windows.
988  */
989 void do_cmd_redraw(void)
990 {
991         int j;
992
993         term *old = Term;
994
995
996         /* Hack -- react to changes */
997         Term_xtra(TERM_XTRA_REACT, 0);
998
999
1000         /* Combine and Reorder the pack (later) */
1001         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
1002
1003
1004         /* Update torch */
1005         p_ptr->update |= (PU_TORCH);
1006
1007         /* Update stuff */
1008         p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
1009
1010         /* Forget lite/view */
1011         p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
1012
1013         /* Update lite/view */
1014         p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
1015
1016         /* Update monsters */
1017         p_ptr->update |= (PU_MONSTERS);
1018
1019         /* Redraw everything */
1020         p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1021
1022         /* Window stuff */
1023         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
1024
1025         /* Window stuff */
1026         p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
1027
1028         update_playtime();
1029
1030         /* Hack -- update */
1031         handle_stuff();
1032
1033         if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
1034
1035
1036         /* Redraw every window */
1037         for (j = 0; j < 8; j++)
1038         {
1039                 /* Dead window */
1040                 if (!angband_term[j]) continue;
1041
1042                 /* Activate */
1043                 Term_activate(angband_term[j]);
1044
1045                 /* Redraw */
1046                 Term_redraw();
1047
1048                 /* Refresh */
1049                 Term_fresh();
1050
1051                 /* Restore */
1052                 Term_activate(old);
1053         }
1054 }
1055
1056
1057 /*
1058  * Hack -- change name
1059  */
1060 void do_cmd_change_name(void)
1061 {
1062         char    c;
1063
1064         int             mode = 0;
1065
1066         char    tmp[160];
1067
1068
1069         /* Save the screen */
1070         screen_save();
1071
1072         /* Forever */
1073         while (1)
1074         {
1075                 update_playtime();
1076
1077                 /* Display the player */
1078                 display_player(mode);
1079
1080                 if (mode == 6)
1081                 {
1082                         mode = 0;
1083                         display_player(mode);
1084                 }
1085
1086                 /* Prompt */
1087 #ifdef JP
1088                 Term_putstr(2, 23, -1, TERM_WHITE,
1089                             "['c'¤Ç̾Á°Êѹ¹, 'f'¤Ç¥Õ¥¡¥¤¥ë¤Ø½ñ½Ð, 'h'¤Ç¥â¡¼¥ÉÊѹ¹, ESC¤Ç½ªÎ»]");
1090 #else
1091                 Term_putstr(2, 23, -1, TERM_WHITE,
1092                         "['c' to change name, 'f' to file, 'h' to change mode, or ESC]");
1093 #endif
1094
1095
1096                 /* Query */
1097                 c = inkey();
1098
1099                 /* Exit */
1100                 if (c == ESCAPE) break;
1101
1102                 /* Change name */
1103                 if (c == 'c')
1104                 {
1105                         get_name();
1106                 }
1107
1108                 /* File dump */
1109                 else if (c == 'f')
1110                 {
1111                         sprintf(tmp, "%s.txt", player_base);
1112 #ifdef JP
1113                         if (get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
1114 #else
1115                         if (get_string("File name: ", tmp, 80))
1116 #endif
1117
1118                         {
1119                                 if (tmp[0] && (tmp[0] != ' '))
1120                                 {
1121                                         file_character(tmp, TRUE);
1122                                 }
1123                         }
1124                 }
1125
1126                 /* Toggle mode */
1127                 else if (c == 'h')
1128                 {
1129                         mode++;
1130                 }
1131
1132                 /* Oops */
1133                 else
1134                 {
1135                         bell();
1136                 }
1137
1138                 /* Flush messages */
1139                 msg_print(NULL);
1140         }
1141
1142         /* Restore the screen */
1143         screen_load();
1144
1145         /* Redraw everything */
1146         p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
1147
1148         handle_stuff();
1149 }
1150
1151
1152 /*
1153  * Recall the most recent message
1154  */
1155 void do_cmd_message_one(void)
1156 {
1157         /* Recall one message XXX XXX XXX */
1158         prt(format("> %s", message_str(0)), 0, 0);
1159 }
1160
1161
1162 /*
1163  * Show previous messages to the user   -BEN-
1164  *
1165  * The screen format uses line 0 and 23 for headers and prompts,
1166  * skips line 1 and 22, and uses line 2 thru 21 for old messages.
1167  *
1168  * This command shows you which commands you are viewing, and allows
1169  * you to "search" for strings in the recall.
1170  *
1171  * Note that messages may be longer than 80 characters, but they are
1172  * displayed using "infinite" length, with a special sub-command to
1173  * "slide" the virtual display to the left or right.
1174  *
1175  * Attempt to only hilite the matching portions of the string.
1176  */
1177 void do_cmd_messages(int num_now)
1178 {
1179         int i, j, k, n;
1180         uint q;
1181
1182         char shower[80];
1183         char finder[80];
1184         int wid, hgt;
1185
1186
1187         /* Get size */
1188         Term_get_size(&wid, &hgt);
1189
1190         /* Wipe finder */
1191         strcpy(finder, "");
1192
1193         /* Wipe shower */
1194         strcpy(shower, "");
1195
1196
1197         /* Total messages */
1198         n = message_num();
1199
1200         /* Start on first message */
1201         i = 0;
1202
1203         /* Start at leftmost edge */
1204         q = 0;
1205
1206         /* Save the screen */
1207         screen_save();
1208
1209         /* Process requests until done */
1210         while (1)
1211         {
1212                 /* Clear screen */
1213                 Term_clear();
1214
1215                 /* Dump up to 20 lines of messages */
1216                 for (j = 0; (j < hgt - 4) && (i + j < n); j++)
1217                 {
1218                         cptr msg = message_str(i+j);
1219
1220                         /* Apply horizontal scroll */
1221                         msg = (strlen(msg) >= q) ? (msg + q) : "";
1222
1223                         /* Dump the messages, bottom to top */
1224                         Term_putstr(0, hgt-j-3, -1, (bool)(i+j < num_now ? TERM_WHITE : TERM_SLATE), msg);
1225
1226                         /* Hilite "shower" */
1227                         if (shower[0])
1228                         {
1229                                 cptr str = msg;
1230
1231                                 /* Display matches */
1232                                 while ((str = strstr(str, shower)) != NULL)
1233                                 {
1234                                         int len = strlen(shower);
1235
1236                                         /* Display the match */
1237                                         Term_putstr(str-msg, hgt-j-3, len, TERM_YELLOW, shower);
1238
1239                                         /* Advance */
1240                                         str += len;
1241                                 }
1242                         }
1243                 }
1244
1245                 /* Display header XXX XXX XXX */
1246 #ifdef JP
1247                 /* translation */
1248                 prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d) ¥ª¥Õ¥»¥Ã¥È(%d)",
1249                            i, i+j-1, n, q), 0, 0);
1250 #else
1251                 prt(format("Message Recall (%d-%d of %d), Offset %d",
1252                     i, i+j-1, n, q), 0, 0);
1253 #endif
1254
1255
1256                 /* Display prompt (not very informative) */
1257 #ifdef JP
1258                 prt("[ 'p' ¤Ç¹¹¤Ë¸Å¤¤¤â¤Î, 'n' ¤Ç¹¹¤Ë¿·¤·¤¤¤â¤Î, '/' ¤Ç¸¡º÷, ESC ¤ÇÃæÃÇ ]", hgt - 1, 0);
1259 #else
1260                 prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0);
1261 #endif
1262
1263
1264                 /* Get a command */
1265                 k = inkey();
1266
1267                 /* Exit on Escape */
1268                 if (k == ESCAPE) break;
1269
1270                 /* Hack -- Save the old index */
1271                 j = i;
1272
1273                 /* Horizontal scroll */
1274                 if (k == '4')
1275                 {
1276                         /* Scroll left */
1277                         q = (q >= 40) ? (q - 40) : 0;
1278
1279                         /* Success */
1280                         continue;
1281                 }
1282
1283                 /* Horizontal scroll */
1284                 if (k == '6')
1285                 {
1286                         /* Scroll right */
1287                         q = q + 40;
1288
1289                         /* Success */
1290                         continue;
1291                 }
1292
1293                 /* Hack -- handle show */
1294                 if (k == '=')
1295                 {
1296                         /* Prompt */
1297 #ifdef JP
1298                         prt("¶¯Ä´: ", hgt - 1, 0);
1299 #else
1300                         prt("Show: ", hgt - 1, 0);
1301 #endif
1302
1303
1304                         /* Get a "shower" string, or continue */
1305                         if (!askfor_aux(shower, 80)) continue;
1306
1307                         /* Okay */
1308                         continue;
1309                 }
1310
1311                 /* Hack -- handle find */
1312                 if (k == '/')
1313                 {
1314                         int z;
1315
1316                         /* Prompt */
1317 #ifdef JP
1318                         prt("¸¡º÷: ", hgt - 1, 0);
1319 #else
1320                         prt("Find: ", hgt - 1, 0);
1321 #endif
1322
1323
1324                         /* Get a "finder" string, or continue */
1325                         if (!askfor_aux(finder, 80)) continue;
1326
1327                         /* Show it */
1328                         strcpy(shower, finder);
1329
1330                         /* Scan messages */
1331                         for (z = i + 1; z < n; z++)
1332                         {
1333                                 cptr msg = message_str(z);
1334
1335                                 /* Search for it */
1336                                 if (strstr(msg, finder))
1337                                 {
1338                                         /* New location */
1339                                         i = z;
1340
1341                                         /* Done */
1342                                         break;
1343                                 }
1344                         }
1345                 }
1346
1347                 /* Recall 1 older message */
1348                 if ((k == '8') || (k == '\n') || (k == '\r'))
1349                 {
1350                         /* Go newer if legal */
1351                         if (i + 1 < n) i += 1;
1352                 }
1353
1354                 /* Recall 10 older messages */
1355                 if (k == '+')
1356                 {
1357                         /* Go older if legal */
1358                         if (i + 10 < n) i += 10;
1359                 }
1360
1361                 /* Recall 20 older messages */
1362                 if ((k == 'p') || (k == KTRL('P')) || (k == ' '))
1363                 {
1364                         /* Go older if legal */
1365                         if (i + 20 < n) i += 20;
1366                 }
1367
1368                 /* Recall 20 newer messages */
1369                 if ((k == 'n') || (k == KTRL('N')))
1370                 {
1371                         /* Go newer (if able) */
1372                         i = (i >= 20) ? (i - 20) : 0;
1373                 }
1374
1375                 /* Recall 10 newer messages */
1376                 if (k == '-')
1377                 {
1378                         /* Go newer (if able) */
1379                         i = (i >= 20) ? (i - 20) : 0;
1380                 }
1381
1382                 /* Recall 1 newer messages */
1383                 if (k == '2')
1384                 {
1385                         /* Go newer (if able) */
1386                         i = (i >= 1) ? (i - 1) : 0;
1387                 }
1388
1389                 /* Hack -- Error of some kind */
1390                 if (i == j) bell();
1391         }
1392
1393         /* Restore the screen */
1394         screen_load();
1395 }
1396
1397
1398
1399 /*
1400  * Number of cheating options
1401  */
1402 #define CHEAT_MAX 6
1403
1404 /*
1405  * Cheating options
1406  */
1407 static option_type cheat_info[CHEAT_MAX] =
1408 {
1409         { &cheat_peek,          FALSE,  255,    0x01, 0x00,
1410 #ifdef JP
1411         "cheat_peek",           "¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¤Î¤¾¤­¸«¤ë" },
1412 #else
1413         "cheat_peek",           "Peek into object creation" },
1414 #endif
1415
1416
1417         { &cheat_hear,          FALSE,  255,    0x02, 0x00,
1418 #ifdef JP
1419         "cheat_hear",           "¥â¥ó¥¹¥¿¡¼¤ÎÀ¸À®¤ò¤Î¤¾¤­¸«¤ë" },
1420 #else
1421         "cheat_hear",           "Peek into monster creation" },
1422 #endif
1423
1424
1425         { &cheat_room,          FALSE,  255,    0x04, 0x00,
1426 #ifdef JP
1427         "cheat_room",           "¥À¥ó¥¸¥ç¥ó¤ÎÀ¸À®¤ò¤Î¤¾¤­¸«¤ë" },
1428 #else
1429         "cheat_room",           "Peek into dungeon creation" },
1430 #endif
1431
1432
1433         { &cheat_xtra,          FALSE,  255,    0x08, 0x00,
1434 #ifdef JP
1435         "cheat_xtra",           "¤½¤Î¾¤Î»ö¤ò¤Î¤¾¤­¸«¤ë" },
1436 #else
1437         "cheat_xtra",           "Peek into something else" },
1438 #endif
1439
1440
1441         { &cheat_know,          FALSE,  255,    0x10, 0x00,
1442 #ifdef JP
1443         "cheat_know",           "´°Á´¤Ê¥â¥ó¥¹¥¿¡¼¤Î»×¤¤½Ð¤òÃΤë" },
1444 #else
1445         "cheat_know",           "Know complete monster info" },
1446 #endif
1447
1448
1449         { &cheat_live,          FALSE,  255,    0x20, 0x00,
1450 #ifdef JP
1451         "cheat_live",           "»à¤ò²óÈò¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤¹¤ë" }
1452 #else
1453         "cheat_live",           "Allow player to avoid death" }
1454 #endif
1455
1456 };
1457
1458 /*
1459  * Interact with some options for cheating
1460  */
1461 static void do_cmd_options_cheat(cptr info)
1462 {
1463         char    ch;
1464
1465         int             i, k = 0, n = CHEAT_MAX;
1466
1467         char    buf[80];
1468
1469
1470         /* Clear screen */
1471         Term_clear();
1472
1473         /* Interact with the player */
1474         while (TRUE)
1475         {
1476                 /* Prompt XXX XXX XXX */
1477 #ifdef JP
1478                 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, ESC ¤Ç·èÄê )", info);
1479 #else
1480                 sprintf(buf, "%s (RET to advance, y/n to set, ESC to accept) ", info);
1481 #endif
1482
1483                 prt(buf, 0, 0);
1484
1485 #ifdef JP
1486                 /* º¾µ½¥ª¥×¥·¥ç¥ó¤ò¤¦¤Ã¤«¤ê¤¤¤¸¤Ã¤Æ¤·¤Þ¤¦¿Í¤¬¤¤¤ë¤è¤¦¤Ê¤Î¤ÇÃí°Õ */
1487                 prt("                                 <<  Ãí°Õ  >>", 11, 0);
1488                 prt("      º¾µ½¥ª¥×¥·¥ç¥ó¤ò°ìÅ٤ǤâÀßÄꤹ¤ë¤È¡¢¥¹¥³¥¢µ­Ï¿¤¬»Ä¤é¤Ê¤¯¤Ê¤ê¤Þ¤¹¡ª", 12, 0);
1489                 prt("      ¸å¤Ë²ò½ü¤·¤Æ¤â¥À¥á¤Ç¤¹¤Î¤Ç¡¢¾¡Íø¼Ô¤òÌܻؤ¹Êý¤Ï¤³¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¤", 13, 0);
1490                 prt("      ¤¸¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£", 14, 0);
1491 #endif
1492                 /* Display the options */
1493                 for (i = 0; i < n; i++)
1494                 {
1495                         byte a = TERM_WHITE;
1496
1497                         /* Color current option */
1498                         if (i == k) a = TERM_L_BLUE;
1499
1500                         /* Display the option text */
1501                         sprintf(buf, "%-48s: %s (%s)",
1502                             cheat_info[i].o_desc,
1503 #ifdef JP
1504                             (*cheat_info[i].o_var ? "¤Ï¤¤  " : "¤¤¤¤¤¨"),
1505 #else
1506                             (*cheat_info[i].o_var ? "yes" : "no "),
1507 #endif
1508
1509                             cheat_info[i].o_text);
1510                         c_prt(a, buf, i + 2, 0);
1511                 }
1512
1513                 /* Hilite current option */
1514                 move_cursor(k + 2, 50);
1515
1516                 /* Get a key */
1517                 ch = inkey();
1518
1519                 /* Analyze */
1520                 switch (ch)
1521                 {
1522                         case ESCAPE:
1523                         {
1524                                 return;
1525                         }
1526
1527                         case '-':
1528                         case '8':
1529                         {
1530                                 k = (n + k - 1) % n;
1531                                 break;
1532                         }
1533
1534                         case ' ':
1535                         case '\n':
1536                         case '\r':
1537                         case '2':
1538                         {
1539                                 k = (k + 1) % n;
1540                                 break;
1541                         }
1542
1543                         case 'y':
1544                         case 'Y':
1545                         case '6':
1546                         {
1547                                 if(!noscore)
1548 #ifdef JP
1549                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "º¾µ½¥ª¥×¥·¥ç¥ó¤òON¤Ë¤·¤Æ¡¢¥¹¥³¥¢¤ò»Ä¤»¤Ê¤¯¤Ê¤Ã¤¿¡£");
1550 #else
1551                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "give up sending score to use cheating options.");
1552 #endif
1553                                 noscore |= (cheat_info[k].o_set * 256 + cheat_info[k].o_bit);
1554                                 (*cheat_info[k].o_var) = TRUE;
1555                                 k = (k + 1) % n;
1556                                 break;
1557                         }
1558
1559                         case 'n':
1560                         case 'N':
1561                         case '4':
1562                         {
1563                                 (*cheat_info[k].o_var) = FALSE;
1564                                 k = (k + 1) % n;
1565                                 break;
1566                         }
1567
1568                         default:
1569                         {
1570                                 bell();
1571                                 break;
1572                         }
1573                 }
1574         }
1575 }
1576
1577
1578 static option_type autosave_info[2] =
1579 {
1580         { &autosave_l,      FALSE, 255, 0x01, 0x00,
1581 #ifdef JP
1582             "autosave_l",    "¿·¤·¤¤³¬¤ËÆþ¤ëÅ٤˼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1583 #else
1584             "autosave_l",    "Autosave when entering new levels" },
1585 #endif
1586
1587
1588         { &autosave_t,      FALSE, 255, 0x02, 0x00,
1589 #ifdef JP
1590             "autosave_t",   "°ìÄ꥿¡¼¥óËè¤Ë¼«Æ°¥»¡¼¥Ö¤¹¤ë" },
1591 #else
1592             "autosave_t",   "Timed autosave" },
1593 #endif
1594
1595 };
1596
1597
1598 static s16b toggle_frequency(s16b current)
1599 {
1600         if (current == 0) return 50;
1601         if (current == 50) return 100;
1602         if (current == 100) return 250;
1603         if (current == 250) return 500;
1604         if (current == 500) return 1000;
1605         if (current == 1000) return 2500;
1606         if (current == 2500) return 5000;
1607         if (current == 5000) return 10000;
1608         if (current == 10000) return 25000;
1609
1610         return 0;
1611 }
1612
1613
1614 /*
1615  * Interact with some options for cheating
1616  */
1617 static void do_cmd_options_autosave(cptr info)
1618 {
1619         char    ch;
1620
1621         int     i, k = 0, n = 2;
1622
1623         char    buf[80];
1624
1625
1626         /* Clear screen */
1627         Term_clear();
1628
1629         /* Interact with the player */
1630         while (TRUE)
1631         {
1632                 /* Prompt XXX XXX XXX */
1633 #ifdef JP
1634                 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, F ¤ÇÉÑÅÙ¤òÆþÎÏ, ESC ¤Ç·èÄê ) ", info);
1635 #else
1636                 sprintf(buf, "%s (RET to advance, y/n to set, 'F' for frequency, ESC to accept) ", info);
1637 #endif
1638
1639                 prt(buf, 0, 0);
1640
1641                 /* Display the options */
1642                 for (i = 0; i < n; i++)
1643                 {
1644                         byte a = TERM_WHITE;
1645
1646                         /* Color current option */
1647                         if (i == k) a = TERM_L_BLUE;
1648
1649                         /* Display the option text */
1650                         sprintf(buf, "%-48s: %s (%s)",
1651                             autosave_info[i].o_desc,
1652 #ifdef JP
1653                             (*autosave_info[i].o_var ? "¤Ï¤¤  " : "¤¤¤¤¤¨"),
1654 #else
1655                             (*autosave_info[i].o_var ? "yes" : "no "),
1656 #endif
1657
1658                             autosave_info[i].o_text);
1659                         c_prt(a, buf, i + 2, 0);
1660                 }
1661
1662 #ifdef JP
1663                 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè",  autosave_freq), 5, 0);
1664 #else
1665                 prt(format("Timed autosave frequency: every %d turns",  autosave_freq), 5, 0);
1666 #endif
1667
1668
1669
1670                 /* Hilite current option */
1671                 move_cursor(k + 2, 50);
1672
1673                 /* Get a key */
1674                 ch = inkey();
1675
1676                 /* Analyze */
1677                 switch (ch)
1678                 {
1679                         case ESCAPE:
1680                         {
1681                                 return;
1682                         }
1683
1684                         case '-':
1685                         case '8':
1686                         {
1687                                 k = (n + k - 1) % n;
1688                                 break;
1689                         }
1690
1691                         case ' ':
1692                         case '\n':
1693                         case '\r':
1694                         case '2':
1695                         {
1696                                 k = (k + 1) % n;
1697                                 break;
1698                         }
1699
1700                         case 'y':
1701                         case 'Y':
1702                         case '6':
1703                         {
1704
1705                                 (*autosave_info[k].o_var) = TRUE;
1706                                 k = (k + 1) % n;
1707                                 break;
1708                         }
1709
1710                         case 'n':
1711                         case 'N':
1712                         case '4':
1713                         {
1714                                 (*autosave_info[k].o_var) = FALSE;
1715                                 k = (k + 1) % n;
1716                                 break;
1717                         }
1718
1719                         case 'f':
1720                         case 'F':
1721                         {
1722                                 autosave_freq = toggle_frequency(autosave_freq);
1723 #ifdef JP
1724                                 prt(format("¼«Æ°¥»¡¼¥Ö¤ÎÉÑÅÙ¡§ %d ¥¿¡¼¥óËè", 
1725 #else
1726                                 prt(format("Timed autosave frequency: every %d turns",
1727 #endif
1728
1729                                     autosave_freq), 5, 0);
1730                         }
1731
1732                         default:
1733                         {
1734                                 bell();
1735                                 break;
1736                         }
1737                 }
1738         }
1739 }
1740
1741
1742 #define PAGE_AUTODESTROY 7
1743
1744 /*
1745  * Interact with some options
1746  */
1747 void do_cmd_options_aux(int page, cptr info)
1748 {
1749         char    ch;
1750         int     i, k = 0, n = 0, l;
1751         int     opt[24];
1752         char    buf[80];
1753
1754
1755         /* Lookup the options */
1756         for (i = 0; i < 24; i++) opt[i] = 0;
1757
1758         /* Scan the options */
1759         for (i = 0; option_info[i].o_desc; i++)
1760         {
1761                 /* Notice options on this "page" */
1762                 if (option_info[i].o_page == page) opt[n++] = i;
1763         }
1764
1765
1766         /* Clear screen */
1767         Term_clear();
1768
1769 #ifdef JP
1770         if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤­¤Î¤ßÍ­¸ú", 4, 6);
1771 #else
1772         if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 4, 3);
1773 #endif
1774
1775         /* Interact with the player */
1776         while (TRUE)
1777         {
1778                 /* Prompt XXX XXX XXX */
1779 #ifdef JP
1780                 sprintf(buf, "%s ( ¥ê¥¿¡¼¥ó¤Ç¼¡¤Ø, y/n ¤Ç¥»¥Ã¥È, ESC ¤Ç·èÄê ) ", info);
1781 #else
1782                 sprintf(buf, "%s (RET to advance, y/n to set, ESC to accept) ", info);
1783 #endif
1784
1785                 prt(buf, 0, 0);
1786
1787                 /* Display the options */
1788                 for (i = 0; i < n; i++)
1789                 {
1790                         byte a = TERM_WHITE;
1791
1792                         /* Color current option */
1793                         if (i == k) a = TERM_L_BLUE;
1794
1795                         /* Display the option text */
1796                         sprintf(buf, "%-48s: %s (%.19s)",
1797                                 option_info[opt[i]].o_desc,
1798 #ifdef JP
1799                                 (*option_info[opt[i]].o_var ? "¤Ï¤¤  " : "¤¤¤¤¤¨"),
1800 #else
1801                                 (*option_info[opt[i]].o_var ? "yes" : "no "),
1802 #endif
1803
1804                                 option_info[opt[i]].o_text);
1805                         if ((page == PAGE_AUTODESTROY) && i > 0) c_prt(a, buf, i + 5, 0);
1806                         else c_prt(a, buf, i + 2, 0);
1807                 }
1808
1809                 if ((page == PAGE_AUTODESTROY) && (k > 0)) l = 3;
1810                 else l = 0;
1811                 /* Hilite current option */
1812                 move_cursor(k + 2 + l, 50);
1813
1814                 /* Get a key */
1815                 ch = inkey();
1816
1817                 /* Analyze */
1818                 switch (ch)
1819                 {
1820                         case ESCAPE:
1821                         {
1822                                 return;
1823                         }
1824
1825                         case '-':
1826                         case '8':
1827                         case 'k':
1828                         case 'K':
1829                         {
1830                                 k = (n + k - 1) % n;
1831                                 break;
1832                         }
1833
1834                         case ' ':
1835                         case '\n':
1836                         case '\r':
1837                         case '2':
1838                         case 'j':
1839                         case 'J':
1840                         {
1841                                 k = (k + 1) % n;
1842                                 break;
1843                         }
1844
1845                         case 'y':
1846                         case 'Y':
1847                         case '6':
1848                         case 'l':
1849                         case 'L':
1850                         {
1851                                 (*option_info[opt[k]].o_var) = TRUE;
1852                                 k = (k + 1) % n;
1853                                 break;
1854                         }
1855
1856                         case 'n':
1857                         case 'N':
1858                         case '4':
1859                         case 'h':
1860                         case 'H':
1861                         {
1862                                 (*option_info[opt[k]].o_var) = FALSE;
1863                                 k = (k + 1) % n;
1864                                 break;
1865                         }
1866
1867                         case 't':
1868                         case 'T':
1869                         {
1870                                 (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
1871                                 break;
1872                         }
1873
1874                         default:
1875                         {
1876                                 bell();
1877                                 break;
1878                         }
1879                 }
1880         }
1881 }
1882
1883
1884 /*
1885  * Modify the "window" options
1886  */
1887 static void do_cmd_options_win(void)
1888 {
1889         int i, j, d;
1890
1891         int y = 0;
1892         int x = 0;
1893
1894         char ch;
1895
1896         bool go = TRUE;
1897
1898         u32b old_flag[8];
1899
1900
1901         /* Memorize old flags */
1902         for (j = 0; j < 8; j++)
1903         {
1904                 /* Acquire current flags */
1905                 old_flag[j] = window_flag[j];
1906         }
1907
1908
1909         /* Clear screen */
1910         Term_clear();
1911
1912         /* Interact */
1913         while (go)
1914         {
1915                 /* Prompt XXX XXX XXX */
1916 #ifdef JP
1917                 prt("¥¦¥£¥ó¥É¥¦¡¦¥Õ¥é¥° (<Êý¸þ>¤Ç°ÜÆ°, t¤Ç¥Á¥§¥ó¥¸, y/n ¤Ç¥»¥Ã¥È, ESC)", 0, 0);
1918 #else
1919                 prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
1920 #endif
1921
1922
1923                 /* Display the windows */
1924                 for (j = 0; j < 8; j++)
1925                 {
1926                         byte a = TERM_WHITE;
1927
1928                         cptr s = angband_term_name[j];
1929
1930                         /* Use color */
1931                         if (j == x) a = TERM_L_BLUE;
1932
1933                         /* Window name, staggered, centered */
1934                         Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
1935                 }
1936
1937                 /* Display the options */
1938                 for (i = 0; i < 16; i++)
1939                 {
1940                         byte a = TERM_WHITE;
1941
1942                         cptr str = window_flag_desc[i];
1943
1944                         /* Use color */
1945                         if (i == y) a = TERM_L_BLUE;
1946
1947                         /* Unused option */
1948 #ifdef JP
1949                         if (!str) str = "(̤»ÈÍÑ)";
1950 #else
1951                         if (!str) str = "(Unused option)";
1952 #endif
1953
1954
1955                         /* Flag name */
1956                         Term_putstr(0, i + 5, -1, a, str);
1957
1958                         /* Display the windows */
1959                         for (j = 0; j < 8; j++)
1960                         {
1961                                 byte a = TERM_WHITE;
1962
1963                                 char c = '.';
1964
1965                                 /* Use color */
1966                                 if ((i == y) && (j == x)) a = TERM_L_BLUE;
1967
1968                                 /* Active flag */
1969                                 if (window_flag[j] & (1L << i)) c = 'X';
1970
1971                                 /* Flag value */
1972                                 Term_putch(35 + j * 5, i + 5, a, c);
1973                         }
1974                 }
1975
1976                 /* Place Cursor */
1977                 Term_gotoxy(35 + x * 5, y + 5);
1978
1979                 /* Get key */
1980                 ch = inkey();
1981
1982                 /* Analyze */
1983                 switch (ch)
1984                 {
1985                         case ESCAPE:
1986                         {
1987                                 go = FALSE;
1988                                 break;
1989                         }
1990
1991                         case 'T':
1992                         case 't':
1993                         {
1994                                 /* Clear windows */
1995                                 for (j = 0; j < 8; j++)
1996                                 {
1997                                         window_flag[j] &= ~(1L << y);
1998                                 }
1999
2000                                 /* Clear flags */
2001                                 for (i = 0; i < 16; i++)
2002                                 {
2003                                         window_flag[x] &= ~(1L << i);
2004                                 }
2005
2006                                 /* Fall through */
2007                         }
2008
2009                         case 'y':
2010                         case 'Y':
2011                         {
2012                                 /* Ignore screen */
2013                                 if (x == 0) break;
2014
2015                                 /* Set flag */
2016                                 window_flag[x] |= (1L << y);
2017                                 break;
2018                         }
2019
2020                         case 'n':
2021                         case 'N':
2022                         {
2023                                 /* Clear flag */
2024                                 window_flag[x] &= ~(1L << y);
2025                                 break;
2026                         }
2027
2028                         default:
2029                         {
2030                                 d = get_keymap_dir(ch);
2031
2032                                 x = (x + ddx[d] + 8) % 8;
2033                                 y = (y + ddy[d] + 16) % 16;
2034
2035                                 if (!d) bell();
2036                         }
2037                 }
2038         }
2039
2040         /* Notice changes */
2041         for (j = 0; j < 8; j++)
2042         {
2043                 term *old = Term;
2044
2045                 /* Dead window */
2046                 if (!angband_term[j]) continue;
2047
2048                 /* Ignore non-changes */
2049                 if (window_flag[j] == old_flag[j]) continue;
2050
2051                 /* Activate */
2052                 Term_activate(angband_term[j]);
2053
2054                 /* Erase */
2055                 Term_clear();
2056
2057                 /* Refresh */
2058                 Term_fresh();
2059
2060                 /* Restore */
2061                 Term_activate(old);
2062         }
2063 }
2064
2065
2066
2067
2068 /*
2069  * Set or unset various options.
2070  *
2071  * The user must use the "Ctrl-R" command to "adapt" to changes
2072  * in any options which control "visual" aspects of the game.
2073  */
2074 void do_cmd_options(void)
2075 {
2076         int k;
2077
2078
2079         /* Save the screen */
2080         screen_save();
2081
2082
2083         /* Interact */
2084         while (1)
2085         {
2086                 /* Clear screen */
2087                 Term_clear();
2088
2089                 /* Why are we here */
2090 #ifdef JP
2091                 prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 2, 0);
2092 #else
2093                 prt("Options", 2, 0);
2094 #endif
2095
2096
2097                 /* Give some choices */
2098 #ifdef JP
2099                 prt("(1)     ¥­¡¼ÆþÎÏ          ¥ª¥×¥·¥ç¥ó", 4, 5);
2100                 prt("(2)     ²èÌ̽ÐÎÏ          ¥ª¥×¥·¥ç¥ó", 5, 5);
2101                 prt("(3)   ¥²¡¼¥à¥×¥ì¥¤        ¥ª¥×¥·¥ç¥ó", 6, 5);
2102                 prt("(4)   ¹ÔÆ°Ãæ»ß´Ø·¸        ¥ª¥×¥·¥ç¥ó", 7, 5);
2103                 prt("(5)      ¸úΨ²½           ¥ª¥×¥·¥ç¥ó", 8, 5);
2104                 prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ  ¥ª¥×¥·¥ç¥ó", 9, 5);
2105                 prt("(R)    ¥×¥ì¥¤µ­Ï¿         ¥ª¥×¥·¥ç¥ó", 10, 5);
2106                 /* Special choices */
2107                 prt("(D)  ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 12, 5);
2108                 prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 13, 5);
2109                 prt("(A)    ¼«Æ°¥»¡¼¥Ö         ¥ª¥×¥·¥ç¥ó", 14, 5);
2110                 /* Window flags */
2111                 prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
2112                 /* Cheating */
2113                 prt("(C)       º¾µ½            ¥ª¥×¥·¥ç¥ó", 16, 5);
2114 #else
2115                 prt("(1) Input Options", 4, 5);
2116                 prt("(2) Output Options", 5, 5);
2117                 prt("(3) Game-Play Options", 6, 5);
2118                 prt("(4) Disturbance Options", 7, 5);
2119                 prt("(5) Efficiency Options", 8, 5);
2120                 prt("(6) Easy Auto-Destroyer Options", 9, 5);
2121                 prt("(R) Play-record Options", 10, 5);
2122
2123                 /* Special choices */
2124                 prt("(D) Base Delay Factor", 12, 5);
2125                 prt("(H) Hitpoint Warning", 13, 5);
2126                 prt("(A) Autosave Options", 14, 5);
2127
2128
2129                 /* Window flags */
2130                 prt("(W) Window Flags", 15, 5);
2131
2132                 /* Cheating */
2133                 prt("(C) Cheating Options", 16, 5);
2134 #endif
2135
2136
2137                 /* Prompt */
2138 #ifdef JP
2139                 prt("¥³¥Þ¥ó¥É:", 18, 0);
2140 #else
2141                 prt("Command: ", 18, 0);
2142 #endif
2143
2144
2145                 /* Get command */
2146                 k = inkey();
2147
2148                 /* Exit */
2149                 if (k == ESCAPE) break;
2150
2151                 /* Analyze */
2152                 switch (k)
2153                 {
2154                         /* General Options */
2155                         case '1':
2156                         {
2157                                 /* Process the general options */
2158 #ifdef JP
2159                                 do_cmd_options_aux(1, "¥­¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
2160 #else
2161                                 do_cmd_options_aux(1, "Input Options");
2162 #endif
2163
2164                                 break;
2165                         }
2166
2167                         /* General Options */
2168                         case '2':
2169                         {
2170                                 /* Process the general options */
2171 #ifdef JP
2172                                 do_cmd_options_aux(2, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
2173 #else
2174                                 do_cmd_options_aux(2, "Output Options");
2175 #endif
2176
2177                                 break;
2178                         }
2179
2180                         /* Inventory Options */
2181                         case '3':
2182                         {
2183                                 /* Spawn */
2184 #ifdef JP
2185                                 do_cmd_options_aux(3, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
2186 #else
2187                                 do_cmd_options_aux(3, "Game-Play Options");
2188 #endif
2189
2190                                 break;
2191                         }
2192
2193                         /* Disturbance Options */
2194                         case '4':
2195                         {
2196                                 /* Spawn */
2197 #ifdef JP
2198                                 do_cmd_options_aux(4, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
2199 #else
2200                                 do_cmd_options_aux(4, "Disturbance Options");
2201 #endif
2202
2203                                 break;
2204                         }
2205
2206                         /* Efficiency Options */
2207                         case '5':
2208                         {
2209                                 /* Spawn */
2210 #ifdef JP
2211                                 do_cmd_options_aux(5, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
2212 #else
2213                                 do_cmd_options_aux(5, "Efficiency Options");
2214 #endif
2215
2216                                 break;
2217                         }
2218
2219                         /* Object auto-destruction Options */
2220                         case '6':
2221                         {
2222                                 /* Spawn */
2223 #ifdef JP
2224                                 do_cmd_options_aux(7, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
2225 #else
2226                                 do_cmd_options_aux(7, "Easy Auto-Destroyer Options");
2227 #endif
2228                                 break;
2229                         }
2230
2231                         /* Play-record Options */
2232                         case 'R':
2233                         case 'r':
2234                         {
2235                                 /* Spawn */
2236 #ifdef JP
2237                                 do_cmd_options_aux(10, "¥×¥ì¥¤µ­Ï¿¥ª¥×¥·¥ç¥ó");
2238 #else
2239                                 do_cmd_options_aux(10, "Play-record Option");
2240 #endif
2241                                 break;
2242                         }
2243
2244                         /* Cheating Options */
2245                         case 'C':
2246                         {
2247                                 /* Spawn */
2248 #ifdef JP
2249                                 do_cmd_options_cheat("º¾µ½»Õ¤Ï·è¤·¤Æ¾¡Íø¤Ç¤­¤Ê¤¤¡ª");
2250 #else
2251                                 do_cmd_options_cheat("Cheaters never win");
2252 #endif
2253
2254                                 break;
2255                         }
2256
2257                         case 'a':
2258                         case 'A':
2259                         {
2260 #ifdef JP
2261                                 do_cmd_options_autosave("¼«Æ°¥»¡¼¥Ö");
2262 #else
2263                                 do_cmd_options_autosave("Autosave");
2264 #endif
2265
2266                                 break;
2267                         }
2268
2269                         /* Window flags */
2270                         case 'W':
2271                         case 'w':
2272                         {
2273                                 /* Spawn */
2274                                 do_cmd_options_win();
2275                                 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL |
2276                                                   PW_PLAYER | PW_MESSAGE | PW_OVERHEAD |
2277                                                   PW_MONSTER | PW_OBJECT | PW_SNAPSHOT |
2278                                                   PW_BORG_1 | PW_BORG_2 | PW_DUNGEON);
2279                                 break;
2280                         }
2281
2282                         /* Hack -- Delay Speed */
2283                         case 'D':
2284                         case 'd':
2285                         {
2286                                 /* Prompt */
2287 #ifdef JP
2288                                 prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 18, 0);
2289 #else
2290                                 prt("Command: Base Delay Factor", 18, 0);
2291 #endif
2292
2293
2294                                 /* Get a new value */
2295                                 while (1)
2296                                 {
2297                                         int msec = delay_factor * delay_factor * delay_factor;
2298 #ifdef JP
2299                                         prt(format("¸½ºß¤Î¥¦¥§¥¤¥È: %d (%d¥ß¥êÉÃ)",
2300 #else
2301                                         prt(format("Current base delay factor: %d (%d msec)",
2302 #endif
2303
2304                                                    delay_factor, msec), 22, 0);
2305 #ifdef JP
2306                                         prt("¥¦¥§¥¤¥È (0-9) ESC¤Ç·èÄê: ", 20, 0);
2307 #else
2308                                         prt("Delay Factor (0-9 or ESC to accept): ", 20, 0);
2309 #endif
2310
2311                                         k = inkey();
2312                                         if (k == ESCAPE) break;
2313                                         if (isdigit(k)) delay_factor = D2I(k);
2314                                         else bell();
2315                                 }
2316
2317                                 break;
2318                         }
2319
2320                         /* Hack -- hitpoint warning factor */
2321                         case 'H':
2322                         case 'h':
2323                         {
2324                                 /* Prompt */
2325 #ifdef JP
2326                                 prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 18, 0);
2327 #else
2328                                 prt("Command: Hitpoint Warning", 18, 0);
2329 #endif
2330
2331
2332                                 /* Get a new value */
2333                                 while (1)
2334                                 {
2335 #ifdef JP
2336             prt(format("¸½ºß¤ÎÄã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð: %d0%%",
2337                        hitpoint_warn), 22, 0);
2338 #else
2339                                         prt(format("Current hitpoint warning: %d0%%",
2340                                                    hitpoint_warn), 22, 0);
2341 #endif
2342
2343 #ifdef JP
2344                         prt("Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð (0-9) ESC¤Ç·èÄê: ", 20, 0);
2345 #else
2346                                         prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
2347 #endif
2348
2349                                         k = inkey();
2350                                         if (k == ESCAPE) break;
2351                                         if (isdigit(k)) hitpoint_warn = D2I(k);
2352                                         else bell();
2353                                 }
2354
2355                                 break;
2356                         }
2357
2358                         /* Unknown option */
2359                         default:
2360                         {
2361                                 /* Oops */
2362                                 bell();
2363                                 break;
2364                         }
2365                 }
2366
2367                 /* Flush messages */
2368                 msg_print(NULL);
2369         }
2370
2371
2372         /* Restore the screen */
2373         screen_load();
2374
2375         /* Hack - Redraw equippy chars */
2376         p_ptr->redraw |= (PR_EQUIPPY);
2377 }
2378
2379
2380
2381 /*
2382  * Ask for a "user pref line" and process it
2383  *
2384  * XXX XXX XXX Allow absolute file names?
2385  */
2386 void do_cmd_pref(void)
2387 {
2388         char buf[80];
2389
2390         /* Default */
2391         strcpy(buf, "");
2392
2393         /* Ask for a "user pref command" */
2394 #ifdef JP
2395         if (!get_string("ÀßÄêÊѹ¹¥³¥Þ¥ó¥É: ", buf, 80)) return;
2396 #else
2397         if (!get_string("Pref: ", buf, 80)) return;
2398 #endif
2399
2400
2401         /* Process that pref command */
2402         (void)process_pref_file_command(buf);
2403 }
2404
2405 void do_cmd_pickpref(void)
2406 {
2407         char buf[80];
2408         errr err;
2409         int i;
2410
2411 #ifdef JP
2412         if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2413 #else
2414         if(!get_check("Reload auto-pick preference file? ")) return;
2415 #endif
2416
2417         /* Free old entries */
2418         init_autopicker();
2419
2420         /* ¥­¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2421 #ifdef JP
2422         sprintf(buf, "picktype-%s.prf", player_name);
2423 #else
2424         sprintf(buf, "pickpref-%s.prf", player_name);
2425 #endif
2426         err = process_pickpref_file(buf);
2427
2428         if(err == 0)
2429         {
2430 #ifdef JP
2431                 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2432 #else
2433                 msg_format("loaded '%s'.", buf);
2434 #endif
2435         }
2436
2437         /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2438
2439         /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2440         if (0 > err)
2441         {
2442 #ifdef JP
2443                 err = process_pickpref_file("picktype.prf");
2444 #else
2445                 err = process_pickpref_file("pickpref.prf");
2446 #endif
2447
2448                 if(err == 0)
2449                 {
2450 #ifdef JP
2451                         msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2452 #else
2453                         msg_print("loaded 'pickpref.prf'.");
2454 #endif
2455                 }
2456         }
2457
2458
2459 #ifdef JP
2460         if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2461 #else
2462         if(err) msg_print("Failed to reload autopick preference.");
2463 #endif
2464 }
2465
2466 #ifdef ALLOW_MACROS
2467
2468 /*
2469  * Hack -- append all current macros to the given file
2470  */
2471 static errr macro_dump(cptr fname)
2472 {
2473         static cptr mark = "Macro Dump";
2474
2475         int i, line_num;
2476
2477         FILE *fff;
2478
2479         char buf[1024];
2480
2481         /* Build the filename */
2482         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
2483
2484         /* File type is "TEXT" */
2485         FILE_TYPE(FILE_TYPE_TEXT);
2486
2487         /* Append to the file */
2488         fff = open_auto_dump(buf, mark, &line_num);
2489         if (!fff) return (-1);
2490
2491         /* Start dumping */
2492 #ifdef JP
2493         fprintf(fff, "\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2494 #else
2495         fprintf(fff, "\n# Automatic macro dump\n\n");
2496 #endif
2497         line_num += 3;
2498
2499         /* Dump them */
2500         for (i = 0; i < macro__num; i++)
2501         {
2502                 /* Extract the action */
2503                 ascii_to_text(buf, macro__act[i]);
2504
2505                 /* Dump the macro */
2506                 fprintf(fff, "A:%s\n", buf);
2507
2508                 /* Extract the action */
2509                 ascii_to_text(buf, macro__pat[i]);
2510
2511                 /* Dump normal macros */
2512                 fprintf(fff, "P:%s\n", buf);
2513
2514                 /* End the macro */
2515                 fprintf(fff, "\n");
2516
2517                 /* count number of lines */
2518                 line_num += 3;
2519         }
2520
2521         /* Close */
2522         close_auto_dump(fff, mark, line_num);
2523
2524         /* Success */
2525         return (0);
2526 }
2527
2528
2529 /*
2530  * Hack -- ask for a "trigger" (see below)
2531  *
2532  * Note the complex use of the "inkey()" function from "util.c".
2533  *
2534  * Note that both "flush()" calls are extremely important.
2535  */
2536 static void do_cmd_macro_aux(char *buf)
2537 {
2538         int i, n = 0;
2539
2540         char tmp[1024];
2541
2542
2543         /* Flush */
2544         flush();
2545
2546         /* Do not process macros */
2547         inkey_base = TRUE;
2548
2549         /* First key */
2550         i = inkey();
2551
2552         /* Read the pattern */
2553         while (i)
2554         {
2555                 /* Save the key */
2556                 buf[n++] = i;
2557
2558                 /* Do not process macros */
2559                 inkey_base = TRUE;
2560
2561                 /* Do not wait for keys */
2562                 inkey_scan = TRUE;
2563
2564                 /* Attempt to read a key */
2565                 i = inkey();
2566         }
2567
2568         /* Terminate */
2569         buf[n] = '\0';
2570
2571         /* Flush */
2572         flush();
2573
2574
2575         /* Convert the trigger */
2576         ascii_to_text(tmp, buf);
2577
2578         /* Hack -- display the trigger */
2579         Term_addstr(-1, TERM_WHITE, tmp);
2580 }
2581
2582 #endif
2583
2584
2585 /*
2586  * Hack -- ask for a keymap "trigger" (see below)
2587  *
2588  * Note that both "flush()" calls are extremely important.  This may
2589  * no longer be true, since "util.c" is much simpler now.  XXX XXX XXX
2590  */
2591 static void do_cmd_macro_aux_keymap(char *buf)
2592 {
2593         char tmp[1024];
2594
2595
2596         /* Flush */
2597         flush();
2598
2599
2600         /* Get a key */
2601         buf[0] = inkey();
2602         buf[1] = '\0';
2603
2604
2605         /* Convert to ascii */
2606         ascii_to_text(tmp, buf);
2607
2608         /* Hack -- display the trigger */
2609         Term_addstr(-1, TERM_WHITE, tmp);
2610
2611
2612         /* Flush */
2613         flush();
2614 }
2615
2616
2617 /*
2618  * Hack -- append all keymaps to the given file
2619  */
2620 static errr keymap_dump(cptr fname)
2621 {
2622         static cptr mark = "Keymap Dump";
2623         int line_num;
2624         int i;
2625
2626         FILE *fff;
2627
2628         char key[1024];
2629         char buf[1024];
2630
2631         int mode;
2632
2633         /* Roguelike */
2634         if (rogue_like_commands)
2635         {
2636                 mode = KEYMAP_MODE_ROGUE;
2637         }
2638
2639         /* Original */
2640         else
2641         {
2642                 mode = KEYMAP_MODE_ORIG;
2643         }
2644
2645
2646         /* Build the filename */
2647         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
2648
2649         /* File type is "TEXT" */
2650         FILE_TYPE(FILE_TYPE_TEXT);
2651
2652         /* Append to the file */
2653         fff = open_auto_dump(buf, mark, &line_num);
2654         if (!fff) return -1;
2655
2656         /* Start dumping */
2657 #ifdef JP
2658         fprintf(fff, "\n# ¼«Æ°¥­¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2659 #else
2660         fprintf(fff, "\n# Automatic keymap dump\n\n");
2661 #endif
2662         line_num += 3;
2663
2664         /* Dump them */
2665         for (i = 0; i < 256; i++)
2666         {
2667                 cptr act;
2668
2669                 /* Loop up the keymap */
2670                 act = keymap_act[mode][i];
2671
2672                 /* Skip empty keymaps */
2673                 if (!act) continue;
2674
2675                 /* Encode the key */
2676                 buf[0] = i;
2677                 buf[1] = '\0';
2678                 ascii_to_text(key, buf);
2679
2680                 /* Encode the action */
2681                 ascii_to_text(buf, act);
2682
2683                 /* Dump the macro */
2684                 fprintf(fff, "A:%s\n", buf);
2685                 fprintf(fff, "C:%d:%s\n", mode, key);
2686                 line_num += 2;
2687         }
2688
2689         /* Close */
2690         close_auto_dump(fff, mark, line_num);
2691
2692         /* Success */
2693         return (0);
2694 }
2695
2696
2697
2698 /*
2699  * Interact with "macros"
2700  *
2701  * Note that the macro "action" must be defined before the trigger.
2702  *
2703  * Could use some helpful instructions on this page.  XXX XXX XXX
2704  */
2705 void do_cmd_macros(void)
2706 {
2707         int i;
2708
2709         char tmp[1024];
2710
2711         char buf[1024];
2712
2713         int mode;
2714
2715
2716         /* Roguelike */
2717         if (rogue_like_commands)
2718         {
2719                 mode = KEYMAP_MODE_ROGUE;
2720         }
2721
2722         /* Original */
2723         else
2724         {
2725                 mode = KEYMAP_MODE_ORIG;
2726         }
2727
2728         /* File type is "TEXT" */
2729         FILE_TYPE(FILE_TYPE_TEXT);
2730
2731
2732         /* Save screen */
2733         screen_save();
2734
2735
2736         /* Process requests until done */
2737         while (1)
2738         {
2739                 /* Clear screen */
2740                 Term_clear();
2741
2742                 /* Describe */
2743 #ifdef JP
2744                 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
2745 #else
2746                 prt("Interact with Macros", 2, 0);
2747 #endif
2748
2749
2750
2751                 /* Describe that action */
2752 #ifdef JP
2753                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
2754 #else
2755                 prt("Current action (if any) shown below:", 20, 0);
2756 #endif
2757
2758
2759                 /* Analyze the current action */
2760                 ascii_to_text(buf, macro__buf);
2761
2762                 /* Display the current action */
2763                 prt(buf, 22, 0);
2764
2765
2766                 /* Selections */
2767 #ifdef JP
2768                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
2769 #else
2770                 prt("(1) Load a user pref file", 4, 5);
2771 #endif
2772
2773 #ifdef ALLOW_MACROS
2774 #ifdef JP
2775                 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
2776                 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
2777                 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
2778                 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
2779                 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥­¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
2780                 prt("(7) ¥­¡¼ÇÛÃ֤γÎǧ", 10, 5);
2781                 prt("(8) ¥­¡¼ÇÛÃ֤κîÀ®", 11, 5);
2782                 prt("(9) ¥­¡¼ÇÛÃ֤κï½ü", 12, 5);
2783                 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
2784 #else
2785                 prt("(2) Append macros to a file", 5, 5);
2786                 prt("(3) Query a macro", 6, 5);
2787                 prt("(4) Create a macro", 7, 5);
2788                 prt("(5) Remove a macro", 8, 5);
2789                 prt("(6) Append keymaps to a file", 9, 5);
2790                 prt("(7) Query a keymap", 10, 5);
2791                 prt("(8) Create a keymap", 11, 5);
2792                 prt("(9) Remove a keymap", 12, 5);
2793                 prt("(0) Enter a new action", 13, 5);
2794 #endif
2795
2796 #endif /* ALLOW_MACROS */
2797
2798                 /* Prompt */
2799 #ifdef JP
2800                 prt("¥³¥Þ¥ó¥É: ", 16, 0);
2801 #else
2802                 prt("Command: ", 16, 0);
2803 #endif
2804
2805
2806                 /* Get a command */
2807                 i = inkey();
2808
2809                 /* Leave */
2810                 if (i == ESCAPE) break;
2811
2812                 /* Load a 'macro' file */
2813                 else if (i == '1')
2814                 {
2815                         errr err;
2816
2817                         /* Prompt */
2818 #ifdef JP
2819                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
2820 #else
2821                         prt("Command: Load a user pref file", 16, 0);
2822 #endif
2823
2824
2825                         /* Prompt */
2826 #ifdef JP
2827                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
2828 #else
2829                         prt("File: ", 18, 0);
2830 #endif
2831
2832
2833                         /* Default filename */
2834                         sprintf(tmp, "%s.prf", player_name);
2835
2836                         /* Ask for a file */
2837                         if (!askfor_aux(tmp, 80)) continue;
2838
2839                         /* Process the given filename */
2840                         err = process_pref_file(tmp);
2841                         if (-2 == err)
2842                         {
2843 #ifdef JP
2844                                 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
2845 #else
2846                                 msg_format("Loaded default '%s'.", tmp);
2847 #endif
2848                         }
2849                         else if (err)
2850                         {
2851                                 /* Prompt */
2852 #ifdef JP
2853                                 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
2854 #else
2855                                 msg_format("Failed to load '%s'!");
2856 #endif
2857                         }
2858                         else
2859                         {
2860 #ifdef JP
2861                                 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
2862 #else
2863                                 msg_format("Loaded '%s'.", tmp);
2864 #endif
2865                         }
2866                 }
2867
2868 #ifdef ALLOW_MACROS
2869
2870                 /* Save macros */
2871                 else if (i == '2')
2872                 {
2873                         /* Prompt */
2874 #ifdef JP
2875                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
2876 #else
2877                         prt("Command: Append macros to a file", 16, 0);
2878 #endif
2879
2880
2881                         /* Prompt */
2882 #ifdef JP
2883                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
2884 #else
2885                         prt("File: ", 18, 0);
2886 #endif
2887
2888
2889                         /* Default filename */
2890                         sprintf(tmp, "%s.prf", player_name);
2891
2892                         /* Ask for a file */
2893                         if (!askfor_aux(tmp, 80)) continue;
2894
2895                         /* Dump the macros */
2896                         (void)macro_dump(tmp);
2897
2898                         /* Prompt */
2899 #ifdef JP
2900                         msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
2901 #else
2902                         msg_print("Appended macros.");
2903 #endif
2904
2905                 }
2906
2907                 /* Query a macro */
2908                 else if (i == '3')
2909                 {
2910                         int k;
2911
2912                         /* Prompt */
2913 #ifdef JP
2914                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
2915 #else
2916                         prt("Command: Query a macro", 16, 0);
2917 #endif
2918
2919
2920                         /* Prompt */
2921 #ifdef JP
2922                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
2923 #else
2924                         prt("Trigger: ", 18, 0);
2925 #endif
2926
2927
2928                         /* Get a macro trigger */
2929                         do_cmd_macro_aux(buf);
2930
2931                         /* Acquire action */
2932                         k = macro_find_exact(buf);
2933
2934                         /* Nothing found */
2935                         if (k < 0)
2936                         {
2937                                 /* Prompt */
2938 #ifdef JP
2939                                 msg_print("¤½¤Î¥­¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
2940 #else
2941                                 msg_print("Found no macro.");
2942 #endif
2943
2944                         }
2945
2946                         /* Found one */
2947                         else
2948                         {
2949                                 /* Obtain the action */
2950                                 strcpy(macro__buf, macro__act[k]);
2951
2952                                 /* Analyze the current action */
2953                                 ascii_to_text(buf, macro__buf);
2954
2955                                 /* Display the current action */
2956                                 prt(buf, 22, 0);
2957
2958                                 /* Prompt */
2959 #ifdef JP
2960                                 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
2961 #else
2962                                 msg_print("Found a macro.");
2963 #endif
2964
2965                         }
2966                 }
2967
2968                 /* Create a macro */
2969                 else if (i == '4')
2970                 {
2971                         /* Prompt */
2972 #ifdef JP
2973                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
2974 #else
2975                         prt("Command: Create a macro", 16, 0);
2976 #endif
2977
2978
2979                         /* Prompt */
2980 #ifdef JP
2981                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
2982 #else
2983                         prt("Trigger: ", 18, 0);
2984 #endif
2985
2986
2987                         /* Get a macro trigger */
2988                         do_cmd_macro_aux(buf);
2989
2990                         /* Clear */
2991                         clear_from(20);
2992
2993                         /* Prompt */
2994 #ifdef JP
2995                         prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
2996 #else
2997                         prt("Action: ", 20, 0);
2998 #endif
2999
3000
3001                         /* Convert to text */
3002                         ascii_to_text(tmp, macro__buf);
3003
3004                         /* Get an encoded action */
3005                         if (askfor_aux(tmp, 80))
3006                         {
3007                                 /* Convert to ascii */
3008                                 text_to_ascii(macro__buf, tmp);
3009
3010                                 /* Link the macro */
3011                                 macro_add(buf, macro__buf);
3012
3013                                 /* Prompt */
3014 #ifdef JP
3015                                 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3016 #else
3017                                 msg_print("Added a macro.");
3018 #endif
3019
3020                         }
3021                 }
3022
3023                 /* Remove a macro */
3024                 else if (i == '5')
3025                 {
3026                         /* Prompt */
3027 #ifdef JP
3028                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3029 #else
3030                         prt("Command: Remove a macro", 16, 0);
3031 #endif
3032
3033
3034                         /* Prompt */
3035 #ifdef JP
3036                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3037 #else
3038                         prt("Trigger: ", 18, 0);
3039 #endif
3040
3041
3042                         /* Get a macro trigger */
3043                         do_cmd_macro_aux(buf);
3044
3045                         /* Link the macro */
3046                         macro_add(buf, buf);
3047
3048                         /* Prompt */
3049 #ifdef JP
3050                         msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3051 #else
3052                         msg_print("Removed a macro.");
3053 #endif
3054
3055                 }
3056
3057                 /* Save keymaps */
3058                 else if (i == '6')
3059                 {
3060                         /* Prompt */
3061 #ifdef JP
3062                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3063 #else
3064                         prt("Command: Append keymaps to a file", 16, 0);
3065 #endif
3066
3067
3068                         /* Prompt */
3069 #ifdef JP
3070                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3071 #else
3072                         prt("File: ", 18, 0);
3073 #endif
3074
3075
3076                         /* Default filename */
3077                         sprintf(tmp, "%s.prf", player_name);
3078
3079                         /* Ask for a file */
3080                         if (!askfor_aux(tmp, 80)) continue;
3081
3082                         /* Dump the macros */
3083                         (void)keymap_dump(tmp);
3084
3085                         /* Prompt */
3086 #ifdef JP
3087                         msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3088 #else
3089                         msg_print("Appended keymaps.");
3090 #endif
3091
3092                 }
3093
3094                 /* Query a keymap */
3095                 else if (i == '7')
3096                 {
3097                         cptr act;
3098
3099                         /* Prompt */
3100 #ifdef JP
3101                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤γÎǧ", 16, 0);
3102 #else
3103                         prt("Command: Query a keymap", 16, 0);
3104 #endif
3105
3106
3107                         /* Prompt */
3108 #ifdef JP
3109                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3110 #else
3111                         prt("Keypress: ", 18, 0);
3112 #endif
3113
3114
3115                         /* Get a keymap trigger */
3116                         do_cmd_macro_aux_keymap(buf);
3117
3118                         /* Look up the keymap */
3119                         act = keymap_act[mode][(byte)(buf[0])];
3120
3121                         /* Nothing found */
3122                         if (!act)
3123                         {
3124                                 /* Prompt */
3125 #ifdef JP
3126                                 msg_print("¥­¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3127 #else
3128                                 msg_print("Found no keymap.");
3129 #endif
3130
3131                         }
3132
3133                         /* Found one */
3134                         else
3135                         {
3136                                 /* Obtain the action */
3137                                 strcpy(macro__buf, act);
3138
3139                                 /* Analyze the current action */
3140                                 ascii_to_text(buf, macro__buf);
3141
3142                                 /* Display the current action */
3143                                 prt(buf, 22, 0);
3144
3145                                 /* Prompt */
3146 #ifdef JP
3147                                 msg_print("¥­¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3148 #else
3149                                 msg_print("Found a keymap.");
3150 #endif
3151
3152                         }
3153                 }
3154
3155                 /* Create a keymap */
3156                 else if (i == '8')
3157                 {
3158                         /* Prompt */
3159 #ifdef JP
3160                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κîÀ®", 16, 0);
3161 #else
3162                         prt("Command: Create a keymap", 16, 0);
3163 #endif
3164
3165
3166                         /* Prompt */
3167 #ifdef JP
3168                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3169 #else
3170                         prt("Keypress: ", 18, 0);
3171 #endif
3172
3173
3174                         /* Get a keymap trigger */
3175                         do_cmd_macro_aux_keymap(buf);
3176
3177                         /* Clear */
3178                         clear_from(20);
3179
3180                         /* Prompt */
3181 #ifdef JP
3182                         prt("¹ÔÆ°: ", 20, 0);
3183 #else
3184                         prt("Action: ", 20, 0);
3185 #endif
3186
3187
3188                         /* Convert to text */
3189                         ascii_to_text(tmp, macro__buf);
3190
3191                         /* Get an encoded action */
3192                         if (askfor_aux(tmp, 80))
3193                         {
3194                                 /* Convert to ascii */
3195                                 text_to_ascii(macro__buf, tmp);
3196
3197                                 /* Free old keymap */
3198                                 string_free(keymap_act[mode][(byte)(buf[0])]);
3199
3200                                 /* Make new keymap */
3201                                 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3202
3203                                 /* Prompt */
3204 #ifdef JP
3205                                 msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3206 #else
3207                                 msg_print("Added a keymap.");
3208 #endif
3209
3210                         }
3211                 }
3212
3213                 /* Remove a keymap */
3214                 else if (i == '9')
3215                 {
3216                         /* Prompt */
3217 #ifdef JP
3218                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κï½ü", 16, 0);
3219 #else
3220                         prt("Command: Remove a keymap", 16, 0);
3221 #endif
3222
3223
3224                         /* Prompt */
3225 #ifdef JP
3226                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3227 #else
3228                         prt("Keypress: ", 18, 0);
3229 #endif
3230
3231
3232                         /* Get a keymap trigger */
3233                         do_cmd_macro_aux_keymap(buf);
3234
3235                         /* Free old keymap */
3236                         string_free(keymap_act[mode][(byte)(buf[0])]);
3237
3238                         /* Make new keymap */
3239                         keymap_act[mode][(byte)(buf[0])] = NULL;
3240
3241                         /* Prompt */
3242 #ifdef JP
3243                         msg_print("¥­¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3244 #else
3245                         msg_print("Removed a keymap.");
3246 #endif
3247
3248                 }
3249
3250                 /* Enter a new action */
3251                 else if (i == '0')
3252                 {
3253                         /* Prompt */
3254 #ifdef JP
3255                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3256 #else
3257                         prt("Command: Enter a new action", 16, 0);
3258 #endif
3259
3260
3261                         /* Go to the correct location */
3262                         Term_gotoxy(0, 22);
3263
3264                         /* Hack -- limit the value */
3265                         tmp[80] = '\0';
3266
3267                         /* Get an encoded action */
3268                         if (!askfor_aux(buf, 80)) continue;
3269
3270                         /* Extract an action */
3271                         text_to_ascii(macro__buf, buf);
3272                 }
3273
3274 #endif /* ALLOW_MACROS */
3275
3276                 /* Oops */
3277                 else
3278                 {
3279                         /* Oops */
3280                         bell();
3281                 }
3282
3283                 /* Flush messages */
3284                 msg_print(NULL);
3285         }
3286
3287         /* Load screen */
3288         screen_load();
3289 }
3290
3291
3292 static void cmd_visuals_aux(char i, int *num, int max)
3293 {
3294         if (iscntrl(i))
3295         {
3296                 char str[10] = "";
3297                 int tmp;
3298
3299                 sprintf(str, "%d", *num);
3300
3301                 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3302                         return;
3303
3304                 tmp = strtol(str, NULL, 0);
3305                 if (tmp >= 0 && tmp < max)
3306                         *num = tmp;
3307                 return;
3308         }
3309         else if (isupper(i))
3310                 *num = (*num + max - 1) % max;
3311         else
3312                 *num = (*num + 1) % max;
3313
3314         return;
3315 }
3316
3317 /*
3318  * Interact with "visuals"
3319  */
3320 void do_cmd_visuals(void)
3321 {
3322         int i;
3323
3324         FILE *fff;
3325
3326         char tmp[160];
3327
3328         char buf[1024];
3329
3330
3331         /* File type is "TEXT" */
3332         FILE_TYPE(FILE_TYPE_TEXT);
3333
3334
3335         /* Save the screen */
3336         screen_save();
3337
3338
3339         /* Interact until done */
3340         while (1)
3341         {
3342                 /* Clear screen */
3343                 Term_clear();
3344
3345                 /* Ask for a choice */
3346 #ifdef JP
3347                 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3348 #else
3349                 prt("Interact with Visuals", 2, 0);
3350 #endif
3351
3352
3353                 /* Give some choices */
3354 #ifdef JP
3355                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3356 #else
3357                 prt("(1) Load a user pref file", 4, 5);
3358 #endif
3359
3360 #ifdef ALLOW_VISUALS
3361 #ifdef JP
3362                 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
3363                 prt("(3) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 6, 5);
3364                 prt("(4) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 7, 5);
3365                 prt("(5) (̤»ÈÍÑ)", 8, 5);
3366                 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3367                 prt("(7) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3368                 prt("(8) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3369                 prt("(9) (̤»ÈÍÑ)", 12, 5);
3370 #else
3371                 prt("(2) Dump monster attr/chars", 5, 5);
3372                 prt("(3) Dump object attr/chars", 6, 5);
3373                 prt("(4) Dump feature attr/chars", 7, 5);
3374                 prt("(5) (unused)", 8, 5);
3375                 prt("(6) Change monster attr/chars", 9, 5);
3376                 prt("(7) Change object attr/chars", 10, 5);
3377                 prt("(8) Change feature attr/chars", 11, 5);
3378                 prt("(9) (unused)", 12, 5);
3379 #endif
3380
3381 #endif
3382 #ifdef JP
3383                 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3384 #else
3385                 prt("(0) Reset visuals", 13, 5);
3386 #endif
3387
3388
3389                 /* Prompt */
3390 #ifdef JP
3391                 prt("¥³¥Þ¥ó¥É:", 18, 0);
3392 #else
3393                 prt("Command: ", 15, 0);
3394 #endif
3395
3396
3397                 /* Prompt */
3398                 i = inkey();
3399
3400                 /* Done */
3401                 if (i == ESCAPE) break;
3402
3403                 /* Load a 'pref' file */
3404                 else if (i == '1')
3405                 {
3406                         /* Prompt */
3407 #ifdef JP
3408                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3409 #else
3410                         prt("Command: Load a user pref file", 15, 0);
3411 #endif
3412
3413
3414                         /* Prompt */
3415 #ifdef JP
3416                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3417 #else
3418                         prt("File: ", 17, 0);
3419 #endif
3420
3421
3422                         /* Default filename */
3423                         sprintf(tmp, "%s.prf", player_name);
3424
3425                         /* Query */
3426                         if (!askfor_aux(tmp, 70)) continue;
3427
3428                         /* Process the given filename */
3429                         (void)process_pref_file(tmp);
3430                 }
3431
3432 #ifdef ALLOW_VISUALS
3433
3434                 /* Dump monster attr/chars */
3435                 else if (i == '2')
3436                 {
3437                         static cptr mark = "Monster attr/chars";
3438                         int line_num;
3439
3440                         /* Prompt */
3441 #ifdef JP
3442                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3443 #else
3444                         prt("Command: Dump monster attr/chars", 15, 0);
3445 #endif
3446
3447
3448                         /* Prompt */
3449 #ifdef JP
3450                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3451 #else
3452                         prt("File: ", 17, 0);
3453 #endif
3454
3455
3456                         /* Default filename */
3457                         sprintf(tmp, "%s.prf", player_name);
3458                         
3459                         /* Get a filename */
3460                         if (!askfor_aux(tmp, 70)) continue;
3461
3462                         /* Build the filename */
3463                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
3464
3465                         /* Append to the file */
3466                         fff = open_auto_dump(buf, mark, &line_num);
3467                         if (!fff) continue;
3468
3469                         /* Start dumping */
3470 #ifdef JP
3471                         fprintf(fff, "\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3472 #else
3473                         fprintf(fff, "\n# Monster attr/char definitions\n\n");
3474 #endif
3475                         line_num += 3;
3476
3477                         /* Dump monsters */
3478                         for (i = 0; i < max_r_idx; i++)
3479                         {
3480                                 monster_race *r_ptr = &r_info[i];
3481
3482                                 /* Skip non-entries */
3483                                 if (!r_ptr->name) continue;
3484
3485                                 /* Dump a comment */
3486                                 fprintf(fff, "# %s\n", (r_name + r_ptr->name));
3487                                 line_num++;
3488
3489                                 /* Dump the monster attr/char info */
3490                                 fprintf(fff, "R:%d:0x%02X:0x%02X\n\n", i,
3491                                         (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3492                                 line_num += 2;
3493                         }
3494
3495                         /* Close */
3496                         close_auto_dump(fff, mark, line_num);
3497
3498                         /* Message */
3499 #ifdef JP
3500                         msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3501 #else
3502                         msg_print("Dumped monster attr/chars.");
3503 #endif
3504
3505                 }
3506
3507                 /* Dump object attr/chars */
3508                 else if (i == '3')
3509                 {
3510                         static cptr mark = "Object attr/chars";
3511                         int line_num;
3512
3513                         /* Prompt */
3514 #ifdef JP
3515                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3516 #else
3517                         prt("Command: Dump object attr/chars", 15, 0);
3518 #endif
3519
3520
3521                         /* Prompt */
3522 #ifdef JP
3523                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3524 #else
3525                         prt("File: ", 17, 0);
3526 #endif
3527
3528
3529                         /* Default filename */
3530                         sprintf(tmp, "%s.prf", player_name);
3531
3532                         /* Get a filename */
3533                         if (!askfor_aux(tmp, 70)) continue;
3534
3535                         /* Build the filename */
3536                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
3537
3538                         /* Append to the file */
3539                         fff = open_auto_dump(buf, mark, &line_num);
3540                         if (!fff) continue;
3541
3542                         /* Start dumping */
3543 #ifdef JP
3544                         fprintf(fff, "\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3545 #else
3546                         fprintf(fff, "\n# Object attr/char definitions\n\n");
3547 #endif
3548                         line_num += 3;
3549
3550                         /* Dump objects */
3551                         for (i = 0; i < max_k_idx; i++)
3552                         {
3553                                 object_kind *k_ptr = &k_info[i];
3554
3555                                 /* Skip non-entries */
3556                                 if (!k_ptr->name) continue;
3557
3558                                 /* Dump a comment */
3559                                 fprintf(fff, "# %s\n", (k_name + k_ptr->name));
3560                                 line_num++;
3561
3562                                 /* Dump the object attr/char info */
3563                                 fprintf(fff, "K:%d:0x%02X:0x%02X\n\n", i,
3564                                         (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3565                                 line_num += 2;
3566                         }
3567
3568                         /* Close */
3569                         close_auto_dump(fff, mark, line_num);
3570
3571                         /* Message */
3572 #ifdef JP
3573                         msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3574 #else
3575                         msg_print("Dumped object attr/chars.");
3576 #endif
3577
3578                 }
3579
3580                 /* Dump feature attr/chars */
3581                 else if (i == '4')
3582                 {
3583                         static cptr mark = "Feature attr/chars";
3584                         int line_num;
3585
3586                         /* Prompt */
3587 #ifdef JP
3588                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3589 #else
3590                         prt("Command: Dump feature attr/chars", 15, 0);
3591 #endif
3592
3593
3594                         /* Prompt */
3595 #ifdef JP
3596                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3597 #else
3598                         prt("File: ", 17, 0);
3599 #endif
3600
3601
3602                         /* Default filename */
3603                         sprintf(tmp, "%s.prf", player_name);
3604
3605                         /* Get a filename */
3606                         if (!askfor_aux(tmp, 70)) continue;
3607
3608                         /* Build the filename */
3609                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
3610
3611                         /* Append to the file */
3612                         fff = open_auto_dump(buf, mark, &line_num);
3613                         if (!fff) continue;
3614
3615                         /* Start dumping */
3616 #ifdef JP
3617                         fprintf(fff, "\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3618 #else
3619                         fprintf(fff, "\n# Feature attr/char definitions\n\n");
3620 #endif
3621                         line_num += 3;
3622
3623                         /* Dump features */
3624                         for (i = 0; i < max_f_idx; i++)
3625                         {
3626                                 feature_type *f_ptr = &f_info[i];
3627
3628                                 /* Skip non-entries */
3629                                 if (!f_ptr->name) continue;
3630
3631                                 /* Dump a comment */
3632                                 fprintf(fff, "# %s\n", (f_name + f_ptr->name));
3633                                 line_num++;
3634
3635                                 /* Dump the feature attr/char info */
3636                                 fprintf(fff, "F:%d:0x%02X:0x%02X\n\n", i,
3637                                         (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3638                                 line_num += 2;
3639                         }
3640
3641                         /* Close */
3642                         close_auto_dump(fff, mark, line_num);
3643
3644                         /* Message */
3645 #ifdef JP
3646                         msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3647 #else
3648                         msg_print("Dumped feature attr/chars.");
3649 #endif
3650
3651                 }
3652
3653                 /* Modify monster attr/chars */
3654                 else if (i == '6')
3655                 {
3656                         static int r = 0;
3657
3658                         /* Prompt */
3659 #ifdef JP
3660                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3661 #else
3662                         prt("Command: Change monster attr/chars", 15, 0);
3663 #endif
3664
3665
3666                         /* Hack -- query until done */
3667                         while (1)
3668                         {
3669                                 monster_race *r_ptr = &r_info[r];
3670                                 char c;
3671                                 int t;
3672
3673                                 byte da = (r_ptr->d_attr);
3674                                 byte dc = (r_ptr->d_char);
3675                                 byte ca = (r_ptr->x_attr);
3676                                 byte cc = (r_ptr->x_char);
3677
3678                                 /* Label the object */
3679 #ifdef JP
3680                                 Term_putstr(5, 17, -1, TERM_WHITE,
3681                                             format("¥â¥ó¥¹¥¿¡¼ = %d, Ì¾Á° = %-40.40s",
3682                                                    r, (r_name + r_ptr->name)));
3683 #else
3684                                 Term_putstr(5, 17, -1, TERM_WHITE,
3685                                             format("Monster = %d, Name = %-40.40s",
3686                                                    r, (r_name + r_ptr->name)));
3687 #endif
3688
3689
3690                                 /* Label the Default values */
3691 #ifdef JP
3692                                 Term_putstr(10, 19, -1, TERM_WHITE,
3693                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3u / %3u", da, dc));
3694 #else
3695                                 Term_putstr(10, 19, -1, TERM_WHITE,
3696                                             format("Default attr/char = %3u / %3u", da, dc));
3697 #endif
3698
3699                                 Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>");
3700                                 Term_putch(43, 19, da, dc);
3701                                 if (use_bigtile)
3702                                 {
3703                                         if (da & 0x80)
3704                                                 Term_putch(44, 19, 255, -1);
3705                                         else
3706                                                 Term_putch(44, 19, 0, ' ');
3707                                 }
3708
3709                                 /* Label the Current values */
3710 #ifdef JP
3711                                 Term_putstr(10, 20, -1, TERM_WHITE,
3712                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3u / %3u", ca, cc));
3713 #else
3714                                 Term_putstr(10, 20, -1, TERM_WHITE,
3715                                             format("Current attr/char = %3u / %3u", ca, cc));
3716 #endif
3717
3718                                 Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>");
3719                                 Term_putch(43, 20, ca, cc);
3720                                 if (use_bigtile)
3721                                 {
3722                                         if (ca & 0x80)
3723                                                 Term_putch(44, 20, 255, -1);
3724                                         else
3725                                                 Term_putch(44, 20, 0, ' ');
3726                                 }
3727
3728                                 /* Prompt */
3729 #ifdef JP
3730                                 Term_putstr(0, 22, -1, TERM_WHITE,
3731                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
3732 #else
3733                                 Term_putstr(0, 22, -1, TERM_WHITE,
3734                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
3735 #endif
3736
3737                                 /* Get a command */
3738                                 i = inkey();
3739
3740                                 /* All done */
3741                                 if (i == ESCAPE) break;
3742
3743                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3744                                 else if (isupper(i)) c = 'a' + i - 'A';
3745                                 else c = i;
3746
3747                                 switch (c)
3748                                 {
3749                                 case 'n':
3750                                         cmd_visuals_aux(i, &r, max_r_idx);
3751                                         break;
3752                                 case 'a':
3753                                         t = (int)r_ptr->x_attr;
3754                                         cmd_visuals_aux(i, &t, 256);
3755                                         r_ptr->x_attr = (byte)t;
3756                                         break;
3757                                 case 'c':
3758                                         t = (int)r_ptr->x_char;
3759                                         cmd_visuals_aux(i, &t, 256);
3760                                         r_ptr->x_char = (byte)t;
3761                                         break;
3762                                 }
3763                         }
3764                 }
3765
3766                 /* Modify object attr/chars */
3767                 else if (i == '7')
3768                 {
3769                         static int k = 0;
3770
3771                         /* Prompt */
3772 #ifdef JP
3773                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3774 #else
3775                         prt("Command: Change object attr/chars", 15, 0);
3776 #endif
3777
3778
3779                         /* Hack -- query until done */
3780                         while (1)
3781                         {
3782                                 object_kind *k_ptr = &k_info[k];
3783                                 char c;
3784                                 int t;
3785
3786                                 byte da = (byte)k_ptr->d_attr;
3787                                 byte dc = (byte)k_ptr->d_char;
3788                                 byte ca = (byte)k_ptr->x_attr;
3789                                 byte cc = (byte)k_ptr->x_char;
3790
3791                                 /* Label the object */
3792 #ifdef JP
3793                                 Term_putstr(5, 17, -1, TERM_WHITE,
3794                                             format("¥¢¥¤¥Æ¥à = %d, Ì¾Á° = %-40.40s",
3795                                                    k, (k_name + k_ptr->name)));
3796 #else
3797                                 Term_putstr(5, 17, -1, TERM_WHITE,
3798                                             format("Object = %d, Name = %-40.40s",
3799                                                    k, (k_name + k_ptr->name)));
3800 #endif
3801
3802
3803                                 /* Label the Default values */
3804 #ifdef JP
3805                                 Term_putstr(10, 19, -1, TERM_WHITE,
3806                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
3807 #else
3808                                 Term_putstr(10, 19, -1, TERM_WHITE,
3809                                             format("Default attr/char = %3d / %3d", da, dc));
3810 #endif
3811
3812                                 Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>");
3813                                 Term_putch(43, 19, da, dc);
3814                                 if (use_bigtile)
3815                                 {
3816                                         if (da & 0x80)
3817                                                 Term_putch(44, 19, 255, -1);
3818                                         else
3819                                                 Term_putch(44, 19, 0, ' ');
3820                                 }
3821
3822                                 /* Label the Current values */
3823 #ifdef JP
3824                                 Term_putstr(10, 20, -1, TERM_WHITE,
3825                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
3826 #else
3827                                 Term_putstr(10, 20, -1, TERM_WHITE,
3828                                             format("Current attr/char = %3d / %3d", ca, cc));
3829 #endif
3830
3831                                 Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>");
3832                                 Term_putch(43, 20, ca, cc);
3833                                 if (use_bigtile)
3834                                 {
3835                                         if (ca & 0x80)
3836                                                 Term_putch(44, 20, 255, -1);
3837                                         else
3838                                                 Term_putch(44, 20, 0, ' ');
3839                                 }
3840
3841                                 /* Prompt */
3842 #ifdef JP
3843                                 Term_putstr(0, 22, -1, TERM_WHITE,
3844                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
3845 #else
3846                                 Term_putstr(0, 22, -1, TERM_WHITE,
3847                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
3848 #endif
3849
3850                                 /* Get a command */
3851                                 i = inkey();
3852
3853                                 /* All done */
3854                                 if (i == ESCAPE) break;
3855
3856                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3857                                 else if (isupper(i)) c = 'a' + i - 'A';
3858                                 else c = i;
3859
3860                                 switch (c)
3861                                 {
3862                                 case 'n':
3863                                         cmd_visuals_aux(i, &k, max_k_idx);
3864                                         break;
3865                                 case 'a':
3866                                         t = (int)k_info[k].x_attr;
3867                                         cmd_visuals_aux(i, &t, 256);
3868                                         k_info[k].x_attr = (byte)t;
3869                                         break;
3870                                 case 'c':
3871                                         t = (int)k_info[k].x_char;
3872                                         cmd_visuals_aux(i, &t, 256);
3873                                         k_info[k].x_char = (byte)t;
3874                                         break;
3875                                 }
3876                         }
3877                 }
3878
3879                 /* Modify feature attr/chars */
3880                 else if (i == '8')
3881                 {
3882                         static int f = 0;
3883
3884                         /* Prompt */
3885 #ifdef JP
3886                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3887 #else
3888                         prt("Command: Change feature attr/chars", 15, 0);
3889 #endif
3890
3891
3892                         /* Hack -- query until done */
3893                         while (1)
3894                         {
3895                                 feature_type *f_ptr = &f_info[f];
3896                                 char c;
3897                                 int t;
3898
3899                                 byte da = (byte)f_ptr->d_attr;
3900                                 byte dc = (byte)f_ptr->d_char;
3901                                 byte ca = (byte)f_ptr->x_attr;
3902                                 byte cc = (byte)f_ptr->x_char;
3903
3904                                 /* Label the object */
3905 #ifdef JP
3906                                 Term_putstr(5, 17, -1, TERM_WHITE,
3907                                             format("ÃÏ·Á = %d, Ì¾Á° = %-40.40s",
3908                                                    f, (f_name + f_ptr->name)));
3909 #else
3910                                 Term_putstr(5, 17, -1, TERM_WHITE,
3911                                             format("Terrain = %d, Name = %-40.40s",
3912                                                    f, (f_name + f_ptr->name)));
3913 #endif
3914
3915
3916                                 /* Label the Default values */
3917 #ifdef JP
3918                                 Term_putstr(10, 19, -1, TERM_WHITE,
3919                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
3920 #else
3921                                 Term_putstr(10, 19, -1, TERM_WHITE,
3922                                             format("Default attr/char = %3d / %3d", da, dc));
3923 #endif
3924
3925                                 Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>");
3926                                 Term_putch(43, 19, da, dc);
3927                                 if (use_bigtile)
3928                                 {
3929                                         if (da & 0x80)
3930                                                 Term_putch(44, 19, 255, -1);
3931                                         else
3932                                                 Term_putch(44, 19, 0, ' ');
3933                                 }
3934
3935                                 /* Label the Current values */
3936 #ifdef JP
3937                                 Term_putstr(10, 20, -1, TERM_WHITE,
3938                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
3939 #else
3940                                 Term_putstr(10, 20, -1, TERM_WHITE,
3941                                             format("Current attr/char = %3d / %3d", ca, cc));
3942 #endif
3943
3944                                 Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>");
3945                                 Term_putch(43, 20, ca, cc);
3946                                 if (use_bigtile)
3947                                 {
3948                                         if (ca & 0x80)
3949                                                 Term_putch(44, 20, 255, -1);
3950                                         else
3951                                                 Term_putch(44, 20, 0, ' ');
3952                                 }
3953
3954                                 /* Prompt */
3955 #ifdef JP
3956                                 Term_putstr(0, 22, -1, TERM_WHITE,
3957                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
3958 #else
3959                                 Term_putstr(0, 22, -1, TERM_WHITE,
3960                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
3961 #endif
3962
3963                                 /* Get a command */
3964                                 i = inkey();
3965
3966                                 /* All done */
3967                                 if (i == ESCAPE) break;
3968
3969                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3970                                 else if (isupper(i)) c = 'a' + i - 'A';
3971                                 else c = i;
3972
3973                                 switch (c)
3974                                 {
3975                                 case 'n':
3976                                         cmd_visuals_aux(i, &f, max_f_idx);
3977                                         break;
3978                                 case 'a':
3979                                         t = (int)f_info[f].x_attr;
3980                                         cmd_visuals_aux(i, &t, 256);
3981                                         f_info[f].x_attr = (byte)t;
3982                                         break;
3983                                 case 'c':
3984                                         t = (int)f_info[f].x_char;
3985                                         cmd_visuals_aux(i, &t, 256);
3986                                         f_info[f].x_char = (byte)t;
3987                                         break;
3988                                 }
3989                         }
3990                 }
3991
3992 #endif
3993
3994                 /* Reset visuals */
3995                 else if (i == '0')
3996                 {
3997                         /* Reset */
3998                         reset_visuals();
3999
4000                         /* Message */
4001 #ifdef JP
4002                         msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4003 #else
4004                         msg_print("Visual attr/char tables reset.");
4005 #endif
4006
4007                 }
4008
4009                 /* Unknown option */
4010                 else
4011                 {
4012                         bell();
4013                 }
4014
4015                 /* Flush messages */
4016                 msg_print(NULL);
4017         }
4018
4019
4020         /* Restore the screen */
4021         screen_load();
4022 }
4023
4024
4025 /*
4026  * Interact with "colors"
4027  */
4028 void do_cmd_colors(void)
4029 {
4030         int i;
4031
4032         FILE *fff;
4033
4034         char tmp[160];
4035
4036         char buf[1024];
4037
4038
4039         /* File type is "TEXT" */
4040         FILE_TYPE(FILE_TYPE_TEXT);
4041
4042
4043         /* Save the screen */
4044         screen_save();
4045
4046
4047         /* Interact until done */
4048         while (1)
4049         {
4050                 /* Clear screen */
4051                 Term_clear();
4052
4053                 /* Ask for a choice */
4054 #ifdef JP
4055                 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4056 #else
4057                 prt("Interact with Colors", 2, 0);
4058 #endif
4059
4060
4061                 /* Give some choices */
4062 #ifdef JP
4063                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4064 #else
4065                 prt("(1) Load a user pref file", 4, 5);
4066 #endif
4067
4068 #ifdef ALLOW_COLORS
4069 #ifdef JP
4070                 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
4071                 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4072 #else
4073                 prt("(2) Dump colors", 5, 5);
4074                 prt("(3) Modify colors", 6, 5);
4075 #endif
4076
4077 #endif
4078
4079                 /* Prompt */
4080 #ifdef JP
4081                 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4082 #else
4083                 prt("Command: ", 8, 0);
4084 #endif
4085
4086
4087                 /* Prompt */
4088                 i = inkey();
4089
4090                 /* Done */
4091                 if (i == ESCAPE) break;
4092
4093                 /* Load a 'pref' file */
4094                 if (i == '1')
4095                 {
4096                         /* Prompt */
4097 #ifdef JP
4098                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4099 #else
4100                         prt("Command: Load a user pref file", 8, 0);
4101 #endif
4102
4103
4104                         /* Prompt */
4105 #ifdef JP
4106                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4107 #else
4108                         prt("File: ", 10, 0);
4109 #endif
4110
4111
4112                         /* Default file */
4113                         sprintf(tmp, "%s.prf", player_name);
4114
4115                         /* Query */
4116                         if (!askfor_aux(tmp, 70)) continue;
4117
4118                         /* Process the given filename */
4119                         (void)process_pref_file(tmp);
4120
4121                         /* Mega-Hack -- react to changes */
4122                         Term_xtra(TERM_XTRA_REACT, 0);
4123
4124                         /* Mega-Hack -- redraw */
4125                         Term_redraw();
4126                 }
4127
4128 #ifdef ALLOW_COLORS
4129
4130                 /* Dump colors */
4131                 else if (i == '2')
4132                 {
4133                         static cptr mark = "Colors";
4134                         int line_num;
4135
4136                         /* Prompt */
4137 #ifdef JP
4138                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 8, 0);
4139 #else
4140                         prt("Command: Dump colors", 8, 0);
4141 #endif
4142
4143
4144                         /* Prompt */
4145 #ifdef JP
4146                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4147 #else
4148                         prt("File: ", 10, 0);
4149 #endif
4150
4151
4152                         /* Default filename */
4153                         sprintf(tmp, "%s.prf", player_name);
4154
4155                         /* Get a filename */
4156                         if (!askfor_aux(tmp, 70)) continue;
4157
4158                         /* Build the filename */
4159                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
4160
4161                         /* Append to the file */
4162                         fff = open_auto_dump(buf, mark, &line_num);
4163                         if (!fff) continue;
4164
4165                         /* Start dumping */
4166 #ifdef JP
4167                         fprintf(fff, "\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4168 #else
4169                         fprintf(fff, "\n# Color redefinitions\n\n");
4170 #endif
4171                         line_num += 3;
4172
4173                         /* Dump colors */
4174                         for (i = 0; i < 256; i++)
4175                         {
4176                                 int kv = angband_color_table[i][0];
4177                                 int rv = angband_color_table[i][1];
4178                                 int gv = angband_color_table[i][2];
4179                                 int bv = angband_color_table[i][3];
4180
4181 #ifdef JP
4182                                 cptr name = "̤ÃÎ";
4183 #else
4184                                 cptr name = "unknown";
4185 #endif
4186
4187
4188                                 /* Skip non-entries */
4189                                 if (!kv && !rv && !gv && !bv) continue;
4190
4191                                 /* Extract the color name */
4192                                 if (i < 16) name = color_names[i];
4193
4194                                 /* Dump a comment */
4195 #ifdef JP
4196                                 fprintf(fff, "# ¥«¥é¡¼ '%s'\n", name);
4197 #else
4198                                 fprintf(fff, "# Color '%s'\n", name);
4199 #endif
4200                                 line_num++;
4201
4202                                 /* Dump the monster attr/char info */
4203                                 fprintf(fff, "V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4204                                         i, kv, rv, gv, bv);
4205                                 line_num += 2;
4206                         }
4207
4208                         /* Close */
4209                         close_auto_dump(fff, mark, line_num);
4210
4211                         /* Message */
4212 #ifdef JP
4213                         msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
4214 #else
4215                         msg_print("Dumped color redefinitions.");
4216 #endif
4217
4218                 }
4219
4220                 /* Edit colors */
4221                 else if (i == '3')
4222                 {
4223                         static byte a = 0;
4224
4225                         /* Prompt */
4226 #ifdef JP
4227                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4228 #else
4229                         prt("Command: Modify colors", 8, 0);
4230 #endif
4231
4232
4233                         /* Hack -- query until done */
4234                         while (1)
4235                         {
4236                                 cptr name;
4237                                 byte j;
4238
4239                                 /* Clear */
4240                                 clear_from(10);
4241
4242                                 /* Exhibit the normal colors */
4243                                 for (j = 0; j < 16; j++)
4244                                 {
4245                                         /* Exhibit this color */
4246                                         Term_putstr(j*4, 20, -1, a, "###");
4247
4248                                         /* Exhibit all colors */
4249                                         Term_putstr(j*4, 22, -1, j, format("%3d", j));
4250                                 }
4251
4252                                 /* Describe the color */
4253 #ifdef JP
4254                                 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4255 #else
4256                                 name = ((a < 16) ? color_names[a] : "undefined");
4257 #endif
4258
4259
4260                                 /* Describe the color */
4261 #ifdef JP
4262                                 Term_putstr(5, 10, -1, TERM_WHITE,
4263                                             format("¥«¥é¡¼ = %d, Ì¾Á° = %s", a, name));
4264 #else
4265                                 Term_putstr(5, 10, -1, TERM_WHITE,
4266                                             format("Color = %d, Name = %s", a, name));
4267 #endif
4268
4269
4270                                 /* Label the Current values */
4271                                 Term_putstr(5, 12, -1, TERM_WHITE,
4272                                             format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4273                                                    angband_color_table[a][0],
4274                                                    angband_color_table[a][1],
4275                                                    angband_color_table[a][2],
4276                                                    angband_color_table[a][3]));
4277
4278                                 /* Prompt */
4279 #ifdef JP
4280                                 Term_putstr(0, 14, -1, TERM_WHITE,
4281                                             "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4282 #else
4283                                 Term_putstr(0, 14, -1, TERM_WHITE,
4284                                             "Command (n/N/k/K/r/R/g/G/b/B): ");
4285 #endif
4286
4287
4288                                 /* Get a command */
4289                                 i = inkey();
4290
4291                                 /* All done */
4292                                 if (i == ESCAPE) break;
4293
4294                                 /* Analyze */
4295                                 if (i == 'n') a = (byte)(a + 1);
4296                                 if (i == 'N') a = (byte)(a - 1);
4297                                 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4298                                 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4299                                 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4300                                 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4301                                 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4302                                 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4303                                 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4304                                 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4305
4306                                 /* Hack -- react to changes */
4307                                 Term_xtra(TERM_XTRA_REACT, 0);
4308
4309                                 /* Hack -- redraw */
4310                                 Term_redraw();
4311                         }
4312                 }
4313
4314 #endif
4315
4316                 /* Unknown option */
4317                 else
4318                 {
4319                         bell();
4320                 }
4321
4322                 /* Flush messages */
4323                 msg_print(NULL);
4324         }
4325
4326
4327         /* Restore the screen */
4328         screen_load();
4329 }
4330
4331
4332 /*
4333  * Note something in the message recall
4334  */
4335 void do_cmd_note(void)
4336 {
4337         char buf[80];
4338
4339         /* Default */
4340         strcpy(buf, "");
4341
4342         /* Input */
4343 #ifdef JP
4344         if (!get_string("¥á¥â: ", buf, 60)) return;
4345 #else
4346         if (!get_string("Note: ", buf, 60)) return;
4347 #endif
4348
4349
4350         /* Ignore empty notes */
4351         if (!buf[0] || (buf[0] == ' ')) return;
4352
4353         /* Add the note to the message recall */
4354 #ifdef JP
4355         msg_format("¥á¥â: %s", buf);
4356 #else
4357         msg_format("Note: %s", buf);
4358 #endif
4359
4360 }
4361
4362
4363 /*
4364  * Mention the current version
4365  */
4366 void do_cmd_version(void)
4367 {
4368
4369         /* Silly message */
4370 #ifndef FAKE_VERSION
4371         msg_format("You are playing Angband %d.%d.%d.",
4372                    VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
4373 #else
4374 #ifdef JP
4375         msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4376                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4377 #else
4378         msg_format("You are playing Hengband %d.%d.%d.",
4379                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4380 #endif
4381
4382 #endif
4383
4384 }
4385
4386
4387
4388 /*
4389  * Array of feeling strings
4390  */
4391 static cptr do_cmd_feeling_text[11] =
4392 {
4393 #ifdef JP
4394         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4395 #else
4396         "Looks like any other level.",
4397 #endif
4398
4399 #ifdef JP
4400         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4401 #else
4402         "You feel there is something special about this level.",
4403 #endif
4404
4405 #ifdef JP
4406         "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4407 #else
4408         "You nearly faint as horrible visions of death fill your mind!",
4409 #endif
4410
4411 #ifdef JP
4412         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4413 #else
4414         "This level looks very dangerous.",
4415 #endif
4416
4417 #ifdef JP
4418         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4419 #else
4420         "You have a very bad feeling...",
4421 #endif
4422
4423 #ifdef JP
4424         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4425 #else
4426         "You have a bad feeling...",
4427 #endif
4428
4429 #ifdef JP
4430         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4431 #else
4432         "You feel nervous.",
4433 #endif
4434
4435 #ifdef JP
4436         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4437 #else
4438         "You feel your luck is turning...",
4439 #endif
4440
4441 #ifdef JP
4442         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4443 #else
4444         "You don't like the look of this place.",
4445 #endif
4446
4447 #ifdef JP
4448         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4449 #else
4450         "This level looks reasonably safe.",
4451 #endif
4452
4453 #ifdef JP
4454         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4455 #else
4456         "What a boring place..."
4457 #endif
4458
4459 };
4460
4461 static cptr do_cmd_feeling_text_combat[11] =
4462 {
4463 #ifdef JP
4464         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4465 #else
4466         "Looks like any other level.",
4467 #endif
4468
4469 #ifdef JP
4470         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4471 #else
4472         "You feel there is something special about this level.",
4473 #endif
4474
4475 #ifdef JP
4476         "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4477 #else
4478         "You nearly faint as horrible visions of death fill your mind!",
4479 #endif
4480
4481 #ifdef JP
4482         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4483 #else
4484         "This level looks very dangerous.",
4485 #endif
4486
4487 #ifdef JP
4488         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4489 #else
4490         "You have a very bad feeling...",
4491 #endif
4492
4493 #ifdef JP
4494         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4495 #else
4496         "You have a bad feeling...",
4497 #endif
4498
4499 #ifdef JP
4500         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4501 #else
4502         "You feel nervous.",
4503 #endif
4504
4505 #ifdef JP
4506         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4507 #else
4508         "You feel your luck is turning...",
4509 #endif
4510
4511 #ifdef JP
4512         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4513 #else
4514         "You don't like the look of this place.",
4515 #endif
4516
4517 #ifdef JP
4518         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4519 #else
4520         "This level looks reasonably safe.",
4521 #endif
4522
4523 #ifdef JP
4524         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4525 #else
4526         "What a boring place..."
4527 #endif
4528
4529 };
4530
4531 static cptr do_cmd_feeling_text_lucky[11] =
4532 {
4533 #ifdef JP
4534         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4535         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4536         "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4537         "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4538         "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4539         "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4540         "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4541         "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤­¤¿¤«...",
4542         "¸«¤¿´¶¤¸°­¤¯¤Ï¤Ê¤¤...",
4543         "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4544         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4545 #else
4546         "Looks like any other level.",
4547         "You feel there is something special about this level.",
4548         "You have a superb feeling about this level.",
4549         "You have an excellent feeling...",
4550         "You have a very good feeling...",
4551         "You have a good feeling...",
4552         "You feel strangely lucky...",
4553         "You feel your luck is turning...",
4554         "You like the look of this place...",
4555         "This level can't be all bad...",
4556         "What a boring place..."
4557 #endif
4558 };
4559
4560
4561 /*
4562  * Note that "feeling" is set to zero unless some time has passed.
4563  * Note that this is done when the level is GENERATED, not entered.
4564  */
4565 void do_cmd_feeling(void)
4566 {
4567         /* Verify the feeling */
4568         if (feeling > 10) feeling = 10;
4569
4570         /* No useful feeling in quests */
4571         if (p_ptr->inside_quest && !random_quest_number(dun_level))
4572         {
4573 #ifdef JP
4574                 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4575 #else
4576                 msg_print("Looks like a typical quest level.");
4577 #endif
4578
4579                 return;
4580         }
4581
4582         /* No useful feeling in town */
4583         else if (p_ptr->town_num && !dun_level)
4584         {
4585 #ifdef JP
4586                 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4587 #else
4588                 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4589 #endif
4590                 {
4591 #ifdef JP
4592                         msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4593 #else
4594                         msg_print("Looks like a strange wilderness.");
4595 #endif
4596
4597                         return;
4598                 }
4599                 else
4600                 {
4601 #ifdef JP
4602                         msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4603 #else
4604                         msg_print("Looks like a typical town.");
4605 #endif
4606
4607                         return;
4608                 }
4609         }
4610
4611         /* No useful feeling in the wilderness */
4612         else if (!dun_level)
4613         {
4614 #ifdef JP
4615                 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4616 #else
4617                 msg_print("Looks like a typical wilderness.");
4618 #endif
4619
4620                 return;
4621         }
4622
4623         /* Display the feeling */
4624         if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4625         {
4626                 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4627                 else {
4628                                         if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4629                                                 msg_print(do_cmd_feeling_text_combat[feeling]);
4630                                         }else
4631                                                 msg_print(do_cmd_feeling_text[feeling]);
4632                                 }
4633         }
4634         else
4635         {
4636                 msg_print(do_cmd_feeling_text[0]);
4637         }
4638 }
4639
4640
4641
4642
4643
4644 /*
4645  * Encode the screen colors
4646  */
4647 static char hack[17] = "dwsorgbuDWvyRGBU";
4648
4649
4650 static errr photo_fgets(FILE *fff, char *buf, huge n)
4651 {
4652         huge i = 0;
4653
4654         char *s;
4655
4656         char tmp[1024];
4657
4658         /* Read a line */
4659         if (fgets(tmp, 1024, fff))
4660         {
4661                 /* Convert weirdness */
4662                 for (s = tmp; *s; s++)
4663                 {
4664                         /* Handle newline */
4665                         if (*s == '\n')
4666                         {
4667                                 /* Terminate */
4668                                 buf[i] = '\0';
4669
4670                                 /* Success */
4671                                 return (0);
4672                         }
4673
4674                         /* Handle tabs */
4675                         else if (*s == '\t')
4676                         {
4677                                 /* Hack -- require room */
4678                                 if (i + 8 >= n) break;
4679
4680                                 /* Append a space */
4681                                 buf[i++] = ' ';
4682
4683                                 /* Append some more spaces */
4684                                 while (!(i % 8)) buf[i++] = ' ';
4685                         }
4686
4687 #ifdef JP
4688                         else if (iskanji(*s))
4689                         {
4690                                 if (!s[1]) break;
4691                                 buf[i++] = *s++;
4692                                 buf[i++] = *s;
4693                         }
4694 # ifndef EUC
4695         /* È¾³Ñ¤«¤Ê¤ËÂбþ */
4696                         else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf))
4697                         {
4698                                 buf[i++] = *s;
4699                                 if (i >= n) break;
4700                         }
4701 # endif
4702 #endif
4703                         /* Handle printables */
4704                         else
4705                         {
4706                                 /* Copy */
4707                                 buf[i++] = *s;
4708
4709                                 /* Check length */
4710                                 if (i >= n) break;
4711                         }
4712                 }
4713         }
4714
4715         /* Nothing */
4716         buf[0] = '\0';
4717
4718         /* Failure */
4719         return (1);
4720 }
4721
4722
4723 /*
4724  * Hack -- load a screen dump from a file
4725  */
4726 void do_cmd_load_screen(void)
4727 {
4728         int i, y, x;
4729
4730         byte a = 0;
4731         char c = ' ';
4732
4733         bool okay = TRUE;
4734
4735         FILE *fff;
4736
4737         char buf[1024];
4738
4739         int wid, hgt;
4740
4741         Term_get_size(&wid, &hgt);
4742
4743         /* Hack -- drop permissions */
4744         safe_setuid_drop();
4745
4746         /* Build the filename */
4747         path_build(buf, 1024, ANGBAND_DIR_USER, "dump.txt");
4748
4749         /* Append to the file */
4750         fff = my_fopen(buf, "r");
4751
4752         /* Oops */
4753         if (!fff) {
4754 #ifdef JP
4755                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
4756 #else
4757                 msg_format("Failed to open %s.", buf);
4758 #endif
4759                 msg_print(NULL);
4760                 return;
4761         }
4762
4763
4764         /* Save the screen */
4765         screen_save();
4766
4767         /* Clear the screen */
4768         Term_clear();
4769
4770
4771         /* Load the screen */
4772         for (y = 0; okay && (y < hgt); y++)
4773         {
4774                 /* Get a line of data */
4775                 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
4776
4777                 /* Show each row */
4778                 for (x = 0; x < wid - 1; x++)
4779                 {
4780                         /* Put the attr/char */
4781                         Term_draw(x, y, TERM_WHITE, buf[x]);
4782                 }
4783         }
4784
4785         /* Get the blank line */
4786         if (my_fgets(fff, buf, 1024)) okay = FALSE;
4787
4788
4789         /* Dump the screen */
4790         for (y = 0; okay && (y < hgt); y++)
4791         {
4792                 /* Get a line of data */
4793                 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
4794
4795                 /* Dump each row */
4796                 for (x = 0; x < wid - 1; x++)
4797                 {
4798                         /* Get the attr/char */
4799                         (void)(Term_what(x, y, &a, &c));
4800
4801                         /* Look up the attr */
4802                         for (i = 0; i < 16; i++)
4803                         {
4804                                 /* Use attr matches */
4805                                 if (hack[i] == buf[x]) a = i;
4806                         }
4807
4808                         /* Put the attr/char */
4809                         Term_draw(x, y, a, c);
4810                 }
4811         }
4812
4813
4814         /* Get the blank line */
4815         if (my_fgets(fff, buf, 1024)) okay = FALSE;
4816
4817
4818         /* Close it */
4819         my_fclose(fff);
4820
4821         /* Hack -- grab permissions */
4822         safe_setuid_grab();
4823                 
4824
4825         /* Message */
4826 #ifdef JP
4827         prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤µ¤ì¤¿²èÌÌ(µ­Ç°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
4828 #else
4829         msg_print("Screen dump loaded.");
4830 #endif
4831
4832         flush();
4833         inkey();
4834
4835
4836         /* Restore the screen */
4837         screen_load();
4838 }
4839
4840
4841
4842
4843 cptr inven_res_label = 
4844 #ifdef JP
4845  "                               »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
4846 #else
4847  "                               AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
4848 #endif
4849
4850 /* XTRA HACK RESLIST */
4851 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, 
4852                                        int *j, byte tval, char *where)
4853 {
4854   char o_name[MAX_NLEN];
4855   u32b    f[3];
4856
4857   if (!o_ptr->k_idx)return;
4858   if (o_ptr->tval != tval)return;
4859
4860        /* 
4861         * HACK:Ring of Lordly protection and Dragon shield/helm
4862         * have random resistances.
4863         */
4864   if ( ((o_ptr->tval >= TV_BOW && o_ptr->tval<= TV_DRAG_ARMOR && o_ptr->name2)
4865        || (o_ptr->tval == TV_RING && o_ptr->sval == SV_RING_LORDLY) 
4866        || (o_ptr->tval == TV_SHIELD && o_ptr->sval == SV_DRAGON_SHIELD) 
4867        || (o_ptr->tval == TV_HELM && o_ptr->sval == SV_DRAGON_HELM) 
4868        || (o_ptr->tval == TV_GLOVES && o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) 
4869        || (o_ptr->tval == TV_BOOTS && o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) 
4870        || o_ptr->art_name || o_ptr->name1) && object_known_p(o_ptr))
4871     {
4872       int i = 0;
4873       object_desc(o_name, o_ptr, TRUE, 0);
4874
4875       while ( o_name[i] && i < 26 ){
4876 #ifdef JP
4877         if (iskanji(o_name[i])) i++;
4878 #endif
4879         i++;
4880       }
4881       if(i<28) while(i<28){o_name[i]=' ';i++;}
4882       o_name[i]=0;
4883       
4884       fprintf(fff,"%s %s", where, o_name);
4885
4886       if (!(o_ptr->ident & (IDENT_MENTAL))) 
4887         {
4888 #ifdef JP
4889           fprintf(fff, "-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n");
4890 #else
4891           fprintf(fff, "-------unknown------------ -------unknown------\n");
4892 #endif
4893         }
4894       else {
4895         object_flags_known(o_ptr, &f[0], &f[1], &f[2]);
4896       
4897 #ifdef JP
4898         if (f[1] & TR2_IM_ACID) fprintf(fff,"¡ö");
4899         else if (f[1] & TR2_RES_ACID) fprintf(fff,"¡Ü");
4900         else fprintf(fff,"¡¦");
4901
4902         if (f[1] & TR2_IM_ELEC) fprintf(fff,"¡ö");
4903         else if (f[1] & TR2_RES_ELEC) fprintf(fff,"¡Ü");
4904         else fprintf(fff,"¡¦");
4905
4906         if (f[1] & TR2_IM_FIRE) fprintf(fff,"¡ö");
4907         else if (f[1] & TR2_RES_FIRE) fprintf(fff,"¡Ü");
4908         else fprintf(fff,"¡¦");
4909
4910         if (f[1] & TR2_IM_COLD) fprintf(fff,"¡ö");
4911         else if (f[1] & TR2_RES_COLD) fprintf(fff,"¡Ü");
4912         else fprintf(fff,"¡¦");
4913         
4914         if (f[1] & TR2_RES_POIS) fprintf(fff,"¡Ü");
4915         else fprintf(fff,"¡¦");
4916         
4917         if (f[1] & TR2_RES_LITE) fprintf(fff,"¡Ü");
4918         else fprintf(fff,"¡¦");
4919         
4920         if (f[1] & TR2_RES_DARK) fprintf(fff,"¡Ü");
4921         else fprintf(fff,"¡¦");
4922         
4923         if (f[1] & TR2_RES_SHARDS) fprintf(fff,"¡Ü");
4924         else fprintf(fff,"¡¦");
4925         
4926         if (f[1] & TR2_RES_SOUND) fprintf(fff,"¡Ü");
4927         else fprintf(fff,"¡¦");
4928         
4929         if (f[1] & TR2_RES_NETHER) fprintf(fff,"¡Ü");
4930         else fprintf(fff,"¡¦");
4931         
4932         if (f[1] & TR2_RES_NEXUS) fprintf(fff,"¡Ü");
4933         else fprintf(fff,"¡¦");
4934         
4935         if (f[1] & TR2_RES_CHAOS) fprintf(fff,"¡Ü");
4936         else fprintf(fff,"¡¦");
4937         
4938         if (f[1] & TR2_RES_DISEN) fprintf(fff,"¡Ü");
4939         else fprintf(fff,"¡¦");
4940         
4941         fprintf(fff," ");
4942         
4943         if (f[1] & TR2_RES_BLIND) fprintf(fff,"¡Ü");
4944         else fprintf(fff,"¡¦");
4945         
4946         if (f[1] & TR2_RES_FEAR) fprintf(fff,"¡Ü");
4947         else fprintf(fff,"¡¦");
4948         
4949         if (f[1] & TR2_RES_CONF) fprintf(fff,"¡Ü");
4950         else fprintf(fff,"¡¦");
4951         
4952         if (f[1] & TR2_FREE_ACT) fprintf(fff,"¡Ü");
4953         else fprintf(fff,"¡¦");
4954         
4955         if (f[2] & TR3_SEE_INVIS) fprintf(fff,"¡Ü");
4956         else fprintf(fff,"¡¦");
4957         
4958         if (f[1] & TR2_HOLD_LIFE) fprintf(fff,"¡Ü");
4959         else fprintf(fff,"¡¦");
4960
4961         if (f[2] & TR3_TELEPATHY) fprintf(fff,"¡Ü");
4962         else fprintf(fff,"¡¦");
4963
4964         if (f[2] & TR3_SLOW_DIGEST) fprintf(fff,"¡Ü");
4965         else fprintf(fff,"¡¦");
4966
4967
4968         if (f[2] & TR3_REGEN) fprintf(fff,"¡Ü");
4969         else fprintf(fff,"¡¦");
4970
4971         if (f[2] & TR3_FEATHER) fprintf(fff,"¡Ü");
4972         else fprintf(fff,"¡¦");
4973 #else
4974         if (f[1] & TR2_IM_ACID) fprintf(fff,"* ");
4975         else if (f[1] & TR2_RES_ACID) fprintf(fff,"+ ");
4976         else fprintf(fff,". ");
4977
4978         if (f[1] & TR2_IM_ELEC) fprintf(fff,"* ");
4979         else if (f[1] & TR2_RES_ELEC) fprintf(fff,"+ ");
4980         else fprintf(fff,". ");
4981
4982         if (f[1] & TR2_IM_FIRE) fprintf(fff,"* ");
4983         else if (f[1] & TR2_RES_FIRE) fprintf(fff,"+ ");
4984         else fprintf(fff,". ");
4985
4986         if (f[1] & TR2_IM_COLD) fprintf(fff,"* ");
4987         else if (f[1] & TR2_RES_COLD) fprintf(fff,"+ ");
4988         else fprintf(fff,". ");
4989         
4990         if (f[1] & TR2_RES_POIS) fprintf(fff,"+ ");
4991         else fprintf(fff,". ");
4992         
4993         if (f[1] & TR2_RES_LITE) fprintf(fff,"+ ");
4994         else fprintf(fff,". ");
4995         
4996         if (f[1] & TR2_RES_DARK) fprintf(fff,"+ ");
4997         else fprintf(fff,". ");
4998         
4999         if (f[1] & TR2_RES_SHARDS) fprintf(fff,"+ ");
5000         else fprintf(fff,". ");
5001         
5002         if (f[1] & TR2_RES_SOUND) fprintf(fff,"+ ");
5003         else fprintf(fff,". ");
5004         
5005         if (f[1] & TR2_RES_NETHER) fprintf(fff,"+ ");
5006         else fprintf(fff,". ");
5007         
5008         if (f[1] & TR2_RES_NEXUS) fprintf(fff,"+ ");
5009         else fprintf(fff,". ");
5010         
5011         if (f[1] & TR2_RES_CHAOS) fprintf(fff,"+ ");
5012         else fprintf(fff,". ");
5013         
5014         if (f[1] & TR2_RES_DISEN) fprintf(fff,"+ ");
5015         else fprintf(fff,". ");
5016         
5017         fprintf(fff," ");
5018         
5019         if (f[1] & TR2_RES_BLIND) fprintf(fff,"+ ");
5020         else fprintf(fff,". ");
5021         
5022         if (f[1] & TR2_RES_FEAR) fprintf(fff,"+ ");
5023         else fprintf(fff,". ");
5024         
5025         if (f[1] & TR2_RES_CONF) fprintf(fff,"+ ");
5026         else fprintf(fff,". ");
5027         
5028         if (f[1] & TR2_FREE_ACT) fprintf(fff,"+ ");
5029         else fprintf(fff,". ");
5030         
5031         if (f[2] & TR3_SEE_INVIS) fprintf(fff,"+ ");
5032         else fprintf(fff,". ");
5033         
5034         if (f[1] & TR2_HOLD_LIFE) fprintf(fff,"+ ");
5035         else fprintf(fff,". ");
5036
5037         if (f[2] & TR3_TELEPATHY) fprintf(fff,"+ ");
5038         else fprintf(fff,". ");
5039
5040         if (f[2] & TR3_SLOW_DIGEST) fprintf(fff,"+ ");
5041         else fprintf(fff,". ");
5042
5043
5044         if (f[2] & TR3_REGEN) fprintf(fff,"+ ");
5045         else fprintf(fff,". ");
5046
5047         if (f[2] & TR3_FEATHER) fprintf(fff,"+ ");
5048         else fprintf(fff,". ");
5049 #endif  
5050         fprintf(fff,"\n");
5051       }
5052       (*j)++;
5053       if(*j==9)
5054         { 
5055           *j=0;
5056           fprintf(fff,"%s\n", inven_res_label);
5057         }
5058     }
5059 }
5060
5061 /*
5062  * Display *ID* ed weapons/armors's resistances
5063  */
5064 static void do_cmd_knowledge_inven(void)
5065 {
5066
5067         FILE *fff;
5068
5069         char file_name[1024];
5070  
5071         store_type  *st_ptr;
5072         object_type *o_ptr;
5073
5074         byte tval;
5075         int i=0;
5076         int j=0;
5077
5078         char  where[32];
5079
5080         /* Open a new file */
5081         fff = my_fopen_temp(file_name, 1024);
5082         if (!fff) {
5083 #ifdef JP
5084             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5085 #else
5086             msg_format("Failed to create temporally file %s.", file_name);
5087 #endif
5088             msg_print(NULL);
5089             return;
5090         }
5091         fprintf(fff,"%s\n",inven_res_label);
5092
5093         for (tval=TV_BOW; tval <= TV_RING; tval++){
5094
5095           if (j!=0) {
5096               for (;j<9;j++) fprintf(fff, "\n");
5097               j=0;
5098               fprintf(fff,"%s\n",inven_res_label);              
5099           }
5100           
5101 #ifdef JP
5102           strcpy(where, "Áõ");
5103 #else
5104           strcpy(where, "E ");
5105 #endif
5106           for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5107             {
5108               o_ptr = &inventory[i];
5109               do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5110             }
5111           
5112 #ifdef JP
5113           strcpy(where, "»ý");
5114 #else
5115           strcpy(where, "I ");
5116 #endif
5117           for (i = 0; i < INVEN_PACK; i++)
5118             {
5119               o_ptr = &inventory[i];
5120               do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5121             }
5122           
5123           
5124           /* Print all homes in the different towns */
5125           st_ptr = &town[1].store[STORE_HOME];
5126 #ifdef JP
5127           strcpy(where, "²È");
5128 #else
5129           strcpy(where, "H ");/*nanka*/
5130 #endif
5131               
5132           /* Dump all available items */
5133           for (i = 0; i < st_ptr->stock_num; i++)
5134             {
5135               o_ptr = &st_ptr->stock[i];
5136               do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5137             }
5138         }
5139           
5140         /* Close the file */
5141         my_fclose(fff);
5142
5143         /* Display the file contents */
5144 #ifdef JP
5145         show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ­¥ê¥¹¥È", 0, 0);
5146 #else
5147         show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5148 #endif
5149
5150         /* Remove the file */
5151         fd_kill(file_name);
5152 }
5153
5154
5155 void do_cmd_save_screen_html_aux(char *filename, int message)
5156 {
5157         int y, x, i;
5158
5159         byte a = 0, old_a = 0;
5160         char c = ' ';
5161
5162         FILE *fff, *tmpfff;
5163         char buf[2048];
5164
5165         int yomikomu = 0;
5166         char *tags[4] = {
5167                 "HEADER_START:",
5168                 "HEADER_END:",
5169                 "FOOTER_START:",
5170                 "FOOTER_END:",
5171         };
5172
5173         char *html_head[] = {
5174                 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5175                 "<pre>",
5176                 0,
5177         };
5178         char *html_foot[] = {
5179                 "</pre>\n",
5180                 "</body>\n</html>\n",
5181                 0,
5182         };
5183
5184         int wid, hgt;
5185
5186         Term_get_size(&wid, &hgt);
5187
5188         /* File type is "TEXT" */
5189         FILE_TYPE(FILE_TYPE_TEXT);
5190
5191         /* Append to the file */
5192         fff = my_fopen(filename, "w");
5193
5194         /* Oops */
5195         if (!fff) {
5196                 if (message) {
5197 #ifdef JP
5198                     msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5199 #else
5200                     msg_format("Failed to open file %s.", filename);
5201 #endif
5202                     msg_print(NULL);
5203                 }
5204                 
5205                 return;
5206         }
5207
5208         /* Save the screen */
5209         if (message)
5210                 screen_save();
5211
5212         /* Build the filename */
5213         path_build(buf, 1024, ANGBAND_DIR_USER, "htmldump.prf");
5214         tmpfff = my_fopen(buf, "r");
5215         if (!tmpfff) {
5216                 for (i = 0; html_head[i]; i++)
5217                         fprintf(fff, html_head[i]);
5218         }
5219         else {
5220                 yomikomu = 0;
5221                 while (!my_fgets(tmpfff, buf, 1024)) {
5222                         if (!yomikomu) {
5223                                 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5224                                         yomikomu = 1;
5225                         }
5226                         else {
5227                                 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5228                                         break;
5229                                 fprintf(fff, "%s\n", buf);
5230                         }
5231                 }
5232         }
5233
5234         /* Dump the screen */
5235         for (y = 0; y < hgt; y++)
5236         {
5237                 /* Start the row */
5238                 if (y != 0)
5239                         fprintf(fff, "\n");
5240
5241                 /* Dump each row */
5242                 for (x = 0; x < wid - 1; x++)
5243                 {
5244                         int rv, gv, bv;
5245                         char *cc = NULL;
5246                         /* Get the attr/char */
5247                         (void)(Term_what(x, y, &a, &c));
5248
5249                         switch (c)
5250                         {
5251                         case '&': cc = "&amp;"; break;
5252                         case '<': cc = "&lt;"; break;
5253                         case '>': cc = "&gt;"; break;
5254 #ifdef WINDOWS
5255                         case 0x1f: c = '.'; break;
5256                         case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5257 #endif
5258                         }
5259
5260                         a = a & 0x0F;
5261                         if ((y == 0 && x == 0) || a != old_a) {
5262                                 rv = angband_color_table[a][1];
5263                                 gv = angband_color_table[a][2];
5264                                 bv = angband_color_table[a][3];
5265                                 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">", 
5266                                         ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5267                                 old_a = a;
5268                         }
5269                         if (cc)
5270                                 fprintf(fff, "%s", cc);
5271                         else
5272                                 fprintf(fff, "%c", c);
5273                 }
5274         }
5275         fprintf(fff, "</font>");
5276
5277         if (!tmpfff) {
5278                 for (i = 0; html_foot[i]; i++)
5279                         fprintf(fff, html_foot[i]);
5280         }
5281         else {
5282                 rewind(tmpfff);
5283                 yomikomu = 0;
5284                 while (!my_fgets(tmpfff, buf, 1024)) {
5285                         if (!yomikomu) {
5286                                 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5287                                         yomikomu = 1;
5288                         }
5289                         else {
5290                                 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5291                                         break;
5292                                 fprintf(fff, "%s\n", buf);
5293                         }
5294                 }
5295                 my_fclose(tmpfff);
5296         }
5297
5298         /* Skip a line */
5299         fprintf(fff, "\n");
5300
5301         /* Close it */
5302         my_fclose(fff);
5303
5304         /* Message */
5305         if (message) {
5306 #ifdef JP
5307         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
5308 #else
5309                 msg_print("Screen dump saved.");
5310 #endif
5311                 msg_print(NULL);
5312         }
5313
5314         /* Restore the screen */
5315         if (message)
5316                 screen_load();
5317 }
5318
5319 /*
5320  * Hack -- save a screen dump to a file
5321  */
5322 void do_cmd_save_screen_html(void)
5323 {
5324         char buf[1024], tmp[256] = "screen.html";
5325
5326 #ifdef JP
5327         if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
5328 #else
5329         if (!get_string("File name: ", tmp, 80))
5330 #endif
5331                 return;
5332
5333         /* Build the filename */
5334         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
5335
5336         msg_print(NULL);
5337
5338         /* Hack -- drop permissions */
5339         safe_setuid_drop();
5340
5341         do_cmd_save_screen_html_aux(buf, 1);
5342
5343         /* Hack -- grab permissions */
5344         safe_setuid_grab();
5345 }
5346
5347
5348 /*
5349  * Redefinable "save_screen" action
5350  */
5351 void (*screendump_aux)(void) = NULL;
5352
5353
5354 /*
5355  * Hack -- save a screen dump to a file
5356  */
5357 void do_cmd_save_screen(void)
5358 {
5359         bool old_use_graphics = use_graphics;
5360
5361         int wid, hgt;
5362
5363         Term_get_size(&wid, &hgt);
5364
5365         if (old_use_graphics)
5366         {
5367                 use_graphics = FALSE;
5368                 reset_visuals();
5369
5370                 /* Redraw everything */
5371                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5372
5373                 /* Hack -- update */
5374                 handle_stuff();
5375         }
5376
5377 #ifdef JP
5378         if (get_check_strict("HTML¤Ç½ÐÎϤ·¤Þ¤¹¤«¡©", CHECK_NO_HISTORY))
5379 #else
5380         if (get_check_strict("Save screen dump as HTML? ", CHECK_NO_HISTORY))
5381 #endif
5382         {
5383                 do_cmd_save_screen_html();
5384                 do_cmd_redraw();
5385         }
5386
5387         /* Do we use a special screendump function ? */
5388         else if (screendump_aux)
5389         {
5390                 /* Dump the screen to a graphics file */
5391                 (*screendump_aux)();
5392         }
5393         else /* Dump the screen as text */
5394         {
5395                 int y, x;
5396
5397                 byte a = 0;
5398                 char c = ' ';
5399
5400                 FILE *fff;
5401
5402                 char buf[1024];
5403
5404
5405                 /* Hack -- drop permissions */
5406                 safe_setuid_drop();
5407
5408                 /* Build the filename */
5409                 path_build(buf, 1024, ANGBAND_DIR_USER, "dump.txt");
5410
5411                 /* File type is "TEXT" */
5412                 FILE_TYPE(FILE_TYPE_TEXT);
5413
5414                 /* Append to the file */
5415                 fff = my_fopen(buf, "w");
5416
5417                 /* Oops */
5418                 if (!fff)
5419                 {
5420                         /* Hack -- grab permissions */
5421                         safe_setuid_grab();
5422 #ifdef JP
5423                         msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5424 #else
5425                         msg_format("Failed to open file %s.", buf);
5426 #endif
5427                         msg_print(NULL);
5428                         return;
5429                 }
5430
5431
5432                 /* Save the screen */
5433                 screen_save();
5434
5435
5436                 /* Dump the screen */
5437                 for (y = 0; y < hgt; y++)
5438                 {
5439                         /* Dump each row */
5440                         for (x = 0; x < wid - 1; x++)
5441                         {
5442                                 /* Get the attr/char */
5443                                 (void)(Term_what(x, y, &a, &c));
5444
5445                                 /* Dump it */
5446                                 buf[x] = c;
5447                         }
5448
5449                         /* Terminate */
5450                         buf[x] = '\0';
5451
5452                         /* End the row */
5453                         fprintf(fff, "%s\n", buf);
5454                 }
5455
5456                 /* Skip a line */
5457                 fprintf(fff, "\n");
5458
5459
5460                 /* Dump the screen */
5461                 for (y = 0; y < hgt; y++)
5462                 {
5463                         /* Dump each row */
5464                         for (x = 0; x < wid - 1; x++)
5465                         {
5466                                 /* Get the attr/char */
5467                                 (void)(Term_what(x, y, &a, &c));
5468
5469                                 /* Dump it */
5470                                 buf[x] = hack[a&0x0F];
5471                         }
5472
5473                         /* Terminate */
5474                         buf[x] = '\0';
5475
5476                         /* End the row */
5477                         fprintf(fff, "%s\n", buf);
5478                 }
5479
5480                 /* Skip a line */
5481                 fprintf(fff, "\n");
5482
5483
5484                 /* Close it */
5485                 my_fclose(fff);
5486
5487                 /* Hack -- grab permissions */
5488                 safe_setuid_grab();
5489
5490                 /* Message */
5491 #ifdef JP
5492         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
5493 #else
5494                 msg_print("Screen dump saved.");
5495 #endif
5496
5497                 msg_print(NULL);
5498
5499
5500                 /* Restore the screen */
5501                 screen_load();
5502         }
5503
5504         if (old_use_graphics)
5505         {
5506                 use_graphics = TRUE;
5507                 reset_visuals();
5508
5509                 /* Redraw everything */
5510                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5511
5512                 /* Hack -- update */
5513                 handle_stuff();
5514         }
5515 }
5516
5517
5518 /*
5519  * Sorting hook -- Comp function -- see below
5520  *
5521  * We use "u" to point to array of monster indexes,
5522  * and "v" to select the type of sorting to perform on "u".
5523  */
5524 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5525 {
5526         u16b *who = (u16b*)(u);
5527
5528         u16b *why = (u16b*)(v);
5529
5530         int w1 = who[a];
5531         int w2 = who[b];
5532
5533         int z1, z2;
5534
5535
5536         /* Sort by total kills */
5537         if (*why >= 3)
5538         {
5539                 /* Extract total kills */
5540                 z1 = a_info[w1].tval;
5541                 z2 = a_info[w2].tval;
5542
5543                 /* Compare total kills */
5544                 if (z1 < z2) return (TRUE);
5545                 if (z1 > z2) return (FALSE);
5546         }
5547
5548
5549         /* Sort by monster level */
5550         if (*why >= 2)
5551         {
5552                 /* Extract levels */
5553                 z1 = a_info[w1].sval;
5554                 z2 = a_info[w2].sval;
5555
5556                 /* Compare levels */
5557                 if (z1 < z2) return (TRUE);
5558                 if (z1 > z2) return (FALSE);
5559         }
5560
5561
5562         /* Sort by monster experience */
5563         if (*why >= 1)
5564         {
5565                 /* Extract experience */
5566                 z1 = a_info[w1].level;
5567                 z2 = a_info[w2].level;
5568
5569                 /* Compare experience */
5570                 if (z1 < z2) return (TRUE);
5571                 if (z1 > z2) return (FALSE);
5572         }
5573
5574
5575         /* Compare indexes */
5576         return (w1 <= w2);
5577 }
5578
5579
5580 /*
5581  * Sorting hook -- Swap function -- see below
5582  *
5583  * We use "u" to point to array of monster indexes,
5584  * and "v" to select the type of sorting to perform.
5585  */
5586 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5587 {
5588         u16b *who = (u16b*)(u);
5589
5590         u16b holder;
5591
5592         /* Swap */
5593         holder = who[a];
5594         who[a] = who[b];
5595         who[b] = holder;
5596 }
5597
5598
5599 /*
5600  * Check the status of "artifacts"
5601  */
5602 void do_cmd_knowledge_artifacts(void)
5603 {
5604         int i, k, z, x, y, n = 0;
5605         u16b why = 3;
5606         s16b *who;
5607
5608         FILE *fff;
5609
5610         char file_name[1024];
5611
5612         char base_name[MAX_NLEN];
5613
5614         bool *okay;
5615
5616         /* Open a new file */
5617         fff = my_fopen_temp(file_name, 1024);
5618
5619         if (!fff) {
5620 #ifdef JP
5621             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5622 #else
5623             msg_format("Failed to create temporary file %s.", file_name);
5624 #endif
5625             msg_print(NULL);
5626             return;
5627         }
5628
5629         /* Allocate the "who" array */
5630         C_MAKE(who, max_r_idx, s16b);
5631
5632         /* Allocate the "okay" array */
5633         C_MAKE(okay, max_a_idx, bool);
5634
5635         /* Scan the artifacts */
5636         for (k = 0; k < max_a_idx; k++)
5637         {
5638                 artifact_type *a_ptr = &a_info[k];
5639
5640                 /* Default */
5641                 okay[k] = FALSE;
5642
5643                 /* Skip "empty" artifacts */
5644                 if (!a_ptr->name) continue;
5645
5646                 /* Skip "uncreated" artifacts */
5647                 if (!a_ptr->cur_num) continue;
5648
5649                 /* Assume okay */
5650                 okay[k] = TRUE;
5651         }
5652
5653         /* Check the dungeon */
5654         for (y = 0; y < cur_hgt; y++)
5655         {
5656                 for (x = 0; x < cur_wid; x++)
5657                 {
5658                         cave_type *c_ptr = &cave[y][x];
5659
5660                         s16b this_o_idx, next_o_idx = 0;
5661
5662                         /* Scan all objects in the grid */
5663                         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5664                         {
5665                                 object_type *o_ptr;
5666
5667                                 /* Acquire object */
5668                                 o_ptr = &o_list[this_o_idx];
5669
5670                                 /* Acquire next object */
5671                                 next_o_idx = o_ptr->next_o_idx;
5672
5673                                 /* Ignore non-artifacts */
5674                                 if (!artifact_p(o_ptr)) continue;
5675
5676                                 /* Ignore known items */
5677                                 if (object_known_p(o_ptr)) continue;
5678
5679                                 /* Note the artifact */
5680                                 okay[o_ptr->name1] = FALSE;
5681                         }
5682                 }
5683         }
5684
5685         /* Check the inventory and equipment */
5686         for (i = 0; i < INVEN_TOTAL; i++)
5687         {
5688                 object_type *o_ptr = &inventory[i];
5689
5690                 /* Ignore non-objects */
5691                 if (!o_ptr->k_idx) continue;
5692
5693                 /* Ignore non-artifacts */
5694                 if (!artifact_p(o_ptr)) continue;
5695
5696                 /* Ignore known items */
5697                 if (object_known_p(o_ptr)) continue;
5698
5699                 /* Note the artifact */
5700                 okay[o_ptr->name1] = FALSE;
5701         }
5702
5703         for (k = 0; k < max_a_idx; k++)
5704         {
5705                 if (okay[k]) who[n++] = k;
5706         }
5707
5708         /* Select the sort method */
5709         ang_sort_comp = ang_sort_art_comp;
5710         ang_sort_swap = ang_sort_art_swap;
5711
5712         /* Sort the array by dungeon depth of monsters */
5713         ang_sort(who, &why, n);
5714
5715         /* Scan the artifacts */
5716         for (k = 0; k < n; k++)
5717         {
5718                 artifact_type *a_ptr = &a_info[who[k]];
5719
5720                 /* Paranoia */
5721 #ifdef JP
5722 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
5723 #else
5724                 strcpy(base_name, "Unknown Artifact");
5725 #endif
5726
5727
5728                 /* Obtain the base object type */
5729                 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5730
5731                 /* Real object */
5732                 if (z)
5733                 {
5734                         object_type forge;
5735                         object_type *q_ptr;
5736
5737                         /* Get local object */
5738                         q_ptr = &forge;
5739
5740                         /* Create fake object */
5741                         object_prep(q_ptr, z);
5742
5743                         /* Make it an artifact */
5744                         q_ptr->name1 = (byte)who[k];
5745
5746                         /* Describe the artifact */
5747                         object_desc_store(base_name, q_ptr, FALSE, 0);
5748                 }
5749
5750                 /* Hack -- Build the artifact name */
5751 #ifdef JP
5752                 fprintf(fff, "     %s\n", base_name);
5753 #else
5754                 fprintf(fff, "     The %s\n", base_name);
5755 #endif
5756
5757         }
5758
5759         /* Free the "who" array */
5760         C_KILL(who, max_r_idx, s16b);
5761
5762         /* Free the "okay" array */
5763         C_KILL(okay, max_a_idx, bool);
5764
5765         /* Close the file */
5766         my_fclose(fff);
5767
5768         /* Display the file contents */
5769 #ifdef JP
5770         show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
5771 #else
5772         show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
5773 #endif
5774
5775
5776         /* Remove the file */
5777         fd_kill(file_name);
5778 }
5779
5780
5781 /*
5782  * Display known uniques
5783  */
5784 static void do_cmd_knowledge_uniques(void)
5785 {
5786         int i, k, n = 0;
5787         u16b why = 2;
5788         s16b *who;
5789
5790         FILE *fff;
5791
5792         char file_name[1024];
5793
5794         /* Open a new file */
5795         fff = my_fopen_temp(file_name, 1024);
5796
5797         if (!fff) {
5798 #ifdef JP
5799             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5800 #else
5801             msg_format("Failed to create temporary file %s.", file_name);
5802 #endif
5803             msg_print(NULL);
5804             return;
5805         }
5806
5807         /* Allocate the "who" array */
5808         C_MAKE(who, max_r_idx, s16b);
5809
5810         /* Scan the monsters */
5811         for (i = 1; i < max_r_idx; i++)
5812         {
5813                 monster_race *r_ptr = &r_info[i];
5814
5815                 /* Use that monster */
5816                 if (r_ptr->name) who[n++] = i;
5817         }
5818
5819         /* Select the sort method */
5820         ang_sort_comp = ang_sort_comp_hook;
5821         ang_sort_swap = ang_sort_swap_hook;
5822
5823         /* Sort the array by dungeon depth of monsters */
5824         ang_sort(who, &why, n);
5825
5826         /* Scan the monster races */
5827         for (k = 0; k < n; k++)
5828         {
5829                 monster_race *r_ptr = &r_info[who[k]];
5830
5831                 /* Only print Uniques */
5832                 if (r_ptr->flags1 & (RF1_UNIQUE))
5833                 {
5834                         bool dead = (r_ptr->max_num == 0);
5835
5836                         if (dead) continue;
5837
5838                         /* Only display "known" uniques */
5839                         if (dead || cheat_know || r_ptr->r_sights)
5840                         {
5841                                 /* Print a message */
5842 #ifdef JP
5843                                 fprintf(fff, "     %s¤Ï¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¡£\n",
5844                                         (r_name + r_ptr->name));
5845 #else
5846                                 fprintf(fff, "     %s is alive\n",
5847                                         (r_name + r_ptr->name));
5848 #endif
5849
5850                         }
5851                 }
5852         }
5853
5854         /* Free the "who" array */
5855         C_KILL(who, max_r_idx, s16b);
5856
5857         /* Close the file */
5858         my_fclose(fff);
5859
5860         /* Display the file contents */
5861 #ifdef JP
5862         show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
5863 #else
5864         show_file(TRUE, file_name, "Alive Uniques", 0, 0);
5865 #endif
5866
5867
5868         /* Remove the file */
5869         fd_kill(file_name);
5870 }
5871
5872
5873 /*
5874  * Display dead uniques
5875  */
5876 static void do_cmd_knowledge_uniques_dead(void)
5877 {
5878         int i, k, n = 0;
5879         u16b why = 2;
5880         s16b *who;
5881
5882         FILE *fff;
5883
5884         char file_name[1024];
5885
5886         /* Open a new file */
5887         fff = my_fopen_temp(file_name, 1024);
5888
5889         if (!fff) {
5890 #ifdef JP
5891             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5892 #else
5893             msg_format("Failed to create temporary file %s.", file_name);
5894 #endif
5895             msg_print(NULL);
5896             return;
5897         }
5898
5899         /* Allocate the "who" array */
5900         C_MAKE(who, max_r_idx, s16b);
5901
5902         /* Scan the monsters */
5903         for (i = 1; i < max_r_idx; i++)
5904         {
5905                 monster_race *r_ptr = &r_info[i];
5906
5907                 /* Use that monster */
5908                 if (r_ptr->name) who[n++] = i;
5909         }
5910
5911         /* Select the sort method */
5912         ang_sort_comp = ang_sort_comp_hook;
5913         ang_sort_swap = ang_sort_swap_hook;
5914
5915         /* Sort the array by dungeon depth of monsters */
5916         ang_sort(who, &why, n);
5917
5918         /* Scan the monster races */
5919         for (k = 0; k < n; k++)
5920         {
5921                 monster_race *r_ptr = &r_info[who[k]];
5922
5923                 /* Only print Uniques */
5924                 if (r_ptr->flags1 & (RF1_UNIQUE))
5925                 {
5926                         bool dead = (r_ptr->max_num == 0);
5927
5928                         if (!dead) continue;
5929
5930                         /* Only display "known" uniques */
5931                         if (dead || cheat_know || r_ptr->r_sights)
5932                         {
5933                                 /* Print a message */
5934 #ifdef JP
5935                                 fprintf(fff, "     %s¤Ï´û¤Ë»à¤ó¤Ç¤¤¤ë¡£\n",
5936                                         (r_name + r_ptr->name));
5937 #else
5938                                 fprintf(fff, "     %s is dead\n",
5939                                         (r_name + r_ptr->name));
5940 #endif
5941
5942                         }
5943                 }
5944         }
5945
5946         /* Free the "who" array */
5947         C_KILL(who, max_r_idx, s16b);
5948
5949         /* Close the file */
5950         my_fclose(fff);
5951
5952         /* Display the file contents */
5953 #ifdef JP
5954         show_file(TRUE, file_name, "Åݤ·¤¿¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
5955 #else
5956         show_file(TRUE, file_name, "Dead Uniques", 0, 0);
5957 #endif
5958
5959
5960         /* Remove the file */
5961         fd_kill(file_name);
5962 }
5963
5964
5965 /*
5966  * Display weapon-exp
5967  */
5968 static void do_cmd_knowledge_weapon_exp(void)
5969 {
5970         int i,j, num, shougou;
5971
5972         FILE *fff;
5973
5974         char file_name[1024];
5975         char tmp[30];
5976
5977         /* Open a new file */
5978         fff = my_fopen_temp(file_name, 1024);
5979         if (!fff) {
5980 #ifdef JP
5981             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5982 #else
5983             msg_format("Failed to create temporary file %s.", file_name);
5984 #endif
5985             msg_print(NULL);
5986             return;
5987         }
5988
5989         for(i = 0; i < 5; i++)
5990         {
5991                 for (num = 0; num < 64; num++)
5992                 {
5993                         for (j = 0; j < max_k_idx; j++)
5994                         {
5995                                 object_kind *k_ptr = &k_info[j];
5996
5997                                 if ((k_ptr->tval == TV_SWORD-i) && (k_ptr->sval == num))
5998                                 {
5999                                         if((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6000
6001                                         if(weapon_exp[4-i][num]<4000) shougou=0;
6002                                         else if(weapon_exp[4-i][num]<6000) shougou=1;
6003                                         else if(weapon_exp[4-i][num]<7000) shougou=2;
6004                                         else if(weapon_exp[4-i][num]<8000) shougou=3;
6005                                         else shougou=4;
6006                                         strip_name(tmp, j);
6007                                         fprintf(fff,"%-25s ",tmp);
6008                                         if (weapon_exp[4-i][num] >= s_info[p_ptr->pclass].w_max[4-i][num]) fprintf(fff,"!");
6009                                         else fprintf(fff," ");
6010                                         fprintf(fff,"%s",shougou_moji[shougou]);
6011                                         if (cheat_xtra) fprintf(fff," %d",weapon_exp[4-i][num]);
6012                                         fprintf(fff,"\n");
6013                                         break;
6014                                 }
6015                         }
6016                 }
6017         }
6018
6019         /* Close the file */
6020         my_fclose(fff);
6021
6022         /* Display the file contents */
6023 #ifdef JP
6024         show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6025 #else
6026         show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6027 #endif
6028
6029
6030         /* Remove the file */
6031         fd_kill(file_name);
6032 }
6033
6034
6035 /*
6036  * Display spell-exp
6037  */
6038 static void do_cmd_knowledge_spell_exp(void)
6039 {
6040         int i=0, shougou;
6041
6042         FILE *fff;
6043         magic_type *s_ptr;
6044
6045         char file_name[1024];
6046
6047         /* Open a new file */
6048         fff = my_fopen_temp(file_name, 1024);
6049         if (!fff) {
6050 #ifdef JP
6051             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6052 #else
6053             msg_format("Failed to create temporary file %s.", file_name);
6054 #endif
6055             msg_print(NULL);
6056             return;
6057         }
6058
6059         if(p_ptr->realm1 != REALM_NONE)
6060         {
6061 #ifdef JP
6062                 fprintf(fff,"%s¤ÎËâË¡½ñ\n",realm_names[p_ptr->realm1]);
6063 #else
6064                 fprintf(fff,"%s Spellbook\n",realm_names[p_ptr->realm1]);
6065 #endif
6066                 for (i = 0; i < 32; i++)
6067                 {
6068                         if (!is_magic(p_ptr->realm1))
6069                         {
6070                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC - 1][i];
6071                         }
6072                         else
6073                         {
6074                                 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6075                         }
6076                         if(s_ptr->slevel == 99) continue;
6077                         if(spell_exp[i]<900) shougou=0;
6078                         else if(spell_exp[i]<1200) shougou=1;
6079                         else if(spell_exp[i]<1400) shougou=2;
6080                         else if(spell_exp[i]<1600) shougou=3;
6081                         else shougou=4;
6082                         fprintf(fff,"%-25s ",spell_names[technic2magic(p_ptr->realm1)-1][i]);
6083                         if (p_ptr->realm1 == REALM_HISSATSU)
6084                                 fprintf(fff,"[--]");
6085                         else
6086                         {
6087                                 if (shougou == 4) fprintf(fff,"!");
6088                                 else fprintf(fff," ");
6089                                 fprintf(fff,"%s",shougou_moji[shougou]);
6090                         }
6091                         if (cheat_xtra) fprintf(fff," %d",spell_exp[i]);
6092                         fprintf(fff,"\n");
6093                 }
6094         }
6095
6096         if(p_ptr->realm2 != REALM_NONE)
6097         {
6098                 fprintf(fff,"\n%s Spellbook\n",realm_names[p_ptr->realm2]);
6099                 for (i = 0; i < 32; i++)
6100                 {
6101                         if (!is_magic(p_ptr->realm1))
6102                         {
6103                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC - 1][i];
6104                         }
6105                         else
6106                         {
6107                                 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6108                         }
6109                         if(s_ptr->slevel == 99) continue;
6110
6111                         if(spell_exp[i+32]<900) shougou=0;
6112                         else if(spell_exp[i+32]<1200) shougou=1;
6113                         else if(spell_exp[i+32]<1400) shougou=2;
6114                         else shougou=3;
6115                         fprintf(fff,"%-25s ",spell_names[technic2magic(p_ptr->realm2)-1][i]);
6116                         if (shougou == 3) fprintf(fff,"!");
6117                         else fprintf(fff," ");
6118                         fprintf(fff,"%s",shougou_moji[shougou]);
6119                         if (cheat_xtra) fprintf(fff," %d",spell_exp[i+32]);
6120                         fprintf(fff,"\n");
6121                 }
6122         }
6123
6124         /* Close the file */
6125         my_fclose(fff);
6126
6127         /* Display the file contents */
6128 #ifdef JP
6129         show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6130 #else
6131         show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6132 #endif
6133
6134
6135         /* Remove the file */
6136         fd_kill(file_name);
6137 }
6138
6139
6140 /*
6141  * Display skill-exp
6142  */
6143 static void do_cmd_knowledge_skill_exp(void)
6144 {
6145         int i=0, shougou;
6146
6147         FILE *fff;
6148
6149         char file_name[1024];
6150 #ifdef JP
6151         char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή          ", "¾èÇÏ            "};
6152 #else
6153         char skill_name[3][20]={"Martial Arts    ", "Dual Wielding   ", "Riding          "};
6154 #endif
6155
6156         /* Open a new file */
6157         fff = my_fopen_temp(file_name, 1024);
6158         if (!fff) {
6159 #ifdef JP
6160             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6161 #else
6162             msg_format("Failed to create temporary file %s.", file_name);
6163 #endif
6164             msg_print(NULL);
6165             return;
6166         }
6167
6168         for (i = 0; i < 3; i++)
6169         {
6170                 if(i == GINOU_RIDING)
6171                 {
6172                         if(skill_exp[i]<500) shougou=0;
6173                         else if(skill_exp[i]<2000) shougou=1;
6174                         else if(skill_exp[i]<5000) shougou=2;
6175                         else if(skill_exp[i]<8000) shougou=3;
6176                         else shougou=4;
6177                 }
6178                 else
6179                 {
6180                         if(skill_exp[i]<4000) shougou=0;
6181                         else if(skill_exp[i]<6000) shougou=1;
6182                         else if(skill_exp[i]<7000) shougou=2;
6183                         else if(skill_exp[i]<8000) shougou=3;
6184                         else shougou=4;
6185                 }
6186                 fprintf(fff,"%-20s ",skill_name[i]);
6187                 if (skill_exp[i] == s_info[p_ptr->pclass].s_max[i]) fprintf(fff,"!");
6188                 else fprintf(fff," ");
6189                 fprintf(fff,"%s",shougou_moji[shougou]);
6190                 if (cheat_xtra) fprintf(fff," %d",skill_exp[i]);
6191                 fprintf(fff,"\n");
6192         }
6193
6194         /* Close the file */
6195         my_fclose(fff);
6196
6197         /* Display the file contents */
6198 #ifdef JP
6199         show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6200 #else
6201         show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6202 #endif
6203
6204
6205         /* Remove the file */
6206         fd_kill(file_name);
6207 }
6208
6209
6210 /*
6211  * Pluralize a monster name
6212  */
6213 void plural_aux(char *Name)
6214 {
6215         int NameLen = strlen(Name);
6216
6217         if (strstr(Name, "Disembodied hand"))
6218         {
6219                 strcpy(Name, "Disembodied hands that strangled people");
6220         }
6221         else if (strstr(Name, "Colour out of space"))
6222         {
6223                 strcpy(Name, "Colours out of space");
6224         }
6225         else if (strstr(Name, "stairway to hell"))
6226         {
6227                 strcpy(Name, "stairways to hell");
6228         }
6229         else if (strstr(Name, "Dweller on the threshold"))
6230         {
6231                 strcpy(Name, "Dwellers on the threshold");
6232         }
6233         else if (strstr(Name, " of "))
6234         {
6235                 cptr aider = strstr(Name, " of ");
6236                 char dummy[80];
6237                 int i = 0;
6238                 cptr ctr = Name;
6239
6240                 while (ctr < aider)
6241                 {
6242                         dummy[i] = *ctr;
6243                         ctr++; i++;
6244                 }
6245
6246                 if (dummy[i-1] == 's')
6247                 {
6248                         strcpy(&(dummy[i]), "es");
6249                         i++;
6250                 }
6251                 else
6252                 {
6253                         strcpy(&(dummy[i]), "s");
6254                 }
6255
6256                 strcpy(&(dummy[i+1]), aider);
6257                 strcpy(Name, dummy);
6258         }
6259         else if (strstr(Name, "coins"))
6260         {
6261                 char dummy[80];
6262                 strcpy(dummy, "piles of ");
6263                 strcat(dummy, Name);
6264                 strcpy(Name, dummy);
6265                 return;
6266         }
6267         else if (strstr(Name, "Manes"))
6268         {
6269                 return;
6270         }
6271         else if (streq(&(Name[NameLen - 2]), "ey"))
6272         {
6273                 strcpy(&(Name[NameLen - 2]), "eys");
6274         }
6275         else if (Name[NameLen - 1] == 'y')
6276         {
6277                 strcpy(&(Name[NameLen - 1]), "ies");
6278         }
6279         else if (streq(&(Name[NameLen - 4]), "ouse"))
6280         {
6281                 strcpy(&(Name[NameLen - 4]), "ice");
6282         }
6283         else if (streq(&(Name[NameLen - 2]), "us"))
6284         {
6285                 strcpy(&(Name[NameLen - 2]), "i");
6286         }
6287         else if (streq(&(Name[NameLen - 6]), "kelman"))
6288         {
6289                 strcpy(&(Name[NameLen - 6]), "kelmen");
6290         }
6291         else if (streq(&(Name[NameLen - 8]), "wordsman"))
6292         {
6293                 strcpy(&(Name[NameLen - 8]), "wordsmen");
6294         }
6295         else if (streq(&(Name[NameLen - 7]), "oodsman"))
6296         {
6297                 strcpy(&(Name[NameLen - 7]), "oodsmen");
6298         }
6299         else if (streq(&(Name[NameLen - 7]), "eastman"))
6300         {
6301                 strcpy(&(Name[NameLen - 7]), "eastmen");
6302         }
6303         else if (streq(&(Name[NameLen - 8]), "izardman"))
6304         {
6305                 strcpy(&(Name[NameLen - 8]), "izardmen");
6306         }
6307         else if (streq(&(Name[NameLen - 5]), "geist"))
6308         {
6309                 strcpy(&(Name[NameLen - 5]), "geister");
6310         }
6311         else if (streq(&(Name[NameLen - 2]), "ex"))
6312         {
6313                 strcpy(&(Name[NameLen - 2]), "ices");
6314         }
6315         else if (streq(&(Name[NameLen - 2]), "lf"))
6316         {
6317                 strcpy(&(Name[NameLen - 2]), "lves");
6318         }
6319         else if (suffix(Name, "ch") ||
6320                  suffix(Name, "sh") ||
6321                          suffix(Name, "nx") ||
6322                          suffix(Name, "s") ||
6323                          suffix(Name, "o"))
6324         {
6325                 strcpy(&(Name[NameLen]), "es");
6326         }
6327         else
6328         {
6329                 strcpy(&(Name[NameLen]), "s");
6330         }
6331 }
6332
6333 /*
6334  * Display current pets
6335  */
6336 static void do_cmd_knowledge_pets(void)
6337 {
6338         int             i;
6339         FILE            *fff;
6340         monster_type    *m_ptr;
6341         int             t_friends = 0;
6342         int             show_upkeep = 0;
6343         char            file_name[1024];
6344
6345
6346         /* Open a new file */
6347         fff = my_fopen_temp(file_name, 1024);
6348         if (!fff) {
6349 #ifdef JP
6350             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6351 #else
6352             msg_format("Failed to create temporary file %s.", file_name);
6353 #endif
6354             msg_print(NULL);
6355             return;
6356         }
6357
6358         /* Process the monsters (backwards) */
6359         for (i = m_max - 1; i >= 1; i--)
6360         {
6361                 monster_race *r_ptr;
6362                 /* Access the monster */
6363                 m_ptr = &m_list[i];
6364
6365                 /* Ignore "dead" monsters */
6366                 if (!m_ptr->r_idx) continue;
6367                 r_ptr = &r_info[m_ptr->r_idx];
6368
6369                 /* Calculate "upkeep" for pets */
6370                 if (is_pet(m_ptr))
6371                 {
6372                         char pet_name[80];
6373                         t_friends++;
6374                         monster_desc(pet_name, m_ptr, 0x88);
6375                         fprintf(fff, "%s (%s)", pet_name, look_mon_desc(i));
6376                         if (p_ptr->riding == i)
6377 #ifdef JP
6378                                 fprintf(fff, " ¾èÇÏÃæ");
6379 #else
6380                                 fprintf(fff, " Riding");
6381 #endif
6382                         fprintf(fff, "\n");
6383                 }
6384         }
6385
6386         show_upkeep = calculate_upkeep();
6387
6388         fprintf(fff, "----------------------------------------------\n");
6389 #ifdef JP
6390         fprintf(fff, "    ¹ç·×: %d É¤¤Î¥Ú¥Ã¥È\n", t_friends);
6391         fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6392 #else
6393         fprintf(fff, "   Total: %d pet%s.\n",
6394                 t_friends, (t_friends == 1 ? "" : "s"));
6395         fprintf(fff, "   Upkeep: %d%% mana.\n", show_upkeep);
6396 #endif
6397
6398
6399
6400         /* Close the file */
6401         my_fclose(fff);
6402
6403         /* Display the file contents */
6404 #ifdef JP
6405 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6406 #else
6407         show_file(TRUE, file_name, "Current Pets", 0, 0);
6408 #endif
6409
6410
6411         /* Remove the file */
6412         fd_kill(file_name);
6413 }
6414
6415
6416 /*
6417  * Total kill count
6418  *
6419  * Note that the player ghosts are ignored.  XXX XXX XXX
6420  */
6421 static void do_cmd_knowledge_kill_count(void)
6422 {
6423         int i, k, n = 0;
6424         u16b why = 2;
6425         s16b *who;
6426
6427         FILE *fff;
6428
6429         char file_name[1024];
6430
6431         s32b Total = 0;
6432
6433
6434         /* Open a new file */
6435         fff = my_fopen_temp(file_name, 1024);
6436
6437         if (!fff) {
6438 #ifdef JP
6439             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6440 #else
6441             msg_format("Failed to create temporary file %s.", file_name);
6442 #endif
6443             msg_print(NULL);
6444             return;
6445         }
6446
6447         /* Allocate the "who" array */
6448         C_MAKE(who, max_r_idx, s16b);
6449
6450         {
6451                 /* Monsters slain */
6452                 int kk;
6453
6454                 for (kk = 1; kk < max_r_idx; kk++)
6455                 {
6456                         monster_race *r_ptr = &r_info[kk];
6457
6458                         if (r_ptr->flags1 & (RF1_UNIQUE))
6459                         {
6460                                 bool dead = (r_ptr->max_num == 0);
6461
6462                                 if (dead)
6463                                 {
6464                                         Total++;
6465                                 }
6466                         }
6467                         else
6468                         {
6469                                 s16b This = r_ptr->r_pkills;
6470
6471                                 if (This > 0)
6472                                 {
6473                                         Total += This;
6474                                 }
6475                         }
6476                 }
6477
6478                 if (Total < 1)
6479 #ifdef JP
6480                         fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
6481 #else
6482                         fprintf(fff,"You have defeated no enemies yet.\n\n");
6483 #endif
6484
6485                 else if (Total == 1)
6486 #ifdef JP
6487                         fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
6488 #else
6489                         fprintf(fff,"You have defeated one enemy.\n\n");
6490 #endif
6491
6492                 else
6493 #ifdef JP
6494                         fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu É¤¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
6495 #else
6496                         fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
6497 #endif
6498
6499         }
6500
6501         Total = 0;
6502
6503         /* Scan the monsters */
6504         for (i = 1; i < max_r_idx; i++)
6505         {
6506                 monster_race *r_ptr = &r_info[i];
6507
6508                 /* Use that monster */
6509                 if (r_ptr->name) who[n++] = i;
6510         }
6511
6512         /* Select the sort method */
6513         ang_sort_comp = ang_sort_comp_hook;
6514         ang_sort_swap = ang_sort_swap_hook;
6515
6516         /* Sort the array by dungeon depth of monsters */
6517         ang_sort(who, &why, n);
6518
6519         /* Scan the monster races */
6520         for (k = 0; k < n; k++)
6521         {
6522                 monster_race *r_ptr = &r_info[who[k]];
6523
6524                 if (r_ptr->flags1 & (RF1_UNIQUE))
6525                 {
6526                         bool dead = (r_ptr->max_num == 0);
6527
6528                         if (dead)
6529                         {
6530                                 /* Print a message */
6531                                 fprintf(fff, "     %s\n",
6532                                     (r_name + r_ptr->name));
6533                                 Total++;
6534                         }
6535                 }
6536                 else
6537                 {
6538                         s16b This = r_ptr->r_pkills;
6539
6540                         if (This > 0)
6541                         {
6542 #ifdef JP
6543 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
6544 if(strchr("pt",r_ptr->d_char))
6545 fprintf(fff, "     %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
6546 else
6547 fprintf(fff, "     %3d É¤¤Î %s\n", This, r_name + r_ptr->name);
6548 #else
6549                                 if (This < 2)
6550                                 {
6551                                         if (strstr(r_name + r_ptr->name, "coins"))
6552                                         {
6553                                                 fprintf(fff, "     1 pile of %s\n", (r_name + r_ptr->name));
6554                                         }
6555                                         else
6556                                         {
6557                                                 fprintf(fff, "     1 %s\n", (r_name + r_ptr->name));
6558                                         }
6559                                 }
6560                                 else
6561                                 {
6562                                         char ToPlural[80];
6563                                         strcpy(ToPlural, (r_name + r_ptr->name));
6564                                         plural_aux(ToPlural);
6565                                         fprintf(fff, "     %d %s\n", This, ToPlural);
6566                                 }
6567 #endif
6568
6569
6570                                 Total += This;
6571                         }
6572                 }
6573         }
6574
6575         fprintf(fff,"----------------------------------------------\n");
6576 #ifdef JP
6577         fprintf(fff,"    ¹ç·×: %lu É¤¤òÅݤ·¤¿¡£\n", Total);
6578 #else
6579         fprintf(fff,"   Total: %lu creature%s killed.\n",
6580                 Total, (Total == 1 ? "" : "s"));
6581 #endif
6582
6583
6584         /* Free the "who" array */
6585         C_KILL(who, max_r_idx, s16b);
6586
6587         /* Close the file */
6588         my_fclose(fff);
6589
6590         /* Display the file contents */
6591 #ifdef JP
6592 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
6593 #else
6594         show_file(TRUE, file_name, "Kill Count", 0, 0);
6595 #endif
6596
6597
6598         /* Remove the file */
6599         fd_kill(file_name);
6600 }
6601
6602
6603 /*
6604  * Display known objects
6605  */
6606 static void do_cmd_knowledge_objects(void)
6607 {
6608         int k;
6609
6610         FILE *fff;
6611
6612         char o_name[MAX_NLEN];
6613
6614         char file_name[1024];
6615
6616
6617         /* Open a new file */
6618         fff = my_fopen_temp(file_name, 1024);
6619         if (!fff) {
6620 #ifdef JP
6621             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6622 #else
6623             msg_format("Failed to create temporary file %s.", file_name);
6624 #endif
6625             msg_print(NULL);
6626             return;
6627         }
6628
6629         /* Scan the object kinds */
6630         for (k = 1; k < max_k_idx; k++)
6631         {
6632                 object_kind *k_ptr = &k_info[k];
6633
6634                 /* Hack -- skip artifacts */
6635                 if (k_ptr->gen_flags & (TRG_INSTA_ART)) continue;
6636
6637                 /* List known flavored objects */
6638                 if (k_ptr->flavor && k_ptr->aware)
6639                 {
6640                         object_type *i_ptr;
6641                         object_type object_type_body;
6642
6643                         /* Get local object */
6644                         i_ptr = &object_type_body;
6645
6646                         /* Create fake object */
6647                         object_prep(i_ptr, k);
6648
6649                         /* Describe the object */
6650                         object_desc_store(o_name, i_ptr, FALSE, 0);
6651
6652                         /* Print a message */
6653                         fprintf(fff, "     %s\n", o_name);
6654                 }
6655         }
6656
6657         /* Close the file */
6658         my_fclose(fff);
6659
6660         /* Display the file contents */
6661 #ifdef JP
6662         show_file(TRUE, file_name, "´ûÃΤΥ¢¥¤¥Æ¥à", 0, 0);
6663 #else
6664         show_file(TRUE, file_name, "Known Objects", 0, 0);
6665 #endif
6666
6667
6668         /* Remove the file */
6669         fd_kill(file_name);
6670 }
6671
6672
6673 /*
6674 * List virtues & status
6675 *
6676 */
6677 void do_cmd_knowledge_kubi(void)
6678 {
6679         int i;
6680         FILE *fff;
6681         
6682         char file_name[1024];
6683         
6684         
6685         /* Open a new file */
6686         fff = my_fopen_temp(file_name, 1024);
6687         if (!fff) {
6688 #ifdef JP
6689             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6690 #else
6691             msg_format("Failed to create temporary file %s.", file_name);
6692 #endif
6693             msg_print(NULL);
6694             return;
6695         }
6696         
6697         if (fff)
6698         {
6699 #ifdef JP
6700                 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
6701                 fprintf(fff, "\n");
6702                 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
6703 #else
6704                 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
6705                 fprintf(fff, "\n");
6706                 fprintf(fff, "List of wanted monsters\n");
6707 #endif
6708                 for (i = 0; i < MAX_KUBI; i++)
6709                 {
6710                         fprintf(fff,"%-40s ---- ",r_name + r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])].name);
6711                         if (kubi_r_idx[i] > 10000)
6712 #ifdef JP
6713                                 fprintf(fff, "ºÑ\n");
6714 #else
6715                                 fprintf(fff, "done\n");
6716 #endif
6717                         else
6718                                 fprintf(fff, "$%d\n", 300 * (r_info[kubi_r_idx[i]].level + 1));
6719                 }
6720         }
6721         
6722         /* Close the file */
6723         my_fclose(fff);
6724         
6725         /* Display the file contents */
6726 #ifdef JP
6727 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
6728 #else
6729         show_file(TRUE, file_name, "Wanted monsters", 0, 0);
6730 #endif
6731
6732         
6733         /* Remove the file */
6734         fd_kill(file_name);
6735 }
6736
6737 /*
6738 * List virtues & status
6739 *
6740 */
6741 void do_cmd_knowledge_virtues(void)
6742 {
6743         FILE *fff;
6744         
6745         char file_name[1024];
6746         
6747         
6748         /* Open a new file */
6749         fff = my_fopen_temp(file_name, 1024);
6750         if (!fff) {
6751 #ifdef JP
6752             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6753 #else
6754             msg_format("Failed to create temporary file %s.", file_name);
6755 #endif
6756             msg_print(NULL);
6757             return;
6758         }
6759         
6760         if (fff)
6761         {
6762 #ifdef JP
6763                 fprintf(fff, "¸½ºß¤Î°À­ : %s\n\n", your_alignment());
6764 #else
6765                 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
6766 #endif
6767                 dump_virtues(fff);
6768         }
6769         
6770         /* Close the file */
6771         my_fclose(fff);
6772         
6773         /* Display the file contents */
6774 #ifdef JP
6775 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
6776 #else
6777         show_file(TRUE, file_name, "Virtues", 0, 0);
6778 #endif
6779
6780         
6781         /* Remove the file */
6782         fd_kill(file_name);
6783 }
6784
6785 /*
6786 * Dungeon
6787 *
6788 */
6789 void do_cmd_knowledge_dungeon(void)
6790 {
6791         FILE *fff;
6792         
6793         char file_name[1024];
6794         int i;
6795         
6796         
6797         /* Open a new file */
6798         fff = my_fopen_temp(file_name, 1024);
6799         if (!fff) {
6800 #ifdef JP
6801             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6802 #else
6803             msg_format("Failed to create temporary file %s.", file_name);
6804 #endif
6805             msg_print(NULL);
6806             return;
6807         }
6808         
6809         if (fff)
6810         {
6811                 for (i = 1; i < max_d_idx; i++)
6812                 {
6813                         bool seiha = FALSE;
6814
6815                         if (!d_info[i].maxdepth) continue;
6816                         if (!max_dlv[i]) continue;
6817                         if (d_info[i].final_guardian)
6818                         {
6819                                 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
6820                         }
6821                         else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
6822 #ifdef JP
6823                         fprintf(fff,"%c%-12s :  %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
6824 #else
6825                         fprintf(fff,"%c%-16s :  level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
6826 #endif
6827                 }
6828         }
6829         
6830         /* Close the file */
6831         my_fclose(fff);
6832         
6833         /* Display the file contents */
6834 #ifdef JP
6835 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
6836 #else
6837         show_file(TRUE, file_name, "Dungeon", 0, 0);
6838 #endif
6839
6840         
6841         /* Remove the file */
6842         fd_kill(file_name);
6843 }
6844
6845 /*
6846 * List virtues & status
6847 *
6848 */
6849 static void do_cmd_knowledge_stat(void)
6850 {
6851         FILE *fff;
6852         
6853         char file_name[1024];
6854         int percent, v_nr;
6855         
6856         /* Open a new file */
6857         fff = my_fopen_temp(file_name, 1024);
6858         if (!fff) {
6859 #ifdef JP
6860             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6861 #else
6862             msg_format("Failed to create temporary file %s.", file_name);
6863 #endif
6864             msg_print(NULL);
6865             return;
6866         }
6867         
6868         if (fff)
6869         {
6870                 percent = (int)(((long)player_hp[PY_MAX_LEVEL - 1] * 200L) /
6871                         (2 * p_ptr->hitdie +
6872                         ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
6873
6874 #ifdef JP
6875 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
6876 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
6877 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
6878 #else
6879                 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
6880                 else fprintf(fff, "Your current Life Rating is ???.\n\n");
6881 fprintf(fff, "Limits of maximum stats\n\n");
6882 #endif
6883                 for (v_nr = 0; v_nr < 6; v_nr++)
6884                 {
6885                         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);
6886                         else fprintf(fff, "%s ???\n", stat_names[v_nr]);
6887                 }
6888         }
6889
6890         dump_yourself(fff);
6891
6892         /* Close the file */
6893         my_fclose(fff);
6894         
6895         /* Display the file contents */
6896 #ifdef JP
6897 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
6898 #else
6899         show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
6900 #endif
6901
6902         
6903         /* Remove the file */
6904         fd_kill(file_name);
6905 }
6906
6907 /*
6908  * Print quest status of all active quests
6909  */
6910 static void do_cmd_knowledge_quests(void)
6911 {
6912         FILE *fff;
6913         char file_name[1024];
6914         char tmp_str[120];
6915         char rand_tmp_str[120] = "\0";
6916         char name[80];
6917         monster_race *r_ptr;
6918         int i;
6919         int rand_level = 100;
6920         int total = 0;
6921
6922         /* Open a new file */
6923         fff = my_fopen_temp(file_name, 1024);
6924         if (!fff) {
6925 #ifdef JP
6926             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6927 #else
6928             msg_format("Failed to create temporary file %s.", file_name);
6929 #endif
6930             msg_print(NULL);
6931             return;
6932         }
6933
6934 #ifdef JP
6935         fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
6936 #else
6937         fprintf(fff, "< Current Quest >\n");
6938 #endif
6939
6940         for (i = 1; i < max_quests; i++)
6941         {
6942                 /* No info from "silent" quests */
6943                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
6944
6945                 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_COMPLETED)
6946                 {
6947                         int old_quest;
6948                         int j;
6949
6950                         /* Clear the text */
6951                         for (j = 0; j < 10; j++)
6952                         {
6953                                 quest_text[j][0] = '\0';
6954                         }
6955
6956                         quest_text_line = 0;
6957
6958                         total++;
6959
6960                         /* Set the quest number temporary */
6961                         old_quest = p_ptr->inside_quest;
6962                         p_ptr->inside_quest = i;
6963
6964                         /* Get the quest text */
6965                         init_flags = INIT_SHOW_TEXT;
6966
6967                         process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
6968
6969                         /* Reset the old quest number */
6970                         p_ptr->inside_quest = old_quest;
6971
6972                         if (quest[i].type != QUEST_TYPE_RANDOM)
6973                         {
6974                                 char note[80] = "\0";
6975
6976                                 if (quest[i].status == QUEST_STATUS_TAKEN)
6977                                 {
6978                                         if (quest[i].type == QUEST_TYPE_KILL_LEVEL || quest[i].type == QUEST_TYPE_KILL_ANY_LEVEL)
6979                                         {
6980                                                 r_ptr = &r_info[quest[i].r_idx];
6981                                                 strcpy(name, r_name + r_ptr->name);
6982                                                 if (quest[i].max_num > 1)
6983                                                 {
6984 #ifdef JP
6985                                                         sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",quest[i].max_num, name, quest[i].max_num-quest[i].cur_num);
6986 #else
6987                                                         plural_aux(name);
6988                                                         sprintf(note," - kill %d %s, have killed %d.",quest[i].max_num, name, quest[i].cur_num);
6989 #endif
6990                                                 }
6991                                                 else
6992 #ifdef JP
6993                                                         sprintf(note," - %s¤òÅݤ¹¡£",name);
6994 #else
6995                                                         sprintf(note," - kill %s.",name);
6996 #endif
6997                                         }
6998                                         else if (quest[i].type == QUEST_TYPE_KILL_NUMBER)
6999                                         {
7000 #ifdef JP
7001                                                 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",quest[i].max_num, quest[i].max_num-quest[i].cur_num);
7002 #else
7003                                                 sprintf(note," - Kill %d monsters, have killed %d.",quest[i].max_num, quest[i].cur_num);
7004 #endif
7005                                         }
7006                                         else if (quest[i].type == QUEST_TYPE_FIND_ARTIFACT)
7007                                         {
7008                                                 strcpy(name, a_name + a_info[quest[i].k_idx].name);
7009 #ifdef JP
7010                                                 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
7011 #else
7012                                                 sprintf(note," - Find out %s.", name);
7013 #endif
7014                                         }
7015                                         else if (quest[i].type == QUEST_TYPE_FIND_EXIT)
7016 #ifdef JP
7017                                                 sprintf(note," - Ãµº÷¤¹¤ë¡£");
7018 #else
7019                                                 sprintf(note," - Search.");
7020 #endif
7021                                         else if (quest[i].type == QUEST_TYPE_KILL_ALL)
7022 #ifdef JP
7023                                                 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
7024 #else
7025                                                 sprintf(note," - Kill all monsters.");
7026 #endif
7027                                 }
7028
7029                                 /* Print the quest info */
7030 #ifdef JP
7031                                 sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
7032 #else
7033                                 sprintf(tmp_str, "%s (Danger level: %d)%s\n",
7034 #endif
7035
7036                                         quest[i].name, quest[i].level, note);
7037
7038                                 fprintf(fff, tmp_str);
7039
7040                                 if (quest[i].status == QUEST_STATUS_COMPLETED)
7041                                 {
7042 #ifdef JP
7043                                         sprintf(tmp_str, "  ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
7044 #else
7045                                         sprintf(tmp_str, "  Quest Completed - Unrewarded\n");
7046 #endif
7047
7048
7049                                         fprintf(fff, tmp_str);
7050                                 }
7051                                 else
7052                                 {
7053                                         j = 0;
7054
7055                                         while (quest_text[j][0] && j < 10)
7056                                         {
7057                                                 fprintf(fff, "  %s\n", quest_text[j]);
7058                                                 j++;
7059                                         }
7060                                 }
7061                         }
7062                         else if ((quest[i].type == QUEST_TYPE_RANDOM) &&
7063                                  (quest[i].level < rand_level))
7064                         {
7065                                 /* New random */
7066                                 rand_level = quest[i].level;
7067
7068                                 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
7069                                 {
7070                                         /* Print the quest info */
7071                                         r_ptr = &r_info[quest[i].r_idx];
7072                                         strcpy(name, r_name + r_ptr->name);
7073
7074                                         if (quest[i].max_num > 1)
7075                                         {
7076 #ifdef JP
7077 sprintf(rand_tmp_str,"%s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
7078         quest[i].name, quest[i].level,
7079         quest[i].max_num, name, quest[i].max_num-quest[i].cur_num);
7080 #else
7081                                                 plural_aux(name);
7082
7083                                                 sprintf(rand_tmp_str,"%s (Dungeon level: %d)\n  Kill %d %s, have killed %d.\n",
7084                                                         quest[i].name, quest[i].level,
7085                                                         quest[i].max_num, name, quest[i].cur_num);
7086 #endif
7087
7088                                         }
7089                                         else
7090                                         {
7091 #ifdef JP
7092 sprintf(rand_tmp_str,"%s (%d ³¬) - %s¤òÅݤ¹¡£\n",
7093 #else
7094                                                 sprintf(rand_tmp_str,"%s (Dungeon level: %d)\n  Kill %s.\n",
7095 #endif
7096
7097                                                         quest[i].name, quest[i].level, name);
7098                                         }
7099                                 }
7100                         }
7101                 }
7102         }
7103
7104         /* Print the current random quest  */
7105         if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
7106
7107 #ifdef JP
7108         if (!total) fprintf(fff, "¤Ê¤·\n");
7109 #else
7110         if (!total) fprintf(fff, "Nothing.\n");
7111 #endif
7112
7113 #ifdef JP
7114         fprintf(fff, "\n¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
7115 #else
7116         fprintf(fff, "\n< Completed Quest >\n");
7117 #endif
7118         total = 0;
7119         for (i = 1; i < max_quests; i++)
7120         {
7121                 /* No info from "silent" quests */
7122                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7123
7124                 if (quest[i].status == QUEST_STATUS_FINISHED)
7125                 {
7126                         int old_quest;
7127
7128                         total++;
7129
7130                         if (i < MIN_RANDOM_QUEST)
7131                         {
7132                                 /* Set the quest number temporary */
7133                                 old_quest = p_ptr->inside_quest;
7134                                 p_ptr->inside_quest = i;
7135
7136                                 /* Get the quest */
7137                                 init_flags = INIT_ASSIGN;
7138
7139                                 process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
7140
7141                                 /* Reset the old quest number */
7142                                 p_ptr->inside_quest = old_quest;
7143                         }
7144
7145                         if ((i >= MIN_RANDOM_QUEST) && quest[i].r_idx)
7146                         {
7147                                 /* Print the quest info */
7148 #ifdef JP
7149                                 sprintf(tmp_str, "%s (%d³¬) - ¥ì¥Ù¥ë%d\n",
7150 #else
7151                                 sprintf(tmp_str, "%s (Dungeon level: %d) - level %d\n",
7152 #endif
7153
7154                                         r_name+r_info[quest[i].r_idx].name, quest[i].level, quest[i].complev);
7155                         }
7156                         else
7157                         {
7158                                 /* Print the quest info */
7159 #ifdef JP
7160                                 sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n",
7161 #else
7162                                 sprintf(tmp_str, "%s (Danger level: %d) - level %d\n",
7163 #endif
7164
7165                                         quest[i].name, quest[i].level, quest[i].complev);
7166                         }
7167
7168                         fprintf(fff, tmp_str);
7169                 }
7170         }
7171 #ifdef JP
7172         if (!total) fprintf(fff, "¤Ê¤·\n");
7173 #else
7174         if (!total) fprintf(fff, "Nothing.\n");
7175 #endif
7176
7177 #ifdef JP
7178         fprintf(fff, "\n¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
7179 #else
7180         fprintf(fff, "\n< Failed Quest >\n");
7181 #endif
7182         total = 0;
7183         for (i = 1; i < max_quests; i++)
7184         {
7185                 /* No info from "silent" quests */
7186                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7187
7188                 if ((quest[i].status == QUEST_STATUS_FAILED_DONE) || (quest[i].status == QUEST_STATUS_FAILED))
7189                 {
7190                         int old_quest;
7191
7192                         total++;
7193
7194                         if (i < MIN_RANDOM_QUEST)
7195                         {
7196                                 /* Set the quest number temporary */
7197                                 old_quest = p_ptr->inside_quest;
7198                                 p_ptr->inside_quest = i;
7199
7200                                 /* Get the quest text */
7201                                 init_flags = INIT_ASSIGN;
7202
7203                                 process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
7204
7205                                 /* Reset the old quest number */
7206                                 p_ptr->inside_quest = old_quest;
7207                         }
7208
7209                         if ((i >= MIN_RANDOM_QUEST) && quest[i].r_idx)
7210                         {
7211                                 /* Print the quest info */
7212 #ifdef JP
7213                                 sprintf(tmp_str, "%s (%d³¬) - ¥ì¥Ù¥ë%d\n",
7214 #else
7215                                 sprintf(tmp_str, "%s (Dungeon level: %d) - level %d\n",
7216 #endif
7217
7218                                         r_name+r_info[quest[i].r_idx].name, quest[i].level, quest[i].complev);
7219                         }
7220                         else
7221                         {
7222                                 /* Print the quest info */
7223 #ifdef JP
7224                                 sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n",
7225 #else
7226                                 sprintf(tmp_str, "%s (Danger level: %d) - level %d\n",
7227 #endif
7228
7229                                         quest[i].name, quest[i].level, quest[i].complev);
7230                         }
7231                         fprintf(fff, tmp_str);
7232                 }
7233         }
7234 #ifdef JP
7235         if (!total) fprintf(fff, "¤Ê¤·\n");
7236 #else
7237         if (!total) fprintf(fff, "Nothing.\n");
7238 #endif
7239
7240         if (wizard) {
7241 #ifdef JP
7242         fprintf(fff, "\n¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
7243 #else
7244         fprintf(fff, "\n< Remaining Random Quest >\n");
7245 #endif
7246         total = 0;
7247         for (i = 1; i < max_quests; i++)
7248         {
7249                 /* No info from "silent" quests */
7250                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7251
7252                 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
7253                 {
7254                         total++;
7255
7256                         /* Print the quest info */
7257 #ifdef JP
7258                         sprintf(tmp_str, "%s (%d³¬, %s)\n",
7259 #else
7260                         sprintf(tmp_str, "%s (%d, %s)\n",
7261 #endif
7262
7263                                 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
7264                         fprintf(fff, tmp_str);
7265                 }
7266         }
7267 #ifdef JP
7268         if (!total) fprintf(fff, "¤Ê¤·\n");
7269 #else
7270         if (!total) fprintf(fff, "Nothing.\n");
7271 #endif
7272         }       
7273
7274         /* Close the file */
7275         my_fclose(fff);
7276
7277         /* Display the file contents */
7278 #ifdef JP
7279         show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
7280 #else
7281         show_file(TRUE, file_name, "Quest status", 0, 0);
7282 #endif
7283
7284
7285         /* Remove the file */
7286         fd_kill(file_name);
7287 }
7288
7289
7290
7291 /*
7292 * List my home
7293 *
7294 */
7295 void do_cmd_knowledge_home(void)
7296 {
7297         FILE *fff;
7298         
7299         int i, x;
7300         char file_name[1024];
7301         store_type  *st_ptr;
7302         char o_name[MAX_NLEN];
7303         cptr            paren = ")";
7304
7305         process_dungeon_file("w_info_j.txt", 0, 0, max_wild_y, max_wild_x);
7306
7307         /* Open a new file */
7308         fff = my_fopen_temp(file_name, 1024);
7309         if (!fff) {
7310 #ifdef JP
7311             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7312 #else
7313             msg_format("Failed to create temporary file %s.", file_name);
7314 #endif
7315             msg_print(NULL);
7316             return;
7317         }
7318         
7319         if (fff)
7320         {
7321                 /* Print all homes in the different towns */
7322                 st_ptr = &town[1].store[STORE_HOME];
7323
7324                 /* Home -- if anything there */
7325                 if (st_ptr->stock_num)
7326                 {
7327                         /* Header with name of the town */
7328 #ifdef JP
7329                         fprintf(fff, "  [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
7330 #else
7331                         fprintf(fff, "  [Home Inventory]\n");
7332 #endif
7333                                 x = 1;
7334
7335                         /* Dump all available items */
7336                         for (i = 0; i < st_ptr->stock_num; i++)
7337                         {
7338 #ifdef JP
7339                                 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
7340                                 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
7341                                 if (strlen(o_name) <= 80-3)
7342                                 {
7343                                         fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
7344                                 }
7345                                 else
7346                                 {
7347                                         int n;
7348                                         char *t;
7349                                         for (n = 0, t = o_name; n < 80-3; n++, t++)
7350                                                 if(iskanji(*t)) {t++; n++;}
7351                                         if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
7352
7353                                         fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
7354                                         fprintf(fff, "   %.77s\n", o_name+n);
7355                                 }
7356 #else
7357                                 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
7358                                 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
7359 #endif
7360
7361                         }
7362
7363                         /* Add an empty line */
7364                         fprintf(fff, "\n\n");
7365                 }
7366         }
7367         
7368         /* Close the file */
7369         my_fclose(fff);
7370         
7371         /* Display the file contents */
7372 #ifdef JP
7373 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
7374 #else
7375         show_file(TRUE, file_name, "Home Inventory", 0, 0);
7376 #endif
7377
7378         
7379         /* Remove the file */
7380         fd_kill(file_name);
7381 }
7382
7383
7384 /*
7385  * Check the status of "autopick"
7386  */
7387 static void do_cmd_knowledge_autopick(void)
7388 {
7389         int k;
7390         FILE *fff;
7391         char file_name[1024];
7392
7393         /* Open a new file */
7394         fff = my_fopen_temp(file_name, 1024);
7395
7396         if (!fff)
7397         {
7398 #ifdef JP
7399             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7400 #else
7401             msg_format("Failed to create temporary file %s.", file_name);
7402 #endif
7403             msg_print(NULL);
7404             return;
7405         }
7406
7407         if (!max_autopick)
7408         {
7409 #ifdef JP
7410             fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
7411 #else
7412             fprintf(fff, "No preference for auto picker/destroyer.");
7413 #endif
7414         }
7415         else
7416         {
7417 #ifdef JP
7418             fprintf(fff, "   ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
7419 #else
7420             fprintf(fff, "   There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
7421 #endif
7422         }
7423
7424         for (k = 0; k < max_autopick; k++)
7425         {
7426                 cptr tmp;
7427                 byte act = autopick_list[k].action;
7428                 if (act & DONT_AUTOPICK)
7429                 {
7430 #ifdef JP
7431                         tmp = "ÊüÃÖ";
7432 #else
7433                         tmp = "Leave";
7434 #endif
7435                 }
7436                 else if (act & DO_AUTODESTROY)
7437                 {
7438 #ifdef JP
7439                         tmp = "Ç˲õ";
7440 #else
7441                         tmp = "Destroy";
7442 #endif
7443                 }
7444                 else
7445                 {
7446 #ifdef JP
7447                         tmp = "½¦¤¦";
7448 #else
7449                         tmp = "Pickup";
7450 #endif
7451                 }
7452
7453                 if (act & DO_DISPLAY)
7454                         fprintf(fff, "%11s", format("[%s]", tmp));
7455                 else
7456                         fprintf(fff, "%11s", format("(%s)", tmp));
7457
7458                 tmp = autopick_line_from_entry(&autopick_list[k]);
7459                 fprintf(fff, " %s", tmp);
7460                 string_free(tmp);
7461                 fprintf(fff, "\n");
7462         }
7463         /* Close the file */
7464         my_fclose(fff);
7465         /* Display the file contents */
7466 #ifdef JP
7467         show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
7468 #else
7469         show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
7470 #endif
7471
7472         /* Remove the file */
7473         fd_kill(file_name);
7474 }
7475
7476
7477 /*
7478  * Interact with "knowledge"
7479  */
7480 void do_cmd_knowledge(void)
7481 {
7482         int i,p=0;
7483         /* File type is "TEXT" */
7484         FILE_TYPE(FILE_TYPE_TEXT);
7485         /* Save the screen */
7486         screen_save();
7487         /* Interact until done */
7488         while (1)
7489         {
7490                 /* Clear screen */
7491                 Term_clear();
7492                 /* Ask for a choice */
7493 #ifdef JP
7494                 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
7495                 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
7496 #else
7497                 prt(format("page %d/2", (p+1)), 2, 65);
7498                 prt("Display current knowledge", 3, 0);
7499 #endif
7500
7501                 /* Give some choices */
7502 #ifdef JP
7503                 if (p == 0) {
7504                         prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à                 ¤Î°ìÍ÷", 6, 5);
7505                         prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à                       ¤Î°ìÍ÷", 7, 5);
7506                         prt("(3) ´ûÃΤÎÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
7507                         prt("(4) Åݤ·¤¿¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼           ¤Î°ìÍ÷", 9, 5);
7508                         prt("(5) Åݤ·¤¿Å¨¤Î¿ô                         ¤Î°ìÍ÷", 10, 5);
7509                         prt("(6) ¾Þ¶â¼ó                               ¤Î°ìÍ÷", 11, 5);
7510                         prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È                         ¤Î°ìÍ÷", 12, 5);
7511                         prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à                     ¤Î°ìÍ÷", 13, 5);
7512                         prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ­                 ¤Î°ìÍ÷", 14, 5);
7513                 } else {
7514                         prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó                     ¤Î°ìÍ÷", 6, 5);
7515                         prt("(b) ÆÍÁ³ÊÑ°Û                             ¤Î°ìÍ÷", 7, 5);
7516                         prt("(c) Éð´ï¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 8, 5);
7517                         prt("(d) ËâË¡¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 9, 5);
7518                         prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 10, 5);
7519                         prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ                       ¤Î°ìÍ÷", 11, 5);
7520                         prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó                     ¤Î°ìÍ÷", 12, 5);
7521                         prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È                     ¤Î°ìÍ÷", 13, 5);
7522                         prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê              ¤Î°ìÍ÷", 14, 5);
7523                 }
7524 #else
7525                 if (p == 0) {
7526                         prt("(1) Display known artifacts", 6, 5);
7527                         prt("(2) Display known objects", 7, 5);
7528                         prt("(3) Display remaining uniques", 8, 5);
7529                         prt("(4) Display dead uniques", 9, 5);
7530                         prt("(5) Display kill count", 10, 5);
7531                         prt("(6) Display wanted monsters", 11, 5);
7532                         prt("(7) Display current pets", 12, 5);
7533                         prt("(8) Display home inventory", 13, 5);
7534                         prt("(9) Display *identified* equip.", 14, 5);
7535                 } else {
7536                         prt("(a) Display about yourself", 6, 5);
7537                         prt("(b) Display mutations", 7, 5);
7538                         prt("(c) Display weapon proficiency", 8, 5);
7539                         prt("(d) Display spell proficiency", 9, 5);
7540                         prt("(e) Display misc. proficiency", 10, 5);
7541                         prt("(f) Display virtues", 11, 5);
7542                         prt("(g) Display dungeons", 12, 5);
7543                         prt("(h) Display current quests", 13, 5);
7544                         prt("(i) Display auto pick/destroy", 14, 5);
7545                 }
7546 #endif
7547                 /* Prompt */
7548 #ifdef JP
7549                 prt("-³¤¯-", 16, 8);
7550                 prt("ESC) È´¤±¤ë", 21, 1);
7551                 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
7552                 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
7553                 prt("¥³¥Þ¥ó¥É:", 20, 0);
7554 #else
7555                 prt("-more-", 16, 8);
7556                 prt("ESC) Exit menu", 21, 1);
7557                 prt("SPACE) Next page", 21, 30);
7558                 /*prt("-) Previous page", 21, 60);*/
7559                 prt("Command: ", 20, 0);
7560 #endif
7561
7562                 /* Prompt */
7563                 i = inkey();
7564                 /* Done */
7565                 if (i == ESCAPE) break;
7566                 switch (i)
7567                 {
7568                 case ' ': /* Page change */
7569                 case '-':
7570                         p = 1 - p;
7571                         break;
7572                 case '1': /* Artifacts */
7573                         do_cmd_knowledge_artifacts();
7574                         break;
7575                 case '2': /* Objects */
7576                         do_cmd_knowledge_objects();
7577                         break;
7578                 case '3': /* Uniques */
7579                         do_cmd_knowledge_uniques();
7580                         break;
7581                 case '4': /* Uniques */
7582                         do_cmd_knowledge_uniques_dead();
7583                         break;
7584                 case '5': /* Kill count  */
7585                         do_cmd_knowledge_kill_count();
7586                         break;
7587                 case '6': /* wanted */
7588                         do_cmd_knowledge_kubi();
7589                         break;
7590                 case '7': /* Pets */
7591                         do_cmd_knowledge_pets();
7592                         break;
7593                 case '8': /* Home */
7594                         do_cmd_knowledge_home();
7595                         break;
7596                 case '9': /* Resist list */
7597                         do_cmd_knowledge_inven();
7598                         break;
7599                 /* Next page */
7600                 case 'a': /* Max stat */
7601                         do_cmd_knowledge_stat();
7602                         break;
7603                 case 'b': /* Mutations */
7604                         do_cmd_knowledge_mutations();
7605                         break;
7606                 case 'c': /* weapon-exp */
7607                         do_cmd_knowledge_weapon_exp();
7608                         break;
7609                 case 'd': /* spell-exp */
7610                         do_cmd_knowledge_spell_exp();
7611                         break;
7612                 case 'e': /* skill-exp */
7613                         do_cmd_knowledge_skill_exp();
7614                         break;
7615                 case 'f': /* Virtues */
7616                         do_cmd_knowledge_virtues();
7617                         break;
7618                 case 'g': /* Dungeon */
7619                         do_cmd_knowledge_dungeon();
7620                         break;
7621                 case 'h': /* Quests */
7622                         do_cmd_knowledge_quests();
7623                         break;
7624                 case 'i': /* Autopick */
7625                         do_cmd_knowledge_autopick();
7626                         break;
7627                 default: /* Unknown option */
7628                         bell();
7629                 }
7630                 /* Flush messages */
7631                 msg_print(NULL);
7632         }
7633         /* Restore the screen */
7634         screen_load();
7635 }
7636
7637
7638 /*
7639  * Check on the status of an active quest
7640  */
7641 void do_cmd_checkquest(void)
7642 {
7643         /* File type is "TEXT" */
7644         FILE_TYPE(FILE_TYPE_TEXT);
7645
7646         /* Save the screen */
7647         screen_save();
7648
7649         /* Quest info */
7650         do_cmd_knowledge_quests();
7651
7652         /* Restore the screen */
7653         screen_load();
7654 }
7655
7656
7657 /*
7658  * Display the time and date
7659  */
7660 void do_cmd_time(void)
7661 {
7662         int day, hour, min, full, start, end, num;
7663         char desc[1024];
7664
7665         char buf[1024];
7666
7667         FILE *fff;
7668
7669         extract_day_hour_min(&day, &hour, &min);
7670
7671         full = hour * 100 + min;
7672
7673         start = 9999;
7674         end = -9999;
7675
7676         num = 0;
7677
7678 #ifdef JP
7679 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
7680 #else
7681         strcpy(desc, "It is a strange time.");
7682 #endif
7683
7684
7685         /* Message */
7686 #ifdef JP
7687 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
7688 #else
7689         msg_format("This is day %d. The time is %d:%02d %s.",
7690 #endif
7691
7692                                   day, (hour % 12 == 0) ? 12 : (hour % 12),
7693                                   min, (hour < 12) ? "AM" : "PM");
7694
7695         /* Find the path */
7696         if (!randint0(10) || p_ptr->image)
7697                 {
7698 #ifdef JP
7699                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timefun_j.txt");
7700 #else
7701                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timefun.txt");
7702 #endif
7703
7704                 }
7705                 else
7706                 {
7707 #ifdef JP
7708                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timenorm_j.txt");
7709 #else
7710                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timenorm.txt");
7711 #endif
7712
7713                 }
7714
7715         /* Open this file */
7716         fff = my_fopen(buf, "rt");
7717
7718         /* Oops */
7719         if (!fff) return;
7720
7721         /* Find this time */
7722         while (!my_fgets(fff, buf, 1024))
7723         {
7724                 /* Ignore comments */
7725                 if (!buf[0] || (buf[0] == '#')) continue;
7726
7727                 /* Ignore invalid lines */
7728                 if (buf[1] != ':') continue;
7729
7730                 /* Process 'Start' */
7731                 if (buf[0] == 'S')
7732                 {
7733                         /* Extract the starting time */
7734                         start = atoi(buf + 2);
7735
7736                         /* Assume valid for an hour */
7737                         end = start + 59;
7738
7739                         /* Next... */
7740                         continue;
7741                 }
7742
7743                 /* Process 'End' */
7744                 if (buf[0] == 'E')
7745                 {
7746                         /* Extract the ending time */
7747                         end = atoi(buf + 2);
7748
7749                         /* Next... */
7750                         continue;
7751                 }
7752
7753                 /* Ignore incorrect range */
7754                 if ((start > full) || (full > end)) continue;
7755
7756                 /* Process 'Description' */
7757                 if (buf[0] == 'D')
7758                 {
7759                         num++;
7760
7761                         /* Apply the randomizer */
7762                         if (!randint0(num)) strcpy(desc, buf + 2);
7763
7764                         /* Next... */
7765                         continue;
7766                 }
7767         }
7768
7769         /* Message */
7770         msg_print(desc);
7771
7772         /* Close the file */
7773         my_fclose(fff);
7774 }