+static inline int bucket(int x, int y) { return (1+x/grid_size) + bw*(1+y/grid_size); }
+
+void
+init_buckets(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;
+}
+
+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;
+}
+
+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 = &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;
+}