Exemple #1
0
        public override void Apply(Dungeon dungeon, DungeonFloor floor)
        {
            List <DungeonRegion> unconnected = new List <DungeonRegion>(floor.Regions);

            Pathfinding pathfinder = new AStarPathfinding();

            foreach (DungeonRegion region in floor.Regions)
            {
                List <RLBaseTile> floorTiles = new List <RLBaseTile>();
                floor.ForTilesInRegion(region, (x, y, tile) =>
                {
                    if (!tile.GetTileType().BlocksMovement)
                    {
                        floorTiles.Add(tile);
                    }
                    return(tile);
                });
                foreach (DungeonRegion neighbor in region.Neighbors)
                {
                    if (!unconnected.Contains(neighbor))
                    {
                        List <RLBaseTile> neighborFloorTiles = new List <RLBaseTile>();
                        floor.ForTilesInRegion(neighbor, (x, y, tile) =>
                        {
                            if (!tile.GetTileType().BlocksMovement)
                            {
                                neighborFloorTiles.Add(tile);
                            }
                            return(tile);
                        });

                        if (floorTiles.Count > 0 && neighborFloorTiles.Count > 0)
                        {
                            List <RLBaseTile> hall = pathfinder.FindPath(floorTiles[Random.Range(0, floorTiles.Count)],
                                                                         neighborFloorTiles[Random.Range(0, neighborFloorTiles.Count)], floor,
                                                                         (from, to) => true, ((from, to) => 1f));

                            foreach (RLBaseTile tile in hall)
                            {
                                if (tile.GetTileType().BlocksMovement)
                                {
                                    floor.Tiles[tile.GetDisplayPosition().x, tile.GetDisplayPosition().y].SetTileType(hallwayFloor);
                                }
                            }
                        }

                        unconnected.Remove(neighbor);
                    }
                }

                unconnected.Remove(region);
            }
        }
        public override void Apply(Dungeon dungeon, DungeonFloor floor)
        {
            foreach (DungeonRegion reg in floor.Regions)
            {
                DungeonRegion region = reg;
                floor.ForTilesInRegion(reg, (x, y, tile) =>
                {
                    if (x == region.Position.x || x == region.Position.x + region.Size.x - 1 ||
                        y == region.Position.y ||
                        y == region.Position.y + region.Size.y - 1)
                    {
                        tile.SetTileType(wallType);
                    }
                    else
                    {
                        tile.SetTileType(floorType);
                    }

                    return(tile);
                });
            }
        }