OSDN Git Service

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