changeset 15126:5b846f30cecc draft

(svn r19755) -Fix: Blocked roadvehicles should first check whether they are still blocked before accelerating again, instead of continuous starting/stopping.
author frosch <frosch@openttd.org>
date Mon, 03 May 2010 19:55:03 +0000
parents 39dced40fc07
children c065afa82756
files src/roadveh_cmd.cpp
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -1598,13 +1598,18 @@
 	int j = RoadVehAccelerate(v);
 
 	int adv_spd = (v->direction & 1) ? 192 : 256;
+	bool blocked = false;
 	while (j >= adv_spd) {
 		j -= adv_spd;
 
 		RoadVehicle *u = v;
 		for (RoadVehicle *prev = NULL; u != NULL; prev = u, u = u->Next()) {
-			if (!IndividualRoadVehicleController(u, prev)) break;
+			if (!IndividualRoadVehicleController(u, prev)) {
+				blocked = true;
+				break;
+			}
 		}
+		if (blocked) break;
 
 		/* 192 spd used for going straight, 256 for going diagonally. */
 		adv_spd = (v->direction & 1) ? 192 : 256;
@@ -1619,7 +1624,10 @@
 		u->UpdateViewport(false, false);
 	}
 
-	if (v->progress == 0) v->progress = j;
+	/* If movement is blocked, set 'progress' to its maximum, so the roadvehicle does
+	 * not accelerate again before it can actually move. I.e. make sure it tries to advance again
+	 * on next tick to discover whether it is still blocked. */
+	if (v->progress == 0) v->progress = blocked ? adv_spd - 1 : j;
 
 	return true;
 }