OSDN Git Service

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