Пример #1
0
        public RiverOutletTileSelector(GridMatcher matcher,
                                       GridMatcher selfMatcher,
                                       IMapNavigator <GridDirection> gridNavigator,
                                       ITileRegistryEx <CardinalIndex, TRenderTile> outletRegistry,
                                       string prefix,
                                       Func <int, int, TContext> contextProvider = null)
            : base(matcher, gridNavigator, contextProvider)
        {
            this.selfMatcher = selfMatcher ?? throw new ArgumentNullException(nameof(selfMatcher));

            this.northTileExists = outletRegistry.TryFind(prefix, CardinalIndex.North, out northTile);
            this.eastTileExists  = outletRegistry.TryFind(prefix, CardinalIndex.East, out eastTile);
            this.southTileExists = outletRegistry.TryFind(prefix, CardinalIndex.South, out southTile);
            this.westTileExists  = outletRegistry.TryFind(prefix, CardinalIndex.West, out westTile);
        }
Пример #2
0
 protected void FillInTags(string prefix,
                           ITileRegistryEx <Direction, TRenderTile> registry,
                           out TRenderTile[] preparedTags,
                           out bool[] preparedTagExists)
 {
     preparedTags      = new TRenderTile[4];
     preparedTagExists = new bool[4];
     preparedTagExists[(int)Direction.Up] =
         registry.TryFind(prefix, Direction.Up, out preparedTags[(int)Direction.Up]);
     preparedTagExists[(int)Direction.Right] =
         registry.TryFind(prefix, Direction.Right, out preparedTags[(int)Direction.Right]);
     preparedTagExists[(int)Direction.Down] =
         registry.TryFind(prefix, Direction.Down, out preparedTags[(int)Direction.Down]);
     preparedTagExists[(int)Direction.Left] =
         registry.TryFind(prefix, Direction.Left, out preparedTags[(int)Direction.Left]);
 }
Пример #3
0
        void Prepopulate(string tag,
                         ITileRegistryEx <NeighbourMatchPosition, TRenderTile> reg,
                         out TRenderTile[] matches,
                         out bool[] matchesExist)
        {
            matches      = new TRenderTile[positions.Length];
            matchesExist = new bool[positions.Length];

            for (var i = 0; i < positions.Length; i++)
            {
                var matchPos = positions[i];
                matchesExist[i] = reg.TryFind(tag, matchPos, out matches[i]);
            }
        }
Пример #4
0
 static void FillInTags(string tag,
                        Direction prefix,
                        ITileRegistryEx <CornerTileSelectionKey, TRenderTile> registry,
                        out TRenderTile[] tags,
                        out bool[] tagExists)
 {
     tags      = new TRenderTile[8];
     tagExists = new bool[8];
     for (var idx = 0; idx < 8; idx += 1)
     {
         var m0 = (idx & 1) == 1;
         var m1 = (idx & 2) == 2;
         var m2 = (idx & 4) == 4;
         tagExists[idx] = registry.TryFind(tag, CornerTileSelectionKey.ValueOf(prefix, m0, m1, m2), out tags[idx]);
     }
 }
Пример #5
0
        protected void PrecomputeTags(string prefix,
                                      ITileRegistryEx <CardinalTileSelectorKey, TRenderTile> registry,
                                      out TRenderTile[] preparedTags,
                                      out bool[] tagExists)
        {
            preparedTags = new TRenderTile[16];
            tagExists    = new bool[16];
            for (var idx = 0; idx < 16; idx += 1)
            {
                var n = (idx & 1) != 0;
                var e = (idx & 2) != 0;
                var s = (idx & 4) != 0;
                var w = (idx & 8) != 0;

                tagExists[idx] = registry.TryFind(prefix, CardinalTileSelectorKey.ValueOf(n, e, s, w),
                                                  out preparedTags[idx]);
            }
        }
Пример #6
0
        void FillInTags(string prefix,
                        ITileRegistryEx <DiagonalTileSelectionKey, TRenderTile> registry,
                        out TRenderTile[] tiles,
                        out bool[] tilesExist)
        {
            tiles      = new TRenderTile[16];
            tilesExist = new bool[16];

            for (var idx = 0; idx < 16; idx += 1)
            {
                var n   = (idx & 1) != 0;
                var e   = (idx & 2) != 0;
                var s   = (idx & 4) != 0;
                var w   = (idx & 8) != 0;
                var key = DiagonalTileSelectionKey.ValueOf(n, e, s, w);
                tilesExist[idx] = registry.TryFind(prefix, key, out tiles[idx]);
            }
        }
Пример #7
0
        void Prepare(out TRenderTile[] tiles, out bool[] exists)
        {
            var owner    = matchers.Owner;
            var card     = owner.Count;
            var elements = (int)Math.Pow(card, 4);

            tiles  = new TRenderTile[elements];
            exists = new bool[elements];
            for (int a = 0; a < card; a += 1)
            {
                for (int b = 0; b < card; b += 1)
                {
                    for (int c = 0; c < card; c += 1)
                    {
                        for (int d = 0; d < card; d += 1)
                        {
                            var key = new CellMapTileSelectorKey(owner[a], owner[b], owner[c], owner[d]);
                            exists[key.LinearIndex] = registry.TryFind(prefix, key, out tiles[key.LinearIndex]);
                        }
                    }
                }
            }
        }
Пример #8
0
        public bool Match(int x, int y, TileResultCollector <TRenderTile, TContext> resultCollector)
        {
            mapCoords = gridNavigator.NavigateCardinalNeighbours(new MapCoordinate(x, y), mapCoords);
            var blendSelf = isBlending(x, y);
            var retval    = false;

            for (var i = 0; i < mapCoords.Length; i++)
            {
                var c = mapCoords[i];
                if (!blendSelf && !isBlending(c.X, c.Y))
                {
                    continue;
                }

                var mq = mapQuery(c.X, c.Y);
                if (mq != null && registry.TryFind(mq, directions[i], out var tile))
                {
                    resultCollector(SpritePosition.Whole, tile, contextProvider(x, y));
                    retval = true;
                }
            }

            return(retval);
        }