Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions TLM/TLM/Manager/Impl/OptionsManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace TrafficManager.Manager.Impl {
namespace TrafficManager.Manager.Impl {
using CSUtil.Commons;
using System;
using TrafficManager.API.Manager;
Expand All @@ -18,13 +18,31 @@ protected override void InternalPrintDebugInfo() {
Log.NotImpl("InternalPrintDebugInfo for OptionsManager");
}

/// <summary>
/// Converts value to SimulationAccuracy
/// </summary>
/// <param name="value">Old value</param>
/// <returns>SimulationAccuracy value</returns>
private static SimulationAccuracy ConvertToSimulationAccuracy(byte value) {
return SimulationAccuracy.MaxValue - value;
}

/// <summary>
/// Converts SimulationAccuracy to SimulationAccuracy
/// </summary>
/// <param name="value">SimulationAccuracy value</param>
/// <returns>byte representation of value (backward compatible)</returns>
private static byte ConvertFromSimulationAccuracy(SimulationAccuracy value) {
return (byte)(SimulationAccuracy.MaxValue - value);
}

public bool MayPublishSegmentChanges() {
return Options.instantEffects && !SerializableDataExtension.StateLoading;
}

public bool LoadData(byte[] data) {
if (data.Length >= 1) {
// Options.setSimAccuracy(data[0]);
OptionsGeneralTab.SetSimulationAccuracy(ConvertToSimulationAccuracy(data[0]));
}

if (data.Length >= 2) {
Expand Down Expand Up @@ -223,7 +241,7 @@ int LoadBool (int idx, ILegacySerializableOption opt) {

public byte[] SaveData(ref bool success) {
return new byte[] {
0, // Options.simAccuracy,
ConvertFromSimulationAccuracy(Options.simulationAccuracy),
0, // Options.laneChangingRandomization,
(byte)Options.recklessDrivers,
(byte)(Options.relaxedBusses ? 1 : 0),
Expand Down
19 changes: 11 additions & 8 deletions TLM/TLM/Manager/Impl/TrafficPriorityManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -456,14 +456,17 @@ public bool HasPriority(ushort vehicleId,
// }

// calculate approx. time after which the transit node will be reached
Vector3 targetToNode = transitNode.m_position - vehicle.GetLastFramePosition();
Vector3 targetVel = vehicle.GetLastFrameVelocity();
float targetSpeed = targetVel.magnitude;
float targetDistanceToTransitNode = targetToNode.magnitude;

float targetTimeToTransitNode = targetSpeed > 0
? targetDistanceToTransitNode / targetSpeed
: 0;
float targetTimeToTransitNode = float.NaN;
if (Options.simulationAccuracy >= SimulationAccuracy.High) {
Vector3 targetToNode = transitNode.m_position - vehicle.GetLastFramePosition();
Vector3 targetVel = vehicle.GetLastFrameVelocity();
float targetSpeed = targetVel.magnitude;
float targetDistanceToTransitNode = targetToNode.magnitude;

targetTimeToTransitNode = targetSpeed > 0
? targetDistanceToTransitNode / targetSpeed
: 0;
}

Log._DebugIf(
logPriority,
Expand Down
75 changes: 44 additions & 31 deletions TLM/TLM/Manager/Impl/VehicleBehaviorManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1544,48 +1544,61 @@ ref segEndMan.ExtSegmentEnds[segEndMan.GetIndex(prevPos.m_segment, isTargetStart
}

if (sqrVelocity <= GlobalConfig.Instance.PriorityRules.MaxYieldVelocity
* GlobalConfig.Instance.PriorityRules.MaxYieldVelocity) {
* GlobalConfig.Instance.PriorityRules.MaxYieldVelocity ||
Options.simulationAccuracy >= SimulationAccuracy.Medium) {
if (logPriority) {
Log._Debug(
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
$"{sign} sign. waittime={extVehicle.waitTime}");
}

if (extVehicle.waitTime < GlobalConfig.Instance.PriorityRules.MaxPriorityWaitTime)
{
if (extVehicle.waitTime <
GlobalConfig.Instance.PriorityRules.MaxPriorityWaitTime) {
extVehicle.waitTime++;

Log._DebugIf(
logPriority,
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to STOP (wait)");

bool hasPriority = prioMan.HasPriority(
frontVehicleId,
ref vehicleData,
ref prevPos,
ref segEndMan.ExtSegmentEnds[
segEndMan.GetIndex(prevPos.m_segment, isTargetStartNode)],
targetNodeId,
isTargetStartNode,
ref position,
ref targetNode);
if (extVehicle.waitTime >= 2) {
//skip checking of priority if simAccuracy on lowest settings
if (Options.simulationAccuracy <= SimulationAccuracy.VeryLow) {
return VehicleJunctionTransitState.Leave;
}

Log._DebugIf(
logPriority,
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
$"hasPriority: {hasPriority}");
Log._DebugIf(
logPriority,
() =>
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to STOP (wait)");

bool hasPriority = prioMan.HasPriority(
frontVehicleId,
ref vehicleData,
ref prevPos,
ref segEndMan.ExtSegmentEnds[
segEndMan.GetIndex(
prevPos.m_segment,
isTargetStartNode)],
targetNodeId,
isTargetStartNode,
ref position,
ref targetNode);

Log._DebugIf(
logPriority,
() =>
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
$"hasPriority: {hasPriority}");

if (!hasPriority) {
vehicleData.m_blockCounter = 0;
return VehicleJunctionTransitState.Stop;
}

if (!hasPriority) {
vehicleData.m_blockCounter = 0;
return VehicleJunctionTransitState.Stop;
Log._DebugIf(
logPriority,
() =>
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to LEAVE (no conflicting cars)");
return VehicleJunctionTransitState.Leave;
}

Log._DebugIf(
logPriority,
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
"Setting JunctionTransitState to LEAVE (no conflicting cars)");
return VehicleJunctionTransitState.Leave;
}

Log._DebugIf(
Expand Down
38 changes: 35 additions & 3 deletions TLM/TLM/Patch/_RoadBaseAI/SegmentSimulationStepPatch.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
namespace TrafficManager.Patch._RoadBaseAI {
using API.Traffic.Enums;
using ColossalFramework;
using JetBrains.Annotations;
using TrafficManager.State;
using CSUtil.Commons.Benchmark;


// [Harmony] Manually patched because struct references are used
public class SegmentSimulationStepPatch {

private static ushort lastSimulatedSegmentId = 0;
private static byte trafficMeasurementMod = 0;

/// <summary>
/// Updates lane arrows and performs traffic measurement on segment.
/// </summary>
Expand All @@ -24,9 +31,34 @@ public static void Prefix(RoadBaseAI __instance, ushort segmentID, ref NetSegmen

// ↑↑↑↑
// TODO check if this is required *END*
Constants.ManagerFactory.TrafficMeasurementManager.OnBeforeSimulationStep(
segmentID,
ref data);
#if BENCHMARK
using (Benchmark.MaybeCreateBenchmark(null, "Traffic-measurement")) {
#endif
if (segmentID < lastSimulatedSegmentId) {
// segment simulation restart
++trafficMeasurementMod;
if (trafficMeasurementMod >= 4)
trafficMeasurementMod = 0;
}

lastSimulatedSegmentId = segmentID;

bool doTrafficMeasurement = true;
if (Options.simulationAccuracy == SimulationAccuracy.High ||
Options.simulationAccuracy == SimulationAccuracy.Medium) {
doTrafficMeasurement = (segmentID & 1) == trafficMeasurementMod;
} else if (Options.simulationAccuracy <= SimulationAccuracy.Low) {
doTrafficMeasurement = (segmentID & 3) == trafficMeasurementMod;
}

if (doTrafficMeasurement) {
Constants.ManagerFactory.TrafficMeasurementManager.OnBeforeSimulationStep(
segmentID,
ref data);
}
#if BENCHMARK
}
#endif
}
}
}
Loading