summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2008-01-23 00:36:48 +0000
committersmatz <smatz@openttd.org>2008-01-23 00:36:48 +0000
commitd89c5e945fbfe7aff3628ed635f0b5c4a248b6f0 (patch)
treef4716803ffe4d9ccd4d703e9bdf0b4b366b469d7
parentb5534e42a0a87aa3ce75e2d1ae4c6a8b9e53c540 (diff)
downloadopenttd-d89c5e945fbfe7aff3628ed635f0b5c4a248b6f0.tar.xz
(svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
-rw-r--r--src/road_cmd.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp
index ac60aafa1..523eb753b 100644
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -42,6 +42,8 @@
static const uint32 VALID_LEVEL_CROSSING_SLOPES = (M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT));
#undef M
+Foundation GetRoadFoundation(Slope tileh, RoadBits bits);
+
bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt)
{
RoadBits present;
@@ -530,6 +532,23 @@ do_clear:;
if (IsTileType(tile, MP_ROAD)) {
/* Don't put the pieces that already exist */
pieces &= ComplementRoadBits(existing);
+
+ /* Check if new road bits will have the same foundation as other existing road types */
+ if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+ Slope slope = GetTileSlope(tile, NULL);
+ Foundation found_new = GetRoadFoundation(slope, pieces | existing);
+
+ /* Test if all other roadtypes can be built at that foundation */
+ for (RoadType rtest = ROADTYPE_ROAD; rtest < ROADTYPE_END; rtest++) {
+ if (rtest != rt) { // check only other road types
+ RoadBits bits = GetRoadBits(tile, rtest);
+ /* do not check if there are not road bits of given type */
+ if (bits != ROAD_NONE && GetRoadFoundation(slope, bits) != found_new) {
+ return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
+ }
+ }
+ }
+ }
}
cost.AddCost(CountBits(pieces) * _price.build_road);