comparison rogue3/options.c @ 2:e676d52b5d09

Prevent changing name or save file when using system savedir
author edwarj4
date Wed, 14 Oct 2009 11:21:33 +0000
parents 527e2150eaf0
children e52a8a7ad4c5
comparison
equal deleted inserted replaced
1:b4856d4d4c4e 2:e676d52b5d09
31 void (*o_putfunc)(); /* function to print value */ 31 void (*o_putfunc)(); /* function to print value */
32 int (*o_getfunc)(); /* function to get value interactively */ 32 int (*o_getfunc)(); /* function to get value interactively */
33 }; 33 };
34 34
35 typedef struct optstruct OPTION; 35 typedef struct optstruct OPTION;
36
37 int allowchange(OPTION *opt); /* doesn't need to be externally visible */
36 38
37 OPTION optlist[] = { 39 OPTION optlist[] = {
38 {"terse", "Terse output: ", 40 {"terse", "Terse output: ",
39 (int *) &terse, put_bool, get_bool }, 41 (int *) &terse, put_bool, get_bool },
40 {"flush", "Flush typeahead during battle: ", 42 {"flush", "Flush typeahead during battle: ",
67 /* 69 /*
68 * Display current values of options 70 * Display current values of options
69 */ 71 */
70 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++) 72 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++)
71 { 73 {
72 waddstr(hw, op->o_prompt); 74 if (allowchange(op))
73 (*op->o_putfunc)(op->o_opt); 75 {
74 waddch(hw, '\n'); 76 waddstr(hw, op->o_prompt);
77 (*op->o_putfunc)(op->o_opt);
78 waddch(hw, '\n');
79 }
75 } 80 }
76 /* 81 /*
77 * Set values 82 * Set values
78 */ 83 */
79 wmove(hw, 0, 0); 84 wmove(hw, 0, 0);
80 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++) 85 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++)
81 { 86 {
87 if (!allowchange(op))
88 continue;
82 waddstr(hw, op->o_prompt); 89 waddstr(hw, op->o_prompt);
83 if ((retval = (*op->o_getfunc)(op->o_opt, hw))) 90 if ((retval = (*op->o_getfunc)(op->o_opt, hw)))
91 {
84 if (retval == QUIT) 92 if (retval == QUIT)
85 break; 93 break;
86 else if (op > optlist) { /* MINUS */ 94 #if 0
95 /* Support for MINUS has been removed because making it work with
96 * hidden unchangable options without underflowing optlist will
97 * require a complete rewrite. And it should also be rewritten
98 * so option() doesn't count on get_str() to put the cursor in the
99 * right place, because that makes it a pain to understand.
100 */
101 else if (op > optlist) { /* retval == MINUS */
87 wmove(hw, (int)(op - optlist) - 1, 0); 102 wmove(hw, (int)(op - optlist) - 1, 0);
88 op -= 2; 103 op -= 2;
89 } 104 }
90 else /* trying to back up beyond the top */ 105 else /* trying to back up beyond the top */
91 { 106 {
92 beep(); 107 beep();
93 wmove(hw, 0, 0); 108 wmove(hw, 0, 0);
94 op--; 109 op--;
95 } 110 }
111 #else
112 break;
113 #endif
114 }
96 } 115 }
97 /* 116 /*
98 * Switch back to original screen 117 * Switch back to original screen
99 */ 118 */
100 mvwaddstr(hw, LINES-1, 0, "--Press space to continue--"); 119 mvwaddstr(hw, LINES-1, 0, "--Press space to continue--");
283 len = (int)(sp - str); 302 len = (int)(sp - str);
284 /* 303 /*
285 * Look it up and deal with it 304 * Look it up and deal with it
286 */ 305 */
287 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++) 306 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++)
307 {
308 /* If using system savefiles, changing your name or the
309 save file is not allowed. */
310 if (!allowchange(op))
311 continue;
288 if (EQSTR(str, op->o_name, len)) 312 if (EQSTR(str, op->o_name, len))
289 { 313 {
290 if (op->o_putfunc == put_bool) /* if option is a boolean */ 314 if (op->o_putfunc == put_bool) /* if option is a boolean */
291 *(int *)op->o_opt = TRUE; 315 *(int *)op->o_opt = TRUE;
292 else /* string option */ 316 else /* string option */
322 && EQSTR(str, "no", 2) && EQSTR(str + 2, op->o_name, len - 2)) 346 && EQSTR(str, "no", 2) && EQSTR(str + 2, op->o_name, len - 2))
323 { 347 {
324 *(int *)op->o_opt = FALSE; 348 *(int *)op->o_opt = FALSE;
325 break; 349 break;
326 } 350 }
351 }
327 352
328 /* 353 /*
329 * skip to start of next option name 354 * skip to start of next option name
330 */ 355 */
331 while (*sp && !isalpha(*sp)) 356 while (*sp && !isalpha(*sp))
349 s1 += strlen(sp); 374 s1 += strlen(sp);
350 s2++; 375 s2++;
351 } 376 }
352 *s1 = '\0'; 377 *s1 = '\0';
353 } 378 }
379
380 /* Tells whether the user is allowed to change the option. */
381 int allowchange(OPTION *opt)
382 {
383 if (!use_savedir)
384 return 1;
385 if (!strcmp(opt->o_name, "name"))
386 return 0;
387 if (!strcmp(opt->o_name, "file"))
388 return 0;
389 return 1;
390 }