OSDN Git Service

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