From 9ec0c1c2741a39d38692ffeb0dfcbc88e874dbdf Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Sat, 23 Feb 2008 23:05:29 -0800 Subject: [PATCH] Make the game playable by clicking Works nicely on a single computer now. Still not yet networked. --- loa.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/loa.c b/loa.c index 3333fc3..5716a36 100644 --- a/loa.c +++ b/loa.c @@ -35,6 +35,9 @@ typedef struct { typedef struct { layout_t layout; loa_board_t board; + loa_bool_t has_selected; + int selected_x; + int selected_y; } loa_game_t; static gboolean @@ -54,6 +57,56 @@ on_delete_event_quit (GtkWidget *widget, /* Something like mahogany */ #define DARK_SQUARE_COLOR 0.26, 0.02, 0.01 +static gboolean +on_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data) +{ + loa_game_t *game = user_data; + layout_t *layout = &game->layout; + int x, y; + char *error; + + x = (event->x - layout->x_offset) / layout->cell_size; + y = (event->y - layout->y_offset) / layout->cell_size; + + if (! game->has_selected) { + if (game->board.cells[x][y] == game->board.player) { + game->has_selected = TRUE; + game->selected_x = x; + game->selected_y = y; + gtk_widget_queue_draw (widget); + } + return TRUE; + } + + if (x == game->selected_x && + y == game->selected_y) + { + game->has_selected = FALSE; + gtk_widget_queue_draw (widget); + return TRUE; + } + + if (loa_board_move (&game->board, + game->selected_x, game->selected_y, + x, y, &error)) + { + game->has_selected = FALSE; + gtk_widget_queue_draw (widget); + return TRUE; + } else { + printf ("Illegal move %c%d%c%d: %s\n", + 'a' + game->selected_x, + LOA_BOARD_SIZE - game->selected_y, + 'a' + x, + LOA_BOARD_SIZE - y, + error); + } + + return TRUE; +} + static gboolean on_expose_event_draw (GtkWidget *widget, GdkEventExpose *event, @@ -114,6 +167,17 @@ on_expose_event_draw (GtkWidget *widget, cairo_set_source_rgb (cr, DARK_SQUARE_COLOR); cairo_stroke (cr); } + if (game->has_selected && + x == game->selected_x && + y == game->selected_y) + { + cairo_arc (cr, + layout->cell_size / 2.0, layout->cell_size / 2.0, + layout->cell_size / 2.5, + 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0.2, 0.2, 1.0, 0.4); + cairo_fill (cr); + } cairo_restore (cr); } } @@ -129,6 +193,8 @@ loa_game_init (loa_game_t *game) game->layout.width = 0; game->layout.height = 0; + game->has_selected = FALSE; + loa_board_init (&game->board); } @@ -157,6 +223,10 @@ main (int argc, char *argv[]) g_signal_connect (drawing_area, "expose-event", G_CALLBACK (on_expose_event_draw), &game); + gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK); + g_signal_connect (drawing_area, "button-press-event", + G_CALLBACK (on_button_press_event), &game); + gtk_widget_show_all (window); gtk_main (); -- 2.43.0