Fix adjacent level crossings left barred after removing middle of crossing
See: #517
This commit is contained in:
@@ -848,7 +848,7 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
|||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
MakeRoadCrossing(tile, road_owner, tram_owner, _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtype_road, roadtype_tram, GetTownIndex(tile));
|
MakeRoadCrossing(tile, road_owner, tram_owner, _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtype_road, roadtype_tram, GetTownIndex(tile));
|
||||||
UpdateLevelCrossing(tile, false);
|
UpdateLevelCrossing(tile, false);
|
||||||
MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile));
|
MarkDirtyAdjacentLevelCrossingTilesOnAdd(tile, GetCrossingRoadAxis(tile));
|
||||||
Company::Get(_current_company)->infrastructure.rail[railtype] += LEVELCROSSING_TRACKBIT_FACTOR;
|
Company::Get(_current_company)->infrastructure.rail[railtype] += LEVELCROSSING_TRACKBIT_FACTOR;
|
||||||
DirtyCompanyInfrastructureWindows(_current_company);
|
DirtyCompanyInfrastructureWindows(_current_company);
|
||||||
if (num_new_road_pieces > 0 && Company::IsValidID(road_owner)) {
|
if (num_new_road_pieces > 0 && Company::IsValidID(road_owner)) {
|
||||||
@@ -968,7 +968,7 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile));
|
UpdateAdjacentLevelCrossingTilesOnRemove(tile, GetCrossingRoadAxis(tile));
|
||||||
if (v != nullptr) FreeTrainTrackReservation(v);
|
if (v != nullptr) FreeTrainTrackReservation(v);
|
||||||
|
|
||||||
owner = GetTileOwner(tile);
|
owner = GetTileOwner(tile);
|
||||||
|
@@ -853,7 +853,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlag flags, RoadBits piec
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile));
|
UpdateAdjacentLevelCrossingTilesOnRemove(tile, GetCrossingRoadAxis(tile));
|
||||||
|
|
||||||
/* A full diagonal road tile has two road bits. */
|
/* A full diagonal road tile has two road bits. */
|
||||||
UpdateCompanyRoadInfrastructure(existing_rt, GetRoadOwner(tile, rtt), -2);
|
UpdateCompanyRoadInfrastructure(existing_rt, GetRoadOwner(tile, rtt), -2);
|
||||||
@@ -1158,7 +1158,7 @@ CommandCost CmdBuildRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
MakeRoadCrossing(tile, company, company, GetTileOwner(tile), roaddir, GetRailType(tile), rtt == RTT_ROAD ? rt : INVALID_ROADTYPE, (rtt == RTT_TRAM) ? rt : INVALID_ROADTYPE, p2);
|
MakeRoadCrossing(tile, company, company, GetTileOwner(tile), roaddir, GetRailType(tile), rtt == RTT_ROAD ? rt : INVALID_ROADTYPE, (rtt == RTT_TRAM) ? rt : INVALID_ROADTYPE, p2);
|
||||||
SetCrossingReservation(tile, reserved);
|
SetCrossingReservation(tile, reserved);
|
||||||
UpdateLevelCrossing(tile, false);
|
UpdateLevelCrossing(tile, false);
|
||||||
MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile));
|
MarkDirtyAdjacentLevelCrossingTilesOnAdd(tile, GetCrossingRoadAxis(tile));
|
||||||
if (RoadLayoutChangeNotificationEnabled(true)) NotifyRoadLayoutChangedIfTileNonLeaf(tile, rtt, GetCrossingRoadBits(tile));
|
if (RoadLayoutChangeNotificationEnabled(true)) NotifyRoadLayoutChangedIfTileNonLeaf(tile, rtt, GetCrossingRoadBits(tile));
|
||||||
if (rtt == RTT_ROAD) {
|
if (rtt == RTT_ROAD) {
|
||||||
UpdateRoadCachedOneWayStatesAroundTile(tile);
|
UpdateRoadCachedOneWayStatesAroundTile(tile);
|
||||||
|
@@ -155,7 +155,8 @@ RoadTypes GetRoadTypes(bool introduces);
|
|||||||
RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, Date date);
|
RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, Date date);
|
||||||
|
|
||||||
void UpdateLevelCrossing(TileIndex tile, bool sound = true, bool force_close = false);
|
void UpdateLevelCrossing(TileIndex tile, bool sound = true, bool force_close = false);
|
||||||
void MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(TileIndex tile, Axis road_axis);
|
void MarkDirtyAdjacentLevelCrossingTilesOnAdd(TileIndex tile, Axis road_axis);
|
||||||
|
void UpdateAdjacentLevelCrossingTilesOnRemove(TileIndex tile, Axis road_axis);
|
||||||
bool IsCrossingOccupiedByRoadVehicle(TileIndex t);
|
bool IsCrossingOccupiedByRoadVehicle(TileIndex t);
|
||||||
|
|
||||||
void UpdateRoadCachedOneWayStatesAroundTile(TileIndex tile);
|
void UpdateRoadCachedOneWayStatesAroundTile(TileIndex tile);
|
||||||
|
@@ -2724,7 +2724,7 @@ void UpdateLevelCrossing(TileIndex tile, bool sound, bool force_close)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(TileIndex tile, Axis road_axis)
|
void MarkDirtyAdjacentLevelCrossingTilesOnAdd(TileIndex tile, Axis road_axis)
|
||||||
{
|
{
|
||||||
if (!_settings_game.vehicle.adjacent_crossings) return;
|
if (!_settings_game.vehicle.adjacent_crossings) return;
|
||||||
|
|
||||||
@@ -2738,6 +2738,29 @@ void MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(TileIndex tile, Axis road_ax
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateAdjacentLevelCrossingTilesOnRemove(TileIndex tile, Axis road_axis)
|
||||||
|
{
|
||||||
|
const DiagDirection dir1 = AxisToDiagDir(road_axis);
|
||||||
|
const DiagDirection dir2 = ReverseDiagDir(dir1);
|
||||||
|
for (DiagDirection dir : { dir1, dir2 }) {
|
||||||
|
const TileIndexDiff diff = TileOffsByDiagDir(dir);
|
||||||
|
bool occupied = false;
|
||||||
|
for (TileIndex t = tile + diff; IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) {
|
||||||
|
occupied |= CheckLevelCrossing(t);
|
||||||
|
}
|
||||||
|
if (!occupied) {
|
||||||
|
for (TileIndex t = tile + diff; IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) {
|
||||||
|
UpdateLevelCrossingTile(t, false, true, false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const TileIndex t = tile + diff;
|
||||||
|
if (IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) {
|
||||||
|
MarkTileDirtyByTile(t, VMDF_NOT_MAP_MODE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the level crossing is occupied by road vehicle(s).
|
* Check if the level crossing is occupied by road vehicle(s).
|
||||||
* @param t The tile to query.
|
* @param t The tile to query.
|
||||||
|
Reference in New Issue
Block a user