/* * Peruse the spells/prayers in a Book * * Note that *all* spells in the book are listed */ void show_browse(int book) { /* Save the screen */ Term_save(); /* Display the spells */ print_spells(book); /* Clear the top line */ prt("", 0, 0); /* Prompt user */ put_str("[Press any key to continue]", 0, 23); /* Wait for key */ (void)inkey(); /* Restore the screen */ Term_load(); /* The screen is OK now */ section_icky_row = 0; section_icky_col = 0; /* Flush any events */ Flush_queue(); }
/** * Save the screen, and increase the "icky" depth. */ void screen_save(void) { player->upkeep->redraw |= PR_MAP; redraw_stuff(player); event_signal(EVENT_MESSAGE_FLUSH); Term_save(); screen_save_depth++; }
/* * Save the screen, and increase the "icky" depth. * * This function must match exactly one call to "screen_load()". */ void screen_save(void) { /* Hack -- Flush messages */ message_flush(); /* Save the screen (if legal) */ Term_save(); /* Increase "icky" depth */ character_icky++; }
static power_type* select_power(s32b *x_idx) { s32b which; s32b max = 0, i, start = 0; power_type* ret; bool mode = easy_inven; s32b *p; C_MAKE(p, power_max, s32b); /* Count the max */ for (i = 0; i < power_max; i++) { if (flag_get(&p_ptr->powers, i)) { p[max++] = i; } } /* Exit if there aren't powers */ if (max == 0) { *x_idx = -1; ret = NULL; msg_print("You don't have any special powers."); } else { character_icky++; Term_save(); while (1) { print_power_batch(p, start, max, mode); which = inkey(); if (which == ESCAPE) { *x_idx = -1; ret = NULL; break; } else if (which == '*' || which == '?' || which == ' ') { mode = (mode) ? FALSE : TRUE; Term_load(); character_icky--; } else if (which == '+') { start += 20; if (start >= max) start -= 20; Term_load(); character_icky--; } else if (which == '-') { start -= 20; if (start < 0) start += 20; Term_load(); character_icky--; } else { which = tolower(which); if (start + A2I(which) >= max) { bell(); continue; } if (start + A2I(which) < 0) { bell(); continue; } *x_idx = p[start + A2I(which)]; ret = &powers_type[p[start + A2I(which)]]; break; } } Term_load(); character_icky--; } C_FREE(p, power_max, s32b); return ret; }
/* * Show previous messages to the user -BEN- * * The screen format uses line 0 and 23 for headers and prompts, * skips line 1 and 22, and uses line 2 thru 21 for old messages. * * This command shows you which commands you are viewing, and allows * you to "search" for strings in the recall. * * Note that messages may be longer than 80 characters, but they are * displayed using "infinite" length, with a special sub-command to * "slide" the virtual display to the left or right. * * Attempt to only hilite the matching portions of the string. */ void do_cmd_messages(void) { int i, j, k, n, q; char shower[80] = ""; char finder[80] = ""; /* Total messages */ n = message_num(); /* Start on first message */ i = 0; /* Start at leftmost edge */ q = 0; /* Enter "icky" mode */ screen_icky = topline_icky = TRUE; /* Save the screen */ Term_save(); /* Process requests until done */ while (1) { /* Clear screen */ Term_clear(); /* Dump up to 20 lines of messages */ for (j = 0; (j < 20) && (i + j < n); j++) { byte a = TERM_WHITE; cptr str = message_str(i+j); /* Determine color */ message_color(str, &a); /* Apply horizontal scroll */ str = (strlen(str) >= q) ? (str + q) : ""; /* Handle "shower" */ if (shower[0] && strstr(str, shower)) a = TERM_YELLOW; /* Dump the messages, bottom to top */ Term_putstr(0, 21-j, -1, a, str); } /* Display header XXX XXX XXX */ prt(format("Message Recall (%d-%d of %d), Offset %d", i, i+j-1, n, q), 0, 0); /* Display prompt (not very informative) */ prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", 23, 0); /* Get a command */ k = inkey(); /* Exit on Escape */ if (k == 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') { /* Scroll right */ q = q + 40; /* Success */ continue; } /* Hack -- handle show */ if (k == '=') { /* Prompt */ prt("Show: ", 23, 0); /* Get a "shower" string, or continue */ if (!askfor_aux(shower, 80, 0)) continue; /* Okay */ continue; } /* Hack -- handle find */ if (k == '/') { int z; /* Prompt */ prt("Find: ", 23, 0); /* Get a "finder" string, or continue */ if (!askfor_aux(finder, 80, 0)) continue; /* Scan messages */ for (z = i + 1; z < n; z++) { cptr str = message_str(z); /* Handle "shower" */ if (strstr(str, finder)) { /* New location */ i = z; /* Done */ break; } } } /* Recall 1 older message */ if ((k == '8') || (k == '\n') || (k == '\r')) { /* Go newer if legal */ if (i + 1 < n) i += 1; } /* Recall 10 older messages */ if (k == '+') { /* Go older if legal */ if (i + 10 < n) i += 10; } /* Recall 20 older messages */ if ((k == 'p') || (k == KTRL('P')) || (k == ' ')) { /* Go older if legal */ if (i + 20 < n) i += 20; } /* Recall 20 newer messages */ if ((k == 'n') || (k == KTRL('N'))) { /* Go newer (if able) */ i = (i >= 20) ? (i - 20) : 0; } /* Recall 10 newer messages */ if (k == '-') { /* Go newer (if able) */ i = (i >= 10) ? (i - 10) : 0; } /* Recall 1 newer messages */ if (k == '2') { /* Go newer (if able) */ i = (i >= 1) ? (i - 1) : 0; } /* Hack -- Error of some kind */ if (i == j) bell(); } /* Restore the screen */ Term_load(); /* Leave "icky" mode */ screen_icky = topline_icky = FALSE; /* Flush any queued events */ Flush_queue(); }
int do_cmd_activate_skill_aux() { char which; int max = 0, i, start = 0; int ret; bool mode = FALSE; int *p; cptr *p_desc; C_MAKE(p, max_s_idx + max_ab_idx, int); C_MAKE(p_desc, max_s_idx + max_ab_idx, cptr); /* Count the max */ /* More than 1 melee skill ? */ if (get_melee_skills() > 1) { p_desc[max] = "Change melee mode"; p[max++] = 0; } for (i = 1; i < max_s_idx; i++) { if (s_info[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN))) { int j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (s_info[i].action_mkey == p[j]) { next = TRUE; break; } } if (next) continue; p_desc[max] = s_text + s_info[i].action_desc; p[max++] = s_info[i].action_mkey; } } for (i = 0; i < max_ab_idx; i++) { if (ab_info[i].action_mkey && ab_info[i].acquired) { int j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (ab_info[i].action_mkey == p[j]) { next = TRUE; break; } } if (next) continue; p_desc[max] = ab_text + ab_info[i].action_desc; p[max++] = ab_info[i].action_mkey; } } if (!max) { msg_print("You don't have any activable skills or abilities."); return -1; } character_icky = TRUE; Term_save(); while (1) { print_skill_batch(p, p_desc, start, max, mode); which = inkey(); if (which == ESCAPE) { ret = -1; break; } else if (which == '*' || which == '?' || which == ' ') { mode = (mode) ? FALSE : TRUE; Term_load(); character_icky = FALSE; } else if (which == '+') { start += 20; if (start >= max) start -= 20; Term_load(); character_icky = FALSE; } else if (which == '-') { start -= 20; if (start < 0) start += 20; Term_load(); character_icky = FALSE; } else if (which == '@') { char buf[80]; strcpy(buf, "Cast a spell"); if (!get_string("Skill action? ", buf, 79)) return FALSE; /* Find the skill it is related to */ for (i = 0; i < max; i++) { if (!strcmp(buf, p_desc[i])) break; } if ((i < max)) { ret = p[i]; break; } } else { which = tolower(which); if (start + A2I(which) >= max) { bell(); continue; } if (start + A2I(which) < 0) { bell(); continue; } ret = p[start + A2I(which)]; break; } } Term_load(); character_icky = FALSE; C_FREE(p, max_s_idx + max_ab_idx, int); C_FREE(p_desc, max_s_idx + max_ab_idx, cptr); return ret; }
static void choose_melee() { int i, j, z = 0; character_icky = TRUE; Term_save(); Term_clear(); j = get_melee_skills(); prt("Choose a melee style:", 0, 0); for (i = 0; i < MAX_MELEE; i++) { if (melee_bool[i]) { prt(format("%c) %s", I2A(z), melee_names[i]), z + 1, 0); melee_num[z] = i; z++; } } while (TRUE) { char c = inkey(); if (c == ESCAPE) break; if (A2I(c) < 0) continue; if (A2I(c) >= j) continue; for (i = 0, z = 0; z < A2I(c); i++) if (melee_bool[i]) z++; for (i = INVEN_WIELD; p_ptr->body_parts[i - INVEN_WIELD] == INVEN_WIELD; i++) { if (p_ptr->inventory[i].k_idx) { if (cursed_p(&p_ptr->inventory[i])) { char name[80]; object_desc(name, &p_ptr->inventory[i], 0, 0); msg_format("Hmmm, your %s seems to be cursed.", name); break; } else { inven_takeoff(i, 255, FALSE); } } } p_ptr->melee_style = melee_skills[melee_num[z]]; energy_use = 100; break; } /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate hitpoint */ p_ptr->update |= (PU_HP); /* Redraw monster hitpoint */ p_ptr->redraw |= (PR_MH); Term_load(); character_icky = FALSE; }
s32b do_cmd_activate_skill_aux(s32b type) { s32b which; s32b max = 0, i, start = 0; s32b ret = 0, x_idx; bool mode = easy_inven; s32b *p; cptr *p_desc; C_MAKE(p, max_s_idx + max_ab_idx, s32b); C_MAKE(p_desc, max_s_idx + max_ab_idx, cptr); /* Count the max */ /* More than 1 combat skill ? */ if (get_combat_num() > 1) { p_desc[max] = "Change combat mode"; p[max++] = 0; } for (i = 1; i < max_s_idx; i++) { x_idx = s_info[i].action_mkey[type]; if (x_idx && get_skill(i) && (!s_info[i].hidden)) { s32b j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (x_idx == p[j]) { next = TRUE; break; } } if (next) continue; if(process_hooks(HOOK_MKEY_HIDE, "(d,d)", x_idx, type)) continue; p_desc[max] = s_info[i].action_desc[type]; p[max++] = x_idx; } } for (i = 0; i < max_ab_idx; i++) { x_idx = ab_info[i].action_mkey[type]; if (x_idx && ab_info[i].acquired) { s32b j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (x_idx == p[j]) { next = TRUE; break; } } if (next) continue; if(process_hooks(HOOK_MKEY_HIDE, "(d,d)", x_idx, type)) continue; p_desc[max] = ab_info[i].action_desc[type]; p[max++] = x_idx; } } if (!max) { msg_print("You don't have any activable skills or abilities."); return -1; } character_icky++; Term_save(); while (1) { print_skill_batch(p, p_desc, start, max, mode); which = inkey(); if (which == ESCAPE) { ret = -1; break; } else if (which == '*' || which == '?' || which == ' ') { mode = (mode) ? FALSE : TRUE; Term_load(); Term_save(); } else if (which == '+') { start += 20; if (start >= max) start -= 20; Term_load(); Term_save(); } else if (which == '-') { start -= 20; if (start < 0) start += 20; Term_load(); Term_save(); } else if (which == '@') { char buf[80]; strcpy(buf, "Cast a spell"); if (!get_string("Skill action? ", buf, 79)) break; /* Find the skill it is related to */ for (i = 0; i < max; i++) { if (!strcmp(buf, p_desc[i])) break; } if ((i < max)) { ret = p[i]; break; } } else { which = tolower(which); if (start + A2I(which) >= max) { bell(); continue; } if (start + A2I(which) < 0) { bell(); continue; } ret = p[start + A2I(which)]; break; } } Term_load(); character_icky--; C_FREE(p, max_s_idx + max_ab_idx, s32b); C_FREE(p_desc, max_s_idx + max_ab_idx, cptr); return ret; }
/* * Interact with "macros" * * Note that the macro "action" must be defined before the trigger. * * Could use some helpful instructions on this page. XXX XXX XXX */ void do_cmd_macros(void) { s32b i; char tmp[1024]; char buf[1024]; s32b mode; /* Roguelike */ if (rogue_like_commands) { mode = KEYMAP_MODE_ROGUE; } /* Original */ else { mode = KEYMAP_MODE_ORIG; } /* Enter "icky" mode */ character_icky++; /* Save screen */ Term_save(); /* Process requests until done */ while (1) { /* Clear screen */ Term_clear(); /* Describe */ prt("Interact with Macros", 2, 0); /* Describe that action */ prt("Current action (if any) shown below:", 20, 0); /* Analyze the current action */ ascii_to_text(buf, macro__buf); /* Display the current action */ prt(buf, 22, 0); /* Selections */ prt("(1) Load a user pref file", 4, 5); #ifdef ALLOW_MACROS prt("(2) Append macros to a file", 5, 5); prt("(3) Query a macro", 6, 5); prt("(4) Create a macro", 7, 5); prt("(5) Remove a macro", 8, 5); prt("(6) Append keymaps to a file", 9, 5); prt("(7) Query a keymap", 10, 5); prt("(8) Create a keymap", 11, 5); prt("(9) Remove a keymap", 12, 5); prt("(0) Enter a new action", 13, 5); #endif /* ALLOW_MACROS */ /* Prompt */ prt("Command: ", 16, 0); /* Get a command */ i = inkey(); /* Leave */ if (i == ESCAPE) break; /* Load a 'macro' file */ else if (i == '1') { /* Prompt */ prt("Command: Load a user pref file", 16, 0); /* Prompt */ prt("File: ", 18, 0); /* Default filename */ strnfmt(tmp, 1024, "%s.prf", player_name); /* Ask for a file */ if (!askfor_aux(tmp, 80)) continue; /* Process the given filename */ if (0 != process_pref_file(tmp)) { /* Prompt */ msg_print("Could not load file!"); } } #ifdef ALLOW_MACROS /* Save macros */ else if (i == '2') { /* Prompt */ prt("Command: Append macros to a file", 16, 0); /* Prompt */ prt("File: ", 18, 0); /* Default filename */ strnfmt(tmp, 1024, "%s.prf", player_name); /* Ask for a file */ if (!askfor_aux(tmp, 80)) continue; /* Dump the macros */ (void)macro_dump(tmp); /* Prompt */ msg_print("Appended macros."); } /* Query a macro */ else if (i == '3') { s32b k; /* Prompt */ prt("Command: Query a macro", 16, 0); /* Prompt */ prt("Trigger: ", 18, 0); /* Get a macro trigger */ do_cmd_macro_aux(buf, TRUE); /* Acquire action */ k = macro_find_exact(buf); /* Nothing found */ if (k < 0) { /* Prompt */ msg_print("Found no macro."); } /* Found one */ else { /* Obtain the action */ strcpy(macro__buf, macro__act[k]); /* Analyze the current action */ ascii_to_text(buf, macro__buf); /* Display the current action */ prt(buf, 22, 0); /* Prompt */ msg_print("Found a macro."); } } /* Create a macro */ else if (i == '4') { /* Prompt */ prt("Command: Create a macro", 16, 0); /* Prompt */ prt("Trigger: ", 18, 0); /* Get a macro trigger */ do_cmd_macro_aux(buf, TRUE); /* Clear */ clear_from(20); /* Prompt */ prt("Action: ", 20, 0); /* Convert to text */ ascii_to_text(tmp, macro__buf); /* Get an encoded action */ if (askfor_aux(tmp, 80)) { /* Convert to ascii */ text_to_ascii(macro__buf, tmp); /* Link the macro */ macro_add(buf, macro__buf); /* Prompt */ msg_print("Added a macro."); } } /* Remove a macro */ else if (i == '5') { /* Prompt */ prt("Command: Remove a macro", 16, 0); /* Prompt */ prt("Trigger: ", 18, 0); /* Get a macro trigger */ do_cmd_macro_aux(buf, TRUE); /* Link the macro */ macro_add(buf, buf); /* Prompt */ msg_print("Removed a macro."); } /* Save keymaps */ else if (i == '6') { /* Prompt */ prt("Command: Append keymaps to a file", 16, 0); /* Prompt */ prt("File: ", 18, 0); /* Default filename */ strnfmt(tmp, 1024, "%s.prf", player_name); /* Ask for a file */ if (!askfor_aux(tmp, 80)) continue; /* Dump the macros */ (void)keymap_dump(tmp); /* Prompt */ msg_print("Appended keymaps."); } /* Query a keymap */ else if (i == '7') { cptr act; /* Prompt */ prt("Command: Query a keymap", 16, 0); /* Prompt */ prt("Keypress: ", 18, 0); /* Get a keymap trigger */ do_cmd_macro_aux_keymap(buf); /* Look up the keymap */ act = keymap_act[mode][(byte)(buf[0])]; /* Nothing found */ if (!act) { /* Prompt */ msg_print("Found no keymap."); } /* Found one */ else { /* Obtain the action */ strcpy(macro__buf, act); /* Analyze the current action */ ascii_to_text(buf, macro__buf); /* Display the current action */ prt(buf, 22, 0); /* Prompt */ msg_print("Found a keymap."); } } /* Create a keymap */ else if (i == '8') { /* Prompt */ prt("Command: Create a keymap", 16, 0); /* Prompt */ prt("Keypress: ", 18, 0); /* Get a keymap trigger */ do_cmd_macro_aux_keymap(buf); /* Clear */ clear_from(20); /* Prompt */ prt("Action: ", 20, 0); /* Convert to text */ ascii_to_text(tmp, macro__buf); /* Get an encoded action */ if (askfor_aux(tmp, 80)) { /* Convert to ascii */ text_to_ascii(macro__buf, tmp); /* Free old keymap */ string_free(keymap_act[mode][(byte)(buf[0])]); /* Make new keymap */ keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf); /* Prompt */ msg_print("Added a keymap."); } } /* Remove a keymap */ else if (i == '9') { /* Prompt */ prt("Command: Remove a keymap", 16, 0); /* Prompt */ prt("Keypress: ", 18, 0); /* Get a keymap trigger */ do_cmd_macro_aux_keymap(buf); /* Free old keymap */ string_free(keymap_act[mode][(byte)(buf[0])]); /* Make new keymap */ keymap_act[mode][(byte)(buf[0])] = NULL; /* Prompt */ msg_print("Removed a keymap."); } /* Enter a new action */ else if (i == '0') { /* Prompt */ prt("Command: Enter a new action", 16, 0); /* Go to the correct location */ Term_gotoxy(0, 22); /* Hack -- limit the value */ tmp[80] = '\0'; /* Get an encoded action */ if (!askfor_aux(buf, 80)) continue; /* Extract an action */ text_to_ascii(macro__buf, buf); } #endif /* ALLOW_MACROS */ /* Oops */ else { /* Oops */ bell(); } /* Flush messages */ msg_print(NULL); } /* Load screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }
int get_spell(int *sn, cptr p, cptr prompt, int *bn, bool known) { int i, num = 0; bool flag, redraw; char choice; event_type ke; char out_val[160]; int book = (*bn); int book_over = 0; int book_start = book; /* HACK -- spellcasting mode -- spell already selected */ if (spellcasting_spell > -1) { (*sn) = spellcasting_spell; spellcasting = FALSE; spellcasting_spell = -1; return (TRUE); } /* Assume no spells available */ (*sn) = -2; /* Check for available spells */ num = count_spells_in_book(book, &book_over); /* No "okay" spells */ if (!num) return (FALSE); /* Assume cancelled */ (*sn) = -1; /* Nothing chosen yet */ flag = FALSE; /* No redraw yet */ redraw = FALSE; /* Show the list */ if (auto_showlist) { /* Show list */ redraw = TRUE; /* Save the screen */ Term_save(); /* Display a list of spells */ print_spells(book); } /* Build a prompt (accept all spells) */ strnfmt(out_val, 78, "(%s %c-%c, *=List, ESC=exit) %s", p, I2A(0), I2A(num - 1), prompt); /* Get a spell from the user */ while (!flag && get_com_ex(out_val, &choice, &ke)) { /* Hack -- mouse */ if (choice == '\xff' && ke.index == 1) { choice = 'a' + ke.mousey - 2; } /* Enter by name */ if (choice == '@' || choice == '"') { int _sn, _bn; if (choice == '"') prompt_quote_hack = TRUE; /* XXX Lookup item by name */ if (get_spell_by_name(&_bn, &_sn, TRUE, FALSE, FALSE)) { book = _bn; i = _sn; flag = TRUE; } else { bell(); } continue; } /* Flip page */ if (choice == '/') { int book_new = book; int tmp = 0; /* End of list */ if (!(num = count_spells_in_book(book + book_over, &tmp))) { /* Set 0 */ book_new = book_start; tmp = 0; num = count_spells_in_book(book_new, &tmp); book_over = tmp; } /* Next book available */ else { /* Advance */ book_new = book + book_over; book_over = tmp; } /* Notice flip! */ if (book_new != book) { /* Set */ book = book_new; /* Re-Build a prompt (accept all spells) */ strnfmt(out_val, 78, "(%s %c-%c, *=List, ESC=exit) %s", p, I2A(0), I2A(num - 1), prompt); /* Must redraw list */ if (redraw) { /* Restore the screen */ Term_load(); Term_save(); /* Display a list of spells */ print_spells(book); } } /* Ask again */ continue; } /* Request redraw */ if ((choice == ' ') || (choice == '*') || (choice == '?')) { /* Show the list */ if (!redraw) { /* Show list */ redraw = TRUE; /* Save the screen */ Term_save(); /* Display a list of spells */ print_spells(book); } /* Hide the list */ else { /* Hide list */ redraw = FALSE; /* Restore the screen */ Term_load(); /* The screen is OK now */ section_icky_row = 0; section_icky_col = 0; /* Flush any events */ Flush_queue(); } /* Ask again */ continue; } /* hack for CAPITAL prayers (heal other) */ if (isupper(choice)) { i = (choice - 'A'); if (i >= num) i = -1; else if (!(spell_flag[(book * SPELLS_PER_BOOK + i)] & PY_SPELL_PROJECT)) i = -1; if (i != -1) i += SPELL_PROJECTED; } /* lowercase */ else if (islower(choice)) { i = A2I(choice); if (i >= num) i = -1; } /* not a letter */ else i = -1; /* Totally Illegal */ if (i < 0) { bell(); continue; } /* Stop the loop */ flag = TRUE; } /* Restore the screen */ if (redraw) { Term_load(); /* The screen is OK now */ section_icky_row = 0; section_icky_col = 0; /* Flush any events */ Flush_queue(); } /* Abort if needed */ if (!flag) return (FALSE); /* Save the choice */ (*sn) = i; (*bn) = book; /* Success */ return (TRUE); }
/* * Hack -- save a screen dump to a file */ void do_cmd_save_screen(void) { /* Do we use a special screendump function ? */ if (screendump_aux) { /* Dump the screen to a graphics file */ (*screendump_aux)(); } /* Dump the screen as text */ else { s32b y, x; s32b wid, hgt; byte a = 0; char c = ' '; PHYSFS_file *fff; char buf[1024]; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, "dump.txt"); /* Append to the file */ fff = my_fopen(buf, "w"); /* Oops */ if (!fff) return; /* Retrieve the current screen size */ Term_get_size(&wid, &hgt); /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Dump the screen */ for (y = 0; y < hgt; y++) { /* Dump each row */ for (x = 0; x < wid; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = c; } /* Terminate */ buf[x] = '\0'; /* End the row */ fprintf(fff, "%s\n", buf); } /* Skip a line */ fprintf(fff, "\n"); /* Dump the screen */ for (y = 0; y < hgt; y++) { /* Dump each row */ for (x = 0; x < wid; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = hack[a & 0x0F]; } /* Terminate */ buf[x] = '\0'; /* End the row */ fprintf(fff, "%s\n", buf); } /* Skip a line */ fprintf(fff, "\n"); /* Close it */ my_fclose(fff); /* Message */ msg_print("Screen dump saved."); msg_print(NULL); /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; } }
/* * Hack -- load a screen dump from a file */ void do_cmd_load_screen(void) { s32b i, y, x; s32b wid, hgt; s32b len; byte a = 0; char c = ' '; bool okay = TRUE; PHYSFS_file *fff; char buf[1024]; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, "dump.txt"); /* Append to the file */ fff = my_fopen(buf, "r"); /* Oops */ if (!fff) return; /* Retrieve the current screen size */ Term_get_size(&wid, &hgt); /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Clear the screen */ Term_clear(); /* Load the screen */ for (y = 0; okay; y++) { /* Get a line of data */ if (my_fgets(fff, buf, 1024)) okay = FALSE; /* Stop on blank line */ if (!buf[0]) break; /* Ignore off screen lines */ if (y >= hgt) continue; /* Get width */ len = strlen(buf); /* Truncate if it's longer than current screen width */ if (len > wid) len = wid; /* Show each row */ for (x = 0; x < len; x++) { /* Put the attr/char */ Term_draw(x, y, TERM_WHITE, buf[x]); } } /* Dump the screen */ for (y = 0; okay; y++) { /* Get a line of data */ if (my_fgets(fff, buf, 1024)) okay = FALSE; /* Stop on blank line */ if (!buf[0]) break; /* Ignore off screen lines */ if (y >= hgt) continue; /* Get width */ len = strlen(buf); /* Truncate if it's longer than current screen width */ if (len > wid) len = wid; /* Dump each row */ for (x = 0; x < len; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Look up the attr */ for (i = 0; i < 16; i++) { /* Use attr matches */ if (hack[i] == buf[x]) a = i; } /* Hack -- fake monochrome */ if (!use_color) a = TERM_WHITE; /* Put the attr/char */ Term_draw(x, y, a, c); } } /* Close it */ my_fclose(fff); /* Message */ msg_print("Screen dump loaded."); msg_print(NULL); /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }
/* * Interact with "colors" */ void do_cmd_colors(void) { s32b i; PHYSFS_file *fff; char tmp[160]; char buf[1024]; /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Interact until done */ while (1) { /* Clear screen */ Term_clear(); /* Ask for a choice */ prt("Interact with Colors", 2, 0); /* Give some choices */ prt("(1) Load a user pref file", 4, 5); #ifdef ALLOW_COLORS prt("(2) Dump colors", 5, 5); prt("(3) Modify colors", 6, 5); # ifdef SUPPORT_GAMMA prt("(4) Gamma correction", 7, 5); # endif /* SUPPORT_GAMMA */ #endif /* Prompt */ prt("Command: ", 8, 0); /* Prompt */ i = inkey(); /* Done */ if (i == ESCAPE) break; /* Load a 'pref' file */ if (i == '1') { /* Prompt */ prt("Command: Load a user pref file", 8, 0); /* Prompt */ prt("File: ", 10, 0); /* Default file */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Query */ if (!askfor_aux(tmp, 70)) continue; /* Process the given filename */ (void)process_pref_file(tmp); /* Mega-Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Mega-Hack -- redraw */ Term_redraw(); } #ifdef ALLOW_COLORS /* Dump colors */ else if (i == '2') { /* Prompt */ prt("Command: Dump colors", 8, 0); /* Prompt */ prt("File: ", 10, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Color redefinitions\n\n"); /* Dump colors */ for (i = 0; i < 256; i++) { s32b kv = angband_color_table[i][0]; s32b rv = angband_color_table[i][1]; s32b gv = angband_color_table[i][2]; s32b bv = angband_color_table[i][3]; cptr name = "unknown"; /* Skip non-entries */ if (!kv && !rv && !gv && !bv) continue; /* Extract the color name */ name = color_names[i]; /* Dump a comment */ fprintf(fff, "# Color '%s'\n", name); /* Dump the monster attr/char info */ fprintf(fff, "V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n", i, kv, rv, gv, bv); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped color redefinitions."); } /* Edit colors */ else if (i == '3') { static byte a = 0; /* Prompt */ prt("Command: Modify colors", 8, 0); /* Hack -- query until done */ while (1) { cptr name; /* Clear */ clear_from(10); /* Exhibit the normal colors */ for (i = 0; i < 16; i++) { /* Exhibit this color */ Term_putstr(i*4, 20, -1, a, "###"); /* Exhibit all colors */ Term_putstr(i*4, 22, -1, i, format("%3d", i)); } /* Describe the color */ name = ((color_names[a]) ? color_names[a] : "undefined"); /* Describe the color */ Term_putstr(5, 10, -1, TERM_WHITE, format("Color = %d, Name = %s", a, name)); /* Label the Current values */ Term_putstr(5, 12, -1, TERM_WHITE, format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x", angband_color_table[a][0], angband_color_table[a][1], angband_color_table[a][2], angband_color_table[a][3])); /* Prompt */ Term_putstr(0, 14, -1, TERM_WHITE, "Command (n/N/k/K/r/R/g/G/b/B): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') a = (byte)(a + 1); if (i == 'N') a = (byte)(a - 1); if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1); if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1); if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1); if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1); if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1); if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1); if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1); if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1); /* Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Hack -- redraw */ Term_redraw(); } } # ifdef SUPPORT_GAMMA /* Gamma correction */ else if (i == '4') { s32b gamma; /* Prompt */ prt("Command: Gamma correction", 8, 0); /* gamma_val isn't set - assume 1.0 */ if (gamma_val == 0) gamma = 10; /* It's set - convert to usual notation (times 10) */ else gamma = 2560 / gamma_val; /* Hack -- query until done */ while (1) { /* Clear */ clear_from(10); /* Exhibit the normal colors */ for (i = 0; i < 16; i++) { /* Exhibit all colors */ Term_putstr(i*4, 22, -1, i, format("%3d", i)); } /* Describe the gamma */ Term_putstr(5, 10, -1, TERM_WHITE, format("Gamma = %d.%d", gamma / 10, gamma % 10)); /* Prompt */ Term_putstr(0, 12, -1, TERM_WHITE, "Command (g/G): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'g') gamma = (byte)(gamma + 1); else if (i == 'G') gamma = (byte)(gamma - 1); else continue; /* Force limits ([1.0, 2.5]) */ if (gamma < 10) gamma = 10; if (gamma > 25) gamma = 25; /* Hack - 1.0 means no correction */ if (gamma == 10) gamma_val = 0; /* otherwise, calculate gamma_val */ else gamma_val = 2560 / gamma; /* Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Hack -- redraw */ Term_redraw(); } } # endif /* SUPPORT_GAMMA */ #endif /* Unknown option */ else { bell(); } /* Flush messages */ msg_print(NULL); } /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }
/* * Show previous messages to the user -BEN- * * The screen format uses line 0 and (Term->hgt - 1) for headers and prompts, * skips line 1 and (Term->hgt - 2), and uses line 2 thru (Term->hgt - 3) for * old messages. * * This command shows you which commands you are viewing, and allows * you to "search" for strings in the recall. * * Note that messages may be longer than 80 characters, but they are * displayed using "infinite" length, with a special sub-command to * "slide" the virtual display to the left or right. * * Attempt to only hilite the matching portions of the string. * * Now taking advantages of big-screen. -pav- */ void do_cmd_messages(void) { s32b i, j, k, n, q; s32b wid, hgt; char shower[80]; char finder[80]; /* Wipe finder */ strcpy(finder, ""); /* Wipe shower */ strcpy(shower, ""); /* Total messages */ n = message_num(); /* Start on first message */ i = 0; /* Start at leftmost edge */ q = 0; /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Process requests until done */ while (1) { /* Clear screen */ Term_clear(); /* Retrieve current screen size */ Term_get_size(&wid, &hgt); /* Dump up to 20 (or more in bigscreen) lines of messages */ for (j = 0; (j < (hgt - 4)) && (i + j < n); j++) { cptr msg = message_str(i + j); byte color = message_color(i + j); /* Apply horizontal scroll */ msg = (strlen(msg) >= q) ? (msg + q) : ""; /* Dump the messages, bottom to top */ display_message(0, (hgt - 3) - j, strlen(msg), color, msg); /* Hilite "shower" */ if (shower[0]) { cptr str = msg; /* Display matches */ while ((str = strstr(str, shower)) != NULL) { s32b len = strlen(shower); /* Display the match */ Term_putstr(str - msg, (hgt - 3) - j, len, TERM_YELLOW, shower); /* Advance */ str += len; } } } /* Display header XXX XXX XXX */ prt(format("Message Recall (%d-%d of %d), Offset %d", i, i + j - 1, n, q), 0, 0); /* Display prompt (not very informative) */ prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0); /* Get a command */ k = inkey(); /* Exit on Escape */ if (k == ESCAPE) break; /* Hack -- Save the old index */ j = i; /* Horizontal scroll */ if (k == '4') { /* Scroll left */ q = (q >= wid / 2) ? (q - wid / 2) : 0; /* Success */ continue; } /* Horizontal scroll */ if (k == '6') { /* Scroll right */ q = q + wid / 2; /* Success */ continue; } /* Hack -- handle show */ if (k == '=') { /* Prompt */ prt("Show: ", hgt - 1, 0); /* Get a "shower" string, or continue */ if (!askfor_aux(shower, 80)) continue; /* Okay */ continue; } /* Hack -- handle find */ if (k == '/') { s16b z; /* Prompt */ prt("Find: ", hgt - 1, 0); /* 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); /* Search for it */ if (strstr(msg, finder)) { /* New location */ i = z; /* Done */ break; } } } /* Recall 1 older message */ if ((k == '8') || (k == '\n') || (k == '\r')) { /* Go newer if legal */ if (i + 1 < n) i += 1; } /* Recall 10 older messages */ if (k == '+') { /* Go older if legal */ if (i + 10 < n) i += 10; } /* Recall one screen of older messages */ if ((k == 'p') || (k == KTRL('P')) || (k == ' ')) { /* Go older if legal */ if (i + (hgt - 4) < n) i += (hgt - 4); } /* Recall one screen of newer messages */ if ((k == 'n') || (k == KTRL('N'))) { /* Go newer (if able) */ i = (i >= (hgt - 4)) ? (i - (hgt - 4)) : 0; } /* Recall 10 newer messages */ if (k == '-') { /* Go newer (if able) */ i = (i >= 10) ? (i - 10) : 0; } /* Recall 1 newer messages */ if (k == '2') { /* Go newer (if able) */ i = (i >= 1) ? (i - 1) : 0; } /* Hack -- Error of some kind */ if (i == j) bell(); } /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }
/* * Interact with "visuals" */ void do_cmd_visuals(void) { s32b i; PHYSFS_file *fff; char tmp[160]; char buf[1024]; /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Interact until done */ while (1) { /* Clear screen */ Term_clear(); /* Ask for a choice */ prt("Interact with Visuals", 2, 0); /* Give some choices */ prt("(1) Load a user pref file", 4, 5); #ifdef ALLOW_VISUALS 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 prt("(0) Reset visuals", 13, 5); /* Prompt */ prt("Command: ", 15, 0); /* Prompt */ i = inkey(); /* Done */ if (i == ESCAPE) break; /* Load a 'pref' file */ else if (i == '1') { /* Prompt */ prt("Command: Load a user pref file", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Query */ if (!askfor_aux(tmp, 70)) continue; /* Process the given filename */ (void)process_pref_file(tmp); } #ifdef ALLOW_VISUALS /* Dump monster attr/chars */ else if (i == '2') { /* Prompt */ prt("Command: Dump monster attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Monster attr/char definitions\n\n"); /* Dump monsters */ for (i = 0; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-entries */ if (!r_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (r_ptr->name)); /* Dump the monster attr/char info */ fprintf(fff, "R:%d:0x%02X:0x%02X\n\n", i, (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped monster attr/chars."); } /* Dump object attr/chars */ else if (i == '3') { /* Prompt */ prt("Command: Dump object attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Object attr/char definitions\n\n"); /* Dump objects */ for (i = 0; i < max_k_idx; i++) { object_kind *k_ptr = &k_info[i]; /* Skip non-entries */ if (!k_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (k_ptr->name)); /* Dump the object attr/char info */ fprintf(fff, "K:%d:0x%02X:0x%02X\n\n", i, (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped object attr/chars."); } /* Dump feature attr/chars */ else if (i == '4') { /* Prompt */ prt("Command: Dump feature attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Feature attr/char definitions\n\n"); /* Dump features */ for (i = 0; i < max_f_idx; i++) { feature_type *f_ptr = &f_info[i]; /* Skip non-entries */ if (!f_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (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)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped feature attr/chars."); } /* Modify monster attr/chars */ else if (i == '6') { static s32b r = 0; /* Prompt */ prt("Command: Change monster attr/chars", 15, 0); /* Hack -- query until done */ while (1) { monster_race *r_ptr = &r_info[r]; byte da = (r_ptr->d_attr); char dc = (r_ptr->d_char); byte ca = (r_ptr->x_attr); char cc = (r_ptr->x_char); /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Monster = %d, Name = %-40.40s", r, (r_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') r = (r + max_r_idx + 1) % max_r_idx; if (i == 'N') r = (r + max_r_idx - 1) % max_r_idx; if (i == 'a') r_ptr->x_attr = (byte)(ca + 1); if (i == 'A') r_ptr->x_attr = (byte)(ca - 1); if (i == 'c') r_ptr->x_char = (byte)(cc + 1); if (i == 'C') r_ptr->x_char = (byte)(cc - 1); } } /* Modify object attr/chars */ else if (i == '7') { static s32b k = 0; /* Prompt */ prt("Command: Change object attr/chars", 15, 0); /* Hack -- query until done */ while (1) { object_kind *k_ptr = &k_info[k]; byte da = (byte)k_ptr->d_attr; char dc = (byte)k_ptr->d_char; byte ca = (byte)k_ptr->x_attr; char cc = (byte)k_ptr->x_char; /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Object = %d, Name = %-40.40s", k, (k_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') k = (k + max_k_idx + 1) % max_k_idx; if (i == 'N') k = (k + max_k_idx - 1) % max_k_idx; if (i == 'a') k_info[k].x_attr = (byte)(ca + 1); if (i == 'A') k_info[k].x_attr = (byte)(ca - 1); if (i == 'c') k_info[k].x_char = (byte)(cc + 1); if (i == 'C') k_info[k].x_char = (byte)(cc - 1); } } /* Modify feature attr/chars */ else if (i == '8') { static s32b f = 0; /* Prompt */ prt("Command: Change feature attr/chars", 15, 0); /* Hack -- query until done */ while (1) { feature_type *f_ptr = &f_info[f]; byte da = (byte)f_ptr->d_attr; char dc = (byte)f_ptr->d_char; byte ca = (byte)f_ptr->x_attr; char cc = (byte)f_ptr->x_char; /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Terrain = %d, Name = %-40.40s", f, (f_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C/d): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') f = (f + max_f_idx + 1) % max_f_idx; if (i == 'N') f = (f + max_f_idx - 1) % max_f_idx; if (i == 'a') f_info[f].x_attr = (byte)(ca + 1); if (i == 'A') f_info[f].x_attr = (byte)(ca - 1); if (i == 'c') f_info[f].x_char = (byte)(cc + 1); if (i == 'C') f_info[f].x_char = (byte)(cc - 1); if (i == 'd') { f_info[f].x_char = f_ptr->d_char; f_info[f].x_attr = f_ptr->d_attr; } } } #endif /* Reset visuals */ else if (i == '0') { /* Reset */ reset_visuals(); /* Message */ msg_print("Visual attr/char tables reset."); } /* Unknown option */ else { bell(); } /* Flush messages */ msg_print(NULL); } /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }