X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=main.c;h=8e413bd2e4dcb0355dbf654d8e5f00d629d72d6d;hp=a1864319ddfa3548cc6a84cf0541773e9ad4d055;hb=6a635ec5768b4e40a5db1355e14b834dca864231;hpb=b5a8e092201fa4c7c95a00dee56abe228fe60fdd diff --git a/main.c b/main.c index a186431..8e413bd 100644 --- a/main.c +++ b/main.c @@ -25,6 +25,7 @@ extern int font_height; void clearBuffer(); // includes {{{ +#include "config.h" #include #include #include @@ -40,19 +41,6 @@ void clearBuffer(); #include "SFont.h" // }}} // constants {{{ -#define XSIZE 640 -#define YSIZE 480 -#define NROCKS 6 // Number of rock image files, not number of rocks visible -#define MAXROCKS 120 // MAX Rocks -#define MAXROCKHEIGHT 100 -#define ROCKRATE 2 -#define MAXBLACKPOINTS 500 -#define MAXENGINEDOTS 5000 -#define MAXBANGDOTS 50000 -#define MAXSPACEDOTS 2000 -#define W 100 -#define M 255 -#define BIG_FONT_FILE "fonts/score.png" // }}} // macros {{{ #define CONDERROR(a) if((a)) {initerror = strdup(SDL_GetError());return 1;} @@ -66,6 +54,8 @@ struct rock_struct { // 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; @@ -145,16 +135,14 @@ float xship,yship = 240.0; // X position, 0..XSIZE float xvel,yvel; // Change in X position per tick. float rockrate,rockspeed; float movementrate; -float shieldlevel, shieldpulse = 0; float yscroll; +float scrollvel; int nships,score,initticks,ticks_since_last, last_ticks; -int initialshield, gameover, fast; +int gameover; int countdown = 0; int maneuver = 0; -int laser = 0; -int shieldsup = 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; @@ -195,32 +183,12 @@ extern char *optarg; extern int optind, opterr, optopt; // }}} -// ************************************* FUNCS -#ifdef DOTCOLLISION -int dotcollision(SDL_Surface *s) { - int i,j,m; - Uint16 *rawpixel, *r; - - /* - * Kill all the dots which collide with other objects. - * This does not work, it's probably in the wrong place or something. - */ - SDL_LockSurface(s); - rawpixel = (Uint16 *) s->pixels; - if(bangdotlife > 0 && bangdotlife<80) { - for(i = 0; i0 && bdot[i].x0 && bdot[i].ypitch/2*(int)(bdot[i].y)) + (int)(bdot[i].x)]; - if(*r != (bdot[i].c ? bdot[i].c : heatcolor[bangdotlife*2])) - bdot[i].active = 0; - } - } - } - SDL_UnlockSurface(s); - - return; +float dist_sq(float x1, float y1, float x2, float y2) +{ + return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1); } -#endif + +// ************************************* FUNCS FILE *hs_fopen(char *mode) { FILE *f; @@ -313,43 +281,6 @@ void init_space_dots() { } } -int drawlaser() { - int i,xc,hitrock; - Uint16 c, *rawpixel; - - hitrock = -1; - xc = XSIZE; - // let xc = x coordinate of the collision between the laser and a space rock - // 1. Calculate xc and determine the asteroid that was hit - for(i = 0; irock[i].y && yship + 12h && xship + 32w/2) && rock[i].x + (rock[i].image->w/2) < xc) { - xc = rock[i].x + (rock[i].image->w/2); - hitrock = i; - } - } - } - - if(hitrock >= 0) { - rock[hitrock].heat += movementrate*3; - } - - // Plot a number of random dots between xship and XSIZE - SDL_LockSurface(surf_screen); - rawpixel = (Uint16 *) surf_screen->pixels; - c = SDL_MapRGB(surf_ship->format,rnd()*128,128 + rnd()*120,rnd()*128); - - for(i = 0; i<(xc-xship)*5; i += 10) { - int x,y; - x = rnd()*(xc-(xship + 32)) + xship + 32; - y = yship + 12 + (rnd()-0.5)*1.5; - rawpixel[surf_screen->pitch/2*y + x] = c; - } - - SDL_UnlockSurface(surf_screen); -} - - int makebangdots(int xbang, int ybang, int xvel, int yvel, SDL_Surface *s, int power) { // TODO - stop generating dots after a certain amount of time has passed, to cope with slower CPUs. @@ -668,26 +599,23 @@ int init(int fullscreen) { } } - 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 @@ -696,7 +624,7 @@ int init(int fullscreen) { 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); @@ -829,11 +757,6 @@ int draw() { // Draw the background dots drawdots(surf_screen); - // If it's firing, draw the laser - if(laser) { - drawlaser(); - } - // Draw ship if(!gameover && (state == GAMEPLAY || state == DEMO) ) { src.w = surf_ship->w; @@ -1010,48 +933,20 @@ int draw() { } if(!gameover && state == GAMEPLAY) { - // Show the freaky shields SDL_LockSurface(surf_screen); raw_pixels = (Uint16 *) surf_screen->pixels; - if(initialshield>0 || shieldsup && shieldlevel>0) { - int x,y,l; - Uint16 c; - - if(initialshield>0) { - initialshield -= movementrate; - c = SDL_MapRGB(surf_screen->format,0,255,255); - } else { - c = heatcolor[(int)shieldlevel]; - shieldlevel -= movementrate; - } - - shieldpulse += 0.2; - for(p = black_point; px + (int)xship + (rnd() + rnd()-1)*sin(shieldpulse)*4 + 1; - y = p->y + (int)yship + (rnd() + rnd()-1)*sin(shieldpulse)*4 + 1; - if(x>0 && y>0 && xpitch/2 * y + x; - raw_pixels[offset] = c; - } - } - } else { - // When the shields are off, check that the black points - // on the ship are still black, and not covered up by rocks - for(p = black_point; ppitch/2 * (p->y + (int)yship) + p->x + (int)xship; - if(raw_pixels[offset]) { - // Set the bang flag - bang = 1; - } + // Check that the black points on the ship are + // still black, and not covered up by rocks. + for(p = black_point; ppitch/2 * (p->y + (int)yship) + p->x + (int)xship; + if(raw_pixels[offset]) { + // Set the bang flag + bang = 1; } } SDL_UnlockSurface(surf_screen); } -#ifdef DOTCOLLISION - dotcollision(surf_screen); // Kill dots that are not on their spots -#endif - // Draw all the little ships if(state == GAMEPLAY || state == DEAD_PAUSE || state == GAME_OVER) for(i = 0; i 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; + } + } } @@ -1231,10 +1149,8 @@ int gameloop() { 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; @@ -1245,7 +1161,9 @@ int gameloop() { } else { state = DEAD_PAUSE; - state_timeout = 100.0; + state_timeout = 20.0; + xvel = 0; + yvel = 0; } } @@ -1260,6 +1178,7 @@ int gameloop() { for(i = 0; i= 0) { + while ((x = getopt(argc,argv,"efhmps")) >= 0) { switch(x) { case 'e': // engine tail_plume = 1; @@ -1351,18 +1267,22 @@ main(int argc, char **argv) { break; case 'h': // help printf("Variations on RockDodger\n" - " -e Big tail [E]ngine\n" + " -e big tail [E]ngine\n" " -f [F]ull screen\n" - " -h This [H]elp message\n" - " -p Stupid original [P]hysics (friction)\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; } } @@ -1375,6 +1295,7 @@ main(int argc, char **argv) { while(1) { for(i = 0; i