Skip to content

Commit 5c52cff

Browse files
authored
Merge pull request #742 from CitiesSkylinesMods/707-reimplement-sim-accuracy
Reintroduced Simulation Accuracy option
2 parents 4b1e4db + e43d705 commit 5c52cff

File tree

17 files changed

+260
-113
lines changed

17 files changed

+260
-113
lines changed

TLM/TLM/Manager/Impl/OptionsManager.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace TrafficManager.Manager.Impl {
1+
namespace TrafficManager.Manager.Impl {
22
using CSUtil.Commons;
33
using System;
44
using TrafficManager.API.Manager;
@@ -18,13 +18,31 @@ protected override void InternalPrintDebugInfo() {
1818
Log.NotImpl("InternalPrintDebugInfo for OptionsManager");
1919
}
2020

21+
/// <summary>
22+
/// Converts value to SimulationAccuracy
23+
/// </summary>
24+
/// <param name="value">Old value</param>
25+
/// <returns>SimulationAccuracy value</returns>
26+
private static SimulationAccuracy ConvertToSimulationAccuracy(byte value) {
27+
return SimulationAccuracy.MaxValue - value;
28+
}
29+
30+
/// <summary>
31+
/// Converts SimulationAccuracy to SimulationAccuracy
32+
/// </summary>
33+
/// <param name="value">SimulationAccuracy value</param>
34+
/// <returns>byte representation of value (backward compatible)</returns>
35+
private static byte ConvertFromSimulationAccuracy(SimulationAccuracy value) {
36+
return (byte)(SimulationAccuracy.MaxValue - value);
37+
}
38+
2139
public bool MayPublishSegmentChanges() {
2240
return Options.instantEffects && !SerializableDataExtension.StateLoading;
2341
}
2442

2543
public bool LoadData(byte[] data) {
2644
if (data.Length >= 1) {
27-
// Options.setSimAccuracy(data[0]);
45+
OptionsGeneralTab.SetSimulationAccuracy(ConvertToSimulationAccuracy(data[0]));
2846
}
2947

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

224242
public byte[] SaveData(ref bool success) {
225243
return new byte[] {
226-
0, // Options.simAccuracy,
244+
ConvertFromSimulationAccuracy(Options.simulationAccuracy),
227245
0, // Options.laneChangingRandomization,
228246
(byte)Options.recklessDrivers,
229247
(byte)(Options.relaxedBusses ? 1 : 0),

TLM/TLM/Manager/Impl/TrafficPriorityManager.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -456,14 +456,17 @@ public bool HasPriority(ushort vehicleId,
456456
// }
457457

458458
// calculate approx. time after which the transit node will be reached
459-
Vector3 targetToNode = transitNode.m_position - vehicle.GetLastFramePosition();
460-
Vector3 targetVel = vehicle.GetLastFrameVelocity();
461-
float targetSpeed = targetVel.magnitude;
462-
float targetDistanceToTransitNode = targetToNode.magnitude;
463-
464-
float targetTimeToTransitNode = targetSpeed > 0
465-
? targetDistanceToTransitNode / targetSpeed
466-
: 0;
459+
float targetTimeToTransitNode = float.NaN;
460+
if (Options.simulationAccuracy >= SimulationAccuracy.High) {
461+
Vector3 targetToNode = transitNode.m_position - vehicle.GetLastFramePosition();
462+
Vector3 targetVel = vehicle.GetLastFrameVelocity();
463+
float targetSpeed = targetVel.magnitude;
464+
float targetDistanceToTransitNode = targetToNode.magnitude;
465+
466+
targetTimeToTransitNode = targetSpeed > 0
467+
? targetDistanceToTransitNode / targetSpeed
468+
: 0;
469+
}
467470

468471
Log._DebugIf(
469472
logPriority,

TLM/TLM/Manager/Impl/VehicleBehaviorManager.cs

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,48 +1544,61 @@ ref segEndMan.ExtSegmentEnds[segEndMan.GetIndex(prevPos.m_segment, isTargetStart
15441544
}
15451545

15461546
if (sqrVelocity <= GlobalConfig.Instance.PriorityRules.MaxYieldVelocity
1547-
* GlobalConfig.Instance.PriorityRules.MaxYieldVelocity) {
1547+
* GlobalConfig.Instance.PriorityRules.MaxYieldVelocity ||
1548+
Options.simulationAccuracy >= SimulationAccuracy.Medium) {
15481549
if (logPriority) {
15491550
Log._Debug(
15501551
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
15511552
$"{sign} sign. waittime={extVehicle.waitTime}");
15521553
}
15531554

1554-
if (extVehicle.waitTime < GlobalConfig.Instance.PriorityRules.MaxPriorityWaitTime)
1555-
{
1555+
if (extVehicle.waitTime <
1556+
GlobalConfig.Instance.PriorityRules.MaxPriorityWaitTime) {
15561557
extVehicle.waitTime++;
15571558

1558-
Log._DebugIf(
1559-
logPriority,
1560-
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
1561-
"Setting JunctionTransitState to STOP (wait)");
1562-
1563-
bool hasPriority = prioMan.HasPriority(
1564-
frontVehicleId,
1565-
ref vehicleData,
1566-
ref prevPos,
1567-
ref segEndMan.ExtSegmentEnds[
1568-
segEndMan.GetIndex(prevPos.m_segment, isTargetStartNode)],
1569-
targetNodeId,
1570-
isTargetStartNode,
1571-
ref position,
1572-
ref targetNode);
1559+
if (extVehicle.waitTime >= 2) {
1560+
//skip checking of priority if simAccuracy on lowest settings
1561+
if (Options.simulationAccuracy <= SimulationAccuracy.VeryLow) {
1562+
return VehicleJunctionTransitState.Leave;
1563+
}
15731564

1574-
Log._DebugIf(
1575-
logPriority,
1576-
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
1577-
$"hasPriority: {hasPriority}");
1565+
Log._DebugIf(
1566+
logPriority,
1567+
() =>
1568+
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
1569+
"Setting JunctionTransitState to STOP (wait)");
1570+
1571+
bool hasPriority = prioMan.HasPriority(
1572+
frontVehicleId,
1573+
ref vehicleData,
1574+
ref prevPos,
1575+
ref segEndMan.ExtSegmentEnds[
1576+
segEndMan.GetIndex(
1577+
prevPos.m_segment,
1578+
isTargetStartNode)],
1579+
targetNodeId,
1580+
isTargetStartNode,
1581+
ref position,
1582+
ref targetNode);
1583+
1584+
Log._DebugIf(
1585+
logPriority,
1586+
() =>
1587+
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
1588+
$"hasPriority: {hasPriority}");
1589+
1590+
if (!hasPriority) {
1591+
vehicleData.m_blockCounter = 0;
1592+
return VehicleJunctionTransitState.Stop;
1593+
}
15781594

1579-
if (!hasPriority) {
1580-
vehicleData.m_blockCounter = 0;
1581-
return VehicleJunctionTransitState.Stop;
1595+
Log._DebugIf(
1596+
logPriority,
1597+
() =>
1598+
$"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
1599+
"Setting JunctionTransitState to LEAVE (no conflicting cars)");
1600+
return VehicleJunctionTransitState.Leave;
15821601
}
1583-
1584-
Log._DebugIf(
1585-
logPriority,
1586-
() => $"VehicleBehaviorManager.MayChangeSegment({frontVehicleId}): " +
1587-
"Setting JunctionTransitState to LEAVE (no conflicting cars)");
1588-
return VehicleJunctionTransitState.Leave;
15891602
}
15901603

15911604
Log._DebugIf(

TLM/TLM/Patch/_RoadBaseAI/SegmentSimulationStepPatch.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
namespace TrafficManager.Patch._RoadBaseAI {
2+
using API.Traffic.Enums;
23
using ColossalFramework;
34
using JetBrains.Annotations;
45
using TrafficManager.State;
6+
using CSUtil.Commons.Benchmark;
7+
58

69
// [Harmony] Manually patched because struct references are used
710
public class SegmentSimulationStepPatch {
11+
12+
private static ushort lastSimulatedSegmentId = 0;
13+
private static byte trafficMeasurementMod = 0;
14+
815
/// <summary>
916
/// Updates lane arrows and performs traffic measurement on segment.
1017
/// </summary>
@@ -24,9 +31,34 @@ public static void Prefix(RoadBaseAI __instance, ushort segmentID, ref NetSegmen
2431

2532
// ↑↑↑↑
2633
// TODO check if this is required *END*
27-
Constants.ManagerFactory.TrafficMeasurementManager.OnBeforeSimulationStep(
28-
segmentID,
29-
ref data);
34+
#if BENCHMARK
35+
using (Benchmark.MaybeCreateBenchmark(null, "Traffic-measurement")) {
36+
#endif
37+
if (segmentID < lastSimulatedSegmentId) {
38+
// segment simulation restart
39+
++trafficMeasurementMod;
40+
if (trafficMeasurementMod >= 4)
41+
trafficMeasurementMod = 0;
42+
}
43+
44+
lastSimulatedSegmentId = segmentID;
45+
46+
bool doTrafficMeasurement = true;
47+
if (Options.simulationAccuracy == SimulationAccuracy.High ||
48+
Options.simulationAccuracy == SimulationAccuracy.Medium) {
49+
doTrafficMeasurement = (segmentID & 1) == trafficMeasurementMod;
50+
} else if (Options.simulationAccuracy <= SimulationAccuracy.Low) {
51+
doTrafficMeasurement = (segmentID & 3) == trafficMeasurementMod;
52+
}
53+
54+
if (doTrafficMeasurement) {
55+
Constants.ManagerFactory.TrafficMeasurementManager.OnBeforeSimulationStep(
56+
segmentID,
57+
ref data);
58+
}
59+
#if BENCHMARK
60+
}
61+
#endif
3062
}
3163
}
3264
}

0 commit comments

Comments
 (0)