// soon as it isn't we BLOW UP
float x,y,xvel,yvel;
int active;
+ int dead; // has been blown out of the way
+ // to make room for a new ship appearing.
SDL_Surface *image;
int type_number;
float heat;
float rockrate,rockspeed;
float movementrate;
float yscroll;
+float scrollvel;
int nships,score,initticks,ticks_since_last, last_ticks;
int gameover;
int countdown = 0;
int maneuver = 0;
-int oss_sound_flag = 0;
+int sound_flag = 1, music_flag = 0;
int tail_plume = 0; // display big engine at the back?
int friction = 0; // should there be friction?
int scorerank;
}
}
- if(oss_sound_flag) {
-
- // Initialise SDL with audio and video
- if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0) {
- oss_sound_flag = 0;
- printf ("Can't open sound, starting without it\n");
- atexit(SDL_Quit);
- } else {
- atexit(SDL_Quit);
- atexit(SDL_CloseAudio);
- oss_sound_flag = init_sound();
- }
-
+ if(sound_flag) {
+ // Initialize SDL with audio and video
+ if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0) {
+ sound_flag = 0;
+ printf ("Can't open sound, starting without it\n");
+ atexit(SDL_Quit);
+ } else {
+ atexit(SDL_Quit);
+ atexit(SDL_CloseAudio);
+ sound_flag = init_sound();
+ }
} else {
- // Initialise with video only
+ // Initialize with video only
CONDERROR(SDL_Init(SDL_INIT_VIDEO) != 0);
atexit(SDL_Quit);
}
- if(oss_sound_flag)
play_tune(0);
// Attempt to get the required video size
surf_screen = SDL_SetVideoMode(XSIZE,YSIZE,16,flag);
// Set the title bar text
- SDL_WM_SetCaption("Rock Dodgers", "rockdodgers");
+ SDL_WM_SetCaption("Variations on Rockdodger", "VoR");
NULLERROR(surf_screen);
// Create a new ship and start all over again
state = GAMEPLAY;
play_tune(1);
- xship = 10;
- yship = YSIZE/2;
- xvel = 3;
- yvel = 0;
- for(i = 0; i<MAXROCKS; i++ ) {
- if(dist_sq(xship, yship, rock[i].x, rock[i].y) < START_RAD_SQ) {
- rock[i].active = 0;
- }
- }
+ xship -= 50;
break;
case GAME_OVER:
state = HIGH_SCORE_ENTRY;
state_timeout = 200.0;
break;
}
+ } else {
+ if(state == DEAD_PAUSE) {
+ float blast_radius = BLAST_RADIUS * state_timeout / 20.0;
+ if(xship < 60) xship = 60;
+ for(i = 0; i<MAXROCKS; i++ ) {
+ float dx, dy, n;
+ if(rock[i].x <= 0) continue;
+ dx = rock[i].x - xship;
+ dy = rock[i].y - yship;
+ n = sqrt(dx*dx + dy*dy);
+ if(n < blast_radius) {
+ n *= 20;
+ rock[i].xvel += rockrate*(dx+30)/n;
+ rock[i].yvel += rockrate*dy/n;
+ rock[i].dead = 1;
+ }
+ }
+ }
}
if(--countdown <= 0 && (rnd()*100.0<(rockrate += 0.025))) {
// SCROLLING
yscroll = yship - (YSIZE / 2);
- yscroll /= -15;
+ yscroll += yvel * 25;
+ yscroll /= -25;
+ yscroll = ((scrollvel * (12 - movementrate)) + (yscroll * movementrate)) / 12;
+ scrollvel = yscroll;
yscroll = yscroll*movementrate;
yship += yscroll;
// Move all the rocks
- for(i = 0; i<MAXROCKS; i++) if(rock[i].active) {
- rock[i].x += rock[i].xvel*movementrate;
- rock[i].y += rock[i].yvel*movementrate + yscroll;
- if(rock[i].y > YSIZE) {
- rock[i].y -= YSIZE;
- rock[i].y -= rock[i].image->w;
- } else if(rock[i].y < -rock[i].image->w) {
- rock[i].y += YSIZE;
- rock[i].y += rock[i].image->w;
- }
- if(rock[i].x<-32.0)
- rock[i].active = 0;
+ for(i = 0; i < MAXROCKS; i++) {
+ if(rock[i].active) {
+ rock[i].x += rock[i].xvel*movementrate;
+ rock[i].y += rock[i].yvel*movementrate + yscroll;
+ if(rock[i].y > YSIZE || rock[i].y < -rock[i].image->h) {
+ if(rock[i].dead) {
+ rock[i].dead = 0;
+ rock[i].active = 0;
+ } else {
+ // wrap
+ rock[i].y = (YSIZE - rock[i].image->h) - rock[i].y;
+ rock[i].y += (rock[i].yvel*movementrate + yscroll) * 1.01;
+ }
+ }
+ if(rock[i].x < -rock[i].image->w || rock[i].x > XSIZE) {
+ rock[i].active = 0;
+ rock[i].dead = 0;
+ }
+ }
}
if(draw() && state == GAMEPLAY) {
- if(oss_sound_flag) {
- // Play the explosion sound
- play_sound(0);
- }
+ // Play the explosion sound
+ play_sound(0);
makebangdots(xship,yship,xvel,yvel,surf_ship,30);
if(--nships <= 0) {
gameover = 1;
}
else {
state = DEAD_PAUSE;
- state_timeout = 50.0;
-
+ state_timeout = 20.0;
+ xvel = 0;
+ yvel = 0;
}
}
for(i = 0; i<MAXROCKS; i++ ) {
rock[i].active = 0;
+ rock[i].dead = 0;
}
rockrate = 54.0;
fullscreen = 0;
tail_plume = 0;
friction = 0;
- oss_sound_flag = 1;
+ sound_flag = 1;
+ music_flag = 0;
- while ((x = getopt(argc,argv,"efhsp")) >= 0) {
+ while ((x = getopt(argc,argv,"efhmps")) >= 0) {
switch(x) {
case 'e': // engine
tail_plume = 1;
" -e big tail [E]ngine\n"
" -f [F]ull screen\n"
" -h this [H]elp message\n"
+ " -m enable [M]usic\n"
" -p original [P]hysics (friction)\n"
" -s [S]ilent (no sound)\n");
exit(0);
break;
+ case 'm': // music
+ music_flag = 1;
case 'p': // physics
friction = 1;
break;
case 's': // silent
- oss_sound_flag = 0;
+ sound_flag = 0;
+ music_flag = 0;
break;
}
}
while(1) {
for(i = 0; i<MAXROCKS; i++) {
rock[i].active = 0;
+ rock[i].dead = 0;
}
rockrate = 54.0;
rockspeed = 5.0;