+static inline struct rock **
+bucket(int x, int y, int p)
+{
+ int b = (x+grid_size)/grid_size + bw*((y+grid_size)/grid_size);
+ return &rock_buckets[p][b];
+}
+
+void
+init_buckets(void)
+{
+ int scr_grid_w = (XSIZE+2*grid_size-1) / grid_size;
+ int scr_grid_h = (YSIZE+2*grid_size-1) / grid_size;
+ bw = 1 + scr_grid_w + 1;
+ bh = 1 + scr_grid_h + 1;
+ n_buckets = bw * bh;
+
+ rock_buckets[0] = malloc(n_buckets * sizeof(struct rock *));
+ rock_buckets[1] = malloc(n_buckets * sizeof(struct rock *));
+ if(!rock_buckets[0] || !rock_buckets[1]) {
+ fprintf(stderr, "Can't allocate rock buckets.\n");
+ exit(1);
+ }
+ p = 0;
+}
+
+void
+transfer_rock(struct rock *r, struct rock **from, struct rock **to)
+{
+ *from = &r->next->rock;
+ r->next = SPRITE(*to);
+ *to = r;
+}
+
+void
+reset_rocks(void)
+{
+ int i;
+
+ for(i=0; i<MAXROCKS; i++) rocks[i].image = NULL;
+ rocks[0].next = NULL; free_rocks = &rocks[MAXROCKS-1];
+ for(i = 1; i<MAXROCKS; i++) rocks[i].next = SPRITE(&rocks[i-1]);
+ for(i = 0; i<n_buckets; i++) {
+ rock_buckets[0][i] = NULL;
+ rock_buckets[1][i] = NULL;
+ }
+
+ nrocks = I_ROCKS;
+ nrocks_timer = 0;
+}
+
+#define ROCK_LEN sizeof("sprites/rockXX.png")