Commit 984d3b20 authored by Gabriel Ivascu's avatar Gabriel Ivascu Committed by Iulian Radu

Fix New Game/Pause actions during countdowns

There are currently two issues with the 'New Game' and 'Pause' buttons
if clicked during the countdown prior to the start of any level:

(1) Clicking 'Pause' immediately ends the countdown and starts the game,
thus messing the game state as the game is running while the button
still says pause. Clicking the button again pauses the game very
briefly, then immediately unpauses it.

(2) Clicking 'New Game' -> 'Cancel' immediately starts the game (while
the countdown is still running) therefore causing the game to start again
(kind of) once more when the countdown reaches zero. This oddly results
in an increased move speed of the worms and some labels overlaying the
game screen which is bad.

Note that clicking 'New Game' -> 'New Game' works just fine.

As discussed in the bug report comments issue (1) will be fixed by always
disabling the pause button during countdowns.

As for issue (2) this commit fixes it by freezing the countdown while
the new game dialog is open and making sure that clicking 'Cancel' will
not start the game if the countdown hasn't yet expired, following that
the game will only start when the countdown reaches zero.

Also use g_timeout_add_seconds instead of g_timeout_add to reduce power
usage.

https://bugzilla.gnome.org/show_bug.cgi?id=762016
parent 56959e33
......@@ -74,6 +74,7 @@ public class Nibbles : Gtk.Application
private uint countdown_id = 0;
private const int COUNTDOWN_TIME = 3;
private int seconds = 0;
private const ActionEntry action_entries[] =
{
......@@ -255,6 +256,29 @@ public class Nibbles : Gtk.Application
base.shutdown ();
}
private bool countdown_cb ()
{
seconds--;
if (seconds == 0)
{
statusbar_stack.set_visible_child_name ("scoreboard");
view.name_labels.hide ();
game.add_bonus (true);
game.start ();
pause_action.set_enabled (true);
back_action.set_enabled (true);
countdown_id = 0;
return Source.REMOVE;
}
countdown.set_label (seconds.to_string ());
return Source.CONTINUE;
}
/*\
* * Window events
\*/
......@@ -350,29 +374,13 @@ public class Nibbles : Gtk.Application
{
statusbar_stack.set_visible_child_name ("countdown");
var seconds = COUNTDOWN_TIME;
view.name_labels.show ();
countdown_id = Timeout.add (1000, () => {
countdown.set_label (seconds.to_string ());
if (seconds == 0)
{
statusbar_stack.set_visible_child_name ("scoreboard");
view.name_labels.hide ();
countdown.set_label (COUNTDOWN_TIME.to_string ());
game.add_bonus (true);
game.start ();
new_game_action.set_enabled (true);
new_game_action.set_enabled (true);
pause_action.set_enabled (true);
back_action.set_enabled (true);
seconds = COUNTDOWN_TIME;
view.name_labels.show ();
countdown_id = 0;
return Source.REMOVE;
}
seconds--;
return Source.CONTINUE;
});
countdown.set_label (COUNTDOWN_TIME.to_string ());
countdown_id = Timeout.add_seconds (1, countdown_cb);
}
private void restart_game ()
......@@ -385,6 +393,12 @@ public class Nibbles : Gtk.Application
private void new_game_cb ()
{
if (countdown_id != 0)
{
Source.remove (countdown_id);
countdown_id = 0;
}
if (game.is_running)
game.stop ();
......@@ -403,7 +417,11 @@ public class Nibbles : Gtk.Application
if ((response_id == Gtk.ResponseType.CANCEL || response_id == Gtk.ResponseType.DELETE_EVENT)
&& !game.is_paused)
{
game.start ();
if (seconds == 0)
game.start ();
else
countdown_id = Timeout.add_seconds (1, countdown_cb);
view.grab_focus ();
}
......@@ -855,9 +873,6 @@ public class Nibbles : Gtk.Application
label.destroy ();
button.destroy ();
new_game_action.set_enabled (true);
pause_action.set_enabled (true);
headerbar.set_title (_("Level %d").printf (game.current_level));
restart_game ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment