OSDN Git Service

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