changeset 13990:85fcbb035f53 draft

(svn r18532) -Codechange/Fix (r18404): don't leave the road stop between tiles, just stay on it. This prevents the rare cases where a road vehicle would stop exactly on the border where it could not load
author rubidium <rubidium@openttd.org>
date Fri, 18 Dec 2009 21:35:55 +0000
parents c87fc54710c1
children f40051930e5a
files src/roadveh_cmd.cpp
diffstat 1 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -1313,7 +1313,23 @@
 				v->cur_speed = 0;
 				return false;
 			}
-			if (IsRoadStop(v->tile)) RoadStop::GetByTile(v->tile, GetRoadStopType(v->tile))->Leave(v);
+
+			/* If we are a drive through road stop and the next tile is of
+			 * the same road stop and the next tile isn't this one (i.e. we
+			 * are not reversing), then keep the reservation and state.
+			 * This way we will not be shortly unregister from the road
+			 * stop. It also makes it possible to load when on the edge of
+			 * two road stops; otherwise you could get vehicles that should
+			 * be loading but are not actually loading. */
+			if (IsDriveThroughStopTile(v->tile) &&
+					RoadStop::IsDriveThroughRoadStopContinuation(v->tile, tile) &&
+					v->tile != tile) {
+				/* So, keep 'our' state */
+				dir = (Trackdir)v->state;
+			} else if (IsRoadStop(v->tile)) {
+				/* We're not continuing our drive through road stop, so leave. */
+				RoadStop::GetByTile(v->tile, GetRoadStopType(v->tile))->Leave(v);
+			}
 		}
 
 		if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {