/// <summary>
        /// Configures the rectangle used for selection
        /// </summary>
        public override void AfterEditorEvents()
        {
            CheckActivation();

            if (!IsActivated)
            {
                return;
            }

            if (Event.current.button != 0)
            {
                Cancel();
                Event.current.Use();
                return;
            }

            if (Event.current.type == EventType.MouseDrag)
            {
                Vector2 startPoint = NodeEditor.ApplyZoomToVector(dragStartPos);
                Vector2 endPoint   = NodeEditor.GetZoomedMousePosition();

                selectionRect = RectExtensions.FromPoints(startPoint, endPoint);

                NodeEditor.FlagRepaint();
                Event.current.Use();
            }
            else if (Event.current.type == EventType.MouseUp)
            {
                SelectNodes();
                SelectConnectors();

                NodeEditor.RaiseSelectionChanged();

                selectionRect = Rect.zero;
                Deactivate();

                Event.current.Use();
            }
            else if (Event.current.type == EventType.MouseLeaveWindow)
            {
                Cancel();
            }
        }
        static void MakeSafeAreas()
        {
            GameObject[]      gos                  = FindObjectsOfType <GameObject>();
            List <Vector2>    allPositions         = new List <Vector2>();
            List <Vector2>    safeZonePositions    = new List <Vector2>();
            List <Vector3Int> _unexploredPositions = new List <Vector3Int>();

            Vector3Int[]    unexploredPositions = new Vector3Int[0];
            List <SafeArea> safeAreas           = new List <SafeArea>();

            foreach (Vector3Int cellPosition in GameManager.GetSingleton <GameManager>().zonesTilemap.cellBounds.allPositionsWithin)
            {
                _unexploredPositions.Add(cellPosition);
                Vector2 position = GameManager.GetSingleton <GameManager>().zonesTilemap.GetCellCenterWorld(cellPosition);
                if (!ContainsPoint(safeZonePositions, position, .7f) && !ContainsPoint(allPositions, position, .7f))
                {
                    allPositions.Add(position);
                    SafeZone safeZone;
                    if (GetComponent <SafeZone>(gos, position, out safeZone, .7f))
                    {
                        SafeArea safeArea = new GameObject().AddComponent <SafeArea>();
                        safeArea.GetComponent <Transform>().SetParent(GameManager.GetSingleton <World>().piecesParent);
                        safeZone.safeArea = safeArea;
                        List <Vector2> safeAreaPositions = new List <Vector2>();
                        safeAreaPositions.Add(position);
                        List <Vector2> positionsRemaining = new List <Vector2>();
                        List <Vector2> positionsTested    = new List <Vector2>();
                        positionsTested.Add(position);
                        List <DangerArea>   dangerAreas   = new List <DangerArea>();
                        List <ConveyorBelt> conveyorBelts = new List <ConveyorBelt>();
                        ConveyorBelt        conveyorBelt;
                        if (GetComponent <ConveyorBelt>(gos, position, out conveyorBelt, .7f))
                        {
                            conveyorBelts.Add(conveyorBelt);
                        }
                        foreach (Vector2 possibleMove in GameManager.GetSingleton <GameManager>().possibleMoves)
                        {
                            positionsRemaining.Add(position + possibleMove);
                        }
                        do
                        {
                            position = positionsRemaining[0];
                            if (GetComponent <SafeZone>(gos, position, out safeZone, .7f))
                            {
                                safeZone.safeArea = safeArea;
                                foreach (Vector2 possibleMove in GameManager.GetSingleton <GameManager>().possibleMoves)
                                {
                                    Vector2 positionToTest = position + possibleMove;
                                    if (!ContainsPoint(positionsRemaining, positionToTest, .7f) && !ContainsPoint(positionsTested, positionToTest, .7f))
                                    {
                                        positionsRemaining.Add(positionToTest);
                                    }
                                }
                                safeAreaPositions.Add(position);
                            }
                            else
                            {
                                DangerZone dangerZone;
                                if (GetComponent <DangerZone>(gos, position, out dangerZone, .7f))
                                {
                                    DangerArea dangerArea = dangerZone.dangerArea;
                                    dangerAreas.Add(dangerArea);
                                    if (!safeArea.surroundingSafeAreas.Contains(dangerArea.correspondingSafeArea))
                                    {
                                        safeArea.surroundingSafeAreas.Add(dangerArea.correspondingSafeArea);
                                    }
                                    if (!dangerArea.correspondingSafeArea.surroundingSafeAreas.Contains(safeArea))
                                    {
                                        dangerArea.correspondingSafeArea.surroundingSafeAreas.Add(safeArea);
                                    }
                                }
                            }
                            if (GetComponent <ConveyorBelt>(gos, position, out conveyorBelt, .7f))
                            {
                                conveyorBelts.Add(conveyorBelt);
                            }
                            positionsTested.Add(position);
                            allPositions.Add(position);
                            positionsRemaining.RemoveAt(0);
                        } while (positionsRemaining.Count > 0);
                        safeZonePositions.AddRange(safeAreaPositions);
                        safeArea.cameraRect = RectExtensions.FromPoints(safeAreaPositions.ToArray()).Expand(Vector2.one * GameManager.WORLD_SCALE * 4);
                        Rect[] dangerAreaCameraRects = new Rect[dangerAreas.Count];
                        for (int i = 0; i < dangerAreas.Count; i++)
                        {
                            dangerAreaCameraRects[i] = dangerAreas[i].cameraRect;
                        }
                        safeArea.cameraRect    = RectExtensions.Combine(dangerAreaCameraRects.Add(safeArea.cameraRect));
                        safeArea.conveyorBelts = conveyorBelts.ToArray();
                        safeAreas.Add(safeArea);
                    }
                }
            }
            unexploredPositions = _unexploredPositions.ToArray();
            for (int i = 0; i < safeAreas.Count; i++)
            {
                safeAreas[i].unexploredCellPositions = unexploredPositions;
            }
        }
        static void MakeDangerAreas()
        {
            GameObject[]      gos                  = FindObjectsOfType <GameObject>();
            List <Vector2>    allPositions         = new List <Vector2>();
            List <Vector2>    dangerZonePositions  = new List <Vector2>();
            List <Vector3Int> _unexploredPositions = new List <Vector3Int>();

            Vector3Int[]        unexploredPositions = new Vector3Int[0];
            List <DangerArea>   dangerAreas         = new List <DangerArea>();
            List <ConveyorBelt> conveyorBelts       = new List <ConveyorBelt>();

            foreach (Vector3Int cellPosition in GameManager.GetSingleton <GameManager>().zonesTilemap.cellBounds.allPositionsWithin)
            {
                _unexploredPositions.Add(cellPosition);
                Vector2 position = GameManager.GetSingleton <GameManager>().zonesTilemap.GetCellCenterWorld(cellPosition);
                if (!ContainsPoint(dangerZonePositions, position, .7f) && !ContainsPoint(allPositions, position, .7f))
                {
                    allPositions.Add(position);
                    DangerZone dangerZone;
                    if (GetComponent <DangerZone>(gos, position, out dangerZone, .7f))
                    {
                        DangerArea dangerArea = new GameObject().AddComponent <DangerArea>();
                        dangerArea.GetComponent <Transform>().SetParent(GameManager.GetSingleton <World>().piecesParent);
                        dangerArea.correspondingSafeArea = new GameObject().AddComponent <SafeArea>();
                        dangerArea.correspondingSafeArea.GetComponent <Transform>().SetParent(GameManager.GetSingleton <World>().piecesParent);
                        List <DangerZone> dangerZones = new List <DangerZone>();
                        dangerZone.correspondingSafeZone.spriteRenderer       = dangerZone.correspondingSafeZone.GetComponent <SpriteRenderer>();
                        dangerZone.correspondingSafeZone.spriteRenderer.color = dangerZone.correspondingSafeZone.spriteRenderer.color.DivideAlpha(2);
                        dangerZone.correspondingSafeZone.safeArea             = dangerArea.correspondingSafeArea;
                        dangerZone.dangerArea = dangerArea;
                        dangerZones.Add(dangerZone);
                        List <Vector2> dangerAreaPositions = new List <Vector2>();
                        dangerAreaPositions.Add(position);
                        List <Vector2> positionsRemaining = new List <Vector2>();
                        List <Vector2> positionsTested    = new List <Vector2>();
                        positionsTested.Add(position);
                        List <Enemy> enemies = new List <Enemy>();
                        Enemy        enemy;
                        if (GetComponent <Enemy>(gos, position, out enemy, .7f))
                        {
                            enemies.Add(enemy);
                        }
                        List <Trap> traps = new List <Trap>();
                        traps.AddRange(GetComponents <Trap>(gos, position, .7f));
                        List <RedDoor> redDoors = new List <RedDoor>();
                        RedDoor        redDoor;
                        if (GetComponent <RedDoor>(gos, position, out redDoor, .7f))
                        {
                            redDoors.Add(redDoor);
                        }
                        ConveyorBelt conveyorBelt;
                        if (GetComponent <ConveyorBelt>(gos, position, out conveyorBelt, .7f))
                        {
                            conveyorBelts.Add(conveyorBelt);
                        }
                        foreach (Vector2 possibleMove in GameManager.GetSingleton <GameManager>().possibleMoves)
                        {
                            positionsRemaining.Add(position + possibleMove);
                        }
                        do
                        {
                            position = positionsRemaining[0];
                            if (GetComponent <DangerZone>(gos, position, out dangerZone, .7f))
                            {
                                dangerZone.correspondingSafeZone.safeArea             = dangerArea.correspondingSafeArea;
                                dangerZone.correspondingSafeZone.spriteRenderer       = dangerZone.correspondingSafeZone.GetComponent <SpriteRenderer>();
                                dangerZone.correspondingSafeZone.spriteRenderer.color = dangerZone.correspondingSafeZone.spriteRenderer.color.DivideAlpha(2);
                                dangerZone.dangerArea = dangerArea;
                                dangerZones.Add(dangerZone);
                                foreach (Vector2 possibleMove in GameManager.GetSingleton <GameManager>().possibleMoves)
                                {
                                    Vector2 positionToTest = position + possibleMove;
                                    if (!ContainsPoint(positionsRemaining, positionToTest, .7f) && !ContainsPoint(positionsTested, positionToTest, .7f))
                                    {
                                        positionsRemaining.Add(positionToTest);
                                    }
                                }
                                dangerAreaPositions.Add(position);
                                if (GetComponent <Enemy>(gos, position, out enemy, .7f))
                                {
                                    enemies.Add(enemy);
                                }
                                traps.AddRange(GetComponents <Trap>(gos, position, .7f));
                                if (GetComponent <RedDoor>(gos, position, out redDoor, .7f))
                                {
                                    redDoors.Add(redDoor);
                                }
                                if (GetComponent <ConveyorBelt>(gos, position, out conveyorBelt, .7f))
                                {
                                    conveyorBelts.Add(conveyorBelt);
                                }
                            }
                            positionsTested.Add(position);
                            allPositions.Add(position);
                            positionsRemaining.RemoveAt(0);
                        } while (positionsRemaining.Count > 0);
                        dangerZonePositions.AddRange(dangerAreaPositions);
                        dangerArea.enemies     = enemies.ToArray();
                        dangerArea.traps       = traps.ToArray();
                        dangerArea.dangerZones = dangerZones.ToArray();
                        dangerArea.redDoors    = redDoors.ToArray();
                        ConveyorBelt[] _conveyorBelts = conveyorBelts.ToArray();
                        dangerArea.conveyorBelts = _conveyorBelts;
                        dangerArea.cameraRect    = RectExtensions.FromPoints(dangerAreaPositions.ToArray()).Expand(Vector2.one * GameManager.WORLD_SCALE * 4);
                        dangerArea.correspondingSafeArea.cameraRect    = dangerArea.cameraRect;
                        dangerArea.correspondingSafeArea.conveyorBelts = _conveyorBelts;
                        SaveAndLoadManager.lastUniqueId++;
                        dangerArea.uniqueId = SaveAndLoadManager.lastUniqueId;
                        dangerArea.gameObject.AddComponent <SaveAndLoadObject>();
                        dangerAreas.Add(dangerArea);
                    }
                }
            }
            unexploredPositions = _unexploredPositions.ToArray();
            for (int i = 0; i < dangerAreas.Count; i++)
            {
                dangerAreas[i].unexploredCellPositions = unexploredPositions;
            }
        }