]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - games/hack/hack.options.c
This commit was generated by cvs2svn to compensate for changes in r42888,
[FreeBSD/FreeBSD.git] / games / hack / hack.options.c
1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 /* hack.options.c - version 1.0.3 */
3
4 #include <stdlib.h>
5 #include "config.h"
6 #include "hack.h"
7 extern char *eos();
8
9 initoptions()
10 {
11         register char *opts;
12
13         flags.time = flags.nonews = flags.notombstone = flags.end_own =
14         flags.standout = flags.nonull = FALSE;
15         flags.no_rest_on_space = TRUE;
16         flags.invlet_constant = TRUE;
17         flags.end_top = 5;
18         flags.end_around = 4;
19         flags.female = FALSE;                   /* players are usually male */
20
21         if(opts = getenv("HACKOPTIONS"))
22                 parseoptions(opts,TRUE);
23 }
24
25 parseoptions(opts, from_env)
26 register char *opts;
27 boolean from_env;
28 {
29         register char *op,*op2;
30         unsigned num;
31         boolean negated;
32
33         if(op = index(opts, ',')) {
34                 *op++ = 0;
35                 parseoptions(op, from_env);
36         }
37         if(op = index(opts, ' ')) {
38                 op2 = op;
39                 while(*op++)
40                         if(*op != ' ') *op2++ = *op;
41         }
42         if(!*opts) return;
43         negated = FALSE;
44         while((*opts == '!') || !strncmp(opts, "no", 2)) {
45                 if(*opts == '!') opts++; else opts += 2;
46                 negated = !negated;
47         }
48
49         if(!strncmp(opts,"standout",8)) {
50                 flags.standout = !negated;
51                 return;
52         }
53
54         if(!strncmp(opts,"null",3)) {
55                 flags.nonull = negated;
56                 return;
57         }
58
59         if(!strncmp(opts,"tombstone",4)) {
60                 flags.notombstone = negated;
61                 return;
62         }
63
64         if(!strncmp(opts,"news",4)) {
65                 flags.nonews = negated;
66                 return;
67         }
68
69         if(!strncmp(opts,"time",4)) {
70                 flags.time = !negated;
71                 flags.botl = 1;
72                 return;
73         }
74
75         if(!strncmp(opts,"restonspace",4)) {
76                 flags.no_rest_on_space = negated;
77                 return;
78         }
79
80         if(!strncmp(opts,"fixinv",4)) {
81                 if(from_env)
82                         flags.invlet_constant = !negated;
83                 else
84                         pline("The fixinvlet option must be in HACKOPTIONS.");
85                 return;
86         }
87
88         if(!strncmp(opts,"male",4)) {
89                 flags.female = negated;
90                 return;
91         }
92         if(!strncmp(opts,"female",6)) {
93                 flags.female = !negated;
94                 return;
95         }
96
97         /* name:string */
98         if(!strncmp(opts,"name",4)) {
99                 extern char plname[PL_NSIZ];
100                 if(!from_env) {
101                   pline("The playername can be set only from HACKOPTIONS.");
102                   return;
103                 }
104                 op = index(opts,':');
105                 if(!op) goto bad;
106                 (void) strncpy(plname, op+1, sizeof(plname)-1);
107                 return;
108         }
109
110         /* endgame:5t[op] 5a[round] o[wn] */
111         if(!strncmp(opts,"endgame",3)) {
112                 op = index(opts,':');
113                 if(!op) goto bad;
114                 op++;
115                 while(*op) {
116                         num = 1;
117                         if(digit(*op)) {
118                                 num = atoi(op);
119                                 while(digit(*op)) op++;
120                         } else
121                         if(*op == '!') {
122                                 negated = !negated;
123                                 op++;
124                         }
125                         switch(*op) {
126                         case 't':
127                                 flags.end_top = num;
128                                 break;
129                         case 'a':
130                                 flags.end_around = num;
131                                 break;
132                         case 'o':
133                                 flags.end_own = !negated;
134                                 break;
135                         default:
136                                 goto bad;
137                         }
138                         while(letter(*++op)) ;
139                         if(*op == '/') op++;
140                 }
141                 return;
142         }
143 bad:
144         if(!from_env) {
145                 if(!strncmp(opts, "help", 4)) {
146                         pline("%s%s%s",
147 "To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ",
148 "give the command 'o' followed by the line `<options>' while playing. ",
149 "Here <options> is a list of <option>s separated by commas." );
150                         pline("%s%s%s",
151 "Simple (boolean) options are rest_on_space, news, time, ",
152 "null, tombstone, (fe)male. ",
153 "These can be negated by prefixing them with '!' or \"no\"." );
154                         pline("%s",
155 "A string option is name, as in HACKOPTIONS=\"name:Merlin-W\"." );
156                         pline("%s%s%s",
157 "A compound option is endgame; it is followed by a description of what ",
158 "parts of the scorelist you want to see. You might for example say: ",
159 "`endgame:own scores/5 top scores/4 around my score'." );
160                         return;
161                 }
162                 pline("Bad option: %s.", opts);
163                 pline("Type `o help<cr>' for help.");
164                 return;
165         }
166         puts("Bad syntax in HACKOPTIONS.");
167         puts("Use for example:");
168         puts(
169 "HACKOPTIONS=\"!restonspace,notombstone,endgame:own/5 topscorers/4 around me\""
170         );
171         getret();
172 }
173
174 doset()
175 {
176         char buf[BUFSZ];
177
178         pline("What options do you want to set? ");
179         getlin(buf);
180         if(!buf[0] || buf[0] == '\033') {
181             (void) strcpy(buf,"HACKOPTIONS=");
182             (void) strcat(buf, flags.female ? "female," : "male,");
183             if(flags.standout) (void) strcat(buf,"standout,");
184             if(flags.nonull) (void) strcat(buf,"nonull,");
185             if(flags.nonews) (void) strcat(buf,"nonews,");
186             if(flags.time) (void) strcat(buf,"time,");
187             if(flags.notombstone) (void) strcat(buf,"notombstone,");
188             if(flags.no_rest_on_space)
189                 (void) strcat(buf,"!rest_on_space,");
190             if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){
191                 (void) sprintf(eos(buf), "endgame: %u topscores/%u around me",
192                         flags.end_top, flags.end_around);
193                 if(flags.end_own) (void) strcat(buf, "/own scores");
194             } else {
195                 register char *eop = eos(buf);
196                 if(*--eop == ',') *eop = 0;
197             }
198             pline(buf);
199         } else
200             parseoptions(buf, FALSE);
201
202         return(0);
203 }