From: Pasi Kallinen Date: Sat, 30 Jan 2021 16:02:48 +0000 (+0200) Subject: Move other options into the options array X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10cd5af500d23b764404eaa3fd0b133087a37583;p=nethack Move other options into the options array --- diff --git a/include/optlist.h b/include/optlist.h index 0b9b066b4..be6c0f54c 100644 --- a/include/optlist.h +++ b/include/optlist.h @@ -13,7 +13,7 @@ */ static int optfn_boolean(int, int, boolean, char *, char *); -enum OptType {BoolOpt, CompOpt}; +enum OptType {BoolOpt, CompOpt, OthrOpt}; enum Y_N {No, Yes}; enum Off_On {Off, On}; @@ -48,6 +48,8 @@ struct allopt_t { static int optfn_##a(int, int, boolean, char *, char *); #define NHOPTP(a, b, c, s, n, v, d, h, al, z) \ static int pfxfn_##a(int, int, boolean, char *, char *); +#define NHOPTO(m, a, b, c, s, n, v, d, al, z) \ +static int optfn_##a(int, int, boolean, char *, char *); #elif defined(NHOPT_ENUM) #define NHOPTB(a, b, c, s, i, n, v, d, al, bp) \ @@ -56,6 +58,8 @@ opt_##a, opt_##a, #define NHOPTP(a, b, c, s, n, v, d, h, al, z) \ pfx_##a, +#define NHOPTO(m, a, b, c, s, n, v, d, al, z) \ +opt_##a, #elif defined(NHOPT_PARSE) #define NHOPTB(a, b, c, s, i, n, v, d, al, bp) \ @@ -67,6 +71,9 @@ pfx_##a, #define NHOPTP(a, b, c, s, n, v, d, h, al, z) \ { #a, 0, b, pfx_##a, s, CompOpt, n, v, d, Yes, c, (boolean *) 0, &pfxfn_##a, \ al, z, #a, Off, h, 0 }, +#define NHOPTO(m, a, b, c, s, n, v, d, al, z) \ +{ m, 0, b, opt_##a, s, OthrOpt, n, v, d, No, c, (boolean *) 0, &optfn_##a, \ + al, z, (const char *) 0, On, On, 0 }, #endif /* B:nm, ln, opt_*, setwhere?, on?, negat?, val?, dup?, hndlr? Alias, bool_p */ @@ -537,6 +544,19 @@ pfx_##a, &iflags.wizweight) NHOPTB(wraptext, 0, opt_in, set_in_game, Off, Yes, No, No, NoAlias, &iflags.wc2_wraptext) + + NHOPTO("autopickup exceptions", o_autopickup_exceptions, BUFSZ, opt_in, set_in_game, + No, Yes, No, NoAlias, "edit autopickup exceptions") + NHOPTO("menu colors", o_menu_colors, BUFSZ, opt_in, set_in_game, + No, Yes, No, NoAlias, "edit menu colors") + NHOPTO("message types", o_message_types, BUFSZ, opt_in, set_in_game, + No, Yes, No, NoAlias, "edit message types") + NHOPTO("status condition fields", o_status_cond, BUFSZ, opt_in, set_in_game, + No, Yes, No, NoAlias, "edit status condition fields") +#ifdef STATUS_HILITES + NHOPTO("status hilite rules", o_status_hilites, BUFSZ, opt_in, set_in_game, + No, Yes, No, NoAlias, "edit status hilites") +#endif /* * Prefix-based Options */ @@ -555,6 +575,7 @@ pfx_##a, #undef NHOPTB #undef NHOPTC #undef NHOPTP +#undef NHOPTO #endif /* NHOPT_PROTO || NHOPT_ENUM || NHOPT_PARSE */ diff --git a/src/options.c b/src/options.c index 483ae77e8..e45a17415 100644 --- a/src/options.c +++ b/src/options.c @@ -249,7 +249,6 @@ static int count_menucolors(void); static boolean parse_role_opts(int, boolean, const char *, char *, char **); static void doset_add_menu(winid, const char *, int, int); -static void opts_add_others(winid, const char *, int, char *, int); static int handle_add_list_remove(const char *, int); static void remove_autopickup_exception(struct autopickup_exception *); static int count_apes(void); @@ -6971,31 +6970,119 @@ static char fmtstr_doset[] = "%s%-15s [%s] "; static char fmtstr_doset_tab[] = "%s\t[%s]"; static char n_currently_set[] = "(%d currently set)"; -enum opt_other_enums { - OPT_OTHER_COND = -5, - OPT_OTHER_MSGTYPE = -4, - OPT_OTHER_MENUCOLOR = -3, - OPT_OTHER_STATHILITE = -2, - OPT_OTHER_APEXC = -1 - /* these must be < 0 */ -}; +static int +optfn_o_autopickup_exceptions(int optidx UNUSED, int req, boolean negated UNUSED, + char *opts, char *op UNUSED) +{ + if (req == do_init) { + return optn_ok; + } + if (req == do_set) { + } + if (req == get_val) { + if (!opts) + return optn_err; + Sprintf(opts, n_currently_set, count_apes()); + return optn_ok; + } + if (req == do_handler) { + return handler_autopickup_exception(); + } + return optn_ok; +} + +static int +optfn_o_menu_colors(int optidx UNUSED, int req, boolean negated UNUSED, + char *opts, char *op UNUSED) +{ + if (req == do_init) { + return optn_ok; + } + if (req == do_set) { + } + if (req == get_val) { + if (!opts) + return optn_err; + Sprintf(opts, n_currently_set, count_menucolors()); + return optn_ok; + } + if (req == do_handler) { + return handler_menu_colors(); + } + return optn_ok; +} + +static int +optfn_o_message_types(int optidx UNUSED, int req, boolean negated UNUSED, + char *opts, char *op UNUSED) +{ + if (req == do_init) { + return optn_ok; + } + if (req == do_set) { + } + if (req == get_val) { + if (!opts) + return optn_err; + Sprintf(opts, n_currently_set, msgtype_count()); + return optn_ok; + } + if (req == do_handler) { + return handler_msgtype(); + } + return optn_ok; +} + +static int +optfn_o_status_cond(int optidx UNUSED, int req, boolean negated UNUSED, + char *opts, char *op UNUSED) +{ + if (req == do_init) { + return optn_ok; + } + if (req == do_set) { + } + if (req == get_val) { + if (!opts) + return optn_err; + Sprintf(opts, n_currently_set, count_cond()); + return optn_ok; + } + if (req == do_handler) { + cond_menu(); + return optn_ok; + } + return optn_ok; +} -static struct other_opts { - const char *name; - enum optset_restrictions setwhere; - enum opt_other_enums code; - int (*othr_count_func)(void); -} othropt[] = { - { "autopickup exceptions", set_in_game, OPT_OTHER_APEXC, count_apes }, - { "menu colors", set_in_game, OPT_OTHER_MENUCOLOR, count_menucolors }, - { "message types", set_in_game, OPT_OTHER_MSGTYPE, msgtype_count }, - { "status condition fields", set_in_game, OPT_OTHER_COND, count_cond }, #ifdef STATUS_HILITES - { "status hilite rules", set_in_game, OPT_OTHER_STATHILITE, - count_status_hilites }, -#endif - { (char *) 0, 0, (enum opt_other_enums) 0 }, -}; +static int +optfn_o_status_hilites(int optidx UNUSED, int req, boolean negated UNUSED, + char *opts, char *op UNUSED) +{ + if (req == do_init) { + return optn_ok; + } + if (req == do_set) { + } + if (req == get_val) { + if (!opts) + return optn_err; + Sprintf(opts, n_currently_set, count_status_hilites()); + return optn_ok; + } + if (req == do_handler) { + if (!status_hilite_menu()) { + return optn_err; /*pline("Bad status hilite(s) specified.");*/ + } else { + if (wc2_supported("hilite_status")) + preference_update("hilite_status"); + } + return optn_ok; + } + return optn_ok; +} +#endif /*STATUS_HILITES*/ /* the 'O' command */ int @@ -7030,14 +7117,12 @@ doset(void) /* changing options via menu by Per Liboriussen */ /* spin through the options to find the longest name and adjust the format string accordingly */ longest_name_len = 0; - for (pass = 0; pass <= 2; pass++) - for (i = 0; (name = ((pass < 2) ? allopt[i].name - : othropt[i].name)) != 0; i++) { + for (pass = 0; pass < 2; pass++) + for (i = 0; (name = allopt[i].name) != 0; i++) { if (pass == 0 && (allopt[i].opttyp != BoolOpt || !allopt[i].addr)) continue; - optflags = (pass < 2) ? allopt[i].setwhere - : othropt[i].setwhere; + optflags = allopt[i].setwhere; if (optflags < startpass || optflags > endpass) continue; if ((is_wc_option(name) && !wc_supported(name)) @@ -7121,13 +7206,19 @@ doset(void) /* changing options via menu by Per Liboriussen */ add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, iflags.menu_headings, "Other settings:", MENU_ITEMFLAGS_NONE); - for (i = 0; (name = othropt[i].name) != 0; i++) { - if ((is_wc_option(name) && !wc_supported(name)) - || (is_wc2_option(name) && !wc2_supported(name))) - continue; - opts_add_others(tmpwin, name, othropt[i].code, - (char *) 0, othropt[i].othr_count_func()); - } + for (pass = startpass; pass <= endpass; pass++) + for (i = 0; (name = allopt[i].name) != 0; i++) { + if (allopt[i].opttyp != OthrOpt) + continue; + if ((int) allopt[i].setwhere == pass) { + if ((is_wc_option(name) && !wc_supported(name)) + || (is_wc2_option(name) && !wc2_supported(name))) + continue; + + doset_add_menu(tmpwin, name, i, + (pass == set_gameview) ? 0 : indexoffset); + } + } #ifdef PREFIXES_IN_USE any = cg.zeroany; @@ -7152,56 +7243,37 @@ doset(void) /* changing options via menu by Per Liboriussen */ opt_indx = pick_list[pick_idx].item.a_int - 1; if (opt_indx < -1) opt_indx++; /* -1 offset for select_menu() */ - if (opt_indx == OPT_OTHER_APEXC) { - handler_autopickup_exception(); -#ifdef STATUS_HILITES - } else if (opt_indx == OPT_OTHER_STATHILITE) { - if (!status_hilite_menu()) { - pline("Bad status hilite(s) specified."); - } else { - if (wc2_supported("hilite_status")) - preference_update("hilite_status"); - } -#endif - } else if (opt_indx == OPT_OTHER_MENUCOLOR) { - handler_menu_colors(); - } else if (opt_indx == OPT_OTHER_COND) { - cond_menu(); - } else if (opt_indx == OPT_OTHER_MSGTYPE) { - handler_msgtype(); + opt_indx -= indexoffset; + if (allopt[opt_indx].opttyp == BoolOpt) { + /* boolean option */ + Sprintf(buf, "%s%s", *allopt[opt_indx].addr ? "!" : "", + allopt[opt_indx].name); + (void) parseoptions(buf, setinitial, fromfile); } else { - opt_indx -= indexoffset; - if (allopt[opt_indx].opttyp == BoolOpt) { - /* boolean option */ - Sprintf(buf, "%s%s", *allopt[opt_indx].addr ? "!" : "", - allopt[opt_indx].name); - (void) parseoptions(buf, setinitial, fromfile); + /* compound option */ + int k = opt_indx, reslt UNUSED; + + if (allopt[k].has_handler && allopt[k].optfn) { + reslt = (*allopt[k].optfn)(allopt[k].idx, do_handler, + FALSE, empty_optstr, empty_optstr); } else { - /* compound option */ - int k = opt_indx, reslt UNUSED; - - if (allopt[k].has_handler && allopt[k].optfn) { - reslt = (*allopt[k].optfn)(allopt[k].idx, do_handler, - FALSE, empty_optstr, empty_optstr); - } else { - char abuf[BUFSZ]; - - Sprintf(buf, "Set %s to what?", allopt[opt_indx].name); - abuf[0] = '\0'; - getlin(buf, abuf); - if (abuf[0] == '\033') - continue; - Sprintf(buf, "%s:", allopt[opt_indx].name); - (void) strncat(eos(buf), abuf, + char abuf[BUFSZ]; + + Sprintf(buf, "Set %s to what?", allopt[opt_indx].name); + abuf[0] = '\0'; + getlin(buf, abuf); + if (abuf[0] == '\033') + continue; + Sprintf(buf, "%s:", allopt[opt_indx].name); + (void) strncat(eos(buf), abuf, (sizeof buf - 1 - strlen(buf))); - /* pass the buck */ - (void) parseoptions(buf, setinitial, fromfile); - } + /* pass the buck */ + (void) parseoptions(buf, setinitial, fromfile); } - if (wc_supported(allopt[opt_indx].name) - || wc2_supported(allopt[opt_indx].name)) - preference_update(allopt[opt_indx].name); } + if (wc_supported(allopt[opt_indx].name) + || wc2_supported(allopt[opt_indx].name)) + preference_update(allopt[opt_indx].name); } free((genericptr_t) pick_list), pick_list = (menu_item *) 0; } @@ -7268,26 +7340,6 @@ doset_add_menu(winid win, /* window to add to */ ATR_NONE, buf, MENU_ITEMFLAGS_NONE); } -static void -opts_add_others(winid win, const char *name, int id, char *bufx, int nset) -{ - char buf[BUFSZ], buf2[BUFSZ]; - anything any = cg.zeroany; - - any.a_int = id; - if (!bufx) - Sprintf(buf2, n_currently_set, nset); - else - Sprintf(buf2, "%s", bufx); - if (!iflags.menu_tab_sep) - Sprintf(buf, fmtstr_doset, any.a_int ? "" : " ", - name, buf2); - else - Sprintf(buf, fmtstr_doset_tab, name, buf2); - add_menu(win, &nul_glyphinfo, &any, 0, 0, - ATR_NONE, buf, MENU_ITEMFLAGS_NONE); -} - /* display keys for menu actions; used by cmd.c '?i' and pager.c '?k' */ void show_menu_controls(winid win, boolean dolist) @@ -7772,12 +7824,17 @@ option_help(void) } putstr(datawin, 0, ""); + /* Compound options */ putstr(datawin, 0, "Other settings:"); - for (i = 0; othropt[i].name; ++i) { - Sprintf(buf, " %s", othropt[i].name); + for (i = 0; allopt[i].name; i++) { + if (allopt[i].opttyp != OthrOpt) + continue; + Sprintf(buf, " %s", allopt[i].name); putstr(datawin, 0, buf); } + putstr(datawin, 0, ""); + for (i = 0; opt_epilog[i]; i++) putstr(datawin, 0, opt_epilog[i]);