diff --git a/clear_cmd.c b/clear_cmd.c index c3ac7c73e8..591f2a1ab2 100644 --- a/clear_cmd.c +++ b/clear_cmd.c @@ -10,6 +10,7 @@ #include "tile.h" #include "viewport.h" #include "command.h" +#include "tunnel_map.h" #include "variables.h" #include "table/sprites.h" @@ -277,7 +278,7 @@ int32 CmdTerraformLand(int x, int y, uint32 flags, uint32 p1, uint32 p2) t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 1)); if (t <= z) z = t; - if (!CheckTunnelInWay(tile, z * 8)) { + if (IsTunnelInWay(tile, z * 8)) { return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE); } } diff --git a/functions.h b/functions.h index 39d270ff17..f5ba1b6ba9 100644 --- a/functions.h +++ b/functions.h @@ -145,7 +145,6 @@ void AnimateAnimatedTiles(void); void InitializeAnimatedTiles(void); /* tunnelbridge_cmd.c */ -bool CheckTunnelInWay(TileIndex tile, int z); bool CheckBridge_Stuff(byte bridge_type, uint bridge_len); uint32 GetBridgeLength(TileIndex begin, TileIndex end); int CalcBridgeLenCostFactor(int x); diff --git a/tunnel_map.c b/tunnel_map.c index d39c7ef042..8752d81078 100644 --- a/tunnel_map.c +++ b/tunnel_map.c @@ -23,3 +23,30 @@ TileIndex GetOtherTunnelEnd(TileIndex tile) return tile; } + + +static bool IsTunnelInWayDir(TileIndex tile, uint z, DiagDirection dir) +{ + TileIndexDiff delta = TileOffsByDir(dir); + uint height; + + do { + tile -= delta; + height = GetTileZ(tile); + } while (z < height); + + return + z == height && + IsTileType(tile, MP_TUNNELBRIDGE) && + GB(_m[tile].m5, 4, 4) == 0 && + GetTunnelDirection(tile) == dir; +} + +bool IsTunnelInWay(TileIndex tile, uint z) +{ + return + IsTunnelInWayDir(tile, z, DIAGDIR_NE) || + IsTunnelInWayDir(tile, z, DIAGDIR_SE) || + IsTunnelInWayDir(tile, z, DIAGDIR_SW) || + IsTunnelInWayDir(tile, z, DIAGDIR_NW); +} diff --git a/tunnel_map.h b/tunnel_map.h index aa30e12c3a..047f631f91 100644 --- a/tunnel_map.h +++ b/tunnel_map.h @@ -22,6 +22,7 @@ static inline TransportType GetTunnelTransportType(TileIndex t) TileIndex GetOtherTunnelEnd(TileIndex); +bool IsTunnelInWay(TileIndex, uint z); static inline void MakeRoadTunnel(TileIndex t, Owner o, DiagDirection d) diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c index 50f38f16e9..42c54a6212 100644 --- a/tunnelbridge_cmd.c +++ b/tunnelbridge_cmd.c @@ -428,36 +428,6 @@ not_valid_below:; return cost; } -static bool DoCheckTunnelInWay(TileIndex tile, uint z, DiagDirection dir) -{ - TileIndexDiff delta = TileOffsByDir(dir); - uint height; - - do { - tile -= delta; - height = GetTileZ(tile); - } while (z < height); - - if (z == height && - IsTileType(tile, MP_TUNNELBRIDGE) && - GB(_m[tile].m5, 4, 4) == 0 && - GetTunnelDirection(tile) == dir) { - _error_message = STR_5003_ANOTHER_TUNNEL_IN_THE_WAY; - return false; - } - - return true; -} - -bool CheckTunnelInWay(TileIndex tile, int z) -{ - return - DoCheckTunnelInWay(tile, z, DIAGDIR_NE) && - DoCheckTunnelInWay(tile, z, DIAGDIR_SE) && - DoCheckTunnelInWay(tile, z, DIAGDIR_SW) && - DoCheckTunnelInWay(tile, z, DIAGDIR_NW); -} - /** Build Tunnel. * @param x,y start tile coord of tunnel @@ -504,8 +474,8 @@ int32 CmdBuildTunnel(int x, int y, uint32 flags, uint32 p1, uint32 p2) if (start_z == end_z) break; - if (!_cheats.crossing_tunnels.value && !CheckTunnelInWay(end_tile, start_z)) { - return CMD_ERROR; + if (!_cheats.crossing_tunnels.value && IsTunnelInWay(end_tile, start_z)) { + return_cmd_error(STR_5003_ANOTHER_TUNNEL_IN_THE_WAY); } cost += _price.build_tunnel;