int dosave(void) { int n, selected[1]; struct menulist menu; init_menulist(&menu); add_menuitem(&menu, 1, "Quicksave and exit the game", 'y', FALSE); add_menuitem(&menu, 2, "Abandon this game and delete its save file", '!', FALSE); add_menuitem(&menu, 3, "Continue playing", 'n', FALSE); n = display_menu(menu.items, menu.icount, "Do you want to stop playing?", PICK_ONE, PLHINT_URGENT, selected); free(menu.items); if (n) n = selected[0]; else n = 3; if (n == 3) { if (multi > 0) nomul(0, NULL); } else if (n == 1) { pline("Saving..."); if (dosave0(FALSE)) { program_state.something_worth_saving = 0; u.uhp = -1; /* universal game's over indicator */ terminate(); } else doredraw(); } else if (n == 2) { return done2(); } return 0; }
int do_naming(void) { int n, selected[1]; struct obj *obj; static const char allowall[] = {ALL_CLASSES, 0}; struct menulist menu; init_menulist(&menu); add_menuitem(&menu, 1, "Name a monster", 'C', FALSE); add_menuitem(&menu, 2, "Name the current level", 'f', FALSE); add_menuitem(&menu, 3, "Name an individual item", 'y', FALSE); add_menuitem(&menu, 4, "Name all items of a certain type", 'n', FALSE); n = display_menu(menu.items, menu.icount, "What do you wish to name?", PICK_ONE, selected); free(menu.items); if (n) n = selected[0] - 1; else return 0; switch (n) { default: break; case 0: do_mname(); break; case 1: donamelevel(); break; /* cases 2 & 3 duplicated from ddocall() */ case 2: obj = getobj(allowall, "name"); if(obj) do_oname(obj); break; case 3: obj = getobj(callable, "call"); if (obj) { /* behave as if examining it in inventory; * this might set dknown if it was picked up * while blind and the hero can now see */ xname(obj); if (!obj->dknown) { pline("You would never recognize another one."); return 0; } docall(obj); } break; } return 0; }
/** @copydoc widgetdata::menu_handle_func */ static int widget_menu_handle(widgetdata *widget, SDL_Event *event) { widgetdata *menu = create_menu(event->motion.x, event->motion.y, widget); widget_menu_standard_items(widget, menu); add_menuitem(menu, "Display >", &menu_network_graph_display, MENU_SUBMENU, 0); add_menuitem(menu, "Filters >", &menu_network_graph_filters, MENU_SUBMENU, 0); menu_finalize(menu); return 1; }
static void menu_network_graph_filters(widgetdata *widget, widgetdata *menuitem, SDL_Event *event) { network_graph_widget_t *network_graph = widget->subwidget; widgetdata *submenu = MENU(menuitem->env)->submenu; for (int i = 0; i < NETWORK_GRAPH_TRAFFIC_MAX; i++) { add_menuitem(submenu, network_graph_filters[i], &menu_network_graph_filters_change, MENU_CHECKBOX, BIT_QUERY(network_graph->filters, i)); } }
static void menu_network_graph_display(widgetdata *widget, widgetdata *menuitem, SDL_Event *event) { network_graph_widget_t *network_graph = widget->subwidget; widgetdata *submenu = MENU(menuitem->env)->submenu; for (int i = 0; i < NETWORK_GRAPH_TYPE_MAX; i++) { add_menuitem(submenu, network_graph_types[i], &menu_network_graph_display_change, MENU_RADIO, network_graph->type == i); } }
int do_naming(const struct nh_cmd_arg *arg) { int n; const int *selected; char classes[20], *s; struct nh_menulist menu; (void) arg; init_menulist(&menu); /* group_accel settings are for keystroke-compatibility with nethack.alt.org (which uses a/b/c/d); they shouldn't show in the interface because there's no good reason to use them other than muscle memory */ add_menuitem(&menu, 1, "Name a monster", 'C', FALSE); menu.items[menu.icount-1].group_accel = 'a'; add_menuitem(&menu, 2, "Name an individual item", 'y', FALSE); menu.items[menu.icount-1].group_accel = 'b'; add_menuitem(&menu, 3, "Name all items of a certain type", 'n', FALSE); menu.items[menu.icount-1].group_accel = 'c'; add_menuitem(&menu, 4, "Name an item type by appearance", 'A', FALSE); add_menuitem(&menu, 5, "Name the current level", 'f', FALSE); if (flags.recently_broken_otyp != STRANGE_OBJECT) { const char *buf; buf = msgprintf("Name %s (recently broken)", an(obj_typename(flags.recently_broken_otyp))); add_menuitem(&menu, 6, buf, 'V', FALSE); } n = display_menu(&menu, "What do you wish to name?", PICK_ONE, PLHINT_ANYWHERE, &selected); if (n > 0) n = selected[0] - 1; else return 0; switch (n) { default: break; case 0: do_mname(&(struct nh_cmd_arg){.argtype = 0}); break; case 1: do_oname(&(struct nh_cmd_arg){.argtype = 0});