private static List <int> PossibleNeighbors(int tile, Direction dir, List <int> tiles, RuleType rt) { var possible = new List <int>(); if (tile == -1) { if (rt == RuleType.Allowed) { possible.AddRange(tiles); } } else { if (_TileRules.ContainsKey(tile)) { foreach (var rule in _TileRules[tile]) { //Skip rule if rule type doesn't match. if (rule.Type != rt) { continue; } var neighborMatch = -1; if (rule.Base == tile && rule.Direction == dir) { neighborMatch = rule.Neighbor; } else if (rule.Neighbor == tile && rule.Direction == TileRule.ReverseDirection(dir)) { neighborMatch = rule.Base; } if (neighborMatch > -1 && tiles.Contains(neighborMatch)) { possible.Add(neighborMatch); } } } } return(possible); }
public static void AddRule(TileRule rule) { if (rule == null) { return; } if (!_TileRules.ContainsKey(rule.Base)) { _TileRules[rule.Base] = new List <TileRule>(); } if (!_TileRules.ContainsKey(rule.Neighbor)) { _TileRules[rule.Neighbor] = new List <TileRule>(); } if (!_TileRules[rule.Base].Contains(rule)) { _TileRules[rule.Base].Add(rule); } if (!_TileRules[rule.Neighbor].Contains(rule)) { _TileRules[rule.Neighbor].Add(rule.Flip()); } }