Esempio n. 1
0
 public bool AddTrafficLight(ushort nodeId,
                             ref NetNode node,
                             out ToggleTrafficLightError reason)
 {
     TrafficPriorityManager.Instance.RemovePrioritySignsFromNode(nodeId);
     return(SetTrafficLight(nodeId, true, ref node, out reason));
 }
        public static bool Prefix(ref bool __result, ushort nodeId, ref ToggleTrafficLightError reason)
        {
            var nodeData = NodeManager.Instance.buffer[nodeId];

            return(PrefixUtils.HandleTernaryBool(
                       nodeData?.CanHaveTrafficLights(out reason),
                       ref __result));
        }
Esempio n. 3
0
        public bool CanToggleTrafficLight(ushort nodeId,
                                          bool flag, // override?
                                          ref NetNode node,
                                          out ToggleTrafficLightError reason)
        {
#if DEBUG
            bool logTrafficLights = DebugSwitch.TimedTrafficLights.Get() && DebugSettings.NodeId == nodeId;
#else
            const bool logTrafficLights = false;
#endif
            ref NetNode netNode = ref nodeId.ToNode();
Esempio n. 4
0
        public bool CanEnableTrafficLight(ushort nodeId,
                                          ref NetNode node,
                                          out ToggleTrafficLightError reason)
        {
            var ret = CanToggleTrafficLight(nodeId, true, ref node, out reason);

            if (!ret && reason == ToggleTrafficLightError.HasTimedLight)
            {
                reason = ToggleTrafficLightError.None;
                return(true);
            }

            return(ret);
        }
Esempio n. 5
0
        public bool SetTrafficLight(ushort nodeId,
                                    bool flag,
                                    ref NetNode node,
                                    out ToggleTrafficLightError reason)
        {
#if DEBUG
            bool logTrafficLights = DebugSwitch.TimedTrafficLights.Get() &&
                                    DebugSettings.NodeId == nodeId;
#else
            const bool logTrafficLights = false;
#endif
            if (logTrafficLights)
            {
                Log._Debug($"TrafficLightManager.SetTrafficLight: called for node {nodeId}, flag={flag}");
            }

            if (!CanToggleTrafficLight(nodeId, flag, ref node, out reason))
            {
                if (logTrafficLights)
                {
                    Log._Debug($"TrafficLightManager.SetTrafficLight: Traffic light @ {nodeId} is not toggleable");
                }

                if (reason != ToggleTrafficLightError.HasTimedLight || !flag)
                {
                    if (logTrafficLights)
                    {
                        Log._Debug("TrafficLightManager.SetTrafficLight: ... but has timed light " +
                                   "and we want to enable it");
                    }

                    return(false);
                }
            }

            NetNode.Flags flags = node.m_flags | NetNode.Flags.CustomTrafficLights;
            if (flag)
            {
                if (logTrafficLights)
                {
                    Log._Debug($"Adding traffic light @ node {nodeId}");
                }

                flags |= NetNode.Flags.TrafficLights;
                TrafficPriorityManager.Instance.RemovePrioritySignsFromNode(nodeId);
            }
            else
            {
                if (logTrafficLights)
                {
                    Log._Debug($"Removing traffic light @ node {nodeId}");
                }

                flags &= ~NetNode.Flags.TrafficLights;
            }

            if (logTrafficLights)
            {
                Log._Debug("TrafficLightManager.SetTrafficLight: Setting traffic light at " +
                           $"node {nodeId} -- flags={flags}");
            }

            node.m_flags = flags;
            Constants.ManagerFactory.GeometryManager.MarkAsUpdated(nodeId, true);
            return(true);
        }
Esempio n. 6
0
        public bool CanToggleTrafficLight(ushort nodeId,
                                          bool flag,
                                          ref NetNode node,
                                          out ToggleTrafficLightError reason)
        {
#if DEBUG
            bool logTrafficLights = DebugSwitch.TimedTrafficLights.Get() && DebugSettings.NodeId == nodeId;
#else
            const bool logTrafficLights = false;
#endif
            if (!flag && TrafficLightSimulationManager.Instance.HasTimedSimulation(nodeId))
            {
                reason = ToggleTrafficLightError.HasTimedLight;
                if (logTrafficLights)
                {
                    Log._Debug($"Cannot toggle traffic lights at node {nodeId}: Node has a timed traffic light");
                }

                return(false);
            }

            if (flag && !LogicUtil.CheckFlags(
                    (uint)node.m_flags,
                    (uint)(NetNode.Flags.Created | NetNode.Flags.Deleted | NetNode.Flags.Junction),
                    (uint)(NetNode.Flags.Created | NetNode.Flags.Junction)))
            {
                reason = ToggleTrafficLightError.NoJunction;

                if (logTrafficLights)
                {
                    Log._Debug($"Cannot toggle traffic lights at node {nodeId}: Node is not a junction");
                }

                return(false);
            }

            if (!flag && LogicUtil.CheckFlags(
                    (uint)node.m_flags,
                    (uint)NetNode.Flags.LevelCrossing,
                    (uint)NetNode.Flags.LevelCrossing))
            {
                reason = ToggleTrafficLightError.IsLevelCrossing;

                if (logTrafficLights)
                {
                    Log._Debug($"Cannot toggle traffic lights at node {nodeId}: Node is a level crossing");
                }

                return(false);
            }

            int numRoads          = 0;
            int numTrainTracks    = 0;
            int numMonorailTracks = 0;
            int numPedSegments    = 0;
            Services.NetService.IterateNodeSegments(
                nodeId,
                (ushort segmentId, ref NetSegment segment) => {
                NetInfo info = segment.Info;
                if (info.m_class.m_service == ItemClass.Service.Road)
                {
                    ++numRoads;
                }
                else if ((info.m_vehicleTypes & VehicleInfo.VehicleType.Train) !=
                         VehicleInfo.VehicleType.None)
                {
                    ++numTrainTracks;
                }
                else if ((info.m_vehicleTypes & VehicleInfo.VehicleType.Monorail) !=
                         VehicleInfo.VehicleType.None)
                {
                    ++numMonorailTracks;
                }

                if (info.m_hasPedestrianLanes)
                {
                    ++numPedSegments;
                }

                return(true);
            });

            if (numRoads >= 2 || numTrainTracks >= 2 || numMonorailTracks >= 2 || numPedSegments != 0)
            {
                if (logTrafficLights)
                {
                    Log._DebugFormat(
                        "Can toggle traffic lights at node {0}: numRoads={1} numTrainTracks={2} " +
                        "numMonorailTracks={3} numPedSegments={4}",
                        nodeId, numRoads, numTrainTracks, numMonorailTracks, numPedSegments);
                }

                reason = ToggleTrafficLightError.None;
                return(true);
            }

            if (logTrafficLights)
            {
                Log._DebugFormat(
                    "Cannot toggle traffic lights at node {0}: Insufficient segments. numRoads={1} " +
                    "numTrainTracks={2} numMonorailTracks={3} numPedSegments={4}",
                    nodeId, numRoads, numTrainTracks, numMonorailTracks, numPedSegments);
            }

            reason = ToggleTrafficLightError.InsufficientSegments;
            return(false);
        }
Esempio n. 7
0
 public bool ToggleTrafficLight(ushort nodeId, ref NetNode node, out ToggleTrafficLightError reason)
 {
     return(SetTrafficLight(nodeId, !HasTrafficLight(nodeId, ref node), ref node, out reason));
 }
Esempio n. 8
0
 public bool RemoveTrafficLight(ushort nodeId,
                                ref NetNode node,
                                out ToggleTrafficLightError reason)
 {
     return(SetTrafficLight(nodeId, false, ref node, out reason));
 }
Esempio n. 9
0
        public bool CanToggleTrafficLight(ushort nodeId,
                                          bool flag, // override?
                                          ref NetNode node,
                                          out ToggleTrafficLightError reason)
        {
#if DEBUG
            bool logTrafficLights = DebugSwitch.TimedTrafficLights.Get() && DebugSettings.NodeId == nodeId;
#else
            const bool logTrafficLights = false;
#endif
            if (!flag && TrafficLightSimulationManager.Instance.HasTimedSimulation(nodeId))
            {
                reason = ToggleTrafficLightError.HasTimedLight;
                if (logTrafficLights)
                {
                    Log._Debug($"Cannot toggle traffic lights at node {nodeId}: Node has a timed traffic light");
                }

                return(false);
            }

            if (flag &&
                (!Services.NetService.IsNodeValid(nodeId) ||
                 !Services.NetService.CheckNodeFlags(nodeId, NetNode.Flags.Junction)))
            {
                reason = ToggleTrafficLightError.NoJunction;

                if (logTrafficLights)
                {
                    Log._Debug($"Cannot toggle traffic lights at node {nodeId}: Node is not a junction");
                }

                return(false);
            }

            if (!flag && Services.NetService.CheckNodeFlags(nodeId, NetNode.Flags.LevelCrossing))
            {
                reason = ToggleTrafficLightError.IsLevelCrossing;

                if (logTrafficLights)
                {
                    Log._Debug($"Cannot toggle traffic lights at node {nodeId}: Node is a level crossing");
                }

                return(false);
            }

            int numRoads          = 0;
            int numTrainTracks    = 0;
            int numMonorailTracks = 0;
            int numPedSegments    = 0;

            for (int i = 0; i < 8; ++i)
            {
                ushort segmentId = node.GetSegment(i);
                if (segmentId != 0)
                {
                    NetInfo info = segmentId.ToSegment().Info;
                    if (info.m_class.m_service == ItemClass.Service.Road)
                    {
                        ++numRoads;
                    }
                    else if ((info.m_vehicleTypes & VehicleInfo.VehicleType.Train) !=
                             VehicleInfo.VehicleType.None)
                    {
                        ++numTrainTracks;
                    }
                    else if ((info.m_vehicleTypes & VehicleInfo.VehicleType.Monorail) !=
                             VehicleInfo.VehicleType.None)
                    {
                        ++numMonorailTracks;
                    }

                    if (info.m_hasPedestrianLanes)
                    {
                        ++numPedSegments;
                    }
                }
            }

            if (numRoads >= 2 || numTrainTracks >= 2 || numMonorailTracks >= 2 || numPedSegments != 0)
            {
                if (logTrafficLights)
                {
                    Log._DebugFormat(
                        "Can toggle traffic lights at node {0}: numRoads={1} numTrainTracks={2} " +
                        "numMonorailTracks={3} numPedSegments={4}",
                        nodeId,
                        numRoads,
                        numTrainTracks,
                        numMonorailTracks,
                        numPedSegments);
                }

                reason = ToggleTrafficLightError.None;
                return(true);
            }

            if (logTrafficLights)
            {
                Log._DebugFormat(
                    "Cannot toggle traffic lights at node {0}: Insufficient segments. numRoads={1} " +
                    "numTrainTracks={2} numMonorailTracks={3} numPedSegments={4}",
                    nodeId,
                    numRoads,
                    numTrainTracks,
                    numMonorailTracks,
                    numPedSegments);
            }

            reason = ToggleTrafficLightError.InsufficientSegments;
            return(false);
        }