OSDN Git Service

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