Пример #1
0
    public TrafficSystemNode GetNextNode(TrafficSystemVehicle a_vehicle, bool a_checkLocalConnectedNode = true, List <TrafficSystemNode> a_blockedNodes = null)
    {
        if (m_connectedNodes.Count <= 0 && !m_connectedLocalNode && m_connectedChangeLaneNodes.Count <= 0)
        {
            return(null);
        }

        if (a_checkLocalConnectedNode && m_connectedLocalNode)
        {
            return(m_connectedLocalNode);
        }

        float randomChanceUseOfframp  = Random.Range(0.0f, 1.0f);
        float randomChanceOfDirChange = Random.Range(0.0f, 1.0f);

        if (m_connectedChangeLaneNodes.Count > 0)
        {
            if (randomChanceOfDirChange <= a_vehicle.m_chanceOfDirChange)
            {
                TrafficSystemNode node = GetRandomChangeLangeNode();

                if (node)
                {
                    return(node);
                }
            }
            else if (m_connectedNodes.Count <= 0 && !m_connectedLocalNode)
            {
                TrafficSystemNode node = GetRandomChangeLangeNode();

                if (node)
                {
                    return(node);
                }
            }
        }

        TrafficSystemNode offrampNode = null;

        for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
        {
            TrafficSystemNode node = m_connectedNodes[nIndex];
            if (node && node.m_roadType == TrafficSystem.RoadType.OFFRAMP)
            {
                offrampNode = node;
                break;
            }
        }

        if (a_vehicle.m_randomLaneChange > 0.0f && m_connectedNodes.Count > 1)
        {
            float randomChance = Random.Range(0.0f, 1.0f);

            if (randomChance <= a_vehicle.m_randomLaneChange)
            {
                List <int> nodeIndex = new List <int>(m_connectedNodes.Count);
                for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
                {
                    nodeIndex.Insert(nIndex, nIndex);
                }

                TrafficSystemNode sameLaneNode = null;
                int count = 0;
                while (count < m_connectedNodes.Count)
                {
                    int nIndex = Random.Range(0, nodeIndex.Count);
                    int lIndex = nodeIndex[nIndex];

                    TrafficSystemNode node = m_connectedNodes[lIndex];

                    if (node)
                    {
                        bool blockNode = false;
                        if (a_blockedNodes != null)
                        {
                            for (int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                            {
                                if (node == a_blockedNodes[cIndex])
                                {
                                    blockNode = true;
                                    break;
                                }
                            }
                        }

                        if (!blockNode)
                        {
                            if (node.m_lane != m_lane || (node.m_lane == m_lane && node.m_roadType == TrafficSystem.RoadType.OFFRAMP))
                            {
                                return(node);
                            }
                            else
                            {
                                sameLaneNode = node;
                            }
                        }
                    }

                    nodeIndex.Remove(nIndex);
                    count++;
                }

                if (sameLaneNode)
                {
                    return(sameLaneNode);
                }
            }
            else
            {
                for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
                {
                    TrafficSystemNode node = m_connectedNodes[nIndex];

                    if (node && node.m_lane == m_lane)
                    {
                        bool blockNode = false;
                        if (a_blockedNodes != null)
                        {
                            for (int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                            {
                                if (node == a_blockedNodes[cIndex])
                                {
                                    blockNode = true;
                                    break;
                                }
                            }
                        }

                        if (!blockNode)
                        {
                            if (randomChanceUseOfframp <= a_vehicle.m_chanceOfUsingOfframp)
                            {
                                if (offrampNode)
                                {
                                    return(offrampNode);
                                }
                            }
                            else if (node.IsNormalRoad())
                            {
                                return(node);
                            }
                        }
                    }
                }
            }
        }

        TrafficSystemNode nextNodeInOurLane    = null;
        TrafficSystemNode nextNodeNotInOurLane = null;

        for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
        {
            TrafficSystemNode node = m_connectedNodes[nIndex];

            if (node)
            {
                bool blockNode = false;
                if (a_blockedNodes != null && m_connectedNodes.Count > 1)
                {
                    for (int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                    {
                        if (node == a_blockedNodes[cIndex])
                        {
                            blockNode = true;
                            break;
                        }
                    }
                }

                if (!blockNode)
                {
                    if (node.m_lane == m_lane)
                    {
                        if (randomChanceUseOfframp <= a_vehicle.m_chanceOfUsingOfframp)
                        {
                            if (offrampNode)
                            {
                                return(offrampNode);
                            }
                            else if (node.IsNormalRoad())
                            {
                                return(node);
                            }
                            else
                            {
                                nextNodeInOurLane = node;
                            }
                        }
                        else if (node.IsNormalRoad())
                        {
                            return(node);
                        }
                        else
                        {
                            nextNodeNotInOurLane = node;
                        }
                    }
                    else
                    {
                        nextNodeNotInOurLane = node;
                    }
                }
            }
        }

        if (nextNodeInOurLane)
        {
            return(nextNodeInOurLane);
        }
        else
        {
            return(nextNodeNotInOurLane);
        }
    }