diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /games/hack/hack.options.c |
initial import of NetBSD tree
Diffstat (limited to 'games/hack/hack.options.c')
-rw-r--r-- | games/hack/hack.options.c | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/games/hack/hack.options.c b/games/hack/hack.options.c new file mode 100644 index 00000000000..078ec7f0de9 --- /dev/null +++ b/games/hack/hack.options.c @@ -0,0 +1,208 @@ +/* + * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. + */ + +#ifndef lint +static char rcsid[] = "$NetBSD: hack.options.c,v 1.3 1995/03/23 08:31:14 cgd Exp $"; +#endif /* not lint */ + +#include "config.h" +#include "hack.h" +extern char *eos(); + +initoptions() +{ + register char *opts; + extern char *getenv(); + + flags.time = flags.nonews = flags.notombstone = flags.end_own = + flags.standout = flags.nonull = FALSE; + flags.no_rest_on_space = TRUE; + flags.invlet_constant = TRUE; + flags.end_top = 5; + flags.end_around = 4; + flags.female = FALSE; /* players are usually male */ + + if(opts = getenv("HACKOPTIONS")) + parseoptions(opts,TRUE); +} + +parseoptions(opts, from_env) +register char *opts; +boolean from_env; +{ + register char *op,*op2; + unsigned num; + boolean negated; + + if(op = index(opts, ',')) { + *op++ = 0; + parseoptions(op, from_env); + } + if(op = index(opts, ' ')) { + op2 = op; + while(*op++) + if(*op != ' ') *op2++ = *op; + } + if(!*opts) return; + negated = FALSE; + while((*opts == '!') || !strncmp(opts, "no", 2)) { + if(*opts == '!') opts++; else opts += 2; + negated = !negated; + } + + if(!strncmp(opts,"standout",8)) { + flags.standout = !negated; + return; + } + + if(!strncmp(opts,"null",3)) { + flags.nonull = negated; + return; + } + + if(!strncmp(opts,"tombstone",4)) { + flags.notombstone = negated; + return; + } + + if(!strncmp(opts,"news",4)) { + flags.nonews = negated; + return; + } + + if(!strncmp(opts,"time",4)) { + flags.time = !negated; + flags.botl = 1; + return; + } + + if(!strncmp(opts,"restonspace",4)) { + flags.no_rest_on_space = negated; + return; + } + + if(!strncmp(opts,"fixinv",4)) { + if(from_env) + flags.invlet_constant = !negated; + else + pline("The fixinvlet option must be in HACKOPTIONS."); + return; + } + + if(!strncmp(opts,"male",4)) { + flags.female = negated; + return; + } + if(!strncmp(opts,"female",6)) { + flags.female = !negated; + return; + } + + /* name:string */ + if(!strncmp(opts,"name",4)) { + extern char plname[PL_NSIZ]; + if(!from_env) { + pline("The playername can be set only from HACKOPTIONS."); + return; + } + op = index(opts,':'); + if(!op) goto bad; + (void) strncpy(plname, op+1, sizeof(plname)-1); + return; + } + + /* endgame:5t[op] 5a[round] o[wn] */ + if(!strncmp(opts,"endgame",3)) { + op = index(opts,':'); + if(!op) goto bad; + op++; + while(*op) { + num = 1; + if(digit(*op)) { + num = atoi(op); + while(digit(*op)) op++; + } else + if(*op == '!') { + negated = !negated; + op++; + } + switch(*op) { + case 't': + flags.end_top = num; + break; + case 'a': + flags.end_around = num; + break; + case 'o': + flags.end_own = !negated; + break; + default: + goto bad; + } + while(letter(*++op)) ; + if(*op == '/') op++; + } + return; + } +bad: + if(!from_env) { + if(!strncmp(opts, "help", 4)) { + pline("%s%s%s", +"To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ", +"give the command 'o' followed by the line `<options>' while playing. ", +"Here <options> is a list of <option>s separated by commas." ); + pline("%s%s%s", +"Simple (boolean) options are rest_on_space, news, time, ", +"null, tombstone, (fe)male. ", +"These can be negated by prefixing them with '!' or \"no\"." ); + pline("%s", +"A string option is name, as in HACKOPTIONS=\"name:Merlin-W\"." ); + pline("%s%s%s", +"A compound option is endgame; it is followed by a description of what ", +"parts of the scorelist you want to see. You might for example say: ", +"`endgame:own scores/5 top scores/4 around my score'." ); + return; + } + pline("Bad option: %s.", opts); + pline("Type `o help<cr>' for help."); + return; + } + puts("Bad syntax in HACKOPTIONS."); + puts("Use for example:"); + puts( +"HACKOPTIONS=\"!restonspace,notombstone,endgame:own/5 topscorers/4 around me\"" + ); + getret(); +} + +doset() +{ + char buf[BUFSZ]; + + pline("What options do you want to set? "); + getlin(buf); + if(!buf[0] || buf[0] == '\033') { + (void) strcpy(buf,"HACKOPTIONS="); + (void) strcat(buf, flags.female ? "female," : "male,"); + if(flags.standout) (void) strcat(buf,"standout,"); + if(flags.nonull) (void) strcat(buf,"nonull,"); + if(flags.nonews) (void) strcat(buf,"nonews,"); + if(flags.time) (void) strcat(buf,"time,"); + if(flags.notombstone) (void) strcat(buf,"notombstone,"); + if(flags.no_rest_on_space) + (void) strcat(buf,"!rest_on_space,"); + if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){ + (void) sprintf(eos(buf), "endgame: %u topscores/%u around me", + flags.end_top, flags.end_around); + if(flags.end_own) (void) strcat(buf, "/own scores"); + } else { + register char *eop = eos(buf); + if(*--eop == ',') *eop = 0; + } + pline(buf); + } else + parseoptions(buf, FALSE); + + return(0); +} |