239 |
239 |
240 // can't make water of water! |
240 // can't make water of water! |
241 if (IsTileType(tile, MP_WATER)) continue; |
241 if (IsTileType(tile, MP_WATER)) continue; |
242 |
242 |
243 /* is middle piece of a bridge? */ |
243 /* is middle piece of a bridge? */ |
244 if (IsTileType(tile, MP_TUNNELBRIDGE) && _m[tile].m5 & 0x40) { /* build under bridge */ |
244 if (IsBridgeTile(tile) && IsBridgeMiddle(tile)) { |
245 if (_m[tile].m5 & 0x20) // transport route under bridge |
245 if (IsTransportUnderBridge(tile)) { |
246 return_cmd_error(STR_5800_OBJECT_IN_THE_WAY); |
246 return_cmd_error(STR_5800_OBJECT_IN_THE_WAY); |
247 |
|
248 if (_m[tile].m5 & 0x18) { // already water under bridge |
|
249 return_cmd_error(STR_1007_ALREADY_BUILT); |
|
250 } |
247 } |
|
248 |
|
249 if (IsWaterUnderBridge(tile)) return_cmd_error(STR_1007_ALREADY_BUILT); |
251 |
250 |
252 if (flags & DC_EXEC) SetWaterUnderBridge(tile); |
251 if (flags & DC_EXEC) SetWaterUnderBridge(tile); |
253 } else { |
252 } else { |
254 /* no bridge, try to clear it. */ |
253 /* no bridge, try to clear it. */ |
255 int32 ret = DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); |
254 int32 ret = DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); |
352 // returns true if it is a dock-station |
351 // returns true if it is a dock-station |
353 // m5 inside values is m5 < 75 all stations, 83 <= m5 <= 114 new airports |
352 // m5 inside values is m5 < 75 all stations, 83 <= m5 <= 114 new airports |
354 return !(m5 < 75 || (m5 >= 83 && m5 <= 114)); |
353 return !(m5 < 75 || (m5 >= 83 && m5 <= 114)); |
355 |
354 |
356 case MP_TUNNELBRIDGE: |
355 case MP_TUNNELBRIDGE: |
357 // true, if tile is middle part of bridge with water underneath |
356 return IsBridge(tile) && IsBridgeMiddle(tile) && IsWaterUnderBridge(tile); |
358 return (m5 & 0xF8) == 0xC8; |
|
359 |
357 |
360 default: |
358 default: |
361 return false; |
359 return false; |
362 } |
360 } |
363 } |
361 } |
540 MarkTileDirtyByTile(target); |
538 MarkTileDirtyByTile(target); |
541 } |
539 } |
542 break; |
540 break; |
543 |
541 |
544 case MP_TUNNELBRIDGE: |
542 case MP_TUNNELBRIDGE: |
545 // Middle part of bridge with clear land below? |
543 if (IsBridge(target) && IsBridgeMiddle(target) && IsClearUnderBridge(target)) { |
546 if ((_m[target].m5 & 0xF8) == 0xC0) { |
|
547 SetWaterUnderBridge(target); |
544 SetWaterUnderBridge(target); |
548 MarkTileDirtyByTile(target); |
545 MarkTileDirtyByTile(target); |
549 } |
546 } |
550 break; |
547 break; |
551 |
548 |
552 default: |
549 default: |
553 break; |
550 break; |
554 } |
551 } |
555 } else { |
552 } else { |
556 if (IsTileType(target, MP_TUNNELBRIDGE)) { |
553 if (IsBridgeTile(target) && IsBridgeMiddle(target)) { |
557 byte m5 = _m[target].m5; |
554 if (IsWaterUnderBridge(target) || |
558 if ((m5 & 0xF8) == 0xC8 || (m5 & 0xF8) == 0xF0) return; |
555 (IsTransportUnderBridge(target) && GetTransportTypeUnderBridge(target) == TRANSPORT_WATER)) { // XXX does this happen at all? |
559 |
|
560 if ((m5 & 0xC0) == 0xC0) { |
|
561 SetWaterUnderBridge(target); |
|
562 MarkTileDirtyByTile(target); |
|
563 return; |
556 return; |
564 } |
557 } |
|
558 SetWaterUnderBridge(target); |
|
559 MarkTileDirtyByTile(target); |
|
560 return; |
565 } |
561 } |
566 |
562 |
567 _current_player = OWNER_WATER; |
563 _current_player = OWNER_WATER; |
568 { |
564 { |
569 Vehicle *v = FindVehicleOnTileZ(target, 0); |
565 Vehicle *v = FindVehicleOnTileZ(target, 0); |