// Vytvoří uzly k vyhledávání cesty podle podbuňek, které dostane v objektu Subcell Data public PathfindingNode[] GenerateNodes(MazeSettingsSO mazeSettings, SubcellData subcellData) { _pathfindingNodes = new PathfindingNode[subcellData.EmptySpotInArray * mazeSettings.pathfindingNodesInSubcell * mazeSettings.pathfindingNodesInSubcell]; _currentEmptyIndex = 0; float step = mazeSettings.distanceBetweenCells / mazeSettings.pathfindingNodesInSubcell * mazeSettings.nodeSpreadPercentage; Vector3 startPosition; Vector3 startOffset = new Vector3(((float)mazeSettings.distanceBetweenCells * mazeSettings.nodeSpreadPercentage - step) / 2f, 0, ((float)mazeSettings.distanceBetweenCells * mazeSettings.nodeSpreadPercentage - step) / 2f); foreach (Subcell subcell in subcellData.Subcells) { if (subcell == null) { continue; } // Projde všechny buňky a vytvoří v nich uzly k vyhledávání cesty subcell.LowestPathfindingNodeID = _currentEmptyIndex; startPosition = subcell.Position - startOffset; CreatePathfindingNodeGrid(startPosition, mazeSettings.pathfindingNodesInSubcell, step); ConnectNodesInSubcellToNeighbours(subcell, mazeSettings.pathfindingNodesInSubcell); subcell.NodesCreated = true; } return(_pathfindingNodes); }
// Vygeneruje mapu, jako parametry přijíma Maze Settings a IWinCondition, jinými slovy pravidla, jak se má mapa generovat, a podmínku pro splnění úrovně public PathfindingNode[] GenerateMaze(MazeSettingsSO mazeSettings, IWinCondition winCondition, out int nodeCount) { _mazeSettings = mazeSettings; _winCondition = winCondition; _generationsRules = _winCondition.SpecialGenerationRules(); // Vygeneruje buňky, pokud jich vygeneruje málo může generaci opakovat ICellGenerator cellGenerator = GetComponent <ICellGenerator>(); _startPoint = new Vector3(_mazeSettings.centerPoint.x - ((float)_mazeSettings.width / 2f) * _mazeSettings.distanceBetweenCells, _mazeSettings.centerPoint.y, _mazeSettings.centerPoint.z - ((float)_mazeSettings.length / 2f) * _mazeSettings.distanceBetweenCells); // RLpos int generationCounter = 0; while (generationCounter < _mazeSettings.triesToGenerateMaze) { _cellData = cellGenerator.GenerateCells(_mazeSettings, _startPoint); if ((float)_cellData.CellCount / (float)(_mazeSettings.length * _mazeSettings.width) >= _mazeSettings.minCellPercentage) { break; } generationCounter++; } // Rozdělí buňky na podbuňky ISubcellGenerator subcellGenerator = GetComponent <ISubcellGenerator>(); _subcellData = subcellGenerator.GenerateSubcells(_mazeSettings, _cellData, _startPoint, 1); // Pokud je u podmínky k zvítězení pravidlo na vedlejší místnost, tak ji vygeneruje if (_generationsRules.Contains(GenerationRule.OuterRoom)) { CreateOuterRoom(); } // Vytvoří na mapě části místností pro všechny podbuňky ITileGenerator tileGenerator = GetComponent <TileGenerator>(); tileGenerator.GenerateTiles(_subcellData, _generationsRules.Contains(GenerationRule.OuterRoom) ? (_subcellData.EmptySpotInArray - 1) : _subcellData.EmptySpotInArray); // Vytvoří vrcholy pro hledání cesty PathfindingNodeGenerator pathfindingNodeGenerator = GetComponent <PathfindingNodeGenerator>(); _pathfindingNodes = pathfindingNodeGenerator.GenerateNodes(_mazeSettings, _subcellData); GetComponent <Spawner>().SpawnReturnPortal(_subcellData.SpawnPoint); GameManager.Instance.Player.transform.position = new Vector3(_subcellData.SpawnPoint.x, _subcellData.SpawnPoint.y + _playerYOffset, _subcellData.SpawnPoint.z); SpawnEnemies(); nodeCount = _pathfindingNodes.Length; return(_pathfindingNodes); }
// Vytvoří instance částí mísntností na mapě public void GenerateTiles(SubcellData subcellData, int count) { SpawnTiles(subcellData.Subcells, count); }