smatz@8587: /* $Id$ */ smatz@8587: rubidium@8137: #include "stdafx.h" rubidium@8137: #include "openttd.h" rubidium@8137: #include "functions.h" rubidium@8137: #include "rail_map.h" rubidium@8137: #include "road.h" rubidium@8137: #include "road_map.h" rubidium@8137: #include "water_map.h" rubidium@8137: #include "macros.h" rubidium@8137: rubidium@8137: bool IsPossibleCrossing(const TileIndex tile, Axis ax) rubidium@8137: { rubidium@8137: return (IsTileType(tile, MP_RAILWAY) && rubidium@8137: !HasSignals(tile) && rubidium@8137: GetTrackBits(tile) == (ax == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X) && rubidium@8137: GetTileSlope(tile, NULL) == SLOPE_FLAT); rubidium@8137: } rubidium@8137: rubidium@8137: RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb) rubidium@8137: { rubidium@8137: for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) { rubidium@8137: const TileIndex neighbor_tile = TileAddByDiagDir(tile, dir); rubidium@8137: rubidium@8137: /* Get the Roadbit pointing to the neighbor_tile */ rubidium@8137: const RoadBits target_rb = DiagDirToRoadBits(dir); rubidium@8137: rubidium@8137: /* If the roadbit is in the current plan */ rubidium@8137: if (org_rb & target_rb) { rubidium@8137: bool connective = false; rubidium@8137: const RoadBits mirrored_rb = MirrorRoadBits(target_rb); rubidium@8137: rubidium@8137: switch (GetTileType(neighbor_tile)) { rubidium@8137: /* Allways connective ones */ rubidium@8137: case MP_CLEAR: case MP_TREES: rubidium@8137: connective = true; rubidium@8137: break; rubidium@8137: rubidium@8137: /* The conditionaly connective ones */ rubidium@8137: case MP_TUNNELBRIDGE: rubidium@8137: case MP_STATION: rubidium@8137: case MP_ROAD: { rubidium@8137: const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, ROADTYPE_ROAD) | GetAnyRoadBits(neighbor_tile, ROADTYPE_TRAM); rubidium@8137: rubidium@8137: /* Accept only connective tiles */ rubidium@8137: connective = (neighbor_rb & mirrored_rb) || // Neighbor has got the fitting RoadBit truelight@8328: CountBits(neighbor_rb) == 1; // Neighbor has got only one Roadbit rubidium@8137: rubidium@8137: } break; rubidium@8137: rubidium@8137: case MP_RAILWAY: rubidium@8137: connective = IsPossibleCrossing(neighbor_tile, DiagDirToAxis(dir)); rubidium@8137: break; rubidium@8137: rubidium@8137: case MP_WATER: rubidium@8137: /* Check for real water tile */ rubidium@8137: connective = !IsWater(neighbor_tile); rubidium@8137: break; rubidium@8137: rubidium@8137: /* The defentetly not connective ones */ rubidium@8137: default: break; rubidium@8137: } rubidium@8137: rubidium@8137: /* If the neighbor tile is inconnective remove the planed road connection to it */ rubidium@8137: if (!connective) org_rb ^= target_rb; rubidium@8137: rubidium@8137: } rubidium@8137: } rubidium@8137: rubidium@8137: return org_rb; rubidium@8137: }