Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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;
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        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);
        }