OSDN Git Service

- セーブファイル用の独立したバージョン番号を導入し、バージョン比較関数
[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(!p_ptr->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                                 p_ptr->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
2410 #ifdef JP
2411         if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
2412 #else
2413         if(!get_check("Reload auto-pick preference file? ")) return;
2414 #endif
2415
2416         /* Free old entries */
2417         init_autopicker();
2418
2419         /* ¥­¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
2420 #ifdef JP
2421         sprintf(buf, "picktype-%s.prf", player_name);
2422 #else
2423         sprintf(buf, "pickpref-%s.prf", player_name);
2424 #endif
2425         err = process_pickpref_file(buf);
2426
2427         if(err == 0)
2428         {
2429 #ifdef JP
2430                 msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
2431 #else
2432                 msg_format("loaded '%s'.", buf);
2433 #endif
2434         }
2435
2436         /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
2437
2438         /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
2439         if (0 > err)
2440         {
2441 #ifdef JP
2442                 err = process_pickpref_file("picktype.prf");
2443 #else
2444                 err = process_pickpref_file("pickpref.prf");
2445 #endif
2446
2447                 if(err == 0)
2448                 {
2449 #ifdef JP
2450                         msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
2451 #else
2452                         msg_print("loaded 'pickpref.prf'.");
2453 #endif
2454                 }
2455         }
2456
2457
2458 #ifdef JP
2459         if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
2460 #else
2461         if(err) msg_print("Failed to reload autopick preference.");
2462 #endif
2463 }
2464
2465 #ifdef ALLOW_MACROS
2466
2467 /*
2468  * Hack -- append all current macros to the given file
2469  */
2470 static errr macro_dump(cptr fname)
2471 {
2472         static cptr mark = "Macro Dump";
2473
2474         int i, line_num;
2475
2476         FILE *fff;
2477
2478         char buf[1024];
2479
2480         /* Build the filename */
2481         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
2482
2483         /* File type is "TEXT" */
2484         FILE_TYPE(FILE_TYPE_TEXT);
2485
2486         /* Append to the file */
2487         fff = open_auto_dump(buf, mark, &line_num);
2488         if (!fff) return (-1);
2489
2490         /* Start dumping */
2491 #ifdef JP
2492         fprintf(fff, "\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n");
2493 #else
2494         fprintf(fff, "\n# Automatic macro dump\n\n");
2495 #endif
2496         line_num += 3;
2497
2498         /* Dump them */
2499         for (i = 0; i < macro__num; i++)
2500         {
2501                 /* Extract the action */
2502                 ascii_to_text(buf, macro__act[i]);
2503
2504                 /* Dump the macro */
2505                 fprintf(fff, "A:%s\n", buf);
2506
2507                 /* Extract the action */
2508                 ascii_to_text(buf, macro__pat[i]);
2509
2510                 /* Dump normal macros */
2511                 fprintf(fff, "P:%s\n", buf);
2512
2513                 /* End the macro */
2514                 fprintf(fff, "\n");
2515
2516                 /* count number of lines */
2517                 line_num += 3;
2518         }
2519
2520         /* Close */
2521         close_auto_dump(fff, mark, line_num);
2522
2523         /* Success */
2524         return (0);
2525 }
2526
2527
2528 /*
2529  * Hack -- ask for a "trigger" (see below)
2530  *
2531  * Note the complex use of the "inkey()" function from "util.c".
2532  *
2533  * Note that both "flush()" calls are extremely important.
2534  */
2535 static void do_cmd_macro_aux(char *buf)
2536 {
2537         int i, n = 0;
2538
2539         char tmp[1024];
2540
2541
2542         /* Flush */
2543         flush();
2544
2545         /* Do not process macros */
2546         inkey_base = TRUE;
2547
2548         /* First key */
2549         i = inkey();
2550
2551         /* Read the pattern */
2552         while (i)
2553         {
2554                 /* Save the key */
2555                 buf[n++] = i;
2556
2557                 /* Do not process macros */
2558                 inkey_base = TRUE;
2559
2560                 /* Do not wait for keys */
2561                 inkey_scan = TRUE;
2562
2563                 /* Attempt to read a key */
2564                 i = inkey();
2565         }
2566
2567         /* Terminate */
2568         buf[n] = '\0';
2569
2570         /* Flush */
2571         flush();
2572
2573
2574         /* Convert the trigger */
2575         ascii_to_text(tmp, buf);
2576
2577         /* Hack -- display the trigger */
2578         Term_addstr(-1, TERM_WHITE, tmp);
2579 }
2580
2581 #endif
2582
2583
2584 /*
2585  * Hack -- ask for a keymap "trigger" (see below)
2586  *
2587  * Note that both "flush()" calls are extremely important.  This may
2588  * no longer be true, since "util.c" is much simpler now.  XXX XXX XXX
2589  */
2590 static void do_cmd_macro_aux_keymap(char *buf)
2591 {
2592         char tmp[1024];
2593
2594
2595         /* Flush */
2596         flush();
2597
2598
2599         /* Get a key */
2600         buf[0] = inkey();
2601         buf[1] = '\0';
2602
2603
2604         /* Convert to ascii */
2605         ascii_to_text(tmp, buf);
2606
2607         /* Hack -- display the trigger */
2608         Term_addstr(-1, TERM_WHITE, tmp);
2609
2610
2611         /* Flush */
2612         flush();
2613 }
2614
2615
2616 /*
2617  * Hack -- append all keymaps to the given file
2618  */
2619 static errr keymap_dump(cptr fname)
2620 {
2621         static cptr mark = "Keymap Dump";
2622         int line_num;
2623         int i;
2624
2625         FILE *fff;
2626
2627         char key[1024];
2628         char buf[1024];
2629
2630         int mode;
2631
2632         /* Roguelike */
2633         if (rogue_like_commands)
2634         {
2635                 mode = KEYMAP_MODE_ROGUE;
2636         }
2637
2638         /* Original */
2639         else
2640         {
2641                 mode = KEYMAP_MODE_ORIG;
2642         }
2643
2644
2645         /* Build the filename */
2646         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
2647
2648         /* File type is "TEXT" */
2649         FILE_TYPE(FILE_TYPE_TEXT);
2650
2651         /* Append to the file */
2652         fff = open_auto_dump(buf, mark, &line_num);
2653         if (!fff) return -1;
2654
2655         /* Start dumping */
2656 #ifdef JP
2657         fprintf(fff, "\n# ¼«Æ°¥­¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n");
2658 #else
2659         fprintf(fff, "\n# Automatic keymap dump\n\n");
2660 #endif
2661         line_num += 3;
2662
2663         /* Dump them */
2664         for (i = 0; i < 256; i++)
2665         {
2666                 cptr act;
2667
2668                 /* Loop up the keymap */
2669                 act = keymap_act[mode][i];
2670
2671                 /* Skip empty keymaps */
2672                 if (!act) continue;
2673
2674                 /* Encode the key */
2675                 buf[0] = i;
2676                 buf[1] = '\0';
2677                 ascii_to_text(key, buf);
2678
2679                 /* Encode the action */
2680                 ascii_to_text(buf, act);
2681
2682                 /* Dump the macro */
2683                 fprintf(fff, "A:%s\n", buf);
2684                 fprintf(fff, "C:%d:%s\n", mode, key);
2685                 line_num += 2;
2686         }
2687
2688         /* Close */
2689         close_auto_dump(fff, mark, line_num);
2690
2691         /* Success */
2692         return (0);
2693 }
2694
2695
2696
2697 /*
2698  * Interact with "macros"
2699  *
2700  * Note that the macro "action" must be defined before the trigger.
2701  *
2702  * Could use some helpful instructions on this page.  XXX XXX XXX
2703  */
2704 void do_cmd_macros(void)
2705 {
2706         int i;
2707
2708         char tmp[1024];
2709
2710         char buf[1024];
2711
2712         int mode;
2713
2714
2715         /* Roguelike */
2716         if (rogue_like_commands)
2717         {
2718                 mode = KEYMAP_MODE_ROGUE;
2719         }
2720
2721         /* Original */
2722         else
2723         {
2724                 mode = KEYMAP_MODE_ORIG;
2725         }
2726
2727         /* File type is "TEXT" */
2728         FILE_TYPE(FILE_TYPE_TEXT);
2729
2730
2731         /* Save screen */
2732         screen_save();
2733
2734
2735         /* Process requests until done */
2736         while (1)
2737         {
2738                 /* Clear screen */
2739                 Term_clear();
2740
2741                 /* Describe */
2742 #ifdef JP
2743                 prt("[ ¥Þ¥¯¥í¤ÎÀßÄê ]", 2, 0);
2744 #else
2745                 prt("Interact with Macros", 2, 0);
2746 #endif
2747
2748
2749
2750                 /* Describe that action */
2751 #ifdef JP
2752                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
2753 #else
2754                 prt("Current action (if any) shown below:", 20, 0);
2755 #endif
2756
2757
2758                 /* Analyze the current action */
2759                 ascii_to_text(buf, macro__buf);
2760
2761                 /* Display the current action */
2762                 prt(buf, 22, 0);
2763
2764
2765                 /* Selections */
2766 #ifdef JP
2767                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
2768 #else
2769                 prt("(1) Load a user pref file", 4, 5);
2770 #endif
2771
2772 #ifdef ALLOW_MACROS
2773 #ifdef JP
2774                 prt("(2) ¥Õ¥¡¥¤¥ë¤Ë¥Þ¥¯¥í¤òÄɲÃ", 5, 5);
2775                 prt("(3) ¥Þ¥¯¥í¤Î³Îǧ", 6, 5);
2776                 prt("(4) ¥Þ¥¯¥í¤ÎºîÀ®", 7, 5);
2777                 prt("(5) ¥Þ¥¯¥í¤Îºï½ü", 8, 5);
2778                 prt("(6) ¥Õ¥¡¥¤¥ë¤Ë¥­¡¼ÇÛÃÖ¤òÄɲÃ", 9, 5);
2779                 prt("(7) ¥­¡¼ÇÛÃ֤γÎǧ", 10, 5);
2780                 prt("(8) ¥­¡¼ÇÛÃ֤κîÀ®", 11, 5);
2781                 prt("(9) ¥­¡¼ÇÛÃ֤κï½ü", 12, 5);
2782                 prt("(0) ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 13, 5);
2783 #else
2784                 prt("(2) Append macros to a file", 5, 5);
2785                 prt("(3) Query a macro", 6, 5);
2786                 prt("(4) Create a macro", 7, 5);
2787                 prt("(5) Remove a macro", 8, 5);
2788                 prt("(6) Append keymaps to a file", 9, 5);
2789                 prt("(7) Query a keymap", 10, 5);
2790                 prt("(8) Create a keymap", 11, 5);
2791                 prt("(9) Remove a keymap", 12, 5);
2792                 prt("(0) Enter a new action", 13, 5);
2793 #endif
2794
2795 #endif /* ALLOW_MACROS */
2796
2797                 /* Prompt */
2798 #ifdef JP
2799                 prt("¥³¥Þ¥ó¥É: ", 16, 0);
2800 #else
2801                 prt("Command: ", 16, 0);
2802 #endif
2803
2804
2805                 /* Get a command */
2806                 i = inkey();
2807
2808                 /* Leave */
2809                 if (i == ESCAPE) break;
2810
2811                 /* Load a 'macro' file */
2812                 else if (i == '1')
2813                 {
2814                         errr err;
2815
2816                         /* Prompt */
2817 #ifdef JP
2818                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 16, 0);
2819 #else
2820                         prt("Command: Load a user pref file", 16, 0);
2821 #endif
2822
2823
2824                         /* Prompt */
2825 #ifdef JP
2826                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
2827 #else
2828                         prt("File: ", 18, 0);
2829 #endif
2830
2831
2832                         /* Default filename */
2833                         sprintf(tmp, "%s.prf", player_name);
2834
2835                         /* Ask for a file */
2836                         if (!askfor_aux(tmp, 80)) continue;
2837
2838                         /* Process the given filename */
2839                         err = process_pref_file(tmp);
2840                         if (-2 == err)
2841                         {
2842 #ifdef JP
2843                                 msg_format("ɸ½à¤ÎÀßÄê¥Õ¥¡¥¤¥ë'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
2844 #else
2845                                 msg_format("Loaded default '%s'.", tmp);
2846 #endif
2847                         }
2848                         else if (err)
2849                         {
2850                                 /* Prompt */
2851 #ifdef JP
2852                                 msg_format("'%s'¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", tmp);
2853 #else
2854                                 msg_format("Failed to load '%s'!");
2855 #endif
2856                         }
2857                         else
2858                         {
2859 #ifdef JP
2860                                 msg_format("'%s'¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", tmp);
2861 #else
2862                                 msg_format("Loaded '%s'.", tmp);
2863 #endif
2864                         }
2865                 }
2866
2867 #ifdef ALLOW_MACROS
2868
2869                 /* Save macros */
2870                 else if (i == '2')
2871                 {
2872                         /* Prompt */
2873 #ifdef JP
2874                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
2875 #else
2876                         prt("Command: Append macros to a file", 16, 0);
2877 #endif
2878
2879
2880                         /* Prompt */
2881 #ifdef JP
2882                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
2883 #else
2884                         prt("File: ", 18, 0);
2885 #endif
2886
2887
2888                         /* Default filename */
2889                         sprintf(tmp, "%s.prf", player_name);
2890
2891                         /* Ask for a file */
2892                         if (!askfor_aux(tmp, 80)) continue;
2893
2894                         /* Dump the macros */
2895                         (void)macro_dump(tmp);
2896
2897                         /* Prompt */
2898 #ifdef JP
2899                         msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
2900 #else
2901                         msg_print("Appended macros.");
2902 #endif
2903
2904                 }
2905
2906                 /* Query a macro */
2907                 else if (i == '3')
2908                 {
2909                         int k;
2910
2911                         /* Prompt */
2912 #ifdef JP
2913                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Î³Îǧ", 16, 0);
2914 #else
2915                         prt("Command: Query a macro", 16, 0);
2916 #endif
2917
2918
2919                         /* Prompt */
2920 #ifdef JP
2921                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
2922 #else
2923                         prt("Trigger: ", 18, 0);
2924 #endif
2925
2926
2927                         /* Get a macro trigger */
2928                         do_cmd_macro_aux(buf);
2929
2930                         /* Acquire action */
2931                         k = macro_find_exact(buf);
2932
2933                         /* Nothing found */
2934                         if (k < 0)
2935                         {
2936                                 /* Prompt */
2937 #ifdef JP
2938                                 msg_print("¤½¤Î¥­¡¼¤Ë¤Ï¥Þ¥¯¥í¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
2939 #else
2940                                 msg_print("Found no macro.");
2941 #endif
2942
2943                         }
2944
2945                         /* Found one */
2946                         else
2947                         {
2948                                 /* Obtain the action */
2949                                 strcpy(macro__buf, macro__act[k]);
2950
2951                                 /* Analyze the current action */
2952                                 ascii_to_text(buf, macro__buf);
2953
2954                                 /* Display the current action */
2955                                 prt(buf, 22, 0);
2956
2957                                 /* Prompt */
2958 #ifdef JP
2959                                 msg_print("¥Þ¥¯¥í¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
2960 #else
2961                                 msg_print("Found a macro.");
2962 #endif
2963
2964                         }
2965                 }
2966
2967                 /* Create a macro */
2968                 else if (i == '4')
2969                 {
2970                         /* Prompt */
2971 #ifdef JP
2972                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤ÎºîÀ®", 16, 0);
2973 #else
2974                         prt("Command: Create a macro", 16, 0);
2975 #endif
2976
2977
2978                         /* Prompt */
2979 #ifdef JP
2980                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
2981 #else
2982                         prt("Trigger: ", 18, 0);
2983 #endif
2984
2985
2986                         /* Get a macro trigger */
2987                         do_cmd_macro_aux(buf);
2988
2989                         /* Clear */
2990                         clear_from(20);
2991
2992                         /* Prompt */
2993 #ifdef JP
2994                         prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
2995 #else
2996                         prt("Action: ", 20, 0);
2997 #endif
2998
2999
3000                         /* Convert to text */
3001                         ascii_to_text(tmp, macro__buf);
3002
3003                         /* Get an encoded action */
3004                         if (askfor_aux(tmp, 80))
3005                         {
3006                                 /* Convert to ascii */
3007                                 text_to_ascii(macro__buf, tmp);
3008
3009                                 /* Link the macro */
3010                                 macro_add(buf, macro__buf);
3011
3012                                 /* Prompt */
3013 #ifdef JP
3014                                 msg_print("¥Þ¥¯¥í¤òÄɲä·¤Þ¤·¤¿¡£");
3015 #else
3016                                 msg_print("Added a macro.");
3017 #endif
3018
3019                         }
3020                 }
3021
3022                 /* Remove a macro */
3023                 else if (i == '5')
3024                 {
3025                         /* Prompt */
3026 #ifdef JP
3027                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¤Îºï½ü", 16, 0);
3028 #else
3029                         prt("Command: Remove a macro", 16, 0);
3030 #endif
3031
3032
3033                         /* Prompt */
3034 #ifdef JP
3035                         prt("¥È¥ê¥¬¡¼¥­¡¼: ", 18, 0);
3036 #else
3037                         prt("Trigger: ", 18, 0);
3038 #endif
3039
3040
3041                         /* Get a macro trigger */
3042                         do_cmd_macro_aux(buf);
3043
3044                         /* Link the macro */
3045                         macro_add(buf, buf);
3046
3047                         /* Prompt */
3048 #ifdef JP
3049                         msg_print("¥Þ¥¯¥í¤òºï½ü¤·¤Þ¤·¤¿¡£");
3050 #else
3051                         msg_print("Removed a macro.");
3052 #endif
3053
3054                 }
3055
3056                 /* Save keymaps */
3057                 else if (i == '6')
3058                 {
3059                         /* Prompt */
3060 #ifdef JP
3061                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃÖ¤ò¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë", 16, 0);
3062 #else
3063                         prt("Command: Append keymaps to a file", 16, 0);
3064 #endif
3065
3066
3067                         /* Prompt */
3068 #ifdef JP
3069                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3070 #else
3071                         prt("File: ", 18, 0);
3072 #endif
3073
3074
3075                         /* Default filename */
3076                         sprintf(tmp, "%s.prf", player_name);
3077
3078                         /* Ask for a file */
3079                         if (!askfor_aux(tmp, 80)) continue;
3080
3081                         /* Dump the macros */
3082                         (void)keymap_dump(tmp);
3083
3084                         /* Prompt */
3085 #ifdef JP
3086                         msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3087 #else
3088                         msg_print("Appended keymaps.");
3089 #endif
3090
3091                 }
3092
3093                 /* Query a keymap */
3094                 else if (i == '7')
3095                 {
3096                         cptr act;
3097
3098                         /* Prompt */
3099 #ifdef JP
3100                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤γÎǧ", 16, 0);
3101 #else
3102                         prt("Command: Query a keymap", 16, 0);
3103 #endif
3104
3105
3106                         /* Prompt */
3107 #ifdef JP
3108                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3109 #else
3110                         prt("Keypress: ", 18, 0);
3111 #endif
3112
3113
3114                         /* Get a keymap trigger */
3115                         do_cmd_macro_aux_keymap(buf);
3116
3117                         /* Look up the keymap */
3118                         act = keymap_act[mode][(byte)(buf[0])];
3119
3120                         /* Nothing found */
3121                         if (!act)
3122                         {
3123                                 /* Prompt */
3124 #ifdef JP
3125                                 msg_print("¥­¡¼ÇÛÃÖ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
3126 #else
3127                                 msg_print("Found no keymap.");
3128 #endif
3129
3130                         }
3131
3132                         /* Found one */
3133                         else
3134                         {
3135                                 /* Obtain the action */
3136                                 strcpy(macro__buf, act);
3137
3138                                 /* Analyze the current action */
3139                                 ascii_to_text(buf, macro__buf);
3140
3141                                 /* Display the current action */
3142                                 prt(buf, 22, 0);
3143
3144                                 /* Prompt */
3145 #ifdef JP
3146                                 msg_print("¥­¡¼ÇÛÃÖ¤ò³Îǧ¤·¤Þ¤·¤¿¡£");
3147 #else
3148                                 msg_print("Found a keymap.");
3149 #endif
3150
3151                         }
3152                 }
3153
3154                 /* Create a keymap */
3155                 else if (i == '8')
3156                 {
3157                         /* Prompt */
3158 #ifdef JP
3159                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κîÀ®", 16, 0);
3160 #else
3161                         prt("Command: Create a keymap", 16, 0);
3162 #endif
3163
3164
3165                         /* Prompt */
3166 #ifdef JP
3167                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3168 #else
3169                         prt("Keypress: ", 18, 0);
3170 #endif
3171
3172
3173                         /* Get a keymap trigger */
3174                         do_cmd_macro_aux_keymap(buf);
3175
3176                         /* Clear */
3177                         clear_from(20);
3178
3179                         /* Prompt */
3180 #ifdef JP
3181                         prt("¹ÔÆ°: ", 20, 0);
3182 #else
3183                         prt("Action: ", 20, 0);
3184 #endif
3185
3186
3187                         /* Convert to text */
3188                         ascii_to_text(tmp, macro__buf);
3189
3190                         /* Get an encoded action */
3191                         if (askfor_aux(tmp, 80))
3192                         {
3193                                 /* Convert to ascii */
3194                                 text_to_ascii(macro__buf, tmp);
3195
3196                                 /* Free old keymap */
3197                                 string_free(keymap_act[mode][(byte)(buf[0])]);
3198
3199                                 /* Make new keymap */
3200                                 keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf);
3201
3202                                 /* Prompt */
3203 #ifdef JP
3204                                 msg_print("¥­¡¼ÇÛÃÖ¤òÄɲä·¤Þ¤·¤¿¡£");
3205 #else
3206                                 msg_print("Added a keymap.");
3207 #endif
3208
3209                         }
3210                 }
3211
3212                 /* Remove a keymap */
3213                 else if (i == '9')
3214                 {
3215                         /* Prompt */
3216 #ifdef JP
3217                         prt("¥³¥Þ¥ó¥É: ¥­¡¼ÇÛÃ֤κï½ü", 16, 0);
3218 #else
3219                         prt("Command: Remove a keymap", 16, 0);
3220 #endif
3221
3222
3223                         /* Prompt */
3224 #ifdef JP
3225                         prt("²¡¤¹¥­¡¼: ", 18, 0);
3226 #else
3227                         prt("Keypress: ", 18, 0);
3228 #endif
3229
3230
3231                         /* Get a keymap trigger */
3232                         do_cmd_macro_aux_keymap(buf);
3233
3234                         /* Free old keymap */
3235                         string_free(keymap_act[mode][(byte)(buf[0])]);
3236
3237                         /* Make new keymap */
3238                         keymap_act[mode][(byte)(buf[0])] = NULL;
3239
3240                         /* Prompt */
3241 #ifdef JP
3242                         msg_print("¥­¡¼ÇÛÃÖ¤òºï½ü¤·¤Þ¤·¤¿¡£");
3243 #else
3244                         msg_print("Removed a keymap.");
3245 #endif
3246
3247                 }
3248
3249                 /* Enter a new action */
3250                 else if (i == '0')
3251                 {
3252                         /* Prompt */
3253 #ifdef JP
3254                         prt("¥³¥Þ¥ó¥É: ¥Þ¥¯¥í¹ÔÆ°¤ÎÆþÎÏ", 16, 0);
3255 #else
3256                         prt("Command: Enter a new action", 16, 0);
3257 #endif
3258
3259
3260                         /* Go to the correct location */
3261                         Term_gotoxy(0, 22);
3262
3263                         /* Hack -- limit the value */
3264                         tmp[80] = '\0';
3265
3266                         /* Get an encoded action */
3267                         if (!askfor_aux(buf, 80)) continue;
3268
3269                         /* Extract an action */
3270                         text_to_ascii(macro__buf, buf);
3271                 }
3272
3273 #endif /* ALLOW_MACROS */
3274
3275                 /* Oops */
3276                 else
3277                 {
3278                         /* Oops */
3279                         bell();
3280                 }
3281
3282                 /* Flush messages */
3283                 msg_print(NULL);
3284         }
3285
3286         /* Load screen */
3287         screen_load();
3288 }
3289
3290
3291 static void cmd_visuals_aux(int i, int *num, int max)
3292 {
3293         if (iscntrl(i))
3294         {
3295                 char str[10] = "";
3296                 int tmp;
3297
3298                 sprintf(str, "%d", *num);
3299
3300                 if (!get_string(format("Input new number(0-%d): ", max-1), str, 4))
3301                         return;
3302
3303                 tmp = strtol(str, NULL, 0);
3304                 if (tmp >= 0 && tmp < max)
3305                         *num = tmp;
3306                 return;
3307         }
3308         else if (isupper(i))
3309                 *num = (*num + max - 1) % max;
3310         else
3311                 *num = (*num + 1) % max;
3312
3313         return;
3314 }
3315
3316 /*
3317  * Interact with "visuals"
3318  */
3319 void do_cmd_visuals(void)
3320 {
3321         int i;
3322
3323         FILE *fff;
3324
3325         char tmp[160];
3326
3327         char buf[1024];
3328
3329
3330         /* File type is "TEXT" */
3331         FILE_TYPE(FILE_TYPE_TEXT);
3332
3333
3334         /* Save the screen */
3335         screen_save();
3336
3337
3338         /* Interact until done */
3339         while (1)
3340         {
3341                 /* Clear screen */
3342                 Term_clear();
3343
3344                 /* Ask for a choice */
3345 #ifdef JP
3346                 prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0);
3347 #else
3348                 prt("Interact with Visuals", 2, 0);
3349 #endif
3350
3351
3352                 /* Give some choices */
3353 #ifdef JP
3354                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
3355 #else
3356                 prt("(1) Load a user pref file", 4, 5);
3357 #endif
3358
3359 #ifdef ALLOW_VISUALS
3360 #ifdef JP
3361                 prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
3362                 prt("(3) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 6, 5);
3363                 prt("(4) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 7, 5);
3364                 prt("(5) (̤»ÈÍÑ)", 8, 5);
3365                 prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5);
3366                 prt("(7) ¥¢¥¤¥Æ¥à¤Î   ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5);
3367                 prt("(8) ÃÏ·Á¤Î       ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5);
3368                 prt("(9) (̤»ÈÍÑ)", 12, 5);
3369 #else
3370                 prt("(2) Dump monster attr/chars", 5, 5);
3371                 prt("(3) Dump object attr/chars", 6, 5);
3372                 prt("(4) Dump feature attr/chars", 7, 5);
3373                 prt("(5) (unused)", 8, 5);
3374                 prt("(6) Change monster attr/chars", 9, 5);
3375                 prt("(7) Change object attr/chars", 10, 5);
3376                 prt("(8) Change feature attr/chars", 11, 5);
3377                 prt("(9) (unused)", 12, 5);
3378 #endif
3379
3380 #endif
3381 #ifdef JP
3382                 prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5);
3383 #else
3384                 prt("(0) Reset visuals", 13, 5);
3385 #endif
3386
3387
3388                 /* Prompt */
3389 #ifdef JP
3390                 prt("¥³¥Þ¥ó¥É:", 18, 0);
3391 #else
3392                 prt("Command: ", 15, 0);
3393 #endif
3394
3395
3396                 /* Prompt */
3397                 i = inkey();
3398
3399                 /* Done */
3400                 if (i == ESCAPE) break;
3401
3402                 /* Load a 'pref' file */
3403                 else if (i == '1')
3404                 {
3405                         /* Prompt */
3406 #ifdef JP
3407                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0);
3408 #else
3409                         prt("Command: Load a user pref file", 15, 0);
3410 #endif
3411
3412
3413                         /* Prompt */
3414 #ifdef JP
3415                         prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
3416 #else
3417                         prt("File: ", 17, 0);
3418 #endif
3419
3420
3421                         /* Default filename */
3422                         sprintf(tmp, "%s.prf", player_name);
3423
3424                         /* Query */
3425                         if (!askfor_aux(tmp, 70)) continue;
3426
3427                         /* Process the given filename */
3428                         (void)process_pref_file(tmp);
3429                 }
3430
3431 #ifdef ALLOW_VISUALS
3432
3433                 /* Dump monster attr/chars */
3434                 else if (i == '2')
3435                 {
3436                         static cptr mark = "Monster attr/chars";
3437                         int line_num;
3438
3439                         /* Prompt */
3440 #ifdef JP
3441                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3442 #else
3443                         prt("Command: Dump monster attr/chars", 15, 0);
3444 #endif
3445
3446
3447                         /* Prompt */
3448 #ifdef JP
3449                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3450 #else
3451                         prt("File: ", 17, 0);
3452 #endif
3453
3454
3455                         /* Default filename */
3456                         sprintf(tmp, "%s.prf", player_name);
3457                         
3458                         /* Get a filename */
3459                         if (!askfor_aux(tmp, 70)) continue;
3460
3461                         /* Build the filename */
3462                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
3463
3464                         /* Append to the file */
3465                         fff = open_auto_dump(buf, mark, &line_num);
3466                         if (!fff) continue;
3467
3468                         /* Start dumping */
3469 #ifdef JP
3470                         fprintf(fff, "\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3471 #else
3472                         fprintf(fff, "\n# Monster attr/char definitions\n\n");
3473 #endif
3474                         line_num += 3;
3475
3476                         /* Dump monsters */
3477                         for (i = 0; i < max_r_idx; i++)
3478                         {
3479                                 monster_race *r_ptr = &r_info[i];
3480
3481                                 /* Skip non-entries */
3482                                 if (!r_ptr->name) continue;
3483
3484                                 /* Dump a comment */
3485                                 fprintf(fff, "# %s\n", (r_name + r_ptr->name));
3486                                 line_num++;
3487
3488                                 /* Dump the monster attr/char info */
3489                                 fprintf(fff, "R:%d:0x%02X:0x%02X\n\n", i,
3490                                         (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
3491                                 line_num += 2;
3492                         }
3493
3494                         /* Close */
3495                         close_auto_dump(fff, mark, line_num);
3496
3497                         /* Message */
3498 #ifdef JP
3499                         msg_print("¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3500 #else
3501                         msg_print("Dumped monster attr/chars.");
3502 #endif
3503
3504                 }
3505
3506                 /* Dump object attr/chars */
3507                 else if (i == '3')
3508                 {
3509                         static cptr mark = "Object attr/chars";
3510                         int line_num;
3511
3512                         /* Prompt */
3513 #ifdef JP
3514                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3515 #else
3516                         prt("Command: Dump object attr/chars", 15, 0);
3517 #endif
3518
3519
3520                         /* Prompt */
3521 #ifdef JP
3522                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3523 #else
3524                         prt("File: ", 17, 0);
3525 #endif
3526
3527
3528                         /* Default filename */
3529                         sprintf(tmp, "%s.prf", player_name);
3530
3531                         /* Get a filename */
3532                         if (!askfor_aux(tmp, 70)) continue;
3533
3534                         /* Build the filename */
3535                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
3536
3537                         /* Append to the file */
3538                         fff = open_auto_dump(buf, mark, &line_num);
3539                         if (!fff) continue;
3540
3541                         /* Start dumping */
3542 #ifdef JP
3543                         fprintf(fff, "\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3544 #else
3545                         fprintf(fff, "\n# Object attr/char definitions\n\n");
3546 #endif
3547                         line_num += 3;
3548
3549                         /* Dump objects */
3550                         for (i = 0; i < max_k_idx; i++)
3551                         {
3552                                 object_kind *k_ptr = &k_info[i];
3553
3554                                 /* Skip non-entries */
3555                                 if (!k_ptr->name) continue;
3556
3557                                 /* Dump a comment */
3558                                 fprintf(fff, "# %s\n", (k_name + k_ptr->name));
3559                                 line_num++;
3560
3561                                 /* Dump the object attr/char info */
3562                                 fprintf(fff, "K:%d:0x%02X:0x%02X\n\n", i,
3563                                         (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
3564                                 line_num += 2;
3565                         }
3566
3567                         /* Close */
3568                         close_auto_dump(fff, mark, line_num);
3569
3570                         /* Message */
3571 #ifdef JP
3572                         msg_print("¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3573 #else
3574                         msg_print("Dumped object attr/chars.");
3575 #endif
3576
3577                 }
3578
3579                 /* Dump feature attr/chars */
3580                 else if (i == '4')
3581                 {
3582                         static cptr mark = "Feature attr/chars";
3583                         int line_num;
3584
3585                         /* Prompt */
3586 #ifdef JP
3587                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 15, 0);
3588 #else
3589                         prt("Command: Dump feature attr/chars", 15, 0);
3590 #endif
3591
3592
3593                         /* Prompt */
3594 #ifdef JP
3595                         prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
3596 #else
3597                         prt("File: ", 17, 0);
3598 #endif
3599
3600
3601                         /* Default filename */
3602                         sprintf(tmp, "%s.prf", player_name);
3603
3604                         /* Get a filename */
3605                         if (!askfor_aux(tmp, 70)) continue;
3606
3607                         /* Build the filename */
3608                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
3609
3610                         /* Append to the file */
3611                         fff = open_auto_dump(buf, mark, &line_num);
3612                         if (!fff) continue;
3613
3614                         /* Start dumping */
3615 #ifdef JP
3616                         fprintf(fff, "\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n");
3617 #else
3618                         fprintf(fff, "\n# Feature attr/char definitions\n\n");
3619 #endif
3620                         line_num += 3;
3621
3622                         /* Dump features */
3623                         for (i = 0; i < max_f_idx; i++)
3624                         {
3625                                 feature_type *f_ptr = &f_info[i];
3626
3627                                 /* Skip non-entries */
3628                                 if (!f_ptr->name) continue;
3629
3630                                 /* Dump a comment */
3631                                 fprintf(fff, "# %s\n", (f_name + f_ptr->name));
3632                                 line_num++;
3633
3634                                 /* Dump the feature attr/char info */
3635                                 fprintf(fff, "F:%d:0x%02X:0x%02X\n\n", i,
3636                                         (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
3637                                 line_num += 2;
3638                         }
3639
3640                         /* Close */
3641                         close_auto_dump(fff, mark, line_num);
3642
3643                         /* Message */
3644 #ifdef JP
3645                         msg_print("ÃÏ·Á¤Î[¿§/ʸ»ú]¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
3646 #else
3647                         msg_print("Dumped feature attr/chars.");
3648 #endif
3649
3650                 }
3651
3652                 /* Modify monster attr/chars */
3653                 else if (i == '6')
3654                 {
3655                         static int r = 0;
3656
3657                         /* Prompt */
3658 #ifdef JP
3659                         prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3660 #else
3661                         prt("Command: Change monster attr/chars", 15, 0);
3662 #endif
3663
3664
3665                         /* Hack -- query until done */
3666                         while (1)
3667                         {
3668                                 monster_race *r_ptr = &r_info[r];
3669                                 char c;
3670                                 int t;
3671
3672                                 byte da = (r_ptr->d_attr);
3673                                 byte dc = (r_ptr->d_char);
3674                                 byte ca = (r_ptr->x_attr);
3675                                 byte cc = (r_ptr->x_char);
3676
3677                                 /* Label the object */
3678 #ifdef JP
3679                                 Term_putstr(5, 17, -1, TERM_WHITE,
3680                                             format("¥â¥ó¥¹¥¿¡¼ = %d, Ì¾Á° = %-40.40s",
3681                                                    r, (r_name + r_ptr->name)));
3682 #else
3683                                 Term_putstr(5, 17, -1, TERM_WHITE,
3684                                             format("Monster = %d, Name = %-40.40s",
3685                                                    r, (r_name + r_ptr->name)));
3686 #endif
3687
3688
3689                                 /* Label the Default values */
3690 #ifdef JP
3691                                 Term_putstr(10, 19, -1, TERM_WHITE,
3692                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3u / %3u", da, dc));
3693 #else
3694                                 Term_putstr(10, 19, -1, TERM_WHITE,
3695                                             format("Default attr/char = %3u / %3u", da, dc));
3696 #endif
3697
3698                                 Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>");
3699                                 Term_putch(43, 19, da, dc);
3700                                 if (use_bigtile)
3701                                 {
3702                                         if (da & 0x80)
3703                                                 Term_putch(44, 19, 255, -1);
3704                                         else
3705                                                 Term_putch(44, 19, 0, ' ');
3706                                 }
3707
3708                                 /* Label the Current values */
3709 #ifdef JP
3710                                 Term_putstr(10, 20, -1, TERM_WHITE,
3711                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3u / %3u", ca, cc));
3712 #else
3713                                 Term_putstr(10, 20, -1, TERM_WHITE,
3714                                             format("Current attr/char = %3u / %3u", ca, cc));
3715 #endif
3716
3717                                 Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>");
3718                                 Term_putch(43, 20, ca, cc);
3719                                 if (use_bigtile)
3720                                 {
3721                                         if (ca & 0x80)
3722                                                 Term_putch(44, 20, 255, -1);
3723                                         else
3724                                                 Term_putch(44, 20, 0, ' ');
3725                                 }
3726
3727                                 /* Prompt */
3728 #ifdef JP
3729                                 Term_putstr(0, 22, -1, TERM_WHITE,
3730                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
3731 #else
3732                                 Term_putstr(0, 22, -1, TERM_WHITE,
3733                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
3734 #endif
3735
3736                                 /* Get a command */
3737                                 i = inkey();
3738
3739                                 /* All done */
3740                                 if (i == ESCAPE) break;
3741
3742                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3743                                 else if (isupper(i)) c = 'a' + i - 'A';
3744                                 else c = i;
3745
3746                                 switch (c)
3747                                 {
3748                                 case 'n':
3749                                         cmd_visuals_aux(i, &r, max_r_idx);
3750                                         break;
3751                                 case 'a':
3752                                         t = (int)r_ptr->x_attr;
3753                                         cmd_visuals_aux(i, &t, 256);
3754                                         r_ptr->x_attr = (byte)t;
3755                                         break;
3756                                 case 'c':
3757                                         t = (int)r_ptr->x_char;
3758                                         cmd_visuals_aux(i, &t, 256);
3759                                         r_ptr->x_char = (byte)t;
3760                                         break;
3761                                 }
3762                         }
3763                 }
3764
3765                 /* Modify object attr/chars */
3766                 else if (i == '7')
3767                 {
3768                         static int k = 0;
3769
3770                         /* Prompt */
3771 #ifdef JP
3772                         prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3773 #else
3774                         prt("Command: Change object attr/chars", 15, 0);
3775 #endif
3776
3777
3778                         /* Hack -- query until done */
3779                         while (1)
3780                         {
3781                                 object_kind *k_ptr = &k_info[k];
3782                                 char c;
3783                                 int t;
3784
3785                                 byte da = (byte)k_ptr->d_attr;
3786                                 byte dc = (byte)k_ptr->d_char;
3787                                 byte ca = (byte)k_ptr->x_attr;
3788                                 byte cc = (byte)k_ptr->x_char;
3789
3790                                 /* Label the object */
3791 #ifdef JP
3792                                 Term_putstr(5, 17, -1, TERM_WHITE,
3793                                             format("¥¢¥¤¥Æ¥à = %d, Ì¾Á° = %-40.40s",
3794                                                    k, (k_name + k_ptr->name)));
3795 #else
3796                                 Term_putstr(5, 17, -1, TERM_WHITE,
3797                                             format("Object = %d, Name = %-40.40s",
3798                                                    k, (k_name + k_ptr->name)));
3799 #endif
3800
3801
3802                                 /* Label the Default values */
3803 #ifdef JP
3804                                 Term_putstr(10, 19, -1, TERM_WHITE,
3805                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
3806 #else
3807                                 Term_putstr(10, 19, -1, TERM_WHITE,
3808                                             format("Default attr/char = %3d / %3d", da, dc));
3809 #endif
3810
3811                                 Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>");
3812                                 Term_putch(43, 19, da, dc);
3813                                 if (use_bigtile)
3814                                 {
3815                                         if (da & 0x80)
3816                                                 Term_putch(44, 19, 255, -1);
3817                                         else
3818                                                 Term_putch(44, 19, 0, ' ');
3819                                 }
3820
3821                                 /* Label the Current values */
3822 #ifdef JP
3823                                 Term_putstr(10, 20, -1, TERM_WHITE,
3824                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
3825 #else
3826                                 Term_putstr(10, 20, -1, TERM_WHITE,
3827                                             format("Current attr/char = %3d / %3d", ca, cc));
3828 #endif
3829
3830                                 Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>");
3831                                 Term_putch(43, 20, ca, cc);
3832                                 if (use_bigtile)
3833                                 {
3834                                         if (ca & 0x80)
3835                                                 Term_putch(44, 20, 255, -1);
3836                                         else
3837                                                 Term_putch(44, 20, 0, ' ');
3838                                 }
3839
3840                                 /* Prompt */
3841 #ifdef JP
3842                                 Term_putstr(0, 22, -1, TERM_WHITE,
3843                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
3844 #else
3845                                 Term_putstr(0, 22, -1, TERM_WHITE,
3846                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
3847 #endif
3848
3849                                 /* Get a command */
3850                                 i = inkey();
3851
3852                                 /* All done */
3853                                 if (i == ESCAPE) break;
3854
3855                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3856                                 else if (isupper(i)) c = 'a' + i - 'A';
3857                                 else c = i;
3858
3859                                 switch (c)
3860                                 {
3861                                 case 'n':
3862                                         cmd_visuals_aux(i, &k, max_k_idx);
3863                                         break;
3864                                 case 'a':
3865                                         t = (int)k_info[k].x_attr;
3866                                         cmd_visuals_aux(i, &t, 256);
3867                                         k_info[k].x_attr = (byte)t;
3868                                         break;
3869                                 case 'c':
3870                                         t = (int)k_info[k].x_char;
3871                                         cmd_visuals_aux(i, &t, 256);
3872                                         k_info[k].x_char = (byte)t;
3873                                         break;
3874                                 }
3875                         }
3876                 }
3877
3878                 /* Modify feature attr/chars */
3879                 else if (i == '8')
3880                 {
3881                         static int f = 0;
3882
3883                         /* Prompt */
3884 #ifdef JP
3885                         prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0);
3886 #else
3887                         prt("Command: Change feature attr/chars", 15, 0);
3888 #endif
3889
3890
3891                         /* Hack -- query until done */
3892                         while (1)
3893                         {
3894                                 feature_type *f_ptr = &f_info[f];
3895                                 char c;
3896                                 int t;
3897
3898                                 byte da = (byte)f_ptr->d_attr;
3899                                 byte dc = (byte)f_ptr->d_char;
3900                                 byte ca = (byte)f_ptr->x_attr;
3901                                 byte cc = (byte)f_ptr->x_char;
3902
3903                                 /* Label the object */
3904 #ifdef JP
3905                                 Term_putstr(5, 17, -1, TERM_WHITE,
3906                                             format("ÃÏ·Á = %d, Ì¾Á° = %-40.40s",
3907                                                    f, (f_name + f_ptr->name)));
3908 #else
3909                                 Term_putstr(5, 17, -1, TERM_WHITE,
3910                                             format("Terrain = %d, Name = %-40.40s",
3911                                                    f, (f_name + f_ptr->name)));
3912 #endif
3913
3914
3915                                 /* Label the Default values */
3916 #ifdef JP
3917                                 Term_putstr(10, 19, -1, TERM_WHITE,
3918                                             format("½é´üÃÍ  ¿§ / Ê¸»ú = %3d / %3d", da, dc));
3919 #else
3920                                 Term_putstr(10, 19, -1, TERM_WHITE,
3921                                             format("Default attr/char = %3d / %3d", da, dc));
3922 #endif
3923
3924                                 Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>");
3925                                 Term_putch(43, 19, da, dc);
3926                                 if (use_bigtile)
3927                                 {
3928                                         if (da & 0x80)
3929                                                 Term_putch(44, 19, 255, -1);
3930                                         else
3931                                                 Term_putch(44, 19, 0, ' ');
3932                                 }
3933
3934                                 /* Label the Current values */
3935 #ifdef JP
3936                                 Term_putstr(10, 20, -1, TERM_WHITE,
3937                                             format("¸½ºßÃÍ  ¿§ / Ê¸»ú = %3d / %3d", ca, cc));
3938 #else
3939                                 Term_putstr(10, 20, -1, TERM_WHITE,
3940                                             format("Current attr/char = %3d / %3d", ca, cc));
3941 #endif
3942
3943                                 Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>");
3944                                 Term_putch(43, 20, ca, cc);
3945                                 if (use_bigtile)
3946                                 {
3947                                         if (ca & 0x80)
3948                                                 Term_putch(44, 20, 255, -1);
3949                                         else
3950                                                 Term_putch(44, 20, 0, ' ');
3951                                 }
3952
3953                                 /* Prompt */
3954 #ifdef JP
3955                                 Term_putstr(0, 22, -1, TERM_WHITE,
3956                                             "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
3957 #else
3958                                 Term_putstr(0, 22, -1, TERM_WHITE,
3959                                             "Command (n/N/^N/a/A/^A/c/C/^C): ");
3960 #endif
3961
3962                                 /* Get a command */
3963                                 i = inkey();
3964
3965                                 /* All done */
3966                                 if (i == ESCAPE) break;
3967
3968                                 if (iscntrl(i)) c = 'a' + i - KTRL('A');
3969                                 else if (isupper(i)) c = 'a' + i - 'A';
3970                                 else c = i;
3971
3972                                 switch (c)
3973                                 {
3974                                 case 'n':
3975                                         cmd_visuals_aux(i, &f, max_f_idx);
3976                                         break;
3977                                 case 'a':
3978                                         t = (int)f_info[f].x_attr;
3979                                         cmd_visuals_aux(i, &t, 256);
3980                                         f_info[f].x_attr = (byte)t;
3981                                         break;
3982                                 case 'c':
3983                                         t = (int)f_info[f].x_char;
3984                                         cmd_visuals_aux(i, &t, 256);
3985                                         f_info[f].x_char = (byte)t;
3986                                         break;
3987                                 }
3988                         }
3989                 }
3990
3991 #endif
3992
3993                 /* Reset visuals */
3994                 else if (i == '0')
3995                 {
3996                         /* Reset */
3997                         reset_visuals();
3998
3999                         /* Message */
4000 #ifdef JP
4001                         msg_print("²èÌ̾å¤Î[¿§/ʸ»ú]¤ò½é´üÃͤ˥ꥻ¥Ã¥È¤·¤Þ¤·¤¿¡£");
4002 #else
4003                         msg_print("Visual attr/char tables reset.");
4004 #endif
4005
4006                 }
4007
4008                 /* Unknown option */
4009                 else
4010                 {
4011                         bell();
4012                 }
4013
4014                 /* Flush messages */
4015                 msg_print(NULL);
4016         }
4017
4018
4019         /* Restore the screen */
4020         screen_load();
4021 }
4022
4023
4024 /*
4025  * Interact with "colors"
4026  */
4027 void do_cmd_colors(void)
4028 {
4029         int i;
4030
4031         FILE *fff;
4032
4033         char tmp[160];
4034
4035         char buf[1024];
4036
4037
4038         /* File type is "TEXT" */
4039         FILE_TYPE(FILE_TYPE_TEXT);
4040
4041
4042         /* Save the screen */
4043         screen_save();
4044
4045
4046         /* Interact until done */
4047         while (1)
4048         {
4049                 /* Clear screen */
4050                 Term_clear();
4051
4052                 /* Ask for a choice */
4053 #ifdef JP
4054                 prt("[ ¥«¥é¡¼¤ÎÀßÄê ]", 2, 0);
4055 #else
4056                 prt("Interact with Colors", 2, 0);
4057 #endif
4058
4059
4060                 /* Give some choices */
4061 #ifdef JP
4062                 prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5);
4063 #else
4064                 prt("(1) Load a user pref file", 4, 5);
4065 #endif
4066
4067 #ifdef ALLOW_COLORS
4068 #ifdef JP
4069                 prt("(2) ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5);
4070                 prt("(3) ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤¹¤ë", 6, 5);
4071 #else
4072                 prt("(2) Dump colors", 5, 5);
4073                 prt("(3) Modify colors", 6, 5);
4074 #endif
4075
4076 #endif
4077
4078                 /* Prompt */
4079 #ifdef JP
4080                 prt("¥³¥Þ¥ó¥É: ", 8, 0);
4081 #else
4082                 prt("Command: ", 8, 0);
4083 #endif
4084
4085
4086                 /* Prompt */
4087                 i = inkey();
4088
4089                 /* Done */
4090                 if (i == ESCAPE) break;
4091
4092                 /* Load a 'pref' file */
4093                 if (i == '1')
4094                 {
4095                         /* Prompt */
4096 #ifdef JP
4097                         prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹", 8, 0);
4098 #else
4099                         prt("Command: Load a user pref file", 8, 0);
4100 #endif
4101
4102
4103                         /* Prompt */
4104 #ifdef JP
4105                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4106 #else
4107                         prt("File: ", 10, 0);
4108 #endif
4109
4110
4111                         /* Default file */
4112                         sprintf(tmp, "%s.prf", player_name);
4113
4114                         /* Query */
4115                         if (!askfor_aux(tmp, 70)) continue;
4116
4117                         /* Process the given filename */
4118                         (void)process_pref_file(tmp);
4119
4120                         /* Mega-Hack -- react to changes */
4121                         Term_xtra(TERM_XTRA_REACT, 0);
4122
4123                         /* Mega-Hack -- redraw */
4124                         Term_redraw();
4125                 }
4126
4127 #ifdef ALLOW_COLORS
4128
4129                 /* Dump colors */
4130                 else if (i == '2')
4131                 {
4132                         static cptr mark = "Colors";
4133                         int line_num;
4134
4135                         /* Prompt */
4136 #ifdef JP
4137                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤¹", 8, 0);
4138 #else
4139                         prt("Command: Dump colors", 8, 0);
4140 #endif
4141
4142
4143                         /* Prompt */
4144 #ifdef JP
4145                         prt("¥Õ¥¡¥¤¥ë: ", 10, 0);
4146 #else
4147                         prt("File: ", 10, 0);
4148 #endif
4149
4150
4151                         /* Default filename */
4152                         sprintf(tmp, "%s.prf", player_name);
4153
4154                         /* Get a filename */
4155                         if (!askfor_aux(tmp, 70)) continue;
4156
4157                         /* Build the filename */
4158                         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
4159
4160                         /* Append to the file */
4161                         fff = open_auto_dump(buf, mark, &line_num);
4162                         if (!fff) continue;
4163
4164                         /* Start dumping */
4165 #ifdef JP
4166                         fprintf(fff, "\n# ¥«¥é¡¼¤ÎÀßÄê\n\n");
4167 #else
4168                         fprintf(fff, "\n# Color redefinitions\n\n");
4169 #endif
4170                         line_num += 3;
4171
4172                         /* Dump colors */
4173                         for (i = 0; i < 256; i++)
4174                         {
4175                                 int kv = angband_color_table[i][0];
4176                                 int rv = angband_color_table[i][1];
4177                                 int gv = angband_color_table[i][2];
4178                                 int bv = angband_color_table[i][3];
4179
4180 #ifdef JP
4181                                 cptr name = "̤ÃÎ";
4182 #else
4183                                 cptr name = "unknown";
4184 #endif
4185
4186
4187                                 /* Skip non-entries */
4188                                 if (!kv && !rv && !gv && !bv) continue;
4189
4190                                 /* Extract the color name */
4191                                 if (i < 16) name = color_names[i];
4192
4193                                 /* Dump a comment */
4194 #ifdef JP
4195                                 fprintf(fff, "# ¥«¥é¡¼ '%s'\n", name);
4196 #else
4197                                 fprintf(fff, "# Color '%s'\n", name);
4198 #endif
4199                                 line_num++;
4200
4201                                 /* Dump the monster attr/char info */
4202                                 fprintf(fff, "V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n",
4203                                         i, kv, rv, gv, bv);
4204                                 line_num += 2;
4205                         }
4206
4207                         /* Close */
4208                         close_auto_dump(fff, mark, line_num);
4209
4210                         /* Message */
4211 #ifdef JP
4212                         msg_print("¥«¥é¡¼¤ÎÀßÄê¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
4213 #else
4214                         msg_print("Dumped color redefinitions.");
4215 #endif
4216
4217                 }
4218
4219                 /* Edit colors */
4220                 else if (i == '3')
4221                 {
4222                         static byte a = 0;
4223
4224                         /* Prompt */
4225 #ifdef JP
4226                         prt("¥³¥Þ¥ó¥É: ¥«¥é¡¼¤ÎÀßÄê¤òÊѹ¹¤·¤Þ¤¹", 8, 0);
4227 #else
4228                         prt("Command: Modify colors", 8, 0);
4229 #endif
4230
4231
4232                         /* Hack -- query until done */
4233                         while (1)
4234                         {
4235                                 cptr name;
4236                                 byte j;
4237
4238                                 /* Clear */
4239                                 clear_from(10);
4240
4241                                 /* Exhibit the normal colors */
4242                                 for (j = 0; j < 16; j++)
4243                                 {
4244                                         /* Exhibit this color */
4245                                         Term_putstr(j*4, 20, -1, a, "###");
4246
4247                                         /* Exhibit all colors */
4248                                         Term_putstr(j*4, 22, -1, j, format("%3d", j));
4249                                 }
4250
4251                                 /* Describe the color */
4252 #ifdef JP
4253                                 name = ((a < 16) ? color_names[a] : "̤ÄêµÁ");
4254 #else
4255                                 name = ((a < 16) ? color_names[a] : "undefined");
4256 #endif
4257
4258
4259                                 /* Describe the color */
4260 #ifdef JP
4261                                 Term_putstr(5, 10, -1, TERM_WHITE,
4262                                             format("¥«¥é¡¼ = %d, Ì¾Á° = %s", a, name));
4263 #else
4264                                 Term_putstr(5, 10, -1, TERM_WHITE,
4265                                             format("Color = %d, Name = %s", a, name));
4266 #endif
4267
4268
4269                                 /* Label the Current values */
4270                                 Term_putstr(5, 12, -1, TERM_WHITE,
4271                                             format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x",
4272                                                    angband_color_table[a][0],
4273                                                    angband_color_table[a][1],
4274                                                    angband_color_table[a][2],
4275                                                    angband_color_table[a][3]));
4276
4277                                 /* Prompt */
4278 #ifdef JP
4279                                 Term_putstr(0, 14, -1, TERM_WHITE,
4280                                             "¥³¥Þ¥ó¥É (n/N/k/K/r/R/g/G/b/B): ");
4281 #else
4282                                 Term_putstr(0, 14, -1, TERM_WHITE,
4283                                             "Command (n/N/k/K/r/R/g/G/b/B): ");
4284 #endif
4285
4286
4287                                 /* Get a command */
4288                                 i = inkey();
4289
4290                                 /* All done */
4291                                 if (i == ESCAPE) break;
4292
4293                                 /* Analyze */
4294                                 if (i == 'n') a = (byte)(a + 1);
4295                                 if (i == 'N') a = (byte)(a - 1);
4296                                 if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
4297                                 if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
4298                                 if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
4299                                 if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
4300                                 if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
4301                                 if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
4302                                 if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
4303                                 if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
4304
4305                                 /* Hack -- react to changes */
4306                                 Term_xtra(TERM_XTRA_REACT, 0);
4307
4308                                 /* Hack -- redraw */
4309                                 Term_redraw();
4310                         }
4311                 }
4312
4313 #endif
4314
4315                 /* Unknown option */
4316                 else
4317                 {
4318                         bell();
4319                 }
4320
4321                 /* Flush messages */
4322                 msg_print(NULL);
4323         }
4324
4325
4326         /* Restore the screen */
4327         screen_load();
4328 }
4329
4330
4331 /*
4332  * Note something in the message recall
4333  */
4334 void do_cmd_note(void)
4335 {
4336         char buf[80];
4337
4338         /* Default */
4339         strcpy(buf, "");
4340
4341         /* Input */
4342 #ifdef JP
4343         if (!get_string("¥á¥â: ", buf, 60)) return;
4344 #else
4345         if (!get_string("Note: ", buf, 60)) return;
4346 #endif
4347
4348
4349         /* Ignore empty notes */
4350         if (!buf[0] || (buf[0] == ' ')) return;
4351
4352         /* Add the note to the message recall */
4353 #ifdef JP
4354         msg_format("¥á¥â: %s", buf);
4355 #else
4356         msg_format("Note: %s", buf);
4357 #endif
4358
4359 }
4360
4361
4362 /*
4363  * Mention the current version
4364  */
4365 void do_cmd_version(void)
4366 {
4367
4368         /* Silly message */
4369 #ifdef JP
4370         msg_format("ÊѶòÈÚÅÜ(Hengband) %d.%d.%d",
4371                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4372 #else
4373         msg_format("You are playing Hengband %d.%d.%d.",
4374                     FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
4375 #endif
4376 }
4377
4378
4379
4380 /*
4381  * Array of feeling strings
4382  */
4383 static cptr do_cmd_feeling_text[11] =
4384 {
4385 #ifdef JP
4386         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4387 #else
4388         "Looks like any other level.",
4389 #endif
4390
4391 #ifdef JP
4392         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4393 #else
4394         "You feel there is something special about this level.",
4395 #endif
4396
4397 #ifdef JP
4398         "¶²¤í¤·¤¤»à¤Î¸¸¤¬ÌܤËÉ⤫¤Ó¡¢µ¤À䤷¤½¤¦¤Ë¤Ê¤Ã¤¿¡ª",
4399 #else
4400         "You nearly faint as horrible visions of death fill your mind!",
4401 #endif
4402
4403 #ifdef JP
4404         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4405 #else
4406         "This level looks very dangerous.",
4407 #endif
4408
4409 #ifdef JP
4410         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4411 #else
4412         "You have a very bad feeling...",
4413 #endif
4414
4415 #ifdef JP
4416         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4417 #else
4418         "You have a bad feeling...",
4419 #endif
4420
4421 #ifdef JP
4422         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4423 #else
4424         "You feel nervous.",
4425 #endif
4426
4427 #ifdef JP
4428         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4429 #else
4430         "You feel your luck is turning...",
4431 #endif
4432
4433 #ifdef JP
4434         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4435 #else
4436         "You don't like the look of this place.",
4437 #endif
4438
4439 #ifdef JP
4440         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4441 #else
4442         "This level looks reasonably safe.",
4443 #endif
4444
4445 #ifdef JP
4446         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4447 #else
4448         "What a boring place..."
4449 #endif
4450
4451 };
4452
4453 static cptr do_cmd_feeling_text_combat[11] =
4454 {
4455 #ifdef JP
4456         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4457 #else
4458         "Looks like any other level.",
4459 #endif
4460
4461 #ifdef JP
4462         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4463 #else
4464         "You feel there is something special about this level.",
4465 #endif
4466
4467 #ifdef JP
4468         "º£Ìë¤â¤Þ¤¿¡¢Ã¯¤«¤¬Ì¿¤òÍî¤È¤¹...",
4469 #else
4470         "You nearly faint as horrible visions of death fill your mind!",
4471 #endif
4472
4473 #ifdef JP
4474         "¤³¤Î³¬¤Ï¤È¤Æ¤â´í¸±¤Ê¤è¤¦¤À¡£",
4475 #else
4476         "This level looks very dangerous.",
4477 #endif
4478
4479 #ifdef JP
4480         "¤È¤Æ¤â°­¤¤Í½´¶¤¬¤¹¤ë...",
4481 #else
4482         "You have a very bad feeling...",
4483 #endif
4484
4485 #ifdef JP
4486         "°­¤¤Í½´¶¤¬¤¹¤ë...",
4487 #else
4488         "You have a bad feeling...",
4489 #endif
4490
4491 #ifdef JP
4492         "²¿¤«¶ÛÄ¥¤¹¤ë¡£",
4493 #else
4494         "You feel nervous.",
4495 #endif
4496
4497 #ifdef JP
4498         "¾¯¤·ÉÔ±¿¤Êµ¤¤¬¤¹¤ë...",
4499 #else
4500         "You feel your luck is turning...",
4501 #endif
4502
4503 #ifdef JP
4504         "¤³¤Î¾ì½ê¤Ï¹¥¤­¤Ë¤Ê¤ì¤Ê¤¤¡£",
4505 #else
4506         "You don't like the look of this place.",
4507 #endif
4508
4509 #ifdef JP
4510         "¤³¤Î³¬¤Ï¤½¤ì¤Ê¤ê¤Ë°ÂÁ´¤Ê¤è¤¦¤À¡£",
4511 #else
4512         "This level looks reasonably safe.",
4513 #endif
4514
4515 #ifdef JP
4516         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4517 #else
4518         "What a boring place..."
4519 #endif
4520
4521 };
4522
4523 static cptr do_cmd_feeling_text_lucky[11] =
4524 {
4525 #ifdef JP
4526         "¤³¤Î³¬¤ÎÊ·°Ïµ¤¤ò´¶¤¸¤È¤ì¤Ê¤«¤Ã¤¿...",
4527         "¤³¤Î³¬¤Ë¤Ï²¿¤«ÆÃÊ̤ʤâ¤Î¤¬¤¢¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£",
4528         "¤³¤Î³¬¤Ï¤³¤Î¾å¤Ê¤¯ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë¡£",
4529         "ÁÇÀ²¤é¤·¤¤´¶¤¸¤¬¤¹¤ë...",
4530         "¤È¤Æ¤âÎɤ¤´¶¤¸¤¬¤¹¤ë...",
4531         "Îɤ¤´¶¤¸¤¬¤¹¤ë...",
4532         "¤Á¤ç¤Ã¤È¹¬±¿¤Ê´¶¤¸¤¬¤¹¤ë...",
4533         "¿¾¯¤Ï±¿¤¬¸þ¤¤¤Æ¤­¤¿¤«...",
4534         "¸«¤¿´¶¤¸°­¤¯¤Ï¤Ê¤¤...",
4535         "Á´Á³ÂÌÌܤȤ¤¤¦¤³¤È¤Ï¤Ê¤¤¤¬...",
4536         "¤Ê¤ó¤ÆÂà¶þ¤Ê¤È¤³¤í¤À..."
4537 #else
4538         "Looks like any other level.",
4539         "You feel there is something special about this level.",
4540         "You have a superb feeling about this level.",
4541         "You have an excellent feeling...",
4542         "You have a very good feeling...",
4543         "You have a good feeling...",
4544         "You feel strangely lucky...",
4545         "You feel your luck is turning...",
4546         "You like the look of this place...",
4547         "This level can't be all bad...",
4548         "What a boring place..."
4549 #endif
4550 };
4551
4552
4553 /*
4554  * Note that "feeling" is set to zero unless some time has passed.
4555  * Note that this is done when the level is GENERATED, not entered.
4556  */
4557 void do_cmd_feeling(void)
4558 {
4559         /* Verify the feeling */
4560         if (feeling > 10) feeling = 10;
4561
4562         /* No useful feeling in quests */
4563         if (p_ptr->inside_quest && !random_quest_number(dun_level))
4564         {
4565 #ifdef JP
4566                 msg_print("ŵ·¿Åª¤Ê¥¯¥¨¥¹¥È¤Î¥À¥ó¥¸¥ç¥ó¤Î¤è¤¦¤À¡£");
4567 #else
4568                 msg_print("Looks like a typical quest level.");
4569 #endif
4570
4571                 return;
4572         }
4573
4574         /* No useful feeling in town */
4575         else if (p_ptr->town_num && !dun_level)
4576         {
4577 #ifdef JP
4578                 if (!strcmp(town[p_ptr->town_num].name, "¹ÓÌî"))
4579 #else
4580                 if (!strcmp(town[p_ptr->town_num].name, "wilderness"))
4581 #endif
4582                 {
4583 #ifdef JP
4584                         msg_print("²¿¤«¤¢¤ê¤½¤¦¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4585 #else
4586                         msg_print("Looks like a strange wilderness.");
4587 #endif
4588
4589                         return;
4590                 }
4591                 else
4592                 {
4593 #ifdef JP
4594                         msg_print("ŵ·¿Åª¤ÊÄ®¤Î¤è¤¦¤À¡£");
4595 #else
4596                         msg_print("Looks like a typical town.");
4597 #endif
4598
4599                         return;
4600                 }
4601         }
4602
4603         /* No useful feeling in the wilderness */
4604         else if (!dun_level)
4605         {
4606 #ifdef JP
4607                 msg_print("ŵ·¿Åª¤Ê¹ÓÌî¤Î¤è¤¦¤À¡£");
4608 #else
4609                 msg_print("Looks like a typical wilderness.");
4610 #endif
4611
4612                 return;
4613         }
4614
4615         /* Display the feeling */
4616         if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra)
4617         {
4618                 if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]);
4619                 else {
4620                                         if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){
4621                                                 msg_print(do_cmd_feeling_text_combat[feeling]);
4622                                         }else
4623                                                 msg_print(do_cmd_feeling_text[feeling]);
4624                                 }
4625         }
4626         else
4627         {
4628                 msg_print(do_cmd_feeling_text[0]);
4629         }
4630 }
4631
4632
4633
4634
4635
4636 /*
4637  * Encode the screen colors
4638  */
4639 static char hack[17] = "dwsorgbuDWvyRGBU";
4640
4641
4642 static errr photo_fgets(FILE *fff, char *buf, huge n)
4643 {
4644         huge i = 0;
4645
4646         char *s;
4647
4648         char tmp[1024];
4649
4650         /* Read a line */
4651         if (fgets(tmp, 1024, fff))
4652         {
4653                 /* Convert weirdness */
4654                 for (s = tmp; *s; s++)
4655                 {
4656                         /* Handle newline */
4657                         if (*s == '\n')
4658                         {
4659                                 /* Terminate */
4660                                 buf[i] = '\0';
4661
4662                                 /* Success */
4663                                 return (0);
4664                         }
4665
4666                         /* Handle tabs */
4667                         else if (*s == '\t')
4668                         {
4669                                 /* Hack -- require room */
4670                                 if (i + 8 >= n) break;
4671
4672                                 /* Append a space */
4673                                 buf[i++] = ' ';
4674
4675                                 /* Append some more spaces */
4676                                 while (!(i % 8)) buf[i++] = ' ';
4677                         }
4678
4679 #ifdef JP
4680                         else if (iskanji(*s))
4681                         {
4682                                 if (!s[1]) break;
4683                                 buf[i++] = *s++;
4684                                 buf[i++] = *s;
4685                         }
4686 # ifndef EUC
4687         /* È¾³Ñ¤«¤Ê¤ËÂбþ */
4688                         else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf))
4689                         {
4690                                 buf[i++] = *s;
4691                                 if (i >= n) break;
4692                         }
4693 # endif
4694 #endif
4695                         /* Handle printables */
4696                         else
4697                         {
4698                                 /* Copy */
4699                                 buf[i++] = *s;
4700
4701                                 /* Check length */
4702                                 if (i >= n) break;
4703                         }
4704                 }
4705         }
4706
4707         /* Nothing */
4708         buf[0] = '\0';
4709
4710         /* Failure */
4711         return (1);
4712 }
4713
4714
4715 /*
4716  * Hack -- load a screen dump from a file
4717  */
4718 void do_cmd_load_screen(void)
4719 {
4720         int i, y, x;
4721
4722         byte a = 0;
4723         char c = ' ';
4724
4725         bool okay = TRUE;
4726
4727         FILE *fff;
4728
4729         char buf[1024];
4730
4731         int wid, hgt;
4732
4733         Term_get_size(&wid, &hgt);
4734
4735         /* Hack -- drop permissions */
4736         safe_setuid_drop();
4737
4738         /* Build the filename */
4739         path_build(buf, 1024, ANGBAND_DIR_USER, "dump.txt");
4740
4741         /* Append to the file */
4742         fff = my_fopen(buf, "r");
4743
4744         /* Oops */
4745         if (!fff) {
4746 #ifdef JP
4747                 msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
4748 #else
4749                 msg_format("Failed to open %s.", buf);
4750 #endif
4751                 msg_print(NULL);
4752                 return;
4753         }
4754
4755
4756         /* Save the screen */
4757         screen_save();
4758
4759         /* Clear the screen */
4760         Term_clear();
4761
4762
4763         /* Load the screen */
4764         for (y = 0; okay && (y < hgt); y++)
4765         {
4766                 /* Get a line of data */
4767                 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
4768
4769                 /* Show each row */
4770                 for (x = 0; x < wid - 1; x++)
4771                 {
4772                         /* Put the attr/char */
4773                         Term_draw(x, y, TERM_WHITE, buf[x]);
4774                 }
4775         }
4776
4777         /* Get the blank line */
4778         if (my_fgets(fff, buf, 1024)) okay = FALSE;
4779
4780
4781         /* Dump the screen */
4782         for (y = 0; okay && (y < hgt); y++)
4783         {
4784                 /* Get a line of data */
4785                 if (photo_fgets(fff, buf, 1024)) okay = FALSE;
4786
4787                 /* Dump each row */
4788                 for (x = 0; x < wid - 1; x++)
4789                 {
4790                         /* Get the attr/char */
4791                         (void)(Term_what(x, y, &a, &c));
4792
4793                         /* Look up the attr */
4794                         for (i = 0; i < 16; i++)
4795                         {
4796                                 /* Use attr matches */
4797                                 if (hack[i] == buf[x]) a = i;
4798                         }
4799
4800                         /* Put the attr/char */
4801                         Term_draw(x, y, a, c);
4802                 }
4803         }
4804
4805
4806         /* Get the blank line */
4807         if (my_fgets(fff, buf, 1024)) okay = FALSE;
4808
4809
4810         /* Close it */
4811         my_fclose(fff);
4812
4813         /* Hack -- grab permissions */
4814         safe_setuid_grab();
4815                 
4816
4817         /* Message */
4818 #ifdef JP
4819         prt("¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤µ¤ì¤¿²èÌÌ(µ­Ç°»£±Æ)¤ò¥í¡¼¥É¤·¤Þ¤·¤¿¡£", 0, 0);
4820 #else
4821         msg_print("Screen dump loaded.");
4822 #endif
4823
4824         flush();
4825         inkey();
4826
4827
4828         /* Restore the screen */
4829         screen_load();
4830 }
4831
4832
4833
4834
4835 cptr inven_res_label = 
4836 #ifdef JP
4837  "                               »ÀÅŲÐÎäÆǸ÷°ÇÇ˹ì¹ö°øÆÙÎô ÌÕÉÝÍðáãÆ©Ì¿´¶¾ÃÉüÉâ";
4838 #else
4839  "                               AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
4840 #endif
4841
4842 /* XTRA HACK RESLIST */
4843 static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, 
4844                                        int *j, byte tval, char *where)
4845 {
4846   char o_name[MAX_NLEN];
4847   u32b    f[3];
4848
4849   if (!o_ptr->k_idx)return;
4850   if (o_ptr->tval != tval)return;
4851
4852        /* 
4853         * HACK:Ring of Lordly protection and Dragon shield/helm
4854         * have random resistances.
4855         */
4856   if ( ((o_ptr->tval >= TV_BOW && o_ptr->tval<= TV_DRAG_ARMOR && o_ptr->name2)
4857        || (o_ptr->tval == TV_RING && o_ptr->sval == SV_RING_LORDLY) 
4858        || (o_ptr->tval == TV_SHIELD && o_ptr->sval == SV_DRAGON_SHIELD) 
4859        || (o_ptr->tval == TV_HELM && o_ptr->sval == SV_DRAGON_HELM) 
4860        || (o_ptr->tval == TV_GLOVES && o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) 
4861        || (o_ptr->tval == TV_BOOTS && o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) 
4862        || o_ptr->art_name || o_ptr->name1) && object_known_p(o_ptr))
4863     {
4864       int i = 0;
4865       object_desc(o_name, o_ptr, TRUE, 0);
4866
4867       while ( o_name[i] && i < 26 ){
4868 #ifdef JP
4869         if (iskanji(o_name[i])) i++;
4870 #endif
4871         i++;
4872       }
4873       if(i<28) while(i<28){o_name[i]=' ';i++;}
4874       o_name[i]=0;
4875       
4876       fprintf(fff,"%s %s", where, o_name);
4877
4878       if (!(o_ptr->ident & (IDENT_MENTAL))) 
4879         {
4880 #ifdef JP
4881           fprintf(fff, "-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n");
4882 #else
4883           fprintf(fff, "-------unknown------------ -------unknown------\n");
4884 #endif
4885         }
4886       else {
4887         object_flags_known(o_ptr, &f[0], &f[1], &f[2]);
4888       
4889 #ifdef JP
4890         if (f[1] & TR2_IM_ACID) fprintf(fff,"¡ö");
4891         else if (f[1] & TR2_RES_ACID) fprintf(fff,"¡Ü");
4892         else fprintf(fff,"¡¦");
4893
4894         if (f[1] & TR2_IM_ELEC) fprintf(fff,"¡ö");
4895         else if (f[1] & TR2_RES_ELEC) fprintf(fff,"¡Ü");
4896         else fprintf(fff,"¡¦");
4897
4898         if (f[1] & TR2_IM_FIRE) fprintf(fff,"¡ö");
4899         else if (f[1] & TR2_RES_FIRE) fprintf(fff,"¡Ü");
4900         else fprintf(fff,"¡¦");
4901
4902         if (f[1] & TR2_IM_COLD) fprintf(fff,"¡ö");
4903         else if (f[1] & TR2_RES_COLD) fprintf(fff,"¡Ü");
4904         else fprintf(fff,"¡¦");
4905         
4906         if (f[1] & TR2_RES_POIS) fprintf(fff,"¡Ü");
4907         else fprintf(fff,"¡¦");
4908         
4909         if (f[1] & TR2_RES_LITE) fprintf(fff,"¡Ü");
4910         else fprintf(fff,"¡¦");
4911         
4912         if (f[1] & TR2_RES_DARK) fprintf(fff,"¡Ü");
4913         else fprintf(fff,"¡¦");
4914         
4915         if (f[1] & TR2_RES_SHARDS) fprintf(fff,"¡Ü");
4916         else fprintf(fff,"¡¦");
4917         
4918         if (f[1] & TR2_RES_SOUND) fprintf(fff,"¡Ü");
4919         else fprintf(fff,"¡¦");
4920         
4921         if (f[1] & TR2_RES_NETHER) fprintf(fff,"¡Ü");
4922         else fprintf(fff,"¡¦");
4923         
4924         if (f[1] & TR2_RES_NEXUS) fprintf(fff,"¡Ü");
4925         else fprintf(fff,"¡¦");
4926         
4927         if (f[1] & TR2_RES_CHAOS) fprintf(fff,"¡Ü");
4928         else fprintf(fff,"¡¦");
4929         
4930         if (f[1] & TR2_RES_DISEN) fprintf(fff,"¡Ü");
4931         else fprintf(fff,"¡¦");
4932         
4933         fprintf(fff," ");
4934         
4935         if (f[1] & TR2_RES_BLIND) fprintf(fff,"¡Ü");
4936         else fprintf(fff,"¡¦");
4937         
4938         if (f[1] & TR2_RES_FEAR) fprintf(fff,"¡Ü");
4939         else fprintf(fff,"¡¦");
4940         
4941         if (f[1] & TR2_RES_CONF) fprintf(fff,"¡Ü");
4942         else fprintf(fff,"¡¦");
4943         
4944         if (f[1] & TR2_FREE_ACT) fprintf(fff,"¡Ü");
4945         else fprintf(fff,"¡¦");
4946         
4947         if (f[2] & TR3_SEE_INVIS) fprintf(fff,"¡Ü");
4948         else fprintf(fff,"¡¦");
4949         
4950         if (f[1] & TR2_HOLD_LIFE) fprintf(fff,"¡Ü");
4951         else fprintf(fff,"¡¦");
4952
4953         if (f[2] & TR3_TELEPATHY) fprintf(fff,"¡Ü");
4954         else fprintf(fff,"¡¦");
4955
4956         if (f[2] & TR3_SLOW_DIGEST) fprintf(fff,"¡Ü");
4957         else fprintf(fff,"¡¦");
4958
4959
4960         if (f[2] & TR3_REGEN) fprintf(fff,"¡Ü");
4961         else fprintf(fff,"¡¦");
4962
4963         if (f[2] & TR3_FEATHER) fprintf(fff,"¡Ü");
4964         else fprintf(fff,"¡¦");
4965 #else
4966         if (f[1] & TR2_IM_ACID) fprintf(fff,"* ");
4967         else if (f[1] & TR2_RES_ACID) fprintf(fff,"+ ");
4968         else fprintf(fff,". ");
4969
4970         if (f[1] & TR2_IM_ELEC) fprintf(fff,"* ");
4971         else if (f[1] & TR2_RES_ELEC) fprintf(fff,"+ ");
4972         else fprintf(fff,". ");
4973
4974         if (f[1] & TR2_IM_FIRE) fprintf(fff,"* ");
4975         else if (f[1] & TR2_RES_FIRE) fprintf(fff,"+ ");
4976         else fprintf(fff,". ");
4977
4978         if (f[1] & TR2_IM_COLD) fprintf(fff,"* ");
4979         else if (f[1] & TR2_RES_COLD) fprintf(fff,"+ ");
4980         else fprintf(fff,". ");
4981         
4982         if (f[1] & TR2_RES_POIS) fprintf(fff,"+ ");
4983         else fprintf(fff,". ");
4984         
4985         if (f[1] & TR2_RES_LITE) fprintf(fff,"+ ");
4986         else fprintf(fff,". ");
4987         
4988         if (f[1] & TR2_RES_DARK) fprintf(fff,"+ ");
4989         else fprintf(fff,". ");
4990         
4991         if (f[1] & TR2_RES_SHARDS) fprintf(fff,"+ ");
4992         else fprintf(fff,". ");
4993         
4994         if (f[1] & TR2_RES_SOUND) fprintf(fff,"+ ");
4995         else fprintf(fff,". ");
4996         
4997         if (f[1] & TR2_RES_NETHER) fprintf(fff,"+ ");
4998         else fprintf(fff,". ");
4999         
5000         if (f[1] & TR2_RES_NEXUS) fprintf(fff,"+ ");
5001         else fprintf(fff,". ");
5002         
5003         if (f[1] & TR2_RES_CHAOS) fprintf(fff,"+ ");
5004         else fprintf(fff,". ");
5005         
5006         if (f[1] & TR2_RES_DISEN) fprintf(fff,"+ ");
5007         else fprintf(fff,". ");
5008         
5009         fprintf(fff," ");
5010         
5011         if (f[1] & TR2_RES_BLIND) fprintf(fff,"+ ");
5012         else fprintf(fff,". ");
5013         
5014         if (f[1] & TR2_RES_FEAR) fprintf(fff,"+ ");
5015         else fprintf(fff,". ");
5016         
5017         if (f[1] & TR2_RES_CONF) fprintf(fff,"+ ");
5018         else fprintf(fff,". ");
5019         
5020         if (f[1] & TR2_FREE_ACT) fprintf(fff,"+ ");
5021         else fprintf(fff,". ");
5022         
5023         if (f[2] & TR3_SEE_INVIS) fprintf(fff,"+ ");
5024         else fprintf(fff,". ");
5025         
5026         if (f[1] & TR2_HOLD_LIFE) fprintf(fff,"+ ");
5027         else fprintf(fff,". ");
5028
5029         if (f[2] & TR3_TELEPATHY) fprintf(fff,"+ ");
5030         else fprintf(fff,". ");
5031
5032         if (f[2] & TR3_SLOW_DIGEST) fprintf(fff,"+ ");
5033         else fprintf(fff,". ");
5034
5035
5036         if (f[2] & TR3_REGEN) fprintf(fff,"+ ");
5037         else fprintf(fff,". ");
5038
5039         if (f[2] & TR3_FEATHER) fprintf(fff,"+ ");
5040         else fprintf(fff,". ");
5041 #endif  
5042         fprintf(fff,"\n");
5043       }
5044       (*j)++;
5045       if(*j==9)
5046         { 
5047           *j=0;
5048           fprintf(fff,"%s\n", inven_res_label);
5049         }
5050     }
5051 }
5052
5053 /*
5054  * Display *ID* ed weapons/armors's resistances
5055  */
5056 static void do_cmd_knowledge_inven(void)
5057 {
5058
5059         FILE *fff;
5060
5061         char file_name[1024];
5062  
5063         store_type  *st_ptr;
5064         object_type *o_ptr;
5065
5066         byte tval;
5067         int i=0;
5068         int j=0;
5069
5070         char  where[32];
5071
5072         /* Open a new file */
5073         fff = my_fopen_temp(file_name, 1024);
5074         if (!fff) {
5075 #ifdef JP
5076             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5077 #else
5078             msg_format("Failed to create temporally file %s.", file_name);
5079 #endif
5080             msg_print(NULL);
5081             return;
5082         }
5083         fprintf(fff,"%s\n",inven_res_label);
5084
5085         for (tval=TV_BOW; tval <= TV_RING; tval++){
5086
5087           if (j!=0) {
5088               for (;j<9;j++) fprintf(fff, "\n");
5089               j=0;
5090               fprintf(fff,"%s\n",inven_res_label);              
5091           }
5092           
5093 #ifdef JP
5094           strcpy(where, "Áõ");
5095 #else
5096           strcpy(where, "E ");
5097 #endif
5098           for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
5099             {
5100               o_ptr = &inventory[i];
5101               do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5102             }
5103           
5104 #ifdef JP
5105           strcpy(where, "»ý");
5106 #else
5107           strcpy(where, "I ");
5108 #endif
5109           for (i = 0; i < INVEN_PACK; i++)
5110             {
5111               o_ptr = &inventory[i];
5112               do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5113             }
5114           
5115           
5116           /* Print all homes in the different towns */
5117           st_ptr = &town[1].store[STORE_HOME];
5118 #ifdef JP
5119           strcpy(where, "²È");
5120 #else
5121           strcpy(where, "H ");
5122 #endif
5123               
5124           /* Dump all available items */
5125           for (i = 0; i < st_ptr->stock_num; i++)
5126             {
5127               o_ptr = &st_ptr->stock[i];
5128               do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
5129             }
5130         }
5131           
5132         /* Close the file */
5133         my_fclose(fff);
5134
5135         /* Display the file contents */
5136 #ifdef JP
5137         show_file(TRUE, file_name, "*´ÕÄê*ºÑ¤ßÉð´ï/Ëɶñ¤ÎÂÑÀ­¥ê¥¹¥È", 0, 0);
5138 #else
5139         show_file(TRUE, file_name, "Resistances of *identified* equipment", 0, 0);
5140 #endif
5141
5142         /* Remove the file */
5143         fd_kill(file_name);
5144 }
5145
5146
5147 void do_cmd_save_screen_html_aux(char *filename, int message)
5148 {
5149         int y, x, i;
5150
5151         byte a = 0, old_a = 0;
5152         char c = ' ';
5153
5154         FILE *fff, *tmpfff;
5155         char buf[2048];
5156
5157         int yomikomu = 0;
5158         cptr tags[4] = {
5159                 "HEADER_START:",
5160                 "HEADER_END:",
5161                 "FOOTER_START:",
5162                 "FOOTER_END:",
5163         };
5164
5165         cptr html_head[] = {
5166                 "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n",
5167                 "<pre>",
5168                 0,
5169         };
5170         cptr html_foot[] = {
5171                 "</pre>\n",
5172                 "</body>\n</html>\n",
5173                 0,
5174         };
5175
5176         int wid, hgt;
5177
5178         Term_get_size(&wid, &hgt);
5179
5180         /* File type is "TEXT" */
5181         FILE_TYPE(FILE_TYPE_TEXT);
5182
5183         /* Append to the file */
5184         fff = my_fopen(filename, "w");
5185
5186         /* Oops */
5187         if (!fff) {
5188                 if (message) {
5189 #ifdef JP
5190                     msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", filename);
5191 #else
5192                     msg_format("Failed to open file %s.", filename);
5193 #endif
5194                     msg_print(NULL);
5195                 }
5196                 
5197                 return;
5198         }
5199
5200         /* Save the screen */
5201         if (message)
5202                 screen_save();
5203
5204         /* Build the filename */
5205         path_build(buf, 1024, ANGBAND_DIR_USER, "htmldump.prf");
5206         tmpfff = my_fopen(buf, "r");
5207         if (!tmpfff) {
5208                 for (i = 0; html_head[i]; i++)
5209                         fprintf(fff, html_head[i]);
5210         }
5211         else {
5212                 yomikomu = 0;
5213                 while (!my_fgets(tmpfff, buf, 1024)) {
5214                         if (!yomikomu) {
5215                                 if (strncmp(buf, tags[0], strlen(tags[0])) == 0)
5216                                         yomikomu = 1;
5217                         }
5218                         else {
5219                                 if (strncmp(buf, tags[1], strlen(tags[1])) == 0)
5220                                         break;
5221                                 fprintf(fff, "%s\n", buf);
5222                         }
5223                 }
5224         }
5225
5226         /* Dump the screen */
5227         for (y = 0; y < hgt; y++)
5228         {
5229                 /* Start the row */
5230                 if (y != 0)
5231                         fprintf(fff, "\n");
5232
5233                 /* Dump each row */
5234                 for (x = 0; x < wid - 1; x++)
5235                 {
5236                         int rv, gv, bv;
5237                         cptr cc = NULL;
5238                         /* Get the attr/char */
5239                         (void)(Term_what(x, y, &a, &c));
5240
5241                         switch (c)
5242                         {
5243                         case '&': cc = "&amp;"; break;
5244                         case '<': cc = "&lt;"; break;
5245                         case '>': cc = "&gt;"; break;
5246 #ifdef WINDOWS
5247                         case 0x1f: c = '.'; break;
5248                         case 0x7f: c = (a == 0x09) ? '%' : '#'; break;
5249 #endif
5250                         }
5251
5252                         a = a & 0x0F;
5253                         if ((y == 0 && x == 0) || a != old_a) {
5254                                 rv = angband_color_table[a][1];
5255                                 gv = angband_color_table[a][2];
5256                                 bv = angband_color_table[a][3];
5257                                 fprintf(fff, "%s<font color=\"#%02x%02x%02x\">", 
5258                                         ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv);
5259                                 old_a = a;
5260                         }
5261                         if (cc)
5262                                 fprintf(fff, "%s", cc);
5263                         else
5264                                 fprintf(fff, "%c", c);
5265                 }
5266         }
5267         fprintf(fff, "</font>");
5268
5269         if (!tmpfff) {
5270                 for (i = 0; html_foot[i]; i++)
5271                         fprintf(fff, html_foot[i]);
5272         }
5273         else {
5274                 rewind(tmpfff);
5275                 yomikomu = 0;
5276                 while (!my_fgets(tmpfff, buf, 1024)) {
5277                         if (!yomikomu) {
5278                                 if (strncmp(buf, tags[2], strlen(tags[2])) == 0)
5279                                         yomikomu = 1;
5280                         }
5281                         else {
5282                                 if (strncmp(buf, tags[3], strlen(tags[3])) == 0)
5283                                         break;
5284                                 fprintf(fff, "%s\n", buf);
5285                         }
5286                 }
5287                 my_fclose(tmpfff);
5288         }
5289
5290         /* Skip a line */
5291         fprintf(fff, "\n");
5292
5293         /* Close it */
5294         my_fclose(fff);
5295
5296         /* Message */
5297         if (message) {
5298 #ifdef JP
5299         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
5300 #else
5301                 msg_print("Screen dump saved.");
5302 #endif
5303                 msg_print(NULL);
5304         }
5305
5306         /* Restore the screen */
5307         if (message)
5308                 screen_load();
5309 }
5310
5311 /*
5312  * Hack -- save a screen dump to a file
5313  */
5314 static void do_cmd_save_screen_html(void)
5315 {
5316         char buf[1024], tmp[256] = "screen.html";
5317
5318 #ifdef JP
5319         if (!get_string("¥Õ¥¡¥¤¥ë̾: ", tmp, 80))
5320 #else
5321         if (!get_string("File name: ", tmp, 80))
5322 #endif
5323                 return;
5324
5325         /* Build the filename */
5326         path_build(buf, 1024, ANGBAND_DIR_USER, tmp);
5327
5328         msg_print(NULL);
5329
5330         /* Hack -- drop permissions */
5331         safe_setuid_drop();
5332
5333         do_cmd_save_screen_html_aux(buf, 1);
5334
5335         /* Hack -- grab permissions */
5336         safe_setuid_grab();
5337 }
5338
5339
5340 /*
5341  * Redefinable "save_screen" action
5342  */
5343 void (*screendump_aux)(void) = NULL;
5344
5345
5346 /*
5347  * Hack -- save a screen dump to a file
5348  */
5349 void do_cmd_save_screen(void)
5350 {
5351         bool old_use_graphics = use_graphics;
5352         bool html_dump = FALSE;
5353
5354         int wid, hgt;
5355
5356 #ifdef JP
5357         prt("µ­Ç°»£±Æ¤·¤Þ¤¹¤«¡© [(y)es/(h)tml/(n)o] ", 0, 0);
5358 #else
5359         prt("Save screen dump? [(y)es/(h)tml/(n)o] ", 0, 0);
5360 #endif
5361         while(TRUE)
5362         {
5363                 char c = inkey();
5364                 if (c == 'Y' || c == 'y')
5365                         break;
5366                 else if (c == 'H' || c == 'h')
5367                 {
5368                         html_dump = TRUE;
5369                         break;
5370                 }
5371                 else
5372                 {
5373                         prt("", 0, 0);
5374                         return;
5375                 }
5376         }
5377
5378         Term_get_size(&wid, &hgt);
5379
5380         if (old_use_graphics)
5381         {
5382                 use_graphics = FALSE;
5383                 reset_visuals();
5384
5385                 /* Redraw everything */
5386                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5387
5388                 /* Hack -- update */
5389                 handle_stuff();
5390         }
5391
5392         if (html_dump)
5393         {
5394                 do_cmd_save_screen_html();
5395                 do_cmd_redraw();
5396         }
5397
5398         /* Do we use a special screendump function ? */
5399         else if (screendump_aux)
5400         {
5401                 /* Dump the screen to a graphics file */
5402                 (*screendump_aux)();
5403         }
5404         else /* Dump the screen as text */
5405         {
5406                 int y, x;
5407
5408                 byte a = 0;
5409                 char c = ' ';
5410
5411                 FILE *fff;
5412
5413                 char buf[1024];
5414
5415
5416                 /* Hack -- drop permissions */
5417                 safe_setuid_drop();
5418
5419                 /* Build the filename */
5420                 path_build(buf, 1024, ANGBAND_DIR_USER, "dump.txt");
5421
5422                 /* File type is "TEXT" */
5423                 FILE_TYPE(FILE_TYPE_TEXT);
5424
5425                 /* Append to the file */
5426                 fff = my_fopen(buf, "w");
5427
5428                 /* Oops */
5429                 if (!fff)
5430                 {
5431                         /* Hack -- grab permissions */
5432                         safe_setuid_grab();
5433 #ifdef JP
5434                         msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf);
5435 #else
5436                         msg_format("Failed to open file %s.", buf);
5437 #endif
5438                         msg_print(NULL);
5439                         return;
5440                 }
5441
5442
5443                 /* Save the screen */
5444                 screen_save();
5445
5446
5447                 /* Dump the screen */
5448                 for (y = 0; y < hgt; y++)
5449                 {
5450                         /* Dump each row */
5451                         for (x = 0; x < wid - 1; x++)
5452                         {
5453                                 /* Get the attr/char */
5454                                 (void)(Term_what(x, y, &a, &c));
5455
5456                                 /* Dump it */
5457                                 buf[x] = c;
5458                         }
5459
5460                         /* Terminate */
5461                         buf[x] = '\0';
5462
5463                         /* End the row */
5464                         fprintf(fff, "%s\n", buf);
5465                 }
5466
5467                 /* Skip a line */
5468                 fprintf(fff, "\n");
5469
5470
5471                 /* Dump the screen */
5472                 for (y = 0; y < hgt; y++)
5473                 {
5474                         /* Dump each row */
5475                         for (x = 0; x < wid - 1; x++)
5476                         {
5477                                 /* Get the attr/char */
5478                                 (void)(Term_what(x, y, &a, &c));
5479
5480                                 /* Dump it */
5481                                 buf[x] = hack[a&0x0F];
5482                         }
5483
5484                         /* Terminate */
5485                         buf[x] = '\0';
5486
5487                         /* End the row */
5488                         fprintf(fff, "%s\n", buf);
5489                 }
5490
5491                 /* Skip a line */
5492                 fprintf(fff, "\n");
5493
5494
5495                 /* Close it */
5496                 my_fclose(fff);
5497
5498                 /* Hack -- grab permissions */
5499                 safe_setuid_grab();
5500
5501                 /* Message */
5502 #ifdef JP
5503         msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£");
5504 #else
5505                 msg_print("Screen dump saved.");
5506 #endif
5507
5508                 msg_print(NULL);
5509
5510
5511                 /* Restore the screen */
5512                 screen_load();
5513         }
5514
5515         if (old_use_graphics)
5516         {
5517                 use_graphics = TRUE;
5518                 reset_visuals();
5519
5520                 /* Redraw everything */
5521                 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY);
5522
5523                 /* Hack -- update */
5524                 handle_stuff();
5525         }
5526 }
5527
5528
5529 /*
5530  * Sorting hook -- Comp function -- see below
5531  *
5532  * We use "u" to point to array of monster indexes,
5533  * and "v" to select the type of sorting to perform on "u".
5534  */
5535 static bool ang_sort_art_comp(vptr u, vptr v, int a, int b)
5536 {
5537         u16b *who = (u16b*)(u);
5538
5539         u16b *why = (u16b*)(v);
5540
5541         int w1 = who[a];
5542         int w2 = who[b];
5543
5544         int z1, z2;
5545
5546
5547         /* Sort by total kills */
5548         if (*why >= 3)
5549         {
5550                 /* Extract total kills */
5551                 z1 = a_info[w1].tval;
5552                 z2 = a_info[w2].tval;
5553
5554                 /* Compare total kills */
5555                 if (z1 < z2) return (TRUE);
5556                 if (z1 > z2) return (FALSE);
5557         }
5558
5559
5560         /* Sort by monster level */
5561         if (*why >= 2)
5562         {
5563                 /* Extract levels */
5564                 z1 = a_info[w1].sval;
5565                 z2 = a_info[w2].sval;
5566
5567                 /* Compare levels */
5568                 if (z1 < z2) return (TRUE);
5569                 if (z1 > z2) return (FALSE);
5570         }
5571
5572
5573         /* Sort by monster experience */
5574         if (*why >= 1)
5575         {
5576                 /* Extract experience */
5577                 z1 = a_info[w1].level;
5578                 z2 = a_info[w2].level;
5579
5580                 /* Compare experience */
5581                 if (z1 < z2) return (TRUE);
5582                 if (z1 > z2) return (FALSE);
5583         }
5584
5585
5586         /* Compare indexes */
5587         return (w1 <= w2);
5588 }
5589
5590
5591 /*
5592  * Sorting hook -- Swap function -- see below
5593  *
5594  * We use "u" to point to array of monster indexes,
5595  * and "v" to select the type of sorting to perform.
5596  */
5597 static void ang_sort_art_swap(vptr u, vptr v, int a, int b)
5598 {
5599         u16b *who = (u16b*)(u);
5600
5601         u16b holder;
5602
5603         /* Swap */
5604         holder = who[a];
5605         who[a] = who[b];
5606         who[b] = holder;
5607 }
5608
5609
5610 /*
5611  * Check the status of "artifacts"
5612  */
5613 static void do_cmd_knowledge_artifacts(void)
5614 {
5615         int i, k, z, x, y, n = 0;
5616         u16b why = 3;
5617         s16b *who;
5618
5619         FILE *fff;
5620
5621         char file_name[1024];
5622
5623         char base_name[MAX_NLEN];
5624
5625         bool *okay;
5626
5627         /* Open a new file */
5628         fff = my_fopen_temp(file_name, 1024);
5629
5630         if (!fff) {
5631 #ifdef JP
5632             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5633 #else
5634             msg_format("Failed to create temporary file %s.", file_name);
5635 #endif
5636             msg_print(NULL);
5637             return;
5638         }
5639
5640         /* Allocate the "who" array */
5641         C_MAKE(who, max_r_idx, s16b);
5642
5643         /* Allocate the "okay" array */
5644         C_MAKE(okay, max_a_idx, bool);
5645
5646         /* Scan the artifacts */
5647         for (k = 0; k < max_a_idx; k++)
5648         {
5649                 artifact_type *a_ptr = &a_info[k];
5650
5651                 /* Default */
5652                 okay[k] = FALSE;
5653
5654                 /* Skip "empty" artifacts */
5655                 if (!a_ptr->name) continue;
5656
5657                 /* Skip "uncreated" artifacts */
5658                 if (!a_ptr->cur_num) continue;
5659
5660                 /* Assume okay */
5661                 okay[k] = TRUE;
5662         }
5663
5664         /* Check the dungeon */
5665         for (y = 0; y < cur_hgt; y++)
5666         {
5667                 for (x = 0; x < cur_wid; x++)
5668                 {
5669                         cave_type *c_ptr = &cave[y][x];
5670
5671                         s16b this_o_idx, next_o_idx = 0;
5672
5673                         /* Scan all objects in the grid */
5674                         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5675                         {
5676                                 object_type *o_ptr;
5677
5678                                 /* Acquire object */
5679                                 o_ptr = &o_list[this_o_idx];
5680
5681                                 /* Acquire next object */
5682                                 next_o_idx = o_ptr->next_o_idx;
5683
5684                                 /* Ignore non-artifacts */
5685                                 if (!artifact_p(o_ptr)) continue;
5686
5687                                 /* Ignore known items */
5688                                 if (object_known_p(o_ptr)) continue;
5689
5690                                 /* Note the artifact */
5691                                 okay[o_ptr->name1] = FALSE;
5692                         }
5693                 }
5694         }
5695
5696         /* Check the inventory and equipment */
5697         for (i = 0; i < INVEN_TOTAL; i++)
5698         {
5699                 object_type *o_ptr = &inventory[i];
5700
5701                 /* Ignore non-objects */
5702                 if (!o_ptr->k_idx) continue;
5703
5704                 /* Ignore non-artifacts */
5705                 if (!artifact_p(o_ptr)) continue;
5706
5707                 /* Ignore known items */
5708                 if (object_known_p(o_ptr)) continue;
5709
5710                 /* Note the artifact */
5711                 okay[o_ptr->name1] = FALSE;
5712         }
5713
5714         for (k = 0; k < max_a_idx; k++)
5715         {
5716                 if (okay[k]) who[n++] = k;
5717         }
5718
5719         /* Select the sort method */
5720         ang_sort_comp = ang_sort_art_comp;
5721         ang_sort_swap = ang_sort_art_swap;
5722
5723         /* Sort the array by dungeon depth of monsters */
5724         ang_sort(who, &why, n);
5725
5726         /* Scan the artifacts */
5727         for (k = 0; k < n; k++)
5728         {
5729                 artifact_type *a_ptr = &a_info[who[k]];
5730
5731                 /* Paranoia */
5732 #ifdef JP
5733 strcpy(base_name, "̤ÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à");
5734 #else
5735                 strcpy(base_name, "Unknown Artifact");
5736 #endif
5737
5738
5739                 /* Obtain the base object type */
5740                 z = lookup_kind(a_ptr->tval, a_ptr->sval);
5741
5742                 /* Real object */
5743                 if (z)
5744                 {
5745                         object_type forge;
5746                         object_type *q_ptr;
5747
5748                         /* Get local object */
5749                         q_ptr = &forge;
5750
5751                         /* Create fake object */
5752                         object_prep(q_ptr, z);
5753
5754                         /* Make it an artifact */
5755                         q_ptr->name1 = (byte)who[k];
5756
5757                         /* Describe the artifact */
5758                         object_desc_store(base_name, q_ptr, FALSE, 0);
5759                 }
5760
5761                 /* Hack -- Build the artifact name */
5762 #ifdef JP
5763                 fprintf(fff, "     %s\n", base_name);
5764 #else
5765                 fprintf(fff, "     The %s\n", base_name);
5766 #endif
5767
5768         }
5769
5770         /* Free the "who" array */
5771         C_KILL(who, max_r_idx, s16b);
5772
5773         /* Free the "okay" array */
5774         C_KILL(okay, max_a_idx, bool);
5775
5776         /* Close the file */
5777         my_fclose(fff);
5778
5779         /* Display the file contents */
5780 #ifdef JP
5781         show_file(TRUE, file_name, "´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à", 0, 0);
5782 #else
5783         show_file(TRUE, file_name, "Artifacts Seen", 0, 0);
5784 #endif
5785
5786
5787         /* Remove the file */
5788         fd_kill(file_name);
5789 }
5790
5791
5792 /*
5793  * Display known uniques
5794  */
5795 static void do_cmd_knowledge_uniques(void)
5796 {
5797         int i, k, n = 0;
5798         u16b why = 2;
5799         s16b *who;
5800
5801         FILE *fff;
5802
5803         char file_name[1024];
5804
5805         /* Open a new file */
5806         fff = my_fopen_temp(file_name, 1024);
5807
5808         if (!fff) {
5809 #ifdef JP
5810             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5811 #else
5812             msg_format("Failed to create temporary file %s.", file_name);
5813 #endif
5814             msg_print(NULL);
5815             return;
5816         }
5817
5818         /* Allocate the "who" array */
5819         C_MAKE(who, max_r_idx, s16b);
5820
5821         /* Scan the monsters */
5822         for (i = 1; i < max_r_idx; i++)
5823         {
5824                 monster_race *r_ptr = &r_info[i];
5825
5826                 /* Use that monster */
5827                 if (r_ptr->name) who[n++] = i;
5828         }
5829
5830         /* Select the sort method */
5831         ang_sort_comp = ang_sort_comp_hook;
5832         ang_sort_swap = ang_sort_swap_hook;
5833
5834         /* Sort the array by dungeon depth of monsters */
5835         ang_sort(who, &why, n);
5836
5837         /* Scan the monster races */
5838         for (k = 0; k < n; k++)
5839         {
5840                 monster_race *r_ptr = &r_info[who[k]];
5841
5842                 /* Only print Uniques */
5843                 if (r_ptr->flags1 & (RF1_UNIQUE))
5844                 {
5845                         bool dead = (r_ptr->max_num == 0);
5846
5847                         if (dead) continue;
5848
5849                         /* Only display "known" uniques */
5850                         if (dead || cheat_know || r_ptr->r_sights)
5851                         {
5852                                 /* Print a message */
5853 #ifdef JP
5854                                 fprintf(fff, "     %s¤Ï¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¡£\n",
5855                                         (r_name + r_ptr->name));
5856 #else
5857                                 fprintf(fff, "     %s is alive\n",
5858                                         (r_name + r_ptr->name));
5859 #endif
5860
5861                         }
5862                 }
5863         }
5864
5865         /* Free the "who" array */
5866         C_KILL(who, max_r_idx, s16b);
5867
5868         /* Close the file */
5869         my_fclose(fff);
5870
5871         /* Display the file contents */
5872 #ifdef JP
5873         show_file(TRUE, file_name, "¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
5874 #else
5875         show_file(TRUE, file_name, "Alive Uniques", 0, 0);
5876 #endif
5877
5878
5879         /* Remove the file */
5880         fd_kill(file_name);
5881 }
5882
5883
5884 /*
5885  * Display dead uniques
5886  */
5887 static void do_cmd_knowledge_uniques_dead(void)
5888 {
5889         int i, k, n = 0;
5890         u16b why = 2;
5891         s16b *who;
5892
5893         FILE *fff;
5894
5895         char file_name[1024];
5896
5897         /* Open a new file */
5898         fff = my_fopen_temp(file_name, 1024);
5899
5900         if (!fff) {
5901 #ifdef JP
5902             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5903 #else
5904             msg_format("Failed to create temporary file %s.", file_name);
5905 #endif
5906             msg_print(NULL);
5907             return;
5908         }
5909
5910         /* Allocate the "who" array */
5911         C_MAKE(who, max_r_idx, s16b);
5912
5913         /* Scan the monsters */
5914         for (i = 1; i < max_r_idx; i++)
5915         {
5916                 monster_race *r_ptr = &r_info[i];
5917
5918                 /* Use that monster */
5919                 if (r_ptr->name) who[n++] = i;
5920         }
5921
5922         /* Select the sort method */
5923         ang_sort_comp = ang_sort_comp_hook;
5924         ang_sort_swap = ang_sort_swap_hook;
5925
5926         /* Sort the array by dungeon depth of monsters */
5927         ang_sort(who, &why, n);
5928
5929         /* Scan the monster races */
5930         for (k = 0; k < n; k++)
5931         {
5932                 monster_race *r_ptr = &r_info[who[k]];
5933
5934                 /* Only print Uniques */
5935                 if (r_ptr->flags1 & (RF1_UNIQUE))
5936                 {
5937                         bool dead = (r_ptr->max_num == 0);
5938
5939                         if (!dead) continue;
5940
5941                         /* Only display "known" uniques */
5942                         if (dead || cheat_know || r_ptr->r_sights)
5943                         {
5944                                 /* Print a message */
5945 #ifdef JP
5946                                 fprintf(fff, "     %s¤Ï´û¤Ë»à¤ó¤Ç¤¤¤ë¡£\n",
5947                                         (r_name + r_ptr->name));
5948 #else
5949                                 fprintf(fff, "     %s is dead\n",
5950                                         (r_name + r_ptr->name));
5951 #endif
5952
5953                         }
5954                 }
5955         }
5956
5957         /* Free the "who" array */
5958         C_KILL(who, max_r_idx, s16b);
5959
5960         /* Close the file */
5961         my_fclose(fff);
5962
5963         /* Display the file contents */
5964 #ifdef JP
5965         show_file(TRUE, file_name, "Åݤ·¤¿¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼", 0, 0);
5966 #else
5967         show_file(TRUE, file_name, "Dead Uniques", 0, 0);
5968 #endif
5969
5970
5971         /* Remove the file */
5972         fd_kill(file_name);
5973 }
5974
5975
5976 /*
5977  * Display weapon-exp
5978  */
5979 static void do_cmd_knowledge_weapon_exp(void)
5980 {
5981         int i,j, num, shougou;
5982
5983         FILE *fff;
5984
5985         char file_name[1024];
5986         char tmp[30];
5987
5988         /* Open a new file */
5989         fff = my_fopen_temp(file_name, 1024);
5990         if (!fff) {
5991 #ifdef JP
5992             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
5993 #else
5994             msg_format("Failed to create temporary file %s.", file_name);
5995 #endif
5996             msg_print(NULL);
5997             return;
5998         }
5999
6000         for(i = 0; i < 5; i++)
6001         {
6002                 for (num = 0; num < 64; num++)
6003                 {
6004                         for (j = 0; j < max_k_idx; j++)
6005                         {
6006                                 object_kind *k_ptr = &k_info[j];
6007
6008                                 if ((k_ptr->tval == TV_SWORD-i) && (k_ptr->sval == num))
6009                                 {
6010                                         if((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue;
6011
6012                                         if(p_ptr->weapon_exp[4-i][num]<4000) shougou=0;
6013                                         else if(p_ptr->weapon_exp[4-i][num]<6000) shougou=1;
6014                                         else if(p_ptr->weapon_exp[4-i][num]<7000) shougou=2;
6015                                         else if(p_ptr->weapon_exp[4-i][num]<8000) shougou=3;
6016                                         else shougou=4;
6017                                         strip_name(tmp, j);
6018                                         fprintf(fff,"%-25s ",tmp);
6019                                         if (p_ptr->weapon_exp[4-i][num] >= s_info[p_ptr->pclass].w_max[4-i][num]) fprintf(fff,"!");
6020                                         else fprintf(fff," ");
6021                                         fprintf(fff,"%s",shougou_moji[shougou]);
6022                                         if (cheat_xtra) fprintf(fff," %d",p_ptr->weapon_exp[4-i][num]);
6023                                         fprintf(fff,"\n");
6024                                         break;
6025                                 }
6026                         }
6027                 }
6028         }
6029
6030         /* Close the file */
6031         my_fclose(fff);
6032
6033         /* Display the file contents */
6034 #ifdef JP
6035         show_file(TRUE, file_name, "Éð´ï¤Î·Ð¸³ÃÍ", 0, 0);
6036 #else
6037         show_file(TRUE, file_name, "Weapon Proficiency", 0, 0);
6038 #endif
6039
6040
6041         /* Remove the file */
6042         fd_kill(file_name);
6043 }
6044
6045
6046 /*
6047  * Display spell-exp
6048  */
6049 static void do_cmd_knowledge_spell_exp(void)
6050 {
6051         int i=0, shougou;
6052
6053         FILE *fff;
6054         magic_type *s_ptr;
6055
6056         char file_name[1024];
6057
6058         /* Open a new file */
6059         fff = my_fopen_temp(file_name, 1024);
6060         if (!fff) {
6061 #ifdef JP
6062             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6063 #else
6064             msg_format("Failed to create temporary file %s.", file_name);
6065 #endif
6066             msg_print(NULL);
6067             return;
6068         }
6069
6070         if(p_ptr->realm1 != REALM_NONE)
6071         {
6072 #ifdef JP
6073                 fprintf(fff,"%s¤ÎËâË¡½ñ\n",realm_names[p_ptr->realm1]);
6074 #else
6075                 fprintf(fff,"%s Spellbook\n",realm_names[p_ptr->realm1]);
6076 #endif
6077                 for (i = 0; i < 32; i++)
6078                 {
6079                         if (!is_magic(p_ptr->realm1))
6080                         {
6081                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][i];
6082                         }
6083                         else
6084                         {
6085                                 s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i];
6086                         }
6087                         if(s_ptr->slevel == 99) continue;
6088                         if(p_ptr->spell_exp[i]<900) shougou=0;
6089                         else if(p_ptr->spell_exp[i]<1200) shougou=1;
6090                         else if(p_ptr->spell_exp[i]<1400) shougou=2;
6091                         else if(p_ptr->spell_exp[i]<1600) shougou=3;
6092                         else shougou=4;
6093                         fprintf(fff,"%-25s ",spell_names[technic2magic(p_ptr->realm1)-1][i]);
6094                         if (p_ptr->realm1 == REALM_HISSATSU)
6095                                 fprintf(fff,"[--]");
6096                         else
6097                         {
6098                                 if (shougou == 4) fprintf(fff,"!");
6099                                 else fprintf(fff," ");
6100                                 fprintf(fff,"%s",shougou_moji[shougou]);
6101                         }
6102                         if (cheat_xtra) fprintf(fff," %d",p_ptr->spell_exp[i]);
6103                         fprintf(fff,"\n");
6104                 }
6105         }
6106
6107         if(p_ptr->realm2 != REALM_NONE)
6108         {
6109                 fprintf(fff,"\n%s Spellbook\n",realm_names[p_ptr->realm2]);
6110                 for (i = 0; i < 32; i++)
6111                 {
6112                         if (!is_magic(p_ptr->realm1))
6113                         {
6114                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][i];
6115                         }
6116                         else
6117                         {
6118                                 s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i];
6119                         }
6120                         if(s_ptr->slevel == 99) continue;
6121
6122                         if(p_ptr->spell_exp[i+32]<900) shougou=0;
6123                         else if(p_ptr->spell_exp[i+32]<1200) shougou=1;
6124                         else if(p_ptr->spell_exp[i+32]<1400) shougou=2;
6125                         else shougou=3;
6126                         fprintf(fff,"%-25s ",spell_names[technic2magic(p_ptr->realm2)-1][i]);
6127                         if (shougou == 3) fprintf(fff,"!");
6128                         else fprintf(fff," ");
6129                         fprintf(fff,"%s",shougou_moji[shougou]);
6130                         if (cheat_xtra) fprintf(fff," %d",p_ptr->spell_exp[i+32]);
6131                         fprintf(fff,"\n");
6132                 }
6133         }
6134
6135         /* Close the file */
6136         my_fclose(fff);
6137
6138         /* Display the file contents */
6139 #ifdef JP
6140         show_file(TRUE, file_name, "ËâË¡¤Î·Ð¸³ÃÍ", 0, 0);
6141 #else
6142         show_file(TRUE, file_name, "Spell Proficiency", 0, 0);
6143 #endif
6144
6145
6146         /* Remove the file */
6147         fd_kill(file_name);
6148 }
6149
6150
6151 /*
6152  * Display skill-exp
6153  */
6154 static void do_cmd_knowledge_skill_exp(void)
6155 {
6156         int i=0, shougou;
6157
6158         FILE *fff;
6159
6160         char file_name[1024];
6161 #ifdef JP
6162         char skill_name[3][17]={"¥Þ¡¼¥·¥ã¥ë¥¢¡¼¥Ä", "ÆóÅáή          ", "¾èÇÏ            "};
6163 #else
6164         char skill_name[3][20]={"Martial Arts    ", "Dual Wielding   ", "Riding          "};
6165 #endif
6166
6167         /* Open a new file */
6168         fff = my_fopen_temp(file_name, 1024);
6169         if (!fff) {
6170 #ifdef JP
6171             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6172 #else
6173             msg_format("Failed to create temporary file %s.", file_name);
6174 #endif
6175             msg_print(NULL);
6176             return;
6177         }
6178
6179         for (i = 0; i < 3; i++)
6180         {
6181                 if(i == GINOU_RIDING)
6182                 {
6183                         if(p_ptr->skill_exp[i]<500) shougou=0;
6184                         else if(p_ptr->skill_exp[i]<2000) shougou=1;
6185                         else if(p_ptr->skill_exp[i]<5000) shougou=2;
6186                         else if(p_ptr->skill_exp[i]<8000) shougou=3;
6187                         else shougou=4;
6188                 }
6189                 else
6190                 {
6191                         if(p_ptr->skill_exp[i]<4000) shougou=0;
6192                         else if(p_ptr->skill_exp[i]<6000) shougou=1;
6193                         else if(p_ptr->skill_exp[i]<7000) shougou=2;
6194                         else if(p_ptr->skill_exp[i]<8000) shougou=3;
6195                         else shougou=4;
6196                 }
6197                 fprintf(fff,"%-20s ",skill_name[i]);
6198                 if (p_ptr->skill_exp[i] == s_info[p_ptr->pclass].s_max[i]) fprintf(fff,"!");
6199                 else fprintf(fff," ");
6200                 fprintf(fff,"%s",shougou_moji[shougou]);
6201                 if (cheat_xtra) fprintf(fff," %d",p_ptr->skill_exp[i]);
6202                 fprintf(fff,"\n");
6203         }
6204
6205         /* Close the file */
6206         my_fclose(fff);
6207
6208         /* Display the file contents */
6209 #ifdef JP
6210         show_file(TRUE, file_name, "µ»Ç½¤Î·Ð¸³ÃÍ", 0, 0);
6211 #else
6212         show_file(TRUE, file_name, "Miscellaneous Proficiency", 0, 0);
6213 #endif
6214
6215
6216         /* Remove the file */
6217         fd_kill(file_name);
6218 }
6219
6220
6221 /*
6222  * Pluralize a monster name
6223  */
6224 void plural_aux(char *Name)
6225 {
6226         int NameLen = strlen(Name);
6227
6228         if (strstr(Name, "Disembodied hand"))
6229         {
6230                 strcpy(Name, "Disembodied hands that strangled people");
6231         }
6232         else if (strstr(Name, "Colour out of space"))
6233         {
6234                 strcpy(Name, "Colours out of space");
6235         }
6236         else if (strstr(Name, "stairway to hell"))
6237         {
6238                 strcpy(Name, "stairways to hell");
6239         }
6240         else if (strstr(Name, "Dweller on the threshold"))
6241         {
6242                 strcpy(Name, "Dwellers on the threshold");
6243         }
6244         else if (strstr(Name, " of "))
6245         {
6246                 cptr aider = strstr(Name, " of ");
6247                 char dummy[80];
6248                 int i = 0;
6249                 cptr ctr = Name;
6250
6251                 while (ctr < aider)
6252                 {
6253                         dummy[i] = *ctr;
6254                         ctr++; i++;
6255                 }
6256
6257                 if (dummy[i-1] == 's')
6258                 {
6259                         strcpy(&(dummy[i]), "es");
6260                         i++;
6261                 }
6262                 else
6263                 {
6264                         strcpy(&(dummy[i]), "s");
6265                 }
6266
6267                 strcpy(&(dummy[i+1]), aider);
6268                 strcpy(Name, dummy);
6269         }
6270         else if (strstr(Name, "coins"))
6271         {
6272                 char dummy[80];
6273                 strcpy(dummy, "piles of ");
6274                 strcat(dummy, Name);
6275                 strcpy(Name, dummy);
6276                 return;
6277         }
6278         else if (strstr(Name, "Manes"))
6279         {
6280                 return;
6281         }
6282         else if (streq(&(Name[NameLen - 2]), "ey"))
6283         {
6284                 strcpy(&(Name[NameLen - 2]), "eys");
6285         }
6286         else if (Name[NameLen - 1] == 'y')
6287         {
6288                 strcpy(&(Name[NameLen - 1]), "ies");
6289         }
6290         else if (streq(&(Name[NameLen - 4]), "ouse"))
6291         {
6292                 strcpy(&(Name[NameLen - 4]), "ice");
6293         }
6294         else if (streq(&(Name[NameLen - 2]), "us"))
6295         {
6296                 strcpy(&(Name[NameLen - 2]), "i");
6297         }
6298         else if (streq(&(Name[NameLen - 6]), "kelman"))
6299         {
6300                 strcpy(&(Name[NameLen - 6]), "kelmen");
6301         }
6302         else if (streq(&(Name[NameLen - 8]), "wordsman"))
6303         {
6304                 strcpy(&(Name[NameLen - 8]), "wordsmen");
6305         }
6306         else if (streq(&(Name[NameLen - 7]), "oodsman"))
6307         {
6308                 strcpy(&(Name[NameLen - 7]), "oodsmen");
6309         }
6310         else if (streq(&(Name[NameLen - 7]), "eastman"))
6311         {
6312                 strcpy(&(Name[NameLen - 7]), "eastmen");
6313         }
6314         else if (streq(&(Name[NameLen - 8]), "izardman"))
6315         {
6316                 strcpy(&(Name[NameLen - 8]), "izardmen");
6317         }
6318         else if (streq(&(Name[NameLen - 5]), "geist"))
6319         {
6320                 strcpy(&(Name[NameLen - 5]), "geister");
6321         }
6322         else if (streq(&(Name[NameLen - 2]), "ex"))
6323         {
6324                 strcpy(&(Name[NameLen - 2]), "ices");
6325         }
6326         else if (streq(&(Name[NameLen - 2]), "lf"))
6327         {
6328                 strcpy(&(Name[NameLen - 2]), "lves");
6329         }
6330         else if (suffix(Name, "ch") ||
6331                  suffix(Name, "sh") ||
6332                          suffix(Name, "nx") ||
6333                          suffix(Name, "s") ||
6334                          suffix(Name, "o"))
6335         {
6336                 strcpy(&(Name[NameLen]), "es");
6337         }
6338         else
6339         {
6340                 strcpy(&(Name[NameLen]), "s");
6341         }
6342 }
6343
6344 /*
6345  * Display current pets
6346  */
6347 static void do_cmd_knowledge_pets(void)
6348 {
6349         int             i;
6350         FILE            *fff;
6351         monster_type    *m_ptr;
6352         int             t_friends = 0;
6353         int             show_upkeep = 0;
6354         char            file_name[1024];
6355
6356
6357         /* Open a new file */
6358         fff = my_fopen_temp(file_name, 1024);
6359         if (!fff) {
6360 #ifdef JP
6361             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6362 #else
6363             msg_format("Failed to create temporary file %s.", file_name);
6364 #endif
6365             msg_print(NULL);
6366             return;
6367         }
6368
6369         /* Process the monsters (backwards) */
6370         for (i = m_max - 1; i >= 1; i--)
6371         {
6372                 monster_race *r_ptr;
6373                 /* Access the monster */
6374                 m_ptr = &m_list[i];
6375
6376                 /* Ignore "dead" monsters */
6377                 if (!m_ptr->r_idx) continue;
6378                 r_ptr = &r_info[m_ptr->r_idx];
6379
6380                 /* Calculate "upkeep" for pets */
6381                 if (is_pet(m_ptr))
6382                 {
6383                         char pet_name[80];
6384                         t_friends++;
6385                         monster_desc(pet_name, m_ptr, 0x88);
6386                         fprintf(fff, "%s (%s)", pet_name, look_mon_desc(i));
6387                         if (p_ptr->riding == i)
6388 #ifdef JP
6389                                 fprintf(fff, " ¾èÇÏÃæ");
6390 #else
6391                                 fprintf(fff, " Riding");
6392 #endif
6393                         fprintf(fff, "\n");
6394                 }
6395         }
6396
6397         show_upkeep = calculate_upkeep();
6398
6399         fprintf(fff, "----------------------------------------------\n");
6400 #ifdef JP
6401         fprintf(fff, "    ¹ç·×: %d É¤¤Î¥Ú¥Ã¥È\n", t_friends);
6402         fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep);
6403 #else
6404         fprintf(fff, "   Total: %d pet%s.\n",
6405                 t_friends, (t_friends == 1 ? "" : "s"));
6406         fprintf(fff, "   Upkeep: %d%% mana.\n", show_upkeep);
6407 #endif
6408
6409
6410
6411         /* Close the file */
6412         my_fclose(fff);
6413
6414         /* Display the file contents */
6415 #ifdef JP
6416 show_file(TRUE, file_name, "¸½ºß¤Î¥Ú¥Ã¥È", 0, 0);
6417 #else
6418         show_file(TRUE, file_name, "Current Pets", 0, 0);
6419 #endif
6420
6421
6422         /* Remove the file */
6423         fd_kill(file_name);
6424 }
6425
6426
6427 /*
6428  * Total kill count
6429  *
6430  * Note that the player ghosts are ignored.  XXX XXX XXX
6431  */
6432 static void do_cmd_knowledge_kill_count(void)
6433 {
6434         int i, k, n = 0;
6435         u16b why = 2;
6436         s16b *who;
6437
6438         FILE *fff;
6439
6440         char file_name[1024];
6441
6442         s32b Total = 0;
6443
6444
6445         /* Open a new file */
6446         fff = my_fopen_temp(file_name, 1024);
6447
6448         if (!fff) {
6449 #ifdef JP
6450             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6451 #else
6452             msg_format("Failed to create temporary file %s.", file_name);
6453 #endif
6454             msg_print(NULL);
6455             return;
6456         }
6457
6458         /* Allocate the "who" array */
6459         C_MAKE(who, max_r_idx, s16b);
6460
6461         {
6462                 /* Monsters slain */
6463                 int kk;
6464
6465                 for (kk = 1; kk < max_r_idx; kk++)
6466                 {
6467                         monster_race *r_ptr = &r_info[kk];
6468
6469                         if (r_ptr->flags1 & (RF1_UNIQUE))
6470                         {
6471                                 bool dead = (r_ptr->max_num == 0);
6472
6473                                 if (dead)
6474                                 {
6475                                         Total++;
6476                                 }
6477                         }
6478                         else
6479                         {
6480                                 s16b This = r_ptr->r_pkills;
6481
6482                                 if (This > 0)
6483                                 {
6484                                         Total += This;
6485                                 }
6486                         }
6487                 }
6488
6489                 if (Total < 1)
6490 #ifdef JP
6491                         fprintf(fff,"¤¢¤Ê¤¿¤Ï¤Þ¤ÀŨ¤òÅݤ·¤Æ¤¤¤Ê¤¤¡£\n\n");
6492 #else
6493                         fprintf(fff,"You have defeated no enemies yet.\n\n");
6494 #endif
6495
6496                 else if (Total == 1)
6497 #ifdef JP
6498                         fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n");
6499 #else
6500                         fprintf(fff,"You have defeated one enemy.\n\n");
6501 #endif
6502
6503                 else
6504 #ifdef JP
6505                         fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu É¤¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total);
6506 #else
6507                         fprintf(fff,"You have defeated %lu enemies.\n\n", Total);
6508 #endif
6509
6510         }
6511
6512         Total = 0;
6513
6514         /* Scan the monsters */
6515         for (i = 1; i < max_r_idx; i++)
6516         {
6517                 monster_race *r_ptr = &r_info[i];
6518
6519                 /* Use that monster */
6520                 if (r_ptr->name) who[n++] = i;
6521         }
6522
6523         /* Select the sort method */
6524         ang_sort_comp = ang_sort_comp_hook;
6525         ang_sort_swap = ang_sort_swap_hook;
6526
6527         /* Sort the array by dungeon depth of monsters */
6528         ang_sort(who, &why, n);
6529
6530         /* Scan the monster races */
6531         for (k = 0; k < n; k++)
6532         {
6533                 monster_race *r_ptr = &r_info[who[k]];
6534
6535                 if (r_ptr->flags1 & (RF1_UNIQUE))
6536                 {
6537                         bool dead = (r_ptr->max_num == 0);
6538
6539                         if (dead)
6540                         {
6541                                 /* Print a message */
6542                                 fprintf(fff, "     %s\n",
6543                                     (r_name + r_ptr->name));
6544                                 Total++;
6545                         }
6546                 }
6547                 else
6548                 {
6549                         s16b This = r_ptr->r_pkills;
6550
6551                         if (This > 0)
6552                         {
6553 #ifdef JP
6554 /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
6555 if(strchr("pt",r_ptr->d_char))
6556 fprintf(fff, "     %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
6557 else
6558 fprintf(fff, "     %3d É¤¤Î %s\n", This, r_name + r_ptr->name);
6559 #else
6560                                 if (This < 2)
6561                                 {
6562                                         if (strstr(r_name + r_ptr->name, "coins"))
6563                                         {
6564                                                 fprintf(fff, "     1 pile of %s\n", (r_name + r_ptr->name));
6565                                         }
6566                                         else
6567                                         {
6568                                                 fprintf(fff, "     1 %s\n", (r_name + r_ptr->name));
6569                                         }
6570                                 }
6571                                 else
6572                                 {
6573                                         char ToPlural[80];
6574                                         strcpy(ToPlural, (r_name + r_ptr->name));
6575                                         plural_aux(ToPlural);
6576                                         fprintf(fff, "     %d %s\n", This, ToPlural);
6577                                 }
6578 #endif
6579
6580
6581                                 Total += This;
6582                         }
6583                 }
6584         }
6585
6586         fprintf(fff,"----------------------------------------------\n");
6587 #ifdef JP
6588         fprintf(fff,"    ¹ç·×: %lu É¤¤òÅݤ·¤¿¡£\n", Total);
6589 #else
6590         fprintf(fff,"   Total: %lu creature%s killed.\n",
6591                 Total, (Total == 1 ? "" : "s"));
6592 #endif
6593
6594
6595         /* Free the "who" array */
6596         C_KILL(who, max_r_idx, s16b);
6597
6598         /* Close the file */
6599         my_fclose(fff);
6600
6601         /* Display the file contents */
6602 #ifdef JP
6603 show_file(TRUE, file_name, "Åݤ·¤¿Å¨¤Î¿ô", 0, 0);
6604 #else
6605         show_file(TRUE, file_name, "Kill Count", 0, 0);
6606 #endif
6607
6608
6609         /* Remove the file */
6610         fd_kill(file_name);
6611 }
6612
6613
6614 /*
6615  * Display known objects
6616  */
6617 static void do_cmd_knowledge_objects(void)
6618 {
6619         int k;
6620
6621         FILE *fff;
6622
6623         char o_name[MAX_NLEN];
6624
6625         char file_name[1024];
6626
6627
6628         /* Open a new file */
6629         fff = my_fopen_temp(file_name, 1024);
6630         if (!fff) {
6631 #ifdef JP
6632             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6633 #else
6634             msg_format("Failed to create temporary file %s.", file_name);
6635 #endif
6636             msg_print(NULL);
6637             return;
6638         }
6639
6640         /* Scan the object kinds */
6641         for (k = 1; k < max_k_idx; k++)
6642         {
6643                 object_kind *k_ptr = &k_info[k];
6644
6645                 /* Hack -- skip artifacts */
6646                 if (k_ptr->gen_flags & (TRG_INSTA_ART)) continue;
6647
6648                 /* List known flavored objects */
6649                 if (k_ptr->flavor && k_ptr->aware)
6650                 {
6651                         object_type *i_ptr;
6652                         object_type object_type_body;
6653
6654                         /* Get local object */
6655                         i_ptr = &object_type_body;
6656
6657                         /* Create fake object */
6658                         object_prep(i_ptr, k);
6659
6660                         /* Describe the object */
6661                         object_desc_store(o_name, i_ptr, FALSE, 0);
6662
6663                         /* Print a message */
6664                         fprintf(fff, "     %s\n", o_name);
6665                 }
6666         }
6667
6668         /* Close the file */
6669         my_fclose(fff);
6670
6671         /* Display the file contents */
6672 #ifdef JP
6673         show_file(TRUE, file_name, "´ûÃΤΥ¢¥¤¥Æ¥à", 0, 0);
6674 #else
6675         show_file(TRUE, file_name, "Known Objects", 0, 0);
6676 #endif
6677
6678
6679         /* Remove the file */
6680         fd_kill(file_name);
6681 }
6682
6683
6684 /*
6685 * List virtues & status
6686 *
6687 */
6688 static void do_cmd_knowledge_kubi(void)
6689 {
6690         int i;
6691         FILE *fff;
6692         
6693         char file_name[1024];
6694         
6695         
6696         /* Open a new file */
6697         fff = my_fopen_temp(file_name, 1024);
6698         if (!fff) {
6699 #ifdef JP
6700             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6701 #else
6702             msg_format("Failed to create temporary file %s.", file_name);
6703 #endif
6704             msg_print(NULL);
6705             return;
6706         }
6707         
6708         if (fff)
6709         {
6710 #ifdef JP
6711                 fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
6712                 fprintf(fff, "\n");
6713                 fprintf(fff, "¾Þ¶â¼ó¥ê¥¹¥È\n");
6714 #else
6715                 fprintf(fff, "Today target : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "unknown"));
6716                 fprintf(fff, "\n");
6717                 fprintf(fff, "List of wanted monsters\n");
6718 #endif
6719                 for (i = 0; i < MAX_KUBI; i++)
6720                 {
6721                         fprintf(fff,"%-40s ---- ",r_name + r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])].name);
6722                         if (kubi_r_idx[i] > 10000)
6723 #ifdef JP
6724                                 fprintf(fff, "ºÑ\n");
6725 #else
6726                                 fprintf(fff, "done\n");
6727 #endif
6728                         else
6729                                 fprintf(fff, "$%d\n", 300 * (r_info[kubi_r_idx[i]].level + 1));
6730                 }
6731         }
6732         
6733         /* Close the file */
6734         my_fclose(fff);
6735         
6736         /* Display the file contents */
6737 #ifdef JP
6738 show_file(TRUE, file_name, "¾Þ¶â¼ó¤Î°ìÍ÷", 0, 0);
6739 #else
6740         show_file(TRUE, file_name, "Wanted monsters", 0, 0);
6741 #endif
6742
6743         
6744         /* Remove the file */
6745         fd_kill(file_name);
6746 }
6747
6748 /*
6749 * List virtues & status
6750 *
6751 */
6752 static void do_cmd_knowledge_virtues(void)
6753 {
6754         FILE *fff;
6755         
6756         char file_name[1024];
6757         
6758         
6759         /* Open a new file */
6760         fff = my_fopen_temp(file_name, 1024);
6761         if (!fff) {
6762 #ifdef JP
6763             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6764 #else
6765             msg_format("Failed to create temporary file %s.", file_name);
6766 #endif
6767             msg_print(NULL);
6768             return;
6769         }
6770         
6771         if (fff)
6772         {
6773 #ifdef JP
6774                 fprintf(fff, "¸½ºß¤Î°À­ : %s\n\n", your_alignment());
6775 #else
6776                 fprintf(fff, "Your alighnment : %s\n\n", your_alignment());
6777 #endif
6778                 dump_virtues(fff);
6779         }
6780         
6781         /* Close the file */
6782         my_fclose(fff);
6783         
6784         /* Display the file contents */
6785 #ifdef JP
6786 show_file(TRUE, file_name, "Ȭ¤Ä¤ÎÆÁ", 0, 0);
6787 #else
6788         show_file(TRUE, file_name, "Virtues", 0, 0);
6789 #endif
6790
6791         
6792         /* Remove the file */
6793         fd_kill(file_name);
6794 }
6795
6796 /*
6797 * Dungeon
6798 *
6799 */
6800 static void do_cmd_knowledge_dungeon(void)
6801 {
6802         FILE *fff;
6803         
6804         char file_name[1024];
6805         int i;
6806         
6807         
6808         /* Open a new file */
6809         fff = my_fopen_temp(file_name, 1024);
6810         if (!fff) {
6811 #ifdef JP
6812             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6813 #else
6814             msg_format("Failed to create temporary file %s.", file_name);
6815 #endif
6816             msg_print(NULL);
6817             return;
6818         }
6819         
6820         if (fff)
6821         {
6822                 for (i = 1; i < max_d_idx; i++)
6823                 {
6824                         bool seiha = FALSE;
6825
6826                         if (!d_info[i].maxdepth) continue;
6827                         if (!max_dlv[i]) continue;
6828                         if (d_info[i].final_guardian)
6829                         {
6830                                 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
6831                         }
6832                         else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
6833 #ifdef JP
6834                         fprintf(fff,"%c%-12s :  %3d ³¬\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
6835 #else
6836                         fprintf(fff,"%c%-16s :  level %3d\n", seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
6837 #endif
6838                 }
6839         }
6840         
6841         /* Close the file */
6842         my_fclose(fff);
6843         
6844         /* Display the file contents */
6845 #ifdef JP
6846 show_file(TRUE, file_name, "º£¤Þ¤Ç¤ËÆþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó", 0, 0);
6847 #else
6848         show_file(TRUE, file_name, "Dungeon", 0, 0);
6849 #endif
6850
6851         
6852         /* Remove the file */
6853         fd_kill(file_name);
6854 }
6855
6856 /*
6857 * List virtues & status
6858 *
6859 */
6860 static void do_cmd_knowledge_stat(void)
6861 {
6862         FILE *fff;
6863         
6864         char file_name[1024];
6865         int percent, v_nr;
6866         
6867         /* Open a new file */
6868         fff = my_fopen_temp(file_name, 1024);
6869         if (!fff) {
6870 #ifdef JP
6871             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6872 #else
6873             msg_format("Failed to create temporary file %s.", file_name);
6874 #endif
6875             msg_print(NULL);
6876             return;
6877         }
6878         
6879         if (fff)
6880         {
6881                 percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
6882                         (2 * p_ptr->hitdie +
6883                         ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
6884
6885 #ifdef JP
6886 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100\n\n", percent);
6887 else fprintf(fff, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : ???\n\n");
6888 fprintf(fff, "ǽÎϤκÇÂçÃÍ\n\n");
6889 #else
6890                 if (p_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
6891                 else fprintf(fff, "Your current Life Rating is ???.\n\n");
6892 fprintf(fff, "Limits of maximum stats\n\n");
6893 #endif
6894                 for (v_nr = 0; v_nr < 6; v_nr++)
6895                 {
6896                         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);
6897                         else fprintf(fff, "%s ???\n", stat_names[v_nr]);
6898                 }
6899         }
6900
6901         dump_yourself(fff);
6902
6903         /* Close the file */
6904         my_fclose(fff);
6905         
6906         /* Display the file contents */
6907 #ifdef JP
6908 show_file(TRUE, file_name, "¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó", 0, 0);
6909 #else
6910         show_file(TRUE, file_name, "HP-rate & Max stat", 0, 0);
6911 #endif
6912
6913         
6914         /* Remove the file */
6915         fd_kill(file_name);
6916 }
6917
6918 /*
6919  * Print quest status of all active quests
6920  */
6921 static void do_cmd_knowledge_quests(void)
6922 {
6923         FILE *fff;
6924         char file_name[1024];
6925         char tmp_str[120];
6926         char rand_tmp_str[120] = "\0";
6927         char name[80];
6928         monster_race *r_ptr;
6929         int i;
6930         int rand_level = 100;
6931         int total = 0;
6932
6933         /* Open a new file */
6934         fff = my_fopen_temp(file_name, 1024);
6935         if (!fff) {
6936 #ifdef JP
6937             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
6938 #else
6939             msg_format("Failed to create temporary file %s.", file_name);
6940 #endif
6941             msg_print(NULL);
6942             return;
6943         }
6944
6945 #ifdef JP
6946         fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n");
6947 #else
6948         fprintf(fff, "< Current Quest >\n");
6949 #endif
6950
6951         for (i = 1; i < max_quests; i++)
6952         {
6953                 /* No info from "silent" quests */
6954                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
6955
6956                 if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_COMPLETED)
6957                 {
6958                         int old_quest;
6959                         int j;
6960
6961                         /* Clear the text */
6962                         for (j = 0; j < 10; j++)
6963                         {
6964                                 quest_text[j][0] = '\0';
6965                         }
6966
6967                         quest_text_line = 0;
6968
6969                         total++;
6970
6971                         /* Set the quest number temporary */
6972                         old_quest = p_ptr->inside_quest;
6973                         p_ptr->inside_quest = i;
6974
6975                         /* Get the quest text */
6976                         init_flags = INIT_SHOW_TEXT;
6977
6978                         process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
6979
6980                         /* Reset the old quest number */
6981                         p_ptr->inside_quest = old_quest;
6982
6983                         if (quest[i].type != QUEST_TYPE_RANDOM)
6984                         {
6985                                 char note[80] = "\0";
6986
6987                                 if (quest[i].status == QUEST_STATUS_TAKEN)
6988                                 {
6989                                         if (quest[i].type == QUEST_TYPE_KILL_LEVEL || quest[i].type == QUEST_TYPE_KILL_ANY_LEVEL)
6990                                         {
6991                                                 r_ptr = &r_info[quest[i].r_idx];
6992                                                 strcpy(name, r_name + r_ptr->name);
6993                                                 if (quest[i].max_num > 1)
6994                                                 {
6995 #ifdef JP
6996                                                         sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",quest[i].max_num, name, quest[i].max_num-quest[i].cur_num);
6997 #else
6998                                                         plural_aux(name);
6999                                                         sprintf(note," - kill %d %s, have killed %d.",quest[i].max_num, name, quest[i].cur_num);
7000 #endif
7001                                                 }
7002                                                 else
7003 #ifdef JP
7004                                                         sprintf(note," - %s¤òÅݤ¹¡£",name);
7005 #else
7006                                                         sprintf(note," - kill %s.",name);
7007 #endif
7008                                         }
7009                                         else if (quest[i].type == QUEST_TYPE_KILL_NUMBER)
7010                                         {
7011 #ifdef JP
7012                                                 sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",quest[i].max_num, quest[i].max_num-quest[i].cur_num);
7013 #else
7014                                                 sprintf(note," - Kill %d monsters, have killed %d.",quest[i].max_num, quest[i].cur_num);
7015 #endif
7016                                         }
7017                                         else if (quest[i].type == QUEST_TYPE_FIND_ARTIFACT)
7018                                         {
7019                                                 strcpy(name, a_name + a_info[quest[i].k_idx].name);
7020 #ifdef JP
7021                                                 sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name);
7022 #else
7023                                                 sprintf(note," - Find out %s.", name);
7024 #endif
7025                                         }
7026                                         else if (quest[i].type == QUEST_TYPE_FIND_EXIT)
7027 #ifdef JP
7028                                                 sprintf(note," - Ãµº÷¤¹¤ë¡£");
7029 #else
7030                                                 sprintf(note," - Search.");
7031 #endif
7032                                         else if (quest[i].type == QUEST_TYPE_KILL_ALL)
7033 #ifdef JP
7034                                                 sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£");
7035 #else
7036                                                 sprintf(note," - Kill all monsters.");
7037 #endif
7038                                 }
7039
7040                                 /* Print the quest info */
7041 #ifdef JP
7042                                 sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n",
7043 #else
7044                                 sprintf(tmp_str, "%s (Danger level: %d)%s\n",
7045 #endif
7046
7047                                         quest[i].name, quest[i].level, note);
7048
7049                                 fprintf(fff, tmp_str);
7050
7051                                 if (quest[i].status == QUEST_STATUS_COMPLETED)
7052                                 {
7053 #ifdef JP
7054                                         sprintf(tmp_str, "  ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n");
7055 #else
7056                                         sprintf(tmp_str, "  Quest Completed - Unrewarded\n");
7057 #endif
7058
7059
7060                                         fprintf(fff, tmp_str);
7061                                 }
7062                                 else
7063                                 {
7064                                         j = 0;
7065
7066                                         while (quest_text[j][0] && j < 10)
7067                                         {
7068                                                 fprintf(fff, "  %s\n", quest_text[j]);
7069                                                 j++;
7070                                         }
7071                                 }
7072                         }
7073                         else if ((quest[i].type == QUEST_TYPE_RANDOM) &&
7074                                  (quest[i].level < rand_level))
7075                         {
7076                                 /* New random */
7077                                 rand_level = quest[i].level;
7078
7079                                 if (max_dlv[DUNGEON_ANGBAND] >= rand_level)
7080                                 {
7081                                         /* Print the quest info */
7082                                         r_ptr = &r_info[quest[i].r_idx];
7083                                         strcpy(name, r_name + r_ptr->name);
7084
7085                                         if (quest[i].max_num > 1)
7086                                         {
7087 #ifdef JP
7088 sprintf(rand_tmp_str,"%s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n",
7089         quest[i].name, quest[i].level,
7090         quest[i].max_num, name, quest[i].max_num-quest[i].cur_num);
7091 #else
7092                                                 plural_aux(name);
7093
7094                                                 sprintf(rand_tmp_str,"%s (Dungeon level: %d)\n  Kill %d %s, have killed %d.\n",
7095                                                         quest[i].name, quest[i].level,
7096                                                         quest[i].max_num, name, quest[i].cur_num);
7097 #endif
7098
7099                                         }
7100                                         else
7101                                         {
7102 #ifdef JP
7103 sprintf(rand_tmp_str,"%s (%d ³¬) - %s¤òÅݤ¹¡£\n",
7104 #else
7105                                                 sprintf(rand_tmp_str,"%s (Dungeon level: %d)\n  Kill %s.\n",
7106 #endif
7107
7108                                                         quest[i].name, quest[i].level, name);
7109                                         }
7110                                 }
7111                         }
7112                 }
7113         }
7114
7115         /* Print the current random quest  */
7116         if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str);
7117
7118 #ifdef JP
7119         if (!total) fprintf(fff, "¤Ê¤·\n");
7120 #else
7121         if (!total) fprintf(fff, "Nothing.\n");
7122 #endif
7123
7124 #ifdef JP
7125         fprintf(fff, "\n¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
7126 #else
7127         fprintf(fff, "\n< Completed Quest >\n");
7128 #endif
7129         total = 0;
7130         for (i = 1; i < max_quests; i++)
7131         {
7132                 /* No info from "silent" quests */
7133                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7134
7135                 if (quest[i].status == QUEST_STATUS_FINISHED)
7136                 {
7137                         int old_quest;
7138
7139                         total++;
7140
7141                         if (i < MIN_RANDOM_QUEST)
7142                         {
7143                                 /* Set the quest number temporary */
7144                                 old_quest = p_ptr->inside_quest;
7145                                 p_ptr->inside_quest = i;
7146
7147                                 /* Get the quest */
7148                                 init_flags = INIT_ASSIGN;
7149
7150                                 process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
7151
7152                                 /* Reset the old quest number */
7153                                 p_ptr->inside_quest = old_quest;
7154                         }
7155
7156                         if ((i >= MIN_RANDOM_QUEST) && quest[i].r_idx)
7157                         {
7158                                 /* Print the quest info */
7159 #ifdef JP
7160                                 sprintf(tmp_str, "%s (%d³¬) - ¥ì¥Ù¥ë%d\n",
7161 #else
7162                                 sprintf(tmp_str, "%s (Dungeon level: %d) - level %d\n",
7163 #endif
7164
7165                                         r_name+r_info[quest[i].r_idx].name, quest[i].level, quest[i].complev);
7166                         }
7167                         else
7168                         {
7169                                 /* Print the quest info */
7170 #ifdef JP
7171                                 sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n",
7172 #else
7173                                 sprintf(tmp_str, "%s (Danger level: %d) - level %d\n",
7174 #endif
7175
7176                                         quest[i].name, quest[i].level, quest[i].complev);
7177                         }
7178
7179                         fprintf(fff, tmp_str);
7180                 }
7181         }
7182 #ifdef JP
7183         if (!total) fprintf(fff, "¤Ê¤·\n");
7184 #else
7185         if (!total) fprintf(fff, "Nothing.\n");
7186 #endif
7187
7188 #ifdef JP
7189         fprintf(fff, "\n¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
7190 #else
7191         fprintf(fff, "\n< Failed Quest >\n");
7192 #endif
7193         total = 0;
7194         for (i = 1; i < max_quests; i++)
7195         {
7196                 /* No info from "silent" quests */
7197                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7198
7199                 if ((quest[i].status == QUEST_STATUS_FAILED_DONE) || (quest[i].status == QUEST_STATUS_FAILED))
7200                 {
7201                         int old_quest;
7202
7203                         total++;
7204
7205                         if (i < MIN_RANDOM_QUEST)
7206                         {
7207                                 /* Set the quest number temporary */
7208                                 old_quest = p_ptr->inside_quest;
7209                                 p_ptr->inside_quest = i;
7210
7211                                 /* Get the quest text */
7212                                 init_flags = INIT_ASSIGN;
7213
7214                                 process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
7215
7216                                 /* Reset the old quest number */
7217                                 p_ptr->inside_quest = old_quest;
7218                         }
7219
7220                         if ((i >= MIN_RANDOM_QUEST) && quest[i].r_idx)
7221                         {
7222                                 /* Print the quest info */
7223 #ifdef JP
7224                                 sprintf(tmp_str, "%s (%d³¬) - ¥ì¥Ù¥ë%d\n",
7225 #else
7226                                 sprintf(tmp_str, "%s (Dungeon level: %d) - level %d\n",
7227 #endif
7228
7229                                         r_name+r_info[quest[i].r_idx].name, quest[i].level, quest[i].complev);
7230                         }
7231                         else
7232                         {
7233                                 /* Print the quest info */
7234 #ifdef JP
7235                                 sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n",
7236 #else
7237                                 sprintf(tmp_str, "%s (Danger level: %d) - level %d\n",
7238 #endif
7239
7240                                         quest[i].name, quest[i].level, quest[i].complev);
7241                         }
7242                         fprintf(fff, tmp_str);
7243                 }
7244         }
7245 #ifdef JP
7246         if (!total) fprintf(fff, "¤Ê¤·\n");
7247 #else
7248         if (!total) fprintf(fff, "Nothing.\n");
7249 #endif
7250
7251         if (p_ptr->wizard) {
7252 #ifdef JP
7253         fprintf(fff, "\n¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n");
7254 #else
7255         fprintf(fff, "\n< Remaining Random Quest >\n");
7256 #endif
7257         total = 0;
7258         for (i = 1; i < max_quests; i++)
7259         {
7260                 /* No info from "silent" quests */
7261                 if (quest[i].flags & QUEST_FLAG_SILENT) continue;
7262
7263                 if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
7264                 {
7265                         total++;
7266
7267                         /* Print the quest info */
7268 #ifdef JP
7269                         sprintf(tmp_str, "%s (%d³¬, %s)\n",
7270 #else
7271                         sprintf(tmp_str, "%s (%d, %s)\n",
7272 #endif
7273
7274                                 quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name);
7275                         fprintf(fff, tmp_str);
7276                 }
7277         }
7278 #ifdef JP
7279         if (!total) fprintf(fff, "¤Ê¤·\n");
7280 #else
7281         if (!total) fprintf(fff, "Nothing.\n");
7282 #endif
7283         }       
7284
7285         /* Close the file */
7286         my_fclose(fff);
7287
7288         /* Display the file contents */
7289 #ifdef JP
7290         show_file(TRUE, file_name, "¥¯¥¨¥¹¥ÈãÀ®¾õ¶·", 0, 0);
7291 #else
7292         show_file(TRUE, file_name, "Quest status", 0, 0);
7293 #endif
7294
7295
7296         /* Remove the file */
7297         fd_kill(file_name);
7298 }
7299
7300
7301
7302 /*
7303 * List my home
7304 *
7305 */
7306 static void do_cmd_knowledge_home(void)
7307 {
7308         FILE *fff;
7309         
7310         int i, x;
7311         char file_name[1024];
7312         store_type  *st_ptr;
7313         char o_name[MAX_NLEN];
7314         cptr            paren = ")";
7315
7316         process_dungeon_file("w_info_j.txt", 0, 0, max_wild_y, max_wild_x);
7317
7318         /* Open a new file */
7319         fff = my_fopen_temp(file_name, 1024);
7320         if (!fff) {
7321 #ifdef JP
7322             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7323 #else
7324             msg_format("Failed to create temporary file %s.", file_name);
7325 #endif
7326             msg_print(NULL);
7327             return;
7328         }
7329         
7330         if (fff)
7331         {
7332                 /* Print all homes in the different towns */
7333                 st_ptr = &town[1].store[STORE_HOME];
7334
7335                 /* Home -- if anything there */
7336                 if (st_ptr->stock_num)
7337                 {
7338                         /* Header with name of the town */
7339 #ifdef JP
7340                         fprintf(fff, "  [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n");
7341 #else
7342                         fprintf(fff, "  [Home Inventory]\n");
7343 #endif
7344                                 x = 1;
7345
7346                         /* Dump all available items */
7347                         for (i = 0; i < st_ptr->stock_num; i++)
7348                         {
7349 #ifdef JP
7350                                 if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
7351                                 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
7352                                 if (strlen(o_name) <= 80-3)
7353                                 {
7354                                         fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
7355                                 }
7356                                 else
7357                                 {
7358                                         int n;
7359                                         char *t;
7360                                         for (n = 0, t = o_name; n < 80-3; n++, t++)
7361                                                 if(iskanji(*t)) {t++; n++;}
7362                                         if (n == 81-3) n = 79-3; /* ºÇ¸å¤¬´Á»úȾʬ */
7363
7364                                         fprintf(fff, "%c%s %.*s\n", I2A(i%12), paren, n, o_name);
7365                                         fprintf(fff, "   %.77s\n", o_name+n);
7366                                 }
7367 #else
7368                                 object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
7369                                 fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
7370 #endif
7371
7372                         }
7373
7374                         /* Add an empty line */
7375                         fprintf(fff, "\n\n");
7376                 }
7377         }
7378         
7379         /* Close the file */
7380         my_fclose(fff);
7381         
7382         /* Display the file contents */
7383 #ifdef JP
7384 show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0);
7385 #else
7386         show_file(TRUE, file_name, "Home Inventory", 0, 0);
7387 #endif
7388
7389         
7390         /* Remove the file */
7391         fd_kill(file_name);
7392 }
7393
7394
7395 /*
7396  * Check the status of "autopick"
7397  */
7398 static void do_cmd_knowledge_autopick(void)
7399 {
7400         int k;
7401         FILE *fff;
7402         char file_name[1024];
7403
7404         /* Open a new file */
7405         fff = my_fopen_temp(file_name, 1024);
7406
7407         if (!fff)
7408         {
7409 #ifdef JP
7410             msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
7411 #else
7412             msg_format("Failed to create temporary file %s.", file_name);
7413 #endif
7414             msg_print(NULL);
7415             return;
7416         }
7417
7418         if (!max_autopick)
7419         {
7420 #ifdef JP
7421             fprintf(fff, "¼«Æ°Ç˲õ/½¦¤¤¤Ë¤Ï²¿¤âÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
7422 #else
7423             fprintf(fff, "No preference for auto picker/destroyer.");
7424 #endif
7425         }
7426         else
7427         {
7428 #ifdef JP
7429             fprintf(fff, "   ¼«Æ°½¦¤¤/Ç˲õ¤Ë¤Ï¸½ºß %d¹ÔÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n\n", max_autopick);
7430 #else
7431             fprintf(fff, "   There are %d registered lines for auto picker/destroyer.\n\n", max_autopick);
7432 #endif
7433         }
7434
7435         for (k = 0; k < max_autopick; k++)
7436         {
7437                 cptr tmp;
7438                 byte act = autopick_list[k].action;
7439                 if (act & DONT_AUTOPICK)
7440                 {
7441 #ifdef JP
7442                         tmp = "ÊüÃÖ";
7443 #else
7444                         tmp = "Leave";
7445 #endif
7446                 }
7447                 else if (act & DO_AUTODESTROY)
7448                 {
7449 #ifdef JP
7450                         tmp = "Ç˲õ";
7451 #else
7452                         tmp = "Destroy";
7453 #endif
7454                 }
7455                 else
7456                 {
7457 #ifdef JP
7458                         tmp = "½¦¤¦";
7459 #else
7460                         tmp = "Pickup";
7461 #endif
7462                 }
7463
7464                 if (act & DO_DISPLAY)
7465                         fprintf(fff, "%11s", format("[%s]", tmp));
7466                 else
7467                         fprintf(fff, "%11s", format("(%s)", tmp));
7468
7469                 tmp = autopick_line_from_entry(&autopick_list[k]);
7470                 fprintf(fff, " %s", tmp);
7471                 string_free(tmp);
7472                 fprintf(fff, "\n");
7473         }
7474         /* Close the file */
7475         my_fclose(fff);
7476         /* Display the file contents */
7477 #ifdef JP
7478         show_file(TRUE, file_name, "¼«Æ°½¦¤¤/Ç˲õ ÀßÄê¥ê¥¹¥È", 0, 0);
7479 #else
7480         show_file(TRUE, file_name, "Auto-picker/Destroyer", 0, 0);
7481 #endif
7482
7483         /* Remove the file */
7484         fd_kill(file_name);
7485 }
7486
7487
7488 /*
7489  * Interact with "knowledge"
7490  */
7491 void do_cmd_knowledge(void)
7492 {
7493         int i,p=0;
7494         /* File type is "TEXT" */
7495         FILE_TYPE(FILE_TYPE_TEXT);
7496         /* Save the screen */
7497         screen_save();
7498         /* Interact until done */
7499         while (1)
7500         {
7501                 /* Clear screen */
7502                 Term_clear();
7503                 /* Ask for a choice */
7504 #ifdef JP
7505                 prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
7506                 prt("¸½ºß¤ÎÃ챤ò³Îǧ¤¹¤ë", 3, 0);
7507 #else
7508                 prt(format("page %d/2", (p+1)), 2, 65);
7509                 prt("Display current knowledge", 3, 0);
7510 #endif
7511
7512                 /* Give some choices */
7513 #ifdef JP
7514                 if (p == 0) {
7515                         prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à                 ¤Î°ìÍ÷", 6, 5);
7516                         prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à                       ¤Î°ìÍ÷", 7, 5);
7517                         prt("(3) ´ûÃΤÎÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
7518                         prt("(4) Åݤ·¤¿¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼           ¤Î°ìÍ÷", 9, 5);
7519                         prt("(5) Åݤ·¤¿Å¨¤Î¿ô                         ¤Î°ìÍ÷", 10, 5);
7520                         prt("(6) ¾Þ¶â¼ó                               ¤Î°ìÍ÷", 11, 5);
7521                         prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È                         ¤Î°ìÍ÷", 12, 5);
7522                         prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à                     ¤Î°ìÍ÷", 13, 5);
7523                         prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ­                 ¤Î°ìÍ÷", 14, 5);
7524                 } else {
7525                         prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó                     ¤Î°ìÍ÷", 6, 5);
7526                         prt("(b) ÆÍÁ³ÊÑ°Û                             ¤Î°ìÍ÷", 7, 5);
7527                         prt("(c) Éð´ï¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 8, 5);
7528                         prt("(d) ËâË¡¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 9, 5);
7529                         prt("(e) µ»Ç½¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 10, 5);
7530                         prt("(f) ¥×¥ì¥¤¥ä¡¼¤ÎÆÁ                       ¤Î°ìÍ÷", 11, 5);
7531                         prt("(g) Æþ¤Ã¤¿¥À¥ó¥¸¥ç¥ó                     ¤Î°ìÍ÷", 12, 5);
7532                         prt("(h) ¼Â¹ÔÃæ¤Î¥¯¥¨¥¹¥È                     ¤Î°ìÍ÷", 13, 5);
7533                         prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê              ¤Î°ìÍ÷", 14, 5);
7534                 }
7535 #else
7536                 if (p == 0) {
7537                         prt("(1) Display known artifacts", 6, 5);
7538                         prt("(2) Display known objects", 7, 5);
7539                         prt("(3) Display remaining uniques", 8, 5);
7540                         prt("(4) Display dead uniques", 9, 5);
7541                         prt("(5) Display kill count", 10, 5);
7542                         prt("(6) Display wanted monsters", 11, 5);
7543                         prt("(7) Display current pets", 12, 5);
7544                         prt("(8) Display home inventory", 13, 5);
7545                         prt("(9) Display *identified* equip.", 14, 5);
7546                 } else {
7547                         prt("(a) Display about yourself", 6, 5);
7548                         prt("(b) Display mutations", 7, 5);
7549                         prt("(c) Display weapon proficiency", 8, 5);
7550                         prt("(d) Display spell proficiency", 9, 5);
7551                         prt("(e) Display misc. proficiency", 10, 5);
7552                         prt("(f) Display virtues", 11, 5);
7553                         prt("(g) Display dungeons", 12, 5);
7554                         prt("(h) Display current quests", 13, 5);
7555                         prt("(i) Display auto pick/destroy", 14, 5);
7556                 }
7557 #endif
7558                 /* Prompt */
7559 #ifdef JP
7560                 prt("-³¤¯-", 16, 8);
7561                 prt("ESC) È´¤±¤ë", 21, 1);
7562                 prt("SPACE) ¼¡¥Ú¡¼¥¸", 21, 30);
7563                 /*prt("-) Á°¥Ú¡¼¥¸", 21, 60);*/
7564                 prt("¥³¥Þ¥ó¥É:", 20, 0);
7565 #else
7566                 prt("-more-", 16, 8);
7567                 prt("ESC) Exit menu", 21, 1);
7568                 prt("SPACE) Next page", 21, 30);
7569                 /*prt("-) Previous page", 21, 60);*/
7570                 prt("Command: ", 20, 0);
7571 #endif
7572
7573                 /* Prompt */
7574                 i = inkey();
7575                 /* Done */
7576                 if (i == ESCAPE) break;
7577                 switch (i)
7578                 {
7579                 case ' ': /* Page change */
7580                 case '-':
7581                         p = 1 - p;
7582                         break;
7583                 case '1': /* Artifacts */
7584                         do_cmd_knowledge_artifacts();
7585                         break;
7586                 case '2': /* Objects */
7587                         do_cmd_knowledge_objects();
7588                         break;
7589                 case '3': /* Uniques */
7590                         do_cmd_knowledge_uniques();
7591                         break;
7592                 case '4': /* Uniques */
7593                         do_cmd_knowledge_uniques_dead();
7594                         break;
7595                 case '5': /* Kill count  */
7596                         do_cmd_knowledge_kill_count();
7597                         break;
7598                 case '6': /* wanted */
7599                         do_cmd_knowledge_kubi();
7600                         break;
7601                 case '7': /* Pets */
7602                         do_cmd_knowledge_pets();
7603                         break;
7604                 case '8': /* Home */
7605                         do_cmd_knowledge_home();
7606                         break;
7607                 case '9': /* Resist list */
7608                         do_cmd_knowledge_inven();
7609                         break;
7610                 /* Next page */
7611                 case 'a': /* Max stat */
7612                         do_cmd_knowledge_stat();
7613                         break;
7614                 case 'b': /* Mutations */
7615                         do_cmd_knowledge_mutations();
7616                         break;
7617                 case 'c': /* weapon-exp */
7618                         do_cmd_knowledge_weapon_exp();
7619                         break;
7620                 case 'd': /* spell-exp */
7621                         do_cmd_knowledge_spell_exp();
7622                         break;
7623                 case 'e': /* skill-exp */
7624                         do_cmd_knowledge_skill_exp();
7625                         break;
7626                 case 'f': /* Virtues */
7627                         do_cmd_knowledge_virtues();
7628                         break;
7629                 case 'g': /* Dungeon */
7630                         do_cmd_knowledge_dungeon();
7631                         break;
7632                 case 'h': /* Quests */
7633                         do_cmd_knowledge_quests();
7634                         break;
7635                 case 'i': /* Autopick */
7636                         do_cmd_knowledge_autopick();
7637                         break;
7638                 default: /* Unknown option */
7639                         bell();
7640                 }
7641                 /* Flush messages */
7642                 msg_print(NULL);
7643         }
7644         /* Restore the screen */
7645         screen_load();
7646 }
7647
7648
7649 /*
7650  * Check on the status of an active quest
7651  */
7652 void do_cmd_checkquest(void)
7653 {
7654         /* File type is "TEXT" */
7655         FILE_TYPE(FILE_TYPE_TEXT);
7656
7657         /* Save the screen */
7658         screen_save();
7659
7660         /* Quest info */
7661         do_cmd_knowledge_quests();
7662
7663         /* Restore the screen */
7664         screen_load();
7665 }
7666
7667
7668 /*
7669  * Display the time and date
7670  */
7671 void do_cmd_time(void)
7672 {
7673         int day, hour, min, full, start, end, num;
7674         char desc[1024];
7675
7676         char buf[1024];
7677
7678         FILE *fff;
7679
7680         extract_day_hour_min(&day, &hour, &min);
7681
7682         full = hour * 100 + min;
7683
7684         start = 9999;
7685         end = -9999;
7686
7687         num = 0;
7688
7689 #ifdef JP
7690 strcpy(desc, "ÊѤʻþ¹ï¤À¡£");
7691 #else
7692         strcpy(desc, "It is a strange time.");
7693 #endif
7694
7695
7696         /* Message */
7697 #ifdef JP
7698 msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£",
7699 #else
7700         msg_format("This is day %d. The time is %d:%02d %s.",
7701 #endif
7702
7703                                   day, (hour % 12 == 0) ? 12 : (hour % 12),
7704                                   min, (hour < 12) ? "AM" : "PM");
7705
7706         /* Find the path */
7707         if (!randint0(10) || p_ptr->image)
7708                 {
7709 #ifdef JP
7710                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timefun_j.txt");
7711 #else
7712                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timefun.txt");
7713 #endif
7714
7715                 }
7716                 else
7717                 {
7718 #ifdef JP
7719                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timenorm_j.txt");
7720 #else
7721                 path_build(buf, 1024, ANGBAND_DIR_FILE, "timenorm.txt");
7722 #endif
7723
7724                 }
7725
7726         /* Open this file */
7727         fff = my_fopen(buf, "rt");
7728
7729         /* Oops */
7730         if (!fff) return;
7731
7732         /* Find this time */
7733         while (!my_fgets(fff, buf, 1024))
7734         {
7735                 /* Ignore comments */
7736                 if (!buf[0] || (buf[0] == '#')) continue;
7737
7738                 /* Ignore invalid lines */
7739                 if (buf[1] != ':') continue;
7740
7741                 /* Process 'Start' */
7742                 if (buf[0] == 'S')
7743                 {
7744                         /* Extract the starting time */
7745                         start = atoi(buf + 2);
7746
7747                         /* Assume valid for an hour */
7748                         end = start + 59;
7749
7750                         /* Next... */
7751                         continue;
7752                 }
7753
7754                 /* Process 'End' */
7755                 if (buf[0] == 'E')
7756                 {
7757                         /* Extract the ending time */
7758                         end = atoi(buf + 2);
7759
7760                         /* Next... */
7761                         continue;
7762                 }
7763
7764                 /* Ignore incorrect range */
7765                 if ((start > full) || (full > end)) continue;
7766
7767                 /* Process 'Description' */
7768                 if (buf[0] == 'D')
7769                 {
7770                         num++;
7771
7772                         /* Apply the randomizer */
7773                         if (!randint0(num)) strcpy(desc, buf + 2);
7774
7775                         /* Next... */
7776                         continue;
7777                 }
7778         }
7779
7780         /* Message */
7781         msg_print(desc);
7782
7783         /* Close the file */
7784         my_fclose(fff);
7785 }