X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=args.c;h=3ff1412dc649ee7a31f2253ce20308c99fcee44e;hb=refs%2Fheads%2Fjoystick;hp=9c4c62b92e8c562d597dcf566c7400b6839f6e18;hpb=3079660eb1f60a861b677b746da581c4c0e6c3dd;p=vor.git diff --git a/args.c b/args.c index 9c4c62b..3ff1412 100644 --- a/args.c +++ b/args.c @@ -2,16 +2,18 @@ #include #include #include "args.h" -#include "config.h" - -// Gameplay Variations -float opt_bounciness; -float opt_gamespeed; -float opt_max_lead; +#include +#include "vorconfig.h" // Look and Feel int opt_fullscreen; int opt_sound; +int opt_joystick_enabled; +int opt_joystick_number; +int opt_joystick_x_axis; +int opt_joystick_y_axis; + +int opt_autopilot; static void show_help(void) @@ -19,27 +21,114 @@ show_help(void) puts("Dodge the rocks until you die."); putchar('\n'); puts(" -f, --full-screen"); - puts(" -s, --silent No explosion sounds or music"); - puts(" -V, --version Print program version"); - puts(" -?, --help Give this help list"); - putchar('\n'); - puts("Mandatory or optional arguments to long options are also mandatory or optional"); - puts("for any corresponding short options."); + puts(" -s, --silent No explosion sounds or music"); + puts(" -j x,y, --joystick=x,y set the axis numbers. defaults to 0,1"); + puts(" press a joystick button to activate that joystick"); + puts(" -V, --version Print program version"); + puts(" -?, --help Give this help list"); putchar('\n'); puts("Report bugs at http://jasonwoof.com/contact.html"); } +// Advances buf while reading a positive int, terminated by [^0-9] +// buf is left pointing at first [^0-9] +// If digits are found, the parsed number is written to *out and 0 is returned. +// Otherwise *buf and *out are left unchanged, and non-zero is returned. +int +parse_next_int(char **buf, int* out) { + int ret = 0, mul = 1; + if(!*buf) { + return 1; + } + // make sure *buf starts -?[0-9] + if(**buf == '-') { + mul = -1; + if((*buf)[1] < '0' || (*buf)[1] > '9') { + return 2; + } + *buf += 1; + } else { + if(**buf < '0' || **buf > '9') { + return 2; + } + } + while(**buf >= '0' && **buf <= '9') { + ret *= 10; + ret += **buf - '0'; + *buf += 1; + } + *out = ret * mul; + + return 0; +} + +// returns 1 on success. return 0 causes usage message +int +parse_joystick_opts(char *arg) { + char *arg_was = arg; + static char* bad_arg = "Error: invalid argument to -j/--joystick."; + + // argument is required + if(arg == NULL) { + puts(bad_arg); + return 0; + } + + // read x axis + if(parse_next_int(&arg, &opt_joystick_x_axis)) { + puts(bad_arg); + return 0; + } + + // skip comma + if(*arg != ',') { + puts(bad_arg); + return 0; + } + arg += 1; + + // read y axis + if(parse_next_int(&arg, &opt_joystick_y_axis)) { + puts(bad_arg); + return 0; + } + + // optionally joystick number + if(*arg == ',') { + arg += 1; // skip comma + if(parse_next_int(&arg, &opt_joystick_number)) { + puts(bad_arg); + return 0; + } + opt_joystick_enabled = 1; + } + + // end with a comma or end of string + if(*arg != 0 && *arg != ',') { + puts(bad_arg); + return 0; + } + + // mark arg as consumed (so it won't be parsed as a commandline switch) + arg_was[0] = 0; + + // return success + return 1; +} int short_opt(char c, char *arg) { switch(c) { case 'f': opt_fullscreen = 1; break; case 's': opt_sound = 0; break; + case 'j': + return parse_joystick_opts(arg); case 'V': - printf("Variations on Rockdodger %s\n", VERSION); + printf("Variations on Rockdodger %s\n", PACKAGE_VERSION); exit(0); case '?': case 'h': return 0; + case 'a': opt_autopilot = 1; break; default: fprintf(stderr, "unknown option -%c\n\n", c); return 0; @@ -54,9 +143,9 @@ parse_short_opts(const char *s, char *arg) return short_opt(*s, arg); } -static char *long_opts[] = { "full-screen", "silent", "version", "help" }; +static char *long_opts[] = { "full-screen", "silent", "joystick", "version", "help", "autopilot" }; -static char short_opts[] = { 'f', 's', 'V', 'h' }; +static char short_opts[] = { 'f', 's', 'j', 'V', 'h', 'a' }; int parse_long_opt(const char *s, char *arg) @@ -73,14 +162,13 @@ parse_long_opt(const char *s, char *arg) void init_opts(void) { - // Gameplay Variations - opt_bounciness = 0.50; // lose 50% when you hit the screen edge. - opt_gamespeed = 1.00; // Run game at full speed. - opt_max_lead = 1.00*XSIZE; // you can get 1 screen ahead. - - // Look and Feel opt_fullscreen = 0; opt_sound = 1; + opt_joystick_enabled = 0; // can also be enabled by pressing one of its buttons + opt_joystick_number = 0; + opt_joystick_x_axis = 0; + opt_joystick_y_axis = 1; + opt_autopilot = 0; } int @@ -92,6 +180,8 @@ parse_opts(int argc, char *argv[]) init_opts(); for(i=1; i