/* * 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(); }
/* * 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 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); }