]> git.cworth.org Git - loa/commitdiff
Make the game playable by clicking
authorCarl Worth <cworth@cworth.org>
Sun, 24 Feb 2008 07:05:29 +0000 (23:05 -0800)
committerCarl Worth <cworth@cworth.org>
Sun, 24 Feb 2008 07:05:29 +0000 (23:05 -0800)
Works nicely on a single computer now. Still not yet networked.

loa.c

diff --git a/loa.c b/loa.c
index 3333fc33eb75a56ddb1a99285f5cb7736f9bc97f..5716a3627ef1e90e8f91822afd65c60c4c5f6e32 100644 (file)
--- 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 ();