(svn r2189) Introduce and use IsCompatibleTrainStationTile()
authortron
Tue, 12 Apr 2005 10:31:26 +0000
changeset 1685 46783dea9b44
parent 1684 3b2df64cc706
child 1686 37f64f8b0641
(svn r2189) Introduce and use IsCompatibleTrainStationTile()
This should prevent trains, which are longer than the station, to turn around without stopping under certain circumstances and fix speed limit for trains entering a station, when realistic accerlation is used
station.h
station_cmd.c
train_cmd.c
--- a/station.h	Tue Apr 12 09:21:04 2005 +0000
+++ b/station.h	Tue Apr 12 10:31:26 2005 +0000
@@ -276,6 +276,15 @@
 	return IsTileType(tile, MP_STATION) && IS_BYTE_INSIDE(_map5[tile], 0, 8);
 }
 
+static inline bool IsCompatibleTrainStationTile(TileIndex tile, TileIndex ref)
+{
+	assert(IsTrainStationTile(ref));
+	return
+		IsTrainStationTile(tile) &&
+		(_map3_lo[tile] & 0x0F) == (_map3_lo[ref] & 0x0F) && // same rail type?
+		(_map5[tile] & 0x01) == (_map5[ref] & 0x01); // same direction?
+}
+
 static inline bool IsRoadStationTile(uint tile) {
 	return IsTileType(tile, MP_STATION) && IS_BYTE_INSIDE(_map5[tile], 0x43, 0x4B);
 }
--- a/station_cmd.c	Tue Apr 12 09:21:04 2005 +0000
+++ b/station_cmd.c	Tue Apr 12 10:31:26 2005 +0000
@@ -2322,7 +2322,7 @@
 
 	if (v->type == VEH_Train) {
 		if (IS_BYTE_INSIDE(_map5[tile], 0, 8) && v->subtype == TS_Front_Engine &&
-			!IsTrainStationTile(tile + TileOffsByDir(v->direction >> 1))) {
+				!IsCompatibleTrainStationTile(tile + TileOffsByDir(v->direction >> 1), tile)) {
 
 			station_id = _map2[tile];
 			if ((!(v->current_order.flags & OF_NON_STOP) && !_patches.new_nonstop) ||
--- a/train_cmd.c	Tue Apr 12 09:21:04 2005 +0000
+++ b/train_cmd.c	Tue Apr 12 10:31:26 2005 +0000
@@ -154,7 +154,7 @@
 			do {
 				station_length++;
 				tile = TILE_ADD(tile, TileOffsByDir(v->direction / 2));
-			} while (IsTrainStationTile(tile) && (_map5[tile] & 1) == (_map5[v->tile] & 1));
+			} while (IsCompatibleTrainStationTile(tile, v->tile));
 
 			delta_v = v->cur_speed / (station_length + 1);
 			if (v->max_speed > (v->cur_speed - delta_v))