diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 551ac8afd5..3afa2569b1 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -848,7 +848,7 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u 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)); UpdateLevelCrossing(tile, false); - MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile)); + MarkDirtyAdjacentLevelCrossingTilesOnAdd(tile, GetCrossingRoadAxis(tile)); Company::Get(_current_company)->infrastructure.rail[railtype] += LEVELCROSSING_TRACKBIT_FACTOR; DirtyCompanyInfrastructureWindows(_current_company); 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) { - MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile)); + UpdateAdjacentLevelCrossingTilesOnRemove(tile, GetCrossingRoadAxis(tile)); if (v != nullptr) FreeTrainTrackReservation(v); owner = GetTileOwner(tile); diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 95022fbee7..00ddf50170 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -853,7 +853,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlag flags, RoadBits piec } if (flags & DC_EXEC) { - MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile)); + UpdateAdjacentLevelCrossingTilesOnRemove(tile, GetCrossingRoadAxis(tile)); /* A full diagonal road tile has two road bits. */ 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); SetCrossingReservation(tile, reserved); UpdateLevelCrossing(tile, false); - MarkDirtyAdjacentLevelCrossingTilesOnAddRemove(tile, GetCrossingRoadAxis(tile)); + MarkDirtyAdjacentLevelCrossingTilesOnAdd(tile, GetCrossingRoadAxis(tile)); if (RoadLayoutChangeNotificationEnabled(true)) NotifyRoadLayoutChangedIfTileNonLeaf(tile, rtt, GetCrossingRoadBits(tile)); if (rtt == RTT_ROAD) { UpdateRoadCachedOneWayStatesAroundTile(tile); diff --git a/src/road_func.h b/src/road_func.h index 156bf00c8b..777efd9c95 100644 --- a/src/road_func.h +++ b/src/road_func.h @@ -155,7 +155,8 @@ RoadTypes GetRoadTypes(bool introduces); RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, Date date); 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); void UpdateRoadCachedOneWayStatesAroundTile(TileIndex tile); diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 06696e0a21..3f30b47db6 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -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; @@ -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). * @param t The tile to query.