Mark dirty the catchment of a station on change as necessary for zoning.

If the zoning mode is station catchment, or unserved industry/building,
mark dirty the station catchment rectangle before removing, or after
adding, (a) station tile(s).
In the case of unserved industry mode, increase the refreshed catchment
radius by 10 tiles, to wholly include industries partially inside
the catchment area.
This commit is contained in:
Jonathan G Rennison
2015-11-01 16:07:55 +00:00
parent 74bccb5d50
commit c120b810d1
5 changed files with 57 additions and 6 deletions

View File

@@ -53,6 +53,7 @@
#include "linkgraph/linkgraph_base.h"
#include "linkgraph/refresh.h"
#include "widgets/station_widget.h"
#include "zoning.h"
#include "table/strings.h"
@@ -1383,6 +1384,7 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32
st->UpdateVirtCoord();
UpdateStationAcceptance(st, false);
st->RecomputeIndustriesNear();
ZoningMarkDirtyStationCoverageArea(st);
InvalidateWindowData(WC_SELECT_STATION, 0, 0);
InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
SetWindowWidgetDirty(WC_STATION_VIEW, st->index, WID_SV_TRAINS);
@@ -1495,6 +1497,9 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, SmallVector<T *, 4> &affected
}
if (flags & DC_EXEC) {
bool already_affected = affected_stations.Include(st);
if (!already_affected) ZoningMarkDirtyStationCoverageArea(st);
/* read variables before the station tile is removed */
uint specindex = GetCustomStationSpecIndex(tile);
Track track = GetRailStationTrack(tile);
@@ -1529,8 +1534,6 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, SmallVector<T *, 4> &affected
DeallocateSpecFromStation(st, specindex);
affected_stations.Include(st);
if (v != NULL) {
/* Restore station reservation. */
if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
@@ -1674,6 +1677,9 @@ static CommandCost RemoveRailStation(TileIndex tile, DoCommandFlag flags)
}
Station *st = Station::GetByTile(tile);
if (flags & DC_EXEC) ZoningMarkDirtyStationCoverageArea(st);
CommandCost cost = RemoveRailStation(st, flags, _price[PR_CLEAR_STATION_RAIL]);
if (flags & DC_EXEC) st->RecomputeIndustriesNear();
@@ -1863,6 +1869,7 @@ CommandCost CmdBuildRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
MarkTileDirtyByTile(cur_tile);
}
ZoningMarkDirtyStationCoverageArea(st);
}
if (st != NULL) {
@@ -1933,6 +1940,7 @@ static CommandCost RemoveRoadStop(TileIndex tile, DoCommandFlag flags)
}
if (flags & DC_EXEC) {
ZoningMarkDirtyStationCoverageArea(st);
if (*primary_stop == cur_stop) {
/* removed the first stop in the list */
*primary_stop = cur_stop->next;
@@ -2299,6 +2307,7 @@ CommandCost CmdBuildAirport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
st->UpdateVirtCoord();
UpdateStationAcceptance(st, false);
st->RecomputeIndustriesNear();
ZoningMarkDirtyStationCoverageArea(st);
InvalidateWindowData(WC_SELECT_STATION, 0, 0);
InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
InvalidateWindowData(WC_STATION_VIEW, st->index, -1);
@@ -2337,6 +2346,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
}
if (flags & DC_EXEC) {
ZoningMarkDirtyStationCoverageArea(st);
const AirportSpec *as = st->airport.GetSpec();
/* The noise level is the noise from the airport and reduce it to account for the distance to the town center.
* And as for construction, always remove it, even if the setting is not set, in order to avoid the
@@ -2539,6 +2549,7 @@ CommandCost CmdBuildDock(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
st->UpdateVirtCoord();
UpdateStationAcceptance(st, false);
st->RecomputeIndustriesNear();
ZoningMarkDirtyStationCoverageArea(st);
InvalidateWindowData(WC_SELECT_STATION, 0, 0);
InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
SetWindowWidgetDirty(WC_STATION_VIEW, st->index, WID_SV_SHIPS);
@@ -2569,6 +2580,7 @@ static CommandCost RemoveDock(TileIndex tile, DoCommandFlag flags)
if (ret.Failed()) return ret;
if (flags & DC_EXEC) {
ZoningMarkDirtyStationCoverageArea(st);
DoClearSquare(tile1);
MarkTileDirtyByTile(tile1);
MakeWaterKeepingClass(tile2, st->owner);
@@ -3903,11 +3915,13 @@ void BuildOilRig(TileIndex tile)
st->UpdateVirtCoord();
UpdateStationAcceptance(st, false);
st->RecomputeIndustriesNear();
ZoningMarkDirtyStationCoverageArea(st);
}
void DeleteOilRig(TileIndex tile)
{
Station *st = Station::GetByTile(tile);
ZoningMarkDirtyStationCoverageArea(st);
MakeWaterKeepingClass(tile, OWNER_NONE);