X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=rocks.c;h=e7f216162d7f34add03249903d119d517c2d9583;hp=94df49954866645c95e4cb967f1a6e89a48b9abe;hb=446a34fd7d8133bc6c1f1fc998d813442849a2f2;hpb=28d859440d40ee2d7d54500f4687e86168137cb8 diff --git a/rocks.c b/rocks.c index 94df499..e7f2161 100644 --- a/rocks.c +++ b/rocks.c @@ -3,9 +3,11 @@ #include #include +#include "common.h" #include "config.h" #include "file.h" #include "globals.h" +#include "mt.h" #include "rocks.h" #include "shape.h" @@ -26,20 +28,15 @@ struct shape rock_shapes[NROCKS]; float rtimers[4]; uint32_t nrocks; -uint32_t nrocks_timer; -uint32_t nrocks_inc_ticks = 2*60*1000/(F_ROCKS-I_ROCKS); +float nrocks_timer; +float nrocks_inc_ticks = 2*60*20/(F_ROCKS-I_ROCKS); // constants for rock generation. -#define KH 32.0 // 32 s for a speed=1 rock to cross the screen horizontally. -#define KV 24.0 // 24 s for a speed=1 rock to cross the screen vertically. +#define KH (32.0*20) // 32 s for a speed=1 rock to cross the screen horizontally. +#define KV (24.0*20) // 24 s for a speed=1 rock to cross the screen vertically. #define RDX 2.5 // range for rock dx values (+/-) #define RDY 2.5 // range for rock dy values (+/-) -float rnd(void); - -#define crnd() (2*(rnd()-0.5)) - - int init_rocks(void) { @@ -53,6 +50,7 @@ init_rocks(void) NULLERROR(surf_rock[i] = SDL_DisplayFormat(temp)); get_shape(surf_rock[i], &rock_shapes[i]); } + reset_rocks(); return 0; } @@ -69,7 +67,7 @@ reset_rocks(void) enum { LEFT, RIGHT, TOP, BOTTOM }; -// compute the number of rocks/seccond that should be coming from each side +// compute the number of rocks/second that should be coming from each side // compute the speed ranges of rocks coming from each side void @@ -82,53 +80,49 @@ rock_sides(float *ti, float *speed_min, float *speed_max) for(i=0; i<4; i++) ti[i] = 0; for(i=0; i<4; i++) speed_min[i] = 0; for(i=0; i<4; i++) speed_max[i] = 0; - hfactor = nrocks/KH; vfactor = nrocks/KV; + hfactor = (float)nrocks/KH; vfactor = (float)nrocks/KV; dx0 = -RDX - screendx; dx1 = RDX - screendx; dy0 = -RDY - screendy; dy1 = RDY - screendy; - if(dx0 != 0) { - if(dx0 < 0) { - speed_max[RIGHT] = -dx0; - if(dx1 < 0) { - // Rocks moving left only. So the RIGHT side of the screen - speed_min[RIGHT] = -dx1; - ti[RIGHT] = -(dx0+dx1)/2; - } else { - // Rocks moving left and right - speed_max[LEFT] = dx1; - ti[RIGHT] = -dx0/2; - ti[LEFT] = dx1/2; - } + if(dx0 < 0) { + speed_max[RIGHT] = -dx0; + if(dx1 < 0) { + // Rocks moving left only. So the RIGHT side of the screen + speed_min[RIGHT] = -dx1; + ti[RIGHT] = -(dx0+dx1)/2; } else { - // Rocks moving right only. So the LEFT side of the screen - speed_min[LEFT] = dx0; + // Rocks moving left and right speed_max[LEFT] = dx1; - ti[LEFT] = (dx0+dx1)/2; + ti[RIGHT] = -dx0/2; + ti[LEFT] = dx1/2; } + } else { + // Rocks moving right only. So the LEFT side of the screen + speed_min[LEFT] = dx0; + speed_max[LEFT] = dx1; + ti[LEFT] = (dx0+dx1)/2; } ti[LEFT] *= hfactor; ti[RIGHT] *= hfactor; - if(dy0 != 0) { - if(dy0 < 0) { - speed_max[BOTTOM] = -dy0; - if(dy1 < 0) { - // Rocks moving up only. So the BOTTOM of the screen - speed_min[BOTTOM] = -dy1; - ti[BOTTOM] = -(dy0+dy1)/2; - } else { - // Rocks moving up and down - speed_max[TOP] = dy1; - ti[BOTTOM] = -dy0/2; - ti[TOP] = dy1/2; - } + if(dy0 < 0) { + speed_max[BOTTOM] = -dy0; + if(dy1 < 0) { + // Rocks moving up only. So the BOTTOM of the screen + speed_min[BOTTOM] = -dy1; + ti[BOTTOM] = -(dy0+dy1)/2; } else { - // Rocks moving down only. so the TOP of the screen - speed_min[TOP] = dy0; + // Rocks moving up and down speed_max[TOP] = dy1; - ti[TOP] = (dy0+dy1)/2; + ti[BOTTOM] = -dy0/2; + ti[TOP] = dy1/2; } + } else { + // Rocks moving down only. so the TOP of the screen + speed_min[TOP] = dy0; + speed_max[TOP] = dy1; + ti[TOP] = (dy0+dy1)/2; } ti[TOP] *= vfactor; ti[BOTTOM] *= vfactor; @@ -136,7 +130,7 @@ rock_sides(float *ti, float *speed_min, float *speed_max) float weighted_rnd_range(float min, float max) { - return sqrt(min * min + rnd() * (max * max - min * min)); + return sqrt(min * min + frnd() * (max * max - min * min)); } void @@ -148,7 +142,7 @@ new_rocks(void) float rmax[4]; if(nrocks < F_ROCKS) { - nrocks_timer += ticks_since_last; + nrocks_timer += t_frame; if(nrocks_timer >= nrocks_inc_ticks) { nrocks_timer -= nrocks_inc_ticks; nrocks++; @@ -160,7 +154,7 @@ new_rocks(void) // loop through the four sides of the screen for(i=0; i<4; i++) { // see if we generate a rock for this side this frame - rtimers[i] += ti[i]*gamerate/20; + rtimers[i] += ti[i]*t_frame; while(rtimers[i] >= 1) { rtimers[i] -= 1; j=0; @@ -175,30 +169,30 @@ new_rocks(void) switch(i) { case RIGHT: rockptr->x = XSIZE; - rockptr->y = rnd()*(YSIZE + rockptr->image->h); + rockptr->y = frnd()*(YSIZE + rockptr->image->h); rockptr->dx = -weighted_rnd_range(rmin[i], rmax[i]) + screendx; rockptr->dy = RDY*crnd(); break; case LEFT: rockptr->x = -rockptr->image->w; - rockptr->y = rnd()*(YSIZE + rockptr->image->h); + rockptr->y = frnd()*(YSIZE + rockptr->image->h); rockptr->dx = weighted_rnd_range(rmin[i], rmax[i]) + screendx; rockptr->dy = RDY*crnd(); break; case BOTTOM: - rockptr->x = rnd()*(XSIZE + rockptr->image->w); + rockptr->x = frnd()*(XSIZE + rockptr->image->w); rockptr->y = YSIZE; - rockptr->dx = RDY*crnd(); + rockptr->dx = RDX*crnd(); rockptr->dy = -weighted_rnd_range(rmin[i], rmax[i]) + screendy; break; case TOP: - rockptr->x = rnd()*(XSIZE + rockptr->image->w); + rockptr->x = frnd()*(XSIZE + rockptr->image->w); rockptr->y = -rockptr->image->h; - rockptr->dx = RDY*crnd(); + rockptr->dx = RDX*crnd(); rockptr->dy = weighted_rnd_range(rmin[i], rmax[i]) + screendy; break; } @@ -218,8 +212,8 @@ move_rocks(void) for(i = 0; i < MAXROCKS; i++) { if(rock[i].active) { // move - rock[i].x += (rock[i].dx-screendx)*gamerate; - rock[i].y += (rock[i].dy-screendy)*gamerate; + rock[i].x += (rock[i].dx-screendx)*t_frame; + rock[i].y += (rock[i].dy-screendy)*t_frame; // clip if(rock[i].x < -rock[i].image->w || rock[i].x >= XSIZE || rock[i].y < -rock[i].image->h || rock[i].y >= YSIZE) {