127 |
127 |
128 switch (ti.type) { |
128 switch (ti.type) { |
129 case MP_TUNNELBRIDGE: |
129 case MP_TUNNELBRIDGE: |
130 if (!EnsureNoVehicleZ(tile, TilePixelHeight(tile))) return CMD_ERROR; |
130 if (!EnsureNoVehicleZ(tile, TilePixelHeight(tile))) return CMD_ERROR; |
131 |
131 |
132 if ((ti.map5 & 0xE9) == 0xE8) { |
132 if (!IsBridge(tile) || |
133 if (pieces & ROAD_X) return CMD_ERROR; |
133 !IsBridgeMiddle(tile) || |
134 } else if ((ti.map5 & 0xE9) == 0xE9) { |
134 !IsTransportUnderBridge(tile) || |
135 if (pieces & ROAD_Y) return CMD_ERROR; |
135 GetTransportTypeUnderBridge(tile) != TRANSPORT_ROAD || |
136 } else { |
136 (pieces & ComplementRoadBits(GetRoadBitsUnderBridge(tile))) != 0) { |
137 return CMD_ERROR; |
137 return CMD_ERROR; |
138 } |
138 } |
139 |
139 |
140 cost = _price.remove_road * 2; |
140 cost = _price.remove_road * 2; |
141 |
141 |
355 /* check for flat land */ |
355 /* check for flat land */ |
356 if (IsSteepTileh(ti.tileh)) { // very steep tile |
356 if (IsSteepTileh(ti.tileh)) { // very steep tile |
357 return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION); |
357 return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION); |
358 } |
358 } |
359 |
359 |
360 /* is this middle part of a bridge? */ |
360 if (!IsBridge(tile) || !IsBridgeMiddle(tile)) goto do_clear; |
361 if ((ti.map5 & 0xC0) != 0xC0) goto do_clear; |
|
362 |
361 |
363 /* only allow roads pertendicular to bridge */ |
362 /* only allow roads pertendicular to bridge */ |
364 if (((pieces & ROAD_Y) != 0) == ((ti.map5 & 0x01U) != 0)) goto do_clear; |
363 if ((pieces & (GetBridgeAxis(tile) == AXIS_X ? ROAD_X : ROAD_Y)) != 0) { |
|
364 goto do_clear; |
|
365 } |
365 |
366 |
366 /* check if clear land under bridge */ |
367 /* check if clear land under bridge */ |
367 if ((ti.map5 & 0xF8) == 0xE8) { /* road under bridge */ |
368 if (IsTransportUnderBridge(tile)) { |
368 return_cmd_error(STR_1007_ALREADY_BUILT); |
369 switch (GetTransportTypeUnderBridge(tile)) { |
369 } else if ((ti.map5 & 0xE0) == 0xE0) { /* other transport route under bridge */ |
370 case TRANSPORT_ROAD: return_cmd_error(STR_1007_ALREADY_BUILT); |
370 return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK); |
371 default: return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK); |
371 } else if ((ti.map5 & 0xF8) == 0xC8) { /* water under bridge */ |
372 } |
372 return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER); |
373 } else { |
|
374 if (IsWaterUnderBridge(tile)) { |
|
375 return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER); |
|
376 } |
373 } |
377 } |
374 |
378 |
375 /* all checked, can build road now! */ |
379 /* all checked, can build road now! */ |
376 cost = _price.build_road * 2; |
380 cost = _price.build_road * 2; |
377 if (flags & DC_EXEC) { |
381 if (flags & DC_EXEC) { |