diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index a51c32d7e1..5b0e623774 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -18,6 +18,7 @@ #include "../station_map.h" #include "../tunnelbridge_map.h" #include "../tunnelbridge.h" +#include "../station_base.h" #include "saveload.h" @@ -98,6 +99,14 @@ void AfterLoadCompanyStats() Company *c; FOR_ALL_COMPANIES(c) MemSetT(&c->infrastructure, 0); + /* Collect airport count. */ + Station *st; + FOR_ALL_STATIONS(st) { + if ((st->facilities & FACIL_AIRPORT) && Company::IsValidID(st->owner)) { + Company::Get(st->owner)->infrastructure.airport++; + } + } + for (TileIndex tile = 0; tile < MapSize(); tile++) { switch (GetTileType(tile)) { case MP_RAILWAY: @@ -133,6 +142,7 @@ void AfterLoadCompanyStats() case MP_STATION: c = Company::GetIfValid(GetTileOwner(tile)); + if (c != NULL && GetStationType(tile) != STATION_AIRPORT) c->infrastructure.station++; switch (GetStationType(tile)) { case STATION_RAIL: diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 839946214b..b642295af2 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1238,7 +1238,10 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32 } /* Railtype can change when overbuilding. */ - if (IsRailStationTile(tile) && !IsStationTileBlocked(tile)) c->infrastructure.rail[GetRailType(tile)]--; + if (IsRailStationTile(tile)) { + if (!IsStationTileBlocked(tile)) c->infrastructure.rail[GetRailType(tile)]--; + c->infrastructure.station--; + } /* Remove animation if overbuilding */ DeleteAnimatedTile(tile); @@ -1252,6 +1255,7 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32 SetAnimationFrame(tile, 0); if (!IsStationTileBlocked(tile)) c->infrastructure.rail[rt]++; + c->infrastructure.station++; if (statspec != NULL) { /* Use a fixed axis for GetPlatformInfo as our platforms / numtracks are always the right way around */ @@ -1422,6 +1426,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, SmallVector &affected DoClearSquare(tile); DeleteNewGRFInspectWindow(GSF_STATIONS, tile); if (build_rail) MakeRailNormal(tile, owner, TrackToTrackBits(track), rt); + Company::Get(owner)->infrastructure.station--; DirtyCompanyInfrastructureWindows(owner); st->rect.AfterRemoveTile(st, tile); @@ -1565,6 +1570,7 @@ CommandCost RemoveRailStation(T *st, DoCommandFlag flags) if (v != NULL) FreeTrainTrackReservation(v); } if (!IsStationTileBlocked(tile)) Company::Get(owner)->infrastructure.rail[GetRailType(tile)]--; + Company::Get(owner)->infrastructure.station--; DoClearSquare(tile); DeleteNewGRFInspectWindow(GSF_STATIONS, tile); AddTrackToSignalBuffer(tile, track, owner); @@ -1807,9 +1813,10 @@ CommandCost CmdBuildRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, uin } 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); } + Company::Get(st->owner)->infrastructure.station++; + DirtyCompanyInfrastructureWindows(st->owner); MarkTileDirtyByTile(cur_tile); } @@ -1906,6 +1913,7 @@ static CommandCost RemoveRoadStop(TileIndex tile, DoCommandFlag flags) DirtyCompanyInfrastructureWindows(c->index); } } + Company::Get(st->owner)->infrastructure.station--; if (IsDriveThroughStopTile(tile)) { /* Clears the tile for us */ @@ -2258,6 +2266,9 @@ CommandCost CmdBuildAirport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint UpdateAirplanesOnNewStation(st); + Company::Get(st->owner)->infrastructure.airport++; + DirtyCompanyInfrastructureWindows(st->owner); + st->UpdateVirtCoord(); UpdateStationAcceptance(st, false); st->RecomputeIndustriesNear(); @@ -2342,6 +2353,9 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) SetWindowDirty(WC_TOWN_VIEW, st->town->index); } + Company::Get(st->owner)->infrastructure.airport--; + DirtyCompanyInfrastructureWindows(st->owner); + st->UpdateVirtCoord(); st->RecomputeIndustriesNear(); DeleteStationIfEmpty(st); @@ -2486,8 +2500,9 @@ CommandCost CmdBuildDock(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 * This is needed as we've unconditionally cleared that tile before. */ if (wc == WATER_CLASS_CANAL) { Company::Get(st->owner)->infrastructure.water++; - DirtyCompanyInfrastructureWindows(st->owner); } + Company::Get(st->owner)->infrastructure.station += 2; + DirtyCompanyInfrastructureWindows(st->owner); MakeDock(tile, st->owner, st->index, direction, wc); @@ -2532,6 +2547,9 @@ static CommandCost RemoveDock(TileIndex tile, DoCommandFlag flags) st->dock_tile = INVALID_TILE; st->facilities &= ~FACIL_DOCK; + Company::Get(st->owner)->infrastructure.station -= 2; + DirtyCompanyInfrastructureWindows(st->owner); + SetWindowWidgetDirty(WC_STATION_VIEW, st->index, SVW_SHIPS); st->UpdateVirtCoord(); st->RecomputeIndustriesNear(); diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index f7d6a1d6b4..3043b38045 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -28,6 +28,7 @@ #include "newgrf_station.h" #include "company_base.h" #include "water.h" +#include "company_gui.h" #include "table/strings.h" @@ -252,9 +253,11 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint } byte map_spec_index = AllocateSpecToStation(spec, wp, true); + Company *c = Company::Get(wp->owner); for (int i = 0; i < count; i++) { TileIndex tile = start_tile + i * offset; byte old_specindex = HasStationTileRail(tile) ? GetCustomStationSpecIndex(tile) : 0; + if (!HasStationTileRail(tile)) c->infrastructure.station++; bool reserved = IsTileType(tile, MP_RAILWAY) ? HasBit(GetRailReservationTrackBits(tile), AxisToTrack(axis)) : HasStationReservation(tile); @@ -266,6 +269,7 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint DeallocateSpecFromStation(wp, old_specindex); YapfNotifyTrackLayoutChange(tile, AxisToTrack(axis)); } + DirtyCompanyInfrastructureWindows(wp->owner); } return CommandCost(EXPENSES_CONSTRUCTION, count * _price[PR_BUILD_WAYPOINT_RAIL]);