static int _choose_spell_to_gain(object_type *o_ptr) { rect_t r = _menu_rect(); int result = -1; int cmd; bool done = FALSE; screen_save(); while (!done) { prt("Memorize which spell?", 0, 0); _display_spells_to_gain(o_ptr, r); cmd = inkey_special(FALSE); if (cmd == ESCAPE || cmd == 'q' || cmd == 'Q') done = TRUE; if ('a' <= cmd && cmd < 'a' + _SPELLS_PER_BOOK) { int spell_idx = o_ptr->sval * _SPELLS_PER_BOOK + A2I(cmd); magic_type *spell_ptr = _get_spell_info(tval2realm(o_ptr->tval), spell_idx); if (spell_ptr->slevel <= p_ptr->lev) /* Note: Illegible spells have slevel == 99 in m_info.txt */ { done = TRUE; result = spell_idx; } } } screen_load(); return result; }
void simple_menu_select_game::handle() { // ignore pause keys by swallowing them before we process the menu machine().ui_input().pressed(IPT_UI_PAUSE); // process the menu const event *menu_event = process(0); if (menu_event && menu_event->itemref) { if (m_error) { // reset the error on any future menu_event m_error = false; machine().ui_input().reset(); } else { // handle selections switch(menu_event->iptkey) { case IPT_UI_SELECT: inkey_select(menu_event); break; case IPT_UI_CANCEL: inkey_cancel(); break; case IPT_SPECIAL: inkey_special(menu_event); break; } } } // if we're in an error state, overlay an error message if (m_error) ui().draw_text_box(container(), "The selected game is missing one or more required ROM or CHD images. " "Please select a different game.\n\nPress any key to continue.", ui::text_layout::CENTER, 0.5f, 0.5f, UI_RED_COLOR); }
void ui_menu_rgb_ui::handle() { bool changed = false; // process the menu const ui_menu_event *m_event; if (!m_key_active) m_event = process(UI_MENU_PROCESS_LR_REPEAT); else m_event = process(UI_MENU_PROCESS_ONLYCHAR); if (m_event != nullptr && m_event->itemref != nullptr) { switch ((FPTR)m_event->itemref) { case RGB_ALPHA: if (m_event->iptkey == IPT_UI_LEFT && m_color->a() > 1) { m_color->set_a(m_color->a() - 1); changed = true; } else if (m_event->iptkey == IPT_UI_RIGHT && m_color->a() < 255) { m_color->set_a(m_color->a() + 1); changed = true; } else if (m_event->iptkey == IPT_UI_SELECT || m_event->iptkey == IPT_SPECIAL) { inkey_special(m_event); changed = true; } break; case RGB_RED: if (m_event->iptkey == IPT_UI_LEFT && m_color->r() > 1) { m_color->set_r(m_color->r() - 1); changed = true; } else if (m_event->iptkey == IPT_UI_RIGHT && m_color->r() < 255) { m_color->set_r(m_color->r() + 1); changed = true; } else if (m_event->iptkey == IPT_UI_SELECT || m_event->iptkey == IPT_SPECIAL) { inkey_special(m_event); changed = true; } break; case RGB_GREEN: if (m_event->iptkey == IPT_UI_LEFT && m_color->g() > 1) { m_color->set_g(m_color->g() - 1); changed = true; } else if (m_event->iptkey == IPT_UI_RIGHT && m_color->g() < 255) { m_color->set_g(m_color->g() + 1); changed = true; } else if (m_event->iptkey == IPT_UI_SELECT || m_event->iptkey == IPT_SPECIAL) { inkey_special(m_event); changed = true; } break; case RGB_BLUE: if (m_event->iptkey == IPT_UI_LEFT && m_color->b() > 1) { m_color->set_b(m_color->b() - 1); changed = true; } else if (m_event->iptkey == IPT_UI_RIGHT && m_color->b() < 255) { m_color->set_b(m_color->b() + 1); changed = true; } else if (m_event->iptkey == IPT_UI_SELECT || m_event->iptkey == IPT_SPECIAL) { inkey_special(m_event); changed = true; } break; case PALETTE_CHOOSE: if (m_event->iptkey == IPT_UI_SELECT) ui_menu::stack_push(global_alloc_clear<ui_menu_palette_sel>(machine(), container, *m_color)); break; } } if (changed) reset(UI_MENU_RESET_REMEMBER_REF); }
int doc_display_aux(doc_ptr doc, cptr caption, int top, rect_t display) { int rc = _OK; int i; char finder_str[81]; char back_str[81]; int page_size; bool done = FALSE; strcpy(finder_str, ""); page_size = display.cy - 4; if (top < 0) top = 0; if (top > doc->cursor.y - page_size) top = MAX(0, doc->cursor.y - page_size); for (i = 0; i < display.cy; i++) Term_erase(display.x, display.y + i, display.cx); while (!done) { int cmd; Term_erase(display.x, display.y, display.cx); put_str(format("[%s, Line %d/%d]", caption, top, doc->cursor.y), display.y, display.x); doc_sync_term(doc, doc_region_create(0, top, doc->width, top + page_size - 1), doc_pos_create(display.x, display.y + 2)); Term_erase(display.x, display.y + display.cy - 1, display.cx); put_str("[Press ESC to exit. Press ? for help]", display.y + display.cy - 1, display.x); cmd = inkey_special(TRUE); if ('a' <= cmd && cmd <= 'z') { doc_link_ptr link = int_map_find(doc->links, cmd); if (link) { rc = doc_display_help_aux(string_buffer(link->file), string_buffer(link->topic), display); if (rc == _UNWIND) done = TRUE; continue; } } switch (cmd) { case '?': if (!strstr(caption, "helpinfo.txt")) { rc = doc_display_help_aux("helpinfo.txt", NULL, display); if (rc == _UNWIND) done = TRUE; } break; case ESCAPE: done = TRUE; break; case 'q': done = TRUE; rc = _UNWIND; break; case SKEY_TOP: case '7': top = 0; break; case SKEY_BOTTOM: case '1': top = MAX(0, doc->cursor.y - page_size); break; case SKEY_PGUP: case '9': top -= page_size; if (top < 0) top = 0; break; case SKEY_PGDOWN: case '3': top += page_size; if (top > doc->cursor.y - page_size) top = MAX(0, doc->cursor.y - page_size); break; case SKEY_UP: case '8': top--; if (top < 0) top = 0; break; case SKEY_DOWN: case '2': top++; if (top > doc->cursor.y - page_size) top = MAX(0, doc->cursor.y - page_size); break; case '>': { doc_pos_t pos = doc_next_bookmark(doc, doc_pos_create(doc->width - 1, top)); if (doc_pos_is_valid(pos)) { top = pos.y; if (top > doc->cursor.y - page_size) top = MAX(0, doc->cursor.y - page_size); } break; } case '<': { doc_pos_t pos = doc_prev_bookmark(doc, doc_pos_create(0, top)); if (doc_pos_is_valid(pos)) top = pos.y; else top = 0; break; } case '|': { FILE *fp2; char buf[1024]; char name[82]; int cb; int format = DOC_FORMAT_TEXT; strcpy(name, string_buffer(doc->name)); if (!get_string("File name: ", name, 80)) break; path_build(buf, sizeof(buf), ANGBAND_DIR_USER, name); fp2 = my_fopen(buf, "w"); if (!fp2) { msg_format("Failed to open file: %s", buf); break; } cb = strlen(buf); if (cb > 5 && strcmp(buf + cb - 5, ".html") == 0) format = DOC_FORMAT_HTML; else if (cb > 4 && strcmp(buf + cb - 4, ".htm") == 0) format = DOC_FORMAT_HTML; doc_write_file(doc, fp2, format); my_fclose(fp2); msg_format("Created file: %s", buf); msg_print(NULL); break; } case '/': Term_erase(display.x, display.y + display.cy - 1, display.cx); put_str("Find: ", display.y + display.cy - 1, display.x); strcpy(back_str, finder_str); if (askfor(finder_str, 80)) { if (finder_str[0]) { doc_pos_t pos = doc->selection.stop; if (!doc_pos_is_valid(pos)) pos = doc_pos_create(0, top); pos = doc_find_next(doc, finder_str, pos); if (doc_pos_is_valid(pos)) { top = pos.y; if (top > doc->cursor.y - page_size) top = MAX(0, doc->cursor.y - page_size); } } } else strcpy(finder_str, back_str); break; case '\\': Term_erase(display.x, display.y + display.cy - 1, display.cx); put_str("Find: ", display.y + display.cy - 1, display.x); strcpy(back_str, finder_str); if (askfor(finder_str, 80)) { if (finder_str[0]) { doc_pos_t pos = doc->selection.start; if (!doc_pos_is_valid(pos)) pos = doc_pos_create(doc->width, top + page_size); pos = doc_find_prev(doc, finder_str, pos); if (doc_pos_is_valid(pos)) { top = pos.y; if (top > doc->cursor.y - page_size) top = MAX(0, doc->cursor.y - page_size); } } } else strcpy(finder_str, back_str); break; default: { /* BETA: Any unhandled keystroke will navigate to the next topic based upon a comparison of the first letter. This is nice, say, for viewing the Character Sheet and navigating to the various sections */ doc_pos_t pos = doc_next_bookmark_char(doc, doc_pos_create(1, top), cmd); if (!doc_pos_is_valid(pos)) /* wrap */ pos = doc_next_bookmark_char(doc, doc_pos_create(0, 0), cmd); if (doc_pos_is_valid(pos)) { top = pos.y; if (top > doc->cursor.y - page_size) top = MAX(0, doc->cursor.y - page_size); } } } } return rc; }
static _slot_info_ptr _choose(cptr verb, int options) { _slot_info_ptr result = NULL; int slot = 0; int cmd; rect_t r = _menu_rect(); string_ptr prompt = NULL; bool done = FALSE; bool exchange = FALSE; int slot1 = _INVALID_SLOT, slot2 = _INVALID_SLOT; if (REPEAT_PULL(&cmd)) { slot = A2I(cmd); if (0 <= slot && slot < _MAX_SLOTS) return &_spells[slot]; } prompt = string_alloc(); screen_save(); while (!done) { string_clear(prompt); if (exchange) { if (slot1 == _INVALID_SLOT) string_append_s(prompt, "Select the first spell:"); else string_append_s(prompt, "Select the second spell:"); } else { string_printf(prompt, "%s which spell", verb); if (options & _ALLOW_EXCHANGE) string_append_s(prompt, " [Press 'X' to Exchange]"); string_append_c(prompt, ':'); } prt(string_buffer(prompt), 0, 0); _display(r, options); cmd = inkey_special(FALSE); if (cmd == ESCAPE || cmd == 'q' || cmd == 'Q') done = TRUE; if (options & _ALLOW_EXCHANGE) { if (!exchange && (cmd == 'x' || cmd == 'X')) { exchange = TRUE; slot1 = slot2 = _INVALID_SLOT; } } if ('a' <= cmd && cmd < 'a' + _MAX_SLOTS) { slot = A2I(cmd); if (exchange) { if (slot1 == _INVALID_SLOT) slot1 = slot; else { slot2 = slot; if (slot1 != slot2) { _slot_info_t tmp = _spells[slot1]; _spells[slot1] = _spells[slot2]; _spells[slot2] = tmp; } exchange = FALSE; slot1 = slot2 = _INVALID_SLOT; } } else { if (_spells[slot].realm != REALM_NONE || (options & _ALLOW_EMPTY)) { result = &_spells[slot]; done = TRUE; } } } } if (result) { REPEAT_PUSH(I2A(slot)); } screen_load(); string_free(prompt); return result; }
static bool _choose(_choice_array_t *choices) { int key = 0, i; bool redraw = TRUE; bool done = FALSE; assert(choices->size); choices->current = 0; if (choices->mode == _CHOOSE_MODE_LEARN) { /* In this mode, the first choice is the form to learn followed by a single group of existing slots */ assert(choices->size > 1); choices->current = 1; } while (!done) { if (redraw) { _list(choices); redraw = FALSE; } { int r_idx = choices->choices[choices->current].r_idx; if (r_idx > 0) { monster_race_track(r_idx); window_stuff(); } } /* No macros. The problem is that arrow keys are implemented with macros! */ key = inkey_special(TRUE); switch (key) { case ESCAPE: done = TRUE; break; case '?': { int r_idx = choices->choices[choices->current].r_idx; if (r_idx > 0) { int x = Term->scr->cx; /* No way to query this? */ int y = Term->scr->cy; mon_display(&r_info[r_idx]); Term_gotoxy(x, y); redraw = TRUE; /* screen_save buggily misses row 0 */ } break; } case '=': _next_display_mode(); redraw = TRUE; break; case '8': case SKEY_UP: { int old_current = choices->current; choices->current--; if (choices->current < 0) choices->current = 0; if (old_current != choices->current) redraw = TRUE; break; } case '2': case SKEY_DOWN: { int old_current = choices->current; choices->current++; if (choices->current > choices->size - 1) choices->current = choices->size - 1; if (old_current != choices->current) redraw = TRUE; break; } case '\t': { int old_current = choices->current; int old_type = choices->choices[old_current].type; /* Tab to next group in the list. Wrap to first group as needed. */ for (;;) { choices->current++; if (choices->current == choices->size) /* Wrap */ choices->current = 0; if (choices->choices[choices->current].type != old_type) break; if (choices->current == old_current) break; } if (old_current != choices->current) redraw = TRUE; break; } case ' ': case '\r': case '\n': if (_confirm(choices, choices->current)) return TRUE; redraw = TRUE; break; default: for (i = 0; i < choices->size; i++) { if (choices->choices[i].key == key) { choices->current = i; if (_confirm(choices, choices->current)) return TRUE; redraw = TRUE; break; } } } } return FALSE; }