ITileMatcher <TTile, Nothing> CreateDecoMatcher(ITileRegistry <TTile> tiles) { var gd = GameData; var map = gd.Map.DecorationLayer; var wallMap = gd.Map.WallLayer; bool IsNeitherWallOrPassageFn(int x, int y) { var tile = wallMap[x, y]; return(!gd.Rules.Walls.Stone.Equals(tile) && !gd.Rules.Walls.Passage.Equals(tile)); } var wallsAsCardinals = new CardinalTileRegistry <TTile>(tiles); var wallTypeSelector = new DistinctTileMatcher <IDecorationType, TTile, Nothing>((x, y) => map[x, y]); foreach (var decorationType in gd.Rules.DecorationTypes.Skip(1)) { var target = decorationType; wallTypeSelector.Add(decorationType, new CardinalTileSelector <TTile, Nothing>(IsNeitherWallOrPassageFn, CreateMatcher(map, target), RenderingConfig.MatcherNavigator, wallsAsCardinals, target.Name)); } return(wallTypeSelector); }
public List <TextureTile> Generate(TextureGrid grid) { var keys = CardinalTileSelectorKey.Values; var reg = new CardinalTileRegistry <string>(new ReflectorRegistry(), null, grid.Pattern); var retval = new List <TextureTile>(); for (var index = 0; index < keys.Length; index++) { var key = keys[index]; if (!reg.TryFind(grid.Name, key, out var tileName)) { continue; } var x = index % 4; var y = index / 4; retval.Add(new TextureTile(true, x, y, tileName) { SelectorHint = key.ToString() }); } return(retval); }
ITileMatcher <TTile, Nothing> CreateWallMatcher(ITileRegistry <TTile> tiles) { var gd = GameData; var map = gd.Map.WallLayer; bool IsWallOrPassageFn(int x, int y) { var tile = map[x, y]; return(gd.Rules.Walls.Stone.Equals(tile) || gd.Rules.Walls.Passage.Equals(tile)); } var wallsAsCardinals = new CardinalTileRegistry <TTile>(tiles); var wallTypeSelector = new DistinctTileMatcher <IWallType, TTile, Nothing>((x, y) => map[x, y]); wallTypeSelector.Add(gd.Rules.Walls.Stone, new CardinalTileSelector <TTile, Nothing>(IsWallOrPassageFn, CreateMatcher(map, gd.Rules.Walls.Stone), RenderingConfig.MatcherNavigator, wallsAsCardinals, gd.Rules.Walls.Stone.Name)); return(wallTypeSelector); }