#include #include #include #include #include "common.h" #include "vorconfig.h" #include "file.h" #include "globals.h" #include "mt.h" #include "rocks.h" #include "sprite.h" static struct rock rocks[MAXROCKS]; static struct rock prototypes[NROCKS]; // timers for rock generation. static float rtimers[4]; 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*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 (+/-) void reset_rocks(void) { nrocks = initial_rocks; nrocks_inc_ticks = 2*60*20/(final_rocks-initial_rocks); nrocks_timer = 0; } #define ROCK_LEN sizeof("rockXX.png") void load_rocks(void) { int i; char a[ROCK_LEN]; for(i=0; i= nrocks_inc_ticks) { nrocks_timer -= nrocks_inc_ticks; nrocks++; } } rock_sides(ti, rmin, rmax); // increment timers for(i=0; i<4; i++) rtimers[i] += ti[i]*t_frame; // generate rocks for(i=0; i<4; i++) { while(rtimers[i] >= 1) { rtimers[i] -= 1; 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; r->life = r->area * 300; switch(i) { case RIGHT: r->x = XSIZE; r->y = frnd()*(YSIZE + r->image->h); r->dx = -weighted_rnd_range(rmin[i], rmax[i]) + screendx; r->dy = RDY*crnd(); break; case LEFT: r->x = -r->image->w; r->y = frnd()*(YSIZE + r->image->h); r->dx = weighted_rnd_range(rmin[i], rmax[i]) + screendx; r->dy = RDY*crnd(); break; case BOTTOM: r->x = (frnd()*(XSIZE + r->image->w)) - r->image->w; r->y = YSIZE; r->dx = RDX*crnd(); r->dy = -weighted_rnd_range(rmin[i], rmax[i]) + screendy; break; case TOP: r->x = (frnd() * (XSIZE + r->image->w)) - r->image->w; r->y = -r->image->h; r->dx = RDX*crnd(); r->dy = weighted_rnd_range(rmin[i], rmax[i]) + screendy; break; } add_sprite(SPRITE(r)); } } } void draw_rocks(void) { int i; for(i=0; i