diff options
| author | Simon Tatham <anakin@pobox.com> | 2004-04-28 12:07:15 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2004-04-28 12:07:15 +0000 |
| commit | 3d8e7585b7a9d215e4b40d9f83f7fa5a0fd79b43 (patch) | |
| tree | bcbe1187a4bedd34122a5a65366c2dbfe2e8641b /cube.c | |
| parent | 03e486268314c77a0180c7c2c4fbe2bb74c1a553 (diff) | |
| download | puzzles-3d8e7585b7a9d215e4b40d9f83f7fa5a0fd79b43.zip puzzles-3d8e7585b7a9d215e4b40d9f83f7fa5a0fd79b43.tar.gz puzzles-3d8e7585b7a9d215e4b40d9f83f7fa5a0fd79b43.tar.bz2 puzzles-3d8e7585b7a9d215e4b40d9f83f7fa5a0fd79b43.tar.xz | |
Add a menu bar, in both Windows and GTK. In particular, game modules
are now expected to provide a list of `presets' (game_params plus a
name) which are selectable from the menu. This means I can play
both Octahedron and Cube without recompiling in between :-)
While I'm here, also enabled a Cygwin makefile, which Just Worked.
[originally from svn r4158]
Diffstat (limited to 'cube.c')
| -rw-r--r-- | cube.c | 64 |
1 files changed, 56 insertions, 8 deletions
@@ -21,6 +21,7 @@ struct solid { int faces[MAXFACES * MAXORDER]; /* order*nfaces point indices */ float normals[MAXFACES * 3]; /* 3*npoints vector components */ float shear; /* isometric shear for nice drawing */ + float border; /* border required around arena */ }; static const struct solid tetrahedron = { @@ -41,7 +42,7 @@ static const struct solid tetrahedron = { 0.816496580928, -0.471404520791, 0.333333333334, 0.0, 0.0, -1.0, }, - 0.0 + 0.0, 0.3 }; static const struct solid cube = { @@ -57,7 +58,7 @@ static const struct solid cube = { { -1,0,0, 0,0,+1, +1,0,0, 0,0,-1, 0,-1,0, 0,+1,0 }, - 0.3 + 0.3, 0.5 }; static const struct solid octahedron = { @@ -84,7 +85,7 @@ static const struct solid octahedron = { 0.816496580928, -0.471404520791, -0.333333333334, 0.816496580928, 0.471404520791, 0.333333333334, }, - 0.0 + 0.0, 0.5 }; static const struct solid icosahedron = { @@ -132,7 +133,7 @@ static const struct solid icosahedron = { -0.57735026919, -0.333333333334, -0.745355992501, 0.57735026919, -0.333333333334, -0.745355992501, }, - 0.0 + 0.0, 0.8 }; enum { @@ -216,11 +217,58 @@ game_params *default_params(void) return ret; } +int game_fetch_preset(int i, char **name, game_params **params) +{ + game_params *ret = snew(game_params); + char *str; + + switch (i) { + case 0: + str = "Cube"; + ret->solid = CUBE; + ret->d1 = 4; + ret->d2 = 4; + break; + case 1: + str = "Tetrahedron"; + ret->solid = TETRAHEDRON; + ret->d1 = 2; + ret->d2 = 1; + break; + case 2: + str = "Octahedron"; + ret->solid = OCTAHEDRON; + ret->d1 = 2; + ret->d2 = 2; + break; + case 3: + str = "Icosahedron"; + ret->solid = ICOSAHEDRON; + ret->d1 = 3; + ret->d2 = 3; + break; + default: + sfree(ret); + return FALSE; + } + + *name = dupstr(str); + *params = ret; + return TRUE; +} + void free_params(game_params *params) { sfree(params); } +game_params *dup_params(game_params *params) +{ + game_params *ret = snew(game_params); + *ret = *params; /* structure copy */ + return ret; +} + static void enum_grid_squares(game_params *params, void (*callback)(void *, struct grid_square *), void *ctx) @@ -1083,8 +1131,8 @@ static struct bbox find_bbox(game_params *params) void game_size(game_params *params, int *x, int *y) { struct bbox bb = find_bbox(params); - *x = (bb.r - bb.l + 2) * GRID_SCALE; - *y = (bb.d - bb.u + 2) * GRID_SCALE; + *x = (bb.r - bb.l + 2*solids[params->solid]->border) * GRID_SCALE; + *y = (bb.d - bb.u + 2*solids[params->solid]->border) * GRID_SCALE; } float *game_colours(frontend *fe, game_state *state, int *ncolours) @@ -1110,8 +1158,8 @@ game_drawstate *game_new_drawstate(game_state *state) struct game_drawstate *ds = snew(struct game_drawstate); struct bbox bb = find_bbox(&state->params); - ds->ox = -(bb.l - 1) * GRID_SCALE; - ds->oy = -(bb.u - 1) * GRID_SCALE; + ds->ox = -(bb.l - state->solid->border) * GRID_SCALE; + ds->oy = -(bb.u - state->solid->border) * GRID_SCALE; return ds; } |