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 /midend.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 'midend.c')
| -rw-r--r-- | midend.c | 42 |
1 files changed, 41 insertions, 1 deletions
@@ -14,6 +14,11 @@ struct midend_data { frontend *frontend; char *seed; int nstates, statesize, statepos; + + game_params **presets; + char **preset_names; + int npresets, presetsize; + game_params *params; game_state **states; game_drawstate *drawstate; @@ -39,6 +44,9 @@ midend_data *midend_new(frontend *frontend) me->seed = NULL; me->drawstate = NULL; me->oldstate = NULL; + me->presets = NULL; + me->preset_names = NULL; + me->npresets = me->presetsize = 0; return me; } @@ -59,7 +67,7 @@ void midend_size(midend_data *me, int *x, int *y) void midend_set_params(midend_data *me, game_params *params) { free_params(me->params); - me->params = params; + me->params = dup_params(params); } void midend_new_game(midend_data *me, char *seed) @@ -227,3 +235,35 @@ float *midend_colours(midend_data *me, int *ncolours) return ret; } + +int midend_num_presets(midend_data *me) +{ + if (!me->npresets) { + char *name; + game_params *preset; + + while (game_fetch_preset(me->npresets, &name, &preset)) { + if (me->presetsize <= me->npresets) { + me->presetsize = me->npresets + 10; + me->presets = sresize(me->presets, me->presetsize, + game_params *); + me->preset_names = sresize(me->preset_names, me->presetsize, + char *); + } + + me->presets[me->npresets] = preset; + me->preset_names[me->npresets] = name; + me->npresets++; + } + } + + return me->npresets; +} + +void midend_fetch_preset(midend_data *me, int n, + char **name, game_params **params) +{ + assert(n >= 0 && n < me->npresets); + *name = me->preset_names[n]; + *params = me->presets[n]; +} |