Implemented Cube, in a sufficiently general way that it also handles

the tetrahedron, octahedron and icosahedron.

[originally from svn r4151]
This commit is contained in:
Simon Tatham
2004-04-27 17:44:30 +00:00
parent 9867234e70
commit d99e217cfb
5 changed files with 1309 additions and 14 deletions

4
Recipe
View File

@ -15,7 +15,7 @@ COMMON = midend malloc
NET = net random tree234 NET = net random tree234
net : [X] gtk COMMON NET net : [X] gtk COMMON NET
#cube : [X] gtk COMMON CUBE cube : [X] gtk COMMON cube
#net : [G] windows COMMON NET #net : [G] windows COMMON NET
#cube : [G] windows COMMON CUBE #cube : [G] windows COMMON cube

1270
cube.c

File diff suppressed because it is too large Load Diff

19
gtk.c
View File

@ -12,6 +12,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "puzzles.h" #include "puzzles.h"
@ -135,12 +136,26 @@ static void destroy(GtkWidget *widget, gpointer data)
static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
{ {
frontend *fe = (frontend *)data; frontend *fe = (frontend *)data;
int keyval;
if (!fe->pixmap) if (!fe->pixmap)
return TRUE; return TRUE;
if (event->string[0] && !event->string[1] && if (event->string[0] && !event->string[1])
!midend_process_key(fe->me, 0, 0, event->string[0])) keyval = (unsigned char)event->string[0];
else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up)
keyval = CURSOR_UP;
else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down)
keyval = CURSOR_DOWN;
else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left)
keyval = CURSOR_LEFT;
else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right)
keyval = CURSOR_RIGHT;
else
keyval = -1;
if (keyval >= 0 &&
!midend_process_key(fe->me, 0, 0, keyval))
gtk_widget_destroy(fe->window); gtk_widget_destroy(fe->window);
return TRUE; return TRUE;

View File

@ -91,16 +91,22 @@ void midend_restart_game(midend_data *me)
me->statepos = me->nstates; me->statepos = me->nstates;
} }
void midend_undo(midend_data *me) static int midend_undo(midend_data *me)
{ {
if (me->statepos > 1) if (me->statepos > 1) {
me->statepos--; me->statepos--;
return 1;
} else
return 0;
} }
void midend_redo(midend_data *me) static int midend_redo(midend_data *me)
{ {
if (me->statepos < me->nstates) if (me->statepos < me->nstates) {
me->statepos++; me->statepos++;
return 1;
} else
return 0;
} }
int midend_process_key(midend_data *me, int x, int y, int button) int midend_process_key(midend_data *me, int x, int y, int button)
@ -127,9 +133,11 @@ int midend_process_key(midend_data *me, int x, int y, int button)
return 1; /* never animate */ return 1; /* never animate */
} else if (button == 'u' || button == 'u' || } else if (button == 'u' || button == 'u' ||
button == '\x1A' || button == '\x1F') { button == '\x1A' || button == '\x1F') {
midend_undo(me); if (!midend_undo(me))
return 1;
} else if (button == '\x12') { } else if (button == '\x12') {
midend_redo(me); if (!midend_redo(me))
return 1;
} else if (button == 'q' || button == 'Q' || button == '\x11') { } else if (button == 'q' || button == 'Q' || button == '\x11') {
free_game(oldstate); free_game(oldstate);
return 0; return 0;

View File

@ -17,7 +17,11 @@
enum { enum {
LEFT_BUTTON = 0x1000, LEFT_BUTTON = 0x1000,
MIDDLE_BUTTON, MIDDLE_BUTTON,
RIGHT_BUTTON RIGHT_BUTTON,
CURSOR_UP,
CURSOR_DOWN,
CURSOR_LEFT,
CURSOR_RIGHT
}; };
#define IGNORE(x) ( (x) = (x) ) #define IGNORE(x) ( (x) = (x) )
@ -53,8 +57,6 @@ void midend_set_params(midend_data *me, game_params *params);
void midend_size(midend_data *me, int *x, int *y); void midend_size(midend_data *me, int *x, int *y);
void midend_new_game(midend_data *me, char *seed); void midend_new_game(midend_data *me, char *seed);
void midend_restart_game(midend_data *me); void midend_restart_game(midend_data *me);
void midend_undo(midend_data *me);
void midend_redo(midend_data *me);
int midend_process_key(midend_data *me, int x, int y, int button); int midend_process_key(midend_data *me, int x, int y, int button);
void midend_redraw(midend_data *me); void midend_redraw(midend_data *me);
float *midend_colours(midend_data *me, int *ncolours); float *midend_colours(midend_data *me, int *ncolours);