src/road.cpp
changeset 8137 67a9579abd74
child 6871 5a9dc001e1ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/road.cpp	Wed Sep 26 16:12:43 2007 +0000
@@ -0,0 +1,69 @@
+#include "stdafx.h"
+#include "openttd.h"
+#include "functions.h"
+#include "rail_map.h"
+#include "road.h"
+#include "road_map.h"
+#include "water_map.h"
+#include "macros.h"
+
+bool IsPossibleCrossing(const TileIndex tile, Axis ax)
+{
+	return (IsTileType(tile, MP_RAILWAY) &&
+		!HasSignals(tile) &&
+		GetTrackBits(tile) == (ax == AXIS_X ?  TRACK_BIT_Y : TRACK_BIT_X) &&
+		GetTileSlope(tile, NULL) == SLOPE_FLAT);
+}
+
+RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb)
+{
+	for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
+		const TileIndex neighbor_tile = TileAddByDiagDir(tile, dir);
+
+		/* Get the Roadbit pointing to the neighbor_tile */
+		const RoadBits target_rb = DiagDirToRoadBits(dir);
+
+		/* If the roadbit is in the current plan */
+		if (org_rb & target_rb) {
+			bool connective = false;
+			const RoadBits mirrored_rb = MirrorRoadBits(target_rb);
+
+			switch (GetTileType(neighbor_tile)) {
+				/* Allways connective ones */
+				case MP_CLEAR: case MP_TREES:
+					connective = true;
+					break;
+
+				/* The conditionaly connective ones */
+				case MP_TUNNELBRIDGE:
+				case MP_STATION:
+				case MP_ROAD: {
+					const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, ROADTYPE_ROAD) | GetAnyRoadBits(neighbor_tile, ROADTYPE_TRAM);
+
+					/* Accept only connective tiles */
+					connective = (neighbor_rb & mirrored_rb) || // Neighbor has got the fitting RoadBit
+							COUNTBITS(neighbor_rb) == 1; // Neighbor has got only one Roadbit
+
+				} break;
+
+				case MP_RAILWAY:
+					connective = IsPossibleCrossing(neighbor_tile, DiagDirToAxis(dir));
+					break;
+
+				case MP_WATER:
+					/* Check for real water tile */
+					connective = !IsWater(neighbor_tile);
+					break;
+
+				/* The defentetly not connective ones */
+				default: break;
+			}
+
+			/* If the neighbor tile is inconnective remove the planed road connection to it */
+			if (!connective) org_rb ^= target_rb;
+
+		}
+	}
+
+	return org_rb;
+}