diff options
author | terkhen <terkhen@openttd.org> | 2011-09-06 13:32:37 +0000 |
---|---|---|
committer | terkhen <terkhen@openttd.org> | 2011-09-06 13:32:37 +0000 |
commit | b0439aff59fd26596a330d5c1cb1880054f204e6 (patch) | |
tree | fd7503396a39b121dd657a3f9a1040ce1c7ad3c3 | |
parent | 2c20738067e6cd4f49ce063967c93776b583066a (diff) | |
download | openttd-b0439aff59fd26596a330d5c1cb1880054f204e6.tar.xz |
(svn r22899) -Add: Allow towns to build bridges over canals and rivers.
-rw-r--r-- | src/town_cmd.cpp | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index ddbe9127e..0c080246c 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -971,12 +971,11 @@ static bool GrowTownWithBridge(const Town *t, const TileIndex tile, const DiagDi assert(bridge_dir < DIAGDIR_END); const Slope slope = GetTileSlope(tile, NULL); - if (slope == SLOPE_FLAT) return false; // no slope, no bridge /* Make sure the direction is compatible with the slope. * Well we check if the slope has an up bit set in the * reverse direction. */ - if (slope & InclinedSlope(bridge_dir)) return false; + if (slope != SLOPE_FLAT && slope & InclinedSlope(bridge_dir)) return false; /* Assure that the bridge is connectable to the start side */ if (!(GetTownRoadBits(TileAddByDiagDir(tile, ReverseDiagDir(bridge_dir))) & DiagDirToRoadBits(bridge_dir))) return false; @@ -986,13 +985,25 @@ static bool GrowTownWithBridge(const Town *t, const TileIndex tile, const DiagDi TileIndex bridge_tile = tile; // Used to store the other waterside const int delta = TileOffsByDiagDir(bridge_dir); - do { - if (bridge_length++ >= 11) { - /* Max 11 tile long bridges */ - return false; - } - bridge_tile += delta; - } while (TileX(bridge_tile) != 0 && TileY(bridge_tile) != 0 && IsWaterTile(bridge_tile)); + + if (slope == SLOPE_FLAT) { + /* Bridges starting on flat tiles are only allowed when crossing rivers. */ + do { + if (bridge_length++ >= 4) { + /* Allow to cross rivers, not big lakes. */ + return false; + } + bridge_tile += delta; + } while (IsValidTile(bridge_tile) && IsWaterTile(bridge_tile) && !IsSea(bridge_tile)); + } else { + do { + if (bridge_length++ >= 11) { + /* Max 11 tile long bridges */ + return false; + } + bridge_tile += delta; + } while (IsValidTile(bridge_tile) && IsWaterTile(bridge_tile)); + } /* no water tiles in between? */ if (bridge_length == 1) return false; |