+#include <errno.h>
#include "args.h"
#include "config.h"
+// Gameplay Variations
+float opt_bounciness;
+float opt_gamespeed;
+float opt_max_lead;
+int opt_friction;
+
+// Look and Feel
int opt_fullscreen;
int opt_music;
int opt_sound;
-float opt_bounciness;
-float opt_gamespeed;
int opt_tail_engine;
-int opt_friction;
error_t parse_opt(int, char*, struct argp_state *);
static char doc[] = "Dodge the rocks until you die.";
static struct argp_option opts[] = {
{0, 0, 0, 0, "Gameplay Variations:"},
- {"bounciness", 'b', "N%", 0, "keep N% of speed when hitting edges (default 50%)"},
+ {"bounciness", 'b', "N%", 0, "Keep N% of speed when hitting edges (default 50%)"},
{"game-speed", 'g', "N%", 0, "50-100% (default 100%)"},
- {"bad-physics", 'p', 0, 0, "bad physics (i.e. friction)"},
+ {"max-lead", 'l', "#SCREENS", 0, "Max dist. ahead you can get (default 1 screen)\n(negative value means no limit)"},
+ {"bad-physics", 'p', 0, 0, "Bad physics (i.e. friction)"},
{0, 0, 0, 0, "Look and Feel:"},
{"engine", 'e', 0, 0, "Display large tail plume"},
{"full-screen", 'f', 0, 0, ""},
{"music", 'm', 0, 0, "Enable music"},
- {"silent", 's', 0, 0, "Turn off explosion sounds"},
+ {"silent", 's', 0, 0, "No explosion sounds or music"},
{0, 0, 0, 0, "Informational:", -1},
{0}
};
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.
+ opt_friction = 0;
+
+ // Look and Feel
opt_fullscreen = 0;
opt_sound = 1;
opt_music = 0;
- opt_bounciness = 0.50; // lose 50% when you hit the screen edge.
- opt_gamespeed = 1.00; // Run game at full speed.
- // These switch back to the old gameplay and are off by default.
opt_tail_engine = 0;
- opt_friction = 0;
}
error_t
int i;
switch(key) {
- case 'f': opt_fullscreen = 1; break;
- case 'm': opt_music = 1; break;
- case 's': opt_sound = 0; opt_music = 0; break;
- case 'b': i = 0; sscanf(arg, "%d%%", &i);
+ case 'b': if(!sscanf(arg, "%d%%", &i)) {
+ argp_error(state, "bad --bounciness (-b) value (should be 0-100%%)");
+ return EINVAL;
+ }
if(i < 50) i = 50; else if(i > 100) i = 100;
opt_bounciness = (float)i / 100;
break;
- case 'g': i = 0; sscanf(arg, "%d%%", &i);
+ case 'e': opt_tail_engine = 1; break;
+ case 'f': opt_fullscreen = 1; break;
+ case 'g': if(!sscanf(arg, "%d%%", &i)) {
+ argp_error(state, "bad --gamespeed (-g) value (should be 50-100%%)");
+ return EINVAL;
+ }
if(i < 0) i = 0; else if(i > 100) i = 100;
opt_gamespeed = (float)i / 100;
break;
- case 'e': opt_tail_engine = 1; break;
+ case 'l': if(!sscanf(arg, "%f", &opt_max_lead)) {
+ argp_error(state, "bad --max-limit (-l) value (must be a number)");
+ return EINVAL;
+ }
+ opt_max_lead *= XSIZE;
+ break;
+ case 'm': opt_music = 1; break;
case 'p': opt_friction = 1; break;
+ case 's': opt_sound = 0; opt_music = 0; break;
default: break;
}
return 0;
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <argp.h>
+#include <math.h>
+#include <SDL/SDL.h>
+#include <SDL/SDL_image.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "SFont.h"
+
#ifdef DEBUG
#include "debug.h"
#endif
#include "args.h"
+#include "common.h"
#include "config.h"
#include "file.h"
#include "globals.h"
#include "shape.h"
#include "sound.h"
-#include <argp.h>
-#include <math.h>
-#include <SDL/SDL.h>
-#include <SDL/SDL_image.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "SFont.h"
-
// ************************************* VARS
// SDL_Surface global variables
SDL_Surface
extern char *optarg;
extern int optind, opterr, optopt;
+#define TO_TICKS(seconds) ((seconds)*20*opt_gamespeed)
+
// ************************************* FUNCS
float
screendx = -tmp;
// taper off if we would hit the barrier in under 2 seconds.
- if(back_dist + (screendx - SCREENDXMIN)*2*20*opt_gamespeed < 0) {
- screendx = SCREENDXMIN - (back_dist/(2*20*opt_gamespeed));
+ if(back_dist + (screendx - SCREENDXMIN)*TO_TICKS(2) < 0) {
+ screendx = SCREENDXMIN - (back_dist/TO_TICKS(2));
}
xscroll = screendx * framelen;
yscroll = screendy * framelen;
back_dist += (screendx - SCREENDXMIN)*framelen;
+ if(opt_max_lead >= 0) back_dist = min(back_dist, opt_max_lead);
shipx -= xscroll;
shipy -= yscroll;