options.c formatting; glob as named fruit

This started out removing one tab and I got carried away.  It moves
some labels to column 2, removes some parentheses where sizeof is
used on strings rather than types, adds or revises several comments,
replaces a couple of 'while' loops which can be simplified as 'for'
loops, and updates named fruit handling.

"glob of black pudding" became "candied glob of black pudding" if used
as a fruit name, but "small glob of black pudding" was used as-is and
became indistinguishable from an actual small glob.  Unless you had
more than one; then you could try to check whether they merged into a
stack or coalesced into a bigger glob (but if neither of those changes
happened, you still couldn't tell which was the glob and which was the
named fruit).
This commit is contained in:
PatR
2019-01-04 19:03:34 -08:00
parent c0cce3110e
commit ab5b400aec

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 options.c $NHDT-Date: 1546212618 2018/12/30 23:30:18 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.350 $ */ /* NetHack 3.6 options.c $NHDT-Date: 1546657409 2019/01/05 03:03:29 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.351 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2008. */ /*-Copyright (c) Michael Allison, 2008. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -279,7 +279,7 @@ static struct Comp_Opt {
{ "catname", "the name of your (first) cat (e.g., catname:Tabby)", { "catname", "the name of your (first) cat (e.g., catname:Tabby)",
PL_PSIZ, DISP_IN_GAME }, PL_PSIZ, DISP_IN_GAME },
{ "disclose", "the kinds of information to disclose at end of game", { "disclose", "the kinds of information to disclose at end of game",
sizeof(flags.end_disclose) * 2, SET_IN_GAME }, sizeof flags.end_disclose * 2, SET_IN_GAME },
{ "dogname", "the name of your (first) dog (e.g., dogname:Fang)", PL_PSIZ, { "dogname", "the name of your (first) dog (e.g., dogname:Fang)", PL_PSIZ,
DISP_IN_GAME }, DISP_IN_GAME },
{ "dungeon", "the symbols to use in drawing the dungeon map", { "dungeon", "the symbols to use in drawing the dungeon map",
@@ -720,7 +720,7 @@ initoptions_init()
#endif #endif
#ifdef SYSFLAGS #ifdef SYSFLAGS
Strcpy(sysflags.sysflagsid, "sysflags"); Strcpy(sysflags.sysflagsid, "sysflags");
sysflags.sysflagsid[9] = (char) sizeof(struct sysflag); sysflags.sysflagsid[9] = (char) sizeof (struct sysflag);
#endif #endif
flags.end_own = FALSE; flags.end_own = FALSE;
flags.end_top = 3; flags.end_top = 3;
@@ -908,6 +908,8 @@ int maxlen;
/* /*
* escapes(): escape expansion for showsyms. C-style escapes understood * escapes(): escape expansion for showsyms. C-style escapes understood
* include \n, \b, \t, \r, \xnnn (hex), \onnn (octal), \nnn (decimal). * include \n, \b, \t, \r, \xnnn (hex), \onnn (octal), \nnn (decimal).
* (Note: unlike in C, leading digit 0 is not used to indicate octal;
* the letter o (either upper or lower case) is used for that.
* The ^-prefix for control characters is also understood, and \[mM] * The ^-prefix for control characters is also understood, and \[mM]
* has the effect of 'meta'-ing the value which follows (so that the * has the effect of 'meta'-ing the value which follows (so that the
* alternate character set will be enabled). * alternate character set will be enabled).
@@ -1013,7 +1015,7 @@ const char *optname;
/* /*
# errors: # errors:
OPTIONS=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa OPTIONS=aaaaaaaaaa[ more than 247 (255 - 8 for 'OPTIONS=') total ]aaaaaaaaaa
OPTIONS OPTIONS
OPTIONS= OPTIONS=
MSGTYPE=stop"You swap places with " MSGTYPE=stop"You swap places with "
@@ -1386,7 +1388,7 @@ char *str;
/* allow "lightblue", "light blue", and "light-blue" to match "light blue" /* allow "lightblue", "light blue", and "light-blue" to match "light blue"
(also junk like "_l i-gh_t---b l u e" but we won't worry about that); (also junk like "_l i-gh_t---b l u e" but we won't worry about that);
also copes with trailing space; mungspaces removed any leading space */ also copes with trailing space; caller has removed any leading space */
for (i = 0; i < SIZE(colornames); i++) for (i = 0; i < SIZE(colornames); i++)
if (colornames[i].name if (colornames[i].name
&& fuzzymatch(str, colornames[i].name, " -_", TRUE)) { && fuzzymatch(str, colornames[i].name, " -_", TRUE)) {
@@ -1613,8 +1615,7 @@ msgtype_add(typ, pattern)
int typ; int typ;
char *pattern; char *pattern;
{ {
struct plinemsg_type struct plinemsg_type *tmp = (struct plinemsg_type *) alloc(sizeof *tmp);
*tmp = (struct plinemsg_type *) alloc(sizeof (struct plinemsg_type));
tmp->msgtype = typ; tmp->msgtype = typ;
tmp->regex = regex_init(); tmp->regex = regex_init();
@@ -1785,7 +1786,7 @@ int c, a;
if (!str) if (!str)
return FALSE; return FALSE;
tmp = (struct menucoloring *) alloc(sizeof (struct menucoloring)); tmp = (struct menucoloring *) alloc(sizeof *tmp);
tmp->match = regex_init(); tmp->match = regex_init();
if (!regex_compile(str, tmp->match)) { if (!regex_compile(str, tmp->match)) {
config_error_add("%s: %s", re_error, regex_error_desc(tmp->match)); config_error_add("%s: %s", re_error, regex_error_desc(tmp->match));
@@ -1846,7 +1847,6 @@ char *tmpstr;
tmps++; tmps++;
} }
} }
return add_menu_coloring_parsed(tmps, c, a); return add_menu_coloring_parsed(tmps, c, a);
} }
@@ -1870,15 +1870,13 @@ int *color, *attr;
void void
free_menu_coloring() free_menu_coloring()
{ {
struct menucoloring *tmp = menu_colorings; struct menucoloring *tmp, *tmp2;
while (tmp) {
struct menucoloring *tmp2 = tmp->next;
for (tmp = menu_colorings; tmp; tmp = tmp2) {
tmp2 = tmp->next;
regex_free(tmp->match); regex_free(tmp->match);
free((genericptr_t) tmp->origstr); free((genericptr_t) tmp->origstr);
free((genericptr_t) tmp); free((genericptr_t) tmp);
tmp = tmp2;
} }
} }
@@ -1911,13 +1909,11 @@ int idx; /* 0 .. */
STATIC_OVL int STATIC_OVL int
count_menucolors(VOID_ARGS) count_menucolors(VOID_ARGS)
{ {
struct menucoloring *tmp;
int count = 0; int count = 0;
struct menucoloring *tmp = menu_colorings;
while (tmp) { for (tmp = menu_colorings; tmp; tmp = tmp->next)
count++; count++;
tmp = tmp->next;
}
return count; return count;
} }
@@ -2066,7 +2062,7 @@ boolean tinitial, tfrom_file;
/* align:string */ /* align:string */
fullname = "align"; fullname = "align";
if (match_optname(opts, fullname, sizeof("align") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "align" - 1, TRUE)) {
if (parse_role_opts(negated, fullname, opts, &op)) { if (parse_role_opts(negated, fullname, opts, &op)) {
if ((flags.initalign = str2align(op)) == ROLE_NONE) { if ((flags.initalign = str2align(op)) == ROLE_NONE) {
config_error_add("Unknown %s '%s'", fullname, op); config_error_add("Unknown %s '%s'", fullname, op);
@@ -2620,7 +2616,7 @@ boolean tinitial, tfrom_file;
} }
} }
} }
goodfruit: goodfruit:
nmcpy(pl_fruit, op, PL_FSIZ); nmcpy(pl_fruit, op, PL_FSIZ);
sanitize_name(pl_fruit); sanitize_name(pl_fruit);
/* OBJ_NAME(objects[SLIME_MOLD]) won't work for this after /* OBJ_NAME(objects[SLIME_MOLD]) won't work for this after
@@ -2793,16 +2789,16 @@ boolean tinitial, tfrom_file;
/* WINCAP /* WINCAP
* align_status:[left|top|right|bottom] */ * align_status:[left|top|right|bottom] */
fullname = "align_status"; fullname = "align_status";
if (match_optname(opts, fullname, sizeof("align_status") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "align_status" - 1, TRUE)) {
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
if (op && !negated) { if (op && !negated) {
if (!strncmpi(op, "left", sizeof("left") - 1)) if (!strncmpi(op, "left", sizeof "left" - 1))
iflags.wc_align_status = ALIGN_LEFT; iflags.wc_align_status = ALIGN_LEFT;
else if (!strncmpi(op, "top", sizeof("top") - 1)) else if (!strncmpi(op, "top", sizeof "top" - 1))
iflags.wc_align_status = ALIGN_TOP; iflags.wc_align_status = ALIGN_TOP;
else if (!strncmpi(op, "right", sizeof("right") - 1)) else if (!strncmpi(op, "right", sizeof "right" - 1))
iflags.wc_align_status = ALIGN_RIGHT; iflags.wc_align_status = ALIGN_RIGHT;
else if (!strncmpi(op, "bottom", sizeof("bottom") - 1)) else if (!strncmpi(op, "bottom", sizeof "bottom" - 1))
iflags.wc_align_status = ALIGN_BOTTOM; iflags.wc_align_status = ALIGN_BOTTOM;
else { else {
config_error_add("Unknown %s parameter '%s'", fullname, op); config_error_add("Unknown %s parameter '%s'", fullname, op);
@@ -2818,18 +2814,18 @@ boolean tinitial, tfrom_file;
/* WINCAP /* WINCAP
* align_message:[left|top|right|bottom] */ * align_message:[left|top|right|bottom] */
fullname = "align_message"; fullname = "align_message";
if (match_optname(opts, fullname, sizeof("align_message") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "align_message" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
if (op && !negated) { if (op && !negated) {
if (!strncmpi(op, "left", sizeof("left") - 1)) if (!strncmpi(op, "left", sizeof "left" - 1))
iflags.wc_align_message = ALIGN_LEFT; iflags.wc_align_message = ALIGN_LEFT;
else if (!strncmpi(op, "top", sizeof("top") - 1)) else if (!strncmpi(op, "top", sizeof "top" - 1))
iflags.wc_align_message = ALIGN_TOP; iflags.wc_align_message = ALIGN_TOP;
else if (!strncmpi(op, "right", sizeof("right") - 1)) else if (!strncmpi(op, "right", sizeof "right" - 1))
iflags.wc_align_message = ALIGN_RIGHT; iflags.wc_align_message = ALIGN_RIGHT;
else if (!strncmpi(op, "bottom", sizeof("bottom") - 1)) else if (!strncmpi(op, "bottom", sizeof "bottom" - 1))
iflags.wc_align_message = ALIGN_BOTTOM; iflags.wc_align_message = ALIGN_BOTTOM;
else { else {
config_error_add("Unknown %s parameter '%s'", fullname, op); config_error_add("Unknown %s parameter '%s'", fullname, op);
@@ -2883,7 +2879,7 @@ boolean tinitial, tfrom_file;
pp = index(op, ' '); pp = index(op, ' ');
if (pp) if (pp)
*pp = '\0'; *pp = '\0';
/* we aren't matching option names but match_optname /* we aren't matching option names but match_optname()
does what we want once we've broken the space does what we want once we've broken the space
delimited aggregate into separate tokens */ delimited aggregate into separate tokens */
for (i = 0; i < SIZE(paranoia); ++i) { for (i = 0; i < SIZE(paranoia); ++i) {
@@ -2968,8 +2964,8 @@ boolean tinitial, tfrom_file;
/* types of objects to pick up automatically */ /* types of objects to pick up automatically */
fullname = "pickup_types"; fullname = "pickup_types";
if (match_optname(opts, fullname, 8, TRUE)) { if (match_optname(opts, fullname, 8, TRUE)) {
char ocl[MAXOCLASSES + 1], tbuf[MAXOCLASSES + 1], qbuf[QBUFSZ], char ocl[MAXOCLASSES + 1], tbuf[MAXOCLASSES + 1],
abuf[BUFSZ] = DUMMY; qbuf[QBUFSZ], abuf[BUFSZ];
int oc_sym; int oc_sym;
boolean badopt = FALSE, compat = (strlen(opts) <= 6), use_menu; boolean badopt = FALSE, compat = (strlen(opts) <= 6), use_menu;
@@ -2995,6 +2991,7 @@ boolean tinitial, tfrom_file;
use_menu = FALSE; use_menu = FALSE;
Sprintf(qbuf, "New %s: [%s am] (%s)", fullname, ocl, Sprintf(qbuf, "New %s: [%s am] (%s)", fullname, ocl,
*tbuf ? tbuf : "all"); *tbuf ? tbuf : "all");
abuf[0] = '\0';
getlin(qbuf, abuf); getlin(qbuf, abuf);
wasspace = (abuf[0] == ' '); /* before mungspaces */ wasspace = (abuf[0] == ' '); /* before mungspaces */
op = mungspaces(abuf); op = mungspaces(abuf);
@@ -3004,6 +3001,8 @@ boolean tinitial, tfrom_file;
op = tbuf; /* restore */ op = tbuf; /* restore */
else if (abuf[0] == 'm') else if (abuf[0] == 'm')
use_menu = TRUE; use_menu = TRUE;
/* note: abuf[0]=='a' is already handled via clearing the
the old value (above) as a default action */
} }
if (use_menu) { if (use_menu) {
if (wizard && !index(ocl, VENOM_SYM)) if (wizard && !index(ocl, VENOM_SYM))
@@ -3087,18 +3086,18 @@ boolean tinitial, tfrom_file;
} }
/* WINCAP /* WINCAP
* player_selection: dialog | prompts */ * player_selection: dialog | prompt/prompts/prompting */
fullname = "player_selection"; fullname = "player_selection";
if (match_optname(opts, fullname, sizeof("player_selection") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "player_selection" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
if (op && !negated) { if (op && !negated) {
if (!strncmpi(op, "dialog", sizeof("dialog") - 1)) if (!strncmpi(op, "dialog", sizeof "dialog" - 1)) {
iflags.wc_player_selection = VIA_DIALOG; iflags.wc_player_selection = VIA_DIALOG;
else if (!strncmpi(op, "prompt", sizeof("prompt") - 1)) } else if (!strncmpi(op, "prompt", sizeof "prompt" - 1)) {
iflags.wc_player_selection = VIA_PROMPTS; iflags.wc_player_selection = VIA_PROMPTS;
else { } else {
config_error_add("Unknown %s parameter '%s'", fullname, op); config_error_add("Unknown %s parameter '%s'", fullname, op);
return FALSE; return FALSE;
} }
@@ -3120,11 +3119,13 @@ boolean tinitial, tfrom_file;
* end_disclose[NUM_DISCLOSURE_OPT]; * end_disclose[NUM_DISCLOSURE_OPT];
* with option settings for the each of the following: * with option settings for the each of the following:
* iagvc [see disclosure_options in decl.c]: * iagvc [see disclosure_options in decl.c]:
* Legal setting values in that array are: * Allowed setting values in that array are:
* DISCLOSE_PROMPT_DEFAULT_YES ask with default answer yes * DISCLOSE_PROMPT_DEFAULT_YES ask with default answer yes
* DISCLOSE_PROMPT_DEFAULT_NO ask with default answer no * DISCLOSE_PROMPT_DEFAULT_NO ask with default answer no
* DISCLOSE_YES_WITHOUT_PROMPT always disclose and don't ask * DISCLOSE_YES_WITHOUT_PROMPT always disclose and don't ask
* DISCLOSE_NO_WITHOUT_PROMPT never disclose and don't ask * DISCLOSE_NO_WITHOUT_PROMPT never disclose and don't ask
* DISCLOSE_PROMPT_DEFAULT_SPECIAL for 'vanquished' only...
* DISCLOSE_SPECIAL_WITHOUT_PROMPT ...to set up sort order.
* *
* Those setting values can be used in the option * Those setting values can be used in the option
* string as a prefix to get the desired behaviour. * string as a prefix to get the desired behaviour.
@@ -3360,33 +3361,33 @@ boolean tinitial, tfrom_file;
* |ascii8x12|ascii16x12|ascii12x16|ascii10x18|fit_to_screen] * |ascii8x12|ascii16x12|ascii12x16|ascii10x18|fit_to_screen]
*/ */
fullname = "map_mode"; fullname = "map_mode";
if (match_optname(opts, fullname, sizeof("map_mode") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "map_mode" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
if (op && !negated) { if (op && !negated) {
if (!strncmpi(op, "tiles", sizeof("tiles") - 1)) if (!strncmpi(op, "tiles", sizeof "tiles" - 1))
iflags.wc_map_mode = MAP_MODE_TILES; iflags.wc_map_mode = MAP_MODE_TILES;
else if (!strncmpi(op, "ascii4x6", sizeof("ascii4x6") - 1)) else if (!strncmpi(op, "ascii4x6", sizeof "ascii4x6" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII4x6; iflags.wc_map_mode = MAP_MODE_ASCII4x6;
else if (!strncmpi(op, "ascii6x8", sizeof("ascii6x8") - 1)) else if (!strncmpi(op, "ascii6x8", sizeof "ascii6x8" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII6x8; iflags.wc_map_mode = MAP_MODE_ASCII6x8;
else if (!strncmpi(op, "ascii8x8", sizeof("ascii8x8") - 1)) else if (!strncmpi(op, "ascii8x8", sizeof "ascii8x8" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII8x8; iflags.wc_map_mode = MAP_MODE_ASCII8x8;
else if (!strncmpi(op, "ascii16x8", sizeof("ascii16x8") - 1)) else if (!strncmpi(op, "ascii16x8", sizeof "ascii16x8" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII16x8; iflags.wc_map_mode = MAP_MODE_ASCII16x8;
else if (!strncmpi(op, "ascii7x12", sizeof("ascii7x12") - 1)) else if (!strncmpi(op, "ascii7x12", sizeof "ascii7x12" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII7x12; iflags.wc_map_mode = MAP_MODE_ASCII7x12;
else if (!strncmpi(op, "ascii8x12", sizeof("ascii8x12") - 1)) else if (!strncmpi(op, "ascii8x12", sizeof "ascii8x12" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII8x12; iflags.wc_map_mode = MAP_MODE_ASCII8x12;
else if (!strncmpi(op, "ascii16x12", sizeof("ascii16x12") - 1)) else if (!strncmpi(op, "ascii16x12", sizeof "ascii16x12" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII16x12; iflags.wc_map_mode = MAP_MODE_ASCII16x12;
else if (!strncmpi(op, "ascii12x16", sizeof("ascii12x16") - 1)) else if (!strncmpi(op, "ascii12x16", sizeof "ascii12x16" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII12x16; iflags.wc_map_mode = MAP_MODE_ASCII12x16;
else if (!strncmpi(op, "ascii10x18", sizeof("ascii10x18") - 1)) else if (!strncmpi(op, "ascii10x18", sizeof "ascii10x18" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII10x18; iflags.wc_map_mode = MAP_MODE_ASCII10x18;
else if (!strncmpi(op, "fit_to_screen", else if (!strncmpi(op, "fit_to_screen",
sizeof("fit_to_screen") - 1)) sizeof "fit_to_screen" - 1))
iflags.wc_map_mode = MAP_MODE_ASCII_FIT_TO_SCREEN; iflags.wc_map_mode = MAP_MODE_ASCII_FIT_TO_SCREEN;
else { else {
config_error_add("Unknown %s parameter '%s'", fullname, op); config_error_add("Unknown %s parameter '%s'", fullname, op);
@@ -3453,7 +3454,7 @@ boolean tinitial, tfrom_file;
/* WINCAP /* WINCAP
* tile_width:nn */ * tile_width:nn */
fullname = "tile_width"; fullname = "tile_width";
if (match_optname(opts, fullname, sizeof("tile_width") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "tile_width" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
@@ -3468,7 +3469,7 @@ boolean tinitial, tfrom_file;
/* WINCAP /* WINCAP
* tile_file:name */ * tile_file:name */
fullname = "tile_file"; fullname = "tile_file";
if (match_optname(opts, fullname, sizeof("tile_file") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "tile_file" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
if ((op = string_for_opt(opts, FALSE)) != 0) { if ((op = string_for_opt(opts, FALSE)) != 0) {
@@ -3482,7 +3483,7 @@ boolean tinitial, tfrom_file;
/* WINCAP /* WINCAP
* tile_height:nn */ * tile_height:nn */
fullname = "tile_height"; fullname = "tile_height";
if (match_optname(opts, fullname, sizeof("tile_height") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "tile_height" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
@@ -3498,7 +3499,7 @@ boolean tinitial, tfrom_file;
/* WINCAP /* WINCAP
* vary_msgcount:nn */ * vary_msgcount:nn */
fullname = "vary_msgcount"; fullname = "vary_msgcount";
if (match_optname(opts, fullname, sizeof("vary_msgcount") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "vary_msgcount" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
@@ -3521,7 +3522,8 @@ boolean tinitial, tfrom_file;
* OPTIONS=windowtype:Foo * OPTIONS=windowtype:Foo
* as the first non-comment line of the file. * as the first non-comment line of the file.
* Making it first in NETHACKOPTIONS requires it to be at the _end_ * Making it first in NETHACKOPTIONS requires it to be at the _end_
* because option strings are processed from right to left. * because comma-separated option strings are processed from right
* to left.
*/ */
fullname = "windowtype"; fullname = "windowtype";
if (match_optname(opts, fullname, 3, TRUE)) { if (match_optname(opts, fullname, 3, TRUE)) {
@@ -3540,7 +3542,7 @@ boolean tinitial, tfrom_file;
choose_windows(buf); choose_windows(buf);
} else { } else {
nmcpy(chosen_windowtype, op, WINTYPELEN); nmcpy(chosen_windowtype, op, WINTYPELEN);
} }
} else } else
return FALSE; return FALSE;
return retval; return retval;
@@ -3582,7 +3584,7 @@ boolean tinitial, tfrom_file;
/* WINCAP2 /* WINCAP2
* term_cols:amount */ * term_cols:amount */
fullname = "term_cols"; fullname = "term_cols";
if (match_optname(opts, fullname, sizeof("term_cols")-1, TRUE)) { if (match_optname(opts, fullname, sizeof "term_cols" - 1, TRUE)) {
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
iflags.wc2_term_cols = atoi(op); iflags.wc2_term_cols = atoi(op);
if (negated) if (negated)
@@ -3593,7 +3595,7 @@ boolean tinitial, tfrom_file;
/* WINCAP2 /* WINCAP2
* term_rows:amount */ * term_rows:amount */
fullname = "term_rows"; fullname = "term_rows";
if (match_optname(opts, fullname, sizeof("term_rows")-1, TRUE)) { if (match_optname(opts, fullname, sizeof "term_rows" - 1, TRUE)) {
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
iflags.wc2_term_rows = atoi(op); iflags.wc2_term_rows = atoi(op);
if (negated) if (negated)
@@ -3604,7 +3606,7 @@ boolean tinitial, tfrom_file;
/* WINCAP2 /* WINCAP2
* petattr:string */ * petattr:string */
fullname = "petattr"; fullname = "petattr";
if (match_optname(opts, fullname, sizeof("petattr")-1, TRUE)) { if (match_optname(opts, fullname, sizeof "petattr" - 1, TRUE)) {
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
if (op && !negated) { if (op && !negated) {
#ifdef CURSES_GRAPHICS #ifdef CURSES_GRAPHICS
@@ -3625,7 +3627,7 @@ boolean tinitial, tfrom_file;
/* WINCAP2 /* WINCAP2
* windowborders:n */ * windowborders:n */
fullname = "windowborders"; fullname = "windowborders";
if (match_optname(opts, fullname, sizeof("windowborders")-1, TRUE)) { if (match_optname(opts, fullname, sizeof "windowborders" - 1, TRUE)) {
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
if (negated && op) if (negated && op)
bad_negation(fullname, TRUE); bad_negation(fullname, TRUE);
@@ -3637,10 +3639,9 @@ boolean tinitial, tfrom_file;
else /* Value supplied */ else /* Value supplied */
iflags.wc2_windowborders = atoi(op); iflags.wc2_windowborders = atoi(op);
if ((iflags.wc2_windowborders > 3) if ((iflags.wc2_windowborders > 3)
|| (iflags.wc2_windowborders < 1)) { || (iflags.wc2_windowborders < 1)) {
iflags.wc2_windowborders = 0; iflags.wc2_windowborders = 0;
config_error_add( config_error_add("Badoption - windowborders %s.", opts);
"Badoption - windowborders %s.", opts);
} }
} }
return retval; return retval;
@@ -3722,10 +3723,10 @@ boolean tinitial, tfrom_file;
escapes(op, op_buf); escapes(op, op_buf);
c = *op_buf; c = *op_buf;
if (illegal_menu_cmd_key(c)) { if (illegal_menu_cmd_key(c))
return FALSE; return FALSE;
} else
add_menu_cmd_alias(c, default_menu_cmd_info[i].cmd); add_menu_cmd_alias(c, default_menu_cmd_info[i].cmd);
} }
return retval; return retval;
} }
@@ -3887,8 +3888,9 @@ boolean tinitial, tfrom_file;
#endif /* ?(MAC_GRAPHICS_ENV && BACKWARD_COMPAT) */ #endif /* ?(MAC_GRAPHICS_ENV && BACKWARD_COMPAT) */
} /* "MACgraphics" */ } /* "MACgraphics" */
/* OK, if we still haven't recognized the option, check the boolean /*
* options list * OK, if we still haven't recognized the option, check the boolean
* options list.
*/ */
for (i = 0; boolopt[i].name; i++) { for (i = 0; boolopt[i].name; i++) {
if (match_optname(opts, boolopt[i].name, 3, TRUE)) { if (match_optname(opts, boolopt[i].name, 3, TRUE)) {
@@ -4121,8 +4123,8 @@ char from_ch, to_ch;
mapped_menu_cmds[n_menu_mapped] = from_ch; mapped_menu_cmds[n_menu_mapped] = from_ch;
mapped_menu_op[n_menu_mapped] = to_ch; mapped_menu_op[n_menu_mapped] = to_ch;
n_menu_mapped++; n_menu_mapped++;
mapped_menu_cmds[n_menu_mapped] = 0; mapped_menu_cmds[n_menu_mapped] = '\0';
mapped_menu_op[n_menu_mapped] = 0; mapped_menu_op[n_menu_mapped] = '\0';
} }
} }
@@ -4349,17 +4351,14 @@ doset() /* changing options via menu by Per Liboriussen */
and adjust the format string accordingly */ and adjust the format string accordingly */
longest_name_len = 0; longest_name_len = 0;
for (pass = 0; pass <= 2; pass++) for (pass = 0; pass <= 2; pass++)
for (i = 0; (name = ((pass == 0) for (i = 0; (name = ((pass == 0) ? boolopt[i].name
? boolopt[i].name : (pass == 1) ? compopt[i].name
: (pass == 1)
? compopt[i].name
: othropt[i].name)) != 0; i++) { : othropt[i].name)) != 0; i++) {
if (pass == 0 && !boolopt[i].addr) if (pass == 0 && !boolopt[i].addr)
continue; continue;
optflags = (pass == 0) ? boolopt[i].optflags optflags = (pass == 0) ? boolopt[i].optflags
: (pass == 1) : (pass == 1) ? compopt[i].optflags
? compopt[i].optflags : othropt[i].optflags;
: othropt[i].optflags;
if (optflags < startpass || optflags > endpass) if (optflags < startpass || optflags > endpass)
continue; continue;
if ((is_wc_option(name) && !wc_supported(name)) if ((is_wc_option(name) && !wc_supported(name))
@@ -4511,8 +4510,7 @@ doset() /* changing options via menu by Per Liboriussen */
preference_update(compopt[opt_indx].name); preference_update(compopt[opt_indx].name);
} }
} }
free((genericptr_t) pick_list); free((genericptr_t) pick_list), pick_list = (menu_item *) 0;
pick_list = (menu_item *) 0;
} }
destroy_nhwindow(tmpwin); destroy_nhwindow(tmpwin);
@@ -4524,6 +4522,7 @@ doset() /* changing options via menu by Per Liboriussen */
return 0; return 0;
} }
/* common to msg-types, menu-colors, autopickup-exceptions */
STATIC_OVL int STATIC_OVL int
handle_add_list_remove(optname, numtotal) handle_add_list_remove(optname, numtotal)
const char *optname; const char *optname;
@@ -4572,7 +4571,7 @@ int numtotal;
} }
struct symsetentry *symset_list = 0; /* files.c will populate this with struct symsetentry *symset_list = 0; /* files.c will populate this with
list of available sets */ * list of available sets */
STATIC_OVL boolean STATIC_OVL boolean
special_handling(optname, setinitial, setfromfile) special_handling(optname, setinitial, setfromfile)
@@ -4777,24 +4776,24 @@ boolean setinitial, setfromfile;
start_menu(tmpwin); start_menu(tmpwin);
any = zeroany; any = zeroany;
any.a_char = GPCOORDS_COMPASS; any.a_char = GPCOORDS_COMPASS;
add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMPASS, add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMPASS, 0, ATR_NONE,
0, ATR_NONE, "compass ('east' or '3s' or '2n,4w')", "compass ('east' or '3s' or '2n,4w')",
(gp == GPCOORDS_COMPASS) ? MENU_SELECTED : MENU_UNSELECTED); (gp == GPCOORDS_COMPASS) ? MENU_SELECTED : MENU_UNSELECTED);
any.a_char = GPCOORDS_COMFULL; any.a_char = GPCOORDS_COMFULL;
add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMFULL, 0, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMFULL, 0, ATR_NONE,
"full compass ('east' or '3south' or '2north,4west')", "full compass ('east' or '3south' or '2north,4west')",
(gp == GPCOORDS_COMFULL) ? MENU_SELECTED : MENU_UNSELECTED); (gp == GPCOORDS_COMFULL) ? MENU_SELECTED : MENU_UNSELECTED);
any.a_char = GPCOORDS_MAP; any.a_char = GPCOORDS_MAP;
add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_MAP, add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_MAP, 0, ATR_NONE,
0, ATR_NONE, "map <x,y>", "map <x,y>",
(gp == GPCOORDS_MAP) ? MENU_SELECTED : MENU_UNSELECTED); (gp == GPCOORDS_MAP) ? MENU_SELECTED : MENU_UNSELECTED);
any.a_char = GPCOORDS_SCREEN; any.a_char = GPCOORDS_SCREEN;
add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_SCREEN, add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_SCREEN, 0, ATR_NONE,
0, ATR_NONE, "screen [row,column]", "screen [row,column]",
(gp == GPCOORDS_SCREEN) ? MENU_SELECTED : MENU_UNSELECTED); (gp == GPCOORDS_SCREEN) ? MENU_SELECTED : MENU_UNSELECTED);
any.a_char = GPCOORDS_NONE; any.a_char = GPCOORDS_NONE;
add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_NONE, add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_NONE, 0, ATR_NONE,
0, ATR_NONE, "none (no coordinates displayed)", "none (no coordinates displayed)",
(gp == GPCOORDS_NONE) ? MENU_SELECTED : MENU_UNSELECTED); (gp == GPCOORDS_NONE) ? MENU_SELECTED : MENU_UNSELECTED);
any.a_long = 0L; any.a_long = 0L;
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
@@ -4802,7 +4801,7 @@ boolean setinitial, setfromfile;
1, 0, COLNO - 1, ROWNO - 1, 1, 0, COLNO - 1, ROWNO - 1,
flags.verbose ? "; column 0 unused, off left edge" : ""); flags.verbose ? "; column 0 unused, off left edge" : "");
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED);
if (strcmp(windowprocs.name, "tty")) if (strcmp(windowprocs.name, "tty")) /* only show for non-tty */
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
"screen: row is offset to accommodate tty interface's use of top line", "screen: row is offset to accommodate tty interface's use of top line",
MENU_UNSELECTED); MENU_UNSELECTED);
@@ -5002,7 +5001,7 @@ boolean setinitial, setfromfile;
int opt_idx, nmt, mttyp; int opt_idx, nmt, mttyp;
char mtbuf[BUFSZ] = DUMMY; char mtbuf[BUFSZ] = DUMMY;
msgtypes_again: msgtypes_again:
nmt = msgtype_count(); nmt = msgtype_count();
opt_idx = handle_add_list_remove("message type", nmt); opt_idx = handle_add_list_remove("message type", nmt);
if (opt_idx == 3) { /* done */ if (opt_idx == 3) { /* done */
@@ -5064,11 +5063,11 @@ boolean setinitial, setfromfile;
int opt_idx, nmc, mcclr, mcattr; int opt_idx, nmc, mcclr, mcattr;
char mcbuf[BUFSZ] = DUMMY; char mcbuf[BUFSZ] = DUMMY;
menucolors_again: menucolors_again:
nmc = count_menucolors(); nmc = count_menucolors();
opt_idx = handle_add_list_remove("menucolor", nmc); opt_idx = handle_add_list_remove("menucolor", nmc);
if (opt_idx == 3) { /* done */ if (opt_idx == 3) { /* done */
menucolors_done: menucolors_done:
if (nmc > 0 && !iflags.use_menu_color) if (nmc > 0 && !iflags.use_menu_color)
pline( pline(
"To have menu colors become active, toggle 'menucolors' option to True."); "To have menu colors become active, toggle 'menucolors' option to True.");
@@ -5139,15 +5138,18 @@ boolean setinitial, setfromfile;
} }
} else if (!strcmp("autopickup_exception", optname)) { } else if (!strcmp("autopickup_exception", optname)) {
int opt_idx, pass, totalapes = 0, numapes[2] = { 0, 0 }; int opt_idx, pass, totalapes = 0, numapes[2] = { 0, 0 };
char apebuf[1 + BUFSZ] = DUMMY; /* so &apebuf[1] is BUFSZ long for getlin() */ char apebuf[1 + BUFSZ]; /* so &apebuf[1] is BUFSZ long for getlin() */
struct autopickup_exception *ape; struct autopickup_exception *ape;
ape_again: ape_again:
totalapes = count_ape_maps(&numapes[AP_LEAVE], &numapes[AP_GRAB]); totalapes = count_ape_maps(&numapes[AP_LEAVE], &numapes[AP_GRAB]);
opt_idx = handle_add_list_remove("autopickup exception", totalapes); opt_idx = handle_add_list_remove("autopickup exception", totalapes);
if (opt_idx == 3) { /* done */ if (opt_idx == 3) { /* done */
return TRUE; return TRUE;
} else if (opt_idx == 0) { /* add new */ } else if (opt_idx == 0) { /* add new */
/* EDIT_GETLIN: assume user doesn't user want previous
exception used as default input string for this one... */
apebuf[0] = apebuf[1] = '\0';
getlin("What new autopickup exception pattern?", &apebuf[1]); getlin("What new autopickup exception pattern?", &apebuf[1]);
mungspaces(&apebuf[1]); /* regularize whitespace */ mungspaces(&apebuf[1]); /* regularize whitespace */
if (apebuf[1] == '\033') if (apebuf[1] == '\033')
@@ -5219,7 +5221,6 @@ boolean setinitial, setfromfile;
symset[which_set].name = (char *) 0; symset[which_set].name = (char *) 0;
res = read_sym_file(which_set); res = read_sym_file(which_set);
/* put symset name back */ /* put symset name back */
symset[which_set].name = symset_name; symset[which_set].name = symset_name;
@@ -5698,9 +5699,10 @@ char *buf;
#ifdef CURSES_GRAPHICS #ifdef CURSES_GRAPHICS
} else if (!strcmp(optname,"windowborders")) { } else if (!strcmp(optname,"windowborders")) {
Sprintf(buf, "%s", Sprintf(buf, "%s",
iflags.wc2_windowborders == 1 ? "1=on" : (iflags.wc2_windowborders == 1) ? "1=on"
iflags.wc2_windowborders == 2 ? "2=off" : : (iflags.wc2_windowborders == 2) ? "2=off"
iflags.wc2_windowborders == 3 ? "3=auto" : defopt); : (iflags.wc2_windowborders == 3) ? "3=auto"
: defopt);
#endif #endif
} else if (!strcmp(optname, "windowtype")) { } else if (!strcmp(optname, "windowtype")) {
Sprintf(buf, "%s", windowprocs.name); Sprintf(buf, "%s", windowprocs.name);
@@ -5725,10 +5727,9 @@ char *buf;
#endif #endif
} }
if (buf[0]) if (!buf[0])
return buf; Strcpy(buf, "unknown");
else return buf;
return "unknown";
} }
int int
@@ -5807,13 +5808,12 @@ STATIC_OVL void
remove_autopickup_exception(whichape) remove_autopickup_exception(whichape)
struct autopickup_exception *whichape; struct autopickup_exception *whichape;
{ {
struct autopickup_exception *ape, *prev = 0; struct autopickup_exception *ape, *freeape, *prev = 0;
int chain = whichape->grab ? AP_GRAB : AP_LEAVE; int chain = whichape->grab ? AP_GRAB : AP_LEAVE;
for (ape = iflags.autopickup_exceptions[chain]; ape;) { for (ape = iflags.autopickup_exceptions[chain]; ape;) {
if (ape == whichape) { if (ape == whichape) {
struct autopickup_exception *freeape = ape; freeape = ape;
ape = ape->next; ape = ape->next;
if (prev) if (prev)
prev->next = ape; prev->next = ape;
@@ -6006,7 +6006,8 @@ const char *strval;
/* data for option_help() */ /* data for option_help() */
static const char *opt_intro[] = { static const char *opt_intro[] = {
"", " NetHack Options Help:", "", "",
" NetHack Options Help:", "",
#define CONFIG_SLOT 3 /* fill in next value at run-time */ #define CONFIG_SLOT 3 /* fill in next value at run-time */
(char *) 0, (char *) 0,
#if !defined(MICRO) && !defined(MAC) #if !defined(MICRO) && !defined(MAC)
@@ -6016,7 +6017,8 @@ static const char *opt_intro[] = {
#ifdef VMS #ifdef VMS
"-- for example, $ DEFINE NETHACKOPTIONS \"noautopickup,fruit:kumquat\"", "-- for example, $ DEFINE NETHACKOPTIONS \"noautopickup,fruit:kumquat\"",
#endif #endif
"or press \"O\" while playing and use the menu.", "", "or press \"O\" while playing and use the menu.",
"",
"Boolean options (which can be negated by prefixing them with '!' or \"no\"):", "Boolean options (which can be negated by prefixing them with '!' or \"no\"):",
(char *) 0 (char *) 0
}; };
@@ -6024,7 +6026,8 @@ static const char *opt_intro[] = {
static const char *opt_epilog[] = { static const char *opt_epilog[] = {
"", "",
"Some of the options can be set only before the game is started; those", "Some of the options can be set only before the game is started; those",
"items will not be selectable in the 'O' command's menu.", (char *) 0 "items will not be selectable in the 'O' command's menu.",
(char *) 0
}; };
void void
@@ -6121,11 +6124,11 @@ struct fruit *replace_fruit;
{ {
register int i; register int i;
register struct fruit *f; register struct fruit *f;
int highest_fruit_id = 0; int highest_fruit_id = 0, globpfx;
char buf[PL_FSIZ], altname[PL_FSIZ]; char buf[PL_FSIZ], altname[PL_FSIZ];
boolean user_specified = (str == pl_fruit); boolean user_specified = (str == pl_fruit);
/* if not user-specified, then it's a fruit name for a fruit on /* if not user-specified, then it's a fruit name for a fruit on
* a bones level... * a bones level or from orctown raider's loot...
*/ */
/* Note: every fruit has an id (kept in obj->spe) of at least 1; /* Note: every fruit has an id (kept in obj->spe) of at least 1;
@@ -6136,39 +6139,54 @@ struct fruit *replace_fruit;
/* force fruit to be singular; this handling is not /* force fruit to be singular; this handling is not
needed--or wanted--for fruits from bones because needed--or wanted--for fruits from bones because
they already received it in their original game */ they already received it in their original game;
str==pl_fruit but makesingular() creates a copy
so we need to copy that back into pl_fruit */
nmcpy(pl_fruit, makesingular(str), PL_FSIZ); nmcpy(pl_fruit, makesingular(str), PL_FSIZ);
/* (assertion doesn't matter; we use 'pl_fruit' from here on out) */
/* assert( str == pl_fruit ); */ /* assert( str == pl_fruit ); */
/* disallow naming after other foods (since it'd be impossible /* disallow naming after other foods (since it'd be impossible
* to tell the difference) * to tell the difference); globs might have a size prefix which
* needs to be skipped in order to match the object type name
*/ */
globpfx = (!strncmp(pl_fruit, "small ", 6)
|| !strncmp(pl_fruit, "large ", 6)) ? 6
: (!strncmp(pl_fruit, "very large ", 11)) ? 11
: 0;
for (i = bases[FOOD_CLASS]; objects[i].oc_class == FOOD_CLASS; i++) { for (i = bases[FOOD_CLASS]; objects[i].oc_class == FOOD_CLASS; i++) {
if (!strcmp(OBJ_NAME(objects[i]), pl_fruit)) { if (!strcmp(OBJ_NAME(objects[i]), pl_fruit)
|| (globpfx > 0
&& !strcmp(OBJ_NAME(objects[i]), &pl_fruit[globpfx]))) {
found = TRUE; found = TRUE;
break; break;
} }
} }
{ if (!found) {
char *c; char *c;
for (c = pl_fruit; *c >= '0' && *c <= '9'; c++) for (c = pl_fruit; *c >= '0' && *c <= '9'; c++)
continue; continue;
if (isspace((uchar) *c) || *c == 0) if (!*c || isspace((uchar) *c))
numeric = TRUE; numeric = TRUE;
} }
if (found || numeric if (found || numeric
|| !strncmp(str, "cursed ", 7) /* these checks for applying food attributes to actual items
|| !strncmp(str, "uncursed ", 9) are case sensitive; "glob of foo" is caught by 'found'
|| !strncmp(str, "blessed ", 8) if 'foo' is a valid glob; when not valid, allow it as-is */
|| !strncmp(str, "partly eaten ", 13) || !strncmp(pl_fruit, "cursed ", 7)
|| (!strncmp(str, "tin of ", 7) || !strncmp(pl_fruit, "uncursed ", 9)
&& (!strcmp(str + 7, "spinach") || !strncmp(pl_fruit, "blessed ", 8)
|| name_to_mon(str + 7) >= LOW_PM)) || !strncmp(pl_fruit, "partly eaten ", 13)
|| !strcmp(str, "empty tin") || (!strncmp(pl_fruit, "tin of ", 7)
|| ((str_end_is(str, " corpse") && (!strcmp(pl_fruit + 7, "spinach")
|| str_end_is(str, " egg")) || name_to_mon(pl_fruit + 7) >= LOW_PM))
&& name_to_mon(str) >= LOW_PM)) { || !strcmp(pl_fruit, "empty tin")
|| (!strcmp(pl_fruit, "glob")
|| (globpfx > 0 && !strcmp("glob", &pl_fruit[globpfx])))
|| ((str_end_is(pl_fruit, " corpse")
|| str_end_is(pl_fruit, " egg"))
&& name_to_mon(pl_fruit) >= LOW_PM)) {
Strcpy(buf, pl_fruit); Strcpy(buf, pl_fruit);
Strcpy(pl_fruit, "candied "); Strcpy(pl_fruit, "candied ");
nmcpy(pl_fruit + 8, buf, PL_FSIZ - 8); nmcpy(pl_fruit + 8, buf, PL_FSIZ - 8);
@@ -6186,11 +6204,11 @@ struct fruit *replace_fruit;
/* replace_fruit is already part of the fruit chain; /* replace_fruit is already part of the fruit chain;
update it in place rather than looking it up again */ update it in place rather than looking it up again */
f = replace_fruit; f = replace_fruit;
copynchars(f->fname, str, PL_FSIZ - 1); copynchars(f->fname, pl_fruit, PL_FSIZ - 1);
goto nonew; goto nonew;
} }
} else { } else {
/* not user_supplied, so assumed to be from bones */ /* not user_supplied, so assumed to be from bones (or orc gang) */
copynchars(altname, str, PL_FSIZ - 1); copynchars(altname, str, PL_FSIZ - 1);
sanitize_name(altname); sanitize_name(altname);
flags.made_fruit = TRUE; /* for safety. Any fruit name added from a flags.made_fruit = TRUE; /* for safety. Any fruit name added from a