/* ------------------------------------------------------------------------ * Quickstart? screen. * ------------------------------------------------------------------------ */ static enum birth_stage get_quickstart_command(void) { const char *prompt = "['Y' to use this character, 'N' to start afresh, 'C' to change name]"; enum birth_stage next = BIRTH_QUICKSTART; /* Prompt for it */ prt("New character based on previous one:", 0, 0); prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[Y]", 'y'); button_add("[N]", 'n'); button_add("[C]", 'c'); redraw_stuff(p_ptr); do { /* Get a key */ struct keypress ke = inkey(); if (ke.code == 'N' || ke.code == 'n') { cmd_insert(CMD_BIRTH_RESET); next = BIRTH_SEX_CHOICE; } else if (ke.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.code == 'C' || ke.code == 'c') { next = BIRTH_NAME_CHOICE; } else if (ke.code == 'Y' || ke.code == 'y') { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } } while (next == BIRTH_QUICKSTART); /* Buttons */ button_kill_all(); redraw_stuff(p_ptr); /* Clear prompt */ clear_from(23); return next; }
/* * Have the player decide, before the game is started, if they are playing NPP Moria or NPPAngband */ static void get_game_mode(void) { int cursor = 0; ui_event_data c = EVENT_EMPTY; const char cmd_keys[] = { ARROW_LEFT, ARROW_RIGHT, '\0' }; menu_type menu; menu_iter menu_f = { tag_game_mode_item , valid_game_mode_item, display_game_mode_item, NULL}; WIPE(&menu, menu_type); menu.cmd_keys = cmd_keys; menu.title = "Please select a game to play."; menu.count = N_ELEMENTS(game_mode_menu), menu_init(&menu, MN_SKIN_SCROLL, &menu_f, &SCREEN_REGION); /* Start with a blank screen */ game_mode = 0; while (game_mode == 0) { clear_from(0); c = menu_select(&menu, &cursor, 0); if (c.type == EVT_SELECT) { if ((size_t) cursor < N_ELEMENTS(game_mode_menu)) { game_mode_menu[cursor].action(NULL); } } } /* Clear the screen */ clear_from(0); }
/* * Choose and create an instance of an object kind */ static void wiz_create_item(void) { int tvals[TV_MAX]; size_t i, n; menu_type *menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_menu); menu->selections = all_letters; menu->title = "What kind of object?"; /* Make a list of all tvals for the filter */ for (i = 0, n = 0; i < TV_MAX; i++) { if (!kb_info[i].name) continue; tvals[n++] = i; } screen_save(); clear_from(0); menu_setpriv(menu, TV_MAX, kb_info); menu_set_filter(menu, tvals, n); menu_layout(menu, &wiz_create_item_area); menu_select(menu, 0, FALSE); screen_load(); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_ITEMLIST); handle_stuff(p_ptr); }
/* * Choose and create an instance of an object kind */ static void wiz_create_artifact(void) { size_t num, i; menu_type *menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_menu); tval_desc *a_tvals; choose_artifact = TRUE; a_tvals = C_ZNEW(N_ELEMENTS(tvals), tval_desc); for (num = i = 0; i < N_ELEMENTS(tvals); i++) { /* Don't show tvals with no artifacts. */ if (!(tvals[i].can_be_artifact)) continue; /* Increment number of items in list. */ a_tvals[num++] = tvals[i]; } menu->selections = all_letters; menu->title = "What kind of artifact?"; screen_save(); clear_from(0); menu_setpriv(menu, num, a_tvals); menu_layout(menu, &wiz_create_item_area); menu_select(menu, 0, FALSE); screen_load(); FREE(a_tvals); }
void Textual::remove(const Index& index) { DOM::HTMLDocument document = htmlDocument(); if(index.atVariationStart()) { DOM::Element vc = document.getElementById("vc_"+index); if(!vc.isNull()) { /* remove a number? */ DOM::Element comm(vc.previousSibling()); DOM::Element mvnum(vc.nextSibling()); if(!mvnum.isNull() && mvnum.getAttribute("id").string().startsWith("nm_") && !comm.isNull() && comm.getAttribute("id").string().startsWith("cm_")) { DOM::Element move(mvnum.nextSibling()); int mv_num = move.getAttribute("mvnum").string().toInt(); int sub_mv_num = move.getAttribute("submvnum").string().toInt(); if(!(mv_num>0 && (sub_mv_num==0 && (mv_num%2 || m_layout_style)))) mvnum.parentNode().removeChild(mvnum); } vc.parentNode().removeChild(vc); } } else { DOM::Element rm = document.getElementById("nm_"+index); if(rm.isNull()) rm = document.getElementById("mv_"+index); if(!rm.isNull()) clear_from(rm); } if(m_curr_selected >= index) m_curr_selected = Index(-1); }
/* * Display quality squelch menu. */ static void quality_menu(void *unused, const char *also_unused) { menu_type menu; menu_iter menu_f = { NULL, NULL, quality_display, quality_action }; region area = { 1, 5, -1, -1 }; /* Save screen */ screen_save(); clear_from(0); /* Help text */ prt("Quality squelch menu", 0, 0); Term_gotoxy(1, 1); text_out_to_screen(TERM_L_RED, "Use the movement keys to navigate, and Enter to change settings."); /* Set up the menu */ menu_init(&menu, MN_SKIN_SCROLL, &menu_f); menu_setpriv(&menu, TYPE_MAX, quality_values); menu_layout(&menu, &area); /* Select an entry */ menu_select(&menu, 0); /* Load screen */ screen_load(); return; }
/** * Display the character on the screen (two different modes) * * The top two lines, and the bottom line (or two) are left blank. * * Mode 0 = standard display with skills/history * Mode 1 = special display with equipment flags */ void display_player(int mode) { /* Erase screen */ clear_from(0); /* When not playing, do not display in subwindows */ if (Term != angband_term[0] && !player->upkeep->playing) return; /* Stat info */ display_player_stat_info(); if (mode) { struct panel *p = panels[0].panel(); display_panel(p, panels[0].align_left, &panels[0].bounds); panel_free(p); /* Stat/Sustain flags */ display_player_sust_info(); /* Other flags */ display_player_flag_info(); } else { /* Extra info */ display_player_xtra_info(); } }
/* * Display the character on the screen (two different modes) * * The top two lines, and the bottom line (or two) are left blank. * * Mode 0 = standard display with skills/history * Mode 1 = special display with equipment flags */ void display_player(int mode) { /* Erase screen */ clear_from(0); /* Stat info */ display_player_stat_info(); if (mode) { data_panel data[MAX_PANEL]; int rows = get_panel(1, data, N_ELEMENTS(data)); display_panel(data, rows, 1, &boundaries[1]); /* Stat/Sustain flags */ display_player_sust_info(); /* Other flags */ display_player_flag_info(); } /* Standard */ else { /* Extra info */ display_player_xtra_info(); } }
/** * ------------------------------------------------------------------------ * Quickstart? screen. * ------------------------------------------------------------------------ */ static enum birth_stage textui_birth_quickstart(void) { const char *prompt = "['Y' to use this character, 'N' to start afresh, 'C' to change name or history]"; enum birth_stage next = BIRTH_QUICKSTART; /* Prompt for it */ prt("New character based on previous one:", 0, 0); prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); do { /* Get a key */ struct keypress ke = inkey(); if (ke.code == 'N' || ke.code == 'n') { cmdq_push(CMD_BIRTH_RESET); next = BIRTH_RACE_CHOICE; } else if (ke.code == KTRL('X')) { quit(NULL); } else if (ke.code == 'C' || ke.code == 'c') { next = BIRTH_NAME_CHOICE; } else if (ke.code == 'Y' || ke.code == 'y') { cmdq_push(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } } while (next == BIRTH_QUICKSTART); /* Clear prompt */ clear_from(23); return next; }
/** * ------------------------------------------------------------------------ * Final confirmation of character. * ------------------------------------------------------------------------ */ static enum birth_stage get_confirm_command(void) { const char *prompt = "['ESC' to step back, 'S' to start over, or any other key to continue]"; struct keypress ke; enum birth_stage next = BIRTH_RESET; /* Prompt for it */ prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Get a key */ ke = inkey(); /* Start over */ if (ke.code == 'S' || ke.code == 's') { next = BIRTH_RESET; } else if (ke.code == KTRL('X')) { quit(NULL); } else if (ke.code == ESCAPE) { next = BIRTH_BACK; } else { cmdq_push(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } /* Clear prompt */ clear_from(23); return next; }
/* ------------------------------------------------------------------------ * Quickstart? screen. * ------------------------------------------------------------------------ */ static enum birth_stage get_quickstart_command(void) { const char *prompt = "['Y' to use this character, 'N' to start afresh, 'C' to change name]"; ui_event_data ke; enum birth_stage next = BIRTH_QUICKSTART; /* Prompt for it */ prt("New character based on previous one:", 0, 0); prt(prompt, Term->hgt - (mouse_buttons ? 2 : 1), Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[YES]", 'y'); button_add("[START_OVER]", 'n'); button_add("[CHANGE_NAME]", 'c'); redraw_stuff(); event_signal(EVENT_MOUSEBUTTONS); do { /* Get a key */ ke = inkey_ex(); if (ke.key == 'N' || ke.key == 'n') { cmd_insert(CMD_BIRTH_RESET, TRUE); next = BIRTH_SEX_CHOICE; } else if (ke.key == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.key == 'C' || ke.key == 'c') { next = BIRTH_NAME_CHOICE; } else if (ke.key == 'Y' || ke.key == 'y') { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } } while (next == BIRTH_QUICKSTART); /* Buttons */ button_kill_all(); handle_stuff(); event_signal(EVENT_MOUSEBUTTONS); /* Clear prompt */ clear_from(23); return next; }
/** * This draws the Object Recall subwindow when displaying a particular object * (e.g. a helmet in the backpack, or a scroll on the ground) */ void display_object_recall(struct object *obj) { char header_buf[120]; textblock *tb = object_info(obj, OINFO_NONE); object_desc(header_buf, sizeof(header_buf), obj, ODESC_PREFIX | ODESC_FULL); clear_from(0); textui_textblock_place(tb, SCREEN_REGION, header_buf); textblock_free(tb); }
/* * Display targeting help at the bottom of the screen. */ static void target_display_help(bool monster, bool free) { /* Determine help location */ int wid, hgt, help_loc; Term_get_size(&wid, &hgt); help_loc = hgt - HELP_HEIGHT - (mouse_buttons ? 1 : 0); /* Clear */ clear_from(help_loc); /* Prepare help hooks */ text_out_hook = text_out_to_screen; text_out_indent = 1; Term_gotoxy(1, help_loc); /* Display help */ text_out_c(TERM_L_GREEN, "<dir>"); text_out(" and "); text_out_c(TERM_L_GREEN, "<click>"); text_out(" look around. '"); text_out_c(TERM_L_GREEN, "g"); text_out(" moves to the selection. '"); text_out_c(TERM_L_GREEN, "p"); text_out("' selects the player. '"); text_out_c(TERM_L_GREEN, "q"); text_out("' exits. '"); text_out_c(TERM_L_GREEN, "r"); text_out("' displays details. '"); if (free) { text_out_c(TERM_L_GREEN, "m"); text_out("' restricts to interesting places. "); } else { text_out_c(TERM_L_GREEN, "+"); text_out("' and '"); text_out_c(TERM_L_GREEN, "-"); text_out("' cycle through interesting places. '"); text_out_c(TERM_L_GREEN, "o"); text_out("' allows free selection. "); } if (monster || free) { text_out("'"); text_out_c(TERM_L_GREEN, "t"); text_out("' targets the current selection."); } /* Reset */ text_out_indent = 0; }
static void keymap_browse_hook(int oid, void *db, const region *loc) { char tmp[1024]; event_signal(EVENT_MESSAGE_FLUSH); clear_from(13); /* Show current action */ prt("Current action (if any) shown below:", 13, 0); keypress_to_text(tmp, sizeof(tmp), keymap_buffer, false); prt(tmp, 14, 0); }
static void keymap_browse_hook(int oid, void *db, const region *loc) { char tmp[1024]; message_flush(); clear_from(13); /* Show current action */ prt("Current action (if any) shown below:", 13, 0); keypress_to_text(tmp, sizeof(tmp), keymap_buffer, false); prt(tmp, 14, 0); }
/** * Display list of svals to be ignored. */ static bool sval_menu(int tval, const char *desc) { struct menu *menu; region area = { 1, 2, -1, -1 }; ignore_choice *choices; int n_choices = ignore_collect_kind(tval, &choices); if (!n_choices) return false; /* Sort by name in ignore menus except for categories of items that are * aware from the start */ switch (tval) { case TV_LIGHT: case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: case TV_DRAG_ARMOR: case TV_GOLD: /* leave sorted by sval */ break; default: /* sort by name */ sort(choices, n_choices, sizeof(*choices), cmp_ignore); } /* Save the screen and clear it */ screen_save(); clear_from(0); /* Help text */ prt(format("Ignore the following %s:", desc), 0, 0); /* Run menu */ menu = menu_new(MN_SKIN_COLUMNS, &ignore_sval_menu); menu_setpriv(menu, n_choices, choices); menu->cmd_keys = "Tt"; menu_layout(menu, &area); menu_set_cursor_x_offset(menu, 1); /* Place cursor in brackets. */ menu_select(menu, 0, false); /* Free memory */ mem_free(choices); /* Load screen */ screen_load(); return true; }
/* ------------------------------------------------------------------------ * Final confirmation of character. * ------------------------------------------------------------------------ */ static enum birth_stage get_confirm_command(void) { const char *prompt = "['ESC' to step back, 'S' to start over, or any other key to continue]"; ui_event_data ke; enum birth_stage next; /* Prompt for it */ prt(prompt, Term->hgt - (mouse_buttons ? 2 : 1), Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[CONTINUE]", 'q'); button_add("[BACK]", ESCAPE); button_add("[START OVER]", 'S'); handle_stuff(); event_signal(EVENT_MOUSEBUTTONS); /* Get a key */ ke = inkey_ex(); /* Start over */ if (ke.key == 'S' || ke.key == 's') { next = BIRTH_RESET; } else if (ke.key == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.key == ESCAPE) { next = BIRTH_BACK; } else { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } /* Buttons */ button_kill_all(); handle_stuff(); event_signal(EVENT_MOUSEBUTTONS); /* Clear prompt */ clear_from(23); return next; }
/** * Create Spoiler files */ void do_cmd_spoilers(void) { if (!spoil_menu) { spoil_menu = menu_new_action(spoil_actions, N_ELEMENTS(spoil_actions)); spoil_menu->selections = lower_case; spoil_menu->title = "Create spoilers"; } screen_save(); clear_from(0); menu_layout(spoil_menu, &SCREEN_REGION); menu_select(spoil_menu, 0, false); screen_load(); }
/* ------------------------------------------------------------------------ * Final confirmation of character. * ------------------------------------------------------------------------ */ static enum birth_stage get_confirm_command(void) { const char *prompt = "['ESC' to step back, 'S' to start over, or any other key to continue]"; struct keypress ke; enum birth_stage next; /* Prompt for it */ prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[Continue]", 'q'); button_add("[ESC]", ESCAPE); button_add("[S]", 'S'); redraw_stuff(p_ptr); /* Get a key */ ke = inkey(); /* Start over */ if (ke.code == 'S' || ke.code == 's') { next = BIRTH_RESET; } else if (ke.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.code == ESCAPE) { next = BIRTH_BACK; } else { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } /* Buttons */ button_kill_all(); redraw_stuff(p_ptr); /* Clear prompt */ clear_from(23); return next; }
static void wiz_gf_demo(void) { menu_type *m = menu_new(MN_SKIN_SCROLL, &gf_iter); region loc = { 0, 0, 0, 0 }; menu_setpriv(m, GF_MAX, NULL); m->title = "GF_ types display"; menu_layout(m, &loc); screen_save(); clear_from(0); menu_select(m, 0, FALSE); screen_load(); }
/* * Display list of svals to be squelched. */ static bool sval_menu(int tval, const char *desc) { menu_type *menu; region area = { 1, 2, -1, -1 }; squelch_choice *choices; int n_choices = squelch_collect_kind(tval, &choices); if (!n_choices) return false; /* sort by name in squelch menus except for categories of items that are aware from the start */ switch (tval) { case TV_LIGHT: case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: case TV_DRAG_ARMOR: case TV_GOLD: /* leave sorted by sval */ break; default: /* sort by name */ sort(choices, n_choices, sizeof(*choices), cmp_squelch); } /* Save the screen and clear it */ screen_save(); clear_from(0); /* Help text */ prt(format("Squelch the following %s:", desc), 0, 0); /* Run menu */ menu = menu_new(MN_SKIN_COLUMNS, &squelch_sval_menu); menu_setpriv(menu, n_choices, choices); menu_layout(menu, &area); menu_select(menu, 0, false); /* Free memory */ FREE(choices); /* Load screen */ screen_load(); return true; }
/* * Choose and create an instance of an object kind */ static void wiz_create_item(void) { menu_type *menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_menu); menu->selections = all_letters; menu->title = "What kind of object?"; screen_save(); clear_from(0); menu_setpriv(menu, N_ELEMENTS(tvals), tvals); menu_layout(menu, &wiz_create_item_area); menu_select(menu, 0); screen_load(); }
/** * Interact with some options */ static void option_toggle_menu(const char *name, int page) { int i; struct menu *m = menu_new(MN_SKIN_SCROLL, &option_toggle_iter); /* for all menus */ m->prompt = "Set option (y/n/t), '?' for information"; m->cmd_keys = "?YyNnTt"; m->selections = "abcdefghijklmopqrsuvwxz"; m->flags = MN_DBL_TAP; /* We add 10 onto the page amount to indicate we're at birth */ if (page == OPT_PAGE_BIRTH) { m->prompt = "You can only modify these options at character birth. '?' for information"; m->cmd_keys = "?"; m->flags = MN_NO_TAGS; } else if (page == OPT_PAGE_BIRTH + 10) { page -= 10; } /* for this particular menu */ m->title = name; /* Find the number of valid entries */ for (i = 0; i < OPT_PAGE_PER; i++) { if (option_page[page][i] == OPT_none) break; } /* Set the data to the player's options */ menu_setpriv(m, OPT_MAX, &op_ptr->opt); menu_set_filter(m, option_page[page], i); menu_layout(m, &SCREEN_REGION); /* Run the menu */ screen_save(); clear_from(0); menu_select(m, 0, false); screen_load(); mem_free(m); }
static bool wiz_create_item_action(menu_type *m, const ui_event *e, int oid) { ui_event ret; menu_type *menu; char buf[80]; object_kind *choice[60]; int n_choices; int i; if (e->type != EVT_SELECT) return TRUE; for (n_choices = 0, i = 1; (n_choices < 60) && (i < z_info->k_max); i++) { object_kind *kind = &k_info[i]; if (kind->tval != oid || of_has(kind->flags, OF_INSTA_ART)) continue; choice[n_choices++] = kind; } screen_save(); clear_from(0); menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_submenu); menu->selections = all_letters; object_base_name(buf, sizeof buf, oid, TRUE); menu->title = string_make(format("What kind of %s?", buf)); menu_setpriv(menu, n_choices, choice); menu_layout(menu, &wiz_create_item_area); ret = menu_select(menu, 0, FALSE); screen_load(); string_free((char *)menu->title); return (ret.type == EVT_ESCAPE); }
/* * Display and handle the main squelching menu. */ void do_cmd_options_item(void *unused, cptr title) { menu_type menu; menu_init(&menu, MN_SKIN_SCROLL, &options_item_iter); menu_setpriv(&menu, N_ELEMENTS(sval_dependent) + N_ELEMENTS(extra_item_options) + 1, NULL); menu.title = title; menu_layout(&menu, &SCREEN_REGION); screen_save(); clear_from(0); menu_select(&menu, 0); screen_load(); p_ptr->notice |= PN_SQUELCH; return; }
/** * Show spell long description when browsing */ static void gain_spec_menu_browser(int oid, void *data, const region *loc) { struct spec_menu_data *d = data; /* Redirect output to the screen */ text_out_hook = text_out_to_screen; text_out_wrap = 0; text_out_indent = loc->col - 1; text_out_pad = 1; clear_from(loc->row + loc->page_rows); Term_gotoxy(loc->col, loc->row + loc->page_rows); text_out_to_screen(TERM_DEEP_L_BLUE, (char *) abilities[d->specialties[oid]].desc); /* XXX */ text_out_pad = 0; text_out_indent = 0; }
/** * Display the options main menu. */ void do_cmd_options(void) { if (!option_menu) { /* Main option menu */ option_menu = menu_new_action(option_actions, N_ELEMENTS(option_actions)); option_menu->title = "Options Menu"; option_menu->flags = MN_CASELESS_TAGS; } screen_save(); clear_from(0); menu_layout(option_menu, &SCREEN_REGION); menu_select(option_menu, 0, false); screen_load(); }
/* * Display and handle the main squelching menu. */ void do_cmd_options_item(const char *title, int row) { menu_type menu; menu_init(&menu, MN_SKIN_SCROLL, &options_item_iter); menu_setpriv(&menu, N_ELEMENTS(sval_dependent) + N_ELEMENTS(extra_item_options) + 1, null); menu.title = title; menu_layout(&menu, &SCREEN_REGION); screen_save(); clear_from(0); menu_select(&menu, 0, false); screen_load(); p_ptr.notice |= PN_SQUELCH; return; }
void ud__kingly() { /*{ Change the player into a King! -RAK- }*/ /* { Change the character attributes... }*/ dun_level = 0; strcpy(died_from, "Ripe Old Age"); if ( characters_sex() == MALE ) { strcpy(PM.title, "Magnificent"); strcat(PM.tclass, " King"); } else { strcpy(PM.title, "Beautiful"); strcat(PM.tclass, " Queen"); } PM.lev += MAX_PLAYER_LEVEL; PM.account += 250000; PM.max_exp += 5000000; PM.exp = PM.max_exp; /*{ Let the player know that he did good... }*/ clear_from(1); dprint(" #",2); dprint(" #####",3); dprint(" #",4); dprint(" ,,, $$$ ,,,",5); dprint(" ,,=$ \"$$$$$\" $=,,",6); dprint(" ,$$ $$$ $$,",7); dprint(" *> <*> <*",8); dprint(" $$ $$$ $$",9); dprint(" \"$$ $$$ $$\"",10); dprint(" \"$$ $$$ $$\"",11); dprint(" *#########*#########*",12); dprint(" *#########*#########*",13); dprint(" Veni, Vidi, Vici!",16); dprint(" I came, I saw, I conquered!",17); dprint(" All Hail the Mighty King!",18); flush(); pause_game(24); };
/** * Interact with "colors" */ static void do_cmd_colors(const char *title, int row) { screen_save(); clear_from(0); if (!color_menu) { color_menu = menu_new_action(color_events, N_ELEMENTS(color_events)); color_menu->title = title; color_menu->selections = lower_case; color_menu->browse_hook = colors_browse_hook; } menu_layout(color_menu, &SCREEN_REGION); menu_select(color_menu, 0, false); screen_load(); }