diff options
Diffstat (limited to 'src/rail_cmd.cpp')
-rw-r--r-- | src/rail_cmd.cpp | 86 |
1 files changed, 85 insertions, 1 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index f749ad94a..5e00bfcb2 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -32,6 +32,7 @@ #include "core/backup_type.hpp" #include "date_func.h" #include "strings_func.h" +#include "company_gui.h" #include "table/strings.h" #include "table/railtypes.h" @@ -417,7 +418,17 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u if (flags & DC_EXEC) { SetRailGroundType(tile, RAIL_GROUND_BARREN); - SetTrackBits(tile, GetTrackBits(tile) | trackbit); + TrackBits bits = GetTrackBits(tile); + SetTrackBits(tile, bits | trackbit); + /* Subtract old infrastructure count. */ + uint pieces = CountBits(bits); + if (TracksOverlap(bits)) pieces *= pieces; + Company::Get(GetTileOwner(tile))->infrastructure.rail[GetRailType(tile)] -= pieces; + /* Add new infrastructure count. */ + pieces = CountBits(bits | trackbit); + if (TracksOverlap(bits | trackbit)) pieces *= pieces; + Company::Get(GetTileOwner(tile))->infrastructure.rail[GetRailType(tile)] += pieces; + DirtyCompanyInfrastructureWindows(GetTileOwner(tile)); } break; } @@ -459,6 +470,8 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u if (flags & DC_EXEC) { MakeRoadCrossing(tile, GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtypes, GetTownIndex(tile)); UpdateLevelCrossing(tile, false); + Company::Get(_current_company)->infrastructure.rail[railtype] += LEVELCROSSING_TRACKBIT_FACTOR; + DirtyCompanyInfrastructureWindows(_current_company); } break; } @@ -490,6 +503,8 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u if (flags & DC_EXEC) { MakeRailNormal(tile, _current_company, trackbit, railtype); if (water_ground) SetRailGroundType(tile, RAIL_GROUND_WATER); + Company::Get(_current_company)->infrastructure.rail[railtype]++; + DirtyCompanyInfrastructureWindows(_current_company); } break; } @@ -553,6 +568,8 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, if (v != NULL) FreeTrainTrackReservation(v); } owner = GetTileOwner(tile); + Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= LEVELCROSSING_TRACKBIT_FACTOR; + DirtyCompanyInfrastructureWindows(owner); MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM)); DeleteNewGRFInspectWindow(GSF_RAILTYPES, tile); } @@ -588,8 +605,20 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, v = GetTrainForReservation(tile, track); if (v != NULL) FreeTrainTrackReservation(v); } + owner = GetTileOwner(tile); + + /* Subtract old infrastructure count. */ + uint pieces = CountBits(present); + if (TracksOverlap(present)) pieces *= pieces; + Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= pieces; + /* Add new infrastructure count. */ present ^= trackbit; + pieces = CountBits(present); + if (TracksOverlap(present)) pieces *= pieces; + Company::Get(owner)->infrastructure.rail[GetRailType(tile)] += pieces; + DirtyCompanyInfrastructureWindows(owner); + if (present == 0) { Slope tileh = GetTileSlope(tile); /* If there is flat water on the lower halftile, convert the tile to shore so the water remains */ @@ -895,6 +924,9 @@ CommandCost CmdBuildTrainDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, u MarkTileDirtyByTile(tile); MakeDefaultName(d); + Company::Get(_current_company)->infrastructure.rail[railtype]++; + DirtyCompanyInfrastructureWindows(_current_company); + AddSideToSignalBuffer(tile, INVALID_DIAGDIR, _current_company); YapfNotifyTrackLayoutChange(tile, DiagDirToDiagTrack(dir)); } @@ -1013,6 +1045,9 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, SetSignalVariant(tile, track, sigvar); } + /* Subtract old signal infrastructure count. */ + Company::Get(GetTileOwner(tile))->infrastructure.signal -= CountBits(GetPresentSignals(tile)); + if (p2 == 0) { if (!HasSignalOnTrack(tile, track)) { /* build new signals */ @@ -1062,6 +1097,10 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, SetSignalType(tile, track, sigtype); } + /* Add new signal infrastructure count. */ + Company::Get(GetTileOwner(tile))->infrastructure.signal += CountBits(GetPresentSignals(tile)); + DirtyCompanyInfrastructureWindows(GetTileOwner(tile)); + if (IsPbsSignal(sigtype)) { /* PBS signals should show red unless they are on a reservation. */ uint mask = GetPresentSignals(tile) & SignalOnTrack(track); @@ -1343,7 +1382,10 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1 } } } + Company::Get(GetTileOwner(tile))->infrastructure.signal -= CountBits(GetPresentSignals(tile)); SetPresentSignals(tile, GetPresentSignals(tile) & ~SignalOnTrack(track)); + Company::Get(GetTileOwner(tile))->infrastructure.signal += CountBits(GetPresentSignals(tile)); + DirtyCompanyInfrastructureWindows(GetTileOwner(tile)); /* removed last signal from tile? */ if (GetPresentSignals(tile) == 0) { @@ -1481,6 +1523,20 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 } } + /* Update the company infrastructure counters. */ + if (IsRailStationTile(tile) && !IsStationTileBlocked(tile)) { + Company *c = Company::Get(GetTileOwner(tile)); + uint num_pieces = IsLevelCrossingTile(tile) ? LEVELCROSSING_TRACKBIT_FACTOR : 1; + if (IsPlainRailTile(tile)) { + TrackBits bits = GetTrackBits(tile); + num_pieces = CountBits(bits); + if (TracksOverlap(bits)) num_pieces *= num_pieces; + } + c->infrastructure.rail[type] -= num_pieces; + c->infrastructure.rail[totype] += num_pieces; + DirtyCompanyInfrastructureWindows(c->index); + } + SetRailType(tile, totype); MarkTileDirtyByTile(tile); /* update power of train on this tile */ @@ -1543,6 +1599,14 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 *vehicles_affected.Append() = v; } } + + /* Update the company infrastructure counters. */ + uint num_pieces = (GetTunnelBridgeLength(tile, endtile) + 2) * TUNNELBRIDGE_TRACKBIT_FACTOR; + Company *c = Company::Get(GetTileOwner(tile)); + c->infrastructure.rail[GetRailType(tile)] -= num_pieces; + c->infrastructure.rail[totype] += num_pieces; + DirtyCompanyInfrastructureWindows(c->index); + SetRailType(tile, totype); SetRailType(endtile, totype); @@ -1613,6 +1677,9 @@ static CommandCost RemoveTrainDepot(TileIndex tile, DoCommandFlag flags) if (v != NULL) FreeTrainTrackReservation(v); } + Company::Get(owner)->infrastructure.rail[GetRailType(tile)]--; + DirtyCompanyInfrastructureWindows(owner); + delete Depot::GetByTile(tile); DoClearSquare(tile); AddSideToSignalBuffer(tile, dir, owner); @@ -2692,6 +2759,23 @@ static void ChangeTileOwner_Track(TileIndex tile, Owner old_owner, Owner new_own if (!IsTileOwner(tile, old_owner)) return; if (new_owner != INVALID_OWNER) { + /* Update company infrastructure counts. No need to dirty windows here, we'll redraw the whole screen anyway. */ + uint num_pieces = 1; + if (IsPlainRail(tile)) { + TrackBits bits = GetTrackBits(tile); + num_pieces = CountBits(bits); + if (TracksOverlap(bits)) num_pieces *= num_pieces; + } + RailType rt = GetRailType(tile); + Company::Get(old_owner)->infrastructure.rail[rt] -= num_pieces; + Company::Get(new_owner)->infrastructure.rail[rt] += num_pieces; + + if (HasSignals(tile)) { + uint num_sigs = CountBits(GetPresentSignals(tile)); + Company::Get(old_owner)->infrastructure.signal -= num_sigs; + Company::Get(new_owner)->infrastructure.signal += num_sigs; + } + SetTileOwner(tile, new_owner); } else { DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR); |