*/
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};
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) \
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) \
#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 */
&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
*/
#undef NHOPTB
#undef NHOPTC
#undef NHOPTP
+#undef NHOPTO
#endif /* NHOPT_PROTO || NHOPT_ENUM || NHOPT_PARSE */
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);
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
/* 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))
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;
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;
}
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)
}
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]);