Beispiel #1
0
    private void Start()
    {
        if (shouldUseSeed.Value)
        {
            Debug.Log($"Initializing game with seed {seedValue.Value}");

            Random.InitState(seedValue.Value.GetHashCode());
        }

        LevelBuildData data = LevelDataGenerator.CreateNewLevel(allThemes[0]);

        Level.Current = LevelBuilder.Build(data);

        player.transform.position = data.SpawnPosition;

        shouldUseSeed.Value = false;
    }
Beispiel #2
0
    private static void CreateEnvironment(Level level, LevelBuildData buildData)
    {
        EnvironmentObject    environment = CreateEnvironment("Environment", EnvironmentObjectComponent.MeshFilter | EnvironmentObjectComponent.MeshRenderer);
        LevelEnvironmentData data        = new LevelEnvironmentData();

        foreach (var pair in buildData.Tiles)
        {
            Vector2 worldPosition = Utility.AxialToWorldPosition(pair.Key);
            byte    bitmask       = Utility.GetBitmask(pair.Key, level.TilePositions);

            AddTileToLevel(data, pair.Value, worldPosition, bitmask);
        }

        Mesh mesh = data.BuildMesh("Environment Mesh");

        environment.Filter.mesh        = mesh;
        environment.Renderer.materials = data.Materials.ToArray();

        level.AddEnvironment(environment.GameObject);
    }
    public void AddToLevel(LevelBuildData levelData)
    {
        if (levelData.Tiles.Count == 0)
        {
            PlaceOnLevel(levelData, Axial.zero);
            return;
        }

        // Get all tiles in level which have an available neighbor
        LinkedList <Axial> edgeTiles = new LinkedList <Axial>();

        foreach (Axial tilePosition in levelData.Tiles.Keys)
        {
            foreach (Axial direction in AxialDirection.AllDirections)
            {
                if (!levelData.Tiles.ContainsKey(tilePosition + direction))
                {
                    edgeTiles.AddLast(tilePosition);
                    break;
                }
            }
        }

        List <Axial> availableConnectionPoints = new List <Axial>(ConnectionPoints);

        while (availableConnectionPoints.Count > 0)
        {
            Queue <Axial> edgeTilesQueue = new Queue <Axial>(edgeTiles);

            Axial connectionPoint = availableConnectionPoints.Random();
            availableConnectionPoints.Remove(connectionPoint);

            // Figure out which directions are adjacent to the connection point
            List <Axial> availableAdjacencyDirections = new List <Axial>();

            Utility.AdjacentHexagons(connectionPoint, x =>
            {
                if (!Tiles.ContainsKey(x))
                {
                    availableAdjacencyDirections.Add(x);
                }
            });

            while (edgeTilesQueue.Count > 0)
            {
                Axial edgeTileCandidate = edgeTilesQueue.Dequeue();

                foreach (Axial adjacentDirection in availableAdjacencyDirections)
                {
                    Axial offset = edgeTileCandidate - adjacentDirection;

                    if (Fits(levelData, offset))
                    {
                        PlaceOnLevel(levelData, offset);
                        return;
                    }
                }
            }
        }

        throw new System.InvalidOperationException("Unable to place room");
    }
Beispiel #4
0
 public void AddBuildData(LevelBuildData buildData)
 {
     AllTiles      = new Dictionary <Axial, TileData>(buildData.Tiles);
     TilePositions = new HashSet <Axial>(buildData.Tiles.Keys);
 }