summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Judson Rosen2017-03-19 16:55:31 -0400
committerJoshua Judson Rosen2017-03-28 22:07:50 -0400
commit4e5e4104b04e066d2e31bb090797b4c53376423b (patch)
treeddcde3199f5af5ec97e195a33e9d0ce223db8bb0
parentui-cmdwin: redirect all stdio into the embedded terminal (diff)
downloadgnurobots-4e5e4104b04e066d2e31bb090797b4c53376423b.tar.gz
robot-move: signal DEATH only _after_ the display has been updated
This avoids weird off-by-1 errors in the GUI counters at game end.
-rw-r--r--src/grobot.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/src/grobot.c b/src/grobot.c
index de6658a..02fcc7d 100644
--- a/src/grobot.c
+++ b/src/grobot.c
@@ -405,10 +405,6 @@ gboolean g_robot_move(GRobot *robot, gint steps)
/* no matter what, this took energy */
robot->energy -= 2;
- if (robot->energy < 1)
- {
- g_signal_emit(robot, g_robot_signals[DEATH], 0);
- }
switch (MAP_GET_OBJECT(robot->map, x_to, y_to))
{
@@ -422,10 +418,6 @@ gboolean g_robot_move(GRobot *robot, gint steps)
case BADDIE:
/* Damage */
robot->shields -= 10;
- if (robot->shields < 1)
- {
- g_signal_emit(robot, g_robot_signals[DEATH], 0);
- }
x_to = robot->x;
y_to = robot->y;
@@ -435,10 +427,6 @@ gboolean g_robot_move(GRobot *robot, gint steps)
case WALL:
/* less damage */
robot->shields -= 2;
- if (robot->shields < 1)
- {
- g_signal_emit(robot, g_robot_signals[DEATH], 0);
- }
x_to = robot->x;
y_to = robot->y;
@@ -447,10 +435,7 @@ gboolean g_robot_move(GRobot *robot, gint steps)
default:
/* even less damage */
- if (--robot->shields < 1)
- {
- g_signal_emit(robot, g_robot_signals[DEATH], 0);
- }
+ robot->shields -= 1;
x_to = robot->x;
y_to = robot->y;
@@ -466,6 +451,11 @@ gboolean g_robot_move(GRobot *robot, gint steps)
robot->dir, robot->energy, robot->score, robot->shields);
gdk_threads_leave();
+ if (robot->energy < 1 || robot->shields < 1)
+ {
+ g_signal_emit(robot, g_robot_signals[DEATH], 0);
+ }
+
if (x_to == robot->x && y_to == robot->y) {
/* NOTE: by returning here, we charge only 1 hit
against energy and shields, regardless of