diff --git a/src/zoning_cmd.cpp b/src/zoning_cmd.cpp index 9edcba8dd8..5f9240d76c 100644 --- a/src/zoning_cmd.cpp +++ b/src/zoning_cmd.cpp @@ -52,19 +52,20 @@ void DrawZoningSprites(SpriteID image, SpriteID colour, const TileInfo *ti) * the area to search by * @param Owner owner * the owner of the stations which we need to match again + * @param StationFacility facility_mask + * one or more facilities in the mask must be present for a station to be used * @return true if a station is found */ -bool IsAreaWithinAcceptanceZoneOfStation(TileArea area, Owner owner) +bool IsAreaWithinAcceptanceZoneOfStation(TileArea area, Owner owner, StationFacility facility_mask) { - // TODO: Actually do owner check. - int catchment = _settings_game.station.station_spread + (_settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED); StationFinder morestations(TileArea(TileXY(TileX(area.tile) - (catchment / 2), TileY(area.tile) - (catchment / 2)), TileX(area.tile) + area.w + catchment, TileY(area.tile) + area.h + catchment)); for (Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter) { - Station *st = *st_iter; + const Station *st = *st_iter; + if (st->owner != owner || !(st->facilities & facility_mask)) continue; Rect rect = st->GetCatchmentRect(); return TileArea(TileXY(rect.left, rect.top), TileXY(rect.right, rect.bottom)).Intersects(area); } @@ -79,19 +80,20 @@ bool IsAreaWithinAcceptanceZoneOfStation(TileArea area, Owner owner) * the tile to search by * @param Owner owner * the owner of the stations + * @param StationFacility facility_mask + * one or more facilities in the mask must be present for a station to be used * @return true if a station is found */ -bool IsTileWithinAcceptanceZoneOfStation(TileIndex tile, Owner owner) +bool IsTileWithinAcceptanceZoneOfStation(TileIndex tile, Owner owner, StationFacility facility_mask) { - // TODO: Actually do owner check. - int catchment = _settings_game.station.station_spread + (_settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED); StationFinder morestations(TileArea(TileXY(TileX(tile) - (catchment / 2), TileY(tile) - (catchment / 2)), catchment, catchment)); for (Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter) { - Station *st = *st_iter; + const Station *st = *st_iter; + if (st->owner != owner || !(st->facilities & facility_mask)) continue; Rect rect = st->GetCatchmentRect(); if ((uint)rect.left <= TileX(tile) && TileX(tile) <= (uint)rect.right && (uint)rect.top <= TileY(tile) && TileY(tile) <= (uint)rect.bottom) { @@ -185,8 +187,6 @@ SpriteID TileZoneCheckOpinionEvaluation(TileIndex tile, Owner owner) */ SpriteID TileZoneCheckStationCatchmentEvaluation(TileIndex tile, Owner owner) { - // TODO: Actually check owner. - // Never on a station. if (IsTileType(tile, MP_STATION)) { return ZONING_INVALID_SPRITE_ID; @@ -195,12 +195,15 @@ SpriteID TileZoneCheckStationCatchmentEvaluation(TileIndex tile, Owner owner) // For provided goods StationFinder stations(TileArea(tile, 1, 1)); - if (stations.GetStations()->Length() > 0) { - return SPR_ZONING_INNER_HIGHLIGHT_BLACK; + for (Station * const *st_iter = stations.GetStations()->Begin(); st_iter != stations.GetStations()->End(); ++st_iter) { + const Station *st = *st_iter; + if (st->owner == owner) { + return SPR_ZONING_INNER_HIGHLIGHT_BLACK; + } } // For accepted goods - if (IsTileWithinAcceptanceZoneOfStation(tile, owner)) { + if (IsTileWithinAcceptanceZoneOfStation(tile, owner, ~FACIL_NONE)) { return SPR_ZONING_INNER_HIGHLIGHT_LIGHT_BLUE; } @@ -217,8 +220,6 @@ SpriteID TileZoneCheckStationCatchmentEvaluation(TileIndex tile, Owner owner) */ SpriteID TileZoneCheckUnservedBuildingsEvaluation(TileIndex tile, Owner owner) { - // TODO: Actually use owner. - if (!IsTileType(tile, MP_HOUSE)) { return ZONING_INVALID_SPRITE_ID; } @@ -238,18 +239,18 @@ SpriteID TileZoneCheckUnservedBuildingsEvaluation(TileIndex tile, Owner owner) StationFinder stations(TileArea(tile, 1, 1)); - if (stations.GetStations()->Length() > 0) { - return ZONING_INVALID_SPRITE_ID; + for (Station * const *st_iter = stations.GetStations()->Begin(); st_iter != stations.GetStations()->End(); ++st_iter) { + const Station *st = *st_iter; + if (st->owner == owner) { + return ZONING_INVALID_SPRITE_ID; + } } // For accepted goods - if (IsTileWithinAcceptanceZoneOfStation(tile, owner)) { + if (IsTileWithinAcceptanceZoneOfStation(tile, owner, ~FACIL_NONE)) { return SPR_ZONING_INNER_HIGHLIGHT_ORANGE; } - // TODO: Check for stations that does not accept mail/passengers, - // which is currently only truck stops. - return SPR_ZONING_INNER_HIGHLIGHT_RED; } @@ -263,24 +264,22 @@ SpriteID TileZoneCheckUnservedBuildingsEvaluation(TileIndex tile, Owner owner) */ SpriteID TileZoneCheckUnservedIndustriesEvaluation(TileIndex tile, Owner owner) { - // TODO: Actually use owner. - if (IsTileType(tile, MP_INDUSTRY)) { Industry *ind = Industry::GetByTile(tile); StationFinder stations(ind->location); - if (stations.GetStations()->Length() > 0) { - return ZONING_INVALID_SPRITE_ID; + for (Station * const *st_iter = stations.GetStations()->Begin(); st_iter != stations.GetStations()->End(); ++st_iter) { + const Station *st = *st_iter; + if (st->owner == owner && st->facilities & (~FACIL_BUS_STOP)) { + return ZONING_INVALID_SPRITE_ID; + } } // For accepted goods - if (IsAreaWithinAcceptanceZoneOfStation(ind->location, owner)) { + if (IsAreaWithinAcceptanceZoneOfStation(ind->location, owner, ~FACIL_BUS_STOP)) { return SPR_ZONING_INNER_HIGHLIGHT_ORANGE; } - // TODO: Check for stations that only accepts mail/passengers, - // which is currently only bus stops. - return SPR_ZONING_INNER_HIGHLIGHT_RED; }