X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcmd4.c;h=f388fb06e97398c78ff15924692285628eac4432;hb=b87eb07f1d5fe0bc3923868e2609b966a9c68a44;hp=15cc366b564e950c897ae559b6597283ac23baf8;hpb=eaac4df8c0a956c79ba6c38c55b9fa7c5610c013;p=hengband%2Fhengband.git diff --git a/src/cmd4.c b/src/cmd4.c index 15cc366b5..f388fb06e 100644 --- a/src/cmd4.c +++ b/src/cmd4.c @@ -1,56 +1,98 @@ /* File: cmd4.c */ -/* Purpose: Interface commands */ - /* - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke + * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. + * This software may be copied and distributed for educational, research, + * and not for profit purposes provided that this copyright and statement + * are included in all such copies. Other copyrights may also apply. */ +/* Purpose: Interface commands */ + #include "angband.h" + +/* + * A set of functions to maintain automatic dumps of various kinds. + * -Mogami- + * + * remove_auto_dump(orig_file, mark) + * Remove the old automatic dump of type "mark". + * auto_dump_printf(fmt, ...) + * Dump a formatted string using fprintf(). + * open_auto_dump(buf, mark) + * Open a file, remove old dump, and add new header. + * close_auto_dump(void) + * Add a footer, and close the file. + * + * The dump commands of original Angband simply add new lines to + * existing files; these files will become bigger and bigger unless + * an user deletes some or all of these files by hand at some + * point. + * + * These three functions automatically delete old dumped lines + * before adding new ones. Since there are various kinds of automatic + * dumps in a single file, we add a header and a footer with a type + * name for every automatic dump, and kill old lines only when the + * lines have the correct type of header and footer. + * + * We need to be quite paranoid about correctness; the user might + * (mistakenly) edit the file by hand, and see all their work come + * to nothing on the next auto dump otherwise. The current code only + * detects changes by noting inconsistencies between the actual number + * of lines and the number written in the footer. Note that this will + * not catch single-line edits. + */ + /* - * mark strings for auto dump + * Mark strings for auto dump */ static char auto_dump_header[] = "# vvvvvvv== %s ==vvvvvvv"; static char auto_dump_footer[] = "# ^^^^^^^== %s ==^^^^^^^"; /* + * Variables for auto dump + */ +static FILE *auto_dump_stream; +static cptr auto_dump_mark; +static int auto_dump_line_num; + +/* * Remove old lines automatically generated before. */ -static void remove_auto_dump(cptr orig_file, cptr mark) +static void remove_auto_dump(cptr orig_file) { FILE *tmp_fff, *orig_fff; char tmp_file[1024]; char buf[1024]; bool between_mark = FALSE; - bool success = FALSE; + bool changed = FALSE; int line_num = 0; long header_location = 0; char header_mark_str[80]; char footer_mark_str[80]; size_t mark_len; - sprintf(header_mark_str, auto_dump_header, mark); - sprintf(footer_mark_str, auto_dump_footer, mark); + /* Prepare a header/footer mark string */ + sprintf(header_mark_str, auto_dump_header, auto_dump_mark); + sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark); mark_len = strlen(footer_mark_str); - /* If original file is not exist, nothing to do */ + /* Open an old dump file in read-only mode */ orig_fff = my_fopen(orig_file, "r"); - if (!orig_fff) - { - return; - } - /* Open a new file */ + /* If original file does not exist, nothing to do */ + if (!orig_fff) return; + + /* Open a new (temporary) file */ tmp_fff = my_fopen_temp(tmp_file, 1024); - if (!tmp_fff) { + + if (!tmp_fff) + { #ifdef JP msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", tmp_file); #else @@ -59,100 +101,180 @@ static void remove_auto_dump(cptr orig_file, cptr mark) msg_print(NULL); return; } - - while (1) + + /* Loop for every line */ + while (TRUE) { + /* Read a line */ if (my_fgets(orig_fff, buf, sizeof(buf))) { + /* Read error: Assume End of File */ + + /* + * Was looking for the footer, but not found. + * + * Since automatic dump might be edited by hand, + * it's dangerous to kill these lines. + * Seek back to the next line of the (pseudo) header, + * and read again. + */ if (between_mark) { fseek(orig_fff, header_location, SEEK_SET); between_mark = FALSE; continue; } + + /* Success -- End the loop */ else { break; } } + /* We are looking for the header mark of automatic dump */ if (!between_mark) { + /* Is this line a header? */ if (!strcmp(buf, header_mark_str)) { + /* Memorise seek point of this line */ header_location = ftell(orig_fff); + + /* Initialize counter for number of lines */ line_num = 0; + + /* Look for the footer from now */ between_mark = TRUE; - success = TRUE; + + /* There are some changes */ + changed = TRUE; } + + /* Not a header */ else { + /* Copy orginally lines */ fprintf(tmp_fff, "%s\n", buf); } } + + /* We are looking for the footer mark of automatic dump */ else { + /* Is this line a footer? */ if (!strncmp(buf, footer_mark_str, mark_len)) { int tmp; + /* + * Compare the number of lines + * + * If there is an inconsistency between + * actual number of lines and the + * number here, the automatic dump + * might be edited by hand. So it's + * dangerous to kill these lines. + * Seek back to the next line of the + * (pseudo) header, and read again. + */ if (!sscanf(buf + mark_len, " (%d)", &tmp) || tmp != line_num) { fseek(orig_fff, header_location, SEEK_SET); } + /* Look for another header */ between_mark = FALSE; } + + /* Not a footer */ else { + /* Ignore old line, and count number of lines */ line_num++; } } } + + /* Close files */ my_fclose(orig_fff); my_fclose(tmp_fff); - if (success) + /* If there are some changes, overwrite the original file with new one */ + if (changed) { - /* copy contents of temporally file */ + /* Copy contents of temporary file */ tmp_fff = my_fopen(tmp_file, "r"); orig_fff = my_fopen(orig_file, "w"); - + while (!my_fgets(tmp_fff, buf, sizeof(buf))) fprintf(orig_fff, "%s\n", buf); - + my_fclose(orig_fff); my_fclose(tmp_fff); } + + /* Kill the temporary file */ fd_kill(tmp_file); return; } + +/* + * Dump a formatted line, using "vstrnfmt()". + */ +static void auto_dump_printf(cptr fmt, ...) +{ + cptr p; + va_list vp; + + char buf[1024]; + + /* Begin the Varargs Stuff */ + va_start(vp, fmt); + + /* Format the args, save the length */ + (void)vstrnfmt(buf, sizeof(buf), fmt, vp); + + /* End the Varargs Stuff */ + va_end(vp); + + /* Count number of lines */ + for (p = buf; *p; p++) + { + if (*p == '\n') auto_dump_line_num++; + } + + /* Dump it */ + fprintf(auto_dump_stream, "%s", buf); +} + + /* * Open file to append auto dump. */ -static FILE *open_auto_dump(cptr buf, cptr mark, int *line) +static bool open_auto_dump(cptr buf, cptr mark) { - FILE *fff; char header_mark_str[80]; - /* Drop priv's */ - safe_setuid_drop(); + /* Save the mark string */ + auto_dump_mark = mark; - sprintf(header_mark_str, auto_dump_header, mark); + /* Prepare a header mark string */ + sprintf(header_mark_str, auto_dump_header, auto_dump_mark); /* Remove old macro dumps */ - remove_auto_dump(buf, mark); + remove_auto_dump(buf); /* Append to the file */ - fff = my_fopen(buf, "a"); + auto_dump_stream = my_fopen(buf, "a"); /* Failure */ - if (!fff) { + if (!auto_dump_stream) { #ifdef JP msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf); #else @@ -160,61 +282,81 @@ static FILE *open_auto_dump(cptr buf, cptr mark, int *line) #endif msg_print(NULL); - /* Grab priv's */ - safe_setuid_grab(); - - return NULL; + /* Failed */ + return FALSE; } /* Start dumping */ - fprintf(fff, "%s\n", header_mark_str); + fprintf(auto_dump_stream, "%s\n", header_mark_str); + + /* Initialize counter */ + auto_dump_line_num = 0; #ifdef JP - fprintf(fff, "# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n"); - fprintf(fff, "# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n"); + auto_dump_printf("# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n"); + auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n"); #else - fprintf(fff, "# *Warning!!* The lines below are automatic dump.\n"); - fprintf(fff, "# *Warning!!* Don't edit these! These lines will be deleted automaticaly.\n"); + auto_dump_printf("# *Warning!* The lines below are an automatic dump.\n"); + auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n"); #endif - *line = 2; - return fff; + /* Success */ + return TRUE; } /* * Append foot part and close auto dump. */ -static void close_auto_dump(FILE *fff, cptr mark, int line_num) +static void close_auto_dump(void) { char footer_mark_str[80]; - sprintf(footer_mark_str, auto_dump_footer, mark); + /* Prepare a footer mark string */ + sprintf(footer_mark_str, auto_dump_footer, auto_dump_mark); - /* End of dumping */ #ifdef JP - fprintf(fff, "# *·Ù¹ð!!* °Ê¾å¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n"); - fprintf(fff, "# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n"); + auto_dump_printf("# *·Ù¹ð!!* °Ê¾å¤Î¹Ô¤Ï¼«Æ°À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£\n"); + auto_dump_printf("# *·Ù¹ð!!* ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤Î¤ÇÊÔ½¸¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\n"); #else - fprintf(fff, "# *Warning!!* The lines above are automatic dump.\n"); - fprintf(fff, "# *Warning!!* Don't edit these! These lines will be deleted automaticaly.\n"); + auto_dump_printf("# *Warning!* The lines above are an automatic dump.\n"); + auto_dump_printf("# Don't edit them; changes will be deleted and replaced automatically.\n"); #endif - line_num += 2; - fprintf(fff, "%s (%d)\n", footer_mark_str, line_num); + /* End of dump */ + fprintf(auto_dump_stream, "%s (%d)\n", footer_mark_str, auto_dump_line_num); - my_fclose(fff); + /* Close */ + my_fclose(auto_dump_stream); - /* Grab priv's */ - safe_setuid_grab(); - return; } +#ifndef JP /* - * Take note to the dialy. + * Return suffix of ordinal number */ +cptr get_ordinal_number_suffix(int num) +{ + num = ABS(num) % 100; + switch (num % 10) + { + case 1: + return (num == 11) ? "th" : "st"; + case 2: + return (num == 12) ? "th" : "nd"; + case 3: + return (num == 13) ? "th" : "rd"; + default: + return "th"; + } +} +#endif + +/* + * Take note to the diary. + */ errr do_cmd_write_nikki(int type, int num, cptr note) { int day, hour, min; @@ -223,6 +365,8 @@ errr do_cmd_write_nikki(int type, int num, cptr note) char buf[1024]; cptr note_level = ""; bool do_level = TRUE; + char note_level_buf[40]; + int q_idx; static bool disable_nikki = FALSE; @@ -257,9 +401,6 @@ errr do_cmd_write_nikki(int type, int num, cptr note) sprintf(file_name,"playrec-%s.txt",savefile_base); #endif - /* Hack -- drop permissions */ - safe_setuid_drop(); - /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name); @@ -271,8 +412,6 @@ errr do_cmd_write_nikki(int type, int num, cptr note) /* Failure */ if (!fff) { - /* Hack -- grab permissions */ - safe_setuid_grab(); #ifdef JP msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£¥×¥ì¥¤µ­Ï¿¤ò°ì»þÄä»ß¤·¤Þ¤¹¡£", buf); #else @@ -283,6 +422,8 @@ errr do_cmd_write_nikki(int type, int num, cptr note) return (-1); } + q_idx = quest_number(dun_level); + if (write_level) { if (p_ptr->inside_arena) @@ -297,18 +438,22 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #else note_level = "Surface:"; #endif - else if (quest_number(dun_level) && ((quest_number(dun_level) < MIN_RANDOM_QUEST) && !(quest_number(dun_level) == QUEST_OBERON || quest_number(dun_level) == QUEST_SERPENT))) + else if (q_idx && (is_fixed_quest_idx(q_idx) + && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT)))) #ifdef JP note_level = "¥¯¥¨¥¹¥È:"; #else note_level = "Quest:"; #endif else + { #ifdef JP - note_level = format("%d³¬(%s):", dun_level, d_name+d_info[dungeon_type].name); + sprintf(note_level_buf, "%d³¬(%s):", dun_level, d_name+d_info[dungeon_type].name); #else - note_level = format("%s L%d:", d_name+d_info[dungeon_type].name, dun_level); + sprintf(note_level_buf, "%s L%d:", d_name+d_info[dungeon_type].name, dun_level); #endif + note_level = note_level_buf; + } } switch(type) @@ -316,9 +461,11 @@ errr do_cmd_write_nikki(int type, int num, cptr note) case NIKKI_HIGAWARI: { #ifdef JP - fprintf(fff, "%dÆüÌÜ\n",day); + if (day < MAX_DAYS) fprintf(fff, "%dÆüÌÜ\n", day); + else fputs("*****ÆüÌÜ\n", fff); #else - fprintf(fff, "Day %d\n",day); + if (day < MAX_DAYS) fprintf(fff, "Day %d\n", day); + else fputs("Day *****\n", fff); #endif do_level = FALSE; break; @@ -339,7 +486,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s %s¤òȯ¸«¤·¤¿¡£\n", hour, min, note_level, note); #else - fprintf(fff, " %2d:%02d %20s discover %s.\n", hour, min, note_level, note); + fprintf(fff, " %2d:%02d %20s discovered %s.\n", hour, min, note_level, note); #endif break; } @@ -379,7 +526,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s ¥é¥ó¥À¥à¥¯¥¨¥¹¥È(%s)¤òãÀ®¤·¤¿¡£\n", hour, min, note_level, name); #else - fprintf(fff, " %2d:%02d %20s completed randome quest '%s'\n", hour, min, note_level, name); + fprintf(fff, " %2d:%02d %20s completed random quest '%s'\n", hour, min, note_level, name); #endif break; } @@ -415,7 +562,8 @@ errr do_cmd_write_nikki(int type, int num, cptr note) case NIKKI_STAIR: { cptr to; - if (quest_number(dun_level) && ((quest_number(dun_level) < MIN_RANDOM_QUEST) && !(quest_number(dun_level) == QUEST_OBERON || quest_number(dun_level) == QUEST_SERPENT))) + if (q_idx && (is_fixed_quest_idx(q_idx) + && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT)))) { #ifdef JP to = "ÃϾå"; @@ -429,11 +577,11 @@ errr do_cmd_write_nikki(int type, int num, cptr note) if (!(dun_level+num)) to = "ÃϾå"; else to = format("%d³¬", dun_level+num); #else - if (!(dun_level+num)) to = "the surfice"; + if (!(dun_level+num)) to = "the surface"; else to = format("level %d", dun_level+num); #endif } - + #ifdef JP fprintf(fff, " %2d:%02d %20s %s¤Ø%s¡£\n", hour, min, note_level, to, note); #else @@ -447,13 +595,13 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤Æ%s¤Î%d³¬¤Ø²¼¤ê¤¿¡£\n", hour, min, note_level, d_name+d_info[dungeon_type].name, max_dlv[dungeon_type]); #else - fprintf(fff, " %2d:%02d %20s recall to dungeon level %d of %s.\n", hour, min, note_level, max_dlv[dungeon_type], d_name+d_info[dungeon_type].name); + fprintf(fff, " %2d:%02d %20s recalled to dungeon level %d of %s.\n", hour, min, note_level, max_dlv[dungeon_type], d_name+d_info[dungeon_type].name); #endif else #ifdef JP fprintf(fff, " %2d:%02d %20s µ¢´Ô¤ò»È¤Ã¤ÆÃϾå¤Ø¤ÈÌá¤Ã¤¿¡£\n", hour, min, note_level); #else - fprintf(fff, " %2d:%02d %20s recall from dungeon to surface.\n", hour, min, note_level); + fprintf(fff, " %2d:%02d %20s recalled from dungeon to surface.\n", hour, min, note_level); #endif break; } @@ -463,7 +611,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s ¥¯¥¨¥¹¥È¡Ö%s¡×¤Ø¤ÈÆÍÆþ¤·¤¿¡£\n", hour, min, note_level, quest[num].name); #else - fprintf(fff, " %2d:%02d %20s enter quest '%s'.\n", hour, min, note_level, quest[num].name); + fprintf(fff, " %2d:%02d %20s entered the quest '%s'.\n", hour, min, note_level, quest[num].name); #endif break; } @@ -472,7 +620,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¡¦¥Æ¥ì¥Ý¡¼¥È¤Çæ½Ð¤·¤¿¡£\n", hour, min, note_level); #else - fprintf(fff, " %2d:%02d %20s Get out using teleport level.\n", hour, min, note_level); + fprintf(fff, " %2d:%02d %20s Got out using teleport level.\n", hour, min, note_level); #endif break; } @@ -481,7 +629,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s %s¤ò¹ØÆþ¤·¤¿¡£\n", hour, min, note_level, note); #else - fprintf(fff, " %2d:%02d %20s buy %s.\n", hour, min, note_level, note); + fprintf(fff, " %2d:%02d %20s bought %s.\n", hour, min, note_level, note); #endif break; } @@ -490,34 +638,33 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s %s¤òÇäµÑ¤·¤¿¡£\n", hour, min, note_level, note); #else - fprintf(fff, " %2d:%02d %20s sell %s.\n", hour, min, note_level, note); + fprintf(fff, " %2d:%02d %20s sold %s.\n", hour, min, note_level, note); #endif break; } case NIKKI_ARENA: { - if (num == 99) + if (num < 0) { - #ifdef JP - fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï¤Ç¡¢%s¤ÎÁ°¤ËÇÔ¤ìµî¤Ã¤¿¡£\n", hour, min, note_level, p_ptr->arena_number + 1, note); + fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï¤Ç¡¢%s¤ÎÁ°¤ËÇÔ¤ìµî¤Ã¤¿¡£\n", hour, min, note_level, -num, note); #else - int n = p_ptr->arena_number + 1; - fprintf(fff, " %2d:%02d %20s beaten by %s in the %d%s fight.\n", hour, min, note_level, note, n, (n%10==1?"st":n%10==2?"nd":n%10==3?"rd":"th")); + int n = -num; + fprintf(fff, " %2d:%02d %20s beaten by %s in the %d%s fight.\n", hour, min, note_level, note, n, get_ordinal_number_suffix(n)); #endif break; } #ifdef JP fprintf(fff, " %2d:%02d %20s Æ®µ»¾ì¤Î%d²óÀï(%s)¤Ë¾¡Íø¤·¤¿¡£\n", hour, min, note_level, num, note); #else - fprintf(fff, " %2d:%02d %20s win the %d%s fight (%s).\n", hour, min, note_level, num, (num%10==1?"st":num%10==2?"nd":num%10==3?"rd":"th"), note); + fprintf(fff, " %2d:%02d %20s won the %d%s fight (%s).\n", hour, min, note_level, num, get_ordinal_number_suffix(num), note); #endif if (num == MAX_ARENA_MONS) { #ifdef JP fprintf(fff, " Æ®µ»¾ì¤Î¤¹¤Ù¤Æ¤ÎŨ¤Ë¾¡Íø¤·¡¢¥Á¥ã¥ó¥Ô¥ª¥ó¤È¤Ê¤Ã¤¿¡£\n"); #else - fprintf(fff, " win all fight to become a Chanpion.\n"); + fprintf(fff, " won all fight to become a Chanpion.\n"); #endif do_level = FALSE; } @@ -528,7 +675,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s %s¤ò¼±Ê̤·¤¿¡£\n", hour, min, note_level, note); #else - fprintf(fff, " %2d:%02d %20s identify %s.\n", hour, min, note_level, note); + fprintf(fff, " %2d:%02d %20s identified %s.\n", hour, min, note_level, note); #endif break; } @@ -547,7 +694,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #else to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name); #endif - + #ifdef JP fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥¦¥£¥¶¡¼¥É¡¦¥Æ¥ì¥Ý¡¼¥È¤Ç°ÜÆ°¤·¤¿¡£\n", hour, min, note_level, to); #else @@ -570,11 +717,11 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #else to = format("level %d of %s", dun_level, d_name+d_info[dungeon_type].name); #endif - + #ifdef JP fprintf(fff, " %2d:%02d %20s %s¤Ø¤È¥Ñ¥¿¡¼¥ó¤ÎÎϤǰÜÆ°¤·¤¿¡£\n", hour, min, note_level, to); #else - fprintf(fff, " %2d:%02d %20s use Pattern to teleport to %s.\n", hour, min, note_level, to); + fprintf(fff, " %2d:%02d %20s used Pattern to teleport to %s.\n", hour, min, note_level, to); #endif break; } @@ -583,7 +730,7 @@ errr do_cmd_write_nikki(int type, int num, cptr note) #ifdef JP fprintf(fff, " %2d:%02d %20s ¥ì¥Ù¥ë¤¬%d¤Ë¾å¤¬¤Ã¤¿¡£\n", hour, min, note_level, num); #else - fprintf(fff, " %2d:%02d %20s reach player level %d.\n", hour, min, note_level, num); + fprintf(fff, " %2d:%02d %20s reached player level %d.\n", hour, min, note_level, num); #endif break; } @@ -604,60 +751,109 @@ errr do_cmd_write_nikki(int type, int num, cptr note) fprintf(fff, " %2d:%02d %20s ", hour, min, note_level); switch (num) { - case 0: + case RECORD_NAMED_PET_NAME: #ifdef JP fprintf(fff, "%s¤òι¤Îͧ¤Ë¤¹¤ë¤³¤È¤Ë·è¤á¤¿¡£\n", note); #else - fprintf(fff, "decide to travel together with %s.\n", note); + fprintf(fff, "decided to travel together with %s.\n", note); #endif break; - case 1: + case RECORD_NAMED_PET_UNNAME: #ifdef JP fprintf(fff, "%s¤Î̾Á°¤ò¾Ã¤·¤¿¡£\n", note); #else - fprintf(fff, "unname %s.\n", note); + fprintf(fff, "unnamed %s.\n", note); #endif break; - case 2: + case RECORD_NAMED_PET_DISMISS: #ifdef JP fprintf(fff, "%s¤ò²òÊü¤·¤¿¡£\n", note); #else - fprintf(fff, "dismiss %s.\n", note); + fprintf(fff, "dismissed %s.\n", note); #endif break; - case 3: + case RECORD_NAMED_PET_DEATH: #ifdef JP fprintf(fff, "%s¤¬»à¤ó¤Ç¤·¤Þ¤Ã¤¿¡£\n", note); #else - fprintf(fff, "%s die.\n", note); + fprintf(fff, "%s died.\n", note); #endif break; - case 4: + case RECORD_NAMED_PET_MOVED: #ifdef JP fprintf(fff, "%s¤ò¤ª¤¤¤ÆÊ̤ΥޥåפذÜÆ°¤·¤¿¡£\n", note); #else - fprintf(fff, "move to other map leaving %s behind.\n", note); + fprintf(fff, "moved to another map leaving %s behind.\n", note); #endif break; - case 5: + case RECORD_NAMED_PET_LOST_SIGHT: #ifdef JP fprintf(fff, "%s¤È¤Ï¤°¤ì¤Æ¤·¤Þ¤Ã¤¿¡£\n", note); #else - fprintf(fff, "lose sight of %s.\n", note); + fprintf(fff, "lost sight of %s.\n", note); #endif break; - case 6: + case RECORD_NAMED_PET_DESTROY: #ifdef JP fprintf(fff, "%s¤¬*Ç˲õ*¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note); #else - fprintf(fff, "%s is made disappeared by *destruction*.\n", note); + fprintf(fff, "%s was made disappeared by *destruction*.\n", note); #endif break; - case 7: + case RECORD_NAMED_PET_EARTHQUAKE: #ifdef JP fprintf(fff, "%s¤¬´äÀФ˲¡¤·ÄÙ¤µ¤ì¤¿¡£\n", note); #else - fprintf(fff, "%s is crushed by falling rocks.\n", note); + fprintf(fff, "%s was crushed by falling rocks.\n", note); +#endif + break; + case RECORD_NAMED_PET_GENOCIDE: +#ifdef JP + fprintf(fff, "%s¤¬Ëõ»¦¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note); +#else + fprintf(fff, "%s was made disappeared by genocide.\n", note); +#endif + break; + case RECORD_NAMED_PET_WIZ_ZAP: +#ifdef JP + fprintf(fff, "%s¤¬¥Ç¥Ð¥Ã¥°¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note); +#else + fprintf(fff, "%s was removed by debug command.\n", note); +#endif + break; + case RECORD_NAMED_PET_TELE_LEVEL: +#ifdef JP + fprintf(fff, "%s¤¬¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë¤Ë¤è¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note); +#else + fprintf(fff, "%s was made disappeared by teleport level.\n", note); +#endif + break; + case RECORD_NAMED_PET_BLAST: +#ifdef JP + fprintf(fff, "%s¤òÇúÇˤ·¤¿¡£\n", note); +#else + fprintf(fff, "blasted %s.\n", note); +#endif + break; + case RECORD_NAMED_PET_HEAL_LEPER: +#ifdef JP + fprintf(fff, "%s¤Îɵ¤¤¬¼£¤ê餫¤é³°¤ì¤¿¡£\n", note); +#else + fprintf(fff, "%s was healed and left.\n", note); +#endif + break; + case RECORD_NAMED_PET_COMPACT: +#ifdef JP + fprintf(fff, "%s¤¬¥â¥ó¥¹¥¿¡¼¾ðÊ󰵽̤ˤè¤Ã¤Æ¾Ã¤¨µî¤Ã¤¿¡£\n", note); +#else + fprintf(fff, "%s was made disappeared by compacting monsters.\n", note); +#endif + break; + case RECORD_NAMED_PET_LOSE_PARENT: +#ifdef JP + fprintf(fff, "%s¤Î¾¤´­¼Ô¤¬´û¤Ë¤¤¤Ê¤¤¤¿¤á¾Ã¤¨µî¤Ã¤¿¡£\n", note); +#else + fprintf(fff, "%s disappeared because there does not exist summoner.\n", note); #endif break; default: @@ -672,9 +868,6 @@ errr do_cmd_write_nikki(int type, int num, cptr note) my_fclose(fff); - /* Hack -- grab permissions */ - safe_setuid_grab(); - if (do_level) write_level = FALSE; return (0); @@ -761,9 +954,6 @@ static void do_cmd_disp_nikki(void) sprintf(file_name,"playrec-%s.txt",savefile_base); #endif - /* Hack -- drop permissions */ - safe_setuid_drop(); - /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name); @@ -783,9 +973,6 @@ static void do_cmd_disp_nikki(void) /* Display the file contents */ show_file(FALSE, buf, nikki_title, -1, 0); - - /* Hack -- grab permissions */ - safe_setuid_grab(); } static void do_cmd_bunshou(void) @@ -848,9 +1035,6 @@ static void do_cmd_erase_nikki(void) sprintf(file_name,"playrec-%s.txt",savefile_base); #endif - /* Hack -- drop permissions */ - safe_setuid_drop(); - /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, file_name); @@ -873,9 +1057,6 @@ static void do_cmd_erase_nikki(void) #endif } msg_print(NULL); - - /* Hack -- grab permissions */ - safe_setuid_grab(); } @@ -909,11 +1090,15 @@ void do_cmd_nikki(void) prt("(2) ʸ¾Ï¤òµ­Ï¿¤¹¤ë", 5, 5); prt("(3) ľÁ°¤ËÆþ¼êËô¤Ï´ÕÄꤷ¤¿¤â¤Î¤òµ­Ï¿¤¹¤ë", 6, 5); prt("(4) µ­Ï¿¤ò¾Ãµî¤¹¤ë", 7, 5); + + prt("(R) ¥×¥ì¥¤Æ°²è¤òµ­Ï¿¤¹¤ë/Ãæ»ß¤¹¤ë", 9, 5); #else prt("(1) Display your record", 4, 5); prt("(2) Add record", 5, 5); prt("(3) Record item you last get/identify", 6, 5); prt("(4) Delete your record", 7, 5); + + prt("(R) Record playing movie / or stop it", 9, 5); #endif @@ -945,6 +1130,10 @@ void do_cmd_nikki(void) case '4': do_cmd_erase_nikki(); break; + case 'r': case 'R': + screen_load(); + prepare_movie_hooks(); + return; default: /* Unknown option */ bell(); } @@ -1161,23 +1350,26 @@ void do_cmd_message_one(void) */ void do_cmd_messages(int num_now) { - int i, j, k, n; - uint q; + int i, n; - char shower[80]; - char finder[80]; + char shower_str[81]; + char finder_str[81]; + char back_str[81]; + cptr shower = NULL; int wid, hgt; - + int num_lines; /* Get size */ Term_get_size(&wid, &hgt); + /* Number of message lines in a screen */ + num_lines = hgt - 4; + /* Wipe finder */ - strcpy(finder, ""); + strcpy(finder_str, ""); /* Wipe shower */ - strcpy(shower, ""); - + strcpy(shower_str, ""); /* Total messages */ n = message_num(); @@ -1185,41 +1377,38 @@ void do_cmd_messages(int num_now) /* Start on first message */ i = 0; - /* Start at leftmost edge */ - q = 0; - /* Save the screen */ screen_save(); + /* Clear screen */ + Term_clear(); + /* Process requests until done */ while (1) { - /* Clear screen */ - Term_clear(); + int j; + int skey; /* Dump up to 20 lines of messages */ - for (j = 0; (j < hgt - 4) && (i + j < n); j++) + for (j = 0; (j < num_lines) && (i + j < n); j++) { cptr msg = message_str(i+j); - /* Apply horizontal scroll */ - msg = (strlen(msg) >= q) ? (msg + q) : ""; - /* Dump the messages, bottom to top */ - Term_putstr(0, hgt-j-3, -1, (bool)(i+j < num_now ? TERM_WHITE : TERM_SLATE), msg); + c_prt((i + j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0); /* Hilite "shower" */ - if (shower[0]) + if (shower && shower[0]) { cptr str = msg; /* Display matches */ - while ((str = strstr(str, shower)) != NULL) + while ((str = my_strstr(str, shower)) != NULL) { int len = strlen(shower); /* Display the match */ - Term_putstr(str-msg, hgt-j-3, len, TERM_YELLOW, shower); + Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower); /* Advance */ str += len; @@ -1227,17 +1416,22 @@ void do_cmd_messages(int num_now) } } + /* Erase remaining lines */ + for (; j < num_lines; j++) + { + Term_erase(0, num_lines + 1 - j, 255); + } + /* Display header XXX XXX XXX */ #ifdef JP /* translation */ - prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d) ¥ª¥Õ¥»¥Ã¥È(%d)", - i, i+j-1, n, q), 0, 0); + prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d)", + i, i + j - 1, n), 0, 0); #else - prt(format("Message Recall (%d-%d of %d), Offset %d", - i, i+j-1, n, q), 0, 0); + prt(format("Message Recall (%d-%d of %d)", + i, i + j - 1, n), 0, 0); #endif - /* Display prompt (not very informative) */ #ifdef JP prt("[ 'p' ¤Ç¹¹¤Ë¸Å¤¤¤â¤Î, 'n' ¤Ç¹¹¤Ë¿·¤·¤¤¤â¤Î, '/' ¤Ç¸¡º÷, ESC ¤ÇÃæÃÇ ]", hgt - 1, 0); @@ -1245,39 +1439,19 @@ void do_cmd_messages(int num_now) prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0); #endif - /* Get a command */ - k = inkey(); + skey = inkey_special(TRUE); /* Exit on Escape */ - if (k == ESCAPE) break; + if (skey == ESCAPE) break; /* Hack -- Save the old index */ j = i; - /* Horizontal scroll */ - if (k == '4') - { - /* Scroll left */ - q = (q >= 40) ? (q - 40) : 0; - - /* Success */ - continue; - } - - /* Horizontal scroll */ - if (k == '6') + switch (skey) { - /* Scroll right */ - q = q + 40; - - /* Success */ - continue; - } - /* Hack -- handle show */ - if (k == '=') - { + case '=': /* Prompt */ #ifdef JP prt("¶¯Ä´: ", hgt - 1, 0); @@ -1285,90 +1459,121 @@ void do_cmd_messages(int num_now) prt("Show: ", hgt - 1, 0); #endif - /* Get a "shower" string, or continue */ - if (!askfor_aux(shower, 80)) continue; + strcpy(back_str, shower_str); + if (askfor(shower_str, 80)) + { + /* Show it */ + shower = shower_str[0] ? shower_str : NULL; + } + else strcpy(shower_str, back_str); /* Okay */ continue; - } /* Hack -- handle find */ - if (k == '/') - { - int z; + case '/': + case KTRL('s'): + { + int z; - /* Prompt */ + /* Prompt */ #ifdef JP - prt("¸¡º÷: ", hgt - 1, 0); + prt("¸¡º÷: ", hgt - 1, 0); #else - prt("Find: ", hgt - 1, 0); + prt("Find: ", hgt - 1, 0); #endif + /* Get a "finder" string, or continue */ + strcpy(back_str, finder_str); + if (!askfor(finder_str, 80)) + { + strcpy(finder_str, back_str); + continue; + } + else if (!finder_str[0]) + { + shower = NULL; /* Stop showing */ + continue; + } - /* Get a "finder" string, or continue */ - if (!askfor_aux(finder, 80)) continue; - - /* Show it */ - strcpy(shower, finder); - - /* Scan messages */ - for (z = i + 1; z < n; z++) - { - cptr msg = message_str(z); + /* Show it */ + shower = finder_str; - /* Search for it */ - if (strstr(msg, finder)) + /* Scan messages */ + for (z = i + 1; z < n; z++) { - /* New location */ - i = z; + cptr msg = message_str(z); - /* Done */ - break; + /* Search for it */ + if (my_strstr(msg, finder_str)) + { + /* New location */ + i = z; + + /* Done */ + break; + } } } - } + break; /* Recall 1 older message */ - if ((k == '8') || (k == '\n') || (k == '\r')) - { - /* Go newer if legal */ - if (i + 1 < n) i += 1; - } + case SKEY_TOP: + /* Go to the oldest line */ + i = n - num_lines; + break; + + /* Recall 1 newer message */ + case SKEY_BOTTOM: + /* Go to the newest line */ + i = 0; + break; + + /* Recall 1 older message */ + case '8': + case SKEY_UP: + case '\n': + case '\r': + /* Go older if legal */ + i = MIN(i + 1, n - num_lines); + break; /* Recall 10 older messages */ - if (k == '+') - { + case '+': /* Go older if legal */ - if (i + 10 < n) i += 10; - } + i = MIN(i + 10, n - num_lines); + break; /* Recall 20 older messages */ - if ((k == 'p') || (k == KTRL('P')) || (k == ' ')) - { + case 'p': + case KTRL('P'): + case ' ': + case SKEY_PGUP: /* Go older if legal */ - if (i + 20 < n) i += 20; - } + i = MIN(i + num_lines, n - num_lines); + break; /* Recall 20 newer messages */ - if ((k == 'n') || (k == KTRL('N'))) - { + case 'n': + case KTRL('N'): + case SKEY_PGDOWN: /* Go newer (if able) */ - i = (i >= 20) ? (i - 20) : 0; - } + i = MAX(0, i - num_lines); + break; /* Recall 10 newer messages */ - if (k == '-') - { + case '-': /* Go newer (if able) */ - i = (i >= 20) ? (i - 20) : 0; - } + i = MAX(0, i - 10); + break; /* Recall 1 newer messages */ - if (k == '2') - { + case '2': + case SKEY_DOWN: /* Go newer (if able) */ - i = (i >= 1) ? (i - 1) : 0; + i = MAX(0, i - 1); + break; } /* Hack -- Error of some kind */ @@ -1614,17 +1819,19 @@ static option_type autosave_info[2] = static s16b toggle_frequency(s16b current) { - if (current == 0) return 50; - if (current == 50) return 100; - if (current == 100) return 250; - if (current == 250) return 500; - if (current == 500) return 1000; - if (current == 1000) return 2500; - if (current == 2500) return 5000; - if (current == 5000) return 10000; - if (current == 10000) return 25000; - - return 0; + switch (current) + { + case 0: return 50; + case 50: return 100; + case 100: return 250; + case 250: return 500; + case 500: return 1000; + case 1000: return 2500; + case 2500: return 5000; + case 5000: return 10000; + case 10000: return 25000; + default: return 0; + } } @@ -1770,8 +1977,6 @@ static void do_cmd_options_autosave(cptr info) } -#define PAGE_AUTODESTROY 7 - /* * Interact with some options */ @@ -1781,6 +1986,8 @@ void do_cmd_options_aux(int page, cptr info) int i, k = 0, n = 0, l; int opt[24]; char buf[80]; + bool browse_only = (page == OPT_PAGE_BIRTH) && character_generated && + (!p_ptr->wizard || !allow_debug_opts); /* Lookup the options */ @@ -1804,9 +2011,9 @@ void do_cmd_options_aux(int page, cptr info) /* Prompt XXX XXX XXX */ #ifdef JP - sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, y/n:Êѹ¹, ESC:½ªÎ», ?:¥Ø¥ë¥×) ", info); + sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, %sESC:½ªÎ», ?:¥Ø¥ë¥×) ", info, browse_only ? "" : "y/n:Êѹ¹, "); #else - sprintf(buf, "%s (RET:next, y/n:change, ESC:accept, ?:help) ", info); + sprintf(buf, "%s (RET:next, %s, ?:help) ", info, browse_only ? "ESC:exit" : "y/n:change, ESC:accept"); #endif prt(buf, 0, 0); @@ -1814,9 +2021,9 @@ void do_cmd_options_aux(int page, cptr info) /* HACK -- description for easy-auto-destroy options */ #ifdef JP - if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤­¤Î¤ßÍ­¸ú", 6, 6); + if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤­¤Î¤ßÍ­¸ú", 6, 6); #else - if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3); + if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3); #endif /* Display the options */ @@ -1837,11 +2044,11 @@ void do_cmd_options_aux(int page, cptr info) #endif option_info[opt[i]].o_text); - if ((page == PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0); + if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0); else c_prt(a, buf, i + 2, 0); } - if ((page == PAGE_AUTODESTROY) && (k > 2)) l = 3; + if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3; else l = 0; /* Hilite current option */ @@ -1886,6 +2093,7 @@ void do_cmd_options_aux(int page, cptr info) case 'Y': case '6': { + if (browse_only) break; (*option_info[opt[k]].o_var) = TRUE; k = (k + 1) % n; break; @@ -1895,6 +2103,7 @@ void do_cmd_options_aux(int page, cptr info) case 'N': case '4': { + if (browse_only) break; (*option_info[opt[k]].o_var) = FALSE; k = (k + 1) % n; break; @@ -1903,7 +2112,7 @@ void do_cmd_options_aux(int page, cptr info) case 't': case 'T': { - (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var); + if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var); break; } @@ -1917,7 +2126,7 @@ void do_cmd_options_aux(int page, cptr info) /* Peruse the help file */ (void)show_file(TRUE, buf, NULL, 0, 0); - Term_clear(); + Term_clear(); break; } @@ -2127,6 +2336,55 @@ static void do_cmd_options_win(void) +#define OPT_NUM 15 + +static struct opts +{ + char key; + cptr name; + int row; +} +option_fields[OPT_NUM] = +{ +#ifdef JP + { '1', " ¥­¡¼ÆþÎÏ ¥ª¥×¥·¥ç¥ó", 3 }, + { '2', " ¥Þ¥Ã¥×²èÌÌ ¥ª¥×¥·¥ç¥ó", 4 }, + { '3', " ¥Æ¥­¥¹¥Èɽ¼¨ ¥ª¥×¥·¥ç¥ó", 5 }, + { '4', " ¥²¡¼¥à¥×¥ì¥¤ ¥ª¥×¥·¥ç¥ó", 6 }, + { '5', " ¹ÔÆ°Ãæ»ß´Ø·¸ ¥ª¥×¥·¥ç¥ó", 7 }, + { '6', " ´Ê°×¼«Æ°Ç˲õ ¥ª¥×¥·¥ç¥ó", 8 }, + { 'r', " ¥×¥ì¥¤µ­Ï¿ ¥ª¥×¥·¥ç¥ó", 9 }, + + { 'p', "¼«Æ°½¦¤¤¥¨¥Ç¥£¥¿", 11 }, + { 'd', " ´ðËÜ¥¦¥§¥¤¥ÈÎÌ ", 12 }, + { 'h', "Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È", 13 }, + { 'm', " ÄãËâÎÏ¿§ïçÃÍ ", 14 }, + { 'a', " ¼«Æ°¥»¡¼¥Ö ¥ª¥×¥·¥ç¥ó", 15 }, + { 'w', "¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 16 }, + + { 'b', " ½é´ü ¥ª¥×¥·¥ç¥ó (»²¾È¤Î¤ß)", 18 }, + { 'c', " º¾µ½ ¥ª¥×¥·¥ç¥ó", 19 }, +#else + { '1', "Input Options", 3 }, + { '2', "Map Screen Options", 4 }, + { '3', "Text Display Options", 5 }, + { '4', "Game-Play Options", 6 }, + { '5', "Disturbance Options", 7 }, + { '6', "Easy Auto-Destroyer Options", 8 }, + { 'r', "Play record Options", 9 }, + + { 'p', "Auto-picker/destroyer editor", 11 }, + { 'd', "Base Delay Factor", 12 }, + { 'h', "Hitpoint Warning", 13 }, + { 'm', "Mana Color Threshold", 14 }, + { 'a', "Autosave Options", 15 }, + { 'w', "Window Flags", 16 }, + + { 'b', "Birth Options (Browse Only)", 18 }, + { 'c', "Cheat Options", 19 }, +#endif +}; + /* * Set or unset various options. @@ -2136,8 +2394,9 @@ static void do_cmd_options_win(void) */ void do_cmd_options(void) { - int k; - + char k; + int i, d, skey; + int y = 0; /* Save the screen */ screen_save(); @@ -2145,72 +2404,70 @@ void do_cmd_options(void) /* Interact */ while (1) { + int n = OPT_NUM; + + /* Does not list cheat option when cheat option is off */ + if (!p_ptr->noscore && !allow_debug_opts) n--; + /* Clear screen */ Term_clear(); /* Why are we here */ #ifdef JP - prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 2, 0); + prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 1, 0); #else - prt("Options", 2, 0); + prt("TinyAngband options", 1, 0); #endif + while(1) + { + /* Give some choices */ + for (i = 0; i < n; i++) + { + byte a = TERM_WHITE; + if (i == y) a = TERM_L_BLUE; + Term_putstr(5, option_fields[i].row, -1, a, + format("(%c) %s", toupper(option_fields[i].key), option_fields[i].name)); + } - /* Give some choices */ #ifdef JP - prt("(1) ¥­¡¼ÆþÎÏ ¥ª¥×¥·¥ç¥ó", 4, 5); - prt("(2) ²èÌ̽ÐÎÏ ¥ª¥×¥·¥ç¥ó", 5, 5); - prt("(3) ¥²¡¼¥à¥×¥ì¥¤ ¥ª¥×¥·¥ç¥ó", 6, 5); - prt("(4) ¹ÔÆ°Ãæ»ß´Ø·¸ ¥ª¥×¥·¥ç¥ó", 7, 5); - prt("(5) ¸úΨ²½ ¥ª¥×¥·¥ç¥ó", 8, 5); - prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ ¥ª¥×¥·¥ç¥ó", 9, 5); - prt("(R) ¥×¥ì¥¤µ­Ï¿ ¥ª¥×¥·¥ç¥ó", 10, 5); - /* Special choices */ - prt("(D) ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 12, 5); - prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 13, 5); - prt("(A) ¼«Æ°¥»¡¼¥Ö ¥ª¥×¥·¥ç¥ó", 14, 5); - /* Window flags */ - prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5); + prt("<Êý¸þ>¤Ç°ÜÆ°, Enter¤Ç·èÄê, ESC¤Ç¥­¥ã¥ó¥»¥ë, ?¤Ç¥Ø¥ë¥×: ", 21, 0); #else - prt("(1) Input Options", 4, 5); - prt("(2) Output Options", 5, 5); - prt("(3) Game-Play Options", 6, 5); - prt("(4) Disturbance Options", 7, 5); - prt("(5) Efficiency Options", 8, 5); - prt("(6) Easy Auto-Destroyer Options", 9, 5); - prt("(R) Play-record Options", 10, 5); - - /* Special choices */ - prt("(D) Base Delay Factor", 12, 5); - prt("(H) Hitpoint Warning", 13, 5); - prt("(A) Autosave Options", 14, 5); + prt("Move to , Select to Enter, Cancel to ESC, ? to help: ", 21, 0); +#endif + /* Get command */ + skey = inkey_special(TRUE); + if (!(skey & SKEY_MASK)) k = (char)skey; + else k = 0; - /* Window flags */ - prt("(W) Window Flags", 15, 5); -#endif + /* Exit */ + if (k == ESCAPE) break; - if (p_ptr->noscore || allow_debug_opts) - { - /* Cheating */ -#ifdef JP - prt("(C) º¾µ½ ¥ª¥×¥·¥ç¥ó", 16, 5); -#else - prt("(C) Cheating Options", 16, 5); -#endif - } + if (my_strchr("\n\r ", k)) + { + k = option_fields[y].key; + break; + } + for (i = 0; i < n; i++) + { + if (tolower(k) == option_fields[i].key) break; + } - /* Prompt */ -#ifdef JP - prt("¥³¥Þ¥ó¥É:", 18, 0); -#else - prt("Command: ", 18, 0); -#endif + /* Command is found */ + if (i < n) break; + /* Hack -- browse help */ + if (k == '?') break; - /* Get command */ - k = inkey(); + /* Move cursor */ + d = 0; + if (skey == SKEY_UP) d = 8; + if (skey == SKEY_DOWN) d = 2; + y = (y + ddy[d] + n) % n; + if (!d) bell(); + } /* Exit */ if (k == ESCAPE) break; @@ -2218,79 +2475,68 @@ void do_cmd_options(void) /* Analyze */ switch (k) { - /* General Options */ case '1': { /* Process the general options */ #ifdef JP - do_cmd_options_aux(1, "¥­¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó"); + do_cmd_options_aux(OPT_PAGE_INPUT, "¥­¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó"); #else - do_cmd_options_aux(1, "Input Options"); + do_cmd_options_aux(OPT_PAGE_INPUT, "Input Options"); #endif - break; } - /* General Options */ case '2': { /* Process the general options */ #ifdef JP - do_cmd_options_aux(2, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó"); + do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "¥Þ¥Ã¥×²èÌÌ¥ª¥×¥·¥ç¥ó"); #else - do_cmd_options_aux(2, "Output Options"); + do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "Map Screen Options"); #endif - break; } - /* Inventory Options */ case '3': { /* Spawn */ #ifdef JP - do_cmd_options_aux(3, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó"); + do_cmd_options_aux(OPT_PAGE_TEXT, "¥Æ¥­¥¹¥Èɽ¼¨¥ª¥×¥·¥ç¥ó"); #else - do_cmd_options_aux(3, "Game-Play Options"); + do_cmd_options_aux(OPT_PAGE_TEXT, "Text Display Options"); #endif - break; } - /* Disturbance Options */ case '4': { /* Spawn */ #ifdef JP - do_cmd_options_aux(4, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó"); + do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó"); #else - do_cmd_options_aux(4, "Disturbance Options"); + do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "Game-Play Options"); #endif - break; } - /* Efficiency Options */ case '5': { /* Spawn */ #ifdef JP - do_cmd_options_aux(5, "¸úΨ²½¥ª¥×¥·¥ç¥ó"); + do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó"); #else - do_cmd_options_aux(5, "Efficiency Options"); + do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "Disturbance Options"); #endif - break; } - /* Object auto-destruction Options */ case '6': { /* Spawn */ #ifdef JP - do_cmd_options_aux(7, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó"); + do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "´Ê°×¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó"); #else - do_cmd_options_aux(7, "Easy Auto-Destroyer Options"); + do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "Easy Auto-Destroyer Options"); #endif break; } @@ -2301,9 +2547,22 @@ void do_cmd_options(void) { /* Spawn */ #ifdef JP - do_cmd_options_aux(10, "¥×¥ì¥¤µ­Ï¿¥ª¥×¥·¥ç¥ó"); + do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "¥×¥ì¥¤µ­Ï¿¥ª¥×¥·¥ç¥ó"); +#else + do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "Play-record Options"); +#endif + break; + } + + /* Birth Options */ + case 'B': + case 'b': + { + /* Spawn */ +#ifdef JP + do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)"); #else - do_cmd_options_aux(10, "Play-record Option"); + do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)"); #endif break; } @@ -2324,7 +2583,6 @@ void do_cmd_options(void) #else do_cmd_options_cheat("Cheaters never win"); #endif - break; } @@ -2336,7 +2594,6 @@ void do_cmd_options(void) #else do_cmd_options_autosave("Autosave"); #endif - break; } @@ -2353,18 +2610,26 @@ void do_cmd_options(void) break; } + /* Auto-picker/destroyer editor */ + case 'P': + case 'p': + { + do_cmd_edit_autopick(); + break; + } + /* Hack -- Delay Speed */ case 'D': case 'd': { /* Prompt */ + clear_from(18); #ifdef JP - prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 18, 0); + prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0); #else - prt("Command: Base Delay Factor", 18, 0); + prt("Command: Base Delay Factor", 19, 0); #endif - /* Get a new value */ while (1) { @@ -2406,13 +2671,13 @@ void do_cmd_options(void) case 'h': { /* Prompt */ + clear_from(18); #ifdef JP - prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 18, 0); + prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0); #else - prt("Command: Hitpoint Warning", 18, 0); + prt("Command: Hitpoint Warning", 19, 0); #endif - /* Get a new value */ while (1) { @@ -2448,11 +2713,58 @@ void do_cmd_options(void) break; } - case '?': + /* Hack -- mana color factor */ + case 'M': + case 'm': + { + /* Prompt */ + clear_from(18); #ifdef JP - (void)show_file(TRUE, "joption.txt", NULL, 0, 0); + prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0); #else - (void)show_file(TRUE, "option.txt", NULL, 0, 0); + prt("Command: Mana Color Threshold", 19, 0); +#endif + + /* Get a new value */ + while (1) + { +#ifdef JP + prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%", + mana_warn), 22, 0); +#else + prt(format("Current mana color threshold: %d0%%", + mana_warn), 22, 0); +#endif + +#ifdef JP + prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0); +#else + prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0); +#endif + + k = inkey(); + if (k == ESCAPE) break; + else if (k == '?') + { +#ifdef JP + (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0); +#else + (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0); +#endif + Term_clear(); + } + else if (isdigit(k)) mana_warn = D2I(k); + else bell(); + } + + break; + } + + case '?': +#ifdef JP + (void)show_file(TRUE, "joption.txt", NULL, 0, 0); +#else + (void)show_file(TRUE, "option.txt", NULL, 0, 0); #endif Term_clear(); break; @@ -2504,64 +2816,16 @@ void do_cmd_pref(void) (void)process_pref_file_command(buf); } -void do_cmd_pickpref(void) +void do_cmd_reload_autopick(void) { - char buf[80]; - errr err; - -#ifdef JP - if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return; -#else - if(!get_check("Reload auto-pick preference file? ")) return; -#endif - - /* Free old entries */ - init_autopicker(); - - /* ¥­¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */ -#ifdef JP - sprintf(buf, "picktype-%s.prf", player_name); -#else - sprintf(buf, "pickpref-%s.prf", player_name); -#endif - err = process_pickpref_file(buf); - - if(err == 0) - { -#ifdef JP - msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf); -#else - msg_format("loaded '%s'.", buf); -#endif - } - - /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */ - - /* Process 'pick????.prf' if 'pick????-.prf' doesn't exist */ - if (0 > err) - { -#ifdef JP - err = process_pickpref_file("picktype.prf"); -#else - err = process_pickpref_file("pickpref.prf"); -#endif - - if(err == 0) - { #ifdef JP - msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£"); + if (!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return; #else - msg_print("loaded 'pickpref.prf'."); + if (!get_check("Reload auto-pick preference file? ")) return; #endif - } - } - -#ifdef JP - if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£"); -#else - if(err) msg_print("Failed to reload autopick preference."); -#endif + /* Load the file with messages */ + autopick_load_pref(TRUE); } #ifdef ALLOW_MACROS @@ -2573,9 +2837,7 @@ static errr macro_dump(cptr fname) { static cptr mark = "Macro Dump"; - int i, line_num; - - FILE *fff; + int i; char buf[1024]; @@ -2586,16 +2848,14 @@ static errr macro_dump(cptr fname) FILE_TYPE(FILE_TYPE_TEXT); /* Append to the file */ - fff = open_auto_dump(buf, mark, &line_num); - if (!fff) return (-1); + if (!open_auto_dump(buf, mark)) return (-1); /* Start dumping */ #ifdef JP - fprintf(fff, "\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n"); + auto_dump_printf("\n# ¼«Æ°¥Þ¥¯¥í¥»¡¼¥Ö\n\n"); #else - fprintf(fff, "\n# Automatic macro dump\n\n"); + auto_dump_printf("\n# Automatic macro dump\n\n"); #endif - line_num += 3; /* Dump them */ for (i = 0; i < macro__num; i++) @@ -2604,23 +2864,20 @@ static errr macro_dump(cptr fname) ascii_to_text(buf, macro__act[i]); /* Dump the macro */ - fprintf(fff, "A:%s\n", buf); + auto_dump_printf("A:%s\n", buf); /* Extract the action */ ascii_to_text(buf, macro__pat[i]); /* Dump normal macros */ - fprintf(fff, "P:%s\n", buf); + auto_dump_printf("P:%s\n", buf); /* End the macro */ - fprintf(fff, "\n"); - - /* count number of lines */ - line_num += 3; + auto_dump_printf("\n"); } /* Close */ - close_auto_dump(fff, mark, line_num); + close_auto_dump(); /* Success */ return (0); @@ -2721,11 +2978,8 @@ static void do_cmd_macro_aux_keymap(char *buf) static errr keymap_dump(cptr fname) { static cptr mark = "Keymap Dump"; - int line_num; int i; - FILE *fff; - char key[1024]; char buf[1024]; @@ -2751,16 +3005,14 @@ static errr keymap_dump(cptr fname) FILE_TYPE(FILE_TYPE_TEXT); /* Append to the file */ - fff = open_auto_dump(buf, mark, &line_num); - if (!fff) return -1; + if (!open_auto_dump(buf, mark)) return -1; /* Start dumping */ #ifdef JP - fprintf(fff, "\n# ¼«Æ°¥­¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n"); + auto_dump_printf("\n# ¼«Æ°¥­¡¼ÇÛÃÖ¥»¡¼¥Ö\n\n"); #else - fprintf(fff, "\n# Automatic keymap dump\n\n"); + auto_dump_printf("\n# Automatic keymap dump\n\n"); #endif - line_num += 3; /* Dump them */ for (i = 0; i < 256; i++) @@ -2782,13 +3034,12 @@ static errr keymap_dump(cptr fname) ascii_to_text(buf, act); /* Dump the macro */ - fprintf(fff, "A:%s\n", buf); - fprintf(fff, "C:%d:%s\n", mode, key); - line_num += 2; + auto_dump_printf("A:%s\n", buf); + auto_dump_printf("C:%d:%s\n", mode, key); } /* Close */ - close_auto_dump(fff, mark, line_num); + close_auto_dump(); /* Success */ return (0); @@ -2851,7 +3102,7 @@ void do_cmd_macros(void) /* Describe that action */ #ifdef JP - prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5); + prt("¥Þ¥¯¥í¹ÔÆ°¤¬(¤â¤·¤¢¤ì¤Ð)²¼¤Ëɽ¼¨¤µ¤ì¤Þ¤¹:", 20, 0); #else prt("Current action (if any) shown below:", 20, 0); #endif @@ -2932,10 +3183,10 @@ void do_cmd_macros(void) /* Default filename */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Ask for a file */ - if (!askfor_aux(tmp, 80)) continue; + if (!askfor(tmp, 80)) continue; /* Process the given filename */ err = process_pref_file(tmp); @@ -2988,10 +3239,10 @@ void do_cmd_macros(void) /* Default filename */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Ask for a file */ - if (!askfor_aux(tmp, 80)) continue; + if (!askfor(tmp, 80)) continue; /* Dump the macros */ (void)macro_dump(tmp); @@ -3091,6 +3342,13 @@ void do_cmd_macros(void) /* Clear */ clear_from(20); + /* Help message */ +#ifdef JP + c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0); +#else + c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0); +#endif + /* Prompt */ #ifdef JP prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0); @@ -3103,7 +3361,7 @@ void do_cmd_macros(void) ascii_to_text(tmp, macro__buf); /* Get an encoded action */ - if (askfor_aux(tmp, 80)) + if (askfor(tmp, 80)) { /* Convert to ascii */ text_to_ascii(macro__buf, tmp); @@ -3175,10 +3433,10 @@ void do_cmd_macros(void) /* Default filename */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Ask for a file */ - if (!askfor_aux(tmp, 80)) continue; + if (!askfor(tmp, 80)) continue; /* Dump the macros */ (void)keymap_dump(tmp); @@ -3278,6 +3536,13 @@ void do_cmd_macros(void) /* Clear */ clear_from(20); + /* Help message */ +#ifdef JP + c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0); +#else + c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0); +#endif + /* Prompt */ #ifdef JP prt("¹ÔÆ°: ", 20, 0); @@ -3290,7 +3555,7 @@ void do_cmd_macros(void) ascii_to_text(tmp, macro__buf); /* Get an encoded action */ - if (askfor_aux(tmp, 80)) + if (askfor(tmp, 80)) { /* Convert to ascii */ text_to_ascii(macro__buf, tmp); @@ -3358,15 +3623,28 @@ void do_cmd_macros(void) prt("Command: Enter a new action", 16, 0); #endif + /* Clear */ + clear_from(20); + + /* Help message */ +#ifdef JP + c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0); +#else + c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0); +#endif - /* Go to the correct location */ - Term_gotoxy(0, 22); + /* Prompt */ +#ifdef JP + prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0); +#else + prt("Action: ", 20, 0); +#endif /* Hack -- limit the value */ tmp[80] = '\0'; /* Get an encoded action */ - if (!askfor_aux(buf, 80)) continue; + if (!askfor(buf, 80)) continue; /* Extract an action */ text_to_ascii(macro__buf, buf); @@ -3390,7 +3668,21 @@ void do_cmd_macros(void) } -static void cmd_visuals_aux(int i, int *num, int max) +static cptr lighting_level_str[F_LIT_MAX] = +{ +#ifdef JP + "ɸ½à¿§", + "ÌÀ¿§", + "°Å¿§", +#else + "standard", + "brightly lit", + "darkened", +#endif +}; + + +static bool cmd_visuals_aux(int i, int *num, int max) { if (iscntrl(i)) { @@ -3400,34 +3692,87 @@ static void cmd_visuals_aux(int i, int *num, int max) sprintf(str, "%d", *num); if (!get_string(format("Input new number(0-%d): ", max-1), str, 4)) - return; + return FALSE; tmp = strtol(str, NULL, 0); if (tmp >= 0 && tmp < max) *num = tmp; - return; } else if (isupper(i)) *num = (*num + max - 1) % max; else *num = (*num + 1) % max; - return; + return TRUE; +} + +static void print_visuals_menu(cptr choice_msg) +{ +#ifdef JP + prt("[ ²èÌÌɽ¼¨¤ÎÀßÄê ]", 1, 0); +#else + prt("Interact with Visuals", 1, 0); +#endif + + /* Give some choices */ +#ifdef JP + prt("(0) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 3, 5); +#else + prt("(0) Load a user pref file", 3, 5); +#endif + +#ifdef ALLOW_VISUALS +#ifdef JP + prt("(1) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 4, 5); + prt("(2) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5); + prt("(3) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 6, 5); + prt("(4) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë (¿ôÃÍÁàºî)", 7, 5); + prt("(5) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë (¿ôÃÍÁàºî)", 8, 5); + prt("(6) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë (¿ôÃÍÁàºî)", 9, 5); + prt("(7) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë (¥·¥ó¥Ü¥ë¥¨¥Ç¥£¥¿)", 10, 5); + prt("(8) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë (¥·¥ó¥Ü¥ë¥¨¥Ç¥£¥¿)", 11, 5); + prt("(9) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë (¥·¥ó¥Ü¥ë¥¨¥Ç¥£¥¿)", 12, 5); +#else + prt("(1) Dump monster attr/chars", 4, 5); + prt("(2) Dump object attr/chars", 5, 5); + prt("(3) Dump feature attr/chars", 6, 5); + prt("(4) Change monster attr/chars (numeric operation)", 7, 5); + prt("(5) Change object attr/chars (numeric operation)", 8, 5); + prt("(6) Change feature attr/chars (numeric operation)", 9, 5); + prt("(7) Change monster attr/chars (visual mode)", 10, 5); + prt("(8) Change object attr/chars (visual mode)", 11, 5); + prt("(9) Change feature attr/chars (visual mode)", 12, 5); +#endif + +#endif /* ALLOW_VISUALS */ + +#ifdef JP + prt("(R) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5); +#else + prt("(R) Reset visuals", 13, 5); +#endif + + /* Prompt */ +#ifdef JP + prt(format("¥³¥Þ¥ó¥É: %s", choice_msg ? choice_msg : ""), 15, 0); +#else + prt(format("Command: %s", choice_msg ? choice_msg : ""), 15, 0); +#endif } +static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx); +static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx); +static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level); + /* * Interact with "visuals" */ void do_cmd_visuals(void) { int i; - - FILE *fff; - char tmp[160]; - char buf[1024]; - + bool need_redraw = FALSE; const char *empty_symbol = "<< ? >>"; if (use_bigtile) empty_symbol = "<< ?? >>"; @@ -3435,11 +3780,9 @@ void do_cmd_visuals(void) /* File type is "TEXT" */ FILE_TYPE(FILE_TYPE_TEXT); - /* Save the screen */ screen_save(); - /* Interact until done */ while (1) { @@ -3447,56 +3790,7 @@ void do_cmd_visuals(void) Term_clear(); /* Ask for a choice */ -#ifdef JP - prt("²èÌÌɽ¼¨¤ÎÀßÄê", 2, 0); -#else - prt("Interact with Visuals", 2, 0); -#endif - - - /* Give some choices */ -#ifdef JP - prt("(1) ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 4, 5); -#else - prt("(1) Load a user pref file", 4, 5); -#endif - -#ifdef ALLOW_VISUALS -#ifdef JP - prt("(2) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 5, 5); - prt("(3) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 6, 5); - prt("(4) ÃÏ·Á¤Î ¿§/ʸ»ú ¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹", 7, 5); - prt("(5) (̤»ÈÍÑ)", 8, 5); - prt("(6) ¥â¥ó¥¹¥¿¡¼¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 9, 5); - prt("(7) ¥¢¥¤¥Æ¥à¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 10, 5); - prt("(8) ÃÏ·Á¤Î ¿§/ʸ»ú ¤òÊѹ¹¤¹¤ë", 11, 5); - prt("(9) (̤»ÈÍÑ)", 12, 5); -#else - prt("(2) Dump monster attr/chars", 5, 5); - prt("(3) Dump object attr/chars", 6, 5); - prt("(4) Dump feature attr/chars", 7, 5); - prt("(5) (unused)", 8, 5); - prt("(6) Change monster attr/chars", 9, 5); - prt("(7) Change object attr/chars", 10, 5); - prt("(8) Change feature attr/chars", 11, 5); - prt("(9) (unused)", 12, 5); -#endif - -#endif -#ifdef JP - prt("(0) ²èÌÌɽ¼¨ÊýË¡¤Î½é´ü²½", 13, 5); -#else - prt("(0) Reset visuals", 13, 5); -#endif - - - /* Prompt */ -#ifdef JP - prt("¥³¥Þ¥ó¥É:", 18, 0); -#else - prt("Command: ", 15, 0); -#endif - + print_visuals_menu(NULL); /* Prompt */ i = inkey(); @@ -3504,9 +3798,10 @@ void do_cmd_visuals(void) /* Done */ if (i == ESCAPE) break; - /* Load a 'pref' file */ - else if (i == '1') + switch (i) { + /* Load a 'pref' file */ + case '0': /* Prompt */ #ifdef JP prt("¥³¥Þ¥ó¥É: ¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É", 15, 0); @@ -3514,32 +3809,31 @@ void do_cmd_visuals(void) prt("Command: Load a user pref file", 15, 0); #endif - /* Prompt */ #ifdef JP - prt("¥Õ¥¡¥¤¥ë: ", 18, 0); + prt("¥Õ¥¡¥¤¥ë: ", 17, 0); #else prt("File: ", 17, 0); #endif - /* Default filename */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Query */ - if (!askfor_aux(tmp, 70)) continue; + if (!askfor(tmp, 70)) continue; /* Process the given filename */ (void)process_pref_file(tmp); - } + + need_redraw = TRUE; + break; #ifdef ALLOW_VISUALS /* Dump monster attr/chars */ - else if (i == '2') + case '1': { static cptr mark = "Monster attr/chars"; - int line_num; /* Prompt */ #ifdef JP @@ -3548,7 +3842,6 @@ void do_cmd_visuals(void) prt("Command: Dump monster attr/chars", 15, 0); #endif - /* Prompt */ #ifdef JP prt("¥Õ¥¡¥¤¥ë: ", 17, 0); @@ -3556,30 +3849,27 @@ void do_cmd_visuals(void) prt("File: ", 17, 0); #endif - /* Default filename */ - sprintf(tmp, "%s.prf", player_name); - + sprintf(tmp, "%s.prf", player_base); + /* Get a filename */ - if (!askfor_aux(tmp, 70)) continue; + if (!askfor(tmp, 70)) continue; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); /* Append to the file */ - fff = open_auto_dump(buf, mark, &line_num); - if (!fff) continue; + if (!open_auto_dump(buf, mark)) continue; /* Start dumping */ #ifdef JP - fprintf(fff, "\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n"); + auto_dump_printf("\n# ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n"); #else - fprintf(fff, "\n# Monster attr/char definitions\n\n"); + auto_dump_printf("\n# Monster attr/char definitions\n\n"); #endif - line_num += 3; /* Dump monsters */ - for (i = 1; i < max_r_idx; i++) + for (i = 0; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; @@ -3587,17 +3877,15 @@ void do_cmd_visuals(void) if (!r_ptr->name) continue; /* Dump a comment */ - fprintf(fff, "# %s\n", (r_name + r_ptr->name)); - line_num++; + auto_dump_printf("# %s\n", (r_name + r_ptr->name)); /* Dump the monster attr/char info */ - fprintf(fff, "R:%d:0x%02X/0x%02X\n\n", i, + auto_dump_printf("R:%d:0x%02X/0x%02X\n\n", i, (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char)); - line_num += 2; } /* Close */ - close_auto_dump(fff, mark, line_num); + close_auto_dump(); /* Message */ #ifdef JP @@ -3606,13 +3894,13 @@ void do_cmd_visuals(void) msg_print("Dumped monster attr/chars."); #endif + break; } /* Dump object attr/chars */ - else if (i == '3') + case '2': { static cptr mark = "Object attr/chars"; - int line_num; /* Prompt */ #ifdef JP @@ -3621,7 +3909,6 @@ void do_cmd_visuals(void) prt("Command: Dump object attr/chars", 15, 0); #endif - /* Prompt */ #ifdef JP prt("¥Õ¥¡¥¤¥ë: ", 17, 0); @@ -3629,30 +3916,27 @@ void do_cmd_visuals(void) prt("File: ", 17, 0); #endif - /* Default filename */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Get a filename */ - if (!askfor_aux(tmp, 70)) continue; + if (!askfor(tmp, 70)) continue; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); /* Append to the file */ - fff = open_auto_dump(buf, mark, &line_num); - if (!fff) continue; + if (!open_auto_dump(buf, mark)) continue; /* Start dumping */ #ifdef JP - fprintf(fff, "\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n"); + auto_dump_printf("\n# ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n"); #else - fprintf(fff, "\n# Object attr/char definitions\n\n"); + auto_dump_printf("\n# Object attr/char definitions\n\n"); #endif - line_num += 3; /* Dump objects */ - for (i = 1; i < max_k_idx; i++) + for (i = 0; i < max_k_idx; i++) { char o_name[80]; object_kind *k_ptr = &k_info[i]; @@ -3660,24 +3944,32 @@ void do_cmd_visuals(void) /* Skip non-entries */ if (!k_ptr->name) continue; - /* Skip entries with flavor */ - if (k_ptr->flavor) continue; + if (!k_ptr->flavor) + { + /* Tidy name */ + strip_name(o_name, i); + } + else + { + object_type forge; + + /* Prepare dummy object */ + object_prep(&forge, i); - /* Tidy name */ - strip_name(o_name, i); + /* Get un-shuffled flavor name */ + object_desc(o_name, &forge, OD_FORCE_FLAVOR); + } /* Dump a comment */ - fprintf(fff, "# %s\n", o_name); - line_num++; + auto_dump_printf("# %s\n", o_name); /* Dump the object attr/char info */ - fprintf(fff, "K:%d:0x%02X/0x%02X\n\n", i, + auto_dump_printf("K:%d:0x%02X/0x%02X\n\n", i, (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char)); - line_num += 2; } /* Close */ - close_auto_dump(fff, mark, line_num); + close_auto_dump(); /* Message */ #ifdef JP @@ -3686,13 +3978,13 @@ void do_cmd_visuals(void) msg_print("Dumped object attr/chars."); #endif + break; } /* Dump feature attr/chars */ - else if (i == '4') + case '3': { static cptr mark = "Feature attr/chars"; - int line_num; /* Prompt */ #ifdef JP @@ -3701,7 +3993,6 @@ void do_cmd_visuals(void) prt("Command: Dump feature attr/chars", 15, 0); #endif - /* Prompt */ #ifdef JP prt("¥Õ¥¡¥¤¥ë: ", 17, 0); @@ -3709,30 +4000,27 @@ void do_cmd_visuals(void) prt("File: ", 17, 0); #endif - /* Default filename */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Get a filename */ - if (!askfor_aux(tmp, 70)) continue; + if (!askfor(tmp, 70)) continue; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); /* Append to the file */ - fff = open_auto_dump(buf, mark, &line_num); - if (!fff) continue; + if (!open_auto_dump(buf, mark)) continue; /* Start dumping */ #ifdef JP - fprintf(fff, "\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n"); + auto_dump_printf("\n# ÃÏ·Á¤Î[¿§/ʸ»ú]¤ÎÀßÄê\n\n"); #else - fprintf(fff, "\n# Feature attr/char definitions\n\n"); + auto_dump_printf("\n# Feature attr/char definitions\n\n"); #endif - line_num += 3; /* Dump features */ - for (i = 1; i < max_f_idx; i++) + for (i = 0; i < max_f_idx; i++) { feature_type *f_ptr = &f_info[i]; @@ -3743,17 +4031,17 @@ void do_cmd_visuals(void) if (f_ptr->mimic != i) continue; /* Dump a comment */ - fprintf(fff, "# %s\n", (f_name + f_ptr->name)); - line_num++; + auto_dump_printf("# %s\n", (f_name + f_ptr->name)); /* Dump the feature attr/char info */ - fprintf(fff, "F:%d:0x%02X/0x%02X\n\n", i, - (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char)); - line_num += 2; + auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i, + (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]), + (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]), + (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK])); } /* Close */ - close_auto_dump(fff, mark, line_num); + close_auto_dump(); /* Message */ #ifdef JP @@ -3762,33 +4050,36 @@ void do_cmd_visuals(void) msg_print("Dumped feature attr/chars."); #endif + break; } - /* Modify monster attr/chars */ - else if (i == '6') + /* Modify monster attr/chars (numeric operation) */ + case '4': { +#ifdef JP + static cptr choice_msg = "¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹"; +#else + static cptr choice_msg = "Change monster attr/chars"; +#endif static int r = 0; - /* Prompt */ #ifdef JP - prt("¥³¥Þ¥ó¥É: ¥â¥ó¥¹¥¿¡¼¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0); + prt(format("¥³¥Þ¥ó¥É: %s", choice_msg), 15, 0); #else - prt("Command: Change monster attr/chars", 15, 0); + prt(format("Command: %s", choice_msg), 15, 0); #endif - /* Hack -- query until done */ while (1) { monster_race *r_ptr = &r_info[r]; - byte a, a2; - char c, c2; + char c; int t; - byte da = (r_ptr->d_attr); - byte dc = (r_ptr->d_char); - byte ca = (r_ptr->x_attr); - byte cc = (r_ptr->x_char); + byte da = r_ptr->d_attr; + byte dc = r_ptr->d_char; + byte ca = r_ptr->x_attr; + byte cc = r_ptr->x_char; /* Label the object */ #ifdef JP @@ -3801,7 +4092,6 @@ void do_cmd_visuals(void) r, (r_name + r_ptr->name))); #endif - /* Label the Default values */ #ifdef JP Term_putstr(10, 19, -1, TERM_WHITE, @@ -3812,13 +4102,7 @@ void do_cmd_visuals(void) #endif Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); - - a = da; - c = dc; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); - - Term_putch(43, 19, a, c); - if (use_bigtile) Term_putch(43 + 1, 19, a2, c2); + Term_queue_bigchar(43, 19, da, dc, 0, 0); /* Label the Current values */ #ifdef JP @@ -3830,22 +4114,15 @@ void do_cmd_visuals(void) #endif Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); - - a = ca; - c = cc; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); - - Term_putch(43, 20, a, c); - if (use_bigtile) Term_putch(43 + 1, 20, a2, c2); - + Term_queue_bigchar(43, 20, ca, cc, 0, 0); /* Prompt */ #ifdef JP Term_putstr(0, 22, -1, TERM_WHITE, - "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): "); + "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "); #else Term_putstr(0, 22, -1, TERM_WHITE, - "Command (n/N/^N/a/A/^A/c/C/^C): "); + "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "); #endif /* Get a command */ @@ -3861,60 +4138,83 @@ void do_cmd_visuals(void) switch (c) { case 'n': - cmd_visuals_aux(i, &r, max_r_idx); + { + int prev_r = r; + do + { + if (!cmd_visuals_aux(i, &r, max_r_idx)) + { + r = prev_r; + break; + } + } + while (!r_info[r].name); + } break; case 'a': t = (int)r_ptr->x_attr; - cmd_visuals_aux(i, &t, 256); + (void)cmd_visuals_aux(i, &t, 256); r_ptr->x_attr = (byte)t; + need_redraw = TRUE; break; case 'c': t = (int)r_ptr->x_char; - cmd_visuals_aux(i, &t, 256); + (void)cmd_visuals_aux(i, &t, 256); r_ptr->x_char = (byte)t; + need_redraw = TRUE; + break; + case 'v': + do_cmd_knowledge_monsters(&need_redraw, TRUE, r); + + /* Clear screen */ + Term_clear(); + print_visuals_menu(choice_msg); break; } } + + break; } - /* Modify object attr/chars */ - else if (i == '7') + /* Modify object attr/chars (numeric operation) */ + case '5': { +#ifdef JP + static cptr choice_msg = "¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹"; +#else + static cptr choice_msg = "Change object attr/chars"; +#endif static int k = 0; - /* Prompt */ #ifdef JP - prt("¥³¥Þ¥ó¥É: ¥¢¥¤¥Æ¥à¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0); + prt(format("¥³¥Þ¥ó¥É: %s", choice_msg), 15, 0); #else - prt("Command: Change object attr/chars", 15, 0); + prt(format("Command: %s", choice_msg), 15, 0); #endif - /* Hack -- query until done */ while (1) { object_kind *k_ptr = &k_info[k]; - byte a, a2; - char c, c2; + char c; int t; - byte da = (byte)k_ptr->d_attr; - byte dc = (byte)k_ptr->d_char; - byte ca = (byte)k_ptr->x_attr; - byte cc = (byte)k_ptr->x_char; + byte da = k_ptr->d_attr; + byte dc = k_ptr->d_char; + byte ca = k_ptr->x_attr; + byte cc = k_ptr->x_char; /* Label the object */ #ifdef JP Term_putstr(5, 17, -1, TERM_WHITE, format("¥¢¥¤¥Æ¥à = %d, ̾Á° = %-40.40s", - k, (k_name + k_ptr->name))); + k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name))); #else Term_putstr(5, 17, -1, TERM_WHITE, format("Object = %d, Name = %-40.40s", - k, (k_name + k_ptr->name))); + k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name))); #endif - /* Label the Default values */ #ifdef JP Term_putstr(10, 19, -1, TERM_WHITE, @@ -3925,13 +4225,7 @@ void do_cmd_visuals(void) #endif Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); - a = da; - c = dc; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); - - Term_putch(43, 19, a, c); - if (use_bigtile) Term_putch(43 + 1, 19, a2, c2); - + Term_queue_bigchar(43, 19, da, dc, 0, 0); /* Label the Current values */ #ifdef JP @@ -3943,21 +4237,15 @@ void do_cmd_visuals(void) #endif Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); - a = ca; - c = cc; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); - - Term_putch(43, 20, a, c); - if (use_bigtile) Term_putch(43 + 1, 20, a2, c2); - + Term_queue_bigchar(43, 20, ca, cc, 0, 0); /* Prompt */ #ifdef JP Term_putstr(0, 22, -1, TERM_WHITE, - "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): "); + "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "); #else Term_putstr(0, 22, -1, TERM_WHITE, - "Command (n/N/^N/a/A/^A/c/C/^C): "); + "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "); #endif /* Get a command */ @@ -3973,60 +4261,85 @@ void do_cmd_visuals(void) switch (c) { case 'n': - cmd_visuals_aux(i, &k, max_k_idx); + { + int prev_k = k; + do + { + if (!cmd_visuals_aux(i, &k, max_k_idx)) + { + k = prev_k; + break; + } + } + while (!k_info[k].name); + } break; case 'a': - t = (int)k_info[k].x_attr; - cmd_visuals_aux(i, &t, 256); - k_info[k].x_attr = (byte)t; + t = (int)k_ptr->x_attr; + (void)cmd_visuals_aux(i, &t, 256); + k_ptr->x_attr = (byte)t; + need_redraw = TRUE; break; case 'c': - t = (int)k_info[k].x_char; - cmd_visuals_aux(i, &t, 256); - k_info[k].x_char = (byte)t; + t = (int)k_ptr->x_char; + (void)cmd_visuals_aux(i, &t, 256); + k_ptr->x_char = (byte)t; + need_redraw = TRUE; + break; + case 'v': + do_cmd_knowledge_objects(&need_redraw, TRUE, k); + + /* Clear screen */ + Term_clear(); + print_visuals_menu(choice_msg); break; } } + + break; } - /* Modify feature attr/chars */ - else if (i == '8') + /* Modify feature attr/chars (numeric operation) */ + case '6': { +#ifdef JP + static cptr choice_msg = "ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹"; +#else + static cptr choice_msg = "Change feature attr/chars"; +#endif static int f = 0; + static int lighting_level = F_LIT_STANDARD; - /* Prompt */ #ifdef JP - prt("¥³¥Þ¥ó¥É: ÃÏ·Á¤Î[¿§/ʸ»ú]¤òÊѹ¹¤·¤Þ¤¹", 15, 0); + prt(format("¥³¥Þ¥ó¥É: %s", choice_msg), 15, 0); #else - prt("Command: Change feature attr/chars", 15, 0); + prt(format("Command: %s", choice_msg), 15, 0); #endif - /* Hack -- query until done */ while (1) { feature_type *f_ptr = &f_info[f]; - byte a, a2; - char c, c2; + char c; int t; - byte da = (byte)f_ptr->d_attr; - byte dc = (byte)f_ptr->d_char; - byte ca = (byte)f_ptr->x_attr; - byte cc = (byte)f_ptr->x_char; + byte da = f_ptr->d_attr[lighting_level]; + byte dc = f_ptr->d_char[lighting_level]; + byte ca = f_ptr->x_attr[lighting_level]; + byte cc = f_ptr->x_char[lighting_level]; /* Label the object */ + prt("", 17, 5); #ifdef JP Term_putstr(5, 17, -1, TERM_WHITE, - format("ÃÏ·Á = %d, ̾Á° = %-40.40s", - f, (f_name + f_ptr->name))); + format("ÃÏ·Á = %d, ̾Á° = %s, ÌÀÅÙ = %s", + f, (f_name + f_ptr->name), lighting_level_str[lighting_level])); #else Term_putstr(5, 17, -1, TERM_WHITE, - format("Terrain = %d, Name = %-40.40s", - f, (f_name + f_ptr->name))); + format("Terrain = %d, Name = %s, Lighting = %s", + f, (f_name + f_ptr->name), lighting_level_str[lighting_level])); #endif - /* Label the Default values */ #ifdef JP Term_putstr(10, 19, -1, TERM_WHITE, @@ -4037,13 +4350,8 @@ void do_cmd_visuals(void) #endif Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol); - a = da; - c = dc; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); - - Term_putch(43, 19, a, c); - if (use_bigtile) Term_putch(43 + 1, 19, a2, c2); + Term_queue_bigchar(43, 19, da, dc, 0, 0); /* Label the Current values */ #ifdef JP @@ -4055,21 +4363,15 @@ void do_cmd_visuals(void) #endif Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol); - a = ca; - c = cc; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); - - Term_putch(43, 20, a, c); - if (use_bigtile) Term_putch(43 + 1, 20, a2, c2); - + Term_queue_bigchar(43, 20, ca, cc, 0, 0); /* Prompt */ #ifdef JP Term_putstr(0, 22, -1, TERM_WHITE, - "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): "); + "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): "); #else Term_putstr(0, 22, -1, TERM_WHITE, - "Command (n/N/^N/a/A/^A/c/C/^C): "); + "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): "); #endif /* Get a command */ @@ -4085,27 +4387,74 @@ void do_cmd_visuals(void) switch (c) { case 'n': - cmd_visuals_aux(i, &f, max_f_idx); + { + int prev_f = f; + do + { + if (!cmd_visuals_aux(i, &f, max_f_idx)) + { + f = prev_f; + break; + } + } + while (!f_info[f].name || (f_info[f].mimic != f)); + } break; case 'a': - t = (int)f_info[f].x_attr; - cmd_visuals_aux(i, &t, 256); - f_info[f].x_attr = (byte)t; + t = (int)f_ptr->x_attr[lighting_level]; + (void)cmd_visuals_aux(i, &t, 256); + f_ptr->x_attr[lighting_level] = (byte)t; + need_redraw = TRUE; break; case 'c': - t = (int)f_info[f].x_char; - cmd_visuals_aux(i, &t, 256); - f_info[f].x_char = (byte)t; + t = (int)f_ptr->x_char[lighting_level]; + (void)cmd_visuals_aux(i, &t, 256); + f_ptr->x_char[lighting_level] = (byte)t; + need_redraw = TRUE; break; - } - } - } + case 'l': + (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX); + break; + case 'd': + apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char); + need_redraw = TRUE; + break; + case 'v': + do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level); -#endif + /* Clear screen */ + Term_clear(); + print_visuals_menu(choice_msg); + break; + } + } - /* Reset visuals */ - else if (i == '0') + break; + } + + /* Modify monster attr/chars (visual mode) */ + case '7': + do_cmd_knowledge_monsters(&need_redraw, TRUE, -1); + break; + + /* Modify object attr/chars (visual mode) */ + case '8': + do_cmd_knowledge_objects(&need_redraw, TRUE, -1); + break; + + /* Modify feature attr/chars (visual mode) */ + case '9': { + int lighting_level = F_LIT_STANDARD; + do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level); + break; + } + +#endif /* ALLOW_VISUALS */ + + /* Reset visuals */ + case 'R': + case 'r': /* Reset */ reset_visuals(); @@ -4116,21 +4465,23 @@ void do_cmd_visuals(void) msg_print("Visual attr/char tables reset."); #endif - } + need_redraw = TRUE; + break; /* Unknown option */ - else - { + default: bell(); + break; } /* Flush messages */ msg_print(NULL); } - /* Restore the screen */ screen_load(); + + if (need_redraw) do_cmd_redraw(); } @@ -4141,8 +4492,6 @@ void do_cmd_colors(void) { int i; - FILE *fff; - char tmp[160]; char buf[1024]; @@ -4222,10 +4571,10 @@ void do_cmd_colors(void) /* Default file */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Query */ - if (!askfor_aux(tmp, 70)) continue; + if (!askfor(tmp, 70)) continue; /* Process the given filename */ (void)process_pref_file(tmp); @@ -4243,7 +4592,6 @@ void do_cmd_colors(void) else if (i == '2') { static cptr mark = "Colors"; - int line_num; /* Prompt */ #ifdef JP @@ -4262,25 +4610,23 @@ void do_cmd_colors(void) /* Default filename */ - sprintf(tmp, "%s.prf", player_name); + sprintf(tmp, "%s.prf", player_base); /* Get a filename */ - if (!askfor_aux(tmp, 70)) continue; + if (!askfor(tmp, 70)) continue; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp); /* Append to the file */ - fff = open_auto_dump(buf, mark, &line_num); - if (!fff) continue; + if (!open_auto_dump(buf, mark)) continue; /* Start dumping */ #ifdef JP - fprintf(fff, "\n# ¥«¥é¡¼¤ÎÀßÄê\n\n"); + auto_dump_printf("\n# ¥«¥é¡¼¤ÎÀßÄê\n\n"); #else - fprintf(fff, "\n# Color redefinitions\n\n"); + auto_dump_printf("\n# Color redefinitions\n\n"); #endif - line_num += 3; /* Dump colors */ for (i = 0; i < 256; i++) @@ -4305,20 +4651,18 @@ void do_cmd_colors(void) /* Dump a comment */ #ifdef JP - fprintf(fff, "# ¥«¥é¡¼ '%s'\n", name); + auto_dump_printf("# ¥«¥é¡¼ '%s'\n", name); #else - fprintf(fff, "# Color '%s'\n", name); + auto_dump_printf("# Color '%s'\n", name); #endif - line_num++; /* Dump the monster attr/char info */ - fprintf(fff, "V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n", + auto_dump_printf("V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n", i, kv, rv, gv, bv); - line_num += 2; } /* Close */ - close_auto_dump(fff, mark, line_num); + close_auto_dump(); /* Message */ #ifdef JP @@ -4669,9 +5013,6 @@ static cptr do_cmd_feeling_text_lucky[11] = */ void do_cmd_feeling(void) { - /* Verify the feeling */ - if (feeling > 10) feeling = 10; - /* No useful feeling in quests */ if (p_ptr->inside_quest && !random_quest_number(dun_level)) { @@ -4726,20 +5067,13 @@ void do_cmd_feeling(void) } /* Display the feeling */ - if (turn - old_turn >= (150 - dun_level)*TURNS_PER_TICK || cheat_xtra) - { - if (p_ptr->muta3 & MUT3_GOOD_LUCK) msg_print(do_cmd_feeling_text_lucky[feeling]); - else { - if((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)){ - msg_print(do_cmd_feeling_text_combat[feeling]); - }else - msg_print(do_cmd_feeling_text[feeling]); - } - } + if (p_ptr->muta3 & MUT3_GOOD_LUCK) + msg_print(do_cmd_feeling_text_lucky[p_ptr->feeling]); + else if (p_ptr->pseikaku == SEIKAKU_COMBAT || + inventory[INVEN_BOW].name1 == ART_CRIMSON) + msg_print(do_cmd_feeling_text_combat[p_ptr->feeling]); else - { - msg_print(do_cmd_feeling_text[0]); - } + msg_print(do_cmd_feeling_text[p_ptr->feeling]); } @@ -4751,6 +5085,9 @@ static cptr monster_group_text[] = { #ifdef JP "¥æ¥Ë¡¼¥¯", /* "Uniques" */ + "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */ + "¾Þ¶â¼ó", /* "Wanted */ + "¥¢¥ó¥Ð¡¼¤Î²¦Â²", /* "Ambertite" */ "¥¢¥ê", "¥³¥¦¥â¥ê", "¥à¥«¥Ç", @@ -4803,9 +5140,15 @@ static cptr monster_group_text[] = "¥¤¥¨¥Æ¥£", "¥Ï¥¦¥ó¥É", "¥ß¥ß¥Ã¥¯", + "ÊÉ/¿¢Êª/µ¤ÂÎ", "¤ª¤Ð¤±¥­¥Î¥³", + "µåÂÎ", + "¥×¥ì¥¤¥ä¡¼", #else "Uniques", + "Ridable monsters", + "Wanted monsters", + "Ambertite", "Ant", "Bat", "Centipede", @@ -4858,7 +5201,10 @@ static cptr monster_group_text[] = "Yeti", "Zephyr Hound", "Mimic", + "Wall/Plant/Gas", "Mushroom patch", + "Ball", + "Player", #endif NULL }; @@ -4868,9 +5214,12 @@ static cptr monster_group_text[] = * Symbols of monsters in each group. Note the "Uniques" group * is handled differently. */ -static cptr monster_group_char[] = +static cptr monster_group_char[] = { (char *) -1L, + (char *) -2L, + (char *) -3L, + (char *) -4L, "a", "b", "c", @@ -4922,8 +5271,11 @@ static cptr monster_group_char[] = "X", "Y", "Z", - "$!?=.|~[]", + "!$&()+./=>?[\\]`{|~", + "#%", ",", + "*", + "@", NULL }; @@ -4957,7 +5309,7 @@ static bool ang_sort_comp_monster_level(vptr u, vptr v, int a, int b) * of monsters in the group. * * mode & 0x01 : check for non-empty group - * mode & 0x02 : cheat? + * mode & 0x02 : visual operation only */ static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode) { @@ -4970,6 +5322,16 @@ static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode) /* XXX Hack -- Check if this is the "Uniques" group */ bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L); + /* XXX Hack -- Check if this is the "Riding" group */ + bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L); + + /* XXX Hack -- Check if this is the "Wanted" group */ + bool grp_wanted = (monster_group_char[grp_cur] == (char *) -3L); + + /* XXX Hack -- Check if this is the "Amberite" group */ + bool grp_amberite = (monster_group_char[grp_cur] == (char *) -4L); + + /* Check every race */ for (i = 0; i < max_r_idx; i++) { @@ -4980,23 +5342,54 @@ static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode) if (!r_ptr->name) continue ; /* Require known monsters */ - if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue; + if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights) continue; - if (grp_unique && !(r_ptr->flags1 & RF1_UNIQUE)) continue; + if (grp_unique) + { + if (!(r_ptr->flags1 & RF1_UNIQUE)) continue; + } - /* Check for race in the group */ - if (grp_unique || strchr(group_char, r_ptr->d_char)) + else if (grp_riding) { - /* Add the race */ - mon_idx[mon_cnt++] = i; + if (!(r_ptr->flags7 & RF7_RIDING)) continue; + } + + else if (grp_wanted) + { + bool wanted = FALSE; + int j; + for (j = 0; j < MAX_KUBI; j++) + { + if (kubi_r_idx[j] == i || kubi_r_idx[j] - 10000 == i || + (p_ptr->today_mon && p_ptr->today_mon == i)) + { + wanted = TRUE; + break; + } + } + if (!wanted) continue; + } + + else if (grp_amberite) + { + if (!(r_ptr->flags3 & RF3_AMBERITE)) continue; + } - /* XXX Hack -- Just checking for non-empty group */ - if (mode & 0x01) break; + else + { + /* Check for race in the group */ + if (!my_strchr(group_char, r_ptr->d_char)) continue; } + + /* Add the race */ + mon_idx[mon_cnt++] = i; + + /* XXX Hack -- Just checking for non-empty group */ + if (mode & 0x01) break; } /* Terminate the list */ - mon_idx[mon_cnt] = 0; + mon_idx[mon_cnt] = -1; /* Select the sort method */ ang_sort_comp = ang_sort_comp_monster_level; @@ -5037,6 +5430,7 @@ static cptr object_group_text[] = "¥´¥ß", "¶õ¤Î¥Ó¥ó", "¹ü", + "»àÂÎ", "Åá·õÎà", /* "Swords" */ "Æß´ï", /* "Blunt Weapons" */ "ĹÊÁÉð´ï", /* "Polearms" */ @@ -5055,6 +5449,8 @@ static cptr object_group_text[] = "´§", /* "Crowns" */ "¥Ö¡¼¥Ä", /* "Boots" */ "ËâË¡½ñ", + "ºâÊõ", + "²¿¤«", #else "Mushrooms", "Potions", @@ -5069,7 +5465,7 @@ static cptr object_group_text[] = "Rods", "Cards", "Capture Balls", - "Parchements", + "Parchments", "Spikes", "Boxs", "Figurines", @@ -5077,6 +5473,7 @@ static cptr object_group_text[] = "Junks", "Bottles", "Skeletons", + "Corpses", "Swords", "Blunt Weapons", "Polearms", @@ -5095,6 +5492,8 @@ static cptr object_group_text[] = "Crowns", "Boots", "Spellbooks", + "Treasure", + "Something", #endif NULL }; @@ -5118,7 +5517,7 @@ static byte object_group_tval[] = TV_ROD, TV_CARD, TV_CAPTURE, - TV_PARCHEMENT, + TV_PARCHMENT, TV_SPIKE, TV_CHEST, TV_FIGURINE, @@ -5126,6 +5525,7 @@ static byte object_group_tval[] = TV_JUNK, TV_BOTTLE, TV_SKELETON, + TV_CORPSE, TV_SWORD, TV_HAFTED, TV_POLEARM, @@ -5144,15 +5544,20 @@ static byte object_group_tval[] = TV_CROWN, TV_BOOTS, TV_LIFE_BOOK, /* Hack -- all spellbooks */ - 0 + TV_GOLD, + 0, + 0, }; /* - * Build a list of monster indexes in the given group. Return the number - * of monsters in the group. + * Build a list of object indexes in the given group. Return the number + * of objects in the group. + * + * mode & 0x01 : check for non-empty group + * mode & 0x02 : visual operation only */ -static int collect_objects(int grp_cur, int object_idx[]) +static int collect_objects(int grp_cur, int object_idx[], byte mode) { int i, j, k, object_cnt = 0; @@ -5162,43 +5567,58 @@ static int collect_objects(int grp_cur, int object_idx[]) /* Check every object */ for (i = 0; i < max_k_idx; i++) { - /* Access the race */ + /* Access the object */ object_kind *k_ptr = &k_info[i]; /* Skip empty objects */ if (!k_ptr->name) continue; - /* Skip non-flavoured objects */ - if (!k_ptr->flavor && !p_ptr->wizard) continue; + if (mode & 0x02) + { + /* Any objects will be displayed */ + } + else + { + if (!p_ptr->wizard) + { + /* Skip non-flavoured objects */ + if (!k_ptr->flavor) continue; - /* Skip items with no distribution (special artifacts) */ - for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j]; - if (!(k)) continue; + /* Require objects ever seen */ + if (!k_ptr->aware) continue; + } - /* Require objects ever seen*/ - if (!k_ptr->aware && !p_ptr->wizard) continue; + /* Skip items with no distribution (special artifacts) */ + for (j = 0, k = 0; j < 4; j++) k += k_ptr->chance[j]; + if (!k) continue; + } - /* Check for race in the group */ + /* Check for objects in the group */ if (TV_LIFE_BOOK == group_tval) { /* Hack -- All spell books */ - if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HISSATSU_BOOK) + if (TV_LIFE_BOOK <= k_ptr->tval && k_ptr->tval <= TV_HEX_BOOK) { - /* Add the race */ + /* Add the object */ object_idx[object_cnt++] = i; } + else continue; } else if (k_ptr->tval == group_tval) { - /* Add the race */ + /* Add the object */ object_idx[object_cnt++] = i; } + else continue; + + /* XXX Hack -- Just checking for non-empty group */ + if (mode & 0x01) break; } /* Terminate the list */ - object_idx[object_cnt] = 0; + object_idx[object_cnt] = -1; - /* Return the number of races */ + /* Return the number of objects */ return object_cnt; } @@ -5216,8 +5636,10 @@ static cptr feature_group_text[] = /* * Build a list of feature indexes in the given group. Return the number * of features in the group. + * + * mode & 0x01 : check for non-empty group */ -static int collect_features(int grp_cur, int *feat_idx) +static int collect_features(int grp_cur, int *feat_idx, byte mode) { int i, feat_cnt = 0; @@ -5225,7 +5647,7 @@ static int collect_features(int grp_cur, int *feat_idx) (void)grp_cur; /* Check every feature */ - for (i = 1; i < max_f_idx; i++) + for (i = 0; i < max_f_idx; i++) { /* Access the index */ feature_type *f_ptr = &f_info[i]; @@ -5238,10 +5660,13 @@ static int collect_features(int grp_cur, int *feat_idx) /* Add the index */ feat_idx[feat_cnt++] = i; + + /* XXX Hack -- Just checking for non-empty group */ + if (mode & 0x01) break; } /* Terminate the list */ - feat_idx[feat_cnt] = 0; + feat_idx[feat_cnt] = -1; /* Return the number of races */ return feat_cnt; @@ -5295,79 +5720,6 @@ static int collect_artifacts(int grp_cur, int object_idx[]) static char hack[17] = "dwsorgbuDWvyRGBU"; -static errr photo_fgets(FILE *fff, char *buf, huge n) -{ - huge i = 0; - - char *s; - - char tmp[1024]; - - /* Read a line */ - if (fgets(tmp, 1024, fff)) - { - /* Convert weirdness */ - for (s = tmp; *s; s++) - { - /* Handle newline */ - if (*s == '\n') - { - /* Terminate */ - buf[i] = '\0'; - - /* Success */ - return (0); - } - - /* Handle tabs */ - else if (*s == '\t') - { - /* Hack -- require room */ - if (i + 8 >= n) break; - - /* Append a space */ - buf[i++] = ' '; - - /* Append some more spaces */ - while (!(i % 8)) buf[i++] = ' '; - } - -#ifdef JP - else if (iskanji(*s)) - { - if (!s[1]) break; - buf[i++] = *s++; - buf[i++] = *s; - } -# ifndef EUC - /* Ⱦ³Ñ¤«¤Ê¤ËÂбþ */ - else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf)) - { - buf[i++] = *s; - if (i >= n) break; - } -# endif -#endif - /* Handle printables */ - else - { - /* Copy */ - buf[i++] = *s; - - /* Check length */ - if (i >= n) break; - } - } - } - - /* Nothing */ - buf[0] = '\0'; - - /* Failure */ - return (1); -} - - /* * Hack -- load a screen dump from a file */ @@ -5388,9 +5740,6 @@ void do_cmd_load_screen(void) Term_get_size(&wid, &hgt); - /* Hack -- drop permissions */ - safe_setuid_drop(); - /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt"); @@ -5417,32 +5766,46 @@ void do_cmd_load_screen(void) /* Load the screen */ - for (y = 0; okay && (y < hgt); y++) + for (y = 0; okay; y++) { - /* Get a line of data */ - if (photo_fgets(fff, buf, 1024)) okay = FALSE; + /* Get a line of data including control code */ + if (!fgets(buf, 1024, fff)) okay = FALSE; + + /* Get the blank line */ + if (buf[0] == '\n' || buf[0] == '\0') break; + + /* Ignore too large screen image */ + if (y >= hgt) continue; /* Show each row */ for (x = 0; x < wid - 1; x++) { + /* End of line */ + if (buf[x] == '\n' || buf[x] == '\0') break; + /* Put the attr/char */ Term_draw(x, y, TERM_WHITE, buf[x]); } } - /* Get the blank line */ - if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE; - - /* Dump the screen */ - for (y = 0; okay && (y < hgt); y++) + for (y = 0; okay; y++) { - /* Get a line of data */ - if (photo_fgets(fff, buf, 1024)) okay = FALSE; + /* Get a line of data including control code */ + if (!fgets(buf, 1024, fff)) okay = FALSE; + + /* Get the blank line */ + if (buf[0] == '\n' || buf[0] == '\0') break; + + /* Ignore too large screen image */ + if (y >= hgt) continue; /* Dump each row */ for (x = 0; x < wid - 1; x++) { + /* End of line */ + if (buf[x] == '\n' || buf[x] == '\0') break; + /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); @@ -5459,16 +5822,9 @@ void do_cmd_load_screen(void) } - /* Get the blank line */ - if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE; - - /* Close it */ my_fclose(fff); - /* Hack -- grab permissions */ - safe_setuid_grab(); - /* Message */ #ifdef JP @@ -5495,215 +5851,124 @@ cptr inven_res_label = " AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv"; #endif -/* XTRA HACK RESLIST */ -static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, - int *j, byte tval, char *where) -{ - char o_name[MAX_NLEN]; - u32b flgs[TR_FLAG_SIZE]; - - if (!o_ptr->k_idx)return; - if (o_ptr->tval != tval)return; - - /* - * HACK:Ring of Lordly protection and Dragon shield/helm - * have random resistances. - */ - if ( ((o_ptr->tval >= TV_BOW && o_ptr->tval<= TV_DRAG_ARMOR && o_ptr->name2) - || (o_ptr->tval == TV_RING && o_ptr->sval == SV_RING_LORDLY) - || (o_ptr->tval == TV_SHIELD && o_ptr->sval == SV_DRAGON_SHIELD) - || (o_ptr->tval == TV_HELM && o_ptr->sval == SV_DRAGON_HELM) - || (o_ptr->tval == TV_GLOVES && o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) - || (o_ptr->tval == TV_BOOTS && o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) - || o_ptr->art_name || o_ptr->name1) && object_known_p(o_ptr)) - { - int i = 0; - object_desc(o_name, o_ptr, TRUE, 0); - while ( o_name[i] && i < 26 ){ -#ifdef JP - if (iskanji(o_name[i])) i++; -#endif - i++; - } - if(i<28) while(i<28){o_name[i]=' ';i++;} - o_name[i]=0; - - fprintf(fff,"%s %s", where, o_name); - - if (!(o_ptr->ident & (IDENT_MENTAL))) - { #ifdef JP - fprintf(fff, "-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n"); +#define IM_FLAG_STR "¡ö" +#define HAS_FLAG_STR "¡Ü" +#define NO_FLAG_STR "¡¦" #else - fprintf(fff, "-------unknown------------ -------unknown------\n"); +#define IM_FLAG_STR "* " +#define HAS_FLAG_STR "+ " +#define NO_FLAG_STR ". " #endif - } - else { - object_flags_known(o_ptr, flgs); - -#ifdef JP - if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"¡ö"); - else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"¡ö"); - else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); +#define print_im_or_res_flag(IM, RES) \ +{ \ + fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \ + (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \ +} - if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"¡ö"); - else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); +#define print_flag(TR) \ +{ \ + fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \ +} - if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"¡ö"); - else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - fprintf(fff," "); - - if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - - if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); - if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); +/* XTRA HACK RESLIST */ +static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where) +{ + char o_name[MAX_NLEN]; + u32b flgs[TR_FLAG_SIZE]; + + if (!o_ptr->k_idx) return; + if (o_ptr->tval != tval) return; + + /* Identified items only */ + if (!object_is_known(o_ptr)) return; + + /* + * HACK:Ring of Lordly protection and Dragon equipment + * have random resistances. + */ + if ((object_is_wearable(o_ptr) && object_is_ego(o_ptr)) + || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE)) + || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY)) + || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) + || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) + || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) + || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) + || object_is_artifact(o_ptr)) + { + int i = 0; + object_desc(o_name, o_ptr, OD_NAME_ONLY); - if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); + while (o_name[i] && (i < 26)) + { +#ifdef JP + if (iskanji(o_name[i])) i++; +#endif + i++; + } + if (i < 28) + { + while (i < 28) + { + o_name[i] = ' '; i++; + } + } + o_name[i] = '\0'; - if (have_flag(flgs, TR_REGEN)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); + fprintf(fff, "%s %s", where, o_name); - if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"¡Ü"); - else fprintf(fff,"¡¦"); + if (!(o_ptr->ident & (IDENT_MENTAL))) + { +#ifdef JP + fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff); #else - if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"* "); - else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"* "); - else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"* "); - else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"* "); - else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - fprintf(fff," "); - - if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"+ "); - else fprintf(fff,". "); - - if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"+ "); - else fprintf(fff,". "); + fputs("-------unknown------------ -------unknown------\n", fff); +#endif + } + else + { + object_flags_known(o_ptr, flgs); - if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"+ "); - else fprintf(fff,". "); + print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID); + print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC); + print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE); + print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD); + print_flag(TR_RES_POIS); + print_flag(TR_RES_LITE); + print_flag(TR_RES_DARK); + print_flag(TR_RES_SHARDS); + print_flag(TR_RES_SOUND); + print_flag(TR_RES_NETHER); + print_flag(TR_RES_NEXUS); + print_flag(TR_RES_CHAOS); + print_flag(TR_RES_DISEN); + fputs(" ", fff); - if (have_flag(flgs, TR_REGEN)) fprintf(fff,"+ "); - else fprintf(fff,". "); + print_flag(TR_RES_BLIND); + print_flag(TR_RES_FEAR); + print_flag(TR_RES_CONF); + print_flag(TR_FREE_ACT); + print_flag(TR_SEE_INVIS); + print_flag(TR_HOLD_LIFE); + print_flag(TR_TELEPATHY); + print_flag(TR_SLOW_DIGEST); + print_flag(TR_REGEN); + print_flag(TR_LEVITATION); - if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"+ "); - else fprintf(fff,". "); -#endif - fprintf(fff,"\n"); - } - (*j)++; - if(*j==9) - { - *j=0; - fprintf(fff,"%s\n", inven_res_label); + fputc('\n', fff); + } + (*j)++; + if (*j == 9) + { + *j = 0; + fprintf(fff, "%s\n", inven_res_label); + } } - } } /* @@ -5711,80 +5976,74 @@ static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, */ static void do_cmd_knowledge_inven(void) { - FILE *fff; char file_name[1024]; - + store_type *st_ptr; - object_type *o_ptr; byte tval; - int i=0; - int j=0; + int i = 0; + int j = 0; char where[32]; /* Open a new file */ fff = my_fopen_temp(file_name, 1024); - if (!fff) { + if (!fff) + { #ifdef JP msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name); #else - msg_format("Failed to create temporally file %s.", file_name); + msg_format("Failed to create temporary file %s.", file_name); #endif msg_print(NULL); return; } - fprintf(fff,"%s\n",inven_res_label); + fprintf(fff, "%s\n", inven_res_label); - for (tval=TV_BOW; tval <= TV_RING; tval++){ + for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++) + { + if (j != 0) + { + for (; j < 9; j++) fputc('\n', fff); + j = 0; + fprintf(fff, "%s\n", inven_res_label); + } - if (j!=0) { - for (;j<9;j++) fprintf(fff, "\n"); - j=0; - fprintf(fff,"%s\n",inven_res_label); - } - #ifdef JP - strcpy(where, "Áõ"); + strcpy(where, "Áõ"); #else - strcpy(where, "E "); + strcpy(where, "E "); #endif - for (i = INVEN_RARM; i < INVEN_TOTAL; i++) - { - o_ptr = &inventory[i]; - do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where); - } - + for (i = INVEN_RARM; i < INVEN_TOTAL; i++) + { + do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where); + } + #ifdef JP - strcpy(where, "»ý"); + strcpy(where, "»ý"); #else - strcpy(where, "I "); + strcpy(where, "I "); #endif - for (i = 0; i < INVEN_PACK; i++) - { - o_ptr = &inventory[i]; - do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where); - } - - - /* Print all homes in the different towns */ - st_ptr = &town[1].store[STORE_HOME]; + for (i = 0; i < INVEN_PACK; i++) + { + do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where); + } + + st_ptr = &town[1].store[STORE_HOME]; #ifdef JP - strcpy(where, "²È"); + strcpy(where, "²È"); #else - strcpy(where, "H "); + strcpy(where, "H "); #endif - - /* Dump all available items */ - for (i = 0; i < st_ptr->stock_num; i++) - { - o_ptr = &st_ptr->stock[i]; - do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where); - } + + for (i = 0; i < st_ptr->stock_num; i++) + { + do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where); + } } - + /* Close the file */ my_fclose(fff); @@ -5983,13 +6242,7 @@ static void do_cmd_save_screen_html(void) msg_print(NULL); - /* Hack -- drop permissions */ - safe_setuid_drop(); - do_cmd_save_screen_html_aux(buf, 1); - - /* Hack -- grab permissions */ - safe_setuid_grab(); } @@ -6068,10 +6321,6 @@ void do_cmd_save_screen(void) char buf[1024]; - - /* Hack -- drop permissions */ - safe_setuid_drop(); - /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "dump.txt"); @@ -6084,8 +6333,6 @@ void do_cmd_save_screen(void) /* Oops */ if (!fff) { - /* Hack -- grab permissions */ - safe_setuid_grab(); #ifdef JP msg_format("¥Õ¥¡¥¤¥ë %s ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£", buf); #else @@ -6151,9 +6398,6 @@ void do_cmd_save_screen(void) /* Close it */ my_fclose(fff); - /* Hack -- grab permissions */ - safe_setuid_grab(); - /* Message */ #ifdef JP msg_print("²èÌÌ(µ­Ç°»£±Æ)¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Þ¤·¤¿¡£"); @@ -6340,10 +6584,10 @@ static void do_cmd_knowledge_artifacts(void) next_o_idx = o_ptr->next_o_idx; /* Ignore non-artifacts */ - if (!artifact_p(o_ptr)) continue; + if (!object_is_fixed_artifact(o_ptr)) continue; /* Ignore known items */ - if (object_known_p(o_ptr)) continue; + if (object_is_known(o_ptr)) continue; /* Note the artifact */ okay[o_ptr->name1] = FALSE; @@ -6360,10 +6604,10 @@ static void do_cmd_knowledge_artifacts(void) if (!o_ptr->k_idx) continue; /* Ignore non-artifacts */ - if (!artifact_p(o_ptr)) continue; + if (!object_is_fixed_artifact(o_ptr)) continue; /* Ignore known items */ - if (object_known_p(o_ptr)) continue; + if (object_is_known(o_ptr)) continue; /* Note the artifact */ okay[o_ptr->name1] = FALSE; @@ -6412,8 +6656,11 @@ static void do_cmd_knowledge_artifacts(void) /* Make it an artifact */ q_ptr->name1 = (byte)who[k]; + /* Display as if known */ + q_ptr->ident |= IDENT_STORE; + /* Describe the artifact */ - object_desc_store(base_name, q_ptr, FALSE, 0); + object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); } /* Hack -- Build the artifact name */ @@ -6449,6 +6696,7 @@ static void do_cmd_knowledge_artifacts(void) /* * Display known uniques + * With "XTRA HACK UNIQHIST" (Originally from XAngband) */ static void do_cmd_knowledge_uniques(void) { @@ -6460,10 +6708,19 @@ static void do_cmd_knowledge_uniques(void) char file_name[1024]; + int n_alive[10]; + int n_alive_surface = 0; + int n_alive_over100 = 0; + int n_alive_total = 0; + int max_lev = -1; + + for (i = 0; i < 10; i++) n_alive[i] = 0; + /* Open a new file */ fff = my_fopen_temp(file_name, 1024); - if (!fff) { + if (!fff) + { #ifdef JP msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name); #else @@ -6480,9 +6737,36 @@ static void do_cmd_knowledge_uniques(void) for (i = 1; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; + int lev; - /* Use that monster */ - if (r_ptr->name) who[n++] = i; + if (!r_ptr->name) continue; + + /* Require unique monsters */ + if (!(r_ptr->flags1 & RF1_UNIQUE)) continue; + + /* Only display "known" uniques */ + if (!cheat_know && !r_ptr->r_sights) continue; + + /* Only print rarity <= 100 uniques */ + if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR))) continue; + + /* Only "alive" uniques */ + if (r_ptr->max_num == 0) continue; + + if (r_ptr->level) + { + lev = (r_ptr->level - 1) / 10; + if (lev < 10) + { + n_alive[lev]++; + if (max_lev < lev) max_lev = lev; + } + else n_alive_over100++; + } + else n_alive_surface++; + + /* Collect "appropriate" monsters */ + who[n++] = i; } /* Select the sort method */ @@ -6492,32 +6776,64 @@ static void do_cmd_knowledge_uniques(void) /* Sort the array by dungeon depth of monsters */ ang_sort(who, &why, n); - /* Scan the monster races */ - for (k = 0; k < n; k++) + if (n_alive_surface) { - monster_race *r_ptr = &r_info[who[k]]; - - /* Only print Uniques */ - if (r_ptr->flags1 & (RF1_UNIQUE)) - { - bool dead = (r_ptr->max_num == 0); - - if (dead) continue; - - /* Only display "known" uniques */ - if (dead || cheat_know || r_ptr->r_sights) - { - /* Print a message */ #ifdef JP - fprintf(fff, " %s¤Ï¤Þ¤ÀÀ¸¤­¤Æ¤¤¤ë¡£\n", - (r_name + r_ptr->name)); + fprintf(fff, " ÃϾå À¸Â¸: %3dÂÎ\n", n_alive_surface); #else - fprintf(fff, " %s is alive\n", - (r_name + r_ptr->name)); + fprintf(fff, " Surface alive: %3d\n", n_alive_surface); +#endif + n_alive_total += n_alive_surface; + } + for (i = 0; i <= max_lev; i++) + { +#ifdef JP + fprintf(fff, "%3d-%3d³¬ À¸Â¸: %3dÂÎ\n", 1 + i * 10, 10 + i * 10, n_alive[i]); +#else + fprintf(fff, "Level %3d-%3d alive: %3d\n", 1 + i * 10, 10 + i * 10, n_alive[i]); +#endif + n_alive_total += n_alive[i]; + } + if (n_alive_over100) + { +#ifdef JP + fprintf(fff, "101- ³¬ À¸Â¸: %3dÂÎ\n", n_alive_over100); +#else + fprintf(fff, "Level 101- alive: %3d\n", n_alive_over100); +#endif + n_alive_total += n_alive_over100; + } + + if (n_alive_total) + { +#ifdef JP + fputs("--------- -----------\n", fff); + fprintf(fff, " ¹ç·× À¸Â¸: %3dÂÎ\n\n", n_alive_total); +#else + fputs("------------- ----------\n", fff); + fprintf(fff, " Total alive: %3d\n\n", n_alive_total); +#endif + } + else + { +#ifdef JP + fputs("¸½ºß¤Ï´ûÃΤÎÀ¸Â¸¥æ¥Ë¡¼¥¯¤Ï¤¤¤Þ¤»¤ó¡£\n", fff); +#else + fputs("No known uniques alive.\n", fff); +#endif + } + + /* Scan the monster races */ + for (k = 0; k < n; k++) + { + monster_race *r_ptr = &r_info[who[k]]; + + /* Print a message */ +#ifdef JP + fprintf(fff, " %s (¥ì¥Ù¥ë%d)\n", r_name + r_ptr->name, r_ptr->level); +#else + fprintf(fff, " %s (level %d)\n", r_name + r_ptr->name, r_ptr->level); #endif - - } - } } /* Free the "who" array */ @@ -6544,7 +6860,7 @@ static void do_cmd_knowledge_uniques(void) */ static void do_cmd_knowledge_weapon_exp(void) { - int i,j, num, shougou; + int i, j, num, weapon_exp; FILE *fff; @@ -6563,7 +6879,7 @@ static void do_cmd_knowledge_weapon_exp(void) return; } - for(i = 0; i < 5; i++) + for (i = 0; i < 5; i++) { for (num = 0; num < 64; num++) { @@ -6571,22 +6887,18 @@ static void do_cmd_knowledge_weapon_exp(void) { object_kind *k_ptr = &k_info[j]; - if ((k_ptr->tval == TV_SWORD-i) && (k_ptr->sval == num)) + if ((k_ptr->tval == TV_SWORD - i) && (k_ptr->sval == num)) { - if((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue; + if ((k_ptr->tval == TV_BOW) && (k_ptr->sval == SV_CRIMSON)) continue; - if(p_ptr->weapon_exp[4-i][num]<4000) shougou=0; - else if(p_ptr->weapon_exp[4-i][num]<6000) shougou=1; - else if(p_ptr->weapon_exp[4-i][num]<7000) shougou=2; - else if(p_ptr->weapon_exp[4-i][num]<8000) shougou=3; - else shougou=4; + weapon_exp = p_ptr->weapon_exp[4 - i][num]; strip_name(tmp, j); - fprintf(fff,"%-25s ",tmp); - if (p_ptr->weapon_exp[4-i][num] >= s_info[p_ptr->pclass].w_max[4-i][num]) fprintf(fff,"!"); - else fprintf(fff," "); - fprintf(fff,"%s",shougou_moji[shougou]); - if (cheat_xtra) fprintf(fff," %d",p_ptr->weapon_exp[4-i][num]); - fprintf(fff,"\n"); + fprintf(fff, "%-25s ", tmp); + if (weapon_exp >= s_info[p_ptr->pclass].w_max[4 - i][num]) fprintf(fff, "!"); + else fprintf(fff, " "); + fprintf(fff, "%s", exp_level_str[weapon_exp_level(weapon_exp)]); + if (cheat_xtra) fprintf(fff, " %d", weapon_exp); + fprintf(fff, "\n"); break; } } @@ -6614,7 +6926,7 @@ static void do_cmd_knowledge_weapon_exp(void) */ static void do_cmd_knowledge_spell_exp(void) { - int i=0, shougou; + int i = 0, spell_exp, exp_level; FILE *fff; magic_type *s_ptr; @@ -6633,12 +6945,12 @@ static void do_cmd_knowledge_spell_exp(void) return; } - if(p_ptr->realm1 != REALM_NONE) + if (p_ptr->realm1 != REALM_NONE) { #ifdef JP - fprintf(fff,"%s¤ÎËâË¡½ñ\n",realm_names[p_ptr->realm1]); + fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm1]); #else - fprintf(fff,"%s Spellbook\n",realm_names[p_ptr->realm1]); + fprintf(fff, "%s Spellbook\n", realm_names[p_ptr->realm1]); #endif for (i = 0; i < 32; i++) { @@ -6650,29 +6962,30 @@ static void do_cmd_knowledge_spell_exp(void) { s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][i]; } - if(s_ptr->slevel == 99) continue; - if(p_ptr->spell_exp[i]<900) shougou=0; - else if(p_ptr->spell_exp[i]<1200) shougou=1; - else if(p_ptr->spell_exp[i]<1400) shougou=2; - else if(p_ptr->spell_exp[i]<1600) shougou=3; - else shougou=4; - fprintf(fff,"%-25s ",spell_names[technic2magic(p_ptr->realm1)-1][i]); + if (s_ptr->slevel >= 99) continue; + spell_exp = p_ptr->spell_exp[i]; + exp_level = spell_exp_level(spell_exp); + fprintf(fff, "%-25s ", do_spell(p_ptr->realm1, i, SPELL_NAME)); if (p_ptr->realm1 == REALM_HISSATSU) - fprintf(fff,"[--]"); + fprintf(fff, "[--]"); else { - if (shougou == 4) fprintf(fff,"!"); - else fprintf(fff," "); - fprintf(fff,"%s",shougou_moji[shougou]); + if (exp_level >= EXP_LEVEL_MASTER) fprintf(fff, "!"); + else fprintf(fff, " "); + fprintf(fff, "%s", exp_level_str[exp_level]); } - if (cheat_xtra) fprintf(fff," %d",p_ptr->spell_exp[i]); - fprintf(fff,"\n"); + if (cheat_xtra) fprintf(fff, " %d", spell_exp); + fprintf(fff, "\n"); } } - if(p_ptr->realm2 != REALM_NONE) + if (p_ptr->realm2 != REALM_NONE) { - fprintf(fff,"\n%s Spellbook\n",realm_names[p_ptr->realm2]); +#ifdef JP + fprintf(fff, "%s¤ÎËâË¡½ñ\n", realm_names[p_ptr->realm2]); +#else + fprintf(fff, "\n%s Spellbook\n", realm_names[p_ptr->realm2]); +#endif for (i = 0; i < 32; i++) { if (!is_magic(p_ptr->realm1)) @@ -6683,18 +6996,16 @@ static void do_cmd_knowledge_spell_exp(void) { s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][i]; } - if(s_ptr->slevel == 99) continue; + if (s_ptr->slevel >= 99) continue; - if(p_ptr->spell_exp[i+32]<900) shougou=0; - else if(p_ptr->spell_exp[i+32]<1200) shougou=1; - else if(p_ptr->spell_exp[i+32]<1400) shougou=2; - else shougou=3; - fprintf(fff,"%-25s ",spell_names[technic2magic(p_ptr->realm2)-1][i]); - if (shougou == 3) fprintf(fff,"!"); - else fprintf(fff," "); - fprintf(fff,"%s",shougou_moji[shougou]); - if (cheat_xtra) fprintf(fff," %d",p_ptr->spell_exp[i+32]); - fprintf(fff,"\n"); + spell_exp = p_ptr->spell_exp[i + 32]; + exp_level = spell_exp_level(spell_exp); + fprintf(fff, "%-25s ", do_spell(p_ptr->realm2, i, SPELL_NAME)); + if (exp_level >= EXP_LEVEL_EXPERT) fprintf(fff, "!"); + else fprintf(fff, " "); + fprintf(fff, "%s", exp_level_str[exp_level]); + if (cheat_xtra) fprintf(fff, " %d", spell_exp); + fprintf(fff, "\n"); } } @@ -6719,7 +7030,7 @@ static void do_cmd_knowledge_spell_exp(void) */ static void do_cmd_knowledge_skill_exp(void) { - int i=0, shougou; + int i = 0, skill_exp; FILE *fff; @@ -6744,28 +7055,13 @@ static void do_cmd_knowledge_skill_exp(void) for (i = 0; i < 3; i++) { - if(i == GINOU_RIDING) - { - if(p_ptr->skill_exp[i]<500) shougou=0; - else if(p_ptr->skill_exp[i]<2000) shougou=1; - else if(p_ptr->skill_exp[i]<5000) shougou=2; - else if(p_ptr->skill_exp[i]<8000) shougou=3; - else shougou=4; - } - else - { - if(p_ptr->skill_exp[i]<4000) shougou=0; - else if(p_ptr->skill_exp[i]<6000) shougou=1; - else if(p_ptr->skill_exp[i]<7000) shougou=2; - else if(p_ptr->skill_exp[i]<8000) shougou=3; - else shougou=4; - } - fprintf(fff,"%-20s ",skill_name[i]); - if (p_ptr->skill_exp[i] == s_info[p_ptr->pclass].s_max[i]) fprintf(fff,"!"); - else fprintf(fff," "); - fprintf(fff,"%s",shougou_moji[shougou]); - if (cheat_xtra) fprintf(fff," %d",p_ptr->skill_exp[i]); - fprintf(fff,"\n"); + skill_exp = p_ptr->skill_exp[i]; + fprintf(fff, "%-20s ", skill_name[i]); + if (skill_exp >= s_info[p_ptr->pclass].s_max[i]) fprintf(fff, "!"); + else fprintf(fff, " "); + fprintf(fff, "%s", exp_level_str[(i == GINOU_RIDING) ? riding_exp_level(skill_exp) : weapon_exp_level(skill_exp)]); + if (cheat_xtra) fprintf(fff, " %d", skill_exp); + fprintf(fff, "\n"); } /* Close the file */ @@ -6791,25 +7087,25 @@ void plural_aux(char *Name) { int NameLen = strlen(Name); - if (strstr(Name, "Disembodied hand")) + if (my_strstr(Name, "Disembodied hand")) { strcpy(Name, "Disembodied hands that strangled people"); } - else if (strstr(Name, "Colour out of space")) + else if (my_strstr(Name, "Colour out of space")) { strcpy(Name, "Colours out of space"); } - else if (strstr(Name, "stairway to hell")) + else if (my_strstr(Name, "stairway to hell")) { strcpy(Name, "stairways to hell"); } - else if (strstr(Name, "Dweller on the threshold")) + else if (my_strstr(Name, "Dweller on the threshold")) { strcpy(Name, "Dwellers on the threshold"); } - else if (strstr(Name, " of ")) + else if (my_strstr(Name, " of ")) { - cptr aider = strstr(Name, " of "); + cptr aider = my_strstr(Name, " of "); char dummy[80]; int i = 0; cptr ctr = Name; @@ -6833,7 +7129,7 @@ void plural_aux(char *Name) strcpy(&(dummy[i+1]), aider); strcpy(Name, dummy); } - else if (strstr(Name, "coins")) + else if (my_strstr(Name, "coins")) { char dummy[80]; strcpy(dummy, "piles of "); @@ -6841,7 +7137,7 @@ void plural_aux(char *Name) strcpy(Name, dummy); return; } - else if (strstr(Name, "Manes")) + else if (my_strstr(Name, "Manes")) { return; } @@ -6915,6 +7211,7 @@ static void do_cmd_knowledge_pets(void) int i; FILE *fff; monster_type *m_ptr; + char pet_name[80]; int t_friends = 0; int show_upkeep = 0; char file_name[1024]; @@ -6935,28 +7232,18 @@ static void do_cmd_knowledge_pets(void) /* Process the monsters (backwards) */ for (i = m_max - 1; i >= 1; i--) { - monster_race *r_ptr; /* Access the monster */ m_ptr = &m_list[i]; /* Ignore "dead" monsters */ if (!m_ptr->r_idx) continue; - r_ptr = &r_info[m_ptr->r_idx]; /* Calculate "upkeep" for pets */ if (is_pet(m_ptr)) { - char pet_name[80]; t_friends++; - monster_desc(pet_name, m_ptr, 0x88); - fprintf(fff, "%s (%s)", pet_name, look_mon_desc(i, 0x00)); - if (p_ptr->riding == i) -#ifdef JP - fprintf(fff, " ¾èÇÏÃæ"); -#else - fprintf(fff, " Riding"); -#endif - fprintf(fff, "\n"); + monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); + fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00)); } } @@ -6964,7 +7251,7 @@ static void do_cmd_knowledge_pets(void) fprintf(fff, "----------------------------------------------\n"); #ifdef JP - fprintf(fff, " ¹ç·×: %d ɤ¤Î¥Ú¥Ã¥È\n", t_friends); + fprintf(fff, " ¹ç·×: %d ÂΤΥڥåÈ\n", t_friends); fprintf(fff, " °Ý»ý¥³¥¹¥È: %d%% MP\n", show_upkeep); #else fprintf(fff, " Total: %d pet%s.\n", @@ -7058,21 +7345,12 @@ static void do_cmd_knowledge_kill_count(void) #else fprintf(fff,"You have defeated no enemies yet.\n\n"); #endif - - else if (Total == 1) -#ifdef JP - fprintf(fff,"¤¢¤Ê¤¿¤Ï°ìɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n"); -#else - fprintf(fff,"You have defeated one enemy.\n\n"); -#endif - else #ifdef JP - fprintf(fff,"¤¢¤Ê¤¿¤Ï %lu ɤ¤ÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", Total); + fprintf(fff,"¤¢¤Ê¤¿¤Ï%ldÂΤÎŨ¤òÅݤ·¤Æ¤¤¤ë¡£\n\n", (long int)Total); #else - fprintf(fff,"You have defeated %lu enemies.\n\n", Total); + fprintf(fff,"You have defeated %ld %s.\n\n", (long int)Total, (Total == 1) ? "enemy" : "enemies"); #endif - } Total = 0; @@ -7117,15 +7395,15 @@ static void do_cmd_knowledge_kill_count(void) if (This > 0) { #ifdef JP - /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/ - if(strchr("pt",r_ptr->d_char)) + /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita */ + if (my_strchr("pt", r_ptr->d_char)) fprintf(fff, " %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name); else - fprintf(fff, " %3d ɤ¤Î %s\n", This, r_name + r_ptr->name); + fprintf(fff, " %3d ÂΤΠ%s\n", This, r_name + r_ptr->name); #else if (This < 2) { - if (strstr(r_name + r_ptr->name, "coins")) + if (my_strstr(r_name + r_ptr->name, "coins")) { fprintf(fff, " 1 pile of %s\n", (r_name + r_ptr->name)); } @@ -7151,10 +7429,10 @@ static void do_cmd_knowledge_kill_count(void) fprintf(fff,"----------------------------------------------\n"); #ifdef JP - fprintf(fff," ¹ç·×: %lu ɤ¤òÅݤ·¤¿¡£\n", Total); + fprintf(fff," ¹ç·×: %lu ÂΤòÅݤ·¤¿¡£\n", (unsigned long int)Total); #else fprintf(fff," Total: %lu creature%s killed.\n", - Total, (Total == 1 ? "" : "s")); + (unsigned long int)Total, (Total == 1 ? "" : "s")); #endif @@ -7337,8 +7615,8 @@ static void display_visual_list(int col, int row, int height, int width, byte at /* Display columns until done */ for (j = 0; j < width; j++) { - byte a, a2; - char c, c2; + byte a; + char c; int x = col + j; int y = row + i; int ia, ic; @@ -7360,13 +7638,8 @@ static void display_visual_list(int col, int row, int height, int width, byte at /* Force correct code for both ASCII character and tile */ if (c & 0x80) a |= 0x80; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); - /* Display symbol */ - Term_putch(x, y, a, c); - - /* Second byte */ - if (use_bigtile) Term_putch(x + 1, y, a2, c2); + Term_queue_bigchar(x, y, a, c, 0, 0); } } } @@ -7397,13 +7670,17 @@ static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr static byte attr_idx = 0; static byte char_idx = 0; +/* Hack -- for feature lighting */ +static byte attr_idx_feat[F_LIT_MAX]; +static byte char_idx_feat[F_LIT_MAX]; + /* * Do visual mode command -- Change symbols */ -static bool visual_mode_command(char ch, bool *visual_list_ptr, - int height, int width, - byte *attr_top_ptr, byte *char_left_ptr, - byte *cur_attr_ptr, byte *cur_char_ptr) +static bool visual_mode_command(char ch, bool *visual_list_ptr, + int height, int width, + byte *attr_top_ptr, byte *char_left_ptr, + byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw) { static byte attr_old = 0, char_old = 0; @@ -7419,7 +7696,6 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr, return TRUE; } - break; case '\n': @@ -7428,6 +7704,7 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr, { /* Accept change */ *visual_list_ptr = FALSE; + *need_redraw = TRUE; return TRUE; } @@ -7451,19 +7728,30 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr, case 'C': case 'c': - /* Set the visual */ - attr_idx = *cur_attr_ptr; - char_idx = *cur_char_ptr; + { + int i; + + /* Set the visual */ + attr_idx = *cur_attr_ptr; + char_idx = *cur_char_ptr; + /* Hack -- for feature lighting */ + for (i = 0; i < F_LIT_MAX; i++) + { + attr_idx_feat[i] = 0; + char_idx_feat[i] = 0; + } + } return TRUE; case 'P': case 'p': - if (attr_idx) + if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow TERM_DARK text */ { /* Set the char */ *cur_attr_ptr = attr_idx; *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5); + if (!*visual_list_ptr) *need_redraw = TRUE; } if (char_idx) @@ -7471,6 +7759,7 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr, /* Set the char */ *cur_char_ptr = char_idx; *char_left_ptr = MAX(0, *cur_char_ptr - 10); + if (!*visual_list_ptr) *need_redraw = TRUE; } return TRUE; @@ -7485,7 +7774,7 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr, if (use_bigtile) eff_width = width / 2; else eff_width = width; - + /* Restrict direction */ if ((a == 0) && (ddy[d] < 0)) d = 0; if ((c == 0) && (ddx[d] < 0)) d = 0; @@ -7510,7 +7799,6 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr, if ((ddy[d] > 0) && *attr_top_ptr + height < MIN(0x7f, (a & 0x7f) + 4)) (*attr_top_ptr)++; return TRUE; } - break; } @@ -7523,16 +7811,14 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr, * Display the monsters in a group. */ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[], - int mon_cur, int mon_top) + int mon_cur, int mon_top, bool visual_only) { int i; /* Display lines until done */ - for (i = 0; i < per_page && mon_idx[mon_top + i]; i++) + for (i = 0; i < per_page && (mon_idx[mon_top + i] >= 0); i++) { byte attr; - byte a, a2; - char c, c2; /* Get the race index */ int r_idx = mon_idx[mon_top + i] ; @@ -7540,7 +7826,6 @@ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[], /* Access the race */ monster_race *r_ptr = &r_info[r_idx]; - /* Choose a color */ attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE); @@ -7550,31 +7835,29 @@ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[], /* Hack -- visual_list mode */ if (per_page == 1) { - c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, 60); + c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 56 : 61); } - else if (p_ptr->wizard) + if (p_ptr->wizard || visual_only) { - c_prt(attr, format("%d", r_idx), row + i, 60); + c_prt(attr, format("%d", r_idx), row + i, 62); } - a = r_ptr->x_attr; - c = r_ptr->x_char; - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); + /* Erase chars before overwritten by the race letter */ + Term_erase(69, row + i, 255); /* Display symbol */ - Term_putch(70, row + i, a, c); - - /* Second byte */ - if (use_bigtile) Term_putch(70 + 1, row + i, a2, c2); + Term_queue_bigchar(use_bigtile ? 69 : 70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0); - /* Display kills */ - if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73); + if (!visual_only) + { + /* Display kills */ + if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73); #ifdef JP - else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 73); + else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "»àË´" : "À¸Â¸"), row + i, 74); #else - else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? "dead" : "alive"), row + i, 73); + else c_put_str((r_ptr->max_num == 0 ? TERM_L_DARK : TERM_WHITE), (r_ptr->max_num == 0 ? " dead" : "alive"), row + i, 73); #endif - + } } /* Clear remaining lines */ @@ -7588,7 +7871,7 @@ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[], /* * Display known monsters. */ -static void do_cmd_knowledge_monsters(void) +static void do_cmd_knowledge_monsters(bool *need_redraw, bool visual_only, int direct_r_idx) { int i, len, max; int grp_cur, grp_top, old_grp_cur; @@ -7596,7 +7879,7 @@ static void do_cmd_knowledge_monsters(void) int grp_cnt, grp_idx[100]; int mon_cnt; s16b *mon_idx; - + int column = 0; bool flag; bool redraw; @@ -7607,6 +7890,8 @@ static void do_cmd_knowledge_monsters(void) int browser_rows; int wid, hgt; + byte mode; + /* Get size */ Term_get_size(&wid, &hgt); @@ -7618,21 +7903,39 @@ static void do_cmd_knowledge_monsters(void) max = 0; grp_cnt = 0; - /* Check every group */ - for (i = 0; monster_group_text[i] != NULL; i++) + if (direct_r_idx < 0) { - /* Measure the label */ - len = strlen(monster_group_text[i]); - - /* Save the maximum length */ - if (len > max) max = len; + mode = visual_only ? 0x03 : 0x01; - /* See if any monsters are known */ - if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, 0x01)) + /* Check every group */ + for (i = 0; monster_group_text[i] != NULL; i++) { - /* Build a list of groups with known monsters */ - grp_idx[grp_cnt++] = i; + /* Measure the label */ + len = strlen(monster_group_text[i]); + + /* Save the maximum length */ + if (len > max) max = len; + + /* See if any monsters are known */ + if ((monster_group_char[i] == ((char *) -1L)) || collect_monsters(i, mon_idx, mode)) + { + /* Build a list of groups with known monsters */ + grp_idx[grp_cnt++] = i; + } } + + mon_cnt = 0; + } + else + { + mon_idx[0] = direct_r_idx; + mon_cnt = 1; + + /* Terminate the list */ + mon_idx[1] = -1; + + (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3), + &attr_top, &char_left, &r_info[direct_r_idx].x_attr, &r_info[direct_r_idx].x_char, need_redraw); } /* Terminate the list */ @@ -7641,11 +7944,12 @@ static void do_cmd_knowledge_monsters(void) old_grp_cur = -1; grp_cur = grp_top = 0; mon_cur = mon_top = 0; - mon_cnt = 0; flag = FALSE; redraw = TRUE; + mode = visual_only ? 0x02 : 0x00; + while (!flag) { char ch; @@ -7654,19 +7958,21 @@ static void do_cmd_knowledge_monsters(void) if (redraw) { clear_from(0); - + #ifdef JP - prt("Ãμ± - ¥â¥ó¥¹¥¿¡¼", 2, 0); - prt("¥°¥ë¡¼¥×", 4, 0); + prt(format("%s - ¥â¥ó¥¹¥¿¡¼", !visual_only ? "Ãμ±" : "ɽ¼¨"), 2, 0); + if (direct_r_idx < 0) prt("¥°¥ë¡¼¥×", 4, 0); prt("̾Á°", 4, max + 3); - if (p_ptr->wizard) prt("Idx", 4, 60); - prt("ʸ»ú »¦³²¿ô", 4, 67); + if (p_ptr->wizard || visual_only) prt("Idx", 4, 62); + prt("ʸ»ú", 4, 67); + if (!visual_only) prt("»¦³²¿ô", 4, 72); #else - prt("Knowledge - Monsters", 2, 0); - prt("Group", 4, 0); + prt(format("%s - monsters", !visual_only ? "Knowledge" : "Visuals"), 2, 0); + if (direct_r_idx < 0) prt("Group", 4, 0); prt("Name", 4, max + 3); - if (p_ptr->wizard) prt("Idx", 4, 60); - prt("Sym Kills", 4, 67); + if (p_ptr->wizard || visual_only) prt("Idx", 4, 62); + prt("Sym", 4, 68); + if (!visual_only) prt("Kills", 4, 73); #endif for (i = 0; i < 78; i++) @@ -7674,46 +7980,52 @@ static void do_cmd_knowledge_monsters(void) Term_putch(i, 5, TERM_WHITE, '='); } - for (i = 0; i < browser_rows; i++) + if (direct_r_idx < 0) { - Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); + for (i = 0; i < browser_rows; i++) + { + Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); + } } redraw = FALSE; } - /* Scroll group list */ - if (grp_cur < grp_top) grp_top = grp_cur; - if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1; + if (direct_r_idx < 0) + { + /* Scroll group list */ + if (grp_cur < grp_top) grp_top = grp_cur; + if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1; - /* Display a list of monster groups */ - display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top); + /* Display a list of monster groups */ + display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top); - if (old_grp_cur != grp_cur) - { - old_grp_cur = grp_cur; + if (old_grp_cur != grp_cur) + { + old_grp_cur = grp_cur; - /* Get a list of monsters in the current group */ - mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, 0x00); - } + /* Get a list of monsters in the current group */ + mon_cnt = collect_monsters(grp_idx[grp_cur], mon_idx, mode); + } - /* Scroll monster list */ - while (mon_cur < mon_top) - mon_top = MAX(0, mon_top - browser_rows/2); - while (mon_cur >= mon_top + browser_rows) - mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2); + /* Scroll monster list */ + while (mon_cur < mon_top) + mon_top = MAX(0, mon_top - browser_rows/2); + while (mon_cur >= mon_top + browser_rows) + mon_top = MIN(mon_cnt - browser_rows, mon_top + browser_rows/2); + } if (!visual_list) { /* Display a list of monsters in the current group */ - display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top); + display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only); } else { mon_top = mon_cur; /* Display a monster name */ - display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top); + display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only); /* Display visual list below first monster */ display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left); @@ -7721,19 +8033,30 @@ static void do_cmd_knowledge_monsters(void) /* Prompt */ #ifdef JP - prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0); + prt(format("<Êý¸þ>%s%s%s, ESC", + (!visual_list && !visual_only) ? ", 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë" : "", + visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", + (attr_idx || char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), + hgt - 1, 0); #else - prt(format(", 'r' to recall%s%s, ESC", visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0); + prt(format("%s%s%s, ESC", + (!visual_list && !visual_only) ? ", 'r' to recall" : "", + visual_list ? ", ENTER to accept" : ", 'v' for visuals", + (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), + hgt - 1, 0); #endif /* Get the current monster */ r_ptr = &r_info[mon_idx[mon_cur]]; - /* Mega Hack -- track this monster race */ - if (mon_cnt) monster_race_track(mon_idx[mon_cur]); + if (!visual_only) + { + /* Mega Hack -- track this monster race */ + if (mon_cnt) monster_race_track(mon_idx[mon_cur]); - /* Hack -- handle stuff */ - handle_stuff(); + /* Hack -- handle stuff */ + handle_stuff(); + } if (visual_list) { @@ -7747,11 +8070,25 @@ static void do_cmd_knowledge_monsters(void) { Term_gotoxy(max + 3, 6 + (mon_cur - mon_top)); } - + ch = inkey(); /* Do visual mode command if needed */ - if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &r_ptr->x_attr, &r_ptr->x_char)) continue; + if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &r_ptr->x_attr, &r_ptr->x_char, need_redraw)) + { + if (direct_r_idx >= 0) + { + switch (ch) + { + case '\n': + case '\r': + case ESCAPE: + flag = TRUE; + break; + } + } + continue; + } switch (ch) { @@ -7765,12 +8102,12 @@ static void do_cmd_knowledge_monsters(void) case 'r': { /* Recall on screen */ - if (mon_idx[mon_cur]) + if (!visual_list && !visual_only && (mon_idx[mon_cur] > 0)) { screen_roff(mon_idx[mon_cur], 0); (void)inkey(); - + redraw = TRUE; } break; @@ -7795,16 +8132,16 @@ static void do_cmd_knowledge_monsters(void) * Display the objects in a group. */ static void display_object_list(int col, int row, int per_page, int object_idx[], - int object_cur, int object_top) + int object_cur, int object_top, bool visual_only) { int i; /* Display lines until done */ - for (i = 0; i < per_page && object_idx[object_top + i]; i++) + for (i = 0; i < per_page && (object_idx[object_top + i] >= 0); i++) { char o_name[80]; - byte a, a2; - char c, c2; + byte a, c; + object_kind *flavor_k_ptr; /* Get the object index */ int k_idx = object_idx[object_top + i]; @@ -7813,13 +8150,35 @@ static void display_object_list(int col, int row, int per_page, int object_idx[] object_kind *k_ptr = &k_info[k_idx]; /* Choose a color */ - byte attr = (k_ptr->aware ? TERM_WHITE : TERM_SLATE); - byte cursor = (k_ptr->aware ? TERM_L_BLUE : TERM_BLUE); + byte attr = ((k_ptr->aware || visual_only) ? TERM_WHITE : TERM_SLATE); + byte cursor = ((k_ptr->aware || visual_only) ? TERM_L_BLUE : TERM_BLUE); + + + if (!visual_only && k_ptr->flavor) + { + /* Appearance of this object is shuffled */ + flavor_k_ptr = &k_info[k_ptr->flavor]; + } + else + { + /* Appearance of this object is very normal */ + flavor_k_ptr = k_ptr; + } + + attr = ((i + object_top == object_cur) ? cursor : attr); - - /* Tidy name */ - strip_name(o_name, k_idx); + + if (!k_ptr->flavor || (!visual_only && k_ptr->aware)) + { + /* Tidy name */ + strip_name(o_name, k_idx); + } + else + { + /* Flavor name */ + strcpy(o_name, k_name + flavor_k_ptr->flavor_name); + } /* Display the name */ c_prt(attr, o_name, row + i, col); @@ -7827,30 +8186,18 @@ static void display_object_list(int col, int row, int per_page, int object_idx[] /* Hack -- visual_list mode */ if (per_page == 1) { - c_prt(attr, format("%02x/%02x", k_ptr->x_attr, k_ptr->x_char), row + i, 60); + c_prt(attr, format("%02x/%02x", flavor_k_ptr->x_attr, flavor_k_ptr->x_char), row + i, (p_ptr->wizard || visual_only) ? 64 : 68); } - else if (p_ptr->wizard) + if (p_ptr->wizard || visual_only) { - c_prt(attr, format ("%d", k_idx), row + i, 70); + c_prt(attr, format("%d", k_idx), row + i, 70); } - a = k_ptr->flavor ? misc_to_attr[k_ptr->flavor] : k_ptr->x_attr; - c = k_ptr->flavor ? misc_to_char[k_ptr->flavor] : k_ptr->x_char; - - /* Symbol is unknown */ - if (!k_ptr->aware && !p_ptr->wizard) - { - c = ' '; - a = TERM_DARK; - } - - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); + a = flavor_k_ptr->x_attr; + c = flavor_k_ptr->x_char; /* Display symbol */ - Term_putch(76, row + i, a, c); - - /* Second byte */ - if (use_bigtile) Term_putch(76 + 1, row + i, a2, c2); + Term_queue_bigchar(use_bigtile ? 76 : 77, row + i, a, c, 0, 0); } /* Clear remaining lines */ @@ -7889,7 +8236,7 @@ static void desc_obj_fake(int k_idx) /* Hack -- Handle stuff */ handle_stuff(); - if (!screen_object(o_ptr, FALSE)) + if (!screen_object(o_ptr, SCROBJ_FAKE_OBJECT | SCROBJ_FORCE_DETAIL)) { #ifdef JP msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£"); @@ -7905,7 +8252,7 @@ static void desc_obj_fake(int k_idx) /* * Display known objects */ -static void do_cmd_knowledge_objects(void) +static void do_cmd_knowledge_objects(bool *need_redraw, bool visual_only, int direct_k_idx) { int i, len, max; int grp_cur, grp_top, old_grp_cur; @@ -7924,6 +8271,8 @@ static void do_cmd_knowledge_objects(void) int browser_rows; int wid, hgt; + byte mode; + /* Get size */ Term_get_size(&wid, &hgt); @@ -7935,21 +8284,55 @@ static void do_cmd_knowledge_objects(void) max = 0; grp_cnt = 0; - /* Check every group */ - for (i = 0; object_group_text[i] != NULL; i++) + if (direct_k_idx < 0) { - /* Measure the label */ - len = strlen(object_group_text[i]); + mode = visual_only ? 0x03 : 0x01; + + /* Check every group */ + for (i = 0; object_group_text[i] != NULL; i++) + { + /* Measure the label */ + len = strlen(object_group_text[i]); + + /* Save the maximum length */ + if (len > max) max = len; - /* Save the maximum length */ - if (len > max) max = len; + /* See if any monsters are known */ + if (collect_objects(i, object_idx, mode)) + { + /* Build a list of groups with known monsters */ + grp_idx[grp_cnt++] = i; + } + } + + object_old = -1; + object_cnt = 0; + } + else + { + object_kind *k_ptr = &k_info[direct_k_idx]; + object_kind *flavor_k_ptr; - /* See if any monsters are known */ - if (collect_objects(i, object_idx)) + if (!visual_only && k_ptr->flavor) { - /* Build a list of groups with known monsters */ - grp_idx[grp_cnt++] = i; + /* Appearance of this object is shuffled */ + flavor_k_ptr = &k_info[k_ptr->flavor]; } + else + { + /* Appearance of this object is very normal */ + flavor_k_ptr = k_ptr; + } + + object_idx[0] = direct_k_idx; + object_old = direct_k_idx; + object_cnt = 1; + + /* Terminate the list */ + object_idx[1] = -1; + + (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3), + &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw); } /* Terminate the list */ @@ -7958,32 +8341,32 @@ static void do_cmd_knowledge_objects(void) old_grp_cur = -1; grp_cur = grp_top = 0; object_cur = object_top = 0; - object_old = -1; - object_cnt = 0; flag = FALSE; redraw = TRUE; + mode = visual_only ? 0x02 : 0x00; + while (!flag) { char ch; - object_kind *k_ptr; + object_kind *k_ptr, *flavor_k_ptr; if (redraw) { clear_from(0); - + #ifdef JP - prt("Ãμ± - ¥¢¥¤¥Æ¥à", 2, 0); - prt("¥°¥ë¡¼¥×", 4, 0); + prt(format("%s - ¥¢¥¤¥Æ¥à", !visual_only ? "Ãμ±" : "ɽ¼¨"), 2, 0); + if (direct_k_idx < 0) prt("¥°¥ë¡¼¥×", 4, 0); prt("̾Á°", 4, max + 3); - if (p_ptr->wizard) prt("Idx", 4, 70); - prt("ʸ»ú", 4, 75); + if (p_ptr->wizard || visual_only) prt("Idx", 4, 70); + prt("ʸ»ú", 4, 74); #else - prt("Knowledge - objects", 2, 0); - prt("Group", 4, 0); + prt(format("%s - objects", !visual_only ? "Knowledge" : "Visuals"), 2, 0); + if (direct_k_idx < 0) prt("Group", 4, 0); prt("Name", 4, max + 3); - if (p_ptr->wizard) prt("Idx", 4, 70); + if (p_ptr->wizard || visual_only) prt("Idx", 4, 70); prt("Sym", 4, 75); #endif @@ -7992,46 +8375,52 @@ static void do_cmd_knowledge_objects(void) Term_putch(i, 5, TERM_WHITE, '='); } - for (i = 0; i < browser_rows; i++) + if (direct_k_idx < 0) { - Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); + for (i = 0; i < browser_rows; i++) + { + Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); + } } redraw = FALSE; } - /* Scroll group list */ - if (grp_cur < grp_top) grp_top = grp_cur; - if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1; + if (direct_k_idx < 0) + { + /* Scroll group list */ + if (grp_cur < grp_top) grp_top = grp_cur; + if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1; - /* Display a list of object groups */ - display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top); + /* Display a list of object groups */ + display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top); - if (old_grp_cur != grp_cur) - { - old_grp_cur = grp_cur; + if (old_grp_cur != grp_cur) + { + old_grp_cur = grp_cur; - /* Get a list of objects in the current group */ - object_cnt = collect_objects(grp_idx[grp_cur], object_idx); - } + /* Get a list of objects in the current group */ + object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode); + } - /* Scroll object list */ - while (object_cur < object_top) - object_top = MAX(0, object_top - browser_rows/2); - while (object_cur >= object_top + browser_rows) - object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2); + /* Scroll object list */ + while (object_cur < object_top) + object_top = MAX(0, object_top - browser_rows/2); + while (object_cur >= object_top + browser_rows) + object_top = MIN(object_cnt - browser_rows, object_top + browser_rows/2); + } if (!visual_list) { /* Display a list of objects in the current group */ - display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top); + display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only); } else { object_top = object_cur; /* Display a list of objects in the current group */ - display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top); + display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only); /* Display visual list below first object */ display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left); @@ -8040,29 +8429,51 @@ static void do_cmd_knowledge_objects(void) /* Get the current object */ k_ptr = &k_info[object_idx[object_cur]]; - /* Mega Hack -- track this object */ - if (object_cnt) object_kind_track(object_idx[object_cur]); + if (!visual_only && k_ptr->flavor) + { + /* Appearance of this object is shuffled */ + flavor_k_ptr = &k_info[k_ptr->flavor]; + } + else + { + /* Appearance of this object is very normal */ + flavor_k_ptr = k_ptr; + } /* Prompt */ #ifdef JP - prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0); + prt(format("<Êý¸þ>%s%s%s, ESC", + (!visual_list && !visual_only) ? ", 'r'¤Ç¾ÜºÙ¤ò¸«¤ë" : "", + visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", + (attr_idx || char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), + hgt - 1, 0); #else - prt(format(", 'r' to recall%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0); + prt(format("%s%s%s, ESC", + (!visual_list && !visual_only) ? ", 'r' to recall" : "", + visual_list ? ", ENTER to accept" : ", 'v' for visuals", + (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), + hgt - 1, 0); #endif - /* The "current" object changed */ - if (object_old != object_idx[object_cur]) + if (!visual_only) { - /* Hack -- handle stuff */ - handle_stuff(); + /* Mega Hack -- track this object */ + if (object_cnt) object_kind_track(object_idx[object_cur]); + + /* The "current" object changed */ + if (object_old != object_idx[object_cur]) + { + /* Hack -- handle stuff */ + handle_stuff(); - /* Remember the "current" object */ - object_old = object_idx[object_cur]; + /* Remember the "current" object */ + object_old = object_idx[object_cur]; + } } if (visual_list) { - place_visual_list_cursor(max + 3, 7, k_ptr->x_attr, k_ptr->x_char, attr_top, char_left); + place_visual_list_cursor(max + 3, 7, flavor_k_ptr->x_attr, flavor_k_ptr->x_char, attr_top, char_left); } else if (!column) { @@ -8072,12 +8483,25 @@ static void do_cmd_knowledge_objects(void) { Term_gotoxy(max + 3, 6 + (object_cur - object_top)); } - + ch = inkey(); /* Do visual mode command if needed */ - /* Symbol of objects with flavor cannot be changed */ - if (!k_ptr->flavor && visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &k_ptr->x_attr, &k_ptr->x_char)) continue; + if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &flavor_k_ptr->x_attr, &flavor_k_ptr->x_char, need_redraw)) + { + if (direct_k_idx >= 0) + { + switch (ch) + { + case '\n': + case '\r': + case ESCAPE: + flag = TRUE; + break; + } + } + continue; + } switch (ch) { @@ -8091,10 +8515,11 @@ static void do_cmd_knowledge_objects(void) case 'r': { /* Recall on screen */ - if (grp_cnt > 0) + if (!visual_list && !visual_only && (grp_cnt > 0)) + { desc_obj_fake(object_idx[object_cur]); - - redraw = TRUE; + redraw = TRUE; + } break; } @@ -8112,20 +8537,23 @@ static void do_cmd_knowledge_objects(void) } - /* * Display the features in a group. */ static void display_feature_list(int col, int row, int per_page, int *feat_idx, - int feat_cur, int feat_top) + int feat_cur, int feat_top, bool visual_only, int lighting_level) { - int i; + int lit_col[F_LIT_MAX], i, j; + int f_idx_col = use_bigtile ? 62 : 64; + + /* Correct columns 1 and 4 */ + lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71; + for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++) + lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0); /* Display lines until done */ - for (i = 0; i < per_page && feat_idx[feat_top + i]; i++) + for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++) { - byte a, a2; - char c, c2; byte attr; /* Get the index */ @@ -8134,28 +8562,42 @@ static void display_feature_list(int col, int row, int per_page, int *feat_idx, /* Access the index */ feature_type *f_ptr = &f_info[f_idx]; + int row_i = row + i; + /* Choose a color */ attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE); /* Display the name */ - c_prt(attr, f_name + f_ptr->name, row + i, col); + c_prt(attr, f_name + f_ptr->name, row_i, col); /* Hack -- visual_list mode */ if (per_page == 1) { - c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60); - } + /* Display lighting level */ + c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name)); - a = f_ptr->x_attr; - c = f_ptr->x_char; - - if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2); + c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row_i, f_idx_col - ((p_ptr->wizard || visual_only) ? 6 : 2)); + } + if (p_ptr->wizard || visual_only) + { + c_prt(attr, format("%d", f_idx), row_i, f_idx_col); + } /* Display symbol */ - Term_putch(68, row + i, a, c); + Term_queue_bigchar(lit_col[F_LIT_STANDARD], row_i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0); + + Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '('); + for (j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++) + { + Term_putch(lit_col[j], row_i, TERM_SLATE, '/'); + } + Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')'); - /* Second byte */ - if (use_bigtile) Term_putch(68 + 1, row + i, a2, c2); + /* Mega-hack -- Use non-standard colour */ + for (j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++) + { + Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0); + } } /* Clear remaining lines */ @@ -8169,7 +8611,7 @@ static void display_feature_list(int col, int row, int per_page, int *feat_idx, /* * Interact with feature visuals. */ -static void do_cmd_knowledge_features(void) +static void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, int direct_f_idx, int *lighting_level) { int i, len, max; int grp_cur, grp_top, old_grp_cur; @@ -8177,7 +8619,7 @@ static void do_cmd_knowledge_features(void) int grp_cnt, grp_idx[100]; int feat_cnt; int *feat_idx; - + int column = 0; bool flag; bool redraw; @@ -8188,6 +8630,13 @@ static void do_cmd_knowledge_features(void) int browser_rows; int wid, hgt; + byte attr_old[F_LIT_MAX]; + byte char_old[F_LIT_MAX]; + byte *cur_attr_ptr, *cur_char_ptr; + + C_WIPE(attr_old, F_LIT_MAX, byte); + C_WIPE(char_old, F_LIT_MAX, byte); + /* Get size */ Term_get_size(&wid, &hgt); @@ -8199,20 +8648,44 @@ static void do_cmd_knowledge_features(void) max = 0; grp_cnt = 0; - /* Check every group */ - for (i = 0; feature_group_text[i] != NULL; i++) + if (direct_f_idx < 0) { - /* Measure the label */ - len = strlen(feature_group_text[i]); + /* Check every group */ + for (i = 0; feature_group_text[i] != NULL; i++) + { + /* Measure the label */ + len = strlen(feature_group_text[i]); - /* Save the maximum length */ - if (len > max) max = len; + /* Save the maximum length */ + if (len > max) max = len; + + /* See if any features are known */ + if (collect_features(i, feat_idx, 0x01)) + { + /* Build a list of groups with known features */ + grp_idx[grp_cnt++] = i; + } + } - /* See if any features are known */ - if (collect_features(i, feat_idx)) + feat_cnt = 0; + } + else + { + feature_type *f_ptr = &f_info[direct_f_idx]; + + feat_idx[0] = direct_f_idx; + feat_cnt = 1; + + /* Terminate the list */ + feat_idx[1] = -1; + + (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3), + &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw); + + for (i = 0; i < F_LIT_MAX; i++) { - /* Build a list of groups with known features */ - grp_idx[grp_cnt++] = i; + attr_old[i] = f_ptr->x_attr[i]; + char_old[i] = f_ptr->x_char[i]; } } @@ -8222,12 +8695,11 @@ static void do_cmd_knowledge_features(void) old_grp_cur = -1; grp_cur = grp_top = 0; feat_cur = feat_top = 0; - feat_cnt = 0; flag = FALSE; redraw = TRUE; - while ((!flag) && (grp_cnt)) + while (!flag) { char ch; feature_type *f_ptr; @@ -8235,57 +8707,88 @@ static void do_cmd_knowledge_features(void) if (redraw) { clear_from(0); - + +#ifdef JP + prt("ɽ¼¨ - ÃÏ·Á", 2, 0); + if (direct_f_idx < 0) prt("¥°¥ë¡¼¥×", 4, 0); + prt("̾Á°", 4, max + 3); + if (use_bigtile) + { + if (p_ptr->wizard || visual_only) prt("Idx", 4, 62); + prt("ʸ»ú ( l/ d)", 4, 66); + } + else + { + if (p_ptr->wizard || visual_only) prt("Idx", 4, 64); + prt("ʸ»ú (l/d)", 4, 68); + } +#else prt("Visuals - features", 2, 0); - prt("Group", 4, 0); + if (direct_f_idx < 0) prt("Group", 4, 0); prt("Name", 4, max + 3); - prt("Sym", 4, 67); + if (use_bigtile) + { + if (p_ptr->wizard || visual_only) prt("Idx", 4, 62); + prt("Sym ( l/ d)", 4, 67); + } + else + { + if (p_ptr->wizard || visual_only) prt("Idx", 4, 64); + prt("Sym (l/d)", 4, 69); + } +#endif for (i = 0; i < 78; i++) { Term_putch(i, 5, TERM_WHITE, '='); } - for (i = 0; i < browser_rows; i++) + if (direct_f_idx < 0) { - Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); + for (i = 0; i < browser_rows; i++) + { + Term_putch(max + 1, 6 + i, TERM_WHITE, '|'); + } } redraw = FALSE; } - /* Scroll group list */ - if (grp_cur < grp_top) grp_top = grp_cur; - if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1; + if (direct_f_idx < 0) + { + /* Scroll group list */ + if (grp_cur < grp_top) grp_top = grp_cur; + if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1; - /* Display a list of feature groups */ - display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top); + /* Display a list of feature groups */ + display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top); - if (old_grp_cur != grp_cur) - { - old_grp_cur = grp_cur; + if (old_grp_cur != grp_cur) + { + old_grp_cur = grp_cur; - /* Get a list of features in the current group */ - feat_cnt = collect_features(grp_idx[grp_cur], feat_idx); - } + /* Get a list of features in the current group */ + feat_cnt = collect_features(grp_idx[grp_cur], feat_idx, 0x00); + } - /* Scroll feature list */ - while (feat_cur < feat_top) - feat_top = MAX(0, feat_top - browser_rows/2); - while (feat_cur >= feat_top + browser_rows) - feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2); + /* Scroll feature list */ + while (feat_cur < feat_top) + feat_top = MAX(0, feat_top - browser_rows/2); + while (feat_cur >= feat_top + browser_rows) + feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows/2); + } if (!visual_list) { /* Display a list of features in the current group */ - display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top); + display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD); } else { feat_top = feat_cur; /* Display a list of features in the current group */ - display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top); + display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level); /* Display visual list below first object */ display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left); @@ -8293,17 +8796,25 @@ static void do_cmd_knowledge_features(void) /* Prompt */ #ifdef JP - prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0); + prt(format("<Êý¸þ>%s, 'd'¤Çɸ½à¸÷¸»¸ú²Ì%s, ESC", + visual_list ? ", ENTER¤Ç·èÄê, 'a'¤ÇÂоÝÌÀÅÙÊѹ¹" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", + (attr_idx || char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), + hgt - 1, 0); #else - prt(format("%s%s, ESC", visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0); + prt(format("%s, 'd' for default lighting%s, ESC", + visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals", + (attr_idx || char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), + hgt - 1, 0); #endif /* Get the current feature */ f_ptr = &f_info[feat_idx[feat_cur]]; + cur_attr_ptr = &f_ptr->x_attr[*lighting_level]; + cur_char_ptr = &f_ptr->x_char[*lighting_level]; if (visual_list) { - place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left); + place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left); } else if (!column) { @@ -8313,11 +8824,112 @@ static void do_cmd_knowledge_features(void) { Term_gotoxy(max + 3, 6 + (feat_cur - feat_top)); } - + ch = inkey(); + if (visual_list && ((ch == 'A') || (ch == 'a'))) + { + int prev_lighting_level = *lighting_level; + + if (ch == 'A') + { + if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1; + else (*lighting_level)--; + } + else + { + if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0; + else (*lighting_level)++; + } + + if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level]) + attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5); + + if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level]) + char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10); + + continue; + } + + else if ((ch == 'D') || (ch == 'd')) + { + byte prev_x_attr = f_ptr->x_attr[*lighting_level]; + byte prev_x_char = f_ptr->x_char[*lighting_level]; + + apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char); + + if (visual_list) + { + if (prev_x_attr != f_ptr->x_attr[*lighting_level]) + attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5); + + if (prev_x_char != f_ptr->x_char[*lighting_level]) + char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10); + } + else *need_redraw = TRUE; + + continue; + } + /* Do visual mode command if needed */ - if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &f_ptr->x_attr, &f_ptr->x_char)) continue; + else if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, cur_attr_ptr, cur_char_ptr, need_redraw)) + { + switch (ch) + { + /* Restore previous visual settings */ + case ESCAPE: + for (i = 0; i < F_LIT_MAX; i++) + { + f_ptr->x_attr[i] = attr_old[i]; + f_ptr->x_char[i] = char_old[i]; + } + + /* Fall through */ + + case '\n': + case '\r': + if (direct_f_idx >= 0) flag = TRUE; + else *lighting_level = F_LIT_STANDARD; + break; + + /* Preserve current visual settings */ + case 'V': + case 'v': + for (i = 0; i < F_LIT_MAX; i++) + { + attr_old[i] = f_ptr->x_attr[i]; + char_old[i] = f_ptr->x_char[i]; + } + *lighting_level = F_LIT_STANDARD; + break; + + case 'C': + case 'c': + if (!visual_list) + { + for (i = 0; i < F_LIT_MAX; i++) + { + attr_idx_feat[i] = f_ptr->x_attr[i]; + char_idx_feat[i] = f_ptr->x_char[i]; + } + } + break; + + case 'P': + case 'p': + if (!visual_list) + { + /* Allow TERM_DARK text */ + for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++) + { + if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i]; + if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i]; + } + } + break; + } + continue; + } switch (ch) { @@ -8336,9 +8948,6 @@ static void do_cmd_knowledge_features(void) } } - /* Prompt */ - if (!grp_cnt) msg_print("No features known."); - /* Free the "feat_idx" array */ C_KILL(feat_idx, max_f_idx, int); } @@ -8369,6 +8978,8 @@ static void do_cmd_knowledge_kubi(void) if (fff) { + bool listed = FALSE; + #ifdef JP fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ")); fprintf(fff, "\n"); @@ -8378,17 +8989,25 @@ static void do_cmd_knowledge_kubi(void) fprintf(fff, "\n"); fprintf(fff, "List of wanted monsters\n"); #endif + fprintf(fff, "----------------------------------------------\n"); + for (i = 0; i < MAX_KUBI; i++) { - fprintf(fff,"%-40s ---- ",r_name + r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])].name); - if (kubi_r_idx[i] > 10000) + if (kubi_r_idx[i] <= 10000) + { + fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name); + + listed = TRUE; + } + } + + if (!listed) + { #ifdef JP - fprintf(fff, "ºÑ\n"); + fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£"); #else - fprintf(fff, "done\n"); + fprintf(fff,"\n%s\n", "There is no more wanted monster."); #endif - else - fprintf(fff, "$%d\n", 300 * (r_info[kubi_r_idx[i]].level + 1)); } } @@ -8578,12 +9197,10 @@ static void do_cmd_knowledge_stat(void) /* - * Print quest status of all active quests + * Print all active quests */ -static void do_cmd_knowledge_quests(void) +static void do_cmd_knowledge_quests_current(FILE *fff) { - FILE *fff; - char file_name[1024]; char tmp_str[120]; char rand_tmp_str[120] = "\0"; char name[80]; @@ -8592,18 +9209,6 @@ static void do_cmd_knowledge_quests(void) int rand_level = 100; int total = 0; - /* Open a new file */ - fff = my_fopen_temp(file_name, 1024); - if (!fff) { -#ifdef JP - msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name); -#else - msg_format("Failed to create temporary file %s.", file_name); -#endif - msg_print(NULL); - return; - } - #ifdef JP fprintf(fff, "¡Ô¿ë¹ÔÃæ¤Î¥¯¥¨¥¹¥È¡Õ\n"); #else @@ -8612,21 +9217,16 @@ static void do_cmd_knowledge_quests(void) for (i = 1; i < max_quests; i++) { - if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_COMPLETED) + if ((quest[i].status == QUEST_STATUS_TAKEN) || (quest[i].status == QUEST_STATUS_COMPLETED)) { - int old_quest; + /* Set the quest number temporary */ + int old_quest = p_ptr->inside_quest; int j; /* Clear the text */ - for (j = 0; j < 10; j++) - { - quest_text[j][0] = '\0'; - } - + for (j = 0; j < 10; j++) quest_text[j][0] = '\0'; quest_text_line = 0; - /* Set the quest number temporary */ - old_quest = p_ptr->inside_quest; p_ptr->inside_quest = i; /* Get the quest text */ @@ -8648,17 +9248,21 @@ static void do_cmd_knowledge_quests(void) if (quest[i].status == QUEST_STATUS_TAKEN) { - if (quest[i].type == QUEST_TYPE_KILL_LEVEL || quest[i].type == QUEST_TYPE_KILL_ANY_LEVEL) + switch (quest[i].type) { + case QUEST_TYPE_KILL_LEVEL: + case QUEST_TYPE_KILL_ANY_LEVEL: r_ptr = &r_info[quest[i].r_idx]; strcpy(name, r_name + r_ptr->name); if (quest[i].max_num > 1) { #ifdef JP - sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",quest[i].max_num, name, quest[i].max_num-quest[i].cur_num); + sprintf(note," - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)", + quest[i].max_num, name, quest[i].max_num - quest[i].cur_num); #else plural_aux(name); - sprintf(note," - kill %d %s, have killed %d.",quest[i].max_num, name, quest[i].cur_num); + sprintf(note," - kill %d %s, have killed %d.", + quest[i].max_num, name, quest[i].cur_num); #endif } else @@ -8667,44 +9271,51 @@ static void do_cmd_knowledge_quests(void) #else sprintf(note," - kill %s.",name); #endif - } - else if (quest[i].type == QUEST_TYPE_KILL_NUMBER) - { -#ifdef JP - sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)",quest[i].max_num, quest[i].max_num-quest[i].cur_num); -#else - sprintf(note," - Kill %d monsters, have killed %d.",quest[i].max_num, quest[i].cur_num); -#endif - } - else if (quest[i].type == QUEST_TYPE_FIND_ARTIFACT) - { + break; + + case QUEST_TYPE_FIND_ARTIFACT: strcpy(name, a_name + a_info[quest[i].k_idx].name); #ifdef JP sprintf(note," - %s¤ò¸«¤Ä¤±½Ð¤¹¡£", name); #else sprintf(note," - Find out %s.", name); #endif - } - else if (quest[i].type == QUEST_TYPE_FIND_EXIT) + break; + + case QUEST_TYPE_FIND_EXIT: #ifdef JP sprintf(note," - õº÷¤¹¤ë¡£"); #else sprintf(note," - Search."); #endif - else if (quest[i].type == QUEST_TYPE_KILL_ALL) + break; + + case QUEST_TYPE_KILL_NUMBER: +#ifdef JP + sprintf(note," - %d ÂΤΥâ¥ó¥¹¥¿¡¼¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)", + quest[i].max_num, quest[i].max_num - quest[i].cur_num); +#else + sprintf(note," - Kill %d monsters, have killed %d.", + quest[i].max_num, quest[i].cur_num); +#endif + break; + + case QUEST_TYPE_KILL_ALL: #ifdef JP sprintf(note," - Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ¹¡£"); #else sprintf(note," - Kill all monsters."); #endif + break; + } } /* Print the quest info */ #ifdef JP - sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n", + sprintf(tmp_str, " %s (´í¸±ÅÙ:%d³¬ÁêÅö)%s\n", quest[i].name, quest[i].level, note); #else - sprintf(tmp_str, "%s (Danger level: %d)%s\n", + sprintf(tmp_str, " %s (Danger level: %d)%s\n", quest[i].name, quest[i].level, note); #endif @@ -8713,11 +9324,10 @@ static void do_cmd_knowledge_quests(void) if (quest[i].status == QUEST_STATUS_COMPLETED) { #ifdef JP - sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n"); + sprintf(tmp_str, " ¥¯¥¨¥¹¥ÈãÀ® - ¤Þ¤ÀÊó½·¤ò¼õ¤±¤È¤Ã¤Æ¤Ê¤¤¡£\n"); #else - sprintf(tmp_str, " Quest Completed - Unrewarded\n"); + sprintf(tmp_str, " Quest Completed - Unrewarded\n"); #endif - fprintf(fff, tmp_str); } else @@ -8726,13 +9336,12 @@ static void do_cmd_knowledge_quests(void) while (quest_text[j][0] && j < 10) { - fprintf(fff, " %s\n", quest_text[j]); + fprintf(fff, " %s\n", quest_text[j]); j++; } } } - else if ((quest[i].type == QUEST_TYPE_RANDOM) && - (quest[i].level < rand_level)) + else if (quest[i].level < rand_level) /* QUEST_TYPE_RANDOM */ { /* New random */ rand_level = quest[i].level; @@ -8746,13 +9355,13 @@ static void do_cmd_knowledge_quests(void) if (quest[i].max_num > 1) { #ifdef JP - sprintf(rand_tmp_str,"%s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n", + sprintf(rand_tmp_str," %s (%d ³¬) - %d ÂΤÎ%s¤òÅݤ¹¡£(¤¢¤È %d ÂÎ)\n", quest[i].name, quest[i].level, - quest[i].max_num, name, quest[i].max_num-quest[i].cur_num); + quest[i].max_num, name, quest[i].max_num - quest[i].cur_num); #else plural_aux(name); - sprintf(rand_tmp_str,"%s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n", + sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %d %s, have killed %d.\n", quest[i].name, quest[i].level, quest[i].max_num, name, quest[i].cur_num); #endif @@ -8760,10 +9369,10 @@ static void do_cmd_knowledge_quests(void) else { #ifdef JP - sprintf(rand_tmp_str,"%s (%d ³¬) - %s¤òÅݤ¹¡£\n", + sprintf(rand_tmp_str," %s (%d ³¬) - %s¤òÅݤ¹¡£\n", quest[i].name, quest[i].level, name); #else - sprintf(rand_tmp_str,"%s (Dungeon level: %d)\n Kill %s.\n", + sprintf(rand_tmp_str," %s (Dungeon level: %d)\n Kill %s.\n", quest[i].name, quest[i].level, name); #endif } @@ -8776,28 +9385,39 @@ static void do_cmd_knowledge_quests(void) if (rand_tmp_str[0]) fprintf(fff, rand_tmp_str); #ifdef JP - if (!total) fprintf(fff, "¤Ê¤·\n"); + if (!total) fprintf(fff, " ¤Ê¤·\n"); #else - if (!total) fprintf(fff, "Nothing.\n"); + if (!total) fprintf(fff, " Nothing.\n"); #endif +} + + +/* + * Print all finished quests + */ +void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[]) +{ + char tmp_str[120]; + int i; + int total = 0; #ifdef JP - fprintf(fff, "\n¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n"); + fprintf(fff, "¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n"); #else - fprintf(fff, "\n< Completed Quest >\n"); + fprintf(fff, "< Completed Quest >\n"); #endif - total = 0; for (i = 1; i < max_quests; i++) { - if (quest[i].status == QUEST_STATUS_FINISHED) + int q_idx = quest_num[i]; + + if (quest[q_idx].status == QUEST_STATUS_FINISHED) { - if (i < MIN_RANDOM_QUEST) + if (is_fixed_quest_idx(q_idx)) { - int old_quest; - /* Set the quest number temporary */ - old_quest = p_ptr->inside_quest; - p_ptr->inside_quest = i; + int old_quest = p_ptr->inside_quest; + + p_ptr->inside_quest = q_idx; /* Get the quest */ init_flags = INIT_ASSIGN; @@ -8808,48 +9428,48 @@ static void do_cmd_knowledge_quests(void) p_ptr->inside_quest = old_quest; /* No info from "silent" quests */ - if (quest[i].flags & QUEST_FLAG_SILENT) continue; + if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue; } total++; - if ((i >= MIN_RANDOM_QUEST) && quest[i].r_idx) + if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx) { /* Print the quest info */ - if (quest[i].complev == 0) + if (quest[q_idx].complev == 0) { - sprintf(tmp_str, + sprintf(tmp_str, #ifdef JP - "%s (%d³¬) - ÉÔÀᄀ\n", + " %-40s (%3d³¬) - ÉÔÀᄀ\n", #else - "%s (Dungeon level: %d) - (Cancelled)\n", + " %-40s (Dungeon level: %3d) - (Cancelled)\n", #endif - r_name+r_info[quest[i].r_idx].name, - quest[i].level); + r_name+r_info[quest[q_idx].r_idx].name, + quest[q_idx].level); } else { - sprintf(tmp_str, + sprintf(tmp_str, #ifdef JP - "%s (%d³¬) - ¥ì¥Ù¥ë%d\n", + " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n", #else - "%s (Dungeon level: %d) - level %d\n", + " %-40s (Dungeon level: %3d) - level %2d\n", #endif - r_name+r_info[quest[i].r_idx].name, - quest[i].level, - quest[i].complev); + r_name+r_info[quest[q_idx].r_idx].name, + quest[q_idx].level, + quest[q_idx].complev); } } else { /* Print the quest info */ #ifdef JP - sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n", - quest[i].name, quest[i].level, quest[i].complev); + sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n", + quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev); #else - sprintf(tmp_str, "%s (Danger level: %d) - level %d\n", - quest[i].name, quest[i].level, quest[i].complev); + sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n", + quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev); #endif } @@ -8857,28 +9477,39 @@ static void do_cmd_knowledge_quests(void) } } #ifdef JP - if (!total) fprintf(fff, "¤Ê¤·\n"); + if (!total) fprintf(fff, " ¤Ê¤·\n"); #else - if (!total) fprintf(fff, "Nothing.\n"); + if (!total) fprintf(fff, " Nothing.\n"); #endif +} + + +/* + * Print all failed quests + */ +void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[]) +{ + char tmp_str[120]; + int i; + int total = 0; #ifdef JP - fprintf(fff, "\n¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n"); + fprintf(fff, "¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n"); #else - fprintf(fff, "\n< Failed Quest >\n"); + fprintf(fff, "< Failed Quest >\n"); #endif - total = 0; for (i = 1; i < max_quests; i++) { - if ((quest[i].status == QUEST_STATUS_FAILED_DONE) || (quest[i].status == QUEST_STATUS_FAILED)) + int q_idx = quest_num[i]; + + if ((quest[q_idx].status == QUEST_STATUS_FAILED_DONE) || (quest[q_idx].status == QUEST_STATUS_FAILED)) { - if (i < MIN_RANDOM_QUEST) + if (is_fixed_quest_idx(q_idx)) { - int old_quest; - /* Set the quest number temporary */ - old_quest = p_ptr->inside_quest; - p_ptr->inside_quest = i; + int old_quest = p_ptr->inside_quest; + + p_ptr->inside_quest = q_idx; /* Get the quest text */ init_flags = INIT_ASSIGN; @@ -8889,49 +9520,58 @@ static void do_cmd_knowledge_quests(void) p_ptr->inside_quest = old_quest; /* No info from "silent" quests */ - if (quest[i].flags & QUEST_FLAG_SILENT) continue; + if (quest[q_idx].flags & QUEST_FLAG_SILENT) continue; } total++; - if ((i >= MIN_RANDOM_QUEST) && quest[i].r_idx) + if (!is_fixed_quest_idx(q_idx) && quest[q_idx].r_idx) { /* Print the quest info */ #ifdef JP - sprintf(tmp_str, "%s (%d³¬) - ¥ì¥Ù¥ë%d\n", - r_name+r_info[quest[i].r_idx].name, quest[i].level, quest[i].complev); + sprintf(tmp_str, " %-40s (%3d³¬) - ¥ì¥Ù¥ë%2d\n", + r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev); #else - sprintf(tmp_str, "%s (Dungeon level: %d) - level %d\n", - r_name+r_info[quest[i].r_idx].name, quest[i].level, quest[i].complev); + sprintf(tmp_str, " %-40s (Dungeon level: %3d) - level %2d\n", + r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev); #endif } else { /* Print the quest info */ #ifdef JP - sprintf(tmp_str, "%s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n", - quest[i].name, quest[i].level, quest[i].complev); + sprintf(tmp_str, " %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n", + quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev); #else - sprintf(tmp_str, "%s (Danger level: %d) - level %d\n", - quest[i].name, quest[i].level, quest[i].complev); + sprintf(tmp_str, " %-40s (Danger level: %3d) - level %2d\n", + quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev); #endif } fprintf(fff, tmp_str); } } #ifdef JP - if (!total) fprintf(fff, "¤Ê¤·\n"); + if (!total) fprintf(fff, " ¤Ê¤·\n"); #else - if (!total) fprintf(fff, "Nothing.\n"); + if (!total) fprintf(fff, " Nothing.\n"); #endif +} + + +/* + * Print all random quests + */ +static void do_cmd_knowledge_quests_wiz_random(FILE *fff) +{ + char tmp_str[120]; + int i; + int total = 0; - if (p_ptr->wizard) { #ifdef JP - fprintf(fff, "\n¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n"); + fprintf(fff, "¡Ô»Ä¤ê¤Î¥é¥ó¥À¥à¥¯¥¨¥¹¥È¡Õ\n"); #else - fprintf(fff, "\n< Remaining Random Quest >\n"); + fprintf(fff, "< Remaining Random Quest >\n"); #endif - total = 0; for (i = 1; i < max_quests; i++) { /* No info from "silent" quests */ @@ -8943,21 +9583,94 @@ static void do_cmd_knowledge_quests(void) /* Print the quest info */ #ifdef JP - sprintf(tmp_str, "%s (%d³¬, %s)\n", + sprintf(tmp_str, " %s (%d³¬, %s)\n", quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name); #else - sprintf(tmp_str, "%s (%d, %s)\n", + sprintf(tmp_str, " %s (%d, %s)\n", quest[i].name, quest[i].level, r_name+r_info[quest[i].r_idx].name); #endif fprintf(fff, tmp_str); } } #ifdef JP - if (!total) fprintf(fff, "¤Ê¤·\n"); + if (!total) fprintf(fff, " ¤Ê¤·\n"); +#else + if (!total) fprintf(fff, " Nothing.\n"); +#endif +} + + +bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b) +{ + int *q_num = (int *)u; + quest_type *qa = &quest[q_num[a]]; + quest_type *qb = &quest[q_num[b]]; + + /* Unused */ + (void)v; + + if (qa->complev < qb->complev) return TRUE; + if (qa->complev > qb->complev) return FALSE; + if (qa->level <= qb->level) return TRUE; + return FALSE; +} + +void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b) +{ + int *q_num = (int *)u; + int tmp; + + /* Unused */ + (void)v; + + tmp = q_num[a]; + q_num[a] = q_num[b]; + q_num[b] = tmp; +} + + +/* + * Print quest status of all active quests + */ +static void do_cmd_knowledge_quests(void) +{ + FILE *fff; + char file_name[1024]; + int *quest_num, dummy, i; + + /* Open a new file */ + fff = my_fopen_temp(file_name, 1024); + if (!fff) + { +#ifdef JP + msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name); #else - if (!total) fprintf(fff, "Nothing.\n"); + msg_format("Failed to create temporary file %s.", file_name); #endif - } + msg_print(NULL); + return; + } + + /* Allocate Memory */ + C_MAKE(quest_num, max_quests, int); + + /* Sort by compete level */ + for (i = 1; i < max_quests; i++) quest_num[i] = i; + ang_sort_comp = ang_sort_comp_quest_num; + ang_sort_swap = ang_sort_swap_quest_num; + ang_sort(quest_num, &dummy, max_quests); + + /* Dump Quest Information */ + do_cmd_knowledge_quests_current(fff); + fputc('\n', fff); + do_cmd_knowledge_quests_completed(fff, quest_num); + fputc('\n', fff); + do_cmd_knowledge_quests_failed(fff, quest_num); + if (p_ptr->wizard) + { + fputc('\n', fff); + do_cmd_knowledge_quests_wiz_random(fff); + } /* Close the file */ my_fclose(fff); @@ -8969,11 +9682,12 @@ static void do_cmd_knowledge_quests(void) show_file(TRUE, file_name, "Quest status", 0, 0); #endif - /* Remove the file */ fd_kill(file_name); -} + /* Free Memory */ + C_KILL(quest_num, max_quests, int); +} /* @@ -8982,8 +9696,8 @@ static void do_cmd_knowledge_quests(void) static void do_cmd_knowledge_home(void) { FILE *fff; - - int i, x; + + int i; char file_name[1024]; store_type *st_ptr; char o_name[MAX_NLEN]; @@ -8995,14 +9709,14 @@ static void do_cmd_knowledge_home(void) fff = my_fopen_temp(file_name, 1024); if (!fff) { #ifdef JP - msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name); + msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name); #else - msg_format("Failed to create temporary file %s.", file_name); + msg_format("Failed to create temporary file %s.", file_name); #endif - msg_print(NULL); - return; + msg_print(NULL); + return; } - + if (fff) { /* Print all homes in the different towns */ @@ -9011,20 +9725,22 @@ static void do_cmd_knowledge_home(void) /* Home -- if anything there */ if (st_ptr->stock_num) { +#ifdef JP + int x = 1; +#endif /* Header with name of the town */ #ifdef JP fprintf(fff, " [ ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ]\n"); #else fprintf(fff, " [Home Inventory]\n"); #endif - x = 1; /* Dump all available items */ for (i = 0; i < st_ptr->stock_num; i++) { #ifdef JP if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++); - object_desc(o_name, &st_ptr->stock[i], TRUE, 3); + object_desc(o_name, &st_ptr->stock[i], 0); if (strlen(o_name) <= 80-3) { fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name); @@ -9041,7 +9757,7 @@ static void do_cmd_knowledge_home(void) fprintf(fff, " %.77s\n", o_name+n); } #else - object_desc(o_name, &st_ptr->stock[i], TRUE, 3); + object_desc(o_name, &st_ptr->stock[i], 0); fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name); #endif @@ -9051,10 +9767,10 @@ static void do_cmd_knowledge_home(void) fprintf(fff, "\n\n"); } } - + /* Close the file */ my_fclose(fff); - + /* Display the file contents */ #ifdef JP show_file(TRUE, file_name, "²æ¤¬²È¤Î¥¢¥¤¥Æ¥à", 0, 0); @@ -9062,7 +9778,7 @@ static void do_cmd_knowledge_home(void) show_file(TRUE, file_name, "Home Inventory", 0, 0); #endif - + /* Remove the file */ fd_kill(file_name); } @@ -9174,16 +9890,21 @@ static void do_cmd_knowledge_autopick(void) */ void do_cmd_knowledge(void) { - int i,p=0; + int i, p = 0; + bool need_redraw = FALSE; + /* File type is "TEXT" */ FILE_TYPE(FILE_TYPE_TEXT); + /* Save the screen */ screen_save(); + /* Interact until done */ while (1) { /* Clear screen */ Term_clear(); + /* Ask for a choice */ #ifdef JP prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65); @@ -9195,18 +9916,21 @@ void do_cmd_knowledge(void) /* Give some choices */ #ifdef JP - if (p == 0) { + if (p == 0) + { prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 6, 5); prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à ¤Î°ìÍ÷", 7, 5); prt("(3) ´ûÃΤÎÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5); prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 9, 5); prt("(5) Åݤ·¤¿Å¨¤Î¿ô ¤Î°ìÍ÷", 10, 5); - prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5); + if (!vanilla_town) prt("(6) ¾Þ¶â¼ó ¤Î°ìÍ÷", 11, 5); prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È ¤Î°ìÍ÷", 12, 5); prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à ¤Î°ìÍ÷", 13, 5); prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ­ ¤Î°ìÍ÷", 14, 5); prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë ¤Î°ìÍ÷", 15, 5); - } else { + } + else + { prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó ¤Î°ìÍ÷", 6, 5); prt("(b) ÆÍÁ³ÊÑ°Û ¤Î°ìÍ÷", 7, 5); prt("(c) Éð´ï¤Î·Ð¸³ÃÍ ¤Î°ìÍ÷", 8, 5); @@ -9218,18 +9942,21 @@ void do_cmd_knowledge(void) prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê ¤Î°ìÍ÷", 14, 5); } #else - if (p == 0) { + if (p == 0) + { prt("(1) Display known artifacts", 6, 5); prt("(2) Display known objects", 7, 5); prt("(3) Display remaining uniques", 8, 5); prt("(4) Display known monster", 9, 5); prt("(5) Display kill count", 10, 5); - prt("(6) Display wanted monsters", 11, 5); + if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5); prt("(7) Display current pets", 12, 5); prt("(8) Display home inventory", 13, 5); prt("(9) Display *identified* equip.", 14, 5); prt("(0) Display terrain symbols.", 15, 5); - } else { + } + else + { prt("(a) Display about yourself", 6, 5); prt("(b) Display mutations", 7, 5); prt("(c) Display weapon proficiency", 8, 5); @@ -9258,6 +9985,7 @@ void do_cmd_knowledge(void) /* Prompt */ i = inkey(); + /* Done */ if (i == ESCAPE) break; switch (i) @@ -9270,19 +9998,19 @@ void do_cmd_knowledge(void) do_cmd_knowledge_artifacts(); break; case '2': /* Objects */ - do_cmd_knowledge_objects(); + do_cmd_knowledge_objects(&need_redraw, FALSE, -1); break; case '3': /* Uniques */ do_cmd_knowledge_uniques(); break; case '4': /* Monsters */ - do_cmd_knowledge_monsters(); + do_cmd_knowledge_monsters(&need_redraw, FALSE, -1); break; case '5': /* Kill count */ do_cmd_knowledge_kill_count(); break; case '6': /* wanted */ - do_cmd_knowledge_kubi(); + if (!vanilla_town) do_cmd_knowledge_kubi(); break; case '7': /* Pets */ do_cmd_knowledge_pets(); @@ -9294,7 +10022,10 @@ void do_cmd_knowledge(void) do_cmd_knowledge_inven(); break; case '0': /* Feature list */ - do_cmd_knowledge_features(); + { + int lighting_level = F_LIT_STANDARD; + do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level); + } break; /* Next page */ case 'a': /* Max stat */ @@ -9327,11 +10058,15 @@ void do_cmd_knowledge(void) default: /* Unknown option */ bell(); } + /* Flush messages */ msg_print(NULL); } + /* Restore the screen */ screen_load(); + + if (need_redraw) do_cmd_redraw(); } @@ -9363,6 +10098,7 @@ void do_cmd_time(void) char desc[1024]; char buf[1024]; + char day_buf[10]; FILE *fff; @@ -9382,14 +10118,17 @@ void do_cmd_time(void) #endif + if (day < MAX_DAYS) sprintf(day_buf, "%d", day); + else strcpy(day_buf, "*****"); + /* Message */ #ifdef JP - msg_format("%d ÆüÌÜ,»þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£", - day, (hour % 12 == 0) ? 12 : (hour % 12), + msg_format("%sÆüÌÜ, »þ¹ï¤Ï%d:%02d %s¤Ç¤¹¡£", + day_buf, (hour % 12 == 0) ? 12 : (hour % 12), min, (hour < 12) ? "AM" : "PM"); #else - msg_format("This is day %d. The time is %d:%02d %s.", - day, (hour % 12 == 0) ? 12 : (hour % 12), + msg_format("This is day %s. The time is %d:%02d %s.", + day_buf, (hour % 12 == 0) ? 12 : (hour % 12), min, (hour < 12) ? "AM" : "PM"); #endif