Ejemplo n.º 1
0
    private void CreateLinkBetweenSelected()
    {
        // get list of selected nodes
        List <TileNode> nodes = new List <TileNode>();

        foreach (GameObject go in Selection.gameObjects)
        {
            TileNode n = go.GetComponent <TileNode>();
            if (n != null)
            {
                nodes.Add(n);
            }
        }

        // now update links between these nodes
        foreach (TileNode n in nodes)
        {
            TNEForcedLink ls = n.gameObject.GetComponent <TNEForcedLink>();
            if (ls == null)
            {
                ls = n.gameObject.AddComponent <TNEForcedLink>();
            }

            // set link state with all other selected nodes
            foreach (TileNode n2 in nodes)
            {
                if (n2 != n)
                {
                    ls.LinkWith(n2);
                }
            }
        }
    }
Ejemplo n.º 2
0
    static void RenderTileNodeGizmo(TileNode node, GizmoType gizmoType)
    {
        if (node.mapnav == null)
        {
            return;
        }
        Vector3 position  = node.transform.position;
        Vector3 gizmoSize = TileNode.GizmoSize * (node.mapnav.tileSpacing / TileNode.GizmoSizeDiv);

        // draw cube(s) for node
        if (node.mapnav.gizmoDrawNodes || ((gizmoType & GizmoType.Selected) != 0))
        {
            if ((gizmoType & GizmoType.Selected) != 0)
            {
                Gizmos.color = Color.red;
                Gizmos.DrawCube(position, gizmoSize);
            }

            else if (node.mapnav.gizmoColorCoding)
            {
                bool    drawn = false;
                Vector3 offs  = Vector3.zero;
                for (int i = 0; i < TileNode.GizmoColourCoding.Length; i++)
                {
                    int t = (int)Mathf.Pow(2, i);
                    if (((int)node.tileTypeMask & t) == t)
                    {
                        Gizmos.color = TileNode.GizmoColourCoding[i];
                        Gizmos.DrawCube(position + offs, gizmoSize);
                        offs.y += gizmoSize.y;
                        drawn   = true;
                    }
                }

                if (!drawn)
                {
                    Gizmos.color = Color.black;
                    Gizmos.DrawCube(position, gizmoSize);
                }
            }

            else
            {
                Gizmos.color = Color.black;
                Gizmos.DrawCube(position, gizmoSize);
            }
        }

        // draw the node links
        if (node.nodeLinks != null && (node.mapnav.gizmoDrawLinks || (gizmoType & GizmoType.Selected) != 0))
        {
            TNELinksOnOffSwitch linkSwitch = node.gameObject.GetComponent <TNELinksOnOffSwitch>();
            foreach (TileNode n in node.nodeLinks)
            {
                if (n != null)
                {
                    Gizmos.color = Color.blue;

                    if (linkSwitch != null)
                    {                           // check if lik is on with neighbour
                        if (linkSwitch.LinkIsOn(n) == 0)
                        {
                            Gizmos.color = Color.red;
                        }
                    }

                    TNELinksOnOffSwitch nls = n.gameObject.GetComponent <TNELinksOnOffSwitch>();
                    if (nls != null)
                    {                           // check if neighbour's link with me is on
                        if (nls.LinkIsOn(node) == 0)
                        {
                            Gizmos.color = Color.red;
                        }
                    }

                    Gizmos.DrawLine(position, n.transform.position);
                }
            }

            // look for forced links
            TNEForcedLink fl = node.gameObject.GetComponent <TNEForcedLink>();
            if (fl != null)
            {
                foreach (TileNode link in fl.links)
                {
                    if (link == null)
                    {
                        continue;
                    }
                    Gizmos.DrawLine(position, link.transform.position);
                }
            }
        }
    }
Ejemplo n.º 3
0
    /// <summary>
    /// Links TileNodes with their neighbouring nodes
    /// </summary>
    public void LinkNodes()
    {
        if (nodesCache == null)
        {
            return;
        }
        if (nodesCache.Length == 0)
        {
            return;
        }
        if (nodesCache.Length != nodesXCount * nodesYCount)
        {
            Debug.LogWarning(string.Format("The number of cached nodes {0} != {1} which was expected", nodesCache.Length, (nodesXCount * nodesYCount)));
            return;
        }

        nodes = new TileNode[nodesCache.Length];

        bool atoffs = false;
        int  i      = 0;

        // === link nodes with their neighbours (hex tile pattern)
        if (tilesLayout == TilesLayout.Hex)
        {
            atoffs = false;
            for (int y = 0; y < nodesYCount; y++)
            {
                for (int x = 0; x < nodesXCount; x++)
                {
                    i = y * nodesXCount + x;
                    if (nodesCache[i] == null)
                    {
                        nodes[i] = null; continue;
                    }

                    TileNode n = nodesCache[i].GetComponent <TileNode>();
                    nodes[i]    = n;                  // cache the component
                    n.nodeLinks = new TileNode[6] {
                        null, null, null, null, null, null
                    };

                    // link with previous node
                    if (x - 1 >= 0)
                    {
                        n.nodeLinks[0] = nodesCache[i - 1] == null ? null : nodesCache[i - 1].GetComponent <TileNode>();
                    }
                    // link with next node
                    if (x + 1 < nodesXCount)
                    {
                        n.nodeLinks[1] = nodesCache[i + 1] == null ? null : nodesCache[i + 1].GetComponent <TileNode>();
                    }

                    // link with nodes in previous row
                    if (y > 0)
                    {
                        // prev row, same column
                        n.nodeLinks[2] = nodesCache[i - nodesXCount] == null ? null : nodesCache[i - nodesXCount].GetComponent <TileNode>();;
                        if (atoffs)
                        {                               // prev row, next column
                            if (x + 1 < nodesXCount)
                            {
                                n.nodeLinks[4] = nodesCache[i - nodesXCount + 1] == null ? null : nodesCache[i - nodesXCount + 1].GetComponent <TileNode>();
                            }
                        }
                        else
                        {                               // prev row, prev column
                            if (x - 1 >= 0)
                            {
                                n.nodeLinks[4] = nodesCache[i - nodesXCount - 1] == null ? null : nodesCache[i - nodesXCount - 1].GetComponent <TileNode>();
                            }
                        }
                    }

                    // link with nodes in next row
                    if (y + 1 < nodesYCount)
                    {
                        // next row, same column
                        n.nodeLinks[3] = nodesCache[i + nodesXCount] == null ? null : nodesCache[i + nodesXCount].GetComponent <TileNode>();
                        if (atoffs)
                        {                               // prev row, next column
                            if (x + 1 < nodesXCount)
                            {
                                n.nodeLinks[5] = nodesCache[i + nodesXCount + 1] == null ? null : nodesCache[i + nodesXCount + 1].GetComponent <TileNode>();
                            }
                        }
                        else
                        {                               // prev row, prev column
                            if (x - 1 >= 0)
                            {
                                n.nodeLinks[5] = nodesCache[i + nodesXCount - 1] == null ? null : nodesCache[i + nodesXCount - 1].GetComponent <TileNode>();
                            }
                        }
                    }
                }
                atoffs = !atoffs;
            }
        }

        // === link nodes with their neighbours (square tile pattern with 4 neighbours)
        if (tilesLayout == TilesLayout.Square_4)
        {
            for (int y = 0; y < nodesYCount; y++)
            {
                for (int x = 0; x < nodesXCount; x++)
                {
                    i = y * nodesXCount + x;
                    if (nodesCache[i] == null)
                    {
                        nodes[i] = null; continue;
                    }

                    TileNode n = nodesCache[i].GetComponent <TileNode>();
                    nodes[i]    = n;                  // cache the component
                    n.nodeLinks = new TileNode[4] {
                        null, null, null, null
                    };

                    // link with previous node
                    if (x - 1 >= 0)
                    {
                        n.nodeLinks[0] = nodesCache[i - 1] == null ? null : nodesCache[i - 1].GetComponent <TileNode>();
                    }
                    // link with next node
                    if (x + 1 < nodesXCount)
                    {
                        n.nodeLinks[1] = nodesCache[i + 1] == null ? null : nodesCache[i + 1].GetComponent <TileNode>();
                    }
                    // prev row, same column
                    if (y > 0)
                    {
                        n.nodeLinks[2] = nodesCache[i - nodesXCount] == null ? null : nodesCache[i - nodesXCount].GetComponent <TileNode>();
                    }
                    // next row, same column
                    if (y + 1 < nodesYCount)
                    {
                        n.nodeLinks[3] = nodesCache[i + nodesXCount] == null ? null : nodesCache[i + nodesXCount].GetComponent <TileNode>();
                    }
                    ;
                }
            }
        }

        //=== link nodes with their neighbours (square tile pattern with 8 neighbours)
        if (tilesLayout == TilesLayout.Square_8)
        {
            for (int y = 0; y < nodesYCount; y++)
            {
                for (int x = 0; x < nodesXCount; x++)
                {
                    i = y * nodesXCount + x;
                    if (nodesCache[i] == null)
                    {
                        nodes[i] = null; continue;
                    }

                    TileNode n = nodesCache[i].GetComponent <TileNode>();
                    nodes[i]    = n;                  // cache the component
                    n.nodeLinks = new TileNode[8] {
                        null, null, null, null, null, null, null, null
                    };

                    // link with previous node
                    if (x - 1 >= 0)
                    {
                        n.nodeLinks[0] = nodesCache[i - 1] == null ? null : nodesCache[i - 1].GetComponent <TileNode>();
                    }
                    // link with next node
                    if (x + 1 < nodesXCount)
                    {
                        n.nodeLinks[1] = nodesCache[i + 1] == null ? null : nodesCache[i + 1].GetComponent <TileNode>();
                    }

                    // link with nodes in previous row
                    if (y > 0)
                    {
                        // prev row, same column
                        n.nodeLinks[2] = nodesCache[i - nodesXCount] == null ? null : nodesCache[i - nodesXCount].GetComponent <TileNode>();
                        // prev row, prev column
                        if (x - 1 >= 0)
                        {
                            n.nodeLinks[4] = nodesCache[i - nodesXCount - 1] == null ? null : nodesCache[i - nodesXCount - 1].GetComponent <TileNode>();
                        }
                        // prev row, next column
                        if (x + 1 < nodesXCount)
                        {
                            n.nodeLinks[6] = nodesCache[i - nodesXCount + 1] == null ? null : nodesCache[i - nodesXCount + 1].GetComponent <TileNode>();
                        }
                    }

                    // link with nodes in next row
                    if (y + 1 < nodesYCount)
                    {
                        // next row, same column
                        n.nodeLinks[3] = nodesCache[i + nodesXCount] == null ? null : nodesCache[i + nodesXCount].GetComponent <TileNode>();
                        // prev row, prev column
                        if (x - 1 >= 0)
                        {
                            n.nodeLinks[5] = nodesCache[i + nodesXCount - 1] == null ? null : nodesCache[i + nodesXCount - 1].GetComponent <TileNode>();
                        }
                        // prev row, next column
                        if (x + 1 < nodesXCount)
                        {
                            n.nodeLinks[7] = nodesCache[i + nodesXCount + 1] == null ? null : nodesCache[i + nodesXCount + 1].GetComponent <TileNode>();
                        }
                    }
                }
            }
        }

        // === init forced links
        foreach (TileNode node in nodes)
        {
            if (node == null)
            {
                continue;
            }
            TNEForcedLink fl = node.gameObject.GetComponent <TNEForcedLink>();
            if (fl != null)
            {
                foreach (TileNode link in fl.links)
                {
                    if (link == null)
                    {
                        continue;
                    }

                    // check if node not allready linked
                    bool found = false;
                    foreach (TileNode n in node.nodeLinks)
                    {
                        if (n == link)
                        {
                            found = true; break;
                        }
                    }

                    // add if not found
                    if (!found)
                    {
                        // find a null spot to add it in
                        int addIdx = -1;
                        for (int k = 0; k < node.nodeLinks.Length; k++)
                        {
                            if (node.nodeLinks[k] == null)
                            {
                                addIdx = k; break;
                            }
                        }

                        if (addIdx >= 0)
                        {                               // found an open slot, add into it
                            node.nodeLinks[addIdx] = link;
                        }
                        else
                        {                               // no open slot, expand the array
                            TileNode[] temp = new TileNode[node.nodeLinks.Length];
                            node.nodeLinks.CopyTo(temp, 0);
                            node.nodeLinks = new TileNode[node.nodeLinks.Length + 1];
                            temp.CopyTo(node.nodeLinks, 0);
                            node.nodeLinks[node.nodeLinks.Length - 1] = link;
                        }
                    }
                }
            }
        }
    }