/// <summary>
        ///     Do a pre-filtering of tiles on the world map. Mostly used to gather "valid" tiles (that is, tiles that are
        ///     settleable).
        /// </summary>
        private void Prefilter()
        {
            Log.Message($"[PrepareLanding] Prefilter: {Find.WorldGrid.tiles.Count} tiles in WorldGrid.tiles");

            FilterInfoLogger.AppendTitleMessage("PLFILT_PreFiltering".Translate(), textColor: Color.cyan);

            ClearMatchingTiles();

            // clear all valid tile ids
            _allValidTileIds.Clear();

            // get all valid tiles for a new settlement
            var tileCount = Find.World.grid.TilesCount;

            for (var i = 0; i < tileCount; i++)
            {
                if (!IsViableTile(i))
                {
                    continue;
                }

                _allValidTileIds.Add(i);
            }

            var msgTilesRemainAfterFilter = string.Format("PLFILT_ValidTilesRemainAfterFilter".Translate(),
                                                          _allValidTileIds.Count, Find.WorldGrid.tiles.Count - _allValidTileIds.Count);

            FilterInfoLogger.AppendMessage(msgTilesRemainAfterFilter);

            // get all tiles with at least one river
            var allTilesWithRivers = _allValidTileIds.FindAll(
                tileId => Find.World.grid[tileId].VisibleRivers != null &&
                Find.World.grid[tileId].VisibleRivers.Count != 0);

            AllTilesWithRiver = new ReadOnlyCollection <int>(allTilesWithRivers);
            FilterInfoLogger.AppendMessage(string.Format("PLFILT_TilesWithRiver".Translate(), AllTilesWithRiver.Count));

            // get all tiles with at least one road
            var allTilesWithRoads =
                _allValidTileIds.FindAll(tileId => Find.World.grid[tileId].VisibleRoads != null &&
                                         Find.World.grid[tileId].VisibleRoads.Count != 0);

            AllTilesWithRoad = new ReadOnlyCollection <int>(allTilesWithRoads);
            FilterInfoLogger.AppendMessage(string.Format("PLFILT_TilesWithRoad".Translate(), AllTilesWithRoad.Count));

            OnPrefilterDone?.Invoke();
        }
        /// <summary>
        ///     Do a pre-filtering of tiles on the world map. Mostly used to gather "valid" tiles (that is, tiles that are
        ///     settleable).
        /// </summary>
        protected void Prefilter()
        {
            Log.Message($"[PrepareLanding] Prefilter: {Find.WorldGrid.tiles.Count} tiles in WorldGrid.tiles");

            var separator = "-".Repeat(80);

            FilterInfoLogger.AppendMessage($"{separator}\nPreFiltering\n{separator}", textColor: Color.cyan);

            // clear all valid tile ids
            _allValidTileIds.Clear();

            // get all valid tiles for a new settlement
            var tileCount = Find.World.grid.TilesCount;

            for (var i = 0; i < tileCount; i++)
            {
                if (!IsViableTile(i))
                {
                    continue;
                }

                _allValidTileIds.Add(i);
            }

            FilterInfoLogger.AppendMessage(
                $"Prefilter: {_allValidTileIds.Count} tiles remain after filter ({Find.WorldGrid.tiles.Count - _allValidTileIds.Count} removed).");

            // get all tiles with at least one river
            var allTilesWithRivers = _allValidTileIds.FindAll(
                tileId => (Find.World.grid[tileId].VisibleRivers != null) &&
                (Find.World.grid[tileId].VisibleRivers.Count != 0));

            AllTilesWithRiver = new ReadOnlyCollection <int>(allTilesWithRivers);
            FilterInfoLogger.AppendMessage($"Prefilter: {allTilesWithRivers.Count} tiles with at least one river.");

            // get all tiles with at least one road
            var allTilesWithRoads =
                _allValidTileIds.FindAll(tileId => (Find.World.grid[tileId].VisibleRoads != null) &&
                                         (Find.World.grid[tileId].VisibleRoads.Count != 0));

            AllTilesWithRoad = new ReadOnlyCollection <int>(allTilesWithRoads);
            FilterInfoLogger.AppendMessage($"Prefilter: {allTilesWithRoads.Count} tiles with at least one road.");

            OnPrefilterDone?.Invoke();
        }