diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/grobot.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/grobot.c b/src/grobot.c index 04eabe3..de6658a 100644 --- a/src/grobot.c +++ b/src/grobot.c @@ -393,6 +393,7 @@ gboolean g_robot_move(GRobot *robot, gint steps) } /* Move the robot */ + /* Arguably this should use energy even if steps=0, but it doesn't... */ for (i = 0; i < abs(steps); i++) { @@ -416,15 +417,6 @@ gboolean g_robot_move(GRobot *robot, gint steps) MAP_SET_OBJECT(robot->map, robot->x, robot->y, SPACE); MAP_SET_OBJECT(robot->map, x_to, y_to, ROBOT); - gdk_threads_enter(); - ui_arena_move_robot(robot->ui, robot->x, robot->y, x_to, y_to, - robot->dir, robot->energy, robot->score, robot->shields); - gdk_threads_leave(); - - robot->x = x_to; - robot->y = y_to; - robot->units++; - break; case BADDIE: @@ -434,7 +426,9 @@ gboolean g_robot_move(GRobot *robot, gint steps) { g_signal_emit(robot, g_robot_signals[DEATH], 0); } - return FALSE; + + x_to = robot->x; + y_to = robot->y; break; @@ -445,7 +439,9 @@ gboolean g_robot_move(GRobot *robot, gint steps) { g_signal_emit(robot, g_robot_signals[DEATH], 0); } - return FALSE; + + x_to = robot->x; + y_to = robot->y; break; @@ -455,10 +451,32 @@ gboolean g_robot_move(GRobot *robot, gint steps) { g_signal_emit(robot, g_robot_signals[DEATH], 0); } - return FALSE; + + x_to = robot->x; + y_to = robot->y; break; } + + gdk_threads_enter(); + /* Animate/update the robot/arena/status regardless of + whether the movement-attempt succeeded: + */ + ui_arena_move_robot(robot->ui, robot->x, robot->y, x_to, y_to, + robot->dir, robot->energy, robot->score, robot->shields); + gdk_threads_leave(); + + if (x_to == robot->x && y_to == robot->y) { + /* NOTE: by returning here, we charge only 1 hit + against energy and shields, regardless of + how many spaces the robot was attempting to go.... + */ + return FALSE; + } + + robot->x = x_to; + robot->y = y_to; + robot->units++; } /* for */ return TRUE; |