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)); }
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();
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); }
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); }
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); }
public bool ToggleTrafficLight(ushort nodeId, ref NetNode node, out ToggleTrafficLightError reason) { return(SetTrafficLight(nodeId, !HasTrafficLight(nodeId, ref node), ref node, out reason)); }
public bool RemoveTrafficLight(ushort nodeId, ref NetNode node, out ToggleTrafficLightError reason) { return(SetTrafficLight(nodeId, false, ref node, out reason)); }
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); }