OSDN Git Service

[Refactor] #37353 targeting.h と japanese.h コミットし忘れ修正.
[hengband/hengband.git] / src / util.c
1 /* File: util.c */
2
3 /*
4  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
5  *
6  * This software may be copied and distributed for educational, research,
7  * and not for profit purposes provided that this copyright and statement
8  * are included in all such copies.  Other copyrights may also apply.
9  */
10
11 /* Purpose: Angband utilities -BEN- */
12
13 #include "angband.h"
14 #include "util.h"
15 #include "monsterrace-hook.h"
16 #include "view-mainwindow.h"
17 #include "quest.h"
18 #include "floor.h"
19 #include "world.h"
20 #include "cmd-dump.h"
21 #include "japanese.h"
22
23 /*!
24  * 10進数から16進数への変換テーブル /
25  * Global array for converting numbers to uppercase hecidecimal digit
26  * This array can also be used to convert a number to an octal digit
27  */
28 const char hexsym[16] =
29 {
30         '0', '1', '2', '3', '4', '5', '6', '7',
31         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
32 };
33
34
35 /*
36  * The next "free" index to use
37  */
38 u32b message__next;
39
40 /*
41  * The index of the oldest message (none yet)
42  */
43 u32b message__last;
44
45 /*
46  * The next "free" offset
47  */
48 u32b message__head;
49
50 /*
51  * The offset to the oldest used char (none yet)
52  */
53 u32b message__tail;
54
55 /*
56  * The array of offsets, by index [MESSAGE_MAX]
57  */
58 u32b *message__ptr;
59
60 /*
61  * The array of chars, by offset [MESSAGE_BUF]
62  */
63 char *message__buf;
64
65 static int num_more = 0;
66
67 /* Save macro trigger string for use in inkey_special() */
68 static char inkey_macro_trigger_string[1024];
69
70 int max_macrotrigger = 0; /*!< 現在登録中のマクロ(トリガー)の数 */
71 concptr macro_template = NULL; /*!< Angband設定ファイルのT: タグ情報から読み込んだ長いTコードを処理するために利用する文字列ポインタ */
72 concptr macro_modifier_chr; /*!< &x# で指定されるマクロトリガーに関する情報を記録する文字列ポインタ */
73 concptr macro_modifier_name[MAX_MACRO_MOD]; /*!< マクロ上で取り扱う特殊キーを文字列上で表現するためのフォーマットを記録した文字列ポインタ配列 */
74 concptr macro_trigger_name[MAX_MACRO_TRIG]; /*!< マクロのトリガーコード */
75 concptr macro_trigger_keycode[2][MAX_MACRO_TRIG];  /*!< マクロの内容 */
76
77 #if 0
78 #ifndef HAS_STRICMP
79
80 /*
81  * For those systems that don't have "stricmp()"
82  *
83  * Compare the two strings "a" and "b" ala "strcmp()" ignoring case.
84  */
85 int stricmp(concptr a, concptr b)
86 {
87         concptr s1, s2;
88         char z1, z2;
89
90         /* Scan the strings */
91         for (s1 = a, s2 = b; TRUE; s1++, s2++)
92         {
93                 z1 = FORCEUPPER(*s1);
94                 z2 = FORCEUPPER(*s2);
95                 if (z1 < z2) return (-1);
96                 if (z1 > z2) return (1);
97                 if (!z1) return (0);
98         }
99 }
100
101 #endif /* HAS_STRICMP */
102 #endif /* 0 */
103
104 #ifdef SET_UID
105
106 # ifndef HAVE_USLEEP
107
108 /*
109  * For those systems that don't have "usleep()" but need it.
110  *
111  * Fake "usleep()" function grabbed from the inl netrek server -cba
112  */
113 int usleep(huge usecs)
114 {
115         struct timeval      Timer;
116
117         int                 nfds = 0;
118
119 #ifdef FD_SET
120         fd_set          *no_fds = NULL;
121 #else
122         int                     *no_fds = NULL;
123 #endif
124
125
126         /* Was: int readfds, writefds, exceptfds; */
127         /* Was: readfds = writefds = exceptfds = 0; */
128
129
130         /* Paranoia -- No excessive sleeping */
131         if (usecs > 4000000L) core(_("不当な usleep() 呼び出し", "Illegal usleep() call"));
132
133         /* Wait for it */
134         Timer.tv_sec = (usecs / 1000000L);
135         Timer.tv_usec = (usecs % 1000000L);
136
137         /* Wait for it */
138         if (select(nfds, no_fds, no_fds, no_fds, &Timer) < 0)
139         {
140                 /* Hack -- ignore interrupts */
141                 if (errno != EINTR) return -1;
142         }
143
144         /* Success */
145         return 0;
146 }
147
148 # endif
149
150
151 /*
152  * Hack -- External functions
153  */
154 #ifdef SET_UID
155 extern struct passwd *getpwuid(uid_t uid);
156 extern struct passwd *getpwnam(concptr name);
157 #endif
158
159
160 /*
161  * Find a default user name from the system.
162  */
163 void user_name(char *buf, int id)
164 {
165         struct passwd *pw;
166
167         /* Look up the user name */
168         if ((pw = getpwuid(id)))
169         {
170                 (void)strcpy(buf, pw->pw_name);
171                 buf[16] = '\0';
172
173 #ifdef CAPITALIZE_USER_NAME
174                 /* Hack -- capitalize the user name */
175 #ifdef JP
176                 if (!iskanji(buf[0]))
177 #endif
178                         if (islower(buf[0]))
179                                 buf[0] = toupper(buf[0]);
180 #endif /* CAPITALIZE_USER_NAME */
181
182                 return;
183         }
184
185         /* Oops.  Hack -- default to "PLAYER" */
186         strcpy(buf, "PLAYER");
187 }
188
189 #endif /* SET_UID */
190
191
192
193
194 /*
195  * The concept of the "file" routines below (and elsewhere) is that all
196  * file handling should be done using as few routines as possible, since
197  * every machine is slightly different, but these routines always have the
198  * same semantics.
199  *
200  * In fact, perhaps we should use the "path_parse()" routine below to convert
201  * from "canonical" filenames (optional leading tilde's, internal wildcards,
202  * slash as the path seperator, etc) to "system" filenames (no special symbols,
203  * system-specific path seperator, etc).  This would allow the program itself
204  * to assume that all filenames are "Unix" filenames, and explicitly "extract"
205  * such filenames if needed (by "path_parse()", or perhaps "path_canon()").
206  *
207  * Note that "path_temp" should probably return a "canonical" filename.
208  *
209  * Note that "my_fopen()" and "my_open()" and "my_make()" and "my_kill()"
210  * and "my_move()" and "my_copy()" should all take "canonical" filenames.
211  *
212  * Note that "canonical" filenames use a leading "slash" to indicate an absolute
213  * path, and a leading "tilde" to indicate a special directory, and default to a
214  * relative path, but MSDOS uses a leading "drivename plus colon" to indicate the
215  * use of a "special drive", and then the rest of the path is parsed "normally",
216  * and MACINTOSH uses a leading colon to indicate a relative path, and an embedded
217  * colon to indicate a "drive plus absolute path", and finally defaults to a file
218  * in the current working directory, which may or may not be defined.
219  *
220  * We should probably parse a leading "~~/" as referring to "ANGBAND_DIR". (?)
221  */
222
223
224 #ifdef ACORN
225
226
227 /*
228  * Most of the "file" routines for "ACORN" should be in "main-acn.c"
229  */
230
231
232 #else /* ACORN */
233
234
235 #ifdef SET_UID
236
237 /*
238  * Extract a "parsed" path from an initial filename
239  * Normally, we simply copy the filename into the buffer
240  * But leading tilde symbols must be handled in a special way
241  * Replace "~user/" by the home directory of the user named "user"
242  * Replace "~/" by the home directory of the current user
243  */
244 errr path_parse(char *buf, int max, concptr file)
245 {
246         concptr         u, s;
247         struct passwd   *pw;
248         char            user[128];
249
250
251         /* Assume no result */
252         buf[0] = '\0';
253
254         /* No file? */
255         if (!file) return (-1);
256
257         /* File needs no parsing */
258         if (file[0] != '~')
259         {
260                 (void)strnfmt(buf, max, "%s", file);
261                 return (0);
262         }
263
264         /* Point at the user */
265         u = file+1;
266
267         /* Look for non-user portion of the file */
268         s = my_strstr(u, PATH_SEP);
269
270         /* Hack -- no long user names */
271         if (s && (s >= u + sizeof(user))) return (1);
272
273         /* Extract a user name */
274         if (s)
275         {
276                 int i;
277                 for (i = 0; u < s; ++i) user[i] = *u++;
278                 user[i] = '\0';
279                 u = user;
280         }
281
282         /* Look up the "current" user */
283         if (u[0] == '\0') u = getlogin();
284
285         /* Look up a user (or "current" user) */
286         if (u) pw = getpwnam(u);
287         else pw = getpwuid(getuid());
288
289         /* Nothing found? */
290         if (!pw) return (1);
291
292         /* Make use of the info */
293         if (s) strnfmt(buf, max, "%s%s", pw->pw_dir, s);
294         else strnfmt(buf, max, "%s", pw->pw_dir);
295
296         /* Success */
297         return (0);
298 }
299
300
301 #else /* SET_UID */
302
303
304 /*
305  * Extract a "parsed" path from an initial filename
306  *
307  * This requires no special processing on simple machines,
308  * except for verifying the size of the filename.
309  */
310 errr path_parse(char *buf, int max, concptr file)
311 {
312         /* Accept the filename */
313         (void)strnfmt(buf, max, "%s", file);
314
315 #if defined(MAC_MPW) && defined(CARBON)
316      /* Fix it according to the current operating system */
317     convert_pathname(buf);
318 #endif /* MAC_MPW && CARBON */
319
320         /* Success */
321         return (0);
322 }
323
324
325 #endif /* SET_UID */
326
327
328 #ifndef HAVE_MKSTEMP
329
330 /*
331  * Hack -- acquire a "temporary" file name if possible
332  *
333  * This filename is always in "system-specific" form.
334  */
335 static errr path_temp(char *buf, int max)
336 {
337         concptr s;
338
339         /* Temp file */
340         s = tmpnam(NULL);
341
342         if (!s) return (-1);
343
344         /* Format to length */
345 #if !defined(WIN32) || (defined(_MSC_VER) && (_MSC_VER >= 1900))
346         (void)strnfmt(buf, max, "%s", s);
347 #else
348         (void)strnfmt(buf, max, ".%s", s);
349 #endif
350
351         /* Success */
352         return (0);
353 }
354
355 #endif
356
357 /*
358  * Create a new path by appending a file (or directory) to a path.
359  *
360  * This requires no special processing on simple machines, except
361  * for verifying the size of the filename, but note the ability to
362  * bypass the given "path" with certain special file-names.
363  *
364  * Note that the "file" may actually be a "sub-path", including
365  * a path and a file.
366  *
367  * Note that this function yields a path which must be "parsed"
368  * using the "parse" function above.
369  */
370 errr path_build(char *buf, int max, concptr path, concptr file)
371 {
372         /* Special file */
373         if (file[0] == '~')
374         {
375                 /* Use the file itself */
376                 (void)strnfmt(buf, max, "%s", file);
377         }
378
379         /* Absolute file, on "normal" systems */
380         else if (prefix(file, PATH_SEP) && !streq(PATH_SEP, ""))
381         {
382                 /* Use the file itself */
383                 (void)strnfmt(buf, max, "%s", file);
384         }
385
386         /* No path given */
387         else if (!path[0])
388         {
389                 /* Use the file itself */
390                 (void)strnfmt(buf, max, "%s", file);
391         }
392
393         /* Path and File */
394         else
395         {
396                 /* Build the new path */
397                 (void)strnfmt(buf, max, "%s%s%s", path, PATH_SEP, file);
398         }
399
400         /* Success */
401         return (0);
402 }
403
404
405 /*
406  * Hack -- replacement for "fopen()"
407  */
408 FILE *my_fopen(concptr file, concptr mode)
409 {
410         char buf[1024];
411
412 #if defined(MAC_MPW) || defined(MACH_O_CARBON)
413         FILE *tempfff;
414 #endif
415
416         /* Hack -- Try to parse the path */
417         if (path_parse(buf, 1024, file)) return (NULL);
418
419 #if defined(MAC_MPW) || defined(MACH_O_CARBON)
420         if (my_strchr(mode, 'w'))
421         {
422                 /* setting file type/creator */
423                 tempfff = fopen(buf, mode);
424                 fsetfileinfo(buf, _fcreator, _ftype);
425                 fclose(tempfff);
426         }
427 #endif
428
429         /* Attempt to fopen the file anyway */
430         return (fopen(buf, mode));
431 }
432
433
434 /*
435  * Hack -- replacement for "fclose()"
436  */
437 errr my_fclose(FILE *fff)
438 {
439         /* Require a file */
440         if (!fff) return (-1);
441
442         /* Close, check for error */
443         if (fclose(fff) == EOF) return (1);
444
445         /* Success */
446         return (0);
447 }
448
449
450 #endif /* ACORN */
451
452
453 #ifdef HAVE_MKSTEMP
454
455 FILE *my_fopen_temp(char *buf, int max)
456 {
457         int fd;
458
459         /* Prepare the buffer for mkstemp */
460         strncpy(buf, "/tmp/anXXXXXX", max);
461
462         /* Secure creation of a temporary file */
463         fd = mkstemp(buf);
464
465         /* Check the file-descriptor */
466         if (fd < 0) return (NULL);
467
468         /* Return a file stream */
469         return (fdopen(fd, "w"));
470 }
471
472 #else /* HAVE_MKSTEMP */
473
474 FILE *my_fopen_temp(char *buf, int max)
475 {
476         /* Generate a temporary filename */
477         if (path_temp(buf, max)) return (NULL);
478
479         /* Open the file */
480         return (my_fopen(buf, "w"));
481 }
482
483 #endif /* HAVE_MKSTEMP */
484
485
486 /*
487  * Hack -- replacement for "fgets()"
488  *
489  * Read a string, without a newline, to a file
490  *
491  * Process tabs, strip internal non-printables
492  */
493 errr my_fgets(FILE *fff, char *buf, huge n)
494 {
495         huge i = 0;
496         char *s;
497         char tmp[1024];
498
499         /* Read a line */
500         if (fgets(tmp, 1024, fff))
501         {
502 #ifdef JP
503                 guess_convert_to_system_encoding(tmp, sizeof(tmp));
504 #endif
505
506                 /* Convert weirdness */
507                 for (s = tmp; *s; s++)
508                 {
509 #if defined(MACINTOSH) || defined(MACH_O_CARBON)
510
511                         /*
512                          * Be nice to the Macintosh, where a file can have Mac or Unix
513                          * end of line, especially since the introduction of OS X.
514                          * MPW tools were also very tolerant to the Unix EOL.
515                          */
516                         if (*s == '\r') *s = '\n';
517
518 #endif /* MACINTOSH || MACH_O_CARBON */
519
520                         /* Handle newline */
521                         if (*s == '\n')
522                         {
523                                 /* Terminate */
524                                 buf[i] = '\0';
525
526                                 /* Success */
527                                 return (0);
528                         }
529
530                         /* Handle tabs */
531                         else if (*s == '\t')
532                         {
533                                 /* Hack -- require room */
534                                 if (i + 8 >= n) break;
535
536                                 /* Append a space */
537                                 buf[i++] = ' ';
538
539                                 /* Append some more spaces */
540                                 while (0 != (i % 8)) buf[i++] = ' ';
541                         }
542
543 #ifdef JP
544                         else if (iskanji(*s))
545                         {
546                                 if (!s[1]) break;
547                                 buf[i++] = *s++;
548                                 buf[i++] = *s;
549                         }
550
551                         /* 半角かなに対応 */
552                         else if (iskana(*s))
553                         {
554                                 buf[i++] = *s;
555                                 if (i >= n) break;
556                         }
557 #endif
558                         /* Handle printables */
559                         else if (isprint((unsigned char)*s))
560                         {
561                                 /* Copy */
562                                 buf[i++] = *s;
563
564                                 /* Check length */
565                                 if (i >= n) break;
566                         }
567                 }
568                 /* No newline character, but terminate */
569                 buf[i] = '\0';
570
571                 /* Success */
572                 return (0);
573         }
574
575         /* Nothing */
576         buf[0] = '\0';
577
578         /* Failure */
579         return (1);
580 }
581
582
583 /*
584  * Hack -- replacement for "fputs()"
585  * Dump a string, plus a newline, to a file
586  * Process internal weirdness?
587  */
588 errr my_fputs(FILE *fff, concptr buf, huge n)
589 {
590         /* XXX XXX */
591         n = n ? n : 0;
592
593         /* Dump, ignore errors */
594         (void)fprintf(fff, "%s\n", buf);
595
596         /* Success */
597         return (0);
598 }
599
600
601 #ifdef ACORN
602
603
604 /*
605  * Most of the "file" routines for "ACORN" should be in "main-acn.c"
606  *
607  * Many of them can be rewritten now that only "fd_open()" and "fd_make()"
608  * and "my_fopen()" should ever create files.
609  */
610
611
612 #else /* ACORN */
613
614
615 /*
616  * The Macintosh is a little bit brain-dead sometimes
617  */
618 #ifdef MACINTOSH
619 # define open(N,F,M) \
620 ((M), open((char*)(N),F))
621 # define write(F,B,S) \
622 write(F,(char*)(B),S)
623 #endif /* MACINTOSH */
624
625
626 /*
627  * Several systems have no "O_BINARY" flag
628  */
629 #ifndef O_BINARY
630 # define O_BINARY 0
631 #endif /* O_BINARY */
632
633
634 /*
635  * Hack -- attempt to delete a file
636  */
637 errr fd_kill(concptr file)
638 {
639         char buf[1024];
640
641         /* Hack -- Try to parse the path */
642         if (path_parse(buf, 1024, file)) return (-1);
643
644         /* Remove */
645         (void)remove(buf);
646
647         return (0);
648 }
649
650
651 /*
652  * Hack -- attempt to move a file
653  */
654 errr fd_move(concptr file, concptr what)
655 {
656         char buf[1024];
657         char aux[1024];
658
659         /* Hack -- Try to parse the path */
660         if (path_parse(buf, 1024, file)) return (-1);
661
662         /* Hack -- Try to parse the path */
663         if (path_parse(aux, 1024, what)) return (-1);
664
665         /* Rename */
666         (void)rename(buf, aux);
667
668         return (0);
669 }
670
671
672 /*
673  * Hack -- attempt to copy a file
674  */
675 errr fd_copy(concptr file, concptr what)
676 {
677         char buf[1024];
678         char aux[1024];
679         int read_num;
680         int src_fd, dst_fd;
681
682         /* Hack -- Try to parse the path */
683         if (path_parse(buf, 1024, file)) return (-1);
684
685         /* Hack -- Try to parse the path */
686         if (path_parse(aux, 1024, what)) return (-1);
687
688         /* Open source file */
689         src_fd = fd_open(buf, O_RDONLY);
690         if (src_fd < 0) return (-1);
691
692         /* Open destination file */
693         dst_fd = fd_open(aux, O_WRONLY|O_TRUNC|O_CREAT);
694         if (dst_fd < 0) return (-1);
695
696         /* Copy */
697         while ((read_num = read(src_fd, buf, 1024)) > 0)
698         {
699                 int write_num = 0;
700                 while (write_num < read_num)
701                 {
702                         int ret = write(dst_fd, buf + write_num, read_num - write_num);
703                         if (ret < 0) {
704                                 /* Close files */
705                                 fd_close(src_fd);
706                                 fd_close(dst_fd);
707
708                                 return ret;
709                         }
710                         write_num += ret;
711                 }
712         }
713
714         /* Close files */
715         fd_close(src_fd);
716         fd_close(dst_fd);
717
718         return (0);
719 }
720
721 /*
722  * Hack -- attempt to open a file descriptor (create file)
723  * This function should fail if the file already exists
724  * Note that we assume that the file should be "binary"
725  */
726 int fd_make(concptr file, BIT_FLAGS mode)
727 {
728         char buf[1024];
729
730         /* Hack -- Try to parse the path */
731         if (path_parse(buf, 1024, file)) return (-1);
732
733 #if defined(MAC_MPW) || defined(MACH_O_CARBON)
734         {
735                 int fdes;
736                 /* Create the file, fail if exists, write-only, binary */
737                 fdes = open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode);
738                 /* Set creator and type if the file is successfully opened */
739                 if (fdes >= 0) fsetfileinfo(buf, _fcreator, _ftype);
740                 /* Return the descriptor */
741                 return (fdes);
742         }
743 #else
744         /* Create the file, fail if exists, write-only, binary */
745         return (open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode));
746 #endif
747
748 }
749
750
751 /*
752  * Hack -- attempt to open a file descriptor (existing file)
753  *
754  * Note that we assume that the file should be "binary"
755  */
756 int fd_open(concptr file, int flags)
757 {
758         char buf[1024];
759
760         /* Hack -- Try to parse the path */
761         if (path_parse(buf, 1024, file)) return (-1);
762
763         /* Attempt to open the file */
764         return (open(buf, flags | O_BINARY, 0));
765 }
766
767
768 /*
769  * Hack -- attempt to lock a file descriptor
770  *
771  * Legal lock types -- F_UNLCK, F_RDLCK, F_WRLCK
772  */
773 errr fd_lock(int fd, int what)
774 {
775         /* XXX XXX */
776         what = what ? what : 0;
777
778         /* Verify the fd */
779         if (fd < 0) return (-1);
780
781 #ifdef SET_UID
782
783 # ifdef USG
784
785 #  if defined(F_ULOCK) && defined(F_LOCK)
786
787         /* Un-Lock */
788         if (what == F_UNLCK)
789         {
790                 /* Unlock it, Ignore errors */
791                 lockf(fd, F_ULOCK, 0);
792         }
793
794         /* Lock */
795         else
796         {
797                 /* Lock the score file */
798                 if (lockf(fd, F_LOCK, 0) != 0) return (1);
799         }
800
801 #  endif
802
803 # else
804
805 #  if defined(LOCK_UN) && defined(LOCK_EX)
806
807         /* Un-Lock */
808         if (what == F_UNLCK)
809         {
810                 /* Unlock it, Ignore errors */
811                 (void)flock(fd, LOCK_UN);
812         }
813
814         /* Lock */
815         else
816         {
817                 /* Lock the score file */
818                 if (flock(fd, LOCK_EX) != 0) return (1);
819         }
820
821 #  endif
822
823 # endif
824
825 #endif
826
827         /* Success */
828         return (0);
829 }
830
831
832 /*
833  * Hack -- attempt to seek on a file descriptor
834  */
835 errr fd_seek(int fd, huge n)
836 {
837         huge p;
838
839         /* Verify fd */
840         if (fd < 0) return (-1);
841
842         /* Seek to the given position */
843         p = lseek(fd, n, SEEK_SET);
844
845         /* Failure */
846         if (p != n) return (1);
847
848         /* Success */
849         return (0);
850 }
851
852
853 /*
854  * Hack -- attempt to truncate a file descriptor
855  */
856 errr fd_chop(int fd, huge n)
857 {
858         /* XXX XXX */
859         n = n ? n : 0;
860
861         /* Verify the fd */
862         if (fd < 0) return (-1);
863
864 #if defined(ULTRIX) || defined(NeXT)
865         /* Truncate */
866         ftruncate(fd, n);
867 #endif
868
869         /* Success */
870         return (0);
871 }
872
873
874 /*
875  * Hack -- attempt to read data from a file descriptor
876  */
877 errr fd_read(int fd, char *buf, huge n)
878 {
879         /* Verify the fd */
880         if (fd < 0) return (-1);
881
882 #ifndef SET_UID
883
884         /* Read pieces */
885         while (n >= 16384)
886         {
887                 /* Read a piece */
888                 if (read(fd, buf, 16384) != 16384) return (1);
889
890                 /* Shorten the task */
891                 buf += 16384;
892
893                 /* Shorten the task */
894                 n -= 16384;
895         }
896
897 #endif
898
899         /* Read the final piece */
900         if (read(fd, buf, n) != (int)n) return (1);
901
902         /* Success */
903         return (0);
904 }
905
906
907 /*
908  * Hack -- Attempt to write data to a file descriptor
909  */
910 errr fd_write(int fd, concptr buf, huge n)
911 {
912         /* Verify the fd */
913         if (fd < 0) return (-1);
914
915 #ifndef SET_UID
916
917         /* Write pieces */
918         while (n >= 16384)
919         {
920                 /* Write a piece */
921                 if (write(fd, buf, 16384) != 16384) return (1);
922
923                 /* Shorten the task */
924                 buf += 16384;
925
926                 /* Shorten the task */
927                 n -= 16384;
928         }
929
930 #endif
931
932         /* Write the final piece */
933         if (write(fd, buf, n) != (int)n) return (1);
934
935         /* Success */
936         return (0);
937 }
938
939
940 /*
941  * Hack -- attempt to close a file descriptor
942  */
943 errr fd_close(int fd)
944 {
945         /* Verify the fd */
946         if (fd < 0) return (-1);
947
948         /* Close */
949         (void)close(fd);
950
951         return (0);
952 }
953
954
955 #endif /* ACORN */
956
957
958
959
960 /*
961  * Important note about "colors" 
962  *
963  * The "TERM_*" color definitions list the "composition" of each
964  * "Angband color" in terms of "quarters" of each of the three color
965  * components (Red, Green, Blue), for example, TERM_UMBER is defined
966  * as 2/4 Red, 1/4 Green, 0/4 Blue.
967  *
968  * The following info is from "Torbjorn Lindgren" (see "main-xaw.c").
969  *
970  * These values are NOT gamma-corrected.  On most machines (with the
971  * Macintosh being an important exception), you must "gamma-correct"
972  * the given values, that is, "correct for the intrinsic non-linearity
973  * of the phosphor", by converting the given intensity levels based
974  * on the "gamma" of the target screen, which is usually 1.7 (or 1.5).
975  *
976  * The actual formula for conversion is unknown to me at this time,
977  * but you can use the table below for the most common gamma values.
978  *
979  * So, on most machines, simply convert the values based on the "gamma"
980  * of the target screen, which is usually in the range 1.5 to 1.7, and
981  * usually is closest to 1.7.  The converted value for each of the five
982  * different "quarter" values is given below:
983  *
984  *  Given     Gamma 1.0       Gamma 1.5       Gamma 1.7     Hex 1.7
985  *  -----       ----            ----            ----          ---
986  *   0/4        0.00            0.00            0.00          #00
987  *   1/4        0.25            0.27            0.28          #47
988  *   2/4        0.50            0.55            0.56          #8f
989  *   3/4        0.75            0.82            0.84          #d7
990  *   4/4        1.00            1.00            1.00          #ff
991  *
992  * Note that some machines (i.e. most IBM machines) are limited to a
993  * hard-coded set of colors, and so the information above is useless.
994  *
995  * Also, some machines are limited to a pre-determined set of colors,
996  * for example, the IBM can only display 16 colors, and only 14 of
997  * those colors resemble colors used by Angband, and then only when
998  * you ignore the fact that "Slate" and "cyan" are not really matches,
999  * so on the IBM, we use "orange" for both "Umber", and "Light Umber"
1000  * in addition to the obvious "Orange", since by combining all of the
1001  * "indeterminate" colors into a single color, the rest of the colors
1002  * are left with "meaningful" values.
1003  */
1004
1005
1006 /*
1007  * Move the cursor
1008  */
1009 void move_cursor(int row, int col)
1010 {
1011         Term_gotoxy(col, row);
1012 }
1013
1014
1015
1016 /*
1017  * Convert a decimal to a single digit octal number
1018  */
1019 static char octify(uint i)
1020 {
1021         return (hexsym[i%8]);
1022 }
1023
1024 /*
1025  * Convert a decimal to a single digit hex number
1026  */
1027 static char hexify(uint i)
1028 {
1029         return (hexsym[i%16]);
1030 }
1031
1032
1033 /*
1034  * Convert a octal-digit into a decimal
1035  */
1036 static int deoct(char c)
1037 {
1038         if (isdigit(c)) return (D2I(c));
1039         return (0);
1040 }
1041
1042 /*
1043  * Convert a hexidecimal-digit into a decimal
1044  */
1045 static int dehex(char c)
1046 {
1047         if (isdigit(c)) return (D2I(c));
1048         if (islower(c)) return (A2I(c) + 10);
1049         if (isupper(c)) return (A2I(tolower(c)) + 10);
1050         return (0);
1051 }
1052
1053
1054 static int my_stricmp(concptr a, concptr b)
1055 {
1056         concptr s1, s2;
1057         char z1, z2;
1058
1059         /* Scan the strings */
1060         for (s1 = a, s2 = b; TRUE; s1++, s2++)
1061         {
1062                 z1 = FORCEUPPER(*s1);
1063                 z2 = FORCEUPPER(*s2);
1064                 if (z1 < z2) return (-1);
1065                 if (z1 > z2) return (1);
1066                 if (!z1) return (0);
1067         }
1068 }
1069
1070 static int my_strnicmp(concptr a, concptr b, int n)
1071 {
1072         concptr s1, s2;
1073         char z1, z2;
1074
1075         /* Scan the strings */
1076         for (s1 = a, s2 = b; n > 0; s1++, s2++, n--)
1077         {
1078                 z1 = FORCEUPPER(*s1);
1079                 z2 = FORCEUPPER(*s2);
1080                 if (z1 < z2) return (-1);
1081                 if (z1 > z2) return (1);
1082                 if (!z1) return (0);
1083         }
1084         return 0;
1085 }
1086
1087
1088 static void trigger_text_to_ascii(char **bufptr, concptr *strptr)
1089 {
1090         char *s = *bufptr;
1091         concptr str = *strptr;
1092         bool mod_status[MAX_MACRO_MOD];
1093
1094         int i, len = 0;
1095         int shiftstatus = 0;
1096         concptr key_code;
1097
1098         if (macro_template == NULL)
1099                 return;
1100         
1101         for (i = 0; macro_modifier_chr[i]; i++)
1102                 mod_status[i] = FALSE;
1103         str++;
1104
1105         /* Examine modifier keys */
1106         while (1)
1107         {
1108                 for (i=0; macro_modifier_chr[i]; i++)
1109                 {
1110                         len = strlen(macro_modifier_name[i]);
1111                         
1112                         if(!my_strnicmp(str, macro_modifier_name[i], len))
1113                                 break;
1114                 }
1115                 if (!macro_modifier_chr[i]) break;
1116                 str += len;
1117                 mod_status[i] = TRUE;
1118                 if ('S' == macro_modifier_chr[i])
1119                         shiftstatus = 1;
1120         }
1121         for (i = 0; i < max_macrotrigger; i++)
1122         {
1123                 len = strlen(macro_trigger_name[i]);
1124                 if (!my_strnicmp(str, macro_trigger_name[i], len) && ']' == str[len])
1125                 {
1126                         /* a trigger name found */
1127                         break;
1128                 }
1129         }
1130
1131         /* Invalid trigger name? */
1132         if (i == max_macrotrigger)
1133         {
1134                 str = my_strchr(str, ']');
1135                 if (str)
1136                 {
1137                         *s++ = (char)31;
1138                         *s++ = '\r';
1139                         *bufptr = s;
1140                         *strptr = str; /* where **strptr == ']' */
1141                 }
1142                 return;
1143         }
1144         key_code = macro_trigger_keycode[shiftstatus][i];
1145         str += len;
1146
1147         *s++ = (char)31;
1148         for (i = 0; macro_template[i]; i++)
1149         {
1150                 char ch = macro_template[i];
1151                 int j;
1152
1153                 switch(ch)
1154                 {
1155                 case '&':
1156                         for (j = 0; macro_modifier_chr[j]; j++) {
1157                                 if (mod_status[j])
1158                                         *s++ = macro_modifier_chr[j];
1159                         }
1160                         break;
1161                 case '#':
1162                         strcpy(s, key_code);
1163                         s += strlen(key_code);
1164                         break;
1165                 default:
1166                         *s++ = ch;
1167                         break;
1168                 }
1169         }
1170         *s++ = '\r';
1171
1172         *bufptr = s;
1173         *strptr = str; /* where **strptr == ']' */
1174         return;
1175 }
1176
1177
1178 /*
1179  * Hack -- convert a printable string into real ascii
1180  *
1181  * I have no clue if this function correctly handles, for example,
1182  * parsing "\xFF" into a (signed) char.  Whoever thought of making
1183  * the "sign" of a "char" undefined is a complete moron.  Oh well.
1184  */
1185 void text_to_ascii(char *buf, concptr str)
1186 {
1187         char *s = buf;
1188
1189         /* Analyze the "ascii" string */
1190         while (*str)
1191         {
1192                 /* Backslash codes */
1193                 if (*str == '\\')
1194                 {
1195                         /* Skip the backslash */
1196                         str++;
1197                         if (!(*str)) break;
1198
1199                         /* Macro Trigger */
1200                         if (*str == '[')
1201                         {
1202                                 trigger_text_to_ascii(&s, &str);
1203                         }
1204                         else
1205
1206                         /* Hex-mode XXX */
1207                         if (*str == 'x')
1208                         {
1209                                 *s = 16 * (char)dehex(*++str);
1210                                 *s++ += (char)dehex(*++str);
1211                         }
1212
1213                         /* Hack -- simple way to specify "backslash" */
1214                         else if (*str == '\\')
1215                         {
1216                                 *s++ = '\\';
1217                         }
1218
1219                         /* Hack -- simple way to specify "caret" */
1220                         else if (*str == '^')
1221                         {
1222                                 *s++ = '^';
1223                         }
1224
1225                         /* Hack -- simple way to specify "space" */
1226                         else if (*str == 's')
1227                         {
1228                                 *s++ = ' ';
1229                         }
1230
1231                         /* Hack -- simple way to specify Escape */
1232                         else if (*str == 'e')
1233                         {
1234                                 *s++ = ESCAPE;
1235                         }
1236
1237                         /* Backspace */
1238                         else if (*str == 'b')
1239                         {
1240                                 *s++ = '\b';
1241                         }
1242
1243                         /* Newline */
1244                         else if (*str == 'n')
1245                         {
1246                                 *s++ = '\n';
1247                         }
1248
1249                         /* Return */
1250                         else if (*str == 'r')
1251                         {
1252                                 *s++ = '\r';
1253                         }
1254
1255                         /* Tab */
1256                         else if (*str == 't')
1257                         {
1258                                 *s++ = '\t';
1259                         }
1260
1261                         /* Octal-mode */
1262                         else if (*str == '0')
1263                         {
1264                                 *s = 8 * (char)deoct(*++str);
1265                                 *s++ += (char)deoct(*++str);
1266                         }
1267
1268                         /* Octal-mode */
1269                         else if (*str == '1')
1270                         {
1271                                 *s = 64 + 8 * (char)deoct(*++str);
1272                                 *s++ += (char)deoct(*++str);
1273                         }
1274
1275                         /* Octal-mode */
1276                         else if (*str == '2')
1277                         {
1278                                 *s = 64 * 2 + 8 * (char)deoct(*++str);
1279                                 *s++ += (char)deoct(*++str);
1280                         }
1281
1282                         /* Octal-mode */
1283                         else if (*str == '3')
1284                         {
1285                                 *s = 64 * 3 + 8 * (char)deoct(*++str);
1286                                 *s++ += (char)deoct(*++str);
1287                         }
1288
1289                         /* Skip the final char */
1290                         str++;
1291                 }
1292
1293                 /* Normal Control codes */
1294                 else if (*str == '^')
1295                 {
1296                         str++;
1297                         *s++ = (*str++ & 037);
1298                 }
1299
1300                 /* Normal chars */
1301                 else
1302                 {
1303                         *s++ = *str++;
1304                 }
1305         }
1306
1307         /* Terminate */
1308         *s = '\0';
1309 }
1310
1311
1312 static bool trigger_ascii_to_text(char **bufptr, concptr *strptr)
1313 {
1314         char *s = *bufptr;
1315         concptr str = *strptr;
1316         char key_code[100];
1317         int i;
1318         concptr tmp;
1319
1320         if (macro_template == NULL)
1321                 return FALSE;
1322
1323         *s++ = '\\';
1324         *s++ = '[';
1325
1326         for (i = 0; macro_template[i]; i++)
1327         {
1328                 int j;
1329                 char ch = macro_template[i];
1330
1331                 switch(ch)
1332                 {
1333                 case '&':
1334                         while ((tmp = my_strchr(macro_modifier_chr, *str)) != 0)
1335                         {
1336                                 j = (int)(tmp - macro_modifier_chr);
1337                                 tmp = macro_modifier_name[j];
1338                                 while(*tmp) *s++ = *tmp++;
1339                                 str++;
1340                         }
1341                         break;
1342                 case '#':
1343                         for (j = 0; *str && *str != '\r'; j++)
1344                                 key_code[j] = *str++;
1345                         key_code[j] = '\0';
1346                         break;
1347                 default:
1348                         if (ch != *str) return FALSE;
1349                         str++;
1350                 }
1351         }
1352         if (*str++ != '\r') return FALSE;
1353
1354         for (i = 0; i < max_macrotrigger; i++)
1355         {
1356                 if (!my_stricmp(key_code, macro_trigger_keycode[0][i])
1357                     || !my_stricmp(key_code, macro_trigger_keycode[1][i]))
1358                         break;
1359         }
1360         if (i == max_macrotrigger)
1361                 return FALSE;
1362
1363         tmp = macro_trigger_name[i];
1364         while (*tmp) *s++ = *tmp++;
1365
1366         *s++ = ']';
1367         
1368         *bufptr = s;
1369         *strptr = str;
1370         return TRUE;
1371 }
1372
1373
1374 /*
1375  * Hack -- convert a string into a printable form
1376  */
1377 void ascii_to_text(char *buf, concptr str)
1378 {
1379         char *s = buf;
1380
1381         /* Analyze the "ascii" string */
1382         while (*str)
1383         {
1384                 byte i = (byte)(*str++);
1385
1386                 /* Macro Trigger */
1387                 if (i == 31)
1388                 {
1389                         if(!trigger_ascii_to_text(&s, &str))
1390                         {
1391                                 *s++ = '^';
1392                                 *s++ = '_';
1393                         }
1394                 }
1395                 else
1396
1397                 if (i == ESCAPE)
1398                 {
1399                         *s++ = '\\';
1400                         *s++ = 'e';
1401                 }
1402                 else if (i == ' ')
1403                 {
1404                         *s++ = '\\';
1405                         *s++ = 's';
1406                 }
1407                 else if (i == '\b')
1408                 {
1409                         *s++ = '\\';
1410                         *s++ = 'b';
1411                 }
1412                 else if (i == '\t')
1413                 {
1414                         *s++ = '\\';
1415                         *s++ = 't';
1416                 }
1417                 else if (i == '\n')
1418                 {
1419                         *s++ = '\\';
1420                         *s++ = 'n';
1421                 }
1422                 else if (i == '\r')
1423                 {
1424                         *s++ = '\\';
1425                         *s++ = 'r';
1426                 }
1427                 else if (i == '^')
1428                 {
1429                         *s++ = '\\';
1430                         *s++ = '^';
1431                 }
1432                 else if (i == '\\')
1433                 {
1434                         *s++ = '\\';
1435                         *s++ = '\\';
1436                 }
1437                 else if (i < 32)
1438                 {
1439                         *s++ = '^';
1440                         *s++ = i + 64;
1441                 }
1442                 else if (i < 127)
1443                 {
1444                         *s++ = i;
1445                 }
1446                 else if (i < 64)
1447                 {
1448                         *s++ = '\\';
1449                         *s++ = '0';
1450                         *s++ = octify(i / 8);
1451                         *s++ = octify(i % 8);
1452                 }
1453                 else
1454                 {
1455                         *s++ = '\\';
1456                         *s++ = 'x';
1457                         *s++ = hexify(i / 16);
1458                         *s++ = hexify(i % 16);
1459                 }
1460         }
1461
1462         /* Terminate */
1463         *s = '\0';
1464 }
1465
1466
1467
1468 /*
1469  * The "macro" package
1470  *
1471  * Functions are provided to manipulate a collection of macros, each
1472  * of which has a trigger pattern string and a resulting action string
1473  * and a small set of flags.
1474  */
1475
1476
1477
1478 /*
1479  * Determine if any macros have ever started with a given character.
1480  */
1481 static bool macro__use[256];
1482
1483
1484 /*
1485  * Find the macro (if any) which exactly matches the given pattern
1486  */
1487 sint macro_find_exact(concptr pat)
1488 {
1489         int i;
1490
1491         /* Nothing possible */
1492         if (!macro__use[(byte)(pat[0])])
1493         {
1494                 return (-1);
1495         }
1496
1497         /* Scan the macros */
1498         for (i = 0; i < macro__num; ++i)
1499         {
1500                 /* Skip macros which do not match the pattern */
1501                 if (!streq(macro__pat[i], pat)) continue;
1502
1503                 /* Found one */
1504                 return (i);
1505         }
1506
1507         /* No matches */
1508         return (-1);
1509 }
1510
1511
1512 /*
1513  * Find the first macro (if any) which contains the given pattern
1514  */
1515 static sint macro_find_check(concptr pat)
1516 {
1517         int i;
1518
1519         /* Nothing possible */
1520         if (!macro__use[(byte)(pat[0])])
1521         {
1522                 return (-1);
1523         }
1524
1525         /* Scan the macros */
1526         for (i = 0; i < macro__num; ++i)
1527         {
1528                 /* Skip macros which do not contain the pattern */
1529                 if (!prefix(macro__pat[i], pat)) continue;
1530
1531                 /* Found one */
1532                 return (i);
1533         }
1534
1535         /* Nothing */
1536         return (-1);
1537 }
1538
1539
1540 /*
1541  * Find the first macro (if any) which contains the given pattern and more
1542  */
1543 static sint macro_find_maybe(concptr pat)
1544 {
1545         int i;
1546
1547         /* Nothing possible */
1548         if (!macro__use[(byte)(pat[0])])
1549         {
1550                 return (-1);
1551         }
1552
1553         /* Scan the macros */
1554         for (i = 0; i < macro__num; ++i)
1555         {
1556                 /* Skip macros which do not contain the pattern */
1557                 if (!prefix(macro__pat[i], pat)) continue;
1558
1559                 /* Skip macros which exactly match the pattern XXX XXX */
1560                 if (streq(macro__pat[i], pat)) continue;
1561
1562                 /* Found one */
1563                 return (i);
1564         }
1565
1566         /* Nothing */
1567         return (-1);
1568 }
1569
1570
1571 /*
1572  * Find the longest macro (if any) which starts with the given pattern
1573  */
1574 static sint macro_find_ready(concptr pat)
1575 {
1576         int i, t, n = -1, s = -1;
1577
1578         /* Nothing possible */
1579         if (!macro__use[(byte)(pat[0])])
1580         {
1581                 return (-1);
1582         }
1583
1584         /* Scan the macros */
1585         for (i = 0; i < macro__num; ++i)
1586         {
1587                 /* Skip macros which are not contained by the pattern */
1588                 if (!prefix(pat, macro__pat[i])) continue;
1589
1590                 /* Obtain the length of this macro */
1591                 t = strlen(macro__pat[i]);
1592
1593                 /* Only track the "longest" pattern */
1594                 if ((n >= 0) && (s > t)) continue;
1595
1596                 /* Track the entry */
1597                 n = i;
1598                 s = t;
1599         }
1600         return (n);
1601 }
1602
1603
1604 /*
1605  * Add a macro definition (or redefinition).
1606  *
1607  * We should use "act == NULL" to "remove" a macro, but this might make it
1608  * impossible to save the "removal" of a macro definition.  
1609  *
1610  * We should consider refusing to allow macros which contain existing macros,
1611  * or which are contained in existing macros, because this would simplify the
1612  * macro analysis code.  
1613  *
1614  * We should consider removing the "command macro" crap, and replacing it
1615  * with some kind of "powerful keymap" ability, but this might make it hard
1616  * to change the "roguelike" option from inside the game.  
1617  */
1618 errr macro_add(concptr pat, concptr act)
1619 {
1620         int n;
1621
1622
1623         /* Paranoia -- require data */
1624         if (!pat || !act) return (-1);
1625
1626
1627         /* Look for any existing macro */
1628         n = macro_find_exact(pat);
1629
1630         /* Replace existing macro */
1631         if (n >= 0)
1632         {
1633                 /* Free the old macro action */
1634                 string_free(macro__act[n]);
1635         }
1636
1637         /* Create a new macro */
1638         else
1639         {
1640                 /* Acquire a new index */
1641                 n = macro__num++;
1642
1643                 /* Save the pattern */
1644                 macro__pat[n] = string_make(pat);
1645         }
1646
1647         /* Save the action */
1648         macro__act[n] = string_make(act);
1649
1650         /* Efficiency */
1651         macro__use[(byte)(pat[0])] = TRUE;
1652
1653         /* Success */
1654         return (0);
1655 }
1656
1657
1658
1659 /*
1660  * Local variable -- we are inside a "macro action"
1661  *
1662  * Do not match any macros until "ascii 30" is found.
1663  */
1664 static bool parse_macro = FALSE;
1665
1666 /*
1667  * Local variable -- we are inside a "macro trigger"
1668  *
1669  * Strip all keypresses until a low ascii value is found.
1670  */
1671 static bool parse_under = FALSE;
1672
1673
1674 /*
1675  * Flush all input chars.  Actually, remember the flush,
1676  * and do a "special flush" before the next "inkey()".
1677  *
1678  * This is not only more efficient, but also necessary to make sure
1679  * that various "inkey()" codes are not "lost" along the way.
1680  */
1681 void flush(void)
1682 {
1683         /* Do it later */
1684         inkey_xtra = TRUE;
1685 }
1686
1687
1688 /*
1689  * Flush the screen, make a noise
1690  */
1691 void bell(void)
1692 {
1693         /* Mega-Hack -- Flush the output */
1694         Term_fresh();
1695
1696         /* Make a bell noise (if allowed) */
1697         if (ring_bell) Term_xtra(TERM_XTRA_NOISE, 0);
1698
1699         /* Flush the input (later!) */
1700         flush();
1701 }
1702
1703
1704 /*
1705  * Hack -- Make a (relevant?) sound
1706  */
1707 void sound(int val)
1708 {
1709         /* No sound */
1710         if (!use_sound) return;
1711
1712         /* Make a sound (if allowed) */
1713         Term_xtra(TERM_XTRA_SOUND, val);
1714 }
1715
1716 /*
1717  * Hack -- Play a music
1718  */
1719 errr play_music(int type, int val)
1720 {
1721         /* No sound */
1722         if (!use_music) return 1;
1723
1724         /* Make a sound (if allowed) */
1725         return Term_xtra(type, val);
1726 }
1727
1728 /*
1729  * Hack -- Select floor music.
1730  */
1731 void select_floor_music(void)
1732 {
1733         int i;
1734         /* No sound */
1735         if (!use_music) return;
1736
1737         if(p_ptr->ambush_flag)
1738         {
1739                 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_AMBUSH);
1740                 return;
1741         }
1742
1743         if(p_ptr->wild_mode)
1744         {
1745                 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WILD);
1746                 return;
1747         }
1748
1749         if(p_ptr->inside_arena)
1750         {
1751                 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_ARENA);
1752                 return;
1753         }
1754
1755         if(p_ptr->inside_battle)
1756         {
1757                 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BATTLE);
1758                 return;
1759         }
1760
1761         if(p_ptr->inside_quest)
1762         {
1763                 if(play_music(TERM_XTRA_MUSIC_QUEST, p_ptr->inside_quest))
1764                 {
1765                         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST);
1766                 }
1767                 return;
1768         }
1769
1770         for(i = 0; i < max_q_idx; i++)
1771         { // TODO マクロで類似条件を統合すること
1772                 if(quest[i].status == QUEST_STATUS_TAKEN &&
1773                         (quest[i].type == QUEST_TYPE_KILL_LEVEL || quest[i].type == QUEST_TYPE_RANDOM) &&
1774                          quest[i].level == current_floor_ptr->dun_level && p_ptr->dungeon_idx == quest[i].dungeon)
1775                 {
1776                         if(play_music(TERM_XTRA_MUSIC_QUEST, i)) 
1777                         {
1778                                 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST);
1779                         }
1780                         return;
1781                 }
1782         }
1783
1784         if(p_ptr->dungeon_idx)
1785         {
1786                 if(p_ptr->feeling == 2) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL2);
1787                 else if(p_ptr->feeling >= 3 && p_ptr->feeling <= 5) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL1);
1788                 else
1789                 {
1790                         if(play_music(TERM_XTRA_MUSIC_DUNGEON, p_ptr->dungeon_idx))
1791                         {
1792                                 if(current_floor_ptr->dun_level < 40) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_LOW);
1793                                 else if(current_floor_ptr->dun_level < 80) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_MED);
1794                                 else play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_HIGH);
1795                         }
1796                 }
1797                 return;
1798         }
1799
1800         if(p_ptr->town_num)
1801         {
1802                 if(play_music(TERM_XTRA_MUSIC_TOWN, p_ptr->town_num))
1803                 {
1804                         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_TOWN);
1805                 }
1806                 return;
1807         }
1808
1809         if(!current_floor_ptr->dun_level)
1810         {
1811                 if(p_ptr->lev >= 45) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD3);
1812                 else if(p_ptr->lev >= 25) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD2);
1813                 else play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD1);
1814                 return;
1815         }
1816         
1817 }
1818
1819
1820
1821 /*
1822  * Helper function called only from "inkey()"
1823  *
1824  * This function does almost all of the "macro" processing.
1825  *
1826  * We use the "Term_key_push()" function to handle "failed" macros, as well
1827  * as "extra" keys read in while choosing the proper macro, and also to hold
1828  * the action for the macro, plus a special "ascii 30" character indicating
1829  * that any macro action in progress is complete.  Embedded macros are thus
1830  * illegal, unless a macro action includes an explicit "ascii 30" character,
1831  * which would probably be a massive hack, and might break things.
1832  *
1833  * Only 500 (0+1+2+...+29+30) milliseconds may elapse between each key in
1834  * the macro trigger sequence.  If a key sequence forms the "prefix" of a
1835  * macro trigger, 500 milliseconds must pass before the key sequence is
1836  * known not to be that macro trigger.  
1837  */
1838 static char inkey_aux(void)
1839 {
1840         int k = 0, n, p = 0, w = 0;
1841
1842         char ch;
1843
1844         concptr pat, act;
1845
1846         char *buf = inkey_macro_trigger_string;
1847
1848         /* Hack : キー入力待ちで止まっているので、流れた行の記憶は不要。 */
1849         num_more = 0;
1850
1851         if (parse_macro)
1852         {
1853                 /* Scan next keypress from macro action */
1854                 if (Term_inkey(&ch, FALSE, TRUE))
1855                 {
1856                         /* Over-flowed? Cancel macro action */
1857                         parse_macro = FALSE;
1858                 }
1859         }
1860         else
1861         {
1862                 /* Wait for a keypress */
1863                 (void) (Term_inkey(&ch, TRUE, TRUE));
1864         }
1865
1866
1867         /* End "macro action" */
1868         if (ch == 30) parse_macro = FALSE;
1869
1870         /* Inside "macro action" */
1871         if (ch == 30) return (ch);
1872
1873         /* Inside "macro action" */
1874         if (parse_macro) return (ch);
1875
1876         /* Inside "macro trigger" */
1877         if (parse_under) return (ch);
1878
1879         /* Save the first key, advance */
1880         buf[p++] = ch;
1881         buf[p] = '\0';
1882
1883
1884         /* Check for possible macro */
1885         k = macro_find_check(buf);
1886
1887         /* No macro pending */
1888         if (k < 0) return (ch);
1889
1890
1891         /* Wait for a macro, or a timeout */
1892         while (TRUE)
1893         {
1894                 /* Check for pending macro */
1895                 k = macro_find_maybe(buf);
1896
1897                 /* No macro pending */
1898                 if (k < 0) break;
1899
1900                 /* Check for (and remove) a pending key */
1901                 if (0 == Term_inkey(&ch, FALSE, TRUE))
1902                 {
1903                         /* Append the key */
1904                         buf[p++] = ch;
1905                         buf[p] = '\0';
1906
1907                         /* Restart wait */
1908                         w = 0;
1909                 }
1910
1911                 /* No key ready */
1912                 else
1913                 {
1914                         /* Increase "wait" */
1915                         w += 1;
1916
1917                         /* Excessive delay */
1918                         if (w >= 10) break;
1919
1920                         Term_xtra(TERM_XTRA_DELAY, w);
1921                 }
1922         }
1923
1924
1925         /* Check for available macro */
1926         k = macro_find_ready(buf);
1927
1928         /* No macro available */
1929         if (k < 0)
1930         {
1931                 /* Push all the keys back on the queue */
1932                 while (p > 0)
1933                 {
1934                         /* Push the key, notice over-flow */
1935                         if (Term_key_push(buf[--p])) return (0);
1936                 }
1937
1938                 /* Wait for (and remove) a pending key */
1939                 (void)Term_inkey(&ch, TRUE, TRUE);
1940
1941                 /* Return the key */
1942                 return (ch);
1943         }
1944
1945
1946         /* Get the pattern */
1947         pat = macro__pat[k];
1948
1949         /* Get the length of the pattern */
1950         n = strlen(pat);
1951
1952         /* Push the "extra" keys back on the queue */
1953         while (p > n)
1954         {
1955                 /* Push the key, notice over-flow */
1956                 if (Term_key_push(buf[--p])) return (0);
1957         }
1958
1959
1960         /* Begin "macro action" */
1961         parse_macro = TRUE;
1962
1963         /* Push the "end of macro action" key */
1964         if (Term_key_push(30)) return (0);
1965
1966
1967         /* Access the macro action */
1968         act = macro__act[k];
1969
1970         /* Get the length of the action */
1971         n = strlen(act);
1972
1973         /* Push the macro "action" onto the key queue */
1974         while (n > 0)
1975         {
1976                 /* Push the key, notice over-flow */
1977                 if (Term_key_push(act[--n])) return (0);
1978         }
1979
1980
1981         /* Hack -- Force "inkey()" to call us again */
1982         return (0);
1983 }
1984
1985
1986 /*
1987  * Cancel macro action on the queue
1988  */
1989 static void forget_macro_action(void)
1990 {
1991         if (!parse_macro) return;
1992
1993         /* Drop following macro action string */
1994         while (TRUE)
1995         {
1996                 char ch;
1997
1998                 /* End loop if no key ready */
1999                 if (Term_inkey(&ch, FALSE, TRUE)) break;
2000
2001                 /* End loop if no key ready */
2002                 if (ch == 0) break;
2003
2004                 /* End of "macro action" */
2005                 if (ch == 30) break;
2006         }
2007
2008         /* No longer inside "macro action" */
2009         parse_macro = FALSE;
2010 }
2011
2012
2013 /*
2014  * Mega-Hack -- special "inkey_next" pointer.  
2015  *
2016  * This special pointer allows a sequence of keys to be "inserted" into
2017  * the stream of keys returned by "inkey()".  This key sequence will not
2018  * trigger any macros, and cannot be bypassed by the Borg.  It is used
2019  * in Angband to handle "keymaps".
2020  */
2021 static concptr inkey_next = NULL;
2022
2023
2024 #ifdef ALLOW_BORG
2025
2026 /*
2027  * Mega-Hack -- special "inkey_hack" hook.  
2028  *
2029  * This special function hook allows the "Borg" (see elsewhere) to take
2030  * control of the "inkey()" function, and substitute in fake keypresses.
2031  */
2032 char (*inkey_hack)(int flush_first) = NULL;
2033
2034 #endif /* ALLOW_BORG */
2035
2036
2037
2038 /*
2039  * Get a keypress from the user.
2040  *
2041  * This function recognizes a few "global parameters".  These are variables
2042  * which, if set to TRUE before calling this function, will have an effect
2043  * on this function, and which are always reset to FALSE by this function
2044  * before this function returns.  Thus they function just like normal
2045  * parameters, except that most calls to this function can ignore them.
2046  *
2047  * If "inkey_xtra" is TRUE, then all pending keypresses will be flushed,
2048  * and any macro processing in progress will be aborted.  This flag is
2049  * set by the "flush()" function, which does not actually flush anything
2050  * itself, but rather, triggers delayed input flushing via "inkey_xtra".
2051  *
2052  * If "inkey_scan" is TRUE, then we will immediately return "zero" if no
2053  * keypress is available, instead of waiting for a keypress.
2054  *
2055  * If "inkey_base" is TRUE, then all macro processing will be bypassed.
2056  * If "inkey_base" and "inkey_scan" are both TRUE, then this function will
2057  * not return immediately, but will wait for a keypress for as long as the
2058  * normal macro matching code would, allowing the direct entry of macro
2059  * triggers.  The "inkey_base" flag is extremely dangerous!
2060  *
2061  * If "inkey_flag" is TRUE, then we will assume that we are waiting for a
2062  * normal command, and we will only show the cursor if "hilite_player" is
2063  * TRUE (or if the player is in a store), instead of always showing the
2064  * cursor.  The various "main-xxx.c" files should avoid saving the game
2065  * in response to a "menu item" request unless "inkey_flag" is TRUE, to
2066  * prevent savefile corruption.
2067  *
2068  * If we are waiting for a keypress, and no keypress is ready, then we will
2069  * refresh (once) the window which was active when this function was called.
2070  *
2071  * Note that "back-quote" is automatically converted into "escape" for
2072  * convenience on machines with no "escape" key.  This is done after the
2073  * macro matching, so the user can still make a macro for "backquote".
2074  *
2075  * Note the special handling of "ascii 30" (ctrl-caret, aka ctrl-shift-six)
2076  * and "ascii 31" (ctrl-underscore, aka ctrl-shift-minus), which are used to
2077  * provide support for simple keyboard "macros".  These keys are so strange
2078  * that their loss as normal keys will probably be noticed by nobody.  The
2079  * "ascii 30" key is used to indicate the "end" of a macro action, which
2080  * allows recursive macros to be avoided.  The "ascii 31" key is used by
2081  * some of the "main-xxx.c" files to introduce macro trigger sequences.
2082  *
2083  * Hack -- we use "ascii 29" (ctrl-right-bracket) as a special "magic" key,
2084  * which can be used to give a variety of "sub-commands" which can be used
2085  * any time.  These sub-commands could include commands to take a picture of
2086  * the current screen, to start/stop recording a macro action, etc.
2087  *
2088  * If "angband_term[0]" is not active, we will make it active during this
2089  * function, so that the various "main-xxx.c" files can assume that input
2090  * is only requested (via "Term_inkey()") when "angband_term[0]" is active.
2091  *
2092  * Mega-Hack -- This function is used as the entry point for clearing the
2093  * "signal_count" variable, and of the "current_world_ptr->character_saved" variable.
2094  *
2095  * Hack -- Note the use of "inkey_next" to allow "keymaps" to be processed.
2096  *
2097  * Mega-Hack -- Note the use of "inkey_hack" to allow the "Borg" to steal
2098  * control of the keyboard from the user.
2099  */
2100 char inkey(void)
2101 {
2102         int v;
2103         char kk;
2104         char ch = 0;
2105         bool done = FALSE;
2106         term *old = Term;
2107
2108         /* Hack -- Use the "inkey_next" pointer */
2109         if (inkey_next && *inkey_next && !inkey_xtra)
2110         {
2111                 /* Get next character, and advance */
2112                 ch = *inkey_next++;
2113
2114                 /* Cancel the various "global parameters" */
2115                 inkey_base = inkey_xtra = inkey_flag = inkey_scan = FALSE;
2116
2117                 /* Accept result */
2118                 return (ch);
2119         }
2120
2121         /* Forget pointer */
2122         inkey_next = NULL;
2123
2124
2125 #ifdef ALLOW_BORG
2126
2127         /* Mega-Hack -- Use the special hook */
2128         if (inkey_hack && ((ch = (*inkey_hack)(inkey_xtra)) != 0))
2129         {
2130                 /* Cancel the various "global parameters" */
2131                 inkey_base = inkey_xtra = inkey_flag = inkey_scan = FALSE;
2132
2133                 /* Accept result */
2134                 return (ch);
2135         }
2136
2137 #endif /* ALLOW_BORG */
2138
2139
2140         /* Hack -- handle delayed "flush()" */
2141         if (inkey_xtra)
2142         {
2143                 /* End "macro action" */
2144                 parse_macro = FALSE;
2145
2146                 /* End "macro trigger" */
2147                 parse_under = FALSE;
2148
2149                 /* Forget old keypresses */
2150                 Term_flush();
2151         }
2152
2153
2154         /* Access cursor state */
2155         (void)Term_get_cursor(&v);
2156
2157         /* Show the cursor if waiting, except sometimes in "command" mode */
2158         if (!inkey_scan && (!inkey_flag || hilite_player || current_world_ptr->character_icky))
2159         {
2160                 /* Show the cursor */
2161                 (void)Term_set_cursor(1);
2162         }
2163
2164
2165         /* Hack -- Activate main screen */
2166         Term_activate(angband_term[0]);
2167
2168
2169         /* Get a key */
2170         while (!ch)
2171         {
2172                 /* Hack -- Handle "inkey_scan" */
2173                 if (!inkey_base && inkey_scan &&
2174                         (0 != Term_inkey(&kk, FALSE, FALSE)))
2175                 {
2176                         break;
2177                 }
2178
2179
2180                 /* Hack -- Flush output once when no key ready */
2181                 if (!done && (0 != Term_inkey(&kk, FALSE, FALSE)))
2182                 {
2183                         /* Hack -- activate proper term */
2184                         Term_activate(old);
2185
2186                         /* Flush output */
2187                         Term_fresh();
2188
2189                         /* Hack -- activate main screen */
2190                         Term_activate(angband_term[0]);
2191
2192                         /* Mega-Hack -- reset saved flag */
2193                         current_world_ptr->character_saved = FALSE;
2194
2195                         /* Mega-Hack -- reset signal counter */
2196                         signal_count = 0;
2197
2198                         /* Only once */
2199                         done = TRUE;
2200                 }
2201
2202
2203                 /* Hack -- Handle "inkey_base" */
2204                 if (inkey_base)
2205                 {
2206                         int w = 0;
2207
2208                         /* Wait forever */
2209                         if (!inkey_scan)
2210                         {
2211                                 /* Wait for (and remove) a pending key */
2212                                 if (0 == Term_inkey(&ch, TRUE, TRUE))
2213                                 {
2214                                         break;
2215                                 }
2216
2217                                 break;
2218                         }
2219
2220                         /* Wait */
2221                         while (TRUE)
2222                         {
2223                                 /* Check for (and remove) a pending key */
2224                                 if (0 == Term_inkey(&ch, FALSE, TRUE))
2225                                 {
2226                                         break;
2227                                 }
2228
2229                                 /* No key ready */
2230                                 else
2231                                 {
2232                                         /* Increase "wait" */
2233                                         w += 10;
2234
2235                                         /* Excessive delay */
2236                                         if (w >= 100) break;
2237
2238                                         Term_xtra(TERM_XTRA_DELAY, w);
2239                                 }
2240                         }
2241
2242                         break;
2243                 }
2244
2245
2246                 /* Get a key (see above) */
2247                 ch = inkey_aux();
2248
2249
2250                 /* Handle "control-right-bracket" */
2251                 if (ch == 29)
2252                 {
2253                         /* Strip this key */
2254                         ch = 0;
2255                         continue;
2256                 }
2257
2258
2259                 /* Treat back-quote as escape */
2260 /*              if (ch == '`') ch = ESCAPE; */
2261
2262
2263                 /* End "macro trigger" */
2264                 if (parse_under && (ch <= 32))
2265                 {
2266                         /* Strip this key */
2267                         ch = 0;
2268
2269                         /* End "macro trigger" */
2270                         parse_under = FALSE;
2271                 }
2272
2273
2274                 /* Handle "control-caret" */
2275                 if (ch == 30)
2276                 {
2277                         /* Strip this key */
2278                         ch = 0;
2279                 }
2280
2281                 /* Handle "control-underscore" */
2282                 else if (ch == 31)
2283                 {
2284                         /* Strip this key */
2285                         ch = 0;
2286
2287                         /* Begin "macro trigger" */
2288                         parse_under = TRUE;
2289                 }
2290
2291                 /* Inside "macro trigger" */
2292                 else if (parse_under)
2293                 {
2294                         /* Strip this key */
2295                         ch = 0;
2296                 }
2297         }
2298
2299
2300         /* Hack -- restore the term */
2301         Term_activate(old);
2302
2303
2304         /* Restore the cursor */
2305         Term_set_cursor(v);
2306
2307
2308         /* Cancel the various "global parameters" */
2309         inkey_base = inkey_xtra = inkey_flag = inkey_scan = FALSE;
2310
2311         /* Return the keypress */
2312         return (ch);
2313 }
2314
2315
2316
2317
2318 /*
2319  * We use a global array for all inscriptions to reduce the memory
2320  * spent maintaining inscriptions.  Of course, it is still possible
2321  * to run out of inscription memory, especially if too many different
2322  * inscriptions are used, but hopefully this will be rare.
2323  *
2324  * We use dynamic string allocation because otherwise it is necessary
2325  * to pre-guess the amount of quark activity.  We limit the total
2326  * number of quarks, but this is much easier to "expand" as needed.
2327  *
2328  * Any two items with the same inscription will have the same "quark"
2329  * index, which should greatly reduce the need for inscription space.
2330  *
2331  * Note that "quark zero" is NULL and should not be "dereferenced".
2332  */
2333
2334 /*
2335  * Initialize the quark array
2336  */
2337 void quark_init(void)
2338 {
2339         /* Quark variables */
2340         C_MAKE(quark__str, QUARK_MAX, concptr);
2341
2342         /* Prepare first quark, which is used when quark_add() is failed */
2343         quark__str[1] = string_make("");
2344
2345         /* There is one quark (+ NULL) */
2346         quark__num = 2;
2347 }
2348
2349
2350 /*
2351  * Add a new "quark" to the set of quarks.
2352  */
2353 u16b quark_add(concptr str)
2354 {
2355         u16b i;
2356
2357         /* Look for an existing quark */
2358         for (i = 1; i < quark__num; i++)
2359         {
2360                 /* Check for equality */
2361                 if (streq(quark__str[i], str)) return (i);
2362         }
2363
2364         /* Return "" when no room is available */
2365         if (quark__num == QUARK_MAX) return 1;
2366
2367         /* New maximal quark */
2368         quark__num = i + 1;
2369
2370         /* Add a new quark */
2371         quark__str[i] = string_make(str);
2372
2373         /* Return the index */
2374         return (i);
2375 }
2376
2377
2378 /*
2379  * This function looks up a quark
2380  */
2381 concptr quark_str(STR_OFFSET i)
2382 {
2383         concptr q;
2384
2385         /* Return NULL for an invalid index */
2386         if ((i < 1) || (i >= quark__num)) return NULL;
2387
2388         /* Access the quark */
2389         q = quark__str[i];
2390
2391         /* Return the quark */
2392         return (q);
2393 }
2394
2395
2396
2397
2398 /*
2399  * Second try for the "message" handling routines.
2400  *
2401  * Each call to "message_add(s)" will add a new "most recent" message
2402  * to the "message recall list", using the contents of the string "s".
2403  *
2404  * The messages will be stored in such a way as to maximize "efficiency",
2405  * that is, we attempt to maximize the number of sequential messages that
2406  * can be retrieved, given a limited amount of storage space.
2407  *
2408  * We keep a buffer of chars to hold the "text" of the messages, not
2409  * necessarily in "order", and an array of offsets into that buffer,
2410  * representing the actual messages.  This is made more complicated
2411  * by the fact that both the array of indexes, and the buffer itself,
2412  * are both treated as "circular arrays" for efficiency purposes, but
2413  * the strings may not be "broken" across the ends of the array.
2414  *
2415  * The "message_add()" function is rather "complex", because it must be
2416  * extremely efficient, both in space and time, for use with the Borg.
2417  */
2418
2419
2420
2421 /*!
2422  * @brief 保存中の過去ゲームメッセージの数を返す。 / How many messages are "available"?
2423  * @return 残っているメッセージの数
2424  */
2425 s32b message_num(void)
2426 {
2427         int last, next, n;
2428
2429         /* Extract the indexes */
2430         last = message__last;
2431         next = message__next;
2432
2433         /* Handle "wrap" */
2434         if (next < last) next += MESSAGE_MAX;
2435
2436         /* Extract the space */
2437         n = (next - last);
2438
2439         /* Return the result */
2440         return (n);
2441 }
2442
2443
2444 /*!
2445  * @brief 過去のゲームメッセージを返す。 / Recall the "text" of a saved message
2446  * @params age メッセージの世代
2447  * @return メッセージの文字列ポインタ
2448  */
2449 concptr message_str(int age)
2450 {
2451         s32b x;
2452         s32b o;
2453         concptr s;
2454
2455         /* Forgotten messages have no text */
2456         if ((age < 0) || (age >= message_num())) return ("");
2457
2458         /* Acquire the "logical" index */
2459         x = (message__next + MESSAGE_MAX - (age + 1)) % MESSAGE_MAX;
2460
2461         /* Get the "offset" for the message */
2462         o = message__ptr[x];
2463
2464         /* Access the message text */
2465         s = &message__buf[o];
2466
2467         /* Return the message text */
2468         return (s);
2469 }
2470
2471
2472 /*!
2473  * @brief ゲームメッセージをログに追加する。 / Add a new message, with great efficiency
2474  * @params str 保存したいメッセージ
2475  * @return なし
2476  */
2477 void message_add(concptr str)
2478 {
2479         u32b i, n;
2480         int k, x, m;
2481
2482         char u[4096];
2483         char splitted1[81];
2484         concptr splitted2;
2485
2486         /*** Step 1 -- Analyze the message ***/
2487
2488         /* Hack -- Ignore "non-messages" */
2489         if (!str) return;
2490
2491         /* Message length */
2492         n = strlen(str);
2493
2494         /* Important Hack -- Ignore "long" messages */
2495         if (n >= MESSAGE_BUF / 4) return;
2496
2497         /* extra step -- split the message if n>80.(added by Mogami) */
2498         if (n > 80) {
2499 #ifdef JP
2500                 concptr t = str;
2501
2502                 for (n = 0; n < 80; n++, t++)
2503                 {
2504                         if(iskanji(*t)) {
2505                                 t++;
2506                                 n++;
2507                         }
2508                 }
2509                 if (n == 81) n = 79; /* 最後の文字が漢字半分 */
2510 #else
2511                 for (n = 80; n > 60; n--)
2512                         if (str[n] == ' ') break;
2513                 if (n == 60) n = 80;
2514 #endif
2515                 splitted2 = str + n;
2516                 strncpy(splitted1, str ,n);
2517                 splitted1[n] = '\0';
2518                 str = splitted1;
2519         } else {
2520                 splitted2 = NULL;
2521         }
2522
2523         /*** Step 2 -- 最適化の試行 / Attempt to optimize ***/
2524
2525         /* Limit number of messages to check */
2526         m = message_num();
2527         k = m / 4;
2528         if (k > MESSAGE_MAX / 32) k = MESSAGE_MAX / 32;
2529
2530         /* Check previous message */
2531         for (i = message__next; m; m--)
2532         {
2533                 int j = 1;
2534
2535                 char buf[1024];
2536                 char *t;
2537
2538                 concptr old;
2539
2540                 /* Back up and wrap if needed */
2541                 if (i-- == 0) i = MESSAGE_MAX - 1;
2542
2543                 /* Access the old string */
2544                 old = &message__buf[message__ptr[i]];
2545
2546                 /* Skip small messages */
2547                 if (!old) continue;
2548
2549                 strcpy(buf, old);
2550
2551                 /* Find multiple */
2552 #ifdef JP
2553                 for (t = buf; *t && (*t != '<' || (*(t+1) != 'x' )); t++) 
2554                         if(iskanji(*t))t++;
2555 #else
2556                 for (t = buf; *t && (*t != '<'); t++);
2557 #endif
2558
2559                 if (*t)
2560                 {
2561                         /* Message is too small */
2562                         if (strlen(buf) < A_MAX) break;
2563
2564                         /* Drop the space */
2565                         *(t - 1) = '\0';
2566
2567                         /* Get multiplier */
2568                         j = atoi(t+2);
2569                 }
2570
2571                 /* Limit the multiplier to 1000 */
2572                 if (streq(buf, str) && (j < 1000))
2573                 {
2574                         j++;
2575
2576                         /* Overwrite */
2577                         message__next = i;
2578
2579                         str = u;
2580
2581                         /* Write it out */
2582                         sprintf(u, "%s <x%d>", buf, j);
2583
2584                         /* Message length */
2585                         n = strlen(str);
2586
2587                         if (!now_message) now_message++;
2588                 }
2589                 else
2590                 {
2591                         num_more++;/*流れた行の数を数えておく */
2592                         now_message++;
2593                 }
2594
2595                 break;
2596         }
2597
2598         /* Check the last few messages (if any to count) */
2599         for (i = message__next; k; k--)
2600         {
2601                 int q;
2602                 concptr old;
2603
2604                 /* Back up and wrap if needed */
2605                 if (i-- == 0) i = MESSAGE_MAX - 1;
2606
2607                 /* Stop before oldest message */
2608                 if (i == message__last) break;
2609
2610                 /* Extract "distance" from "head" */
2611                 q = (message__head + MESSAGE_BUF - message__ptr[i]) % MESSAGE_BUF;
2612
2613                 /* Do not optimize over large distance */
2614                 if (q > MESSAGE_BUF / 2) continue;
2615
2616                 /* Access the old string */
2617                 old = &message__buf[message__ptr[i]];
2618
2619                 /* Compare */
2620                 if (!streq(old, str)) continue;
2621
2622                 /* Get the next message index, advance */
2623                 x = message__next++;
2624
2625                 /* Handle wrap */
2626                 if (message__next == MESSAGE_MAX) message__next = 0;
2627
2628                 /* Kill last message if needed */
2629                 if (message__next == message__last) message__last++;
2630
2631                 /* Handle wrap */
2632                 if (message__last == MESSAGE_MAX) message__last = 0;
2633
2634                 /* Assign the starting address */
2635                 message__ptr[x] = message__ptr[i];
2636
2637                 /* Success */
2638                 /* return; */
2639                 goto end_of_message_add;
2640
2641         }
2642
2643
2644         /*** Step 3 -- Ensure space before end of buffer ***/
2645
2646         /* Kill messages and Wrap if needed */
2647         if (message__head + n + 1 >= MESSAGE_BUF)
2648         {
2649                 /* Kill all "dead" messages */
2650                 for (i = message__last; TRUE; i++)
2651                 {
2652                         /* Wrap if needed */
2653                         if (i == MESSAGE_MAX) i = 0;
2654
2655                         /* Stop before the new message */
2656                         if (i == message__next) break;
2657
2658                         /* Kill "dead" messages */
2659                         if (message__ptr[i] >= message__head)
2660                         {
2661                                 /* Track oldest message */
2662                                 message__last = i + 1;
2663                         }
2664                 }
2665
2666                 /* Wrap "tail" if needed */
2667                 if (message__tail >= message__head) message__tail = 0;
2668
2669                 /* Start over */
2670                 message__head = 0;
2671         }
2672
2673
2674         /*** Step 4 -- Ensure space before next message ***/
2675
2676         /* Kill messages if needed */
2677         if (message__head + n + 1 > message__tail)
2678         {
2679                 /* Grab new "tail" */
2680                 message__tail = message__head + n + 1;
2681
2682                 /* Advance tail while possible past first "nul" */
2683                 while (message__buf[message__tail-1]) message__tail++;
2684
2685                 /* Kill all "dead" messages */
2686                 for (i = message__last; TRUE; i++)
2687                 {
2688                         /* Wrap if needed */
2689                         if (i == MESSAGE_MAX) i = 0;
2690
2691                         /* Stop before the new message */
2692                         if (i == message__next) break;
2693
2694                         /* Kill "dead" messages */
2695                         if ((message__ptr[i] >= message__head) &&
2696                                 (message__ptr[i] < message__tail))
2697                         {
2698                                 /* Track oldest message */
2699                                 message__last = i + 1;
2700                         }
2701                 }
2702         }
2703
2704
2705         /*** Step 5 -- Grab a new message index ***/
2706
2707         /* Get the next message index, advance */
2708         x = message__next++;
2709
2710         /* Handle wrap */
2711         if (message__next == MESSAGE_MAX) message__next = 0;
2712
2713         /* Kill last message if needed */
2714         if (message__next == message__last) message__last++;
2715
2716         /* Handle wrap */
2717         if (message__last == MESSAGE_MAX) message__last = 0;
2718
2719
2720
2721         /*** Step 6 -- Insert the message text ***/
2722
2723         /* Assign the starting address */
2724         message__ptr[x] = message__head;
2725
2726         /* Append the new part of the message */
2727         for (i = 0; i < n; i++)
2728         {
2729                 /* Copy the message */
2730                 message__buf[message__head + i] = str[i];
2731         }
2732
2733         /* Terminate */
2734         message__buf[message__head + i] = '\0';
2735
2736         /* Advance the "head" pointer */
2737         message__head += n + 1;
2738
2739         /* recursively add splitted message (added by Mogami) */
2740 end_of_message_add:
2741         if (splitted2 != NULL)
2742           message_add(splitted2);
2743 }
2744
2745
2746
2747 /*
2748  * Hack -- flush
2749  */
2750 static void msg_flush(int x)
2751 {
2752         byte a = TERM_L_BLUE;
2753         bool nagasu = FALSE;
2754
2755         if ((auto_more && !p_ptr->now_damaged) || num_more < 0){
2756                 int i;
2757                 for (i = 0; i < 8; i++)
2758                 {
2759                         if (angband_term[i] && (window_flag[i] & PW_MESSAGE)) break;
2760                 }
2761                 if (i < 8)
2762                 {
2763                         if (num_more < angband_term[i]->hgt) nagasu = TRUE;
2764                 }
2765                 else
2766                 {
2767                         nagasu = TRUE;
2768                 }
2769         }
2770         p_ptr->now_damaged = FALSE;
2771
2772         if (!p_ptr->playing || !nagasu)
2773         {
2774                 /* Pause for response */
2775                 Term_putstr(x, 0, -1, a, _("-続く-", "-more-"));
2776
2777                 /* Get an acceptable keypress */
2778                 while (1)
2779                 {
2780                         int cmd = inkey();
2781                         if (cmd == ESCAPE) {
2782                             num_more = -9999; /*auto_moreのとき、全て流す。 */
2783                             break;
2784                         } else if (cmd == ' ') {
2785                             num_more = 0; /*1画面だけ流す。 */
2786                             break;
2787                         } else if ((cmd == '\n') || (cmd == '\r')) {
2788                             num_more--; /*1行だけ流す。 */
2789                             break;
2790                         }
2791                         if (quick_messages) break;
2792                         bell();
2793                 }
2794         }
2795
2796         /* Clear the line */
2797         Term_erase(0, 0, 255);
2798 }
2799
2800
2801 void msg_erase(void)
2802 {
2803         msg_print(NULL);
2804 }
2805
2806
2807 /*
2808  * Output a message to the top line of the screen.
2809  *
2810  * Break long messages into multiple pieces (40-72 chars).
2811  *
2812  * Allow multiple short messages to "share" the top line.
2813  *
2814  * Prompt the user to make sure he has a chance to read them.
2815  *
2816  * These messages are memorized for later reference (see above).
2817  *
2818  * We could do "Term_fresh()" to provide "flicker" if needed.
2819  *
2820  * The global "msg_flag" variable can be cleared to tell us to
2821  * "erase" any "pending" messages still on the screen.
2822  *
2823  * Note that we must be very careful about using the
2824  * "msg_print()" functions without explicitly calling the special
2825  * "msg_print(NULL)" function, since this may result in the loss
2826  * of information if the screen is cleared, or if anything is
2827  * displayed on the top line.
2828  *
2829  * Note that "msg_print(NULL)" will clear the top line
2830  * even if no messages are pending.  This is probably a hack.
2831  */
2832 void msg_print(concptr msg)
2833 {
2834         static int p = 0;
2835         int n;
2836         char *t;
2837         char buf[1024];
2838
2839         if (current_world_ptr->timewalk_m_idx) return;
2840
2841         /* Hack -- Reset */
2842         if (!msg_flag) {
2843                 /* Clear the line */
2844                 Term_erase(0, 0, 255);
2845                 p = 0;
2846         }
2847
2848         /* Original Message Length */
2849         n = (msg ? strlen(msg) : 0);
2850
2851         /* Hack -- flush when requested or needed */
2852         if (p && (!msg || ((p + n) > 72)))
2853         {
2854                 msg_flush(p);
2855
2856                 /* Forget it */
2857                 msg_flag = FALSE;
2858
2859                 /* Reset */
2860                 p = 0;
2861         }
2862
2863         /* No message */
2864         if (!msg) return;
2865         if (n > 1000) return;
2866
2867         /* Copy it */
2868         if (!cheat_turn)
2869         {
2870                 strcpy(buf, msg);
2871         }
2872         else
2873         {
2874                 sprintf(buf, ("T:%d - %s"), (int)current_world_ptr->game_turn, msg);
2875         }
2876
2877         /* New Message Length */
2878         n = strlen(buf);
2879
2880         /* Memorize the message */
2881         if (current_world_ptr->character_generated) message_add(buf);
2882
2883         /* Analyze the buffer */
2884         t = buf;
2885
2886         /* Split message */
2887         while (n > 72)
2888         {
2889                 char oops;
2890                 int check, split = 72;
2891
2892 #ifdef JP
2893                 bool k_flag = FALSE;
2894                 int wordlen = 0;
2895
2896                 /* Find the "best" split point */
2897                 for (check = 0; check < 72; check++)
2898                 {
2899                         if (k_flag)
2900                         {
2901                                 k_flag = FALSE;
2902                                 continue;
2903                         }
2904
2905                         /* Found a valid split point */
2906                         if (iskanji(t[check]))
2907                         {
2908                                 k_flag = TRUE;
2909                                 split = check;
2910                         }
2911                         else if (t[check] == ' ')
2912                         {
2913                                 split = check;
2914                                 wordlen = 0;
2915                         }
2916                         else
2917                         {
2918                                 wordlen++;
2919                                 if (wordlen > 20)
2920                                         split = check;
2921                         }
2922                 }
2923 #else
2924                 /* Find the "best" split point */
2925                 for (check = 40; check < 72; check++)
2926                 {
2927                         /* Found a valid split point */
2928                         if (t[check] == ' ') split = check;
2929                 }
2930 #endif
2931
2932                 /* Save the split character */
2933                 oops = t[split];
2934
2935                 /* Split the message */
2936                 t[split] = '\0';
2937
2938                 /* Display part of the message */
2939                 Term_putstr(0, 0, split, TERM_WHITE, t);
2940
2941                 /* Flush it */
2942                 msg_flush(split + 1);
2943
2944                 /* Memorize the piece */
2945                 /* if (current_world_ptr->character_generated) message_add(t); */
2946
2947                 /* Restore the split character */
2948                 t[split] = oops;
2949
2950                 /* Insert a space */
2951                 t[--split] = ' ';
2952
2953                 /* Prepare to recurse on the rest of "buf" */
2954                 t += split; n -= split;
2955         }
2956
2957         /* Display the tail of the message */
2958         Term_putstr(p, 0, n, TERM_WHITE, t);
2959
2960         /* Memorize the tail */
2961         /* if (current_world_ptr->character_generated) message_add(t); */
2962
2963         p_ptr->window |= (PW_MESSAGE);
2964         update_output();
2965
2966         /* Remember the message */
2967         msg_flag = TRUE;
2968
2969         /* Remember the position */
2970 #ifdef JP
2971         p += n;
2972 #else
2973         p += n + 1;
2974 #endif
2975
2976         /* Optional refresh */
2977         if (fresh_message) Term_fresh();
2978 }
2979
2980 void msg_print_wizard(int cheat_type, concptr msg)
2981 {
2982         if (!cheat_room && cheat_type == CHEAT_DUNGEON) return;
2983         if (!cheat_peek && cheat_type == CHEAT_OBJECT) return;
2984         if (!cheat_hear && cheat_type == CHEAT_MONSTER) return;
2985         if (!cheat_xtra && cheat_type == CHEAT_MISC) return;
2986
2987         concptr cheat_mes[] = {"ITEM", "MONS", "DUNG", "MISC"};
2988         char buf[1024];
2989         sprintf(buf, "WIZ-%s:%s", cheat_mes[cheat_type], msg);
2990         msg_print(buf);
2991
2992         if (cheat_diary_output)
2993         {
2994                 do_cmd_write_nikki(NIKKI_WIZARD_LOG, 0, buf);
2995         }
2996
2997 }
2998
2999 /*
3000  * Hack -- prevent "accidents" in "screen_save()" or "screen_load()"
3001  */
3002 static int screen_depth = 0;
3003
3004
3005 /*
3006  * Save the screen, and increase the "icky" depth.
3007  *
3008  * This function must match exactly one call to "screen_load()".
3009  */
3010 void screen_save(void)
3011 {
3012         /* Hack -- Flush messages */
3013         msg_print(NULL);
3014
3015         /* Save the screen (if legal) */
3016         if (screen_depth++ == 0) Term_save();
3017
3018         /* Increase "icky" depth */
3019         current_world_ptr->character_icky++;
3020 }
3021
3022
3023 /*
3024  * Load the screen, and decrease the "icky" depth.
3025  *
3026  * This function must match exactly one call to "screen_save()".
3027  */
3028 void screen_load(void)
3029 {
3030         /* Hack -- Flush messages */
3031         msg_print(NULL);
3032
3033         /* Load the screen (if legal) */
3034         if (--screen_depth == 0) Term_load();
3035
3036         /* Decrease "icky" depth */
3037         current_world_ptr->character_icky--;
3038 }
3039
3040
3041 /*
3042  * Display a formatted message, using "vstrnfmt()" and "msg_print()".
3043  */
3044 void msg_format(concptr fmt, ...)
3045 {
3046         va_list vp;
3047
3048         char buf[1024];
3049
3050         /* Begin the Varargs Stuff */
3051         va_start(vp, fmt);
3052
3053         /* Format the args, save the length */
3054         (void)vstrnfmt(buf, 1024, fmt, vp);
3055
3056         /* End the Varargs Stuff */
3057         va_end(vp);
3058
3059         /* Display */
3060         msg_print(buf);
3061 }
3062
3063 /*
3064  * Display a formatted message, using "vstrnfmt()" and "msg_print()".
3065  */
3066 void msg_format_wizard(int cheat_type, concptr fmt, ...)
3067 {
3068         if(!cheat_room && cheat_type == CHEAT_DUNGEON) return;
3069         if(!cheat_peek && cheat_type == CHEAT_OBJECT) return;
3070         if(!cheat_hear && cheat_type == CHEAT_MONSTER) return;
3071         if(!cheat_xtra && cheat_type == CHEAT_MISC) return;
3072
3073         va_list vp;
3074         char buf[1024];
3075
3076         /* Begin the Varargs Stuff */
3077         va_start(vp, fmt);
3078
3079         /* Format the args, save the length */
3080         (void)vstrnfmt(buf, 1024, fmt, vp);
3081
3082         /* End the Varargs Stuff */
3083         va_end(vp);
3084
3085         /* Display */
3086         msg_print_wizard(cheat_type, buf);
3087 }
3088
3089
3090
3091 /*
3092  * Display a string on the screen using an attribute.
3093  *
3094  * At the given location, using the given attribute, if allowed,
3095  * add the given string.  Do not clear the line.
3096  */
3097 void c_put_str(TERM_COLOR attr, concptr str, TERM_LEN row, TERM_LEN col)
3098 {
3099         /* Position cursor, Dump the attr/text */
3100         Term_putstr(col, row, -1, attr, str);
3101 }
3102
3103 /*
3104  * As above, but in "white"
3105  */
3106 void put_str(concptr str, TERM_LEN row, TERM_LEN col)
3107 {
3108         /* Spawn */
3109         Term_putstr(col, row, -1, TERM_WHITE, str);
3110 }
3111
3112
3113
3114 /*
3115  * Display a string on the screen using an attribute, and clear
3116  * to the end of the line.
3117  */
3118 void c_prt(TERM_COLOR attr, concptr str, TERM_LEN row, TERM_LEN col)
3119 {
3120         /* Clear line, position cursor */
3121         Term_erase(col, row, 255);
3122
3123         /* Dump the attr/text */
3124         Term_addstr(-1, attr, str);
3125 }
3126
3127 /*
3128  * As above, but in "white"
3129  */
3130 void prt(concptr str, TERM_LEN row, TERM_LEN col)
3131 {
3132         /* Spawn */
3133         c_prt(TERM_WHITE, str, row, col);
3134 }
3135
3136
3137
3138
3139 /*
3140  * Print some (colored) text to the screen at the current cursor position,
3141  * automatically "wrapping" existing text (at spaces) when necessary to
3142  * avoid placing any text into the last column, and clearing every line
3143  * before placing any text in that line.  Also, allow "newline" to force
3144  * a "wrap" to the next line.  Advance the cursor as needed so sequential
3145  * calls to this function will work correctly.
3146  *
3147  * Once this function has been called, the cursor should not be moved
3148  * until all the related "c_roff()" calls to the window are complete.
3149  *
3150  * This function will correctly handle any width up to the maximum legal
3151  * value of 256, though it works best for a standard 80 character width.
3152  */
3153 void c_roff(byte a, concptr str)
3154 {
3155         int x, y;
3156
3157         int w, h;
3158
3159         concptr s;
3160
3161         /* Obtain the size */
3162         (void)Term_get_size(&w, &h);
3163
3164         /* Obtain the cursor */
3165         (void)Term_locate(&x, &y);
3166
3167         /* Hack -- No more space */
3168         if( y == h - 1 && x > w - 3) return;
3169
3170         /* Process the string */
3171         for (s = str; *s; s++)
3172         {
3173                 char ch;
3174
3175 #ifdef JP
3176                 int k_flag = iskanji(*s);
3177 #endif
3178                 /* Force wrap */
3179                 if (*s == '\n')
3180                 {
3181                         /* Wrap */
3182                         x = 0;
3183                         y++;
3184
3185                         /* No more space */
3186                         if( y == h ) break;
3187
3188                         /* Clear line, move cursor */
3189                         Term_erase(x, y, 255);
3190
3191                         break;
3192                 }
3193
3194                 /* Clean up the char */
3195 #ifdef JP
3196                 ch = ((k_flag || isprint(*s)) ? *s : ' ');
3197 #else
3198                 ch = (isprint(*s) ? *s : ' ');
3199 #endif
3200
3201
3202                 /* Wrap words as needed */
3203 #ifdef JP
3204                 if (( x >= ( (k_flag) ? w - 2 : w - 1 ) ) && (ch != ' '))
3205 #else
3206                 if ((x >= w - 1) && (ch != ' '))
3207 #endif
3208
3209                 {
3210                         int i, n = 0;
3211
3212                         TERM_COLOR av[256];
3213                         char cv[256];
3214
3215                         /* Wrap word */
3216                         if (x < w)
3217 #ifdef JP
3218                         {
3219                         /* 現在が半角文字の場合 */
3220                         if( !k_flag )
3221 #endif
3222                         {
3223                                 /* Scan existing text */
3224                                 for (i = w - 2; i >= 0; i--)
3225                                 {
3226                                         /* Grab existing attr/char */
3227                                         Term_what(i, y, &av[i], &cv[i]);
3228
3229                                         /* Break on space */
3230                                         if (cv[i] == ' ') break;
3231
3232                                         /* Track current word */
3233                                         n = i;
3234 #ifdef JP
3235                                         if (cv[i] == '(') break;
3236 #endif
3237                                 }
3238                         }
3239
3240 #ifdef JP
3241                         else
3242                         {
3243                                 /* 現在が全角文字のとき */
3244                                 /* 文頭が「。」「、」等になるときは、その1つ前の語で改行 */
3245                                 if (strncmp(s, "。", 2) == 0 || strncmp(s, "、", 2) == 0
3246 #if 0                   /* 一般的には「ィ」「ー」は禁則の対象外 */
3247                                         || strncmp(s, "ィ", 2) == 0 || strncmp(s, "ー", 2) == 0
3248 #endif
3249                                ){
3250                                         Term_what(x  , y, &av[x  ], &cv[x  ]);
3251                                         Term_what(x-1, y, &av[x-1], &cv[x-1]);
3252                                         Term_what(x-2, y, &av[x-2], &cv[x-2]);
3253                                         n = x - 2;
3254                                         cv[ x ] = '\0';
3255                                 }
3256                         }
3257                         }
3258 #endif
3259                         /* Special case */
3260                         if (n == 0) n = w;
3261
3262                         /* Clear line */
3263                         Term_erase(n, y, 255);
3264
3265                         /* Wrap */
3266                         x = 0;
3267                         y++;
3268
3269                         /* No more space */
3270                         if( y == h ) break;
3271
3272                         /* Clear line, move cursor */
3273                         Term_erase(x, y, 255);
3274
3275                         /* Wrap the word (if any) */
3276                         for (i = n; i < w - 1; i++)
3277                         {
3278 #ifdef JP
3279                                 if( cv[i] == '\0' ) break;
3280 #endif
3281                                 /* Dump */
3282                                 Term_addch(av[i], cv[i]);
3283
3284                                 /* Advance (no wrap) */
3285                                 if (++x > w) x = w;
3286                         }
3287                 }
3288
3289                 /* Dump */
3290 #ifdef JP
3291                 Term_addch((byte)(a|0x10), ch);
3292 #else
3293                 Term_addch(a, ch);
3294 #endif
3295
3296
3297 #ifdef JP
3298                 if (k_flag)
3299                 {
3300                         s++;
3301                         x++;
3302                         ch = *s;
3303                         Term_addch((byte)(a|0x20), ch);
3304                 }
3305 #endif
3306                 /* Advance */
3307                 if (++x > w) x = w;
3308         }
3309 }
3310
3311 /*
3312  * As above, but in "white"
3313  */
3314 void roff(concptr str)
3315 {
3316         /* Spawn */
3317         c_roff(TERM_WHITE, str);
3318 }
3319
3320
3321
3322
3323 /*
3324  * Clear part of the screen
3325  */
3326 void clear_from(int row)
3327 {
3328         int y;
3329
3330         /* Erase requested rows */
3331         for (y = row; y < Term->hgt; y++)
3332         {
3333                 /* Erase part of the screen */
3334                 Term_erase(0, y, 255);
3335         }
3336 }
3337
3338
3339
3340
3341 /*
3342  * Get some string input at the cursor location.
3343  * Assume the buffer is initialized to a default string.
3344  *
3345  * The default buffer is in Overwrite mode and displayed in yellow at
3346  * first.  Normal chars clear the yellow text and append the char in
3347  * white text.
3348  *
3349  * LEFT (^B) and RIGHT (^F) movement keys move the cursor position.
3350  * If the text is still displayed in yellow (Overwite mode), it will
3351  * turns into white (Insert mode) when cursor moves.
3352  *
3353  * DELETE (^D) deletes a char at the cursor position.
3354  * BACKSPACE (^H) deletes a char at the left of cursor position.
3355  * ESCAPE clears the buffer and the window and returns FALSE.
3356  * RETURN accepts the current buffer contents and returns TRUE.
3357  */
3358 bool askfor_aux(char *buf, int len, bool numpad_cursor)
3359 {
3360         int y, x;
3361         int pos = 0;
3362
3363         /*
3364          * Text color
3365          * TERM_YELLOW : Overwrite mode
3366          * TERM_WHITE : Insert mode
3367          */
3368         byte color = TERM_YELLOW;
3369
3370         /* Locate the cursor position */
3371         Term_locate(&x, &y);
3372
3373         /* Paranoia -- check len */
3374         if (len < 1) len = 1;
3375
3376         /* Paranoia -- check column */
3377         if ((x < 0) || (x >= 80)) x = 0;
3378
3379         /* Restrict the length */
3380         if (x + len > 80) len = 80 - x;
3381
3382         /* Paranoia -- Clip the default entry */
3383         buf[len] = '\0';
3384
3385
3386         /* Process input */
3387         while (TRUE)
3388         {
3389                 int skey;
3390
3391                 /* Display the string */
3392                 Term_erase(x, y, len);
3393                 Term_putstr(x, y, -1, color, buf);
3394
3395                 /* Place cursor */
3396                 Term_gotoxy(x + pos, y);
3397
3398                 /* Get a special key code */
3399                 skey = inkey_special(numpad_cursor);
3400
3401                 /* Analyze the key */
3402                 switch (skey)
3403                 {
3404                 case SKEY_LEFT:
3405                 case KTRL('b'):
3406                 {
3407                         int i = 0;
3408
3409                         /* Now on insert mode */
3410                         color = TERM_WHITE;
3411
3412                         /* No move at beginning of line */
3413                         if (0 == pos) break;
3414
3415                         while (TRUE)
3416                         {
3417                                 int next_pos = i + 1;
3418
3419 #ifdef JP
3420                                 if (iskanji(buf[i])) next_pos++;
3421 #endif
3422
3423                                 /* Is there the cursor at next position? */ 
3424                                 if (next_pos >= pos) break;
3425
3426                                 /* Move to next */
3427                                 i = next_pos;
3428                         }
3429
3430                         /* Get previous position */
3431                         pos = i;
3432
3433                         break;
3434                 }
3435
3436                 case SKEY_RIGHT:
3437                 case KTRL('f'):
3438                         /* Now on insert mode */
3439                         color = TERM_WHITE;
3440
3441                         /* No move at end of line */
3442                         if ('\0' == buf[pos]) break;
3443
3444 #ifdef JP
3445                         /* Move right */
3446                         if (iskanji(buf[pos])) pos += 2;
3447                         else pos++;
3448 #else
3449                         pos++;
3450 #endif
3451
3452                         break;
3453
3454                 case ESCAPE:
3455                         /* Cancel input */
3456                         buf[0] = '\0';
3457                         return FALSE;
3458
3459                 case '\n':
3460                 case '\r':
3461                         /* Success */
3462                         return TRUE;
3463
3464                 case '\010':
3465                         /* Backspace */
3466                 {
3467                         int i = 0;
3468
3469                         /* Now on insert mode */
3470                         color = TERM_WHITE;
3471
3472                         /* No move at beginning of line */
3473                         if (0 == pos) break;
3474
3475                         while (TRUE)
3476                         {
3477                                 int next_pos = i + 1;
3478
3479 #ifdef JP
3480                                 if (iskanji(buf[i])) next_pos++;
3481 #endif
3482
3483                                 /* Is there the cursor at next position? */ 
3484                                 if (next_pos >= pos) break;
3485
3486                                 /* Move to next */
3487                                 i = next_pos;
3488                         }
3489
3490                         /* Get previous position */
3491                         pos = i;
3492
3493                         /* Fall through to 'Delete key' */
3494                 }
3495
3496                 case 0x7F:
3497                 case KTRL('d'):
3498                         /* Delete key */
3499                 {
3500                         int dst, src;
3501
3502                         /* Now on insert mode */
3503                         color = TERM_WHITE;
3504
3505                         /* No move at end of line */
3506                         if ('\0' == buf[pos]) break;
3507
3508                         /* Position of next character */
3509                         src = pos + 1;
3510
3511 #ifdef JP
3512                         /* Next character is one more byte away */
3513                         if (iskanji(buf[pos])) src++;
3514 #endif
3515
3516                         dst = pos;
3517
3518                         /* Move characters at src to dst */
3519                         while ('\0' != (buf[dst++] = buf[src++]))
3520                                 /* loop */;
3521
3522                         break;
3523                 }
3524
3525                 default:
3526                 {
3527                         /* Insert a character */
3528
3529                         char tmp[100];
3530                         char c;
3531
3532                         /* Ignore special keys */
3533                         if (skey & SKEY_MASK) break;
3534
3535                         /* Get a character code */
3536                         c = (char)skey;
3537
3538                         if (color == TERM_YELLOW)
3539                         {
3540                                 /* Overwrite default string */
3541                                 buf[0] = '\0';
3542
3543                                 /* Go to insert mode */
3544                                 color = TERM_WHITE;
3545                         }
3546
3547                         /* Save right part of string */
3548                         strcpy(tmp, buf + pos);
3549 #ifdef JP
3550                         if (iskanji(c))
3551                         {
3552                                 char next;
3553
3554                                 /* Bypass macro processing */
3555                                 inkey_base = TRUE;
3556                                 next = inkey();
3557
3558                                 if (pos + 1 < len)
3559                                 {
3560                                         buf[pos++] = c;
3561                                         buf[pos++] = next;
3562                                 }
3563                                 else
3564                                 {
3565                                         bell();
3566                                 }
3567                         }
3568                         else
3569 #endif
3570                         {
3571 #ifdef JP
3572                                 if (pos < len && (isprint(c) || iskana(c)))
3573 #else
3574                                 if (pos < len && isprint(c))
3575 #endif
3576                                 {
3577                                         buf[pos++] = c;
3578                                 }
3579                                 else
3580                                 {
3581                                         bell();
3582                                 }
3583                         }
3584
3585                         /* Terminate */
3586                         buf[pos] = '\0';
3587
3588                         /* Write back the left part of string */
3589                         my_strcat(buf, tmp, len + 1);
3590
3591                         break;
3592                 } /* default: */
3593
3594                 }
3595
3596         } /* while (TRUE) */
3597 }
3598
3599
3600 /*
3601  * Get some string input at the cursor location.
3602  *
3603  * Allow to use numpad keys as cursor keys.
3604  */
3605 bool askfor(char *buf, int len)
3606 {
3607         return askfor_aux(buf, len, TRUE);
3608 }
3609
3610
3611 /*
3612  * Get a string from the user
3613  *
3614  * The "prompt" should take the form "Prompt: "
3615  *
3616  * Note that the initial contents of the string is used as
3617  * the default response, so be sure to "clear" it if needed.
3618  *
3619  * We clear the input, and return FALSE, on "ESCAPE".
3620  */
3621 bool get_string(concptr prompt, char *buf, int len)
3622 {
3623         bool res;
3624         msg_print(NULL);
3625
3626         /* Display prompt */
3627         prt(prompt, 0, 0);
3628
3629         /* Ask the user for a string */
3630         res = askfor(buf, len);
3631
3632         /* Clear prompt */
3633         prt("", 0, 0);
3634         return (res);
3635 }
3636
3637
3638 /*
3639  * Verify something with the user
3640  *
3641  * The "prompt" should take the form "Query? "
3642  *
3643  * Note that "[y/n]" is appended to the prompt.
3644  */
3645 bool get_check(concptr prompt)
3646 {
3647         return get_check_strict(prompt, 0);
3648 }
3649
3650 /*
3651  * Verify something with the user strictly
3652  *
3653  * mode & CHECK_OKAY_CANCEL : force user to answer 'O'kay or 'C'ancel
3654  * mode & CHECK_NO_ESCAPE   : don't allow ESCAPE key
3655  * mode & CHECK_NO_HISTORY  : no message_add
3656  * mode & CHECK_DEFAULT_Y   : accept any key as y, except n and Esc.
3657  */
3658 bool get_check_strict(concptr prompt, BIT_FLAGS mode)
3659 {
3660         int i;
3661         char buf[80];
3662         bool flag = FALSE;
3663
3664         if (auto_more)
3665         {
3666                 p_ptr->window |= PW_MESSAGE;
3667                 handle_stuff();
3668                 num_more = 0;
3669         }
3670         msg_print(NULL);
3671
3672         if (!rogue_like_commands)
3673                 mode &= ~CHECK_OKAY_CANCEL;
3674
3675
3676         /* Hack -- Build a "useful" prompt */
3677         if (mode & CHECK_OKAY_CANCEL)
3678         {
3679                 my_strcpy(buf, prompt, sizeof(buf)-15);
3680                 strcat(buf, "[(O)k/(C)ancel]");
3681         }
3682         else if (mode & CHECK_DEFAULT_Y)
3683         {
3684                 my_strcpy(buf, prompt, sizeof(buf)-5);
3685                 strcat(buf, "[Y/n]");
3686         }
3687         else
3688         {
3689                 my_strcpy(buf, prompt, sizeof(buf)-5);
3690                 strcat(buf, "[y/n]");
3691         }
3692
3693         /* Prompt for it */
3694         prt(buf, 0, 0);
3695
3696         if (!(mode & CHECK_NO_HISTORY) && p_ptr->playing)
3697         {
3698                 /* HACK : Add the line to message buffer */
3699                 message_add(buf);
3700                 p_ptr->window |= (PW_MESSAGE);
3701                 handle_stuff();
3702         }
3703
3704         /* Get an acceptable answer */
3705         while (TRUE)
3706         {
3707                 i = inkey();
3708
3709                 if (!(mode & CHECK_NO_ESCAPE))
3710                 {
3711                         if (i == ESCAPE)
3712                         {
3713                                 flag = FALSE;
3714                                 break;
3715                         }
3716                 }
3717
3718                 if (mode & CHECK_OKAY_CANCEL)
3719                 {
3720                         if (i == 'o' || i == 'O')
3721                         {
3722                                 flag = TRUE;
3723                                 break;
3724                         }
3725                         else if (i == 'c' || i == 'C')
3726                         {
3727                                 flag = FALSE;
3728                                 break;
3729                         }
3730                 }
3731                 else
3732                 {
3733                         if (i == 'y' || i == 'Y')
3734                         {
3735                                 flag = TRUE;
3736                                 break;
3737                         }
3738                         else if (i == 'n' || i == 'N')
3739                         {
3740                                 flag = FALSE;
3741                                 break;
3742                         }
3743                 }
3744
3745                 if (mode & CHECK_DEFAULT_Y)
3746                 {
3747                         flag = TRUE;
3748                         break;
3749                 }
3750
3751                 bell();
3752         }
3753
3754         /* Erase the prompt */
3755         prt("", 0, 0);
3756
3757         /* Return the flag */
3758         return flag;
3759 }
3760
3761
3762 /*
3763  * Prompts for a keypress
3764  *
3765  * The "prompt" should take the form "Command: "
3766  *
3767  * Returns TRUE unless the character is "Escape"
3768  */
3769 bool get_com(concptr prompt, char *command, bool z_escape)
3770 {
3771         msg_print(NULL);
3772
3773         /* Display a prompt */
3774         prt(prompt, 0, 0);
3775
3776         /* Get a key */
3777         if (get_com_no_macros)
3778                 *command = (char)inkey_special(FALSE);
3779         else
3780                 *command = inkey();
3781
3782         /* Clear the prompt */
3783         prt("", 0, 0);
3784
3785         /* Handle "cancel" */
3786         if (*command == ESCAPE) return (FALSE);
3787         if (z_escape && ((*command == 'z') || (*command == 'Z'))) return (FALSE);
3788
3789         /* Success */
3790         return (TRUE);
3791 }
3792
3793
3794 /*
3795  * Request a "quantity" from the user
3796  *
3797  * Hack -- allow "command_arg" to specify a quantity
3798  */
3799 QUANTITY get_quantity(concptr prompt, QUANTITY max)
3800 {
3801         bool res, result;
3802         QUANTITY amt;
3803         char tmp[80];
3804         char buf[80];
3805         COMMAND_CODE code;
3806
3807
3808         /* Use "command_arg" */
3809         if (command_arg)
3810         {
3811                 /* Extract a number */
3812                 amt = command_arg;
3813
3814                 /* Clear "command_arg" */
3815                 command_arg = 0;
3816
3817                 /* Enforce the maximum */
3818                 if (amt > max) amt = max;
3819
3820                 /* Use it */
3821                 return (amt);
3822         }
3823
3824         /* Get the item index */
3825         result = repeat_pull(&code);
3826         amt = (QUANTITY)code;
3827         if ((max != 1) && result)
3828         {
3829                 /* Enforce the maximum */
3830                 if (amt > max) amt = max;
3831
3832                 /* Enforce the minimum */
3833                 if (amt < 0) amt = 0;
3834
3835                 /* Use it */
3836                 return (amt);
3837         }
3838
3839         /* Build a prompt if needed */
3840         if (!prompt)
3841         {
3842                 /* Build a prompt */
3843                 sprintf(tmp, _("いくつですか (1-%d): ", "Quantity (1-%d): "), max);
3844
3845                 /* Use that prompt */
3846                 prompt = tmp;
3847         }
3848         msg_print(NULL);
3849
3850         /* Display prompt */
3851         prt(prompt, 0, 0);
3852
3853         /* Default to one */
3854         amt = 1;
3855
3856         /* Build the default */
3857         sprintf(buf, "%d", amt);
3858
3859         /*
3860          * Ask for a quantity
3861          * Don't allow to use numpad as cursor key.
3862          */
3863         res = askfor_aux(buf, 6, FALSE);
3864
3865         /* Clear prompt */
3866         prt("", 0, 0);
3867
3868         /* Cancelled */
3869         if (!res) return 0;
3870
3871         /* Extract a number */
3872         amt = (COMMAND_CODE)atoi(buf);
3873
3874         /* A letter means "all" */
3875         if (isalpha(buf[0])) amt = max;
3876
3877         /* Enforce the maximum */
3878         if (amt > max) amt = max;
3879
3880         /* Enforce the minimum */
3881         if (amt < 0) amt = 0;
3882
3883         if (amt) repeat_push((COMMAND_CODE)amt);
3884
3885         /* Return the result */
3886         return (amt);
3887 }
3888
3889
3890 /*
3891  * Pause for user response 
3892  */
3893 void pause_line(int row)
3894 {
3895         prt("", row, 0);
3896         put_str(_("[ 何かキーを押して下さい ]", "[Press any key to continue]"), row, _(26, 23));
3897
3898         (void)inkey();
3899         prt("", row, 0);
3900 }
3901
3902
3903 /*
3904  * Hack -- special buffer to hold the action of the current keymap
3905  */
3906 static char request_command_buffer[256];
3907
3908
3909
3910 typedef struct
3911 {
3912         concptr name;
3913         byte cmd;
3914         bool fin;
3915 } menu_naiyou;
3916
3917 #ifdef JP
3918 menu_naiyou menu_info[10][10] =
3919 {
3920         {
3921                 {"魔法/特殊能力", 1, FALSE},
3922                 {"行動", 2, FALSE},
3923                 {"道具(使用)", 3, FALSE},
3924                 {"道具(その他)", 4, FALSE},
3925                 {"装備", 5, FALSE},
3926                 {"扉/箱", 6, FALSE},
3927                 {"情報", 7, FALSE},
3928                 {"設定", 8, FALSE},
3929                 {"その他", 9, FALSE},
3930                 {"", 0, FALSE},
3931         },
3932
3933         {
3934                 {"使う(m)", 'm', TRUE},
3935                 {"調べる(b/P)", 'b', TRUE},
3936                 {"覚える(G)", 'G', TRUE},
3937                 {"特殊能力を使う(U/O)", 'U', TRUE},
3938                 {"", 0, FALSE},
3939                 {"", 0, FALSE},
3940                 {"", 0, FALSE},
3941                 {"", 0, FALSE},
3942                 {"", 0, FALSE},
3943                 {"", 0, FALSE}
3944         },
3945
3946         {
3947                 {"休息する(R)", 'R', TRUE},
3948                 {"トラップ解除(D)", 'D', TRUE},
3949                 {"探す(s)", 's', TRUE},
3950                 {"周りを調べる(l/x)", 'l', TRUE},
3951                 {"ターゲット指定(*)", '*', TRUE},
3952                 {"穴を掘る(T/^t)", 'T', TRUE},
3953                 {"階段を上る(<)", '<', TRUE},
3954                 {"階段を下りる(>)", '>', TRUE},
3955                 {"ペットに命令する(p)", 'p', TRUE},
3956                 {"探索モードのON/OFF(S/#)", 'S', TRUE}
3957         },
3958
3959         {
3960                 {"読む(r)", 'r', TRUE},
3961                 {"飲む(q)", 'q', TRUE},
3962                 {"杖を使う(u/Z)", 'u', TRUE},
3963                 {"魔法棒で狙う(a/z)", 'a', TRUE},
3964                 {"ロッドを振る(z/a)", 'z', TRUE},
3965                 {"始動する(A)", 'A', TRUE},
3966                 {"食べる(E)", 'E', TRUE},
3967                 {"飛び道具で撃つ(f/t)", 'f', TRUE},
3968                 {"投げる(v)", 'v', TRUE},
3969                 {"", 0, FALSE}
3970         },
3971
3972         {
3973                 {"拾う(g)", 'g', TRUE},
3974                 {"落とす(d)", 'd', TRUE},
3975                 {"壊す(k/^d)", 'k', TRUE},
3976                 {"銘を刻む({)", '{', TRUE},
3977                 {"銘を消す(})", '}', TRUE},
3978                 {"調査(I)", 'I', TRUE},
3979                 {"アイテム一覧(i)", 'i', TRUE},
3980                 {"", 0, FALSE},
3981                 {"", 0, FALSE},
3982                 {"", 0, FALSE}
3983         },
3984
3985         {
3986                 {"装備する(w)", 'w', TRUE},
3987                 {"装備を外す(t/T)", 't', TRUE},
3988                 {"燃料を補給(F)", 'F', TRUE},
3989                 {"装備一覧(e)", 'e', TRUE},
3990                 {"", 0, FALSE},
3991                 {"", 0, FALSE},
3992                 {"", 0, FALSE},
3993                 {"", 0, FALSE},
3994                 {"", 0, FALSE},
3995                 {"", 0, FALSE}
3996         },
3997
3998         {
3999                 {"開ける(o)", 'o', TRUE},
4000                 {"閉じる(c)", 'c', TRUE},
4001                 {"体当たりする(B/f)", 'B', TRUE},
4002                 {"くさびを打つ(j/S)", 'j', TRUE},
4003                 {"", 0, FALSE},
4004                 {"", 0, FALSE},
4005                 {"", 0, FALSE},
4006                 {"", 0, FALSE},
4007                 {"", 0, FALSE},
4008                 {"", 0, FALSE}
4009         },
4010
4011         {
4012                 {"ダンジョンの全体図(M)", 'M', TRUE},
4013                 {"位置を確認(L/W)", 'L', TRUE},
4014                 {"階の雰囲気(^f)", KTRL('F'), TRUE},
4015                 {"ステータス(C)", 'C', TRUE},
4016                 {"文字の説明(/)", '/', TRUE},
4017                 {"メッセージ履歴(^p)", KTRL('P'), TRUE},
4018                 {"現在の時刻(^t/')", KTRL('T'), TRUE},
4019                 {"現在の知識(~)", '~', TRUE},
4020                 {"プレイ記録(|)", '|', TRUE},
4021                 {"", 0, FALSE}
4022         },
4023
4024         {
4025                 {"オプション(=)", '=', TRUE},
4026                 {"マクロ(@)", '@', TRUE},
4027                 {"画面表示(%)", '%', TRUE},
4028                 {"カラー(&)", '&', TRUE},
4029                 {"設定変更コマンド(\")", '\"', TRUE},
4030                 {"自動拾いをロード($)", '$', TRUE},
4031                 {"システム(!)", '!', TRUE},
4032                 {"", 0, FALSE},
4033                 {"", 0, FALSE},
4034                 {"", 0, FALSE}
4035         },
4036
4037         {
4038                 {"セーブ&中断(^x)", KTRL('X'), TRUE},
4039                 {"セーブ(^s)", KTRL('S'), TRUE},
4040                 {"ヘルプ(?)", '?', TRUE},
4041                 {"再描画(^r)", KTRL('R'), TRUE},
4042                 {"メモ(:)", ':', TRUE},
4043                 {"記念撮影())", ')', TRUE},
4044                 {"記念撮影の表示(()", '(', TRUE},
4045                 {"バージョン情報(V)", 'V', TRUE},
4046                 {"引退する(Q)", 'Q', TRUE},
4047                 {"", 0, FALSE}
4048         },
4049 };
4050 #else
4051 menu_naiyou menu_info[10][10] =
4052 {
4053         {
4054                 {"Magic/Special", 1, FALSE},
4055                 {"Action", 2, FALSE},
4056                 {"Items(use)", 3, FALSE},
4057                 {"Items(other)", 4, FALSE},
4058                 {"Equip", 5, FALSE},
4059                 {"Door/Box", 6, FALSE},
4060                 {"Informations", 7, FALSE},
4061                 {"Options", 8, FALSE},
4062                 {"Other commands", 9, FALSE},
4063                 {"", 0, FALSE},
4064         },
4065
4066         {
4067                 {"Use(m)", 'm', TRUE},
4068                 {"See tips(b/P)", 'b', TRUE},
4069                 {"Study(G)", 'G', TRUE},
4070                 {"Special abilities(U/O)", 'U', TRUE},
4071                 {"", 0, FALSE},
4072                 {"", 0, FALSE},
4073                 {"", 0, FALSE},
4074                 {"", 0, FALSE},
4075                 {"", 0, FALSE},
4076                 {"", 0, FALSE}
4077         },
4078
4079         {
4080                 {"Rest(R)", 'R', TRUE},
4081                 {"Disarm a trap(D)", 'D', TRUE},
4082                 {"Search(s)", 's', TRUE},
4083                 {"Look(l/x)", 'l', TRUE},
4084                 {"Target(*)", '*', TRUE},
4085                 {"Dig(T/^t)", 'T', TRUE},
4086                 {"Go up stairs(<)", '<', TRUE},
4087                 {"Go down stairs(>)", '>', TRUE},
4088                 {"Command pets(p)", 'p', TRUE},
4089                 {"Search mode ON/OFF(S/#)", 'S', TRUE}
4090         },
4091
4092         {
4093                 {"Read a scroll(r)", 'r', TRUE},
4094                 {"Drink a potion(q)", 'q', TRUE},
4095                 {"Use a staff(u/Z)", 'u', TRUE},
4096                 {"Aim a wand(a/z)", 'a', TRUE},
4097                 {"Zap a rod(z/a)", 'z', TRUE},
4098                 {"Activate an equipment(A)", 'A', TRUE},
4099                 {"Eat(E)", 'E', TRUE},
4100                 {"Fire missile weapon(f/t)", 'f', TRUE},
4101                 {"Throw an item(v)", 'v', TRUE},
4102                 {"", 0, FALSE}
4103         },
4104
4105         {
4106                 {"Get items(g)", 'g', TRUE},
4107                 {"Drop an item(d)", 'd', TRUE},
4108                 {"Destroy an item(k/^d)", 'k', TRUE},
4109                 {"Inscribe an item({)", '{', TRUE},
4110                 {"Uninscribe an item(})", '}', TRUE},
4111                 {"Info about an item(I)", 'I', TRUE},
4112                 {"Inventory list(i)", 'i', TRUE},
4113                 {"", 0, FALSE},
4114                 {"", 0, FALSE},
4115                 {"", 0, FALSE}
4116         },
4117
4118         {
4119                 {"Wear(w)", 'w', TRUE},
4120                 {"Take off(t/T)", 't', TRUE},
4121                 {"Refuel(F)", 'F', TRUE},
4122                 {"Equipment list(e)", 'e', TRUE},
4123                 {"", 0, FALSE},
4124                 {"", 0, FALSE},
4125                 {"", 0, FALSE},
4126                 {"", 0, FALSE},
4127                 {"", 0, FALSE},
4128                 {"", 0, FALSE}
4129         },
4130
4131         {
4132                 {"Open(o)", 'o', TRUE},
4133                 {"Close(c)", 'c', TRUE},
4134                 {"Bash a door(B/f)", 'B', TRUE},
4135                 {"Jam a door(j/S)", 'j', TRUE},
4136                 {"", 0, FALSE},
4137                 {"", 0, FALSE},
4138                 {"", 0, FALSE},
4139                 {"", 0, FALSE},
4140                 {"", 0, FALSE},
4141                 {"", 0, FALSE}
4142         },
4143
4144         {
4145                 {"Full map(M)", 'M', TRUE},
4146                 {"Map(L/W)", 'L', TRUE},
4147                 {"Level feeling(^f)", KTRL('F'), TRUE},
4148                 {"Character status(C)", 'C', TRUE},
4149                 {"Identify symbol(/)", '/', TRUE},
4150                 {"Show prev messages(^p)", KTRL('P'), TRUE},
4151                 {"Current time(^t/')", KTRL('T'), TRUE},
4152                 {"Various informations(~)", '~', TRUE},
4153                 {"Play record menu(|)", '|', TRUE},
4154                 {"", 0, FALSE}
4155         },
4156
4157         {
4158                 {"Set options(=)", '=', TRUE},
4159                 {"Interact with macros(@)", '@', TRUE},
4160                 {"Interact w/ visuals(%)", '%', TRUE},
4161                 {"Interact with colors(&)", '&', TRUE},
4162                 {"Enter a user pref(\")", '\"', TRUE},
4163                 {"Reload auto-pick pref($)", '$', TRUE},
4164                 {"", 0, FALSE},
4165                 {"", 0, FALSE},
4166                 {"", 0, FALSE},
4167                 {"", 0, FALSE}
4168         },
4169
4170         {
4171                 {"Save and quit(^x)", KTRL('X'), TRUE},
4172                 {"Save(^s)", KTRL('S'), TRUE},
4173                 {"Help(obsoleted)(?)", '?', TRUE},
4174                 {"Redraw(^r)", KTRL('R'), TRUE},
4175                 {"Take note(:)", ':', TRUE},
4176                 {"Dump screen dump(()", ')', TRUE},
4177                 {"Load screen dump())", '(', TRUE},
4178                 {"Version info(V)", 'V', TRUE},
4179                 {"Quit(Q)", 'Q', TRUE},
4180                 {"", 0, FALSE}
4181         },
4182 };
4183 #endif
4184
4185 typedef struct
4186 {
4187         concptr name;
4188         byte window;
4189         byte number;
4190         byte jouken;
4191         byte jouken_naiyou;
4192 } special_menu_naiyou;
4193
4194 #define MENU_CLASS 1
4195 #define MENU_WILD 2
4196
4197 #ifdef JP
4198 special_menu_naiyou special_menu_info[] =
4199 {
4200         {"超能力/特殊能力", 0, 0, MENU_CLASS, CLASS_MINDCRAFTER},
4201         {"ものまね/特殊能力", 0, 0, MENU_CLASS, CLASS_IMITATOR},
4202         {"歌/特殊能力", 0, 0, MENU_CLASS, CLASS_BARD},
4203         {"必殺技/特殊能力", 0, 0, MENU_CLASS, CLASS_SAMURAI},
4204         {"練気術/魔法/特殊能力", 0, 0, MENU_CLASS, CLASS_FORCETRAINER},
4205         {"技/特殊能力", 0, 0, MENU_CLASS, CLASS_BERSERKER},
4206         {"技術/特殊能力", 0, 0, MENU_CLASS, CLASS_SMITH},
4207         {"鏡魔法/特殊能力", 0, 0, MENU_CLASS, CLASS_MIRROR_MASTER},
4208         {"忍術/特殊能力", 0, 0, MENU_CLASS, CLASS_NINJA},
4209         {"広域マップ(<)", 2, 6, MENU_WILD, FALSE},
4210         {"通常マップ(>)", 2, 7, MENU_WILD, TRUE},
4211         {"", 0, 0, 0, 0},
4212 };
4213 #else
4214 special_menu_naiyou special_menu_info[] =
4215 {
4216         {"MindCraft/Special", 0, 0, MENU_CLASS, CLASS_MINDCRAFTER},
4217         {"Imitation/Special", 0, 0, MENU_CLASS, CLASS_IMITATOR},
4218         {"Song/Special", 0, 0, MENU_CLASS, CLASS_BARD},
4219         {"Technique/Special", 0, 0, MENU_CLASS, CLASS_SAMURAI},
4220         {"Mind/Magic/Special", 0, 0, MENU_CLASS, CLASS_FORCETRAINER},
4221         {"BrutalPower/Special", 0, 0, MENU_CLASS, CLASS_BERSERKER},
4222         {"Technique/Special", 0, 0, MENU_CLASS, CLASS_SMITH},
4223         {"MirrorMagic/Special", 0, 0, MENU_CLASS, CLASS_MIRROR_MASTER},
4224         {"Ninjutsu/Special", 0, 0, MENU_CLASS, CLASS_NINJA},
4225         {"Enter global map(<)", 2, 6, MENU_WILD, FALSE},
4226         {"Enter local map(>)", 2, 7, MENU_WILD, TRUE},
4227         {"", 0, 0, 0, 0},
4228 };
4229 #endif
4230
4231 static char inkey_from_menu(void)
4232 {
4233         char cmd;
4234         int basey, basex;
4235         int num = 0, max_num, old_num = 0;
4236         int menu = 0;
4237         bool kisuu;
4238
4239         if (p_ptr->y - panel_row_min > 10) basey = 2;
4240         else basey = 13;
4241         basex = 15;
4242
4243         /* Clear top line */
4244         prt("", 0, 0);
4245
4246         screen_save();
4247
4248         while(1)
4249         {
4250                 int i;
4251                 char sub_cmd;
4252                 concptr menu_name;
4253                 if (!menu) old_num = num;
4254                 put_str("+----------------------------------------------------+", basey, basex);
4255                 put_str("|                                                    |", basey+1, basex);
4256                 put_str("|                                                    |", basey+2, basex);
4257                 put_str("|                                                    |", basey+3, basex);
4258                 put_str("|                                                    |", basey+4, basex);
4259                 put_str("|                                                    |", basey+5, basex);
4260                 put_str("+----------------------------------------------------+", basey+6, basex);
4261
4262                 for(i = 0; i < 10; i++)
4263                 {
4264                         int hoge;
4265                         if (!menu_info[menu][i].cmd) break;
4266                         menu_name = menu_info[menu][i].name;
4267                         for(hoge = 0; ; hoge++)
4268                         {
4269                                 if (!special_menu_info[hoge].name[0]) break;
4270                                 if ((menu != special_menu_info[hoge].window) || (i != special_menu_info[hoge].number)) continue;
4271                                 switch(special_menu_info[hoge].jouken)
4272                                 {
4273                                 case MENU_CLASS:
4274                                         if (p_ptr->pclass == special_menu_info[hoge].jouken_naiyou) menu_name = special_menu_info[hoge].name;
4275                                         break;
4276                                 case MENU_WILD:
4277                                         if (!current_floor_ptr->dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest)
4278                                         {
4279                                                 if ((byte)p_ptr->wild_mode == special_menu_info[hoge].jouken_naiyou) menu_name = special_menu_info[hoge].name;
4280                                         }
4281                                         break;
4282                                 default:
4283                                         break;
4284                                 }
4285                         }
4286                         put_str(menu_name, basey + 1 + i / 2, basex + 4 + (i % 2) * 24);
4287                 }
4288                 max_num = i;
4289                 kisuu = max_num % 2;
4290                 put_str(_("》", "> "),basey + 1 + num / 2, basex + 2 + (num % 2) * 24);
4291
4292                 /* Place the cursor on the player */
4293                 move_cursor_relative(p_ptr->y, p_ptr->x);
4294
4295                 sub_cmd = inkey();
4296                 if ((sub_cmd == ' ') || (sub_cmd == 'x') || (sub_cmd == 'X') || (sub_cmd == '\r') || (sub_cmd == '\n'))
4297                 {
4298                         if (menu_info[menu][num].fin)
4299                         {
4300                                 cmd = menu_info[menu][num].cmd;
4301                                 use_menu = TRUE;
4302                                 break;
4303                         }
4304                         else
4305                         {
4306                                 menu = menu_info[menu][num].cmd;
4307                                 num = 0;
4308                                 basey += 2;
4309                                 basex += 8;
4310                         }
4311                 }
4312                 else if ((sub_cmd == ESCAPE) || (sub_cmd == 'z') || (sub_cmd == 'Z') || (sub_cmd == '0'))
4313                 {
4314                         if (!menu)
4315                         {
4316                                 cmd = ESCAPE;
4317                                 break;
4318                         }
4319                         else
4320                         {
4321                                 menu = 0;
4322                                 num = old_num;
4323                                 basey -= 2;
4324                                 basex -= 8;
4325                                 screen_load();
4326                                 screen_save();
4327                         }
4328                 }
4329                 else if ((sub_cmd == '2') || (sub_cmd == 'j') || (sub_cmd == 'J'))
4330                 {
4331                         if (kisuu)
4332                         {
4333                                 if (num % 2)
4334                                         num = (num + 2) % (max_num - 1);
4335                                 else
4336                                         num = (num + 2) % (max_num + 1);
4337                         }
4338                         else num = (num + 2) % max_num;
4339                 }
4340                 else if ((sub_cmd == '8') || (sub_cmd == 'k') || (sub_cmd == 'K'))
4341                 {
4342                         if (kisuu)
4343                         {
4344                                 if (num % 2)
4345                                         num = (num + max_num - 3) % (max_num - 1);
4346                                 else
4347                                         num = (num + max_num - 1) % (max_num + 1);
4348                         }
4349                         else num = (num + max_num - 2) % max_num;
4350                 }
4351                 else if ((sub_cmd == '4') || (sub_cmd == '6') || (sub_cmd == 'h') || (sub_cmd == 'H') || (sub_cmd == 'l') || (sub_cmd == 'L'))
4352                 {
4353                         if ((num % 2) || (num == max_num - 1))
4354                         {
4355                                 num--;
4356                         }
4357                         else if (num < max_num - 1)
4358                         {
4359                                 num++;
4360                         }
4361                 }
4362         }
4363
4364         screen_load();
4365         if (!inkey_next) inkey_next = "";
4366
4367         return (cmd);
4368 }
4369
4370 /*
4371  * Request a command from the user.
4372  *
4373  * Sets p_ptr->command_cmd, p_ptr->command_dir, p_ptr->command_rep,
4374  * p_ptr->command_arg.  May modify p_ptr->command_new.
4375  *
4376  * Note that "caret" ("^") is treated specially, and is used to
4377  * allow manual input of control characters.  This can be used
4378  * on many machines to request repeated tunneling (Ctrl-H) and
4379  * on the Macintosh to request "Control-Caret".
4380  *
4381  * Note that "backslash" is treated specially, and is used to bypass any
4382  * keymap entry for the following character.  This is useful for macros.
4383  *
4384  * Note that this command is used both in the dungeon and in
4385  * stores, and must be careful to work in both situations.
4386  *
4387  * Note that "p_ptr->command_new" may not work any more.  
4388  */
4389 void request_command(int shopping)
4390 {
4391         int i;
4392
4393         s16b cmd;
4394         int mode;
4395
4396         concptr act;
4397
4398 #ifdef JP
4399         int caretcmd = 0;
4400 #endif
4401         /* Roguelike */
4402         if (rogue_like_commands)
4403         {
4404                 mode = KEYMAP_MODE_ROGUE;
4405         }
4406
4407         /* Original */
4408         else
4409         {
4410                 mode = KEYMAP_MODE_ORIG;
4411         }
4412
4413
4414         /* No command yet */
4415         command_cmd = 0;
4416
4417         /* No "argument" yet */
4418         command_arg = 0;
4419
4420         /* No "direction" yet */
4421         command_dir = 0;
4422
4423         use_menu = FALSE;
4424
4425
4426         /* Get command */
4427         while (1)
4428         {
4429                 /* Hack -- auto-commands */
4430                 if (command_new)
4431                 {
4432                         msg_erase();
4433
4434                         /* Use auto-command */
4435                         cmd = command_new;
4436
4437                         /* Forget it */
4438                         command_new = 0;
4439                 }
4440
4441                 /* Get a keypress in "command" mode */
4442                 else
4443                 {
4444                         /* Hack -- no flush needed */
4445                         msg_flag = FALSE;
4446                         num_more = 0;
4447
4448                         /* Activate "command mode" */
4449                         inkey_flag = TRUE;
4450
4451                         cmd = inkey();
4452
4453                         if (!shopping && command_menu && ((cmd == '\r') || (cmd == '\n') || (cmd == 'x') || (cmd == 'X'))
4454                             && !keymap_act[mode][(byte)(cmd)])
4455                                 cmd = inkey_from_menu();
4456                 }
4457
4458                 /* Clear top line */
4459                 prt("", 0, 0);
4460
4461
4462                 /* Command Count */
4463                 if (cmd == '0')
4464                 {
4465                         COMMAND_ARG old_arg = command_arg;
4466
4467                         /* Reset */
4468                         command_arg = 0;
4469
4470                         /* Begin the input */
4471                         prt(_("回数: ", "Count: "), 0, 0);
4472
4473                         /* Get a command count */
4474                         while (1)
4475                         {
4476                                 /* Get a new keypress */
4477                                 cmd = inkey();
4478
4479                                 /* Simple editing (delete or backspace) */
4480                                 if ((cmd == 0x7F) || (cmd == KTRL('H')))
4481                                 {
4482                                         /* Delete a digit */
4483                                         command_arg = command_arg / 10;
4484
4485                                         /* Show current count */
4486                                         prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
4487                                 }
4488
4489                                 /* Actual numeric data */
4490                                 else if (cmd >= '0' && cmd <= '9')
4491                                 {
4492                                         /* Stop count at 9999 */
4493                                         if (command_arg >= 1000)
4494                                         {
4495                                                 /* Warn */
4496                                                 bell();
4497
4498                                                 /* Limit */
4499                                                 command_arg = 9999;
4500                                         }
4501
4502                                         /* Increase count */
4503                                         else
4504                                         {
4505                                                 /* Incorporate that digit */
4506                                                 command_arg = command_arg * 10 + D2I(cmd);
4507                                         }
4508
4509                                         /* Show current count */
4510                                         prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
4511                                 }
4512
4513                                 /* Exit on "unusable" input */
4514                                 else
4515                                 {
4516                                         break;
4517                                 }
4518                         }
4519
4520                         /* Hack -- Handle "zero" */
4521                         if (command_arg == 0)
4522                         {
4523                                 /* Default to 99 */
4524                                 command_arg = 99;
4525
4526                                 /* Show current count */
4527                                 prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
4528                         }
4529
4530                         /* Hack -- Handle "old_arg" */
4531                         if (old_arg != 0)
4532                         {
4533                                 /* Restore old_arg */
4534                                 command_arg = old_arg;
4535
4536                                 /* Show current count */
4537                                 prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
4538                         }
4539
4540                         /* Hack -- white-space means "enter command now" */
4541                         if ((cmd == ' ') || (cmd == '\n') || (cmd == '\r'))
4542                         {
4543                                 /* Get a real command */
4544                                 if (!get_com(_("コマンド: ", "Command: "), (char *)&cmd, FALSE))
4545                                 {
4546                                         /* Clear count */
4547                                         command_arg = 0;
4548                                         continue;
4549                                 }
4550                         }
4551                 }
4552
4553
4554                 /* Allow "keymaps" to be bypassed */
4555                 if (cmd == '\\')
4556                 {
4557                         /* Get a real command */
4558                         (void)get_com(_("コマンド: ", "Command: "), (char *)&cmd, FALSE);
4559
4560                         /* Hack -- bypass keymaps */
4561                         if (!inkey_next) inkey_next = "";
4562                 }
4563
4564
4565                 /* Allow "control chars" to be entered */
4566                 if (cmd == '^')
4567                 {
4568                         /* Get a new command and controlify it */
4569                         if (get_com(_("CTRL: ", "Control: "), (char *)&cmd, FALSE)) cmd = KTRL(cmd);
4570                 }
4571
4572
4573                 /* Look up applicable keymap */
4574                 act = keymap_act[mode][(byte)(cmd)];
4575
4576                 /* Apply keymap if not inside a keymap already */
4577                 if (act && !inkey_next)
4578                 {
4579                         /* Install the keymap (limited buffer size) */
4580                         (void)strnfmt(request_command_buffer, 256, "%s", act);
4581
4582                         /* Start using the buffer */
4583                         inkey_next = request_command_buffer;
4584                         continue;
4585                 }
4586
4587                 if (!cmd) continue;
4588
4589
4590                 /* Use command */
4591                 command_cmd = (byte)cmd;
4592
4593                 break;
4594         }
4595
4596         /* Hack -- Auto-repeat certain commands */
4597         if (always_repeat && (command_arg <= 0))
4598         {
4599                 /* Hack -- auto repeat certain commands */
4600                 if (my_strchr("TBDoc+", (char)command_cmd))
4601                 {
4602                         /* Repeat 99 times */
4603                         command_arg = 99;
4604                 }
4605         }
4606
4607         /* Shopping */
4608         if (shopping == 1)
4609         {
4610                 /* Convert */
4611                 switch (command_cmd)
4612                 {
4613                         /* Command "p" -> "purchase" (get) */
4614                 case 'p': command_cmd = 'g'; break;
4615
4616                         /* Command "m" -> "purchase" (get) */
4617                 case 'm': command_cmd = 'g'; break;
4618
4619                         /* Command "s" -> "sell" (drop) */
4620                 case 's': command_cmd = 'd'; break;
4621                 }
4622         }
4623
4624 #ifdef JP
4625         for (i = 0; i < 256; i++)
4626         {
4627                 concptr s;
4628                 if ((s = keymap_act[mode][i]) != NULL)
4629                 {
4630                         if (*s == command_cmd && *(s+1) == 0)
4631                         {
4632                                 caretcmd = i;
4633                                 break;
4634                         }
4635                 }
4636         }
4637         if (!caretcmd)
4638                 caretcmd = command_cmd;
4639 #endif
4640
4641         /* Hack -- Scan equipment */
4642         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4643         {
4644                 concptr s;
4645
4646                 object_type *o_ptr = &p_ptr->inventory_list[i];
4647                 if (!o_ptr->k_idx) continue;
4648
4649                 /* No inscription */
4650                 if (!o_ptr->inscription) continue;
4651
4652                 /* Obtain the inscription */
4653                 s = quark_str(o_ptr->inscription);
4654
4655                 /* Find a '^' */
4656                 s = my_strchr(s, '^');
4657
4658                 /* Process preventions */
4659                 while (s)
4660                 {
4661                         /* Check the "restriction" character */
4662 #ifdef JP
4663                         if ((s[1] == caretcmd) || (s[1] == '*'))
4664 #else
4665                         if ((s[1] == command_cmd) || (s[1] == '*'))
4666 #endif
4667
4668                         {
4669                                 /* Hack -- Verify command */
4670                                 if (!get_check(_("本当ですか? ", "Are you sure? ")))
4671                                 {
4672                                         /* Hack -- Use space */
4673                                         command_cmd = ' ';
4674                                 }
4675                         }
4676
4677                         /* Find another '^' */
4678                         s = my_strchr(s + 1, '^');
4679                 }
4680         }
4681
4682
4683         /* Hack -- erase the message line. */
4684         prt("", 0, 0);
4685 }
4686
4687
4688
4689 /*
4690  * Check a char for "vowel-hood"
4691  */
4692 bool is_a_vowel(int ch)
4693 {
4694         switch (ch)
4695         {
4696         case 'a':
4697         case 'e':
4698         case 'i':
4699         case 'o':
4700         case 'u':
4701         case 'A':
4702         case 'E':
4703         case 'I':
4704         case 'O':
4705         case 'U':
4706                 return (TRUE);
4707         }
4708
4709         return (FALSE);
4710 }
4711
4712
4713
4714 #if 0
4715
4716 /*
4717  * Replace the first instance of "target" in "buf" with "insert"
4718  * If "insert" is NULL, just remove the first instance of "target"
4719  * In either case, return TRUE if "target" is found.
4720  *
4721  * XXX Could be made more efficient, especially in the
4722  * case where "insert" is smaller than "target".
4723  */
4724 static bool insert_str(char *buf, concptr target, concptr insert)
4725 {
4726         int   i, len;
4727         int                b_len, t_len, i_len;
4728
4729         /* Attempt to find the target (modify "buf") */
4730         buf = my_strstr(buf, target);
4731
4732         /* No target found */
4733         if (!buf) return (FALSE);
4734
4735         /* Be sure we have an insertion string */
4736         if (!insert) insert = "";
4737
4738         /* Extract some lengths */
4739         t_len = strlen(target);
4740         i_len = strlen(insert);
4741         b_len = strlen(buf);
4742
4743         /* How much "movement" do we need? */
4744         len = i_len - t_len;
4745
4746         /* We need less space (for insert) */
4747         if (len < 0)
4748         {
4749                 for (i = t_len; i < b_len; ++i) buf[i+len] = buf[i];
4750         }
4751
4752         /* We need more space (for insert) */
4753         else if (len > 0)
4754         {
4755                 for (i = b_len-1; i >= t_len; --i) buf[i+len] = buf[i];
4756         }
4757
4758         /* If movement occured, we need a new terminator */
4759         if (len) buf[b_len+len] = '\0';
4760
4761         /* Now copy the insertion string */
4762         for (i = 0; i < i_len; ++i) buf[i] = insert[i];
4763
4764         /* Successful operation */
4765         return (TRUE);
4766 }
4767
4768
4769 #endif
4770
4771
4772 /*
4773  * GH
4774  * Called from cmd4.c and a few other places. Just extracts
4775  * a direction from the keymap for ch (the last direction,
4776  * in fact) byte or char here? I'm thinking that keymaps should
4777  * generally only apply to single keys, which makes it no more
4778  * than 128, so a char should suffice... but keymap_act is 256...
4779  */
4780 int get_keymap_dir(char ch)
4781 {
4782         int d = 0;
4783
4784         /* Already a direction? */
4785         if (isdigit(ch))
4786         {
4787                 d = D2I(ch);
4788         }
4789         else
4790         {
4791                 BIT_FLAGS mode;
4792                 concptr act, s;
4793
4794                 /* Roguelike */
4795                 if (rogue_like_commands)
4796                 {
4797                         mode = KEYMAP_MODE_ROGUE;
4798                 }
4799
4800                 /* Original */
4801                 else
4802                 {
4803                         mode = KEYMAP_MODE_ORIG;
4804                 }
4805
4806                 /* Extract the action (if any) */
4807                 act = keymap_act[mode][(byte)(ch)];
4808
4809                 /* Analyze */
4810                 if (act)
4811                 {
4812                         /* Convert to a direction */
4813                         for (s = act; *s; ++s)
4814                         {
4815                                 /* Use any digits in keymap */
4816                                 if (isdigit(*s)) d = D2I(*s);
4817                         }
4818                 }
4819         }
4820         if (d == 5) d = 0;
4821
4822         /* Return direction */
4823         return (d);
4824 }
4825
4826
4827 #define REPEAT_MAX              20
4828
4829 /* Number of chars saved */
4830 static int repeat__cnt = 0;
4831
4832 /* Current index */
4833 static int repeat__idx = 0;
4834
4835 /* Saved "stuff" */
4836 static COMMAND_CODE repeat__key[REPEAT_MAX];
4837
4838
4839 void repeat_push(COMMAND_CODE what)
4840 {
4841         /* Too many keys */
4842         if (repeat__cnt == REPEAT_MAX) return;
4843
4844         /* Push the "stuff" */
4845         repeat__key[repeat__cnt++] = what;
4846
4847         /* Prevents us from pulling keys */
4848         ++repeat__idx;
4849 }
4850
4851
4852 bool repeat_pull(COMMAND_CODE *what)
4853 {
4854         /* All out of keys */
4855         if (repeat__idx == repeat__cnt) return (FALSE);
4856
4857         /* Grab the next key, advance */
4858         *what = repeat__key[repeat__idx++];
4859
4860         /* Success */
4861         return (TRUE);
4862 }
4863
4864 void repeat_check(void)
4865 {
4866         COMMAND_CODE what;
4867
4868         /* Ignore some commands */
4869         if (command_cmd == ESCAPE) return;
4870         if (command_cmd == ' ') return;
4871         if (command_cmd == '\r') return;
4872         if (command_cmd == '\n') return;
4873
4874         /* Repeat Last Command */
4875         if (command_cmd == 'n')
4876         {
4877                 /* Reset */
4878                 repeat__idx = 0;
4879
4880                 /* Get the command */
4881                 if (repeat_pull(&what))
4882                 {
4883                         /* Save the command */
4884                         command_cmd = what;
4885                 }
4886         }
4887
4888         /* Start saving new command */
4889         else
4890         {
4891                 /* Reset */
4892                 repeat__cnt = 0;
4893                 repeat__idx = 0;
4894
4895                 what = command_cmd;
4896
4897                 /* Save this command */
4898                 repeat_push(what);
4899         }
4900 }
4901
4902
4903 #ifdef SORT_R_INFO
4904
4905 /*
4906  * Array size for which InsertionSort
4907  * is used instead of QuickSort
4908  */
4909 #define CUTOFF 4
4910
4911
4912 /*
4913  * Exchange two sort-entries
4914  * (should probably be coded inline
4915  * for speed increase)
4916  */
4917 static void swap(tag_type *a, tag_type *b)
4918 {
4919         tag_type temp;
4920
4921         temp = *a;
4922         *a = *b;
4923         *b = temp;
4924 }
4925
4926
4927 /*
4928  * Insertion-Sort algorithm
4929  * (used by the Quicksort algorithm)
4930  */
4931 static void InsertionSort(tag_type elements[], int number)
4932 {
4933         int j, P;
4934
4935         tag_type tmp;
4936
4937         for (P = 1; P < number; P++)
4938         {
4939                 tmp = elements[P];
4940                 for (j = P; (j > 0) && (elements[j - 1].tag > tmp.tag); j--)
4941                         elements[j] = elements[j - 1];
4942                 elements[j] = tmp;
4943         }
4944 }
4945
4946
4947 /*
4948  * Helper function for Quicksort
4949  */
4950 static tag_type median3(tag_type elements[], int left, int right)
4951 {
4952         int center = (left + right) / 2;
4953
4954         if (elements[left].tag > elements[center].tag)
4955                 swap(&elements[left], &elements[center]);
4956         if (elements[left].tag > elements[right].tag)
4957                 swap(&elements[left], &elements[right]);
4958         if (elements[center].tag > elements[right].tag)
4959                 swap(&elements[center], &elements[right]);
4960
4961         swap(&elements[center], &elements[right - 1]);
4962         return (elements[right - 1]);
4963 }
4964
4965
4966 /*
4967  * Quicksort algorithm
4968  *
4969  * The "median of three" pivot selection eliminates
4970  * the bad case of already sorted input.
4971  *
4972  * We use InsertionSort for smaller sub-arrays,
4973  * because it is faster in this case.
4974  *
4975  * For details see: "Data Structures and Algorithm
4976  * Analysis in C" by Mark Allen Weiss.
4977  */
4978 static void quicksort(tag_type elements[], int left, int right)
4979 {
4980         int i, j;
4981         tag_type pivot;
4982
4983         if (left + CUTOFF <= right)
4984         {
4985                 pivot = median3(elements, left, right);
4986
4987                 i = left; j = right -1;
4988
4989                 while (TRUE)
4990                 {
4991                         while (elements[++i].tag < pivot.tag);
4992                         while (elements[--j].tag > pivot.tag);
4993
4994                         if (i < j)
4995                                 swap(&elements[i], &elements[j]);
4996                         else
4997                                 break;
4998                 }
4999
5000                 /* Restore pivot */
5001                 swap(&elements[i], &elements[right - 1]);
5002
5003                 quicksort(elements, left, i - 1);
5004                 quicksort(elements, i + 1, right);
5005         }
5006         else
5007         {
5008                 /* Use InsertionSort on small arrays */
5009                 InsertionSort(elements + left, right - left + 1);
5010         }
5011 }
5012
5013
5014 /*
5015  * Frontend for the sorting algorithm
5016  *
5017  * Sorts an array of tagged pointers
5018  * with <number> elements.
5019  */
5020 void tag_sort(tag_type elements[], int number)
5021 {
5022         quicksort(elements, 0, number - 1);
5023 }
5024
5025 #endif /* SORT_R_INFO */
5026
5027 #ifdef SUPPORT_GAMMA
5028
5029 /* Table of gamma values */
5030 byte gamma_table[256];
5031
5032 /* Table of ln(x/256) * 256 for x going from 0 -> 255 */
5033 static s16b gamma_helper[256] =
5034 {
5035 0,-1420,-1242,-1138,-1065,-1007,-961,-921,-887,-857,-830,-806,-783,-762,-744,-726,
5036 -710,-694,-679,-666,-652,-640,-628,-617,-606,-596,-586,-576,-567,-577,-549,-541,
5037 -532,-525,-517,-509,-502,-495,-488,-482,-475,-469,-463,-457,-451,-455,-439,-434,
5038 -429,-423,-418,-413,-408,-403,-398,-394,-389,-385,-380,-376,-371,-367,-363,-359,
5039 -355,-351,-347,-343,-339,-336,-332,-328,-325,-321,-318,-314,-311,-308,-304,-301,
5040 -298,-295,-291,-288,-285,-282,-279,-276,-273,-271,-268,-265,-262,-259,-257,-254,
5041 -251,-248,-246,-243,-241,-238,-236,-233,-231,-228,-226,-223,-221,-219,-216,-214,
5042 -212,-209,-207,-205,-203,-200,-198,-196,-194,-192,-190,-188,-186,-184,-182,-180,
5043 -178,-176,-174,-172,-170,-168,-166,-164,-162,-160,-158,-156,-155,-153,-151,-149,
5044 -147,-146,-144,-142,-140,-139,-137,-135,-134,-132,-130,-128,-127,-125,-124,-122,
5045 -120,-119,-117,-116,-114,-112,-111,-109,-108,-106,-105,-103,-102,-100,-99,-97,
5046 -96,-95,-93,-92,-90,-89,-87,-86,-85,-83,-82,-80,-79,-78,-76,-75,
5047 -74,-72,-71,-70,-68,-67,-66,-65,-63,-62,-61,-59,-58,-57,-56,-54,
5048 -53,-52,-51,-50,-48,-47,-46,-45,-44,-42,-41,-40,-39,-38,-37,-35,
5049 -34,-33,-32,-31,-30,-29,-27,-26,-25,-24,-23,-22,-21,-20,-19,-18,
5050 -17,-16,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1
5051 };
5052
5053
5054 /* 
5055  * Build the gamma table so that floating point isn't needed.
5056  * 
5057  * Note gamma goes from 0->256.  The old value of 100 is now 128.
5058  */
5059 void build_gamma_table(int gamma)
5060 {
5061         int i, n;
5062         
5063         /*
5064          * value is the current sum.
5065          * diff is the new term to add to the series.
5066          */
5067         long value, diff;
5068         
5069         /* Hack - convergence is bad in these cases. */
5070         gamma_table[0] = 0;
5071         gamma_table[255] = 255;
5072         
5073         for (i = 1; i < 255; i++)
5074         {
5075                 /* 
5076                  * Initialise the Taylor series
5077                  *
5078                  * value and diff have been scaled by 256
5079                  */
5080                 
5081                 n = 1;
5082                 value = 256 * 256;
5083                 diff = ((long)gamma_helper[i]) * (gamma - 256);
5084                 
5085                 while (diff)
5086                 {
5087                         value += diff;
5088                         n++;
5089                         
5090                         
5091                         /*
5092                          * Use the following identiy to calculate the gamma table.
5093                          * exp(x) = 1 + x + x^2/2 + x^3/(2*3) + x^4/(2*3*4) +...
5094                          *
5095                          * n is the current term number.
5096                          * 
5097                          * The gamma_helper array contains a table of
5098                          * ln(x/256) * 256
5099                          * This is used because a^b = exp(b*ln(a))
5100                          *
5101                          * In this case:
5102                          * a is i / 256
5103                          * b is gamma.
5104                          *
5105                          * Note that everything is scaled by 256 for accuracy,
5106                          * plus another factor of 256 for the final result to
5107                          * be from 0-255.  Thus gamma_helper[] * gamma must be
5108                          * divided by 256*256 each itteration, to get back to
5109                          * the original power series.
5110                          */
5111                         diff = (((diff / 256) * gamma_helper[i]) * (gamma - 256)) / (256 * n);
5112                 }
5113                 
5114                 /* 
5115                  * Store the value in the table so that the
5116                  * floating point pow function isn't needed .
5117                  */
5118                 gamma_table[i] = ((long)(value / 256) * i) / 256;
5119         }
5120 }
5121
5122 #endif /* SUPPORT_GAMMA */
5123
5124
5125 /*
5126  * Add a series of keypresses to the "queue".
5127  *
5128  * Return any errors generated by Term_keypress() in doing so, or SUCCESS
5129  * if there are none.
5130  *
5131  * Catch the "out of space" error before anything is printed.
5132  *
5133  * NB: The keys added here will be interpreted by any macros or keymaps.
5134  */
5135 errr type_string(concptr str, uint len)
5136 {
5137         errr err = 0;
5138         concptr s;
5139
5140         term *old = Term;
5141
5142         /* Paranoia - no string. */
5143         if (!str) return -1;
5144
5145         /* Hack - calculate the string length here if none given. */
5146         if (!len) len = strlen(str);
5147
5148         /* Activate the main window, as all pastes go there. */
5149         Term_activate(term_screen);
5150
5151         for (s = str; s < str+len; s++)
5152         {
5153                 /* Catch end of string */
5154                 if (*s == '\0') break;
5155
5156                 err = Term_keypress(*s);
5157
5158                 /* Catch errors */
5159                 if (err) break;
5160         }
5161
5162         /* Activate the original window. */
5163         Term_activate(old);
5164
5165         return err;
5166 }
5167
5168
5169
5170 void roff_to_buf(concptr str, int maxlen, char *tbuf, size_t bufsize)
5171 {
5172         int read_pt = 0;
5173         int write_pt = 0;
5174         int line_len = 0;
5175         int word_punct = 0;
5176         char ch[3];
5177         ch[2] = '\0';
5178
5179         while (str[read_pt])
5180         {
5181 #ifdef JP
5182                 bool kinsoku = FALSE;
5183                 bool kanji;
5184 #endif
5185                 int ch_len = 1;
5186
5187                 /* Prepare one character */
5188                 ch[0] = str[read_pt];
5189                 ch[1] = '\0';
5190 #ifdef JP
5191                 kanji  = iskanji(ch[0]);
5192
5193                 if (kanji)
5194                 {
5195                         ch[1] = str[read_pt+1];
5196                         ch_len = 2;
5197
5198                         if (strcmp(ch, "。") == 0 ||
5199                             strcmp(ch, "、") == 0 ||
5200                             strcmp(ch, "ィ") == 0 ||
5201                             strcmp(ch, "ー") == 0)
5202                                 kinsoku = TRUE;
5203                 }
5204                 else if (!isprint(ch[0]))
5205                         ch[0] = ' ';
5206 #else
5207                 if (!isprint(ch[0]))
5208                         ch[0] = ' ';
5209 #endif
5210
5211                 if (line_len + ch_len > maxlen - 1 || str[read_pt] == '\n')
5212                 {
5213                         int word_len;
5214
5215                         /* return to better wrapping point. */
5216                         /* Space character at the end of the line need not to be printed. */
5217                         word_len = read_pt - word_punct;
5218 #ifdef JP
5219                         if (kanji && !kinsoku)
5220                                 /* nothing */ ;
5221                         else
5222 #endif
5223                         if (ch[0] == ' ' || word_len >= line_len/2)
5224                                 read_pt++;
5225                         else
5226                         {
5227                                 read_pt = word_punct;
5228                                 if (str[word_punct] == ' ')
5229                                         read_pt++;
5230                                 write_pt -= word_len;
5231                         }
5232
5233                         tbuf[write_pt++] = '\0';
5234                         line_len = 0;
5235                         word_punct = read_pt;
5236                         continue;
5237                 }
5238                 if (ch[0] == ' ')
5239                         word_punct = read_pt;
5240 #ifdef JP
5241                 if (!kinsoku) word_punct = read_pt;
5242 #endif
5243
5244                 /* Not enough buffer size */
5245                 if ((size_t)(write_pt + 3) >= bufsize) break;
5246
5247                 tbuf[write_pt++] = ch[0];
5248                 line_len++;
5249                 read_pt++;
5250 #ifdef JP
5251                 if (kanji)
5252                 {
5253                         tbuf[write_pt++] = ch[1];
5254                         line_len++;
5255                         read_pt++;
5256                 }
5257 #endif
5258         }
5259         tbuf[write_pt] = '\0';
5260         tbuf[write_pt+1] = '\0';
5261
5262         return;
5263 }
5264
5265
5266 /*
5267  * The my_strcpy() function copies up to 'bufsize'-1 characters from 'src'
5268  * to 'buf' and NUL-terminates the result.  The 'buf' and 'src' strings may
5269  * not overlap.
5270  *
5271  * my_strcpy() returns strlen(src).  This makes checking for truncation
5272  * easy.  Example: if (my_strcpy(buf, src, sizeof(buf)) >= sizeof(buf)) ...;
5273  *
5274  * This function should be equivalent to the strlcpy() function in BSD.
5275  */
5276 size_t my_strcpy(char *buf, concptr src, size_t bufsize)
5277 {
5278 #ifdef JP
5279
5280         char *d = buf;
5281         concptr s = src;
5282         size_t len = 0;
5283
5284         if (bufsize > 0) {
5285                 /* reserve for NUL termination */
5286                 bufsize--;
5287
5288                 /* Copy as many bytes as will fit */
5289                 while (*s && (len < bufsize))
5290                 {
5291                         if (iskanji(*s))
5292                         {
5293                                 if (len + 1 >= bufsize || !*(s+1)) break;
5294                                 *d++ = *s++;
5295                                 *d++ = *s++;
5296                                 len += 2;
5297                         }
5298                         else
5299                         {
5300                                 *d++ = *s++;
5301                                 len++;
5302                         }
5303                 }
5304                 *d = '\0';
5305         }
5306
5307         while(*s++) len++;
5308
5309         return len;
5310
5311 #else
5312
5313         size_t len = strlen(src);
5314         size_t ret = len;
5315         if (bufsize == 0) return ret;
5316
5317         /* Truncate */
5318         if (len >= bufsize) len = bufsize - 1;
5319
5320         /* Copy the string and terminate it */
5321         (void)memcpy(buf, src, len);
5322         buf[len] = '\0';
5323
5324         /* Return strlen(src) */
5325         return ret;
5326
5327 #endif
5328 }
5329
5330
5331 /*
5332  * The my_strcat() tries to append a string to an existing NUL-terminated string.
5333  * It never writes more characters into the buffer than indicated by 'bufsize' and
5334  * NUL-terminates the buffer.  The 'buf' and 'src' strings may not overlap.
5335  *
5336  * my_strcat() returns strlen(buf) + strlen(src).  This makes checking for
5337  * truncation easy.  Example:
5338  * if (my_strcat(buf, src, sizeof(buf)) >= sizeof(buf)) ...;
5339  *
5340  * This function should be equivalent to the strlcat() function in BSD.
5341  */
5342 size_t my_strcat(char *buf, concptr src, size_t bufsize)
5343 {
5344         size_t dlen = strlen(buf);
5345
5346         /* Is there room left in the buffer? */
5347         if (dlen < bufsize - 1)
5348         {
5349                 /* Append as much as possible  */
5350                 return (dlen + my_strcpy(buf + dlen, src, bufsize - dlen));
5351         }
5352         else
5353         {
5354                 /* Return without appending */
5355                 return (dlen + strlen(src));
5356         }
5357 }
5358
5359
5360 /*
5361  * A copy of ANSI strstr()
5362  *
5363  * my_strstr() can handle Kanji strings correctly.
5364  */
5365 char *my_strstr(concptr haystack, concptr needle)
5366 {
5367         int i;
5368         int l1 = strlen(haystack);
5369         int l2 = strlen(needle);
5370
5371         if (l1 >= l2)
5372         {
5373                 for(i = 0; i <= l1 - l2; i++)
5374                 {
5375                         if(!strncmp(haystack + i, needle, l2))
5376                                 return (char *)haystack + i;
5377
5378 #ifdef JP
5379                         if (iskanji(*(haystack + i))) i++;
5380 #endif
5381                 }
5382         }
5383
5384         return NULL;
5385 }
5386
5387
5388 /*
5389  * A copy of ANSI strchr()
5390  *
5391  * my_strchr() can handle Kanji strings correctly.
5392  */
5393 char *my_strchr(concptr ptr, char ch)
5394 {
5395         for ( ; *ptr != '\0'; ptr++)
5396         {
5397                 if (*ptr == ch) return (char *)ptr;
5398
5399 #ifdef JP
5400                 if (iskanji(*ptr)) ptr++;
5401 #endif
5402         }
5403
5404         return NULL;
5405 }
5406
5407
5408 /*
5409  * Convert string to lower case
5410  */
5411 void str_tolower(char *str)
5412 {
5413         /* Force to be lower case string */
5414         for (; *str; str++)
5415         {
5416 #ifdef JP
5417                 if (iskanji(*str))
5418                 {
5419                         str++;
5420                         continue;
5421                 }
5422 #endif
5423                 *str = (char)tolower(*str);
5424         }
5425 }
5426
5427
5428 /*
5429  * Get a keypress from the user.
5430  * And interpret special keys as internal code.
5431  *
5432  * This function is a Mega-Hack and depend on pref-xxx.prf's.
5433  * Currently works on Linux(UNIX), Windows, and Macintosh only.
5434  */
5435 int inkey_special(bool numpad_cursor)
5436 {
5437         static const struct {
5438                 concptr keyname;
5439                 int keyflag;
5440         } modifier_key_list[] = {
5441                 {"shift-", SKEY_MOD_SHIFT},
5442                 {"control-", SKEY_MOD_CONTROL},
5443                 {NULL, 0},
5444         };
5445
5446         static const struct {
5447                 bool numpad;
5448                 concptr keyname;
5449                 int keycode;
5450         } special_key_list[] = {
5451                 {FALSE, "Down]", SKEY_DOWN},
5452                 {FALSE, "Left]", SKEY_LEFT},
5453                 {FALSE, "Right]", SKEY_RIGHT},
5454                 {FALSE, "Up]", SKEY_UP},
5455                 {FALSE, "Page_Up]", SKEY_PGUP},
5456                 {FALSE, "Page_Down]", SKEY_PGDOWN},
5457                 {FALSE, "Home]", SKEY_TOP},
5458                 {FALSE, "End]", SKEY_BOTTOM},
5459                 {TRUE, "KP_Down]", SKEY_DOWN},
5460                 {TRUE, "KP_Left]", SKEY_LEFT},
5461                 {TRUE, "KP_Right]", SKEY_RIGHT},
5462                 {TRUE, "KP_Up]", SKEY_UP},
5463                 {TRUE, "KP_Page_Up]", SKEY_PGUP},
5464                 {TRUE, "KP_Page_Down]", SKEY_PGDOWN},
5465                 {TRUE, "KP_Home]", SKEY_TOP},
5466                 {TRUE, "KP_End]", SKEY_BOTTOM},
5467                 {TRUE, "KP_2]", SKEY_DOWN},
5468                 {TRUE, "KP_4]", SKEY_LEFT},
5469                 {TRUE, "KP_6]", SKEY_RIGHT},
5470                 {TRUE, "KP_8]", SKEY_UP},
5471                 {TRUE, "KP_9]", SKEY_PGUP},
5472                 {TRUE, "KP_3]", SKEY_PGDOWN},
5473                 {TRUE, "KP_7]", SKEY_TOP},
5474                 {TRUE, "KP_1]", SKEY_BOTTOM},
5475                 {FALSE, NULL, 0},
5476         };
5477
5478         static const struct {
5479                 concptr keyname;
5480                 int keycode;
5481         } gcu_special_key_list[] = {
5482                 {"A", SKEY_UP},
5483                 {"B", SKEY_DOWN},
5484                 {"C", SKEY_RIGHT},
5485                 {"D", SKEY_LEFT},
5486                 {"1~", SKEY_TOP},
5487                 {"4~", SKEY_BOTTOM},
5488                 {"5~", SKEY_PGUP},
5489                 {"6~", SKEY_PGDOWN},
5490                 {NULL, 0},
5491         };
5492
5493         char buf[1024];
5494         concptr str = buf;
5495         char key;
5496         int skey = 0;
5497         int modifier = 0;
5498         int i;
5499         size_t trig_len;
5500
5501         /*
5502          * Forget macro trigger ----
5503          * It's important if we are already expanding macro action
5504          */
5505         inkey_macro_trigger_string[0] = '\0';
5506
5507         /* Get a keypress */
5508         key = inkey();
5509
5510         /* Examine trigger string */
5511         trig_len = strlen(inkey_macro_trigger_string);
5512
5513         /* Already known that no special key */
5514         if (!trig_len) return (int)((unsigned char)key);
5515
5516         /*
5517          * Hack -- Ignore macro defined on ASCII characters.
5518          */
5519         if (trig_len == 1 && parse_macro)
5520         {
5521                 char c = inkey_macro_trigger_string[0];
5522
5523                 /* Cancel macro action on the queue */
5524                 forget_macro_action();
5525
5526                 /* Return the originaly pressed key */
5527                 return (int)((unsigned char)c);
5528         }
5529
5530         /* Convert the trigger */
5531         ascii_to_text(buf, inkey_macro_trigger_string);
5532
5533         /* Check the prefix "\[" */
5534         if (prefix(str, "\\["))
5535         {
5536                 /* Skip "\[" */
5537                 str += 2;
5538
5539                 /* Examine modifier keys */
5540                 while (TRUE)
5541                 {
5542                         for (i = 0; modifier_key_list[i].keyname; i++)
5543                         {
5544                                 if (prefix(str, modifier_key_list[i].keyname))
5545                                 {
5546                                         /* Get modifier key flag */
5547                                         str += strlen(modifier_key_list[i].keyname);
5548                                         modifier |= modifier_key_list[i].keyflag;
5549                                 }
5550                         }
5551
5552                         /* No more modifier key found */
5553                         if (!modifier_key_list[i].keyname) break;
5554                 }
5555
5556                 /* numpad_as_cursorkey option force numpad keys to input numbers */
5557                 if (!numpad_as_cursorkey) numpad_cursor = FALSE;
5558
5559                 /* Get a special key code */
5560                 for (i = 0; special_key_list[i].keyname; i++)
5561                 {
5562                         if ((!special_key_list[i].numpad || numpad_cursor) &&
5563                             streq(str, special_key_list[i].keyname))
5564                         {
5565                                 skey = special_key_list[i].keycode;
5566                                 break;
5567                         }
5568                 }
5569
5570                 /* A special key found */
5571                 if (skey)
5572                 {
5573                         /* Cancel macro action on the queue */
5574                         forget_macro_action();
5575
5576                         /* Return special key code and modifier flags */
5577                         return (skey | modifier);
5578                 }
5579         }
5580
5581         if (prefix(str, "\\e["))
5582         {
5583                 str += 3;
5584
5585                 for (i = 0; gcu_special_key_list[i].keyname; i++)
5586                 {
5587                         if (streq(str, gcu_special_key_list[i].keyname))
5588                         {
5589                                 return gcu_special_key_list[i].keycode;
5590                         }
5591                 }
5592         }
5593
5594         /* No special key found? */
5595
5596         /* Don't bother with this trigger no more */
5597         inkey_macro_trigger_string[0] = '\0';
5598
5599         /* Return normal keycode */
5600         return (int)((unsigned char)key);
5601 }
5602