diff options
Diffstat (limited to 'rail_cmd.c')
-rw-r--r-- | rail_cmd.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/rail_cmd.c b/rail_cmd.c index 832941b17..8c48fa6b7 100644 --- a/rail_cmd.c +++ b/rail_cmd.c @@ -299,21 +299,31 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, switch (GetTileType(tile)) { case MP_TUNNELBRIDGE: if ((m5 & 0xC0) != 0xC0 || // not bridge middle part? - (m5 & 0x01 ? 1 : 2) != rail_bit || // wrong direction? - (m5 & 0x38) != 0x00) { // no clear land underneath? + (m5 & 0x01 ? 1 : 2) != rail_bit) { // wrong direction? // Get detailed error message return DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); } - ret = CheckRailSlope(tileh, rail_bit, 0, tile); - if (ret & CMD_ERROR) return ret; - cost += ret; + switch (m5 & 0x38) { // what's under the bridge? + case 0x00: // clear land + ret = CheckRailSlope(tileh, rail_bit, 0, tile); + if (ret & CMD_ERROR) return ret; + cost += ret; - if (flags & DC_EXEC) { - _map_owner[tile] = _current_player; - _map3_lo[tile] &= ~0x0F; - _map3_lo[tile] |= rail_type; - _map5[tile] = (m5 & 0xC7) | 0x20; // railroad under bridge + if (flags & DC_EXEC) { + _map_owner[tile] = _current_player; + _map3_lo[tile] &= ~0x0F; + _map3_lo[tile] |= rail_type; + _map5[tile] = (m5 & 0xC7) | 0x20; // railroad under bridge + } + break; + + case 0x20: // rail already there + return_cmd_error(STR_1007_ALREADY_BUILT); + + default: + // Get detailed error message + return DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); } break; |