diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1791,9 +1791,23 @@ CommandCost CmdBuildRoadStop(TileIndex t RoadStopType rs_type = type ? ROADSTOP_TRUCK : ROADSTOP_BUS; if (is_drive_through) { + /* Update company infrastructure counts. If the current tile is a normal + * road tile, count only the new road bits needed to get a full diagonal road. */ + RoadType rt; + FOR_EACH_SET_ROADTYPE(rt, cur_rts | rts) { + Company *c = Company::GetIfValid(IsNormalRoadTile(cur_tile) && HasBit(cur_rts, rt) ? GetRoadOwner(cur_tile, rt) : _current_company); + if (c != NULL) { + c->infrastructure.road[rt] += 2 - (IsNormalRoadTile(cur_tile) ? CountBits(GetRoadBits(cur_tile, rt)) : 0); + DirtyCompanyInfrastructureWindows(c->index); + } + } + MakeDriveThroughRoadStop(cur_tile, st->owner, road_owner, tram_owner, st->index, rs_type, rts | cur_rts, DiagDirToAxis(ddir)); road_stop->MakeDriveThrough(); } else { + /* Non-drive-through stop never overbuild and always count as two road bits. */ + Company::Get(st->owner)->infrastructure.road[FIND_FIRST_BIT(rts)] += 2; + DirtyCompanyInfrastructureWindows(st->owner); MakeRoadStop(cur_tile, st->owner, st->index, rs_type, rts, ddir); } @@ -1883,6 +1897,16 @@ static CommandCost RemoveRoadStop(TileIn pred->next = cur_stop->next; } + /* Update company infrastructure counts. */ + RoadType rt; + FOR_EACH_SET_ROADTYPE(rt, GetRoadTypes(tile)) { + Company *c = Company::GetIfValid(GetRoadOwner(tile, rt)); + if (c != NULL) { + c->infrastructure.road[rt] -= 2; + DirtyCompanyInfrastructureWindows(c->index); + } + } + if (IsDriveThroughStopTile(tile)) { /* Clears the tile for us */ cur_stop->ClearDriveThrough(); @@ -1967,6 +1991,16 @@ CommandCost CmdRemoveRoadStop(TileIndex if ((flags & DC_EXEC) && is_drive_through) { MakeRoadNormal(cur_tile, road_bits, rts, ClosestTownFromTile(cur_tile, UINT_MAX)->index, road_owner, tram_owner); + + /* Update company infrastructure counts. */ + RoadType rt; + FOR_EACH_SET_ROADTYPE(rt, rts) { + Company *c = Company::GetIfValid(GetRoadOwner(tile, rt)); + if (c != NULL) { + c->infrastructure.road[rt] += CountBits(road_bits); + DirtyCompanyInfrastructureWindows(c->index); + } + } } } @@ -3504,6 +3538,11 @@ static void ChangeTileOwner_Station(Tile for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) { /* Update all roadtypes, no matter if they are present */ if (GetRoadOwner(tile, rt) == old_owner) { + if (HasTileRoadType(tile, rt)) { + /* A drive-through road-stop has always two road bits. No need to dirty windows here, we'll redraw the whole screen anyway. */ + Company::Get(old_owner)->infrastructure.road[rt] -= 2; + if (new_owner != INVALID_OWNER) Company::Get(new_owner)->infrastructure.road[rt] += 2; + } SetRoadOwner(tile, rt, new_owner == INVALID_OWNER ? OWNER_NONE : new_owner); } } @@ -3523,6 +3562,13 @@ static void ChangeTileOwner_Station(Tile old_company->infrastructure.rail[GetRailType(tile)]--; new_company->infrastructure.rail[GetRailType(tile)]++; } + if (IsRoadStop(tile) && !IsDriveThroughStopTile(tile)) { + RoadType rt; + FOR_EACH_SET_ROADTYPE(rt, GetRoadTypes(tile)) { + old_company->infrastructure.road[rt] -= 2; + new_company->infrastructure.road[rt] += 2; + } + } /* for buoys, owner of tile is owner of water, st->owner == OWNER_NONE */ SetTileOwner(tile, new_owner);