public static HashSet <IntrinsicElectronicData> SwitchCaseConnections(Vector2 searchVec,
                                                                          Matrix matrix,
                                                                          HashSet <PowerTypeCategory> CanConnectTo,
                                                                          Connection ConnPoints,
                                                                          IntrinsicElectronicData OIinheritance,
                                                                          HashSet <IntrinsicElectronicData> connections)
    {
        var searchVecInt = new Vector3Int((int)searchVec.x, (int)searchVec.y, 0);

        {           // LogError Duplicate wires
            var eConnsAtSearchVec = matrix.GetElectricalConnections(searchVecInt);
            foreach (var con in eConnsAtSearchVec)
            {
                if (OIinheritance != con)
                {
                    if ((OIinheritance.WireEndA == con.WireEndA && OIinheritance.WireEndB == con.WireEndB) ||
                        (OIinheritance.WireEndA == con.WireEndB && OIinheritance.WireEndB == con.WireEndA))
                    {
                        Logger.LogErrorFormat("{0} < duplicate Please remove {1}",
                                              Category.Electrical,
                                              searchVecInt,
                                              OIinheritance);
                    }
                }
            }

            eConnsAtSearchVec.Clear();
            ElectricalPool.PooledFPCList.Add(eConnsAtSearchVec);
        }

        // Connect to machine connnectors
        if (ConnPoints == Connection.MachineConnect)
        {
            foreach (var dir in MachineConnectorDirections)
            {
                var pos   = searchVecInt + dir;
                var conns = matrix.GetElectricalConnections(pos);
                foreach (var con in conns)
                {
                    if (OIinheritance != con && CanConnectTo.Contains(con.Categorytype) &&
                        ConnectionMap.IsConnectedToTile(Connection.MachineConnect, con.GetConnPoints()))
                    {
                        connections.Add(con);
                    }
                }

                conns.Clear();
                ElectricalPool.PooledFPCList.Add(conns);
            }
            return(connections);
        }

        // Make a vector representing the connection direction
        Vector3Int connVectorInt;

        switch (ConnPoints)
        {
        case Connection.North:
        {
            connVectorInt = new Vector3Int(0, 1, 0);
            break;
        }

        case Connection.NorthEast:
        {
            connVectorInt = new Vector3Int(1, 1, 0);
            break;
        }

        case Connection.East:
        {
            connVectorInt = new Vector3Int(1, 0, 0);
            break;
        }

        case Connection.SouthEast:
        {
            connVectorInt = new Vector3Int(1, -1, 0);
            break;
        }

        case Connection.South:
        {
            connVectorInt = new Vector3Int(0, -1, 0);
            break;
        }

        case Connection.SouthWest:
        {
            connVectorInt = new Vector3Int(-1, -1, 0);
            break;
        }

        case Connection.West:
        {
            connVectorInt = new Vector3Int(-1, 0, 0);
            break;
        }

        case Connection.NorthWest:
        {
            connVectorInt = new Vector3Int(-1, 1, 0);
            break;
        }

        case Connection.Overlap:
        {
            connVectorInt = new Vector3Int(0, 0, 0);
            break;
        }

        default:
        {
            // No defined behaviour for any other types
            return(connections);
        }
        }

        Vector3Int position = searchVecInt + connVectorInt;

        // Connect wires
        {
            var  eConnsAtPosition = matrix.GetElectricalConnections(position);
            bool connectionsAdded = false;
            foreach (var con in eConnsAtPosition)
            {
                if (CanConnectTo.Contains(con.Categorytype) &&
                    ConnectionMap.IsConnectedToTile(ConnPoints, con.GetConnPoints()))
                {
                    connections.Add(con);
                    connectionsAdded = true;
                }
            }
            eConnsAtPosition.Clear();
            ElectricalPool.PooledFPCList.Add(eConnsAtPosition);

            if (connectionsAdded)
            {
                return(connections);
            }
        }

        // Connect to overlap
        {
            var eConnsAtSearchVec = matrix.GetElectricalConnections(searchVecInt);
            foreach (var con in eConnsAtSearchVec)
            {
                if (OIinheritance != con && CanConnectTo.Contains(con.Categorytype) &&
                    ConnectionMap.IsConnectedToTileOverlap(ConnPoints, con.GetConnPoints()))
                {
                    connections.Add(con);
                }
            }
            eConnsAtSearchVec.Clear();
            ElectricalPool.PooledFPCList.Add(eConnsAtSearchVec);
        }
        return(connections);
    }
    public static HashSet <ElectricalOIinheritance> SwitchCaseConnections(Vector2 searchVec, Matrix matrix, HashSet <PowerTypeCategory> CanConnectTo, Connection ConnPoints, ElectricalOIinheritance OIinheritance)
    {
        HashSet <ElectricalOIinheritance> connections = new HashSet <ElectricalOIinheritance>();
        Connection Direction      = Connection.Overlap;
        Vector3Int Position       = new Vector3Int();
        bool       MachineConnect = false;

        switch (ConnPoints)
        {
        case Connection.North:
        {
            Direction = Connection.North;
            Position  = new Vector3Int((int)searchVec.x + 0, (int)searchVec.y + 1, 0);
        }
        break;

        case Connection.NorthEast:
        {
            Direction = Connection.NorthEast;
            Position  = new Vector3Int((int)searchVec.x + 1, (int)searchVec.y + 1, 0);
        }
        break;

        case Connection.East:
        {
            Direction = Connection.East;
            Position  = new Vector3Int((int)searchVec.x + 1, (int)searchVec.y + 0, 0);
        }
        break;

        case Connection.SouthEast:
        {
            Direction = Connection.SouthEast;
            Position  = new Vector3Int((int)searchVec.x + 1, (int)searchVec.y - 1, 0);
        }
        break;

        case Connection.South:
        {
            Direction = Connection.South;
            Position  = new Vector3Int((int)searchVec.x + 0, (int)searchVec.y - 1, 0);
        }
        break;

        case Connection.SouthWest:
        {
            Direction = Connection.SouthWest;
            Position  = new Vector3Int((int)searchVec.x + -1, (int)searchVec.y - 1, 0);
        }
        break;

        case Connection.West:
        {
            Direction = Connection.West;
            Position  = new Vector3Int((int)searchVec.x + -1, (int)searchVec.y + 0, 0);
        }
        break;

        case Connection.NorthWest:
        {
            Direction = Connection.NorthWest;
            Position  = new Vector3Int((int)searchVec.x + -1, (int)searchVec.y + 1, 0);
        }
        break;

        case Connection.Overlap:
        {
            Direction = Connection.Overlap;
            Position  = new Vector3Int((int)searchVec.x + 0, (int)searchVec.y + 0, 0);
        }
        break;

        case Connection.MachineConnect:
        {
            Direction      = Connection.MachineConnect;
            MachineConnect = true;
        }
        break;
        }
        Vector3Int PositionE = new Vector3Int((int)searchVec.x, (int)searchVec.y, 0);
        var        Econns    = matrix.GetElectricalConnections(PositionE);

        foreach (var con in Econns)
        {
            if (OIinheritance != con)
            {
                if ((OIinheritance.WireEndA == con.WireEndA && OIinheritance.WireEndB == con.WireEndB) ||
                    (OIinheritance.WireEndA == con.WireEndB && OIinheritance.WireEndB == con.WireEndA))
                {
                    Logger.LogErrorFormat("{0} < duplicate Please remove {1}", Category.Electrical, PositionE, OIinheritance.InData.Categorytype);
                }
            }
        }
        if (!MachineConnect)
        {
            var conns = matrix.GetElectricalConnections(Position);
            foreach (var con in conns)
            {
                if (CanConnectTo.Contains(con.InData.Categorytype))
                {
                    if (ConnectionMap.IsConnectedToTile(Direction, con.GetConnPoints()))
                    {
                        connections.Add(con);
                    }
                }
            }
            if (connections.Count == 0)
            {
                Position = new Vector3Int((int)searchVec.x, (int)searchVec.y, 0);
                conns    = matrix.GetElectricalConnections(Position);
                foreach (var con in conns)
                {
                    if (OIinheritance != con)
                    {
                        if (CanConnectTo.Contains(con.InData.Categorytype))
                        {
                            if (ConnectionMap.IsConnectedToTileOverlap(Direction, con.GetConnPoints()))
                            {
                                connections.Add(con);
                            }
                        }
                    }
                }
            }
        }
        else
        {
            for (int x = 0; x < 3; x++)
            {
                for (int y = 0; y < 3; y++)
                {
                    Vector3Int pos   = new Vector3Int((int)searchVec.x + (x - 1), (int)searchVec.y + (y - 1), 0);
                    var        conns = matrix.GetElectricalConnections(pos);
                    foreach (var con in conns)
                    {
                        if (OIinheritance != con)
                        {
                            if (CanConnectTo.Contains(con.InData.Categorytype))
                            {
                                if (ConnectionMap.IsConnectedToTile(Direction, con.GetConnPoints()))
                                {
                                    connections.Add(con);
                                }
                            }
                        }
                    }
                }
            }
        }
        return(connections);
    }
    public static HashSet <IntrinsicElectronicData> SwitchCaseConnections(Vector2 searchVec,
                                                                          Matrix matrix,
                                                                          HashSet <PowerTypeCategory> CanConnectTo,
                                                                          Connection connectionPoint,
                                                                          IntrinsicElectronicData OIinheritance,
                                                                          HashSet <IntrinsicElectronicData> connections,
                                                                          // used in SurroundingTiles connection
                                                                          Connection otherConnectionPoint = Connection.NA)
    {
        var searchVecInt = new Vector3Int((int)searchVec.x, (int)searchVec.y, 0);

        {           // LogError Duplicate wires
            var eConnsAtSearchVec = matrix.GetElectricalConnections(searchVecInt);
            foreach (var con in eConnsAtSearchVec)
            {
                if (OIinheritance != con)
                {
                    if ((OIinheritance.WireEndA == con.WireEndA && OIinheritance.WireEndB == con.WireEndB) ||
                        (OIinheritance.WireEndA == con.WireEndB && OIinheritance.WireEndB == con.WireEndA))
                    {
                        Logger.LogErrorFormat("{0} < duplicate Please remove {1}",
                                              Category.Electrical,
                                              searchVecInt,
                                              OIinheritance);
                    }
                }
            }

            eConnsAtSearchVec.Clear();
            ElectricalPool.PooledFPCList.Add(eConnsAtSearchVec);
        }

        if (connectionPoint == Connection.SurroundingTiles)
        {
            foreach (var dir in NeighbourDirections)
            {
                // check all nearby connections except connection that is specified in other wire end
                if (dir.Key == otherConnectionPoint)
                {
                    continue;
                }

                var pos   = searchVecInt + dir.Value;
                var conns = matrix.GetElectricalConnections(pos);

                // get connections pointing towards our tile [ex. if neighbour is at north, get all south connections(SW, S, SE)]
                HashSet <Connection> possibleConnections = ConnectionMap.GetConnectionsTargeting(dir.Key);
                if (possibleConnections != null)
                {
                    foreach (var con in conns)
                    {
                        if (OIinheritance != con &&
                            CanConnectTo.Contains(con.Categorytype)
                            // check if possibleConnections contains our WireEnd A or B
                            && (possibleConnections.Contains(con.WireEndA) || possibleConnections.Contains(con.WireEndB))
                            // check if contains to avoid errors
                            && !connections.Contains(con))
                        {
                            connections.Add(con);
                        }
                    }
                }

                conns.Clear();
                ElectricalPool.PooledFPCList.Add(conns);
            }

            return(connections);
        }

        // Connect to machine connnectors
        if (connectionPoint == Connection.MachineConnect)
        {
            foreach (var dir in MachineConnectorDirections)
            {
                var pos   = searchVecInt + dir;
                var conns = matrix.GetElectricalConnections(pos);
                foreach (var con in conns)
                {
                    if (OIinheritance != con && CanConnectTo.Contains(con.Categorytype) &&
                        ConnectionMap.IsConnectedToTile(Connection.MachineConnect, con.GetConnPoints()) && !connections.Contains(con))
                    {
                        connections.Add(con);
                    }
                }

                conns.Clear();
                ElectricalPool.PooledFPCList.Add(conns);
            }
            return(connections);
        }

        // Make a vector representing the connection direction
        Vector3Int connVectorInt = ConnectionMap.GetDirectionFromConnection(connectionPoint);
        Vector3Int position      = searchVecInt + connVectorInt;

        // Connect wires
        {
            var  eConnsAtPosition = matrix.GetElectricalConnections(position);
            bool connectionsAdded = false;
            foreach (var con in eConnsAtPosition)
            {
                if (CanConnectTo.Contains(con.Categorytype) &&
                    ConnectionMap.IsConnectedToTile(connectionPoint, con.GetConnPoints()))
                {
                    connections.Add(con);
                    connectionsAdded = true;
                }
            }
            eConnsAtPosition.Clear();
            ElectricalPool.PooledFPCList.Add(eConnsAtPosition);

            if (connectionsAdded)
            {
                return(connections);
            }
        }

        // Connect to overlap
        {
            var eConnsAtSearchVec = matrix.GetElectricalConnections(searchVecInt);
            foreach (var con in eConnsAtSearchVec)
            {
                if (OIinheritance != con && CanConnectTo.Contains(con.Categorytype) &&
                    ConnectionMap.IsConnectedToTileOverlap(connectionPoint, con.GetConnPoints()))
                {
                    connections.Add(con);
                }
            }
            eConnsAtSearchVec.Clear();
            ElectricalPool.PooledFPCList.Add(eConnsAtSearchVec);
        }
        return(connections);
    }
    public static HashSet <IntrinsicElectronicData> SwitchCaseConnections(Vector2 searchVec,
                                                                          Matrix matrix,
                                                                          HashSet <PowerTypeCategory> CanConnectTo,
                                                                          Connection ConnPoints,
                                                                          IntrinsicElectronicData OIinheritance,
                                                                          HashSet <IntrinsicElectronicData> connections)
    {
        var Direction      = Connection.Overlap;
        var Position       = new Vector3Int();
        var MachineConnect = false;

        switch (ConnPoints)
        {
        case Connection.North:
        {
            Direction = Connection.North;
            Position  = new Vector3Int((int)searchVec.x + 0, (int)searchVec.y + 1, 0);
        }
        break;

        case Connection.NorthEast:
        {
            Direction = Connection.NorthEast;
            Position  = new Vector3Int((int)searchVec.x + 1, (int)searchVec.y + 1, 0);
        }
        break;

        case Connection.East:
        {
            Direction = Connection.East;
            Position  = new Vector3Int((int)searchVec.x + 1, (int)searchVec.y + 0, 0);
        }
        break;

        case Connection.SouthEast:
        {
            Direction = Connection.SouthEast;
            Position  = new Vector3Int((int)searchVec.x + 1, (int)searchVec.y - 1, 0);
        }
        break;

        case Connection.South:
        {
            Direction = Connection.South;
            Position  = new Vector3Int((int)searchVec.x + 0, (int)searchVec.y - 1, 0);
        }
        break;

        case Connection.SouthWest:
        {
            Direction = Connection.SouthWest;
            Position  = new Vector3Int((int)searchVec.x + -1, (int)searchVec.y - 1, 0);
        }
        break;

        case Connection.West:
        {
            Direction = Connection.West;
            Position  = new Vector3Int((int)searchVec.x + -1, (int)searchVec.y + 0, 0);
        }
        break;

        case Connection.NorthWest:
        {
            Direction = Connection.NorthWest;
            Position  = new Vector3Int((int)searchVec.x + -1, (int)searchVec.y + 1, 0);
        }
        break;

        case Connection.Overlap:
        {
            Direction = Connection.Overlap;
            Position  = new Vector3Int((int)searchVec.x + 0, (int)searchVec.y + 0, 0);
        }
        break;

        case Connection.MachineConnect:
        {
            Direction      = Connection.MachineConnect;
            MachineConnect = true;
        }
        break;
        }

        var PositionE = new Vector3Int((int)searchVec.x, (int)searchVec.y, 0);
        var Econns    = matrix.GetElectricalConnections(PositionE);

        foreach (var con in Econns)
        {
            if (OIinheritance != con)
            {
                if (OIinheritance.WireEndA == con.WireEndA && OIinheritance.WireEndB == con.WireEndB ||
                    OIinheritance.WireEndA == con.WireEndB && OIinheritance.WireEndB == con.WireEndA)
                {
                    Logger.LogErrorFormat("{0} < duplicate Please remove {1}",
                                          Category.Electrical,
                                          PositionE,
                                          OIinheritance);
                }
            }
        }
        Econns.Clear();
        ElectricalPool.PooledFPCList.Add(Econns);
        if (!MachineConnect)
        {
            var conns = matrix.GetElectricalConnections(Position);
            foreach (var con in conns)
            {
                if (CanConnectTo.Contains(con.Categorytype))
                {
                    if (ConnectionMap.IsConnectedToTile(Direction, con.GetConnPoints()))
                    {
                        connections.Add(con);
                    }
                }
            }

            conns.Clear();
            ElectricalPool.PooledFPCList.Add(conns);
            if (connections.Count == 0)
            {
                Position = new Vector3Int((int)searchVec.x, (int)searchVec.y, 0);
                conns    = matrix.GetElectricalConnections(Position);
                foreach (var con in conns)
                {
                    if (OIinheritance != con)
                    {
                        if (CanConnectTo.Contains(con.Categorytype))
                        {
                            if (ConnectionMap.IsConnectedToTileOverlap(Direction, con.GetConnPoints()))
                            {
                                connections.Add(con);
                            }
                        }
                    }
                }
                conns.Clear();
                ElectricalPool.PooledFPCList.Add(conns);
            }
        }
        else
        {
            foreach (var Direction_ in MachineConnectorDirections)
            {
                var pos = new Vector3Int((int)searchVec.x + (int)Direction_.x,
                                         (int)searchVec.y + (int)Direction_.y, 0);
                var conns = matrix.GetElectricalConnections(pos);
                foreach (var con in conns)
                {
                    if (OIinheritance != con)
                    {
                        if (CanConnectTo.Contains(con.Categorytype))
                        {
                            if (ConnectionMap.IsConnectedToTile(Direction, con.GetConnPoints()))
                            {
                                connections.Add(con);
                            }
                        }
                    }
                }
                conns.Clear();
                ElectricalPool.PooledFPCList.Add(conns);
            }
        }
        return(connections);
    }