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); }
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]); }
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]); } }
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]); } }
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]); } }
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]); } }
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]); } } } } }
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); }