public SameBlocksContainer.Block FindMapBlock( List <MapBlock.Direction> inclusionsDirection, List <MapBlock.Direction> exclusionsDirection, bool wantedExitBlock = false, MapBlock.Direction exitDirection = MapBlock.Direction.BOTTOM ) { SameBlocksContainer.Block block = null; if (wantedExitBlock) { foreach (var item in inclusionsDirection) { if (exitDirection == item) { throw new Exception("Направление выхода не может совпадать с направлением проходов."); } } } //проходим по всему списку одинаковых по типу блоков for (int i = 0; i < blockContainers.Count; i++) { bool contin = false; //проверяем чтобы были все нужные направления foreach (var item in inclusionsDirection) { if (blockContainers[i].Name.IndexOf(item.ToString()) == -1) { contin = true; break; } } //если не нашли нужное направление то проверяем следуущий тип блоков if (contin) { continue; } //проверяем чтобы небыло ниодного ненужного направления foreach (var item in exclusionsDirection) { if (blockContainers[i].Name.IndexOf(item.ToString()) != -1) { contin = true; break; } } //если ненужное направление есть то проверяем следуущий тип блоков if (contin) { continue; } //индекс найденного типа indexType = i; //если нужен блок с выходом if (wantedExitBlock) { //случайнам образом берем индекс среди блоков одинакового типа try { indexSame = rnd.Next(blockContainers[i].ExitBlocks[(int)exitDirection].Count); } catch { StringBuilder builder = new StringBuilder(); string space = " "; foreach (var item in inclusionsDirection) { builder.Append(item.ToString() + space); } throw new Exception("Блока с проходами: " + builder.ToString() + " и выходом " + exitDirection + " не существует."); } block = blockContainers[i].ExitBlocks[(int)exitDirection][indexSame]; } //если нужен обычный блок else { //случайнам образом берем индекс среди блоков одинакового типа indexSame = rnd.Next(blockContainers[i].SameBlocks.Count); block = blockContainers[i].SameBlocks[indexSame]; } break; } return(block); }
MapBlock.Direction GetExitDirection(Vector2 positionInMinigrid, bool isExit) { List <MapBlock.Direction> allowableDirections = new List <MapBlock.Direction>(2); if (positionInMinigrid.y == 0) { allowableDirections.Add(MapBlock.Direction.BOTTOM); } else if (positionInMinigrid.y == rowCountOfBlocks - 1) { allowableDirections.Add(MapBlock.Direction.TOP); } if (positionInMinigrid.x == 0) { allowableDirections.Add(MapBlock.Direction.LEFT); } else if (positionInMinigrid.x == colCountOfBlocks - 1) { allowableDirections.Add(MapBlock.Direction.RIGHT); } if (!isExit) { MapBlock.Direction d = MapBlock.Direction.BOTTOM; switch (GameManager.Instance.exitDirection) { case MapBlock.Direction.BOTTOM: d = MapBlock.Direction.TOP; break; case MapBlock.Direction.TOP: d = MapBlock.Direction.BOTTOM; break; case MapBlock.Direction.LEFT: d = MapBlock.Direction.RIGHT; break; case MapBlock.Direction.RIGHT: d = MapBlock.Direction.LEFT; break; } if (allowableDirections.Contains(d)) { GameManager.Instance.entranceDirection = d; return(d); } } int index = rnd.Next(allowableDirections.Count); if (isExit) { GameManager.Instance.exitDirection = allowableDirections[index]; return(GameManager.Instance.exitDirection); } else { GameManager.Instance.entranceDirection = allowableDirections[index]; return(GameManager.Instance.entranceDirection); } }