int CountPathsToTargets(Coordinate origin, out Coordinate lastDeadEnd, params Coordinate[] targets) { int paths = 0; lastDeadEnd = origin; foreach (var neighbour in origin.Neighbours()) { if (!PassableTile(neighbour, false, TileType.Walkable, TileType.SpikeTrap)) { continue; } for (int i = 0; i < targets.Length; i++) { var pathsBefore = paths; if (RoomSearch.FindShortestPath(this, neighbour, targets[i], false, TileType.SpikeTrap, TileType.Walkable).Length > 1) { paths++; break; } if (pathsBefore == paths) { lastDeadEnd = neighbour; } } } return(paths); }
void RigDoorAndTreasure() { var candidates = RoomSearch.GetTileIndicesWithType(TileType.Walkable, tileTypeMap).ToArray(); if (candidates.Length > 1) { candidates = ShuffleArray <int> .Shuffle(candidates); } var upStairs = Coordinate.FromPosition(RoomSearch.GetFirstOccurance(tileTypeMap, TileType.StairsUp), width); var downStairs = Coordinate.FromPosition(RoomSearch.GetFirstOccurance(tileTypeMap, TileType.StairsDown), width); for (int i = 0; i < candidates.Length; i++) { var coord = Coordinate.FromPosition(candidates[i], width); if (PermissableDoorPosition(coord)) { var path = RoomSearch.FindShortestPath(this, upStairs, downStairs, false, TileType.Walkable, TileType.SpikeTrap, TileType.StairsUp, TileType.StairsDown); if (path.Length > 0 && !System.Array.Exists <Coordinate>(path, e => e == coord)) { SetTileType(coord, TileType.Door); Coordinate deadEnd; if (CountPathsToTargets(coord, out deadEnd, upStairs, downStairs) == 1) { if (deadEnd != coord) { PlaceCoins(deadEnd); } return; } } } } }
void FindPath() { var newPath = RoomSearch.FindShortestPath(Tower.ActiveRoom, Tower.Player.position, lastTile.position, true, TileType.Door, TileType.Walkable, TileType.StairsUp, TileType.SpikeTrap); SmartJoinPaths(newPath); GrowTrailWhileNeeded(path); UpdateTrail(path); }