]> git.cworth.org Git - dvonn/commitdiff
Don't let one player place the opponent's pieces
authorCarl Worth <cworth@cworth.org>
Thu, 5 Mar 2009 19:56:13 +0000 (11:56 -0800)
committerCarl Worth <cworth@cworth.org>
Thu, 5 Mar 2009 19:56:13 +0000 (11:56 -0800)
The program is now aware of a dual-window mode and restricts
actions to the window belonging to the current player.

dvonn-board.c
dvonn.c

index 5b7c106c311909b30a47d96dc7ff3c6e7ecaf418..f8f9b93843556f3e20b482418c7ca75f768f28d2 100644 (file)
@@ -231,9 +231,12 @@ dvonn_board_place (dvonn_board_t *board,
 
     board->moves++;
 
+    dvonn_board_next_player (board);
+
     if (board->moves == 49) {
        board->phase = DVONN_PHASE_MOVEMENT;
        board->moves = 0;
+       board->player = DVONN_PLAYER_WHITE;
     }
 
     return TRUE;
diff --git a/dvonn.c b/dvonn.c
index e14001658fc3d1a6d7c3d6a101d874f6b2cc1ece..896edc36ab49a346e98af873ea16f7bcae518d1e 100644 (file)
--- a/dvonn.c
+++ b/dvonn.c
@@ -55,6 +55,9 @@ struct _dvonn_game {
     int selected_y;
 
     PangoFontDescription *font;
+
+    dvonn_bool_t dual_window_mode;
+    GtkWidget *windows[2];
 };
 
 static gboolean
@@ -157,6 +160,15 @@ on_button_press_event (GtkWidget   *widget,
     int x, y;
     char *error;
 
+    /* Ignore events from the non-player. (Obviously when we add more
+     * interaction abilities, we will want to allow those even for the
+     * non-player---things like quit, etc.). */
+    if (game->dual_window_mode &&
+       widget->parent != game->windows[game->board.player])
+    {
+       return TRUE;
+    }
+
     /* Ignore double and triple clicks. */
     if (event->type >= GDK_2BUTTON_PRESS)
        return TRUE;
@@ -428,6 +440,10 @@ dvonn_game_init (dvonn_game_t *game)
     dvonn_board_init (&game->board);
 
     game->font = NULL;
+
+    game->dual_window_mode = 0;
+    game->windows[0] = NULL;
+    game->windows[1] = NULL;
 }
 
 static void
@@ -490,7 +506,7 @@ dvonn_game_create_view (dvonn_game_t *game)
 int
 main (int argc, char *argv[])
 {
-    GtkWidget *window;
+    GtkWidget *window0, *window1;
     GdkDisplay *display;
     GdkScreen *screen;
     dvonn_game_t game;
@@ -500,16 +516,32 @@ main (int argc, char *argv[])
     gtk_init (&argc, &argv);
 
     /* Create a view for player 1. */
-    dvonn_game_create_view (&game);
+    window0 = dvonn_game_create_view (&game);
 
-    /* If Keith has connected to my machine, create a view for him as
-     * well. */
+    /* Ugly little hack to get Xauthority data from keithp. Obviously
+     * won't work for any other user.
+     *
     setenv ("XAUTHORITY", "/home/keithp/.Xauthority", 1);
+    */
+
+    /* Also ugly that localhost:10.0 is hard-coded, but this will work
+     * for many situations--both for when keithp attaches to my
+     * machine, and for when I connect to anyone's machine and then
+     * connect back, (assuming I haven't made other X forwardings
+     * first).
+     *
+     * Clearly we'll want some actual UI to select the right thing
+     * here.
+     */
     display = gdk_display_open ("localhost:10.0");
     if (display) {
        screen = gdk_display_get_default_screen (display);
-       window = dvonn_game_create_view (&game);
-       gtk_window_set_screen (GTK_WINDOW (window), screen);
+       window1 = dvonn_game_create_view (&game);
+       gtk_window_set_screen (GTK_WINDOW (window1), screen);
+
+       game.dual_window_mode = 1;
+       game.windows[0] = window0;
+       game.windows[1] = window1;
     }
     
     gtk_main ();