water_cmd.c
changeset 3234 a2791a480b71
parent 3189 bf047128dee7
child 3267 feff95208a9f
equal deleted inserted replaced
3233:9e09534dcac1 3234:a2791a480b71
   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);