X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/87ed82be805fe13d9f29dca16e867eaeb9a3fd24..ecadce0d85a03221ed31d8555fad816e27592b89:/cube.c diff --git a/cube.c b/cube.c index 1bc08f6..e779068 100644 --- 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; +}