aboutsummaryrefslogtreecommitdiff
path: root/midend.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2004-04-28 12:07:15 +0000
committerSimon Tatham <anakin@pobox.com>2004-04-28 12:07:15 +0000
commit3d8e7585b7a9d215e4b40d9f83f7fa5a0fd79b43 (patch)
treebcbe1187a4bedd34122a5a65366c2dbfe2e8641b /midend.c
parent03e486268314c77a0180c7c2c4fbe2bb74c1a553 (diff)
downloadpuzzles-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.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/midend.c b/midend.c
index d309068..cafc8ea 100644
--- a/midend.c
+++ b/midend.c
@@ -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];
+}