home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / hack / hack.options.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-02  |  4.5 KB  |  204 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* hack.options.c - version 1.0.3 */
  3.  
  4. #include "config.h"
  5. #include "hack.h"
  6. extern char *eos();
  7.  
  8. initoptions()
  9. {
  10.     register char *opts;
  11.     extern char *getenv();
  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. }
  204.