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; }
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"); }
public void AddBuildData(LevelBuildData buildData) { AllTiles = new Dictionary <Axial, TileData>(buildData.Tiles); TilePositions = new HashSet <Axial>(buildData.Tiles.Keys); }