X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=main.c;h=03d173c9c875921b4f2f0fca00f216ce39eadd9f;hp=f7e5bd4ace922525a43a73690dc2aceff78bf671;hb=cf30b5f20e3c6fa5c6a328f6cb9ad1559cf227a2;hpb=a133ed10c10a4cf62f80222a89f83b6218b37d2f diff --git a/main.c b/main.c index f7e5bd4..03d173c 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;} @@ -145,15 +133,13 @@ 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 tail_plume = 0; // display big engine at the back? int friction = 0; // should there be friction? @@ -195,32 +181,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; @@ -249,10 +215,10 @@ void read_high_score_table() { int i; if(f = hs_fopen("r")) { // If the file exists, read from it - for(i = 0; i<8; i ++ ) { + for(i = 0; i<8; i++) { char s[1024]; int highscore; - if(fscanf (f, "%d %[^\n]", &highscore, s)!= 2) { + if(fscanf (f, "%d %[^\n]", &highscore, s) != 2) { break; } if(high[i].allocated) { @@ -270,7 +236,7 @@ void write_high_score_table() { int i; if(f = hs_fopen("w")) { // If the file exists, write to it - for(i = 0; i<8; i ++ ) { + for(i = 0; i<8; i++) { fprintf (f, "%d %s\n", high[i].score, high[i].name); } fclose(f); @@ -283,7 +249,7 @@ void snprintscore(char *s, size_t n, int score) { if(min) { snprintf(s, n, "%2d:%.2d.%d", min, sec, tenths); } else { - snprintf(s, n, " %2d.%d", sec, tenths); + snprintf(s, n, " %2d.%d", sec, tenths); } } float rnd() { @@ -291,13 +257,13 @@ float rnd() { } void init_engine_dots() { int i; - 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. @@ -365,13 +294,13 @@ int makebangdots(int xbang, int ybang, int xvel, int yvel, SDL_Surface *s, int p SDL_LockSurface(s); rawpixel = (Uint16 *) s->pixels; - //for(n = 0; n<= power/2; n ++ ) { + //for(n = 0; n <= power/2; n++) { endcount = 0; while (endcount<3) { - for(x = 0; xw; x ++ ) { - for(y = 0; yh; y ++ ) { + for(x = 0; xw; x++) { + for(y = 0; yh; y++) { c = rawpixel[s->pitch/2*y + x]; if(c && c != SDL_MapRGB(s->format,0,255,0)) { @@ -390,7 +319,7 @@ int makebangdots(int xbang, int ybang, int xvel, int yvel, SDL_Surface *s, int p bdot[bd2].decay = rnd()*3 + 1; bdot[bd2].active = 1; - bd2 ++ ; + bd2++; bd2 %= MAXBANGDOTS; // If the circular buffer is filled, who cares? They've had their chance. @@ -400,7 +329,7 @@ int makebangdots(int xbang, int ybang, int xvel, int yvel, SDL_Surface *s, int p } } - if(SDL_GetTicks() - begin_generate > 7) endcount ++ ; + if(SDL_GetTicks() - begin_generate > 7) endcount++; } exitloop: @@ -417,11 +346,11 @@ void draw_bang_dots(SDL_Surface *s) { first_i = -1; - for(i = bd1; (bd1 <= bd2)?(i= bd1 && i < bd2); last_i = ++i) { + for(i = bd1; (bd1 <= bd2)?(i= bd1 && i < bd2); last_i = ++i) { i %= MAXBANGDOTS; - if(bdot[i].x<= 0 || bdot[i].x>= XSIZE || bdot[i].y<= 0 || bdot[i].y>= YSIZE) { + if(bdot[i].x <= 0 || bdot[i].x >= XSIZE || bdot[i].y <= 0 || bdot[i].y >= YSIZE) { // If the dot has drifted outside the perimeter, kill it bdot[i].active = 0; } @@ -431,7 +360,7 @@ void draw_bang_dots(SDL_Surface *s) { first_i = i; //last_i = i + 1; rawpixel[(int)(s->pitch/2*(int)(bdot[i].y)) + (int)(bdot[i].x)] = bdot[i].c ? bdot[i].c : heatcolor[(int)(bdot[i].life*3)]; - bdot[i].life-= bdot[i].decay; + bdot[i].life -= bdot[i].decay; bdot[i].x += bdot[i].dx*movementrate; bdot[i].y += bdot[i].dy*movementrate + yscroll; @@ -440,7 +369,7 @@ void draw_bang_dots(SDL_Surface *s) { } } - if(first_i>= 0) { + if(first_i >= 0) { bd1 = first_i; bd2 = last_i; } @@ -457,7 +386,7 @@ void draw_space_dots(SDL_Surface *s) { Uint16 *rawpixel; rawpixel = (Uint16 *) s->pixels; - for(i = 0; ipixels; - for(i = 0; iYSIZE) { + if((edot[i].life -= movementrate*3)<0 || edot[i].y<0 || edot[i].y>YSIZE) { edot[i].active = 0; } else if(edot[i].x<0 || edot[i].x>XSIZE) { edot[i].active = 0; @@ -505,7 +434,7 @@ void create_engine_dots(int newdots) { if(!tail_plume) return; if(state == GAMEPLAY) { - for(i = 0; iactive == 0) { theta = rnd()*M_PI*2; r = rnd(); @@ -519,8 +448,8 @@ void create_engine_dots(int newdots) { dotptr->dy = 1*dy + yvel; dotptr->life = 45 + rnd(1)*5; - dotptr ++ ; - if(dotptr-edot>= MAXENGINEDOTS) { + dotptr++; + if(dotptr-edot >= MAXENGINEDOTS) { dotptr = edot; } } @@ -534,9 +463,9 @@ void create_engine_dots2(int newdots, int m) { // Don't create fresh engine dots when // the game is not being played and a demo is not beng shown - if(state!= GAMEPLAY && state!= DEMO) return; + if(state != GAMEPLAY && state != DEMO) return; - for(i = 0; iactive == 0) { theta = rnd()*M_PI*2; theta2 = rnd()*M_PI*2; @@ -553,7 +482,7 @@ void create_engine_dots2(int newdots, int m) { switch(m) { case 0: - dotptr->x-= 14; + dotptr->x -= 14; dotptr->dx = -20*adx + xvel; dotptr->dy = 2*dy + yvel; dotptr->life = 60 * adx; @@ -575,8 +504,8 @@ void create_engine_dots2(int newdots, int m) { dotptr->life = 60 * ady; break; } - dotptr ++ ; - if(dotptr-edot>= MAXENGINEDOTS) { + dotptr++; + if(dotptr-edot >= MAXENGINEDOTS) { dotptr = edot; } } @@ -610,7 +539,7 @@ int drawdots(SDL_Surface *s) { create_engine_dots(200); // Create engine dots out the side we're moving from - for(m = 0; m<4; m ++ ) { + for(m = 0; m<4; m++) { if(maneuver & 1<format, (ipixels; - for(i = 0; iw; i ++ ) { - for(j = 0; jh; j ++ ) { + for(i = 0; iw; i++) { + for(j = 0; jh; j++) { if(raw_pixels[j*(surf_ship->pitch)/2 + i] == 0) { blackptr->x = i; blackptr->y = j; - blackptr ++ ; + blackptr++; } } } @@ -754,7 +683,7 @@ int init(int fullscreen) { init_space_dots(); // Load all our lovely rocks - for(i = 0; iw; @@ -846,7 +770,7 @@ int draw() { } // Draw all the rocks, in all states - for(i = 0; iw; @@ -865,10 +789,10 @@ int draw() { SDL_Surface *deadrock; deadrock = surf_deadrock[rock[i].type_number]; SDL_SetAlpha(deadrock,SDL_SRCALPHA,rock[i].heat*255/rock[i].image->h); - dest.x = (int) rock[i].x; // kludge + dest.x = (int) rock[i].x; // kludge SDL_BlitSurface(deadrock,&src,surf_screen,&dest); if(rnd()<0.3) { - rock[i].heat-= movementrate; + rock[i].heat -= movementrate; } } @@ -997,7 +921,7 @@ int draw() { case HIGH_SCORE_DISPLAY: // Display de list o high scores mon. PutString(surf_screen,180,50,"High scores"); - for(i = 0; i<8; i ++ ) { + for(i = 0; i<8; i++) { char s[1024]; sprintf(s, "#%1d",i + 1); PutString(surf_screen, 150, 50 + (i + 2)*font_height,s); @@ -1010,51 +934,23 @@ 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; iw; src.h = surf_life->h; dest.w = src.w; @@ -1106,12 +1002,15 @@ int gameloop() { // Create a new ship and start all over again state = GAMEPLAY; play_tune(1); - initialshield = 150; xship = 10; yship = YSIZE/2; - xvel = 2; + xvel = 3; yvel = 0; - shieldlevel = 3*W; + for(i = 0; i= high[7].score) { + if(score >= high[7].score) { // Read the high score table from the storage file read_high_score_table(); // Find ranking of this score, store as scorerank - for(i = 0; i<8; i ++ ) { + for(i = 0; i<8; i++) { if(high[i].score <= score) { scorerank = i; break; @@ -1132,7 +1031,7 @@ int gameloop() { } // Move all lower scores down a notch - for(i = 7; i>= scorerank; i--) + for(i = 7; i >= scorerank; i--) high[i] = high[i-1]; // Insert blank high score @@ -1158,10 +1057,10 @@ int gameloop() { } } - if(--countdown<= 0 && (rnd()*100.0<(rockrate += 0.025))) { + if(--countdown <= 0 && (rnd()*100.0<(rockrate += 0.025))) { // Create a rock - rockptr ++ ; - if(rockptr-rock>= MAXROCKS) { + rockptr++; + if(rockptr-rock >= MAXROCKS) { rockptr = rock; } if(!rockptr->active) { @@ -1195,12 +1094,15 @@ int gameloop() { // 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 YSIZE) { @@ -1236,7 +1138,7 @@ int gameloop() { play_sound(0); } makebangdots(xship,yship,xvel,yvel,surf_ship,30); - if(--nships<= 0) { + if(--nships <= 0) { gameover = 1; state = GAME_OVER; state_timeout = 200.0; @@ -1245,14 +1147,15 @@ int gameloop() { } else { state = DEAD_PAUSE; - state_timeout = 100.0; + state_timeout = 50.0; + } } SDL_PumpEvents(); keystate = SDL_GetKeyState(NULL); - if(state!= HIGH_SCORE_ENTRY && (keystate[SDLK_q] || keystate[SDLK_ESCAPE])) { + if(state != HIGH_SCORE_ENTRY && (keystate[SDLK_q] || keystate[SDLK_ESCAPE])) { return 0; } @@ -1276,13 +1179,10 @@ int gameloop() { yvel = 0; xship = 0; yship = YSIZE/2; - shieldlevel = 3*W; - initialshield = 0; } maneuver = 0; - laser = 0; } else { SDL_PumpEvents(); keystate = SDL_GetKeyState(NULL); @@ -1292,10 +1192,10 @@ int gameloop() { if(!gameover) { if(!paused) { - if(keystate[SDLK_UP] | keystate[SDLK_c]) { yvel -= 1.5*movementrate; maneuver|= 1<<3;} - if(keystate[SDLK_DOWN] | keystate[SDLK_t]) { yvel += 1.5*movementrate; maneuver|= 1<<1;} - if(keystate[SDLK_LEFT] | keystate[SDLK_h]) { xvel -= 1.5*movementrate; maneuver|= 1<<2;} - if(keystate[SDLK_RIGHT] | keystate[SDLK_n]) { xvel += 1.5*movementrate; maneuver|= 1;} + if(keystate[SDLK_UP] | keystate[SDLK_c]) { yvel -= 1.5*movementrate; maneuver |= 1<<3;} + if(keystate[SDLK_DOWN] | keystate[SDLK_t]) { yvel += 1.5*movementrate; maneuver |= 1<<1;} + if(keystate[SDLK_LEFT] | keystate[SDLK_h]) { xvel -= 1.5*movementrate; maneuver |= 1<<2;} + if(keystate[SDLK_RIGHT] | keystate[SDLK_n]) { xvel += 1.5*movementrate; maneuver |= 1;} if(keystate[SDLK_3]) { SDL_SaveBMP(surf_screen, "snapshot.bmp"); } } @@ -1322,7 +1222,6 @@ int gameloop() { } else { - shieldsup = 0; paused = 0; pausedown = 0; } @@ -1341,7 +1240,7 @@ main(int argc, char **argv) { friction = 0; oss_sound_flag = 1; - while ((x = getopt(argc,argv,"efhsp"))>= 0) { + while ((x = getopt(argc,argv,"efhsp")) >= 0) { switch(x) { case 'e': // engine tail_plume = 1; @@ -1351,11 +1250,11 @@ main(int argc, char **argv) { break; case 'h': // help printf("Variations on RockDodger\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" - " -s [S]ilent (no sound)\n"); + " -e big tail [E]ngine\n" + " -f [F]ull screen\n" + " -h this [H]elp message\n" + " -p original [P]hysics (friction)\n" + " -s [S]ilent (no sound)\n"); exit(0); break; case 'p': // physics @@ -1373,7 +1272,7 @@ main(int argc, char **argv) { } while(1) { - for(i = 0; i