OSDN Git Service

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