20 struct rock_struct rock[MAXROCKS], *rockptr = rock;
24 SDL_Surface *surf_rock[NROCKS];
25 struct shape rock_shapes[NROCKS];
32 // used for rock generation.
48 for(i = 0; i<NROCKS; i++) {
49 snprintf(a,MAX_PATH_LEN,add_path("sprites/rock%02d.png"),i);
50 NULLERROR(temp = IMG_Load(a));
51 NULLERROR(surf_rock[i] = SDL_DisplayFormat(temp));
52 get_shape(surf_rock[i], &rock_shapes[i]);
62 for(i = 0; i<MAXROCKS; i++ ) rock[i].active = 0;
71 float hfactor = KH*nrocks*7.5;
73 rockhtimer += hfactor*gamerate/20;
75 while(rockptr->active && i<MAXROCKS) {
76 if(++rockptr - rock >= MAXROCKS) rockptr = rock;
79 if(!rockptr->active) {
81 rockptr->dx = -5.0*(1.0 + rnd());
82 rockptr->dy = rnd()-0.5;
83 rockptr->type_number = random() % NROCKS;
84 rockptr->image = surf_rock[rockptr->type_number];
85 rockptr->shape = &rock_shapes[rockptr->type_number];
86 rockptr->x = (float)XSIZE;
87 rockptr->y = rnd()*(YSIZE + rockptr->image->h);
99 for(i = 0; i < MAXROCKS; i++) {
102 rock[i].x += rock[i].dx*gamerate;
103 rock[i].y += rock[i].dy*gamerate + yscroll;
105 if(rock[i].y < -rock[i].image->h || rock[i].y > YSIZE) {
106 // rock[i].active = 0;
107 rock[i].y = (YSIZE - rock[i].image->h) - rock[i].y;
108 rock[i].y += (rock[i].dy*gamerate + yscroll) * 1.01;
110 if(rock[i].x < -rock[i].image->w || rock[i].x > XSIZE) rock[i].active = 0;
121 src.x = 0; src.y = 0;
123 for(i = 0; i<MAXROCKS; i++) {
125 src.w = rock[i].image->w;
126 src.h = rock[i].image->h;
130 dest.x = (int) rock[i].x;
131 dest.y = (int) rock[i].y;
133 SDL_BlitSurface(rock[i].image,&src,surf_screen,&dest);
140 hit_rocks(float x, float y, struct shape *shape)
144 for(i=0; i<MAXROCKS; i++) {
146 if(collide(x-rock[i].x, y-rock[i].y, rock[i].shape, shape))
154 blast_rocks(float x, float y, float radius, int onlyslow)
159 for(i = 0; i<MAXROCKS; i++ ) {
160 if(rock[i].x <= 0) continue;
162 // This makes it so your explosion from dying magically doesn't leave
163 // any rocks that aren't moving much on the x axis. If onlyslow is set,
164 // only rocks that are barely moving will be pushed.
165 if(onlyslow && (rock[i].dx < -4 || rock[i].dx > 3)) continue;
170 n = sqrt(dx*dx + dy*dy);
173 rock[i].dx += rockrate*(dx+30)/n;
174 rock[i].dy += rockrate*dy/n;