int selected_y;
PangoFontDescription *font;
+ PangoFontDescription *ring_font;
+
+ dvonn_bool_t dual_window_mode;
+ GtkWidget *windows[2];
};
static gboolean
/* Something like buff */
#define BACKGROUND_COLOR 0.89, 0.70, 0.40
+#define RED_RING_COLOR 0.8, 0.2, 0.2
+
+#define DVONN_FONT "sans"
+#define DVONN_FONT_SIZE 12
+
/* Relative to a unit square. */
#define RING_OUTER_RADIUS 0.4
#define RING_INNER_RADIUS 0.2
-#define FONT_SIZE (RING_INNER_RADIUS * 1.5)
+#define RING_FONT_SIZE (RING_INNER_RADIUS * 1.5)
/* XXX: This really should have an interest rectangle. */
static void
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;
+
x = event->x;
y = event->y;
layout_device_to_board (layout, &x, &y);
}
if (! game->has_selected) {
- if (game->board.cells[x][y].type == game->board.player) {
- game->has_selected = TRUE;
- game->selected_x = x;
- game->selected_y = y;
- dvonn_game_update_windows (game);
- }
+ if (dvonn_board_cell_owned_by (&game->board, x, y, game->board.player) &&
+ ! dvonn_board_cell_surrounded (&game->board, x, y))
+ {
+ game->has_selected = TRUE;
+ game->selected_x = x;
+ game->selected_y = y;
+ dvonn_game_update_windows (game);
+ }
return TRUE;
}
dvonn_game_update_windows (game);
return TRUE;
}
-
+
if (dvonn_board_move (&game->board,
game->selected_x, game->selected_y,
x, y, &error))
dvonn_game_t *game = view->game;
cairo_t *cr;
int x, y;
+ PangoLayout *to_move;
if (layout->width != widget->allocation.width ||
layout->height != widget->allocation.height)
layout->x_offset = (layout->width - x_size) / 2;
layout->y_offset = (layout->height - y_size) / 2;
- if (game->font == NULL) {
- game->font = pango_font_description_new ();
- pango_font_description_set_family (game->font, "sans");
+ if (game->ring_font == NULL) {
+ game->ring_font = pango_font_description_new ();
+ pango_font_description_set_family (game->ring_font,
+ DVONN_FONT);
}
- pango_font_description_set_absolute_size (game->font,
- FONT_SIZE * PANGO_SCALE);
+ pango_font_description_set_absolute_size (game->ring_font,
+ RING_FONT_SIZE * PANGO_SCALE);
}
cr = gdk_cairo_create (widget->window);
cairo_set_source_rgb (cr, BACKGROUND_COLOR);
cairo_paint (cr);
+ if (game->font == NULL) {
+ game->font = pango_font_description_new ();
+ pango_font_description_set_family (game->font, DVONN_FONT);
+ pango_font_description_set_absolute_size (game->font, DVONN_FONT_SIZE * PANGO_SCALE);
+ }
+ if (game->board.phase == DVONN_PHASE_GAME_OVER) {
+ if (game->board.score[DVONN_PLAYER_WHITE] >
+ game->board.score[DVONN_PLAYER_BLACK])
+ {
+ to_move = _create_layout_printf (cr, game->font,
+ "White wins (%d to %d)\n",
+ game->board.score[DVONN_PLAYER_WHITE],
+ game->board.score[DVONN_PLAYER_BLACK]);
+ }
+ else if (game->board.score[DVONN_PLAYER_BLACK] >
+ game->board.score[DVONN_PLAYER_WHITE])
+ {
+ to_move = _create_layout_printf (cr, game->font,
+ "Black wins (%d to %d)\n",
+ game->board.score[DVONN_PLAYER_BLACK],
+ game->board.score[DVONN_PLAYER_WHITE]);
+ }
+ else
+ {
+ to_move = _create_layout_printf (cr, game->font,
+ "Tie game (%d to %d)\n",
+ game->board.score[DVONN_PLAYER_WHITE],
+ game->board.score[DVONN_PLAYER_BLACK]);
+
+ }
+ } else {
+ to_move = _create_layout_printf (cr, game->font,
+ "%s to %s.",
+ game->board.player == DVONN_PLAYER_WHITE ?
+ "White" : "Black",
+ game->board.phase == DVONN_PHASE_PLACEMENT ?
+ "place" : "move");
+ }
+ cairo_move_to (cr, 2, 2);
+ if (game->board.player == DVONN_PLAYER_WHITE)
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ else
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ _show_layout (cr, to_move);
+
cairo_translate (cr, layout->x_offset, layout->y_offset);
cairo_scale (cr, layout->cell_size, layout->cell_size);
cairo_translate(cr,
x + (y - DVONN_BOARD_Y_SIZE/2) / 2.0,
M_SQRT1_2 * y);
+ if (cell.contains_red && cell.type != DVONN_CELL_RED) {
+ cairo_new_sub_path (cr);
+ cairo_arc (cr, 0.5, 0.5,
+ (RING_INNER_RADIUS + RING_OUTER_RADIUS)/2.0,
+ 0, 2 * M_PI);
+ cairo_set_source_rgb (cr, RED_RING_COLOR);
+ cairo_fill (cr);
+ }
ring_path (cr);
switch (cell.type) {
case DVONN_CELL_WHITE:
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
break;
case DVONN_CELL_RED:
- cairo_set_source_rgb (cr, 0.8, 0.2, 0.2); /* red */
+ cairo_set_source_rgb (cr, RED_RING_COLOR);
break;
case DVONN_CELL_EMPTY:
default:
}
cairo_fill (cr);
- if (game->board.cells[x][y].height) {
+ if (game->board.cells[x][y].height > 1) {
PangoLayout *height;
cairo_move_to (cr,
- 0.5 - 0.8 * RING_INNER_RADIUS * cos (M_PI_4),
+ 0.5 - 0.7 * RING_INNER_RADIUS * cos (M_PI_4),
0.5 - 1.2 * RING_INNER_RADIUS * sin (M_PI_4));
- height = _create_layout_printf (cr, game->font, "%d",
+ height = _create_layout_printf (cr, game->ring_font, "%d",
game->board.cells[x][y].height);
_show_layout (cr, height);
}
dvonn_board_init (&game->board);
game->font = NULL;
+ game->ring_font = NULL;
+
+ game->dual_window_mode = 0;
+ game->windows[0] = NULL;
+ game->windows[1] = NULL;
}
static void
view->layout.height = 0;
}
-static void
+static GtkWidget*
dvonn_game_create_view (dvonn_game_t *game)
{
view_t *view;
G_CALLBACK (on_button_press_event), view);
gtk_widget_show_all (window);
+
+ return window;
}
int
main (int argc, char *argv[])
{
+ GtkWidget *window0, *window1;
+ GdkDisplay *display;
+ GdkScreen *screen;
dvonn_game_t game;
dvonn_game_init (&game);
gtk_init (&argc, &argv);
- /* Create two views of the game (one for each player) */
- dvonn_game_create_view (&game);
- dvonn_game_create_view (&game);
+ /* Create a view for player 1. */
+ window0 = dvonn_game_create_view (&game);
+
+ /* 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);
+ 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 ();