Remove arbitrary restriction on Net minimum game size. (Awww, cute
[sgt/puzzles] / cube.c
diff --git a/cube.c b/cube.c
index 1bc08f6..e779068 100644 (file)
--- a/cube.c
+++ b/cube.c
@@ -511,15 +511,7 @@ char *new_game_seed(game_params *params)
 
     for (i = 0; i < data.nclasses; i++) {
        for (j = 0; j < facesperclass; j++) {
-           unsigned long divisor = RAND_MAX / data.nsquares[i];
-           unsigned long max = divisor * data.nsquares[i];
-           unsigned long n;
-
-           do {
-               n = rand();
-           } while (n >= max);
-
-           n /= divisor;
+            int n = rand_upto(data.nsquares[i]);
 
            assert(!flags[data.gridptrs[i][n]]);
            flags[data.gridptrs[i][n]] = TRUE;
@@ -529,7 +521,7 @@ char *new_game_seed(game_params *params)
             * better data structure for this, but for such small
             * numbers it hardly seems worth the effort.
             */
-           while ((int)n < data.nsquares[i]-1) {
+           while (n < data.nsquares[i]-1) {
                data.gridptrs[i][n] = data.gridptrs[i][n+1];
                n++;
            }
@@ -567,19 +559,7 @@ char *new_game_seed(game_params *params)
     /*
      * Choose a non-blue square for the polyhedron.
      */
-    {
-       unsigned long divisor = RAND_MAX / m;
-       unsigned long max = divisor * m;
-       unsigned long n;
-
-       do {
-           n = rand();
-       } while (n >= max);
-
-       n /= divisor;
-
-       sprintf(p, ":%d", data.gridptrs[0][n]);
-    }
+    sprintf(p, ":%d", data.gridptrs[0][rand_upto(m)]);
 
     sfree(data.gridptrs[0]);
     sfree(flags);
@@ -808,7 +788,7 @@ game_state *new_game(game_params *params, char *seed)
 
     state->previous = state->current;
     state->angle = 0.0;
-    state->completed = FALSE;
+    state->completed = 0;
     state->movecount = 0;
 
     return state;
@@ -1066,6 +1046,8 @@ game_state *make_move(game_state *from, int x, int y, int button)
         ret->facecolours = newcolours;
     }
 
+    ret->movecount++;
+
     /*
      * And finally, swap the colour between the bottom face of the
      * polyhedron and the face we've just landed on.
@@ -1088,7 +1070,7 @@ game_state *make_move(game_state *from, int x, int y, int button)
             if (ret->facecolours[i])
                 j++;
         if (j == ret->solid->nfaces)
-            ret->completed = TRUE;
+            ret->completed = ret->movecount;
     }
 
     sfree(poly);
@@ -1117,7 +1099,6 @@ game_state *make_move(game_state *from, int x, int y, int button)
     ret->sgkey[1] = skey[1];
     ret->previous = from->current;
     ret->angle = angle;
-    ret->movecount++;
 
     return ret;
 }
@@ -1313,8 +1294,8 @@ void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
         }
 
         for (j = 0; j < poly->order; j++) {
-            coords[j*2] = (int)(points[j*2] * GRID_SCALE) + ds->ox;
-            coords[j*2+1] = (int)(points[j*2+1] * GRID_SCALE) + ds->oy;
+            coords[j*2] = (int)floor(points[j*2] * GRID_SCALE) + ds->ox;
+            coords[j*2+1] = (int)floor(points[j*2+1] * GRID_SCALE) + ds->oy;
         }
 
         /*
@@ -1349,6 +1330,19 @@ void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
 
     draw_update(fe, 0, 0, (int)((bb.r-bb.l+2.0F) * GRID_SCALE),
                 (int)((bb.d-bb.u+2.0F) * GRID_SCALE));
+
+    /*
+     * Update the status bar.
+     */
+    {
+       char statusbuf[256];
+
+       sprintf(statusbuf, "%sMoves: %d",
+               (state->completed ? "COMPLETED! " : ""),
+               (state->completed ? state->completed : state->movecount));
+
+       status_bar(fe, statusbuf);
+    }
 }
 
 float game_anim_length(game_state *oldstate, game_state *newstate)
@@ -1360,3 +1354,8 @@ float game_flash_length(game_state *oldstate, game_state *newstate)
 {
     return 0.0F;
 }
+
+int game_wants_statusbar(void)
+{
+    return TRUE;
+}