+static inline Sprite **
+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;
+}
+
+static inline void
+insert_sprite(Sprite **head, Sprite *this)
+{
+ this->next = *head;
+ *head = this;
+}
+
+static inline Sprite *
+remove_sprite(Sprite **head)
+{
+ Sprite *this = *head;
+ *head = this->next;
+ return this;
+}
+
+void
+reset_rocks(void)
+{
+ int i;
+
+ for(i=0; i<MAXROCKS; i++) rocks[i].image = NULL;
+
+ rocks[0].next = NULL;
+ for(i=1; i<MAXROCKS; i++) rocks[i].next = &rocks[i-1];
+ free_rocks = SPRITE(&rocks[MAXROCKS-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")