X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=rocks.c;h=ed98cac172b5781bd55f2a13ef705a8285eecfcd;hp=f68a57a2c4c69b816eb9259eab9460f1bd5e3435;hb=148882a3cc520f34616a1175ed157fe258d68dcc;hpb=2b5dd5bc0eb1739dd744de6f565d0f3a7ae02c95 diff --git a/rocks.c b/rocks.c index f68a57a..ed98cac 100644 --- a/rocks.c +++ b/rocks.c @@ -9,103 +9,55 @@ #include "globals.h" #include "mt.h" #include "rocks.h" -#include "shape.h" +#include "sprite.h" -struct rock_struct { - struct rock_struct *next; - float x,y,dx,dy; - SDL_Surface *image; - struct shape *shape; - int type_number; -}; - -struct rock_struct rocks[MAXROCKS], *free_rocks; - -struct rock_struct **rock_buckets[2]; -int n_buckets, p; -int bw, bh; -int grid_size; - -SDL_Surface *surf_rock[NROCKS]; -struct shape rock_shapes[NROCKS]; +static struct rock rocks[MAXROCKS]; +static struct rock prototypes[NROCKS]; // timers for rock generation. -float rtimers[4]; +static float rtimers[4]; -uint32_t nrocks; -float nrocks_timer; -float nrocks_inc_ticks = 2*60*20/(F_ROCKS-I_ROCKS); +uint32_t nrocks = NORMAL_I_ROCKS; +uint32_t initial_rocks = NORMAL_I_ROCKS; +uint32_t final_rocks = NORMAL_F_ROCKS; +float nrocks_timer = 0; +float nrocks_inc_ticks = 2*60*20/(NORMAL_F_ROCKS-NORMAL_I_ROCKS); // constants for rock generation. -#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 KH (32*20) // 32 s for a speed=1 rock to cross the screen horizontally. +#define KV (24*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 (+/-) -static inline int bucket(int x, int y) { return (1+x/grid_size) + bw*(1+y/grid_size); } - void -init_buckets(void) +reset_rocks(void) { - bw = (XSIZE+2*grid_size-1) / grid_size; - bh = (YSIZE+2*grid_size-1) / grid_size; - n_buckets = bw * bh; - - rock_buckets[0] = malloc(n_buckets * sizeof(struct rock_struct *)); - rock_buckets[1] = malloc(n_buckets * sizeof(struct rock_struct *)); - if(!rock_buckets[0] || !rock_buckets[1]) { - fprintf(stderr, "Can't allocate rock buckets.\n"); - exit(1); - } - p = 0; + nrocks = initial_rocks; + nrocks_inc_ticks = 2*60*20/(final_rocks-initial_rocks); + nrocks_timer = 0; } -void -sort_rock(struct rock_struct *q, struct rock_struct *r, int p) -{ - int b = bucket(r->x, r->y); - q->next = r->next; // remove from old list - r->next = rock_buckets[p][b]; // insert into new list - rock_buckets[p][b] = r; -} +#define ROCK_LEN sizeof("sprites/rockXX.png") void -reset_rocks(void) +load_rocks(void) { int i; + char a[ROCK_LEN]; - for(i=0; i= nrocks_inc_ticks) { nrocks_timer -= nrocks_inc_ticks; @@ -202,11 +154,11 @@ new_rocks(void) for(i=0; i<4; i++) { while(rtimers[i] >= 1) { rtimers[i] -= 1; - if(!free_rocks) return; // sorry, we ran out of rocks! - r = free_rocks; - r->type_number = urnd() % NROCKS; - r->image = surf_rock[r->type_number]; - r->shape = &rock_shapes[r->type_number]; + if(!free_sprites[ROCK]) return; // sorry, we ran out of rocks! + r = (struct rock *) remove_sprite(&free_sprites[ROCK]); + type = urnd() % NROCKS; + *r = prototypes[type]; + r->type = type; switch(i) { case RIGHT: r->x = XSIZE; @@ -237,135 +189,39 @@ new_rocks(void) r->dy = weighted_rnd_range(rmin[i], rmax[i]) + screendy; break; } - sort_rock((struct rock_struct *)&free_rocks, r, p); + add_sprite(SPRITE(r)); } } } -void -move_rocks(void) -{ - int b; - struct rock_struct *q,*r; - - // Move all the rocks - for(b=0; bnext; - while(r) { - // move - r->x += (r->dx - screendx)*t_frame; - r->y += (r->dy - screendy)*t_frame; - - // clip - if(r->x + r->image->w < 0 || r->x >= XSIZE - || r->y + r->image->h < 0 || r->y >= YSIZE) { - q->next = r->next; - r->next = free_rocks; free_rocks = r; - r->image = NULL; - } else sort_rock(q,r,1-p); - if(q->next == r) q = q->next; - if(q) r = q->next; else r = NULL; - } - } - p = 1-p; // switch current set of buckets. -} void draw_rocks(void) { int i; - SDL_Rect dest; - - for(i=0; inext) { - if(collide(x - r->x, y - r->y, r->shape, shape)) return 1; - } - return 0; -} - -int -hit_rocks(float x, float y, struct shape *shape) -{ - int b = bucket(x, y); - int bdx = ((int)x+shape->w)/grid_size - (int)x/grid_size; - int bdy = ((int)y+shape->h)/grid_size - (int)y/grid_size; - if(hit_in_bucket(b, x, y, shape)) return 1; - if(hit_in_bucket(b-1, x, y, shape)) return 1; - if(hit_in_bucket(b-bw, x, y, shape)) return 1; - if(hit_in_bucket(b-bw-1, x, y, shape)) return 1; - - if(bdx) { - if(hit_in_bucket(b+1, x, y, shape)) return 1; - if(hit_in_bucket(b+1-bw, x, y, shape)) return 1; - } - if(bdy) { - if(hit_in_bucket(b+bw, x, y, shape)) return 1; - if(hit_in_bucket(b+bw-1, x, y, shape)) return 1; - } - if(bdx && bdy && hit_in_bucket(b+bw+1, x, y, shape)) return 1; - return 0; -} - -int -pixel_hit_in_bucket(int b, float x, float y) -{ - struct rock_struct *r; - for(r=rock_buckets[p][b]; r; r=r->next) { - if(x < r->x || y < r->y) continue; - if(pixel_collide(x - r->x, y - r->y, r->shape)) return 1; - } - return 0; -} - -int -pixel_hit_rocks(float x, float y) -{ - int b = bucket(x, y); - if(pixel_hit_in_bucket(b, x, y)) return 1; - if(pixel_hit_in_bucket(b-1, x, y)) return 1; - if(pixel_hit_in_bucket(b-bw, x, y)) return 1; - if(pixel_hit_in_bucket(b-bw-1, x, y)) return 1; - return 0; + for(i=0; inext) { - if(r->x <= 0) continue; - - // This makes it so your explosion from dying magically doesn't leave - // any rocks that aren't moving much on the x axis. If onlyslow is set, - // only rocks that are barely moving will be pushed. - if(onlyslow && (r->dx - screendx < -4 || r->dx - screendx > 3)) continue; - - dx = r->x - x; - dy = r->y - y; - - n = sqrt(dx*dx + dy*dy); - if(n < radius) { - n *= 15; - r->dx += 54.0*dx/n; - r->dy += 54.0*dy/n; - } + for(i=0; ix <= 0) continue; + + dx = r->x - x; + dy = r->y - y; + + n = sqrt(dx*dx + dy*dy); + if(n < radius) { + n *= 15; + r->dx += 54.0*dx/n; + r->dy += 54.0*dy/n; } } }