]> git.cworth.org Git - grrobot/blobdiff - src/grr_board_view.c
* src/grrobot.c (grr_game_read_notices): Exit cleanly: need to
[grrobot] / src / grr_board_view.c
index 8d85988f0cb2c414a19b94bded0d72b11454bec9..6a184419eb2254ace5420815701ec6e1f90ad2ea 100644 (file)
@@ -134,6 +134,7 @@ grr_board_view_init (grr_board_view_t *view)
     view->time = 60.0;
     view->drift_correct = 0.0;
     view->timer = 0;
+    view->zap_time = 0.0;
 
     view->cell_width = 0;
     view->cell_height = 0;
@@ -696,7 +697,7 @@ grr_board_view_mark_damage (grr_board_view_t *view, int i, int j)
     gtk_widget_queue_draw_area (GTK_WIDGET (view), x, y, view->cell_width, view->cell_height);
 }
 
-#define TIMER_INTERVAL_MS 100
+#define TIMER_INTERVAL_MS 100.0
 
 static void
 grr_board_view_refresh_timer (grr_board_view_t *view)
@@ -721,19 +722,29 @@ grr_board_view_decrement_timer (void *widget)
     view->time -= TIMER_INTERVAL_MS / 1000.0;
     view->time += view->drift_correct;
 
+    if (view->zap_time) {
+       view->time -= view->zap_time;
+       view->zap_time += 1.0;
+    }
+
     grr_board_view_refresh_timer (view);
 
+    if (view->time < 0) {
+       grr_board_view_stop_timer (view);
+       return FALSE;
+    }
+
     return TRUE;
 }
 
 void
-grr_board_view_start_timer (grr_board_view_t *view, double time)
+grr_board_view_set_timer (grr_board_view_t *view, double time)
 {
     /* XXX: It would be good to adjust the clock for latency somewhere... */
-    /* Correct any drift within the next 10 seconds, or half the
-       remaining time --- whichever is less. */
     if (view->timer) {
        double correction_time;
+       /* Correct any drift within the next 10 seconds, or half the
+          remaining time --- whichever is less. */
        if (time >= 20.0)
            correction_time = 10.0;
        else
@@ -741,11 +752,20 @@ grr_board_view_start_timer (grr_board_view_t *view, double time)
        view->drift_correct = (time - view->time) / (correction_time * TIMER_INTERVAL_MS);
     } else {
        view->time = time;
-
-       view->timer = gtk_timeout_add (TIMER_INTERVAL_MS, grr_board_view_decrement_timer, view);
+       view->drift_correct = 0.0;
+       view->zap_time = 0.0;
     }
 }
 
+void
+grr_board_view_start_timer (grr_board_view_t *view)
+{
+    if (view->timer)
+       return;
+
+    view->timer = gtk_timeout_add (TIMER_INTERVAL_MS, grr_board_view_decrement_timer, view);
+}
+
 void
 grr_board_view_stop_timer (grr_board_view_t *view)
 {
@@ -755,15 +775,17 @@ grr_board_view_stop_timer (grr_board_view_t *view)
     gtk_timeout_remove (view->timer);
     view->timer = 0;
     view->time = 0.0;
+    view->drift_correct = 0.0;
+    view->zap_time = 0.0;
 
     grr_board_view_refresh_timer (view);
 }
 
 void
-grr_board_view_reset_timer (grr_board_view_t *view)
+grr_board_view_zap_timer (grr_board_view_t *view)
 {
-    grr_board_view_stop_timer (view);
+    view->zap_time = 4;
 
-    view->time = 60.0;
-    view->drift_correct = 0.0;
+    grr_board_view_refresh_timer (view);
 }
+