Esempio n. 1
0
        public override bool AddAdjacent(Side side, Node node)
        {
            bool added = false;

            if (Adjacents[side] == null)
            {
                added           = true;
                Adjacents[side] = node;
                node.AddAdjacent(Sides.GetInverse(side), this);
                if (node is ContainerNode)
                {
                    AddConnectedContainer(node);
                }
            }
            else if (Adjacents[side] != null &&
                     Adjacents[side].Adjacents[Sides.GetInverse(side)] != null &&
                     Adjacents[side].Adjacents[Sides.GetInverse(side)].ParentNetwork != null &&
                     Adjacents[side].ParentNetwork != null &&
                     Adjacents[side].Adjacents[Sides.GetInverse(side)].ParentNetwork != Adjacents[side].ParentNetwork)
            {
                //Printer.Info($"ADDING ADJ adj: {Adjacents[side].Adjacents[Sides.GetInverse(side)].Print()} of {Adjacents[side].Print()}");
                //Printer.Info($"in wrong network of {Adjacents[side].Print()}");

                added = true;
                Adjacents[side].Adjacents[Sides.GetInverse(side)] = this;
                //Printer.Info($"ADDING ADJ adj: {Adjacents[side].Adjacents[Sides.GetInverse(side)].Print()} of {Adjacents[side].Print()}");
            }
            return(added);
        }
Esempio n. 2
0
 void AddAdjacentToNode(Node node, Node adjacent)
 {
     if (node != null && adjacent != null)
     {
         node.AddAdjacent(adjacent);
     }
 }
Esempio n. 3
0
        public override bool AddAdjacent(Side side, Node node)
        {
            //Printer.Info($"ADDING ADJ: {node.Print()} to {Print()}");
            //Printer.Info($"IS SIDE NULL?" + (Adjacents[side] == null).ToString());
            if (Adjacents[side] != null)
            {
                //Printer.Info($"SIDE: {side.Name} is {Adjacents[side].Print()}");
            }
            bool added = false;

            if (Adjacents[side] == null)
            {
                if (!(node is ConnectorPipeNode) || (node is ConnectorPipeNode && node.GetType().Equals(this.GetType())))
                {
                    added           = true;
                    Adjacents[side] = node;
                    node.AddAdjacent(Sides.GetInverse(side), this);
                }
            }
            else if (Adjacents[side] != null &&
                     Adjacents[side].Adjacents[Sides.GetInverse(side)] != null &&
                     Adjacents[side].Adjacents[Sides.GetInverse(side)].ParentNetwork != null &&
                     Adjacents[side].ParentNetwork != null &&
                     Adjacents[side].Adjacents[Sides.GetInverse(side)].ParentNetwork != Adjacents[side].ParentNetwork)
            {
                //Printer.Info($"ADDING ADJ adj: {Adjacents[side].Adjacents[Sides.GetInverse(side)].Print()} of {Adjacents[side].Print()}");
                //Printer.Info($"in wrong network of {Adjacents[side].Print()}");

                added = true;
                Adjacents[side].Adjacents[Sides.GetInverse(side)] = this;
                //Printer.Info($"ADDING ADJ adj: {Adjacents[side].Adjacents[Sides.GetInverse(side)].Print()} of {Adjacents[side].Print()}");
            }
            return(added);
        }
Esempio n. 4
0
        public void AddEntity(TEntity entity)
        {
            Node <TEntity> node = GetOrCreate(entity);

            //Add adjacent entities
            IEnumerable <TEntity> adjacentEntities = _getAdjacentEntities(entity);

            foreach (TEntity adjacentEntity in adjacentEntities)
            {
                Node <TEntity> adjacentNode = GetOrCreate(adjacentEntity);
                node.AddAdjacent(adjacentNode);
            }
        }
Esempio n. 5
0
        public override bool AddAdjacent(Side side, Node node)
        {
            bool added = false;

            if (Adjacents[side] == null)
            {
                added           = true;
                Adjacents[side] = node;
                node.AddAdjacent(Sides.GetInverse(side), this);
                if (node is PipeNode && node.ParentNetwork != null)
                {
                    PipeNode pipeNode = (PipeNode)node;
                    AdjNetworks.Add(pipeNode.ParentNetwork);
                    pipeNode.ParentNetwork.AddNode(this);
                }
            }
            return(added);
        }
        public override bool AddAdjacent(Side side, Node node)
        {
            //Printer.Info($"ADDING ADJ: {node.Print()} to {Print()}");

            bool added = false;

            if (Adjacents[side] == null)
            {
                added           = true;
                Adjacents[side] = node;
                node.AddAdjacent(Sides.GetInverse(side), this);
                if (node is IOPipeNode)
                {
                    IOPipeNode iOPipeNode = (IOPipeNode)node;
                    iOPipeNode.AddConnectedContainer(this);
                }
            }
            return(added);
        }
Esempio n. 7
0
        public static void AddObject(KeyValuePair <Vector2, StardewValley.Object> obj, GameLocation location)
        {
            DataAccess DataAccess = DataAccess.GetDataAccess();

            if (Globals.UltraDebug)
            {
                Printer.Info("Adding new object: " + obj.Key.ToString() + obj.Value.Name);
            }

            List <Node> nodes   = DataAccess.LocationNodes[location];
            Node        newNode = NodeFactory.CreateElement(obj.Key, location, obj.Value);

            if (Globals.UltraDebug)
            {
                Printer.Info("New node created: " + newNode.Print());
            }
            int x = (int)newNode.Position.X;
            int y = (int)newNode.Position.Y;

            nodes.Add(newNode);
            Vector2 north     = new Vector2(x, y - 1);
            Node    northNode = nodes.Find(n => n.Position.Equals(north));

            if (northNode != null)
            {
                newNode.AddAdjacent(SideStruct.GetSides().North, northNode);
            }
            Vector2 south     = new Vector2(x, y + 1);
            Node    southNode = nodes.Find(n => n.Position.Equals(south));

            if (southNode != null)
            {
                newNode.AddAdjacent(SideStruct.GetSides().South, southNode);
            }
            Vector2 east     = new Vector2(x + 1, y);
            Node    eastNode = nodes.Find(n => n.Position.Equals(east));

            if (eastNode != null)
            {
                newNode.AddAdjacent(SideStruct.GetSides().East, eastNode);
            }
            Vector2 west     = new Vector2(x - 1, y);
            Node    westNode = nodes.Find(n => n.Position.Equals(west));

            if (westNode != null)
            {
                newNode.AddAdjacent(SideStruct.GetSides().West, westNode);
            }
            if (Globals.UltraDebug)
            {
                newNode.Print();
            }

            if (obj.Value is CustomObjectItem)
            {
                if (Globals.UltraDebug)
                {
                    Printer.Info("Assigning network to new node");
                }
                List <Network> uncheckedAdjNetworks = newNode.Scan();
                List <Network> adjNetworks          = new List <Network>();
                foreach (Network network in uncheckedAdjNetworks)
                {
                    if (network != null)
                    {
                        adjNetworks.Add(network);
                    }
                }
                if (Globals.UltraDebug)
                {
                    Printer.Info("Adjacent network amount: " + adjNetworks.Count.ToString());
                }
                if (adjNetworks.Count == 0)
                {
                    if (Globals.UltraDebug)
                    {
                        Printer.Info("No adjacent networks, creating new one... ");
                    }
                    Network network = CreateLocationNetwork(location);
                    AddNewElement(newNode, network);
                }
                else
                {
                    List <Network> orderedAdjNetworks = adjNetworks.OrderByDescending(s => s.Nodes.Count).ToList();
                    if (Globals.UltraDebug)
                    {
                        Printer.Info($"Biggest network = {orderedAdjNetworks[0].ID}");
                    }
                    foreach (Network network in orderedAdjNetworks)
                    {
                        if (Globals.UltraDebug)
                        {
                            Printer.Info(network.Print());
                        }
                    }
                    newNode.ParentNetwork = orderedAdjNetworks[0];
                    AddNewElement(newNode, orderedAdjNetworks[0]);
                    MergeNetworks(orderedAdjNetworks, location);
                }
                if (Globals.UltraDebug)
                {
                    Printer.Info($"Assigned network: [N{newNode.ParentNetwork.ID}]");
                }
                //Another check for missmatching networks
                north     = new Vector2(x, y - 1);
                northNode = nodes.Find(n => n.Position.Equals(north));
                if (northNode != null)
                {
                    newNode.AddAdjacent(SideStruct.GetSides().North, northNode);
                }
                south     = new Vector2(x, y + 1);
                southNode = nodes.Find(n => n.Position.Equals(south));
                if (southNode != null)
                {
                    newNode.AddAdjacent(SideStruct.GetSides().South, southNode);
                }
                east     = new Vector2(x + 1, y);
                eastNode = nodes.Find(n => n.Position.Equals(east));
                if (eastNode != null)
                {
                    newNode.AddAdjacent(SideStruct.GetSides().East, eastNode);
                }
                west     = new Vector2(x - 1, y);
                westNode = nodes.Find(n => n.Position.Equals(west));
                if (westNode != null)
                {
                    newNode.AddAdjacent(SideStruct.GetSides().West, westNode);
                }
            }
            Node           node     = nodes.Find(n => n.Position.Equals(obj.Key));
            List <Network> networks = DataAccess.LocationNetworks[node.Location];

            if (node.ParentNetwork != null && !networks.Contains(node.ParentNetwork))
            {
                networks.Add(node.ParentNetwork);
            }
            foreach (KeyValuePair <Side, Node> pair in node.Adjacents)
            {
                if (pair.Value is PPMNode)
                {
                    PPMNode invisibilizerNode = (PPMNode)pair.Value;
                    invisibilizerNode.AdjNetworks.Add(node.ParentNetwork);
                    newNode.ParentNetwork.AddNode(invisibilizerNode);
                }
            }
        }
        public static Node BuildNetworkRecursive(Vector2 position, GameLocation location, Network inNetwork)
        {
            DataAccess DataAccess = DataAccess.GetDataAccess();
            Node       node       = null;
            string     inType     = "";
            int        x          = (int)position.X;
            int        y          = (int)position.Y;

            if ((location.getObjectAtTile(x, y) != null) && DataAccess.ModItems.Contains(location.getObjectAtTile(x, y).ParentSheetIndex))
            {
                inType = "object";
            }
            else if ((Game1.getFarm().getBuildingAt(new Vector2(x, y)) != null) && DataAccess.Buildings.Contains(Game1.getFarm().getBuildingAt(new Vector2(x, y)).buildingType.ToString()))
            {
                inType = "building";
            }
            if (inType.Equals("object") || inType.Equals("building"))
            {
                List <Node> nodes = DataAccess.LocationNodes[location];
                if (nodes.Find(n => n.Position.Equals(position)) == null)
                {
                    if (inType.Equals("object"))
                    {
                        nodes.Add(NodeFactory.CreateElement(new Vector2(x, y), location, location.getObjectAtTile(x, y)));
                    }
                    else if (inType.Equals("building"))
                    {
                        nodes.Add(NodeFactory.CreateElement(new Vector2(x, y), location, Game1.getFarm().getBuildingAt(new Vector2(x, y))));
                    }
                }
                if (inType.Equals("object"))
                {
                    node = nodes.Find(n => n.Position.Equals(position));
                    //Printer.Info("current "+node.Print());
                    //Printer.Info("Adjacents: "+ node.Adjacents.Values.Count(a => a != null));
                    if (node.ParentNetwork == null)
                    {
                        if (inNetwork == null)
                        {
                            node.ParentNetwork = NetworkManager.CreateLocationNetwork(location);
                            //Printer.Info($"Created network {node.ParentNetwork.ID} for {node.Print()}");
                        }
                        else
                        {
                            node.ParentNetwork = inNetwork;
                        }
                        NetworkManager.LoadNodeToNetwork(node.Position, location, node.ParentNetwork);
                        //North
                        Vector2 north = new Vector2(x, y - 1);
                        if (location.getObjectAtTile(x, y - 1) != null && y - 1 >= 0)
                        {
                            if (location.getObjectAtTile(x, y - 1) is PipeItem)
                            {
                                if (!node.ParentNetwork.Nodes.Contains(nodes.Find(n => n.Position.Equals(north))))
                                {
                                    Node adj = BuildNetworkRecursive(north, location, node.ParentNetwork);
                                    node.AddAdjacent(SideStruct.GetSides().North, adj);
                                }
                            }
                            else if (location.getObjectAtTile(x, y - 1) is Chest || location.getObjectAtTile(x, y - 1) is CustomBigCraftableItem)
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(north)) == null)
                                {
                                    adj = NodeFactory.CreateElement(north, location, location.getObjectAtTile(x, y - 1));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(north));
                                }
                                node.AddAdjacent(SideStruct.GetSides().North, adj);
                            }
                        }
                        else if (Game1.getFarm().getBuildingAt(north) != null && y - 1 >= 0)
                        {
                            if (DataAccess.Buildings.Contains(Game1.getFarm().getBuildingAt(north).buildingType.ToString()))
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(north)) == null)
                                {
                                    adj = NodeFactory.CreateElement(north, location, Game1.getFarm().getBuildingAt(north));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(north));
                                }
                                node.AddAdjacent(SideStruct.GetSides().North, adj);
                            }
                        }

                        //South
                        Vector2 south = new Vector2(x, y + 1);
                        if (location.getObjectAtTile(x, y + 1) != null && y + 1 < location.map.DisplayHeight)
                        {
                            if (location.getObjectAtTile(x, y + 1) is PipeItem)
                            {
                                if (!node.ParentNetwork.Nodes.Contains(nodes.Find(n => n.Position.Equals(south))))
                                {
                                    Node adj = BuildNetworkRecursive(south, location, node.ParentNetwork);
                                    node.AddAdjacent(SideStruct.GetSides().South, adj);
                                }
                            }
                            else if (location.getObjectAtTile(x, y + 1) is Chest || location.getObjectAtTile(x, y + 1) is CustomBigCraftableItem)
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(south)) == null)
                                {
                                    adj = NodeFactory.CreateElement(south, location, location.getObjectAtTile(x, y + 1));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(south));
                                }
                                node.AddAdjacent(SideStruct.GetSides().South, adj);
                            }
                        }
                        else if (Game1.getFarm().getBuildingAt(south) != null && y + 1 < location.map.DisplayHeight)
                        {
                            if (DataAccess.Buildings.Contains(Game1.getFarm().getBuildingAt(south).buildingType.ToString()))
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(south)) == null)
                                {
                                    adj = NodeFactory.CreateElement(south, location, Game1.getFarm().getBuildingAt(south));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(south));
                                }
                                node.AddAdjacent(SideStruct.GetSides().South, adj);
                            }
                        }
                        //East
                        Vector2 east = new Vector2(x + 1, y);
                        if (location.getObjectAtTile(x + 1, y) != null && x + 1 >= 0)
                        {
                            if (location.getObjectAtTile(x + 1, y) is PipeItem)
                            {
                                if (!node.ParentNetwork.Nodes.Contains(nodes.Find(n => n.Position.Equals(east))))
                                {
                                    if (nodes.Find(n => n.Position.Equals(east)) != null)
                                    {
                                        //Printer.Info($"Parent network no contine east {nodes.Find(n => n.Position.Equals(east)).Print()}");
                                    }
                                    Node adj = BuildNetworkRecursive(east, location, node.ParentNetwork);
                                    //Printer.Info($"RETURN OF {node.Print()} for adj {adj.Print()}");
                                    node.AddAdjacent(SideStruct.GetSides().East, adj);
                                }
                            }
                            else if (location.getObjectAtTile(x + 1, y) is Chest || location.getObjectAtTile(x + 1, y) is CustomBigCraftableItem)
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(east)) == null)
                                {
                                    adj = NodeFactory.CreateElement(east, location, location.getObjectAtTile(x + 1, y));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(east));
                                }
                                node.AddAdjacent(SideStruct.GetSides().East, adj);
                            }
                        }
                        else if (Game1.getFarm().getBuildingAt(east) != null && x + 1 >= 0)
                        {
                            if (DataAccess.Buildings.Contains(Game1.getFarm().getBuildingAt(east).buildingType.ToString()))
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(east)) == null)
                                {
                                    adj = NodeFactory.CreateElement(east, location, Game1.getFarm().getBuildingAt(east));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(east));
                                }
                                node.AddAdjacent(SideStruct.GetSides().East, adj);
                            }
                        }
                        //West
                        Vector2 west = new Vector2(x - 1, y);
                        if (location.getObjectAtTile(x - 1, y) != null && x + 1 < location.map.DisplayWidth)
                        {
                            if (location.getObjectAtTile(x - 1, y) is PipeItem)
                            {
                                if (!node.ParentNetwork.Nodes.Contains(nodes.Find(n => n.Position.Equals(west))))
                                {
                                    if (nodes.Find(n => n.Position.Equals(west)) != null)
                                    {
                                        //Printer.Info($"Parent network no contine east {nodes.Find(n => n.Position.Equals(west)).Print()}");
                                    }
                                    Node adj = BuildNetworkRecursive(west, location, node.ParentNetwork);
                                    node.AddAdjacent(SideStruct.GetSides().West, adj);
                                }
                            }
                            else if (location.getObjectAtTile(x - 1, y) is Chest || location.getObjectAtTile(x - 1, y) is CustomBigCraftableItem)
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(west)) == null)
                                {
                                    adj = NodeFactory.CreateElement(west, location, location.getObjectAtTile(x - 1, y));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(west));
                                }
                                node.AddAdjacent(SideStruct.GetSides().West, adj);
                            }
                        }
                        else if (Game1.getFarm().getBuildingAt(west) != null && x - 1 < location.map.DisplayWidth)
                        {
                            if (DataAccess.Buildings.Contains(Game1.getFarm().getBuildingAt(west).buildingType.ToString()))
                            {
                                Node adj;
                                if (nodes.Find(n => n.Position.Equals(west)) == null)
                                {
                                    adj = NodeFactory.CreateElement(west, location, Game1.getFarm().getBuildingAt(west));
                                    nodes.Add(adj);
                                }
                                else
                                {
                                    adj = nodes.Find(n => n.Position.Equals(west));
                                }
                                node.AddAdjacent(SideStruct.GetSides().West, adj);
                            }
                        }
                    }
                }
            }
            return(node);
        }
Esempio n. 9
0
        public GraphTraversalFixture()
        {
            var graph0Graph = new DirectedGraphAdjacencyList <char>(
                new SinglyLinkedList <INode <char> >(),
                new StackSinglyLinkedList <INode <char> >(),
                new QueueSinglyLinkedList <INode <char> >());
            var _A = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'A');
            var _B = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'B');
            var _C = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'C');
            var _D = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'D');
            var _E = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'E');
            var _F = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'F');
            var _G = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'G');
            var _H = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'H');
            var _I = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'I');
            var _J = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'J');
            var _K = new Node <char>(
                new SinglyLinkedList <INode <char> >(), 'K');
            var nodes = new Node <char>[]
            { _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K };

            _A.AddAdjacent(_B);
            _B.AddAdjacent(_A, _C, _J);
            _C.AddAdjacent(_D, _F);
            _D.AddAdjacent(_H);
            _E.AddAdjacent(_A, _D);
            //_F.AddAdjacent();
            _G.AddAdjacent(_D, _I);
            _H.AddAdjacent(_D, _E, _K);
            _I.AddAdjacent(_F);
            _J.AddAdjacent(_I);
            //_K.AddAdjacent();

            foreach (var node in nodes)
            {
                graph0Graph.Add(node);
                var nodeKey = node.Vertex.ToString();
                graph0[nodeKey] = new Hashtable();
                ((Hashtable)graph0[nodeKey])["node"] = node;
            }

            graph0Graph.Queue = new QueueSinglyLinkedList <
                INode <char> >();

            graph0["graph"] = graph0Graph;
            ((Hashtable)graph0["A"])["dft-string"] = "ABCDHEKFJI";
            ((Hashtable)graph0["B"])["dft-string"] = "BACDHEKFJI";
            ((Hashtable)graph0["C"])["dft-string"] = "CDHEABJIFK";
            ((Hashtable)graph0["D"])["dft-string"] = "DHEABCFJIK";
            ((Hashtable)graph0["E"])["dft-string"] = "EABCDHKFJI";
            ((Hashtable)graph0["F"])["dft-string"] = "F";
            ((Hashtable)graph0["G"])["dft-string"] = "GDHEABCFJIK";
            ((Hashtable)graph0["H"])["dft-string"] = "HDEABCFJIK";
            ((Hashtable)graph0["I"])["dft-string"] = "IF";
            ((Hashtable)graph0["J"])["dft-string"] = "JIF";
            ((Hashtable)graph0["K"])["dft-string"] = "K";


            ((Hashtable)graph0["A"])["bft-string"] = "ABCJDFIHEK";
            ((Hashtable)graph0["B"])["bft-string"] = "BACJDFIHEK";
            ((Hashtable)graph0["C"])["bft-string"] = "CDFHEKABJI";
            ((Hashtable)graph0["D"])["bft-string"] = "DHEKABCJFI";
            ((Hashtable)graph0["E"])["bft-string"] = "EADBHCJKFI";
            ((Hashtable)graph0["F"])["bft-string"] = "F";
            ((Hashtable)graph0["G"])["bft-string"] = "GDIHFEKABCJ";
            ((Hashtable)graph0["H"])["bft-string"] = "HDEKABCJFI";
            ((Hashtable)graph0["I"])["bft-string"] = "IF";
            ((Hashtable)graph0["J"])["bft-string"] = "JIF";
            ((Hashtable)graph0["K"])["bft-string"] = "K";

            var graph1Graph = new DirectedGraphAdjacencyList <char>(
                new SinglyLinkedList <INode <char> >(),
                new StackSinglyLinkedList <INode <char> >(),
                new QueueSinglyLinkedList <INode <char> >());

            graph1["graph"] = graph1Graph;
        }