private void Attack(MazeUnit target)
 {
     projectileShot = Instantiate(projectilePrefab, transform.position, Quaternion.identity);
     projectileShot.SetTarget(target.transform);
     projectileShot.SetObstacleMask(projectileBlockingLayers);
     projectileShot.onHit += OnHit;
 }
Exemple #2
0
    private void placeNewMazeUnit(MazeUnit newMazeUnit, MazeUnit prevMazeUnit, char dir)
    {
        Vector3 prevLocation = prevMazeUnit.transform.localPosition;

        if (dir == 'N')
        {
            newMazeUnit.transform.SetParent(transform);
            newMazeUnit.transform.localPosition = new Vector3(prevLocation.x, prevLocation.y, prevLocation.z + 1);
            newMazeUnit.deleteWall('S');
            prevMazeUnit.deleteWall('N');
        }
        else if (dir == 'E')
        {
            newMazeUnit.transform.SetParent(transform);
            newMazeUnit.transform.localPosition = new Vector3(prevLocation.x + 1, prevLocation.y, prevLocation.z);
            newMazeUnit.deleteWall('W');
            prevMazeUnit.deleteWall('E');
        }
        else if (dir == 'S')
        {
            newMazeUnit.transform.SetParent(transform);
            newMazeUnit.transform.localPosition = new Vector3(prevLocation.x, prevLocation.y, prevLocation.z - 1);
            newMazeUnit.deleteWall('N');
            prevMazeUnit.deleteWall('S');
        }
        else
        {
            newMazeUnit.transform.SetParent(transform);
            newMazeUnit.transform.localPosition = new Vector3(prevLocation.x - 1, prevLocation.y, prevLocation.z);
            newMazeUnit.deleteWall('E');
            prevMazeUnit.deleteWall('W');
        }
    }
    public override IEnumerator TakeTurn()
    {
        DidAction      = false;
        projectileShot = null;

        MazeUnit possibleTarget = VisionUtils.FindVisibleEnemy(transform, visionRange, enemyLayers, visionBlockingLayers);

        if (possibleTarget)
        {
            Attack(possibleTarget);
            DidAction = true;

            if (ShouldAnimate())
            {
                animator.SetTrigger("Attack");

                yield return(null);

                while (!IsAnimationIdle())
                {
                    yield return(null);
                }
            }

            while (projectileShot)
            {
                yield return(null);
            }
        }
    }
Exemple #4
0
    private void SpawnMazeUnit(int i, int j, float currentX, float currentZ)
    {
        GameObject mazeUnitObject = Instantiate(mazeUnitPrefab, platformsHolder);

        mazeUnitObject.transform.position = new Vector3(currentX, 1, currentZ);

        GameObject baseUnitObject = Instantiate(baseUnitPrefab, platformsHolder);

        baseUnitObject.transform.position = mazeUnitObject.transform.position + Vector3.down;

        MazeUnit mazeUnit = mazeUnitObject.GetComponent <MazeUnit>();

        mazeUnit.baseUnit = baseUnitObject;
        mazeUnit.x        = i;
        mazeUnit.y        = j;

        if (AreBorderIndexes(i, j))
        {
            mazeUnit.isBorder = true;
        }
        else
        {
            startingMazeUnitCandidates.Add(mazeUnit);
        }

        SetNeighbouring(mazeUnit, i, j);
        matrix[matrix.Count - 1].Add(mazeUnit);
    }
Exemple #5
0
        private void Add(MazeUnit newUnit)
        {
            var newElement = new PathElement(newUnit);

            newElement = PathEditorUtils.GetElementType(newElement);

            var nr_el = pathToEdit.PathAsLinkedList.Count; // count all elements in the path to get the second last for turning calculation

            if (nr_el >= 1)
            {
                var previousElement = pathToEdit.PathAsLinkedList.Last.Value;

                if (nr_el >= 2)
                {
                    var secpreviousElement = pathToEdit.PathAsLinkedList.Last.Previous.Value;
                    newElement = PathEditorUtils.GetTurnType(newElement, previousElement, secpreviousElement);
                }
                else
                {
                    newElement.Turn = TurnType.STRAIGHT;
                }
            }

            pathToEdit.PathAsLinkedList.AddLast(newElement);
        }
Exemple #6
0
    private void MakePath()
    {
        int      startingMazeUnitIndex = Random.Range(0, startingMazeUnitCandidates.Count);
        MazeUnit startingMazeUnit      = startingMazeUnitCandidates[startingMazeUnitIndex];

        MakePathHelper(startingMazeUnit);
    }
Exemple #7
0
    private MazeUnit GetPossibleTarget()
    {
        MazeMovement unitMovement = unit.GetMovement();
        Maze         maze         = Maze.Instance;

        MazeUnit possibleTarget = maze.GetOccupant(unitMovement.GetMazePos() + Vector2Int.up);

        if (IsTargetValid(possibleTarget))
        {
            return(possibleTarget);
        }

        possibleTarget = maze.GetOccupant(unitMovement.GetMazePos() + Vector2Int.right);

        if (IsTargetValid(possibleTarget))
        {
            return(possibleTarget);
        }

        possibleTarget = maze.GetOccupant(unitMovement.GetMazePos() + Vector2Int.down);

        if (IsTargetValid(possibleTarget))
        {
            return(possibleTarget);
        }

        possibleTarget = maze.GetOccupant(unitMovement.GetMazePos() + Vector2Int.left);

        if (IsTargetValid(possibleTarget))
        {
            return(possibleTarget);
        }

        return(null);
    }
Exemple #8
0
    public override IEnumerator TakeTurn()
    {
        DidAction = false;

        MazeUnit possibleTarget = GetPossibleTarget();

        if (possibleTarget)
        {
            Attack(possibleTarget);
            DidAction = true;

            if (!ShouldAnimate())
            {
                yield break;
            }

            animator.SetTrigger("Attack");

            yield return(null);

            while (!IsAnimationIdle())
            {
                yield return(null);
            }
        }
    }
Exemple #9
0
        private OpenDirections ValidateOpenDirections(MazeUnit u)
        {
            var children = u.transform.AllChildren().Where(
                go => !(go.Equals(MazeUnit.TOP) || go.Equals(MazeUnit.FLOOR)));

            OpenDirections waysOpen = OpenDirections.None;

            foreach (var item in children)
            {
                if (item.name.Equals(MazeUnit.NORTH) && !item.activeSelf)
                {
                    waysOpen |= OpenDirections.North;
                }

                if (item.name.Equals(MazeUnit.SOUTH) && !item.activeSelf)
                {
                    waysOpen |= OpenDirections.South;
                }

                if (item.name.Equals(MazeUnit.WEST) && !item.activeSelf)
                {
                    waysOpen |= OpenDirections.West;
                }

                if (item.name.Equals(MazeUnit.EAST) && !item.activeSelf)
                {
                    waysOpen |= OpenDirections.East;
                }
            }

            return(waysOpen);
        }
Exemple #10
0
        public void TryConnectingCurrentSelection()
        {
            if (CurrentSelection == null)
            {
                return;
            }

            if (!CurrentSelection.Any())
            {
                return;
            }

            var iterator = CurrentSelection.GetEnumerator();

            MazeUnit last = null;

            while (iterator.MoveNext())
            {
                var current = iterator.Current.GetComponent <MazeUnit>();

                if (!last)
                {
                    last = current;
                    continue;
                }
                Debug.Log(current.GridID.ToString());
                // check if current and last are really neighbors:
                if (Math.Abs(current.GridID.x - last.GridID.x) + Math.Abs(current.GridID.y - last.GridID.y) == 1)
                {
                    // check which direction we go, possibilities:
                    if (current.GridID.x - last.GridID.x == 1) // going east
                    {
                        last.Open(OpenDirections.East);
                        current.Open(OpenDirections.West);
                    }
                    else if (current.GridID.x - last.GridID.x == -1) // going west
                    {
                        last.Open(OpenDirections.West);
                        current.Open(OpenDirections.East);
                    }

                    if (current.GridID.y - last.GridID.y == 1) // going north
                    {
                        last.Open(OpenDirections.North);
                        current.Open(OpenDirections.South);
                    }
                    else if (current.GridID.y - last.GridID.y == -1) // going south
                    {
                        last.Open(OpenDirections.South);
                        current.Open(OpenDirections.North);
                    }
                }


                last = current;
            }
        }
Exemple #11
0
    public override bool AttemptSpawn(MazePopulator.PopulationData data)
    {
        Cell cell = GetRandomFreeUnitCell(data);

        MazeUnit enemy = InstantiateInCell(GetUnitPrefab(), cell);

        data.mazeData[cell.x, cell.y].occupant = enemy;

        return(true);
    }
Exemple #12
0
    private void Attack(MazeUnit possibleTarget)
    {
        Health targetHealth = possibleTarget.GetComponent <Health>();

        if (!targetHealth)
        {
            Debug.LogError(gameObject.name + " is trying to attack a target with no Health: " + possibleTarget.name);
            return;
        }

        targetHealth.TakeDamage(attackDamage);
    }
Exemple #13
0
        static void DrawGizmos(MazeUnit unit, GizmoType gizmoType)
        {
            Vector3 position = unit.transform.position;

            var tempHandleColor = Handles.color;

            Handles.color = Color.green;

            if (Vector3.Distance(position, Camera.current.transform.position) < 10f)
            {
                foreach (var item in unit.transform.AllChildren())
                {
                    var customForward = Vector3.zero;

                    if (item.name == MazeUnit.TOP)
                    {
                        customForward = Vector3.down;
                    }

                    if (item.name == MazeUnit.FLOOR)
                    {
                        customForward = Vector3.up;
                    }

                    if (item.name == MazeUnit.WEST)
                    {
                        customForward = Vector3.left;
                    }

                    if (item.name == MazeUnit.EAST)
                    {
                        customForward = Vector3.right;
                    }

                    if (item.name == MazeUnit.SOUTH)
                    {
                        customForward = Vector3.back;
                    }

                    if (item.name == MazeUnit.NORTH)
                    {
                        customForward = Vector3.forward;
                    }

                    var pos = item.transform.position;
                    Handles.DrawWireDisc(pos, customForward, 0.1f);
                    Handles.Label(pos, new GUIContent(item.name));
                }
            }

            Handles.color = tempHandleColor;
        }
Exemple #14
0
    private MazeUnit createNewUnitInMaze(char dir, int xstart, int zstart)
    {
        MazeUnit oldUnit = mazeFloor[xstart, zstart];
        MazeUnit newUnit = Instantiate(mazeUnitPrefab);

        newUnit.setDirection(dir);

        mazeFloor[XafterDirection(xstart, dir), ZafterDirection(zstart, dir)] = newUnit;
        newUnit.setPos(XafterDirection(xstart, dir), ZafterDirection(zstart, dir));
        placeNewMazeUnit(newUnit, oldUnit, dir);
        lastMazeUnit = newUnit;
        return(newUnit);
    }
Exemple #15
0
    private void Attack()
    {
        MazeUnit target = Maze.Instance.GetOccupant(attackPos);

        if (target)
        {
            Health targetHealth = target.GetComponent <Health>();

            if (targetHealth)
            {
                targetHealth.TakeDamage(damage);
                Used();
            }
        }
    }
Exemple #16
0
        public void ConfigureTopLightBasedOnUnitConfiguration(MazeUnit unit, TopLighting topLight)
        {
            var unitChildren  = unit.transform.AllChildren();
            var lightChildren = topLight.transform.AllChildren();

            foreach (var lightChild in lightChildren)
            {
                var corresponding = unitChildren.Where((u) => u.name.Equals(lightChild.name)).FirstOrDefault();

                if (corresponding != null)
                {
                    lightChild.SetActive(!corresponding.activeSelf);
                }
            }
        }
Exemple #17
0
    public void MoveUnitTo(MazeUnit unit, Vector2Int pos)
    {
        if (IsPosOutOfBounds(pos))
        {
            Debug.LogError(unit.name + ": Trying to move out of bounds");
        }

        CellData cellData = mazeData[pos.x, pos.y];

        if (cellData.occupant != null && cellData.occupant != unit)
        {
            Debug.LogError(unit.name + ": Trying to move unit to occupied space");
            return;
        }

        mazeData[unit.GetMovement().GetMazePos().x, unit.GetMovement().GetMazePos().y].occupant = null;
        cellData.occupant = unit;
    }
    public override IEnumerator TakeTurn()
    {
        DidAction = false;

        if (turnsSinceLastMove != -1)
        {
            turnsSinceLastMove++;
        }

        // Still lock on targets even if we can't move right now
        if (!target)
        {
            target = VisionUtils.FindVisibleEnemy(transform, visionRange, enemyLayers, visionBlockingLayers);
        }

        if (turnsSinceLastMove != -1 && turnsSinceLastMove < turnsPerMove)
        {
            yield break;
        }

        if (target)
        {
            List <Vector2Int> path = AStar.FindPath(
                Maze.Instance,
                unit.GetMovement().GetMazePos(),
                target.GetMovement().GetMazePos(),
                Maze.Instance.GetValidNeighbourCoords(target.GetMovement().GetMazePos()));

            if (path.Count > pursuitSteps)
            {
                target = null;
                yield break;
            }

            if (path.Count >= 1 && unit.GetMovement().AttemptMoveToPos(path[1]))
            {
                turnsSinceLastMove = 0;
                DidAction          = true;
            }
        }

        yield break;
    }
Exemple #19
0
    private void SetNeighbouring(MazeUnit mazeUnit, int i, int j)
    {
        if (i > 0)
        {
            matrix[i - 1][j].BecomeNeighbours(MazeUnit.Direction.Top, mazeUnit);

            if (j > 0)
            {
                matrix[i - 1][j - 1].BecomeNeighbours(MazeUnit.Direction.TopLeft, mazeUnit);
            }

            if (j < baseSize.z - 1)
            {
                matrix[i - 1][j + 1].BecomeNeighbours(MazeUnit.Direction.TopRight, mazeUnit);
            }
        }

        if (j > 0)
        {
            matrix[i][j - 1].BecomeNeighbours(MazeUnit.Direction.Left, mazeUnit);
        }
    }
Exemple #20
0
        public static MazeUnit InitializeUnit(beMobileMaze maze, Vector2 tilePos, float unitFloorOffset, GameObject unit)
        {
            var tilePositionInLocalSpace = new Vector3(
                (tilePos.x * maze.RoomDimension.x) + (maze.RoomDimension.x / 2f),
                unitFloorOffset,
                (tilePos.y * maze.RoomDimension.z) + (maze.RoomDimension.z / 2f));

            // set the cubes parent to the game object for organizational purposes
            unit.transform.parent = maze.transform;

            //unit.transform.localPosition = maze.transform.position + maze.transform.TransformPoint(tilePositionInLocalSpace);
            unit.transform.localPosition = tilePositionInLocalSpace;

            // give the u a assetName that represents it's location within the tile maze
            unit.name = string.Format(maze.UnitNamePattern, tilePos.x, tilePos.y);

            MazeUnit mazeUnit = unit.GetComponent <MazeUnit>();

            mazeUnit.Initialize(tilePos, maze.RoomDimension);

            return(mazeUnit);
        }
Exemple #21
0
    private bool MakePathHelper(MazeUnit current, int length = 1)
    {
        pathTries++;
        current.gameObject.SetActive(false);
        path.AddLast(current);

        foreach (var dir in current.GetRandomizedAvailableDiggableDirections())
        {
            var neighbour = current.neighbours[dir];

            if (length >= maxPathSize)
            {
                return(true);
            }

            if (neighbour.CanBeDugFrom(dir.GetOpposite()))
            {
                if (MakePathHelper(neighbour, length + 1))
                {
                    return(true);
                }
                // Sometimes the algorithm can get stuck in a long recursion while trying to find a good lengthy path.
                // That is why we have this code here that forces the path to end after a number of tries.
                // We still check if the neighbour can be dug, because we don't want to dig for the end of the path from the
                // border or make a loop in the path.
                else if (pathTries >= pathMaxTries && neighbour.CanBeDugFrom(dir.GetOpposite()))
                {
                    path.AddLast(neighbour);
                    neighbour.gameObject.SetActive(false);
                    return(true);
                }
            }
        }

        current.gameObject.SetActive(true);
        path.RemoveLast();
        return(false);
    }
Exemple #22
0
        /// <summary>
        /// Check if there are already unitsFound existing and put them into the new Grid
        /// </summary>
        /// <param name="maze"></param>
        /// <param name="newColumns"></param>
        /// <param name="newRows"></param>
        /// <returns></returns>
        public static MazeUnit[,] ReconfigureGrid(beMobileMaze maze, int newColumns, int newRows)
        {
            MazeUnit[,] newGrid = new MazeUnit[newColumns, newRows];

            for (int col = 0; col < newColumns; col++)
            {
                for (int row = 0; row < newRows; row++)
                {
                    var hostGameObject = GameObject.Find(string.Format(maze.UnitNamePattern, col, row));

                    if (hostGameObject != null)
                    {
                        newGrid[col, row] = hostGameObject.GetComponent <MazeUnit>();
                    }
                }
            }

            maze.Grid = newGrid;

            var unitsOutsideOfGrid = maze.Units.Select(
                (u) =>
            {
                if (u.GridID.x > newColumns || u.GridID.y > newRows)
                {
                    return(u.gameObject);
                }
                else
                {
                    return(null);
                }
            });

            unitsOutsideOfGrid.ImmediateDestroyObjects();

            return(maze.Grid);
        }
Exemple #23
0
 private void createEmptyFloor(int level)
 {
     for (int i = 0; i < sizeX; i++)
     {
         int      j        = 0;
         int      j2       = sizeZ - 1;
         MazeUnit edgeUnit = Instantiate(mazeUnitPrefab);
         edgeUnit.setPos(i, j);
         edgeUnit.transform.SetParent(transform);
         edgeUnit.transform.localPosition = new Vector3(i, level, j);
         MazeUnit edgeUnit2 = Instantiate(mazeUnitPrefab);
         edgeUnit2.setPos(i, j2);
         edgeUnit2.transform.SetParent(transform);
         edgeUnit2.transform.localPosition = new Vector3(i, level, j2);
         MazeUnit edgeUnit3 = Instantiate(mazeUnitPrefab);
         edgeUnit3.setPos(j, i);
         edgeUnit3.transform.SetParent(transform);
         edgeUnit3.transform.localPosition = new Vector3(j, level, i);
         MazeUnit edgeUnit4 = Instantiate(mazeUnitPrefab);
         edgeUnit4.setPos(j2, i);
         edgeUnit4.transform.SetParent(transform);
         edgeUnit4.transform.localPosition = new Vector3(j2, level, i);
     }
 }
Exemple #24
0
        public static void ReplaceUnit(beMobileMaze hostMaze, MazeUnit obtainedUnit, MazeUnit unitContainingReplacements, bool resetScaling = true, bool forceRecalculationOfComponentPosition = true)
        {
            #region prepare children lists

            int new_ChildCount = unitContainingReplacements.transform.childCount;

            List <GameObject> new_Children = new List <GameObject>();

            int old_ChildCount = obtainedUnit.transform.childCount;

            List <GameObject> existing_children = new List <GameObject>();

            for (int i = 0; i < old_ChildCount; i++)
            {
                var old_child = obtainedUnit.transform.GetChild(i);

                existing_children.Add(old_child.gameObject);
            }

            for (int i = 0; i < new_ChildCount; i++)
            {
                var new_child = unitContainingReplacements.transform.GetChild(i);

                new_Children.Add(new_child.gameObject);
            }

            #endregion

            if (resetScaling)
            {
                obtainedUnit.transform.localScale = Vector3.one;
            }

            var dimension = unitContainingReplacements.Dimension;

            var boxCollider = obtainedUnit.GetComponent <BoxCollider>();

            boxCollider.size   = dimension;
            boxCollider.center = new Vector3(0, boxCollider.size.y / 2, 0);

            foreach (var replacementPart in new_Children)
            {
                if (existing_children.Any((go) => go.name.Equals(replacementPart.name)))
                {
                    var old_equivalent = existing_children.Single((go) => go.name.Equals(replacementPart.name));

                    if (resetScaling)
                    {
                        old_equivalent.transform.localScale = Vector3.one;
                    }

                    replacementPart.transform.SetParent(old_equivalent.transform.parent, false);

                    old_equivalent.transform.parent = null;

                    if (old_equivalent.name.Equals(MazeUnit.TOP))
                    {
                        replacementPart.transform.localPosition = new Vector3(0, dimension.y, 0);
                    }

                    if (old_equivalent.name.Equals(MazeUnit.NORTH))
                    {
                        replacementPart.transform.localPosition = new Vector3(0, dimension.y / 2, dimension.z / 2);
                    }

                    if (old_equivalent.name.Equals(MazeUnit.SOUTH))
                    {
                        replacementPart.transform.localPosition = new Vector3(0, dimension.y / 2, -dimension.z / 2);
                    }

                    if (old_equivalent.name.Equals(MazeUnit.WEST))
                    {
                        replacementPart.transform.localPosition = new Vector3(-dimension.x / 2, dimension.y / 2, 0);
                    }

                    if (old_equivalent.name.Equals(MazeUnit.EAST))
                    {
                        replacementPart.transform.localPosition = new Vector3(dimension.x / 2, dimension.y / 2, 0);
                    }

                    if (old_equivalent.name.Equals(MazeUnit.FLOOR))
                    {
                        replacementPart.transform.localPosition = new Vector3(0, 0, 0);
                    }


                    var meshRenderer    = replacementPart.GetComponent <MeshRenderer>();
                    var oldMeshRenderer = old_equivalent.GetComponent <MeshRenderer>();

                    if (meshRenderer != null && oldMeshRenderer != null)
                    {
                        meshRenderer.sharedMaterials = oldMeshRenderer.sharedMaterials;
                    }

                    replacementPart.SetActive(old_equivalent.activeSelf);
                }
            }

            foreach (var item in existing_children)
            {
                UnityEngine.Object.DestroyImmediate(item.gameObject);
            }
        }
Exemple #25
0
        private void renderUiForSingleMazeSelected()
        {
            EditorGUILayout.BeginVertical();

            GUILayout.Label("Replace Units");

            replacementPrefab = (GameObject)EditorGUILayout.ObjectField(replacementPrefab, typeof(UnityEngine.GameObject), false);

            MazeUnit mazeUnit = null;

            string errorMessage = "No prefab selected!";

            if (replacementPrefab != null)
            {
                mazeUnit = replacementPrefab.GetComponent <MazeUnit>();
            }
            else
            {
                EditorGUILayout.HelpBox(errorMessage, MessageType.Error);
            }

            if (mazeUnit == null)
            {
                if (replacementPrefab != null)
                {
                    errorMessage = "Selected Asset is no MazeUnit!";

                    EditorGUILayout.HelpBox(errorMessage, MessageType.Error);
                }
            }
            else
            {
                if (GUILayout.Button(new GUIContent("Replace Maze Units \n with this prefab.", ToolTip_Replace_Units), GUILayout.Height(50f)))
                {
                    CallReplaceAlgorithm();
                }

                EditorGUILayout.HelpBox(MsgBox_Replace_Action, MessageType.Warning);
            }

            EditorGUILayout.EndVertical();

            if (replacementPrefab)
            {
                var previewTexture = AssetPreview.GetAssetPreview(replacementPrefab);

                GUILayout.Box(previewTexture);
            }

            if (GUILayout.Button(new GUIContent("Save as new prefab?", "Creates a new prefab instead of overwriting the old one!")))
            {
                var targetPath = EditorUtility.SaveFilePanelInProject("Save new maze prefab", "ResizedMaze", EditorEnvironmentConstants.PREFAB_EXTENSION, "sdfsfd");

                if (targetPath != null)
                {
                    PrefabUtility.CreatePrefab(targetPath, selectedMaze.gameObject);
                }
            }

            // Resize currently through replacement of Units!
            //GUILayout.Label("Change:", EditorStyles.boldLabel);

            //selectedMaze.RoomDimension = EditorGUILayout.Vector3Field("Room dimension", selectedMaze.RoomDimension );

            //if (GUILayout.Button(new GUIContent("Resize (recommended)", "Resize the geometry"), GUILayout.Height(30)))
            //{
            //    var modificationModel = new UnitMeshModificationModel(selectedMaze.RoomDimension, Vector3.zero ,true);
            //    ApplyToAllMazeUnits(selectedMaze, (u) => {

            //        MazeEditorUtil.ResizeUnitByMeshModification(u.gameObject, modificationModel);
            //    });
            //}

            //if (GUILayout.Button(new GUIContent("Rescale", "Rescale over the localScale value")))
            //{
            //    MazeEditorUtil.Rescale(selectedMaze, selectedMaze.RoomDimension, unitFloorOffset);
            //    MazeEditorUtil.RebuildGrid(selectedMaze);
            //}
        }
Exemple #26
0
        private void Remove(MazeUnit unit)
        {
            var elementToRemove = pathToEdit.PathAsLinkedList.First(e => e.Unit.Equals(unit));

            pathToEdit.PathAsLinkedList.Remove(elementToRemove);
        }
Exemple #27
0
 public void Init(MazeUnit unit)
 {
     this.unit = unit;
 }
Exemple #28
0
    public void generateMazeFloor(int xStart, int zStart, char direction, int level, MazeUnit[,] floor, int size)
    {
        sizeX = size;
        sizeZ = size;

        mazeFloor    = floor;
        mazeUnitList = new List <MazeUnit>();
        MazeUnit firstUnit = Instantiate(mazeUnitPrefab);

        mazeFloor[xStart, zStart] = firstUnit;
        mazeFloor[xStart, zStart].setPos(xStart, zStart);
        mazeFloor[xStart, zStart].transform.SetParent(transform);
        mazeFloor[xStart, zStart].transform.localPosition = new Vector3(xStart, level, zStart);
        if (isOnEdge(xStart, zStart))
        {
            mazeFloor[xStart, zStart].deleteWall('E');
            mazeFloor[xStart, zStart].deleteWall('W');
            mazeFloor[xStart, zStart].deleteWall('S');
            mazeFloor[xStart, zStart].deleteWall('N');
            if (level == startingLevel)
            {
                for (int i = xStart - 2; i < xStart + 3; i++)
                {
                    for (int j = zStart - 2; j < zStart + 3; j++)
                    {
                        if (i != xStart || j != zStart)
                        {
                            MazeUnit edgeUnit = Instantiate(mazeUnitPrefab);
                            edgeUnit.setPos(i, j);
                            edgeUnit.transform.SetParent(transform);
                            edgeUnit.transform.localPosition = new Vector3(i, level, j);
                            edgeUnit.onlyLeaveFloor();
                        }
                    }
                }
            }
        }
        if (level != startingLevel)
        {
            mazeFloor[xStart, zStart].deleteFloor();
        }

        int xcurr = XafterDirection(xStart, direction);
        int zcurr = ZafterDirection(zStart, direction);

        if (!withinBounds(xStart, zStart, direction))
        {
            mazeFloor[xStart, zStart].deleteWall(direction);
            MazeUnit[,] f     = new MazeUnit[sizeX, sizeZ];
            f[xStart, zStart] = firstUnit;

            for (int i = xStart - 1; i < xStart + 2; i++)
            {
                for (int j = zStart - 1; j < zStart + 2; j++)
                {
                    if (withinBounds(i, j, 'C') && isOnEdge(i, j))
                    {
                        generateMazeFloor(i, j, getOppositeDirection(direction), level, f, size);
                        return;
                    }
                }
            }
        }

        char randDir = generateRandomDirection();


        mazeUnitList.Add(createNewUnitInMaze(direction, xStart, zStart));
        int superCount = 0;

        while (mazeUnitList.Count > 0 && superCount < 200)
        {
            superCount++;
            xcurr = mazeUnitList[0].x;
            zcurr = mazeUnitList[0].z;
            int count = 0;
            while (!isEmptyMazeSpot(xcurr, zcurr, randDir, mazeFloor) && count < 4)
            {
                count++;
                randDir = generateRandomDirection();
            }

            if (!withinBounds(xcurr, zcurr, randDir))
            {
                mazeUnitList.Remove(mazeUnitList[0]);
            }
            else if (!isEmptyMazeSpot(xcurr, zcurr, randDir, mazeFloor))
            {
                mazeFloor[xcurr, zcurr].deleteWall(randDir);
                mazeFloor[XafterDirection(xcurr, randDir), ZafterDirection(zcurr, randDir)].deleteWall(getOppositeDirection(randDir));
                mazeUnitList.Remove(mazeUnitList[0]);
            }
            else
            {
                mazeUnitList.Add(createNewUnitInMaze(randDir, xcurr, zcurr));
            }
        }


        for (int i = 0; i < sizeX; i++)
        {
            for (int j = 0; j < sizeZ; j++)
            {
                if (mazeFloor[i, j] != null)
                {
                    mazeFloor[i, j].deleteAllWallCheck();
                }
            }
        }



        //placing stairs!
        int  xStair   = lastMazeUnit.x;
        int  zStair   = lastMazeUnit.z;
        char dirStair = lastMazeUnit.dir;

        mazeFloor[xStair, zStair].deleteCeiling();

        Stairs s = Instantiate(stairsPrefab);

        s.transform.SetParent(transform);
        s.transform.localPosition = new Vector3(xStair, level, zStair);
        s.setDirOfStairs(dirStair);
        for (int i = xStair - 1; i < xStair + 2; i++)
        {
            for (int j = zStair - 1; j < zStair + 2; j++)
            {
                if (i != xStair || j != zStair)
                {
                    MazeUnit edgeUnit = Instantiate(mazeUnitPrefab);
                    edgeUnit.setPos(i, j);
                    edgeUnit.transform.SetParent(transform);
                    edgeUnit.transform.localPosition = new Vector3(i, level, j);
                    edgeUnit.onlyLeaveCeiling();
                }
            }
        }

        //run traceback
        getTraceBackDistance(xStart, zStart, xStair, zStair);


        if (level < height)
        {
            generateMazeFloor(xStair, zStair, dirStair, level + 1, new MazeUnit[sizeX, sizeZ], sizeX);
        }
        else
        {
            lastStairX = xStair;
            lastStairZ = zStair;
        }
    }
Exemple #29
0
 public void BecomeNeighbours(Direction direction, MazeUnit other)
 {
     neighbours.Add(direction, other);
     other.neighbours.Add(direction.GetOpposite(), this);
 }
Exemple #30
0
        public void TryDisconnectingCurrentSelection()
        {
            if (CurrentSelection == null)
            {
                return;
            }

            if (!CurrentSelection.Any())
            {
                return;
            }


            if (CurrentSelection.Count == 1)
            {
                var unit = CurrentSelection.First().GetComponent <MazeUnit>();
                unit.Close(OpenDirections.North);
                unit.Close(OpenDirections.South);
                unit.Close(OpenDirections.West);
                unit.Close(OpenDirections.East);
            }

            var iterator = CurrentSelection.GetEnumerator();

            MazeUnit last = null;

            while (iterator.MoveNext())
            {
                var current = iterator.Current.GetComponent <MazeUnit>();

                if (!last)
                {
                    last = current;
                    continue;
                }

                if (current.GridID.x - 1 == last.GridID.x)
                {
                    last.Close(OpenDirections.East);
                    current.Close(OpenDirections.West);
                }
                else if (current.GridID.x + 1 == last.GridID.x)
                {
                    last.Close(OpenDirections.West);
                    current.Close(OpenDirections.East);
                }

                if (current.GridID.y - 1 == last.GridID.y)
                {
                    last.Close(OpenDirections.North);
                    current.Close(OpenDirections.South);
                }
                else if (current.GridID.y + 1 == last.GridID.y)
                {
                    last.Close(OpenDirections.South);
                    current.Close(OpenDirections.North);
                }

                last = current;
            }
        }