Mercurial > hg > early-roguelike
comparison rogue4/options.c @ 14:e7dc81b41168
rogue4: prevent changing name or save file when using system savedir
| author | edwarj4 |
|---|---|
| date | Sat, 31 Oct 2009 13:20:00 +0000 |
| parents | 9535a08ddc39 |
| children | 1b73a8641b37 |
comparison
equal
deleted
inserted
replaced
| 13:63b9fd7d70ce | 14:e7dc81b41168 |
|---|---|
| 31 int (*o_putfunc)(); /* function to print value */ | 31 int (*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); | |
| 36 | 38 |
| 37 int put_bool(), get_bool(), put_str(), get_str(); | 39 int put_bool(), get_bool(), put_str(), get_str(); |
| 38 | 40 |
| 39 OPTION optlist[] = { | 41 OPTION optlist[] = { |
| 40 {"terse", "Terse output: ", | 42 {"terse", "Terse output: ", |
| 70 /* | 72 /* |
| 71 * Display current values of options | 73 * Display current values of options |
| 72 */ | 74 */ |
| 73 for (op = optlist; op < &optlist[NUM_OPTS]; op++) | 75 for (op = optlist; op < &optlist[NUM_OPTS]; op++) |
| 74 { | 76 { |
| 75 waddstr(hw, op->o_prompt); | 77 if (allowchange(op)) |
| 76 (*op->o_putfunc)(op->o_opt); | 78 { |
| 77 waddch(hw, '\n'); | 79 waddstr(hw, op->o_prompt); |
| 80 (*op->o_putfunc)(op->o_opt); | |
| 81 waddch(hw, '\n'); | |
| 82 } | |
| 78 } | 83 } |
| 79 /* | 84 /* |
| 80 * Set values | 85 * Set values |
| 81 */ | 86 */ |
| 82 wmove(hw, 0, 0); | 87 wmove(hw, 0, 0); |
| 83 for (op = optlist; op < &optlist[NUM_OPTS]; op++) | 88 for (op = optlist; op < &optlist[NUM_OPTS]; op++) |
| 84 { | 89 { |
| 90 if (!allowchange(op)) | |
| 91 continue; | |
| 85 waddstr(hw, op->o_prompt); | 92 waddstr(hw, op->o_prompt); |
| 86 if ((retval = (*op->o_getfunc)(op->o_opt, hw))) | 93 if ((retval = (*op->o_getfunc)(op->o_opt, hw))) |
| 94 { | |
| 87 if (retval == QUIT) | 95 if (retval == QUIT) |
| 88 break; | 96 break; |
| 97 #if 0 /* disable MINUS */ | |
| 89 else if (op > optlist) { /* MINUS */ | 98 else if (op > optlist) { /* MINUS */ |
| 90 wmove(hw, (op - optlist) - 1, 0); | 99 wmove(hw, (op - optlist) - 1, 0); |
| 91 op -= 2; | 100 op -= 2; |
| 92 } | 101 } |
| 93 else /* trying to back up beyond the top */ | 102 else /* trying to back up beyond the top */ |
| 94 { | 103 { |
| 95 putchar('\007'); | 104 putchar('\007'); |
| 96 wmove(hw, 0, 0); | 105 wmove(hw, 0, 0); |
| 97 op--; | 106 op--; |
| 98 } | 107 } |
| 108 #else | |
| 109 break; | |
| 110 #endif | |
| 111 } | |
| 99 } | 112 } |
| 100 /* | 113 /* |
| 101 * Switch back to original screen | 114 * Switch back to original screen |
| 102 */ | 115 */ |
| 103 mvwaddstr(hw, LINES-1, 0, "--Press space to continue--"); | 116 mvwaddstr(hw, LINES-1, 0, "--Press space to continue--"); |
| 299 len = sp - str; | 312 len = sp - str; |
| 300 /* | 313 /* |
| 301 * Look it up and deal with it | 314 * Look it up and deal with it |
| 302 */ | 315 */ |
| 303 for (op = optlist; op < &optlist[NUM_OPTS]; op++) | 316 for (op = optlist; op < &optlist[NUM_OPTS]; op++) |
| 317 { | |
| 318 /* If using system savefiles, changing your name or the | |
| 319 save file is not allowed. */ | |
| 320 if (!allowchange(op)) | |
| 321 continue; | |
| 304 if (EQSTR(str, op->o_name, len)) | 322 if (EQSTR(str, op->o_name, len)) |
| 305 { | 323 { |
| 306 if (op->o_putfunc == put_bool) /* if option is a boolean */ | 324 if (op->o_putfunc == put_bool) /* if option is a boolean */ |
| 307 *(bool *)op->o_opt = TRUE; | 325 *(bool *)op->o_opt = TRUE; |
| 308 else /* string option */ | 326 else /* string option */ |
| 338 && EQSTR(str, "no", 2) && EQSTR(str + 2, op->o_name, len - 2)) | 356 && EQSTR(str, "no", 2) && EQSTR(str + 2, op->o_name, len - 2)) |
| 339 { | 357 { |
| 340 *(bool *)op->o_opt = FALSE; | 358 *(bool *)op->o_opt = FALSE; |
| 341 break; | 359 break; |
| 342 } | 360 } |
| 361 } | |
| 343 | 362 |
| 344 /* | 363 /* |
| 345 * skip to start of next option name | 364 * skip to start of next option name |
| 346 */ | 365 */ |
| 347 while (*sp && !isalpha(*sp)) | 366 while (*sp && !isalpha(*sp)) |
| 366 *s1++ = *s2; | 385 *s1++ = *s2; |
| 367 s2++; | 386 s2++; |
| 368 } | 387 } |
| 369 *s1 = '\0'; | 388 *s1 = '\0'; |
| 370 } | 389 } |
| 390 | |
| 391 /* Tells whether the player is allowed to change the option. */ | |
| 392 int allowchange(OPTION *opt) | |
| 393 { | |
| 394 if (!use_savedir) | |
| 395 return 1; | |
| 396 if (!strcmp(opt->o_name, "name")) | |
| 397 return 0; | |
| 398 if (!strcmp(opt->o_name, "file")) | |
| 399 return 0; | |
| 400 return 1; | |
| 401 } | |
| 402 |
