JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
cleaned up bang dots code a bit
[vor.git] / main.c
diff --git a/main.c b/main.c
index c32feb3..d9e81ef 100644 (file)
--- a/main.c
+++ b/main.c
 
 #include "SFont.h"
 
-#ifdef DEBUG
-#include "debug.h"
-#endif
-
 #include "args.h"
 #include "common.h"
 #include "config.h"
@@ -71,8 +67,6 @@ struct bangdots bdot[MAXBANGDOTS], *bdotptr = bdot;
 char topline[1024];
 char *initerror = "";
 
-
-
 struct shape shipshape;
 float shipx = XSIZE/2, shipy = YSIZE/2;        // X position, 0..XSIZE
 float shipdx = SCREENDXMIN, shipdy = 0.0;      // Change in X position per tick.
@@ -82,14 +76,12 @@ float back_dist;
 
 // all movement is based on t_frame.
 float t_frame;  // length of this frame (in ticks = 1/20th second)
-float s_frame;  // length of this frame (seconds)
 int ms_frame;   // length of this frame (milliseconds)
 int ms_end;     // end of this frame (milliseconds)
 
 float bangx, bangy, bangdx, bangdy;
 
 int nships,score;
-int gameover;
 int jets = 0;
 
 float fadetimer = 0, faderate;
@@ -136,57 +128,53 @@ init_engine_dots() {
 }
 
 void
-new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s, int power)
+new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s)
 {
        int x,y,endcount;
-       Uint16 *rawpixel,c;
+       uint16_t *pixel,c;
+       uint32_t colorkey;
+       int row_inc;
        double theta,r;
        int begin_generate;
 
        begin_generate = SDL_GetTicks();
+       pixel = s->pixels;
+       row_inc = s->pitch/sizeof(uint16_t) - s->w;
+       colorkey = s->format->colorkey;
 
        SDL_LockSurface(s);
-       rawpixel = (Uint16 *) s->pixels;
-
-       //for(n = 0; n <= power/2; n++) {
 
        endcount = 0;
        while (endcount<3) {
-               for(x = 0; x<s->w; x++) {
-                       for(y = 0; y<s->h; y++) {
-                               c = rawpixel[s->pitch/2*y + x];
-                               if(c && c != s->format->colorkey) {
-
+               pixel = s->pixels;
+               for(y=0; y<s->h; y++) {
+                       for(x = 0; x<s->w; x++) {
+                               c = *pixel++;
+                               if(c && c != colorkey) {
                                        theta = frnd()*M_PI*2;
+                                       r = frnd(); r = 1 - r*r;
 
-                                       r = 1-(frnd()*frnd());
-
-                                       bdot[bd2].dx = (power/50.0)*45.0*cos(theta)*r + dx;
-                                       bdot[bd2].dy = (power/50.0)*45.0*sin(theta)*r + dy;
+                                       bdot[bd2].dx = 45*r*cos(theta) + dx;
+                                       bdot[bd2].dy = 45*r*sin(theta) + dy;
                                        bdot[bd2].x = x + xbang;
                                        bdot[bd2].y = y + ybang;
-
-                                       // Replace the last few bang dots with the pixels from the exploding object
-                                       bdot[bd2].c = (endcount>0)?c:0;
+                                       bdot[bd2].c = 0;
                                        bdot[bd2].life = 100;
                                        bdot[bd2].decay = frnd()*3 + 1;
                                        bdot[bd2].active = 1;
 
-                                       bd2++;
-                                       bd2 %= MAXBANGDOTS;
-
-                                       // If the circular buffer is filled, who cares? They've had their chance.
-                                       //if(bd2 == bd1-1) goto exitloop;
+                                       // Replace the last few bang dots with the pixels from the exploding object
+                                       if(endcount>0) bdot[bd2].c = c;
 
+                                       bd2 = (bd2+1) % MAXBANGDOTS;
                                }
+                               pixel += row_inc;
                        }
                }
-
                if(SDL_GetTicks() - begin_generate > 7) endcount++;
        }
 
        SDL_UnlockSurface(s);
-
 }
 
 void
@@ -211,14 +199,12 @@ draw_bang_dots(SDL_Surface *s) {
                if(bdot[i].active) {
                        if(first_i < 0)
                        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].x += bdot[i].dx*t_frame - xscroll;
                        bdot[i].y += bdot[i].dy*t_frame - yscroll;
 
-                       if(bdot[i].life<0)
-                       bdot[i].active = 0;
+                       if(bdot[i].life<0) bdot[i].active = 0;
                }
        }
 
@@ -289,10 +275,8 @@ new_engine_dots(int n, int dir) {
                                dotptr->life = 60 * fabs(dx);
                        }
 
-                       dotptr++;
-                       if(dotptr-edot >= MAXENGINEDOTS) {
-                               dotptr = edot;
-                       }
+                       if(dotptr - edot < MAXENGINEDOTS) dotptr++;
+                       else dotptr = edot;
                }
        }
 }
@@ -423,7 +407,7 @@ draw() {
        drawdots(surf_screen);
 
        // Draw ship
-       if(!gameover && state == GAMEPLAY ) {
+       if(state == GAMEPLAY ) {
                dest.x = shipx;
                dest.y = shipy;
                SDL_BlitSurface(surf_ship,NULL,surf_screen,&dest);
@@ -432,11 +416,12 @@ draw() {
        draw_rocks();
 
        // Draw the life indicators.
-       if(state == GAMEPLAY || state == DEAD_PAUSE || state == GAME_OVER)
-       for(i = 0; i<nships-1; i++) {
-               dest.x = (i + 1)*(surf_life->w + 10);
-               dest.y = 20;
-               SDL_BlitSurface(surf_life, NULL, surf_screen, &dest);
+       if(state == GAMEPLAY || state == DEAD_PAUSE || state == GAME_OVER) {
+               for(i = 0; i<nships-1; i++) {
+                       dest.x = (i + 1)*(surf_life->w + 10);
+                       dest.y = 20;
+                       SDL_BlitSurface(surf_life, NULL, surf_screen, &dest);
+               }
        }
 
        // Draw the score
@@ -521,7 +506,7 @@ draw() {
                        ; // no action necessary
        }
 
-       if(!gameover && state == GAMEPLAY) {
+       if(state == GAMEPLAY) {
                bang = hit_rocks(shipx, shipy, &shipshape);
        }
 
@@ -530,13 +515,12 @@ draw() {
        if(ms_frame>200 || ms_frame<0) {
                // We won't run at all below 5 frames per second.
                // This also happens if we were paused, grr.
-               s_frame = 0;
+               t_frame = 0;
                ms_frame = 0;
        } else {
-               s_frame = opt_gamespeed * ms_frame / 1000;
+               t_frame = opt_gamespeed * ms_frame / 50;
                if(state == GAMEPLAY) score += ms_frame;
        }
-       t_frame = s_frame * 20;
 
        // Update the surface
        SDL_Flip(surf_screen);
@@ -617,17 +601,18 @@ gameloop() {
                        screendy += tmp * t_frame/12;
                        tmp = (shipx-XSCROLLTO)/25 + (shipdx-screendx);
                        screendx += tmp * t_frame/12;
-
-                       // taper off if we would hit the barrier in under 2 seconds.
+                       // taper off so we don't hit the barrier abruptly.
+                       // (if we would hit in < 2 seconds, adjust to 2 seconds).
                        if(back_dist + (screendx - SCREENDXMIN)*TO_TICKS(2) < 0) {
                                screendx = SCREENDXMIN - (back_dist/TO_TICKS(2));
                        }
 
-                       xscroll = screendx * t_frame;
-                       yscroll = screendy * t_frame;
                        back_dist += (screendx - SCREENDXMIN)*t_frame;
                        if(opt_max_lead >= 0) back_dist = min(back_dist, opt_max_lead);
 
+                       xscroll = screendx * t_frame;
+                       yscroll = screendy * t_frame;
+
                        shipx -= xscroll;
                        shipy -= yscroll;
 
@@ -657,13 +642,12 @@ gameloop() {
                                // Died
                                play_sound(SOUND_BANG); // Play the explosion sound
                                bangx = shipx; bangy = shipy; bangdx = shipdx; bangdy = shipdy;
-                               new_bang_dots(shipx,shipy,shipdx,shipdy,surf_ship,30);
+                               new_bang_dots(shipx,shipy,shipdx,shipdy,surf_ship);
                                shipdx *= 0.5; shipdy *= 0.5;
                                if(shipdx < SCREENDXMIN) shipdx = SCREENDXMIN;
                                if(--nships <= 0) {
                                        state = GAME_OVER;
-                                       gameover = 1;
-                                       shipdx = 8; shipdy = 0;
+                                       shipdx = SCREENDXMIN; shipdy = 0;
                                        state_timeout = 200.0;
                                        fadetimer = 0.0;
                                        faderate = t_frame;
@@ -688,7 +672,6 @@ gameloop() {
                                state = GAMEPLAY;
                                play_tune(TUNE_GAMEPLAY);
 
-                               gameover = 0;
                                shipx = XSIZE/2.2; shipy = YSIZE/2;
                                shipdx = screendx; shipdy = screendy;
                        }
@@ -700,28 +683,20 @@ gameloop() {
                }
 
                if(state == GAMEPLAY) {
-                       if(!gameover) {
-
-                               if(!paused) {
-                                       if(keystate[SDLK_LEFT]  | keystate[SDLK_h]) { shipdx -= 1.5*t_frame; jets |= 1<<0;}
-                                       if(keystate[SDLK_DOWN]  | keystate[SDLK_t]) { shipdy += 1.5*t_frame; jets |= 1<<1;}
-                                       if(keystate[SDLK_RIGHT] | keystate[SDLK_n]) { shipdx += 1.5*t_frame; jets |= 1<<2;}
-                                       if(keystate[SDLK_UP]    | keystate[SDLK_c]) { shipdy -= 1.5*t_frame; jets |= 1<<3;}
-                                       if(keystate[SDLK_3])            { SDL_SaveBMP(surf_screen, "snapshot.bmp"); }
-                               }
+                       if(!paused) {
+                               if(keystate[SDLK_LEFT]  | keystate[SDLK_h]) { shipdx -= 1.5*t_frame; jets |= 1<<0;}
+                               if(keystate[SDLK_DOWN]  | keystate[SDLK_t]) { shipdy += 1.5*t_frame; jets |= 1<<1;}
+                               if(keystate[SDLK_RIGHT] | keystate[SDLK_n]) { shipdx += 1.5*t_frame; jets |= 1<<2;}
+                               if(keystate[SDLK_UP]    | keystate[SDLK_c]) { shipdy -= 1.5*t_frame; jets |= 1<<3;}
+                               if(keystate[SDLK_3])            { SDL_SaveBMP(surf_screen, "snapshot.bmp"); }
+                       }
 
-                               if(keystate[SDLK_p] | keystate[SDLK_s]) {
-                                       if(!pausedown) {
-                                               paused = !paused;
-                                               pausedown = 1;
-                                       }
-                               } else {
-                                       pausedown = 0;
+                       if(keystate[SDLK_p] | keystate[SDLK_s]) {
+                               if(!pausedown) {
+                                       paused = !paused;
+                                       pausedown = 1;
                                }
-
-                       }
-                       else {
-                               paused = 0;
+                       } else {
                                pausedown = 0;
                        }
                } else if(state == GAME_OVER) {