OSDN Git Service

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