/* Purpose: Angband utilities -BEN- */
#include "angband.h"
-#include "monster-hook.h"
+#include "core.h"
+#include "term.h"
+#include "util.h"
+#include "files.h"
+#include "monsterrace-hook.h"
+#include "view-mainwindow.h"
+#include "quest.h"
+#include "floor.h"
+#include "world.h"
+#include "cmd-dump.h"
+#include "japanese.h"
+#include "player-class.h"
+/*!
+ * 10進数から16進数への変換テーブル /
+ * Global array for converting numbers to uppercase hecidecimal digit
+ * This array can also be used to convert a number to an octal digit
+ */
+const char hexsym[16] =
+{
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+};
+
+/*
+ * Keymaps for each "mode" associated with each keypress.
+ */
+concptr keymap_act[KEYMAP_MODES][256];
+
+/*
+ * The next "free" index to use
+ */
+u32b message__next;
+
+/*
+ * The index of the oldest message (none yet)
+ */
+u32b message__last;
+
+/*
+ * The next "free" offset
+ */
+u32b message__head;
+
+/*
+ * The offset to the oldest used char (none yet)
+ */
+u32b message__tail;
+
+/*
+ * The array of offsets, by index [MESSAGE_MAX]
+ */
+u32b *message__ptr;
+
+/*
+ * The array of chars, by offset [MESSAGE_BUF]
+ */
+char *message__buf;
+
+bool msg_flag; /* Used in msg_print() for "buffering" */
+
+/*
+ * Number of active macros.
+ */
+s16b macro__num;
+
+/*
+ * Array of macro patterns [MACRO_MAX]
+ */
+concptr *macro__pat;
+
+/*
+ * Array of macro actions [MACRO_MAX]
+ */
+concptr *macro__act;
+
+/*
+ * Array of macro types [MACRO_MAX]
+ */
+bool *macro__cmd;
+
+/*
+ * Current macro action [1024]
+ */
+char *macro__buf;
+
+bool get_com_no_macros = FALSE; /* Expand macros in "get_com" or not */
+
+bool inkey_base; /* See the "inkey()" function */
+bool inkey_xtra; /* See the "inkey()" function */
+bool inkey_scan; /* See the "inkey()" function */
+bool inkey_flag; /* See the "inkey()" function */
+
+bool use_menu;
+
+pos_list tmp_pos;
+
+/*
+ * The number of quarks
+ */
+STR_OFFSET quark__num;
+
+/*
+ * The pointers to the quarks [QUARK_MAX]
+ */
+concptr *quark__str;
static int num_more = 0;
/* Save macro trigger string for use in inkey_special() */
static char inkey_macro_trigger_string[1024];
+int max_macrotrigger = 0; /*!< 現在登録中のマクロ(トリガー)の数 */
+concptr macro_template = NULL; /*!< Angband設定ファイルのT: タグ情報から読み込んだ長いTコードを処理するために利用する文字列ポインタ */
+concptr macro_modifier_chr; /*!< &x# で指定されるマクロトリガーに関する情報を記録する文字列ポインタ */
+concptr macro_modifier_name[MAX_MACRO_MOD]; /*!< マクロ上で取り扱う特殊キーを文字列上で表現するためのフォーマットを記録した文字列ポインタ配列 */
+concptr macro_trigger_name[MAX_MACRO_TRIG]; /*!< マクロのトリガーコード */
+concptr macro_trigger_keycode[2][MAX_MACRO_TRIG]; /*!< マクロの内容 */
+
+s16b command_cmd; /* Current "Angband Command" */
+COMMAND_ARG command_arg; /*!< 各種コマンドの汎用的な引数として扱う / Gives argument of current command */
+COMMAND_NUM command_rep; /*!< 各種コマンドの汎用的なリピート数として扱う / Gives repetition of current command */
+DIRECTION command_dir; /*!< 各種コマンドの汎用的な方向値処理として扱う/ Gives direction of current command */
+s16b command_see; /* See "object1.c" */
+s16b command_wrk; /* See "object1.c" */
+TERM_LEN command_gap = 999; /* See "object1.c" */
+s16b command_new; /* Command chaining from inven/equip view */
+
+
+
#if 0
#ifndef HAS_STRICMP
*
* Compare the two strings "a" and "b" ala "strcmp()" ignoring case.
*/
-int stricmp(cptr a, cptr b)
+int stricmp(concptr a, concptr b)
{
- cptr s1, s2;
+ concptr s1, s2;
char z1, z2;
/* Scan the strings */
*/
#ifdef SET_UID
extern struct passwd *getpwuid(uid_t uid);
-extern struct passwd *getpwnam(const char *name);
+extern struct passwd *getpwnam(concptr name);
#endif
* Replace "~user/" by the home directory of the user named "user"
* Replace "~/" by the home directory of the current user
*/
-errr path_parse(char *buf, int max, cptr file)
+errr path_parse(char *buf, int max, concptr file)
{
- cptr u, s;
+ concptr u, s;
struct passwd *pw;
char user[128];
* This requires no special processing on simple machines,
* except for verifying the size of the filename.
*/
-errr path_parse(char *buf, int max, cptr file)
+errr path_parse(char *buf, int max, concptr file)
{
/* Accept the filename */
(void)strnfmt(buf, max, "%s", file);
*/
static errr path_temp(char *buf, int max)
{
- cptr s;
+ concptr s;
/* Temp file */
s = tmpnam(NULL);
- /* Oops */
if (!s) return (-1);
/* Format to length */
#endif
-/*
- * Create a new path by appending a file (or directory) to a path.
+/*!
+ * @brief ファイル入出力のためのパス生成する。/ Create a new path by appending a file (or directory) to a path.
+ * @param buf ファイルのフルを返すバッファ
+ * @param max bufのサイズ
+ * @param path ファイルパス
+ * @param file ファイル名
+ * @return エラーコード(ただし常に0を返す)
*
* This requires no special processing on simple machines, except
* for verifying the size of the filename, but note the ability to
* Note that this function yields a path which must be "parsed"
* using the "parse" function above.
*/
-errr path_build(char *buf, int max, cptr path, cptr file)
+errr path_build(char *buf, int max, concptr path, concptr file)
{
/* Special file */
if (file[0] == '~')
/*
* Hack -- replacement for "fopen()"
*/
-FILE *my_fopen(cptr file, cptr mode)
+FILE *my_fopen(concptr file, concptr mode)
{
char buf[1024];
{
/* Generate a temporary filename */
if (path_temp(buf, max)) return (NULL);
-
- /* Open the file */
return (my_fopen(buf, "w"));
}
errr my_fgets(FILE *fff, char *buf, huge n)
{
huge i = 0;
-
char *s;
-
char tmp[1024];
/* Read a line */
/*
* Hack -- replacement for "fputs()"
- *
* Dump a string, plus a newline, to a file
- *
- * XXX XXX XXX Process internal weirdness?
+ * Process internal weirdness?
*/
-errr my_fputs(FILE *fff, cptr buf, huge n)
+errr my_fputs(FILE *fff, concptr buf, huge n)
{
/* XXX XXX */
n = n ? n : 0;
/*
- * Code Warrior is a little weird about some functions
- */
-#ifdef BEN_HACK
-extern int open(const char *, int, ...);
-extern int close(int);
-extern int read(int, void *, unsigned int);
-extern int write(int, const void *, unsigned int);
-extern long lseek(int, long, int);
-#endif /* BEN_HACK */
-
-
-/*
* The Macintosh is a little bit brain-dead sometimes
*/
#ifdef MACINTOSH
/*
* Hack -- attempt to delete a file
*/
-errr fd_kill(cptr file)
+errr fd_kill(concptr file)
{
char buf[1024];
/* Remove */
(void)remove(buf);
- /* XXX XXX XXX */
return (0);
}
/*
* Hack -- attempt to move a file
*/
-errr fd_move(cptr file, cptr what)
+errr fd_move(concptr file, concptr what)
{
char buf[1024];
char aux[1024];
/* Rename */
(void)rename(buf, aux);
- /* XXX XXX XXX */
return (0);
}
/*
* Hack -- attempt to copy a file
*/
-errr fd_copy(cptr file, cptr what)
+errr fd_copy(concptr file, concptr what)
{
char buf[1024];
char aux[1024];
fd_close(src_fd);
fd_close(dst_fd);
- /* XXX XXX XXX */
return (0);
}
-
/*
* Hack -- attempt to open a file descriptor (create file)
- *
* This function should fail if the file already exists
- *
* Note that we assume that the file should be "binary"
- *
- * XXX XXX XXX The horrible "BEN_HACK" code is for compiling under
- * the CodeWarrior compiler, in which case, for some reason, none
- * of the "O_*" flags are defined, and we must fake the definition
- * of "O_RDONLY", "O_WRONLY", and "O_RDWR" in "A-win-h", and then
- * we must simulate the effect of the proper "open()" call below.
*/
-int fd_make(cptr file, BIT_FLAGS mode)
+int fd_make(concptr file, BIT_FLAGS mode)
{
char buf[1024];
/* Hack -- Try to parse the path */
if (path_parse(buf, 1024, file)) return (-1);
-#ifdef BEN_HACK
-
- /* Check for existance */
- /* if (fd_close(fd_open(file, O_RDONLY | O_BINARY))) return (1); */
-
- /* Mega-Hack -- Create the file */
- (void)my_fclose(my_fopen(file, "wb"));
-
- /* Re-open the file for writing */
- return (open(buf, O_WRONLY | O_BINARY, mode));
-
-#else /* BEN_HACK */
-
#if defined(MAC_MPW) || defined(MACH_O_CARBON)
{
int fdes;
/* Return the descriptor */
return (fdes);
}
-# else
+#else
/* Create the file, fail if exists, write-only, binary */
return (open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode));
-# endif
-
-#endif /* BEN_HACK */
+#endif
}
*
* Note that we assume that the file should be "binary"
*/
-int fd_open(cptr file, int flags)
+int fd_open(concptr file, int flags)
{
char buf[1024];
/*
* Hack -- Attempt to write data to a file descriptor
*/
-errr fd_write(int fd, cptr buf, huge n)
+errr fd_write(int fd, concptr buf, huge n)
{
/* Verify the fd */
if (fd < 0) return (-1);
/* Close */
(void)close(fd);
- /* XXX XXX XXX */
return (0);
}
/*
- * XXX XXX XXX Important note about "colors" XXX XXX XXX
+ * Important note about "colors"
*
* The "TERM_*" color definitions list the "composition" of each
* "Angband color" in terms of "quarters" of each of the three color
}
-static int my_stricmp(cptr a, cptr b)
+static int my_stricmp(concptr a, concptr b)
{
- cptr s1, s2;
+ concptr s1, s2;
char z1, z2;
/* Scan the strings */
}
}
-static int my_strnicmp(cptr a, cptr b, int n)
+static int my_strnicmp(concptr a, concptr b, int n)
{
- cptr s1, s2;
+ concptr s1, s2;
char z1, z2;
/* Scan the strings */
}
-static void trigger_text_to_ascii(char **bufptr, cptr *strptr)
+static void trigger_text_to_ascii(char **bufptr, concptr *strptr)
{
char *s = *bufptr;
- cptr str = *strptr;
+ concptr str = *strptr;
bool mod_status[MAX_MACRO_MOD];
int i, len = 0;
int shiftstatus = 0;
- cptr key_code;
+ concptr key_code;
if (macro_template == NULL)
return;
* parsing "\xFF" into a (signed) char. Whoever thought of making
* the "sign" of a "char" undefined is a complete moron. Oh well.
*/
-void text_to_ascii(char *buf, cptr str)
+void text_to_ascii(char *buf, concptr str)
{
char *s = buf;
{
/* Skip the backslash */
str++;
-
- /* Paranoia */
if (!(*str)) break;
/* Macro Trigger */
}
-static bool trigger_ascii_to_text(char **bufptr, cptr *strptr)
+static bool trigger_ascii_to_text(char **bufptr, concptr *strptr)
{
char *s = *bufptr;
- cptr str = *strptr;
+ concptr str = *strptr;
char key_code[100];
int i;
- cptr tmp;
+ concptr tmp;
if (macro_template == NULL)
return FALSE;
/*
* Hack -- convert a string into a printable form
*/
-void ascii_to_text(char *buf, cptr str)
+void ascii_to_text(char *buf, concptr str)
{
char *s = buf;
/*
* Find the macro (if any) which exactly matches the given pattern
*/
-sint macro_find_exact(cptr pat)
+sint macro_find_exact(concptr pat)
{
int i;
/*
* Find the first macro (if any) which contains the given pattern
*/
-static sint macro_find_check(cptr pat)
+static sint macro_find_check(concptr pat)
{
int i;
/*
* Find the first macro (if any) which contains the given pattern and more
*/
-static sint macro_find_maybe(cptr pat)
+static sint macro_find_maybe(concptr pat)
{
int i;
/*
* Find the longest macro (if any) which starts with the given pattern
*/
-static sint macro_find_ready(cptr pat)
+static sint macro_find_ready(concptr pat)
{
int i, t, n = -1, s = -1;
n = i;
s = t;
}
-
- /* Result */
return (n);
}
* Add a macro definition (or redefinition).
*
* We should use "act == NULL" to "remove" a macro, but this might make it
- * impossible to save the "removal" of a macro definition. XXX XXX XXX
+ * impossible to save the "removal" of a macro definition.
*
* We should consider refusing to allow macros which contain existing macros,
* or which are contained in existing macros, because this would simplify the
- * macro analysis code. XXX XXX XXX
+ * macro analysis code.
*
* We should consider removing the "command macro" crap, and replacing it
* with some kind of "powerful keymap" ability, but this might make it hard
- * to change the "roguelike" option from inside the game. XXX XXX XXX
+ * to change the "roguelike" option from inside the game.
*/
-errr macro_add(cptr pat, cptr act)
+errr macro_add(concptr pat, concptr act)
{
int n;
/*
* Hack -- Select floor music.
*/
-void select_floor_music(void)
+void select_floor_music(player_type *player_ptr)
{
- int i;
- /* No sound */
if (!use_music) return;
- if(ambush_flag)
+ if (player_ptr->ambush_flag)
{
- play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_AMBUSH);
- return;
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_AMBUSH)) return;
+ }
+
+ if(player_ptr->wild_mode)
+ {
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WILD)) return;
}
- if(p_ptr->wild_mode)
+ if(player_ptr->current_floor_ptr->inside_arena)
{
- play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WILD);
- return;
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_ARENA)) return;
}
- if(p_ptr->inside_arena)
+ if(player_ptr->phase_out)
{
- play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_ARENA);
- return;
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BATTLE)) return;
}
- if(p_ptr->inside_battle)
+ if(player_ptr->current_floor_ptr->inside_quest)
{
- play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BATTLE);
- return;
+ if (!play_music(TERM_XTRA_MUSIC_QUEST, player_ptr->current_floor_ptr->inside_quest)) return;
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST)) return;
}
- if(p_ptr->inside_quest)
+ if(player_ptr->dungeon_idx)
{
- if(play_music(TERM_XTRA_MUSIC_QUEST, p_ptr->inside_quest))
+ if (player_ptr->feeling == 2)
{
- play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST);
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL2)) return;
}
- return;
- }
-
- for(i = 0; i < max_q_idx; i++)
- { // TODO マクロで類似条件を統合すること
- if(quest[i].status == QUEST_STATUS_TAKEN &&
- (quest[i].type == QUEST_TYPE_KILL_LEVEL || quest[i].type == QUEST_TYPE_RANDOM) &&
- quest[i].level == dun_level && dungeon_type == quest[i].dungeon)
+ else if (player_ptr->feeling >= 3 && player_ptr->feeling <= 5)
{
- if(play_music(TERM_XTRA_MUSIC_QUEST, i))
- {
- play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST);
- }
- return;
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL1)) return;
}
- }
-
- if(dungeon_type)
- {
- if(p_ptr->feeling == 2) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL2);
- else if(p_ptr->feeling >= 3 && p_ptr->feeling <= 5) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL1);
else
{
- if(play_music(TERM_XTRA_MUSIC_DUNGEON, dungeon_type))
+ if (!play_music(TERM_XTRA_MUSIC_DUNGEON, player_ptr->dungeon_idx)) return;
+
+ if (player_ptr->current_floor_ptr->dun_level < 40)
+ {
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_LOW)) return;
+ }
+ else if (player_ptr->current_floor_ptr->dun_level < 80)
{
- if(dun_level < 40) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_LOW);
- else if(dun_level < 80) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_MED);
- else play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_HIGH);
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_MED)) return;
+ }
+ else
+ {
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_HIGH)) return;
}
}
- return;
}
- if(p_ptr->town_num)
+ if(player_ptr->town_num)
{
- if(play_music(TERM_XTRA_MUSIC_TOWN, p_ptr->town_num))
- {
- play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_TOWN);
- }
+ if (!play_music(TERM_XTRA_MUSIC_TOWN, player_ptr->town_num)) return;
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_TOWN)) return;
return;
}
- if(!dun_level)
+ if(!player_ptr->current_floor_ptr->dun_level)
{
- if(p_ptr->lev >= 45) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD3);
- else if(p_ptr->lev >= 25) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD2);
- else play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD1);
- return;
+ if (player_ptr->lev >= 45)
+ {
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD3)) return;
+ }
+ else if (player_ptr->lev >= 25)
+ {
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD2)) return;
+ }
+ else
+ {
+ if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD1)) return;
+ }
}
+ play_music(TERM_XTRA_MUSIC_MUTE, 0);
}
* Only 500 (0+1+2+...+29+30) milliseconds may elapse between each key in
* the macro trigger sequence. If a key sequence forms the "prefix" of a
* macro trigger, 500 milliseconds must pass before the key sequence is
- * known not to be that macro trigger. XXX XXX XXX
+ * known not to be that macro trigger.
*/
static char inkey_aux(void)
{
char ch;
- cptr pat, act;
+ concptr pat, act;
char *buf = inkey_macro_trigger_string;
/* Excessive delay */
if (w >= 10) break;
- /* Delay */
Term_xtra(TERM_XTRA_DELAY, w);
}
}
/*
- * Mega-Hack -- special "inkey_next" pointer. XXX XXX XXX
+ * Mega-Hack -- special "inkey_next" pointer.
*
* This special pointer allows a sequence of keys to be "inserted" into
* the stream of keys returned by "inkey()". This key sequence will not
* trigger any macros, and cannot be bypassed by the Borg. It is used
* in Angband to handle "keymaps".
*/
-static cptr inkey_next = NULL;
+static concptr inkey_next = NULL;
#ifdef ALLOW_BORG
/*
- * Mega-Hack -- special "inkey_hack" hook. XXX XXX XXX
+ * Mega-Hack -- special "inkey_hack" hook.
*
* This special function hook allows the "Borg" (see elsewhere) to take
* control of the "inkey()" function, and substitute in fake keypresses.
* is only requested (via "Term_inkey()") when "angband_term[0]" is active.
*
* Mega-Hack -- This function is used as the entry point for clearing the
- * "signal_count" variable, and of the "character_saved" variable.
+ * "signal_count" variable, and of the "current_world_ptr->character_saved" variable.
*
* Hack -- Note the use of "inkey_next" to allow "keymaps" to be processed.
*
(void)Term_get_cursor(&v);
/* Show the cursor if waiting, except sometimes in "command" mode */
- if (!inkey_scan && (!inkey_flag || hilite_player || character_icky))
+ if (!inkey_scan && (!inkey_flag || hilite_player || current_world_ptr->character_icky))
{
/* Show the cursor */
(void)Term_set_cursor(1);
Term_activate(angband_term[0]);
/* Mega-Hack -- reset saved flag */
- character_saved = FALSE;
+ current_world_ptr->character_saved = FALSE;
/* Mega-Hack -- reset signal counter */
signal_count = 0;
/* Wait for (and remove) a pending key */
if (0 == Term_inkey(&ch, TRUE, TRUE))
{
- /* Done */
break;
}
- /* Oops */
break;
}
/* Check for (and remove) a pending key */
if (0 == Term_inkey(&ch, FALSE, TRUE))
{
- /* Done */
break;
}
/* Excessive delay */
if (w >= 100) break;
- /* Delay */
Term_xtra(TERM_XTRA_DELAY, w);
}
}
- /* Done */
break;
}
{
/* Strip this key */
ch = 0;
-
- /* Continue */
continue;
}
void quark_init(void)
{
/* Quark variables */
- C_MAKE(quark__str, QUARK_MAX, cptr);
+ C_MAKE(quark__str, QUARK_MAX, concptr);
/* Prepare first quark, which is used when quark_add() is failed */
quark__str[1] = string_make("");
/*
* Add a new "quark" to the set of quarks.
*/
-u16b quark_add(cptr str)
+u16b quark_add(concptr str)
{
u16b i;
/*
* This function looks up a quark
*/
-cptr quark_str(STR_OFFSET i)
+concptr quark_str(STR_OFFSET i)
{
- cptr q;
+ concptr q;
/* Return NULL for an invalid index */
if ((i < 1) || (i >= quark__num)) return NULL;
* @params age メッセージの世代
* @return メッセージの文字列ポインタ
*/
-cptr message_str(int age)
+concptr message_str(int age)
{
s32b x;
s32b o;
- cptr s;
+ concptr s;
/* Forgotten messages have no text */
if ((age < 0) || (age >= message_num())) return ("");
* @params str 保存したいメッセージ
* @return なし
*/
-void message_add(cptr str)
+void message_add(concptr str)
{
u32b i, n;
int k, x, m;
char u[4096];
char splitted1[81];
- cptr splitted2;
+ concptr splitted2;
/*** Step 1 -- Analyze the message ***/
/* extra step -- split the message if n>80.(added by Mogami) */
if (n > 80) {
#ifdef JP
- cptr t = str;
+ concptr t = str;
for (n = 0; n < 80; n++, t++)
{
char buf[1024];
char *t;
- cptr old;
+ concptr old;
/* Back up and wrap if needed */
if (i-- == 0) i = MESSAGE_MAX - 1;
if (*t)
{
/* Message is too small */
- if (strlen(buf) < 6) break;
+ if (strlen(buf) < A_MAX) break;
/* Drop the space */
*(t - 1) = '\0';
now_message++;
}
- /* Done */
break;
}
for (i = message__next; k; k--)
{
int q;
- cptr old;
+ concptr old;
/* Back up and wrap if needed */
if (i-- == 0) i = MESSAGE_MAX - 1;
byte a = TERM_L_BLUE;
bool nagasu = FALSE;
- if ((auto_more && !now_damaged) || num_more < 0){
+ if ((auto_more && !p_ptr->now_damaged) || num_more < 0){
int i;
for (i = 0; i < 8; i++)
{
nagasu = TRUE;
}
}
- now_damaged = FALSE;
+ p_ptr->now_damaged = FALSE;
if (!p_ptr->playing || !nagasu)
{
}
+void msg_erase(void)
+{
+ msg_print(NULL);
+}
+
+
/*
* Output a message to the top line of the screen.
*
* The global "msg_flag" variable can be cleared to tell us to
* "erase" any "pending" messages still on the screen.
*
- * XXX XXX XXX Note that we must be very careful about using the
+ * Note that we must be very careful about using the
* "msg_print()" functions without explicitly calling the special
* "msg_print(NULL)" function, since this may result in the loss
* of information if the screen is cleared, or if anything is
* displayed on the top line.
*
- * XXX XXX XXX Note that "msg_print(NULL)" will clear the top line
+ * Note that "msg_print(NULL)" will clear the top line
* even if no messages are pending. This is probably a hack.
*/
-void msg_print(cptr msg)
+void msg_print(concptr msg)
{
static int p = 0;
int n;
char *t;
char buf[1024];
- if (world_monster) return;
+ if (current_world_ptr->timewalk_m_idx) return;
/* Hack -- Reset */
if (!msg_flag) {
/* Hack -- flush when requested or needed */
if (p && (!msg || ((p + n) > 72)))
{
- /* Flush */
msg_flush(p);
/* Forget it */
/* No message */
if (!msg) return;
-
- /* Paranoia */
if (n > 1000) return;
/* Copy it */
}
else
{
- sprintf(buf, ("T:%d - %s"), (int)turn, msg);
+ sprintf(buf, ("T:%d - %s"), (int)current_world_ptr->game_turn, msg);
}
/* New Message Length */
n = strlen(buf);
/* Memorize the message */
- if (character_generated) message_add(buf);
+ if (current_world_ptr->character_generated) message_add(buf);
/* Analyze the buffer */
t = buf;
msg_flush(split + 1);
/* Memorize the piece */
- /* if (character_generated) message_add(t); */
+ /* if (current_world_ptr->character_generated) message_add(t); */
/* Restore the split character */
t[split] = oops;
Term_putstr(p, 0, n, TERM_WHITE, t);
/* Memorize the tail */
- /* if (character_generated) message_add(t); */
+ /* if (current_world_ptr->character_generated) message_add(t); */
- /* Window stuff */
p_ptr->window |= (PW_MESSAGE);
- window_stuff();
+ update_output(p_ptr);
/* Remember the message */
msg_flag = TRUE;
if (fresh_message) Term_fresh();
}
-void msg_print_wizard(int cheat_type, cptr msg)
+
+void msg_print_wizard(int cheat_type, concptr msg)
{
if (!cheat_room && cheat_type == CHEAT_DUNGEON) return;
if (!cheat_peek && cheat_type == CHEAT_OBJECT) return;
if (!cheat_hear && cheat_type == CHEAT_MONSTER) return;
if (!cheat_xtra && cheat_type == CHEAT_MISC) return;
- cptr cheat_mes[] = {"ITEM", "MONS", "DUNG", "MISC"};
+ concptr cheat_mes[] = {"ITEM", "MONS", "DUNG", "MISC"};
char buf[1024];
sprintf(buf, "WIZ-%s:%s", cheat_mes[cheat_type], msg);
msg_print(buf);
if (cheat_diary_output)
{
- do_cmd_write_nikki(NIKKI_WIZARD_LOG, 0, buf);
+ exe_write_diary(p_ptr, NIKKI_WIZARD_LOG, 0, buf);
}
}
+
/*
* Hack -- prevent "accidents" in "screen_save()" or "screen_load()"
*/
*
* This function must match exactly one call to "screen_load()".
*/
-void screen_save(void)
+void screen_save()
{
/* Hack -- Flush messages */
msg_print(NULL);
if (screen_depth++ == 0) Term_save();
/* Increase "icky" depth */
- character_icky++;
+ current_world_ptr->character_icky++;
}
*
* This function must match exactly one call to "screen_save()".
*/
-void screen_load(void)
+void screen_load()
{
/* Hack -- Flush messages */
msg_print(NULL);
if (--screen_depth == 0) Term_load();
/* Decrease "icky" depth */
- character_icky--;
+ current_world_ptr->character_icky--;
}
/*
* Display a formatted message, using "vstrnfmt()" and "msg_print()".
*/
-void msg_format(cptr fmt, ...)
+void msg_format(concptr fmt, ...)
{
va_list vp;
/*
* Display a formatted message, using "vstrnfmt()" and "msg_print()".
*/
-void msg_format_wizard(int cheat_type, cptr fmt, ...)
+void msg_format_wizard(int cheat_type, concptr fmt, ...)
{
if(!cheat_room && cheat_type == CHEAT_DUNGEON) return;
if(!cheat_peek && cheat_type == CHEAT_OBJECT) return;
}
-
/*
* Display a string on the screen using an attribute.
*
* At the given location, using the given attribute, if allowed,
* add the given string. Do not clear the line.
*/
-void c_put_str(TERM_COLOR attr, cptr str, int row, int col)
+void c_put_str(TERM_COLOR attr, concptr str, TERM_LEN row, TERM_LEN col)
{
/* Position cursor, Dump the attr/text */
Term_putstr(col, row, -1, attr, str);
/*
* As above, but in "white"
*/
-void put_str(cptr str, int row, int col)
+void put_str(concptr str, TERM_LEN row, TERM_LEN col)
{
/* Spawn */
Term_putstr(col, row, -1, TERM_WHITE, str);
* Display a string on the screen using an attribute, and clear
* to the end of the line.
*/
-void c_prt(byte attr, cptr str, int row, int col)
+void c_prt(TERM_COLOR attr, concptr str, TERM_LEN row, TERM_LEN col)
{
/* Clear line, position cursor */
Term_erase(col, row, 255);
/*
* As above, but in "white"
*/
-void prt(cptr str, int row, int col)
+void prt(concptr str, TERM_LEN row, TERM_LEN col)
{
/* Spawn */
c_prt(TERM_WHITE, str, row, col);
* This function will correctly handle any width up to the maximum legal
* value of 256, though it works best for a standard 80 character width.
*/
-void c_roff(byte a, cptr str)
+void c_roff(byte a, concptr str)
{
int x, y;
int w, h;
- cptr s;
+ concptr s;
/* Obtain the size */
(void)Term_get_size(&w, &h);
/*
* As above, but in "white"
*/
-void roff(cptr str)
+void roff(concptr str)
{
/* Spawn */
c_roff(TERM_WHITE, str);
*
* We clear the input, and return FALSE, on "ESCAPE".
*/
-bool get_string(cptr prompt, char *buf, int len)
+bool get_string(concptr prompt, char *buf, int len)
{
bool res;
-
- /* Paranoia XXX XXX XXX */
msg_print(NULL);
/* Display prompt */
/* Clear prompt */
prt("", 0, 0);
-
- /* Result */
return (res);
}
*
* Note that "[y/n]" is appended to the prompt.
*/
-bool get_check(cptr prompt)
+bool get_check(concptr prompt)
{
return get_check_strict(prompt, 0);
}
* mode & CHECK_NO_HISTORY : no message_add
* mode & CHECK_DEFAULT_Y : accept any key as y, except n and Esc.
*/
-bool get_check_strict(cptr prompt, BIT_FLAGS mode)
+bool get_check_strict(concptr prompt, BIT_FLAGS mode)
{
int i;
char buf[80];
if (auto_more)
{
p_ptr->window |= PW_MESSAGE;
- window_stuff();
+ handle_stuff(p_ptr);
num_more = 0;
}
- /* Paranoia XXX XXX XXX */
msg_print(NULL);
if (!rogue_like_commands)
mode &= ~CHECK_OKAY_CANCEL;
-
/* Hack -- Build a "useful" prompt */
if (mode & CHECK_OKAY_CANCEL)
{
/* HACK : Add the line to message buffer */
message_add(buf);
p_ptr->window |= (PW_MESSAGE);
- window_stuff();
+ handle_stuff(p_ptr);
}
/* Get an acceptable answer */
*
* Returns TRUE unless the character is "Escape"
*/
-bool get_com(cptr prompt, char *command, bool z_escape)
+bool get_com(concptr prompt, char *command, bool z_escape)
{
- /* Paranoia XXX XXX XXX */
msg_print(NULL);
/* Display a prompt */
/* Get a key */
if (get_com_no_macros)
- *command = inkey_special(FALSE);
+ *command = (char)inkey_special(FALSE);
else
*command = inkey();
prt("", 0, 0);
/* Handle "cancel" */
- if (*command == ESCAPE) return (FALSE);
- if (z_escape && ((*command == 'z') || (*command == 'Z'))) return (FALSE);
+ if (*command == ESCAPE) return FALSE;
+ if (z_escape && ((*command == 'z') || (*command == 'Z'))) return FALSE;
/* Success */
- return (TRUE);
+ return TRUE;
}
*
* Hack -- allow "command_arg" to specify a quantity
*/
-QUANTITY get_quantity(cptr prompt, QUANTITY max)
+QUANTITY get_quantity(concptr prompt, QUANTITY max)
{
bool res, result;
QUANTITY amt;
return (amt);
}
-#ifdef ALLOW_REPEAT /* TNB */
-
/* Get the item index */
result = repeat_pull(&code);
amt = (QUANTITY)code;
return (amt);
}
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Build a prompt if needed */
if (!prompt)
{
- /* Build a prompt */
sprintf(tmp, _("いくつですか (1-%d): ", "Quantity (1-%d): "), max);
/* Use that prompt */
prompt = tmp;
}
-
- /* Paranoia XXX XXX XXX */
msg_print(NULL);
/* Display prompt */
/* Enforce the minimum */
if (amt < 0) amt = 0;
-#ifdef ALLOW_REPEAT /* TNB */
-
if (amt) repeat_push((COMMAND_CODE)amt);
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Return the result */
return (amt);
}
/*
- * Pause for user response XXX XXX XXX
+ * Pause for user response
*/
void pause_line(int row)
{
typedef struct
{
- cptr name;
+ concptr name;
byte cmd;
bool fin;
} menu_naiyou;
typedef struct
{
- cptr name;
+ concptr name;
byte window;
byte number;
byte jouken;
{
int i;
char sub_cmd;
- cptr menu_name;
+ concptr menu_name;
if (!menu) old_num = num;
put_str("+----------------------------------------------------+", basey, basex);
put_str("| |", basey+1, basex);
if (p_ptr->pclass == special_menu_info[hoge].jouken_naiyou) menu_name = special_menu_info[hoge].name;
break;
case MENU_WILD:
- if (!dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest)
+ if (!p_ptr->current_floor_ptr->dun_level && !p_ptr->current_floor_ptr->inside_arena && !p_ptr->current_floor_ptr->inside_quest)
{
if ((byte)p_ptr->wild_mode == special_menu_info[hoge].jouken_naiyou) menu_name = special_menu_info[hoge].name;
}
/* Place the cursor on the player */
move_cursor_relative(p_ptr->y, p_ptr->x);
- /* Get a command */
sub_cmd = inkey();
if ((sub_cmd == ' ') || (sub_cmd == 'x') || (sub_cmd == 'X') || (sub_cmd == '\r') || (sub_cmd == '\n'))
{
* Note that this command is used both in the dungeon and in
* stores, and must be careful to work in both situations.
*
- * Note that "p_ptr->command_new" may not work any more. XXX XXX XXX
+ * Note that "p_ptr->command_new" may not work any more.
*/
void request_command(int shopping)
{
s16b cmd;
int mode;
- cptr act;
+ concptr act;
#ifdef JP
int caretcmd = 0;
/* Hack -- auto-commands */
if (command_new)
{
- /* Flush messages */
- msg_print(NULL);
+ msg_erase();
/* Use auto-command */
cmd = command_new;
/* Activate "command mode" */
inkey_flag = TRUE;
- /* Get a command */
cmd = inkey();
if (!shopping && command_menu && ((cmd == '\r') || (cmd == '\n') || (cmd == 'x') || (cmd == 'X'))
{
/* Clear count */
command_arg = 0;
-
- /* Continue */
continue;
}
}
/* Start using the buffer */
inkey_next = request_command_buffer;
-
- /* Continue */
continue;
}
-
- /* Paranoia */
if (!cmd) continue;
/* Use command */
command_cmd = (byte)cmd;
- /* Done */
break;
}
#ifdef JP
for (i = 0; i < 256; i++)
{
- cptr s;
+ concptr s;
if ((s = keymap_act[mode][i]) != NULL)
{
if (*s == command_cmd && *(s+1) == 0)
/* Hack -- Scan equipment */
for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
{
- cptr s;
-
- object_type *o_ptr = &inventory[i];
+ concptr s;
- /* Skip non-objects */
+ object_type *o_ptr = &p_ptr->inventory_list[i];
if (!o_ptr->k_idx) continue;
/* No inscription */
case 'I':
case 'O':
case 'U':
- return (TRUE);
+ return TRUE;
}
- return (FALSE);
+ return FALSE;
}
* XXX Could be made more efficient, especially in the
* case where "insert" is smaller than "target".
*/
-static bool insert_str(char *buf, cptr target, cptr insert)
+static bool insert_str(char *buf, concptr target, concptr insert)
{
int i, len;
int b_len, t_len, i_len;
buf = my_strstr(buf, target);
/* No target found */
- if (!buf) return (FALSE);
+ if (!buf) return FALSE;
/* Be sure we have an insertion string */
if (!insert) insert = "";
for (i = 0; i < i_len; ++i) buf[i] = insert[i];
/* Successful operation */
- return (TRUE);
+ return TRUE;
}
else
{
BIT_FLAGS mode;
- cptr act, s;
+ concptr act, s;
/* Roguelike */
if (rogue_like_commands)
}
}
}
-
- /* Paranoia */
if (d == 5) d = 0;
/* Return direction */
}
-#ifdef ALLOW_REPEAT /* TNB */
-
#define REPEAT_MAX 20
/* Number of chars saved */
bool repeat_pull(COMMAND_CODE *what)
{
/* All out of keys */
- if (repeat__idx == repeat__cnt) return (FALSE);
+ if (repeat__idx == repeat__cnt) return FALSE;
/* Grab the next key, advance */
*what = repeat__key[repeat__idx++];
/* Success */
- return (TRUE);
+ return TRUE;
}
void repeat_check(void)
}
}
-#endif /* ALLOW_REPEAT -- TNB */
-
#ifdef SORT_R_INFO
*
* NB: The keys added here will be interpreted by any macros or keymaps.
*/
-errr type_string(cptr str, uint len)
+errr type_string(concptr str, uint len)
{
errr err = 0;
- cptr s;
+ concptr s;
term *old = Term;
-void roff_to_buf(cptr str, int maxlen, char *tbuf, size_t bufsize)
+void roff_to_buf(concptr str, int maxlen, char *tbuf, size_t bufsize)
{
int read_pt = 0;
int write_pt = 0;
*
* This function should be equivalent to the strlcpy() function in BSD.
*/
-size_t my_strcpy(char *buf, const char *src, size_t bufsize)
+size_t my_strcpy(char *buf, concptr src, size_t bufsize)
{
#ifdef JP
char *d = buf;
- const char *s = src;
+ concptr s = src;
size_t len = 0;
if (bufsize > 0) {
size_t len = strlen(src);
size_t ret = len;
-
- /* Paranoia */
if (bufsize == 0) return ret;
/* Truncate */
*
* This function should be equivalent to the strlcat() function in BSD.
*/
-size_t my_strcat(char *buf, const char *src, size_t bufsize)
+size_t my_strcat(char *buf, concptr src, size_t bufsize)
{
size_t dlen = strlen(buf);
*
* my_strstr() can handle Kanji strings correctly.
*/
-char *my_strstr(const char *haystack, const char *needle)
+char *my_strstr(concptr haystack, concptr needle)
{
int i;
int l1 = strlen(haystack);
*
* my_strchr() can handle Kanji strings correctly.
*/
-char *my_strchr(const char *ptr, char ch)
+char *my_strchr(concptr ptr, char ch)
{
for ( ; *ptr != '\0'; ptr++)
{
int inkey_special(bool numpad_cursor)
{
static const struct {
- cptr keyname;
+ concptr keyname;
int keyflag;
} modifier_key_list[] = {
{"shift-", SKEY_MOD_SHIFT},
static const struct {
bool numpad;
- cptr keyname;
+ concptr keyname;
int keycode;
} special_key_list[] = {
{FALSE, "Down]", SKEY_DOWN},
};
static const struct {
- cptr keyname;
+ concptr keyname;
int keycode;
} gcu_special_key_list[] = {
{"A", SKEY_UP},
};
char buf[1024];
- cptr str = buf;
+ concptr str = buf;
char key;
int skey = 0;
int modifier = 0;
/* Return normal keycode */
return (int)((unsigned char)key);
}
+