Exemple #1
0
    public static TileSelection SelectContiguous(Tile start, TileSelection tiles)
    {
        var           time   = Time.realtimeSinceStartup;
        TileSelection result = new TileSelection();
        TileSelection open   = new TileSelection();

        open.Add(start);
        var i = 0;

        while (open.Count() > 0)
        {
            i++;
            if (i > tiles.Count())
            {
                throw(new Exception("Fill fail"));
            }
            var t = open[0];
            open.Remove(t);
            result.Add(t);
            foreach (var n in t.adjacent.tiles)
            {
                if (result.DoesNotContain(n) && tiles.Contains(n))
                {
                    open.Add(n);
                }
            }
        }
        _gui_manager.selected_tiles = result;
        return(result);
    }
Exemple #2
0
    public static Region ClosestRegion(TileSelection tiles, Region to_ignore = null, HashSet <Region> whitelist = null)
    {
        var open      = new List <SearchRecord>();
        var openTiles = new TileSelection();
        var closed    = new TileSelection();

        foreach (var t in tiles.tiles)
        {
            var record = new SearchRecord();
            record.t    = t;
            record.cost = 0;
            open.Add(record);
        }
        var i = 0;

        while (open.Count > 0)
        {
            i++;
            if (i > 1000)
            {
                throw(new Exception("Finding closest Region took too long"));
            }
            open.Sort((a, b) => a.cost - b.cost);
            var node = open[0];
            closed.Add(node.t);
            open.RemoveAt(0);
            openTiles.Remove(node.t);
            if (node.t.region != null && node.t.region != to_ignore)
            {
                if (whitelist == null || whitelist.Contains(node.t.region))
                {
                    return(node.t.region);
                }
            }
            foreach (var n in node.t.adjacent.tiles)
            {
                if (closed.DoesNotContain(n) && openTiles.DoesNotContain(n))
                {
                    var record = new SearchRecord();
                    record.t    = n;
                    record.cost = node.cost + 1;
                    open.Add(record);
                    openTiles.Add(record.t);
                }
            }
        }
        _gui_manager.selected_region = null;
        _gui_manager.selected_tiles  = tiles;
        throw new Exception("Could not find any other Regions after " + i + " iterations");
    }
Exemple #3
0
    public static TileSelection Shrink(TileSelection tiles)
    {
        TileSelection result = new TileSelection();

        foreach (var t in tiles.tiles)
        {
            bool valid = true;
            foreach (var n in t.adjacent.tiles)
            {
                if (tiles.DoesNotContain(n))
                {
                    valid = false;
                    break;
                }
            }
            if (valid)
            {
                result.Add(t);
            }
        }
        _gui_manager.selected_tiles = result;
        return(result);
    }