13
13
using CSUtil . Commons ;
14
14
using TrafficManager . Manager . Impl ;
15
15
using ColossalFramework . Math ;
16
+ using TrafficManager . State . ConfigData ;
17
+ using TrafficManager . Util ;
16
18
17
19
namespace TrafficManager . Traffic . Data {
18
20
public struct VehicleState {
@@ -94,6 +96,14 @@ public float Velocity {
94
96
public byte timedRand ;
95
97
private VehicleJunctionTransitState junctionTransitState ;
96
98
99
+ // Dynamic Lane Selection
100
+ public float maxReservedSpace ;
101
+ public float laneSpeedRandInterval ;
102
+ public int maxOptLaneChanges ;
103
+ public float maxUnsafeSpeedDiff ;
104
+ public float minSafeSpeedImprovement ;
105
+ public float minSafeTrafficImprovement ;
106
+
97
107
public override string ToString ( ) {
98
108
return $ "[VehicleState\n " +
99
109
"\t " + $ "vehicleId = { vehicleId } \n " +
@@ -121,6 +131,12 @@ public override string ToString() {
121
131
"\t " + $ "lastAltLaneSelSegmentId = { lastAltLaneSelSegmentId } \n " +
122
132
"\t " + $ "junctionTransitState = { junctionTransitState } \n " +
123
133
"\t " + $ "timedRand = { timedRand } \n " +
134
+ "\t " + $ "maxReservedSpace = { maxReservedSpace } \n " +
135
+ "\t " + $ "laneSpeedRandInterval = { laneSpeedRandInterval } \n " +
136
+ "\t " + $ "maxOptLaneChanges = { maxOptLaneChanges } \n " +
137
+ "\t " + $ "maxUnsafeSpeedDiff = { maxUnsafeSpeedDiff } \n " +
138
+ "\t " + $ "minSafeSpeedImprovement = { minSafeSpeedImprovement } \n " +
139
+ "\t " + $ "minSafeTrafficImprovement = { minSafeTrafficImprovement } \n " +
124
140
"VehicleState]" ;
125
141
}
126
142
@@ -149,6 +165,12 @@ internal VehicleState(ushort vehicleId) {
149
165
lastAltLaneSelSegmentId = 0 ;
150
166
junctionTransitState = VehicleJunctionTransitState . None ;
151
167
timedRand = 0 ;
168
+ maxReservedSpace = 0 ;
169
+ laneSpeedRandInterval = 0 ;
170
+ maxOptLaneChanges = 0 ;
171
+ maxUnsafeSpeedDiff = 0 ;
172
+ minSafeSpeedImprovement = 0 ;
173
+ minSafeTrafficImprovement = 0 ;
152
174
}
153
175
154
176
/*private void Reset(bool unlink=true) { // TODO this is called in wrong places!
@@ -273,6 +295,7 @@ internal ExtVehicleType OnStartPathFind(ref Vehicle vehicleData, ExtVehicleType?
273
295
}
274
296
275
297
recklessDriver = Constants . ManagerFactory . VehicleBehaviorManager . IsRecklessDriver ( vehicleId , ref vehicleData ) ;
298
+ UpdateTimedRandValues ( ) ;
276
299
277
300
#if DEBUG
278
301
if ( GlobalConfig . Instance . Debug . Switches [ 9 ] )
@@ -303,7 +326,9 @@ internal void OnSpawn(ref Vehicle vehicleData) {
303
326
lastPathId = 0 ;
304
327
lastPathPositionIndex = 0 ;
305
328
lastAltLaneSelSegmentId = 0 ;
329
+
306
330
recklessDriver = Constants . ManagerFactory . VehicleBehaviorManager . IsRecklessDriver ( vehicleId , ref vehicleData ) ;
331
+ UpdateTimedRandValues ( ) ;
307
332
308
333
try {
309
334
totalLength = vehicleData . CalculateTotalLength ( vehicleId ) ;
@@ -460,6 +485,12 @@ internal void OnRelease(ref Vehicle vehicleData) {
460
485
lastAltLaneSelSegmentId = 0 ;
461
486
junctionTransitState = VehicleJunctionTransitState . None ;
462
487
recklessDriver = false ;
488
+ maxReservedSpace = 0 ;
489
+ laneSpeedRandInterval = 0 ;
490
+ maxOptLaneChanges = 0 ;
491
+ maxUnsafeSpeedDiff = 0 ;
492
+ minSafeSpeedImprovement = 0 ;
493
+ minSafeTrafficImprovement = 0 ;
463
494
464
495
#if DEBUG
465
496
if ( GlobalConfig . Instance . Debug . Switches [ 9 ] )
@@ -480,9 +511,23 @@ public void StepRand() {
480
511
Randomizer rand = Constants . ServiceFactory . SimulationService . Randomizer ;
481
512
if ( rand . UInt32 ( 20 ) == 0 ) {
482
513
timedRand = ( byte ) ( ( ( uint ) timedRand + rand . UInt32 ( 25 ) ) % MAX_TIMED_RAND ) ;
514
+ UpdateTimedRandValues ( ) ;
483
515
}
484
516
}
485
517
518
+ private void UpdateTimedRandValues ( ) {
519
+ Randomizer rand = Constants . ServiceFactory . SimulationService . Randomizer ;
520
+ DynamicLaneSelection dls = GlobalConfig . Instance . DynamicLaneSelection ;
521
+ maxReservedSpace = recklessDriver
522
+ ? MathUtil . RandomizeFloat ( rand , dls . MinMaxRecklessReservedSpace , dls . MaxMaxRecklessReservedSpace )
523
+ : MathUtil . RandomizeFloat ( rand , dls . MinMaxReservedSpace , dls . MaxMaxReservedSpace ) ;
524
+ laneSpeedRandInterval = MathUtil . RandomizeFloat ( rand , dls . MinLaneSpeedRandInterval , dls . MaxLaneSpeedRandInterval ) ;
525
+ maxOptLaneChanges = rand . Int32 ( dls . MinMaxOptLaneChanges , dls . MaxMaxOptLaneChanges + 1 ) ;
526
+ maxUnsafeSpeedDiff = MathUtil . RandomizeFloat ( rand , dls . MinMaxUnsafeSpeedDiff , dls . MaxMaxOptLaneChanges ) ;
527
+ minSafeSpeedImprovement = MathUtil . RandomizeFloat ( rand , dls . MinMinSafeSpeedImprovement , dls . MaxMinSafeSpeedImprovement ) ;
528
+ minSafeTrafficImprovement = MathUtil . RandomizeFloat ( rand , dls . MinMinSafeTrafficImprovement , dls . MaxMinSafeTrafficImprovement ) ;
529
+ }
530
+
486
531
private static ushort GetTransitNodeId ( ref PathUnit . Position curPos , ref PathUnit . Position nextPos ) {
487
532
bool startNode = IsTransitNodeCurStartNode ( ref curPos , ref nextPos ) ;
488
533
ushort transitNodeId1 = 0 ;
0 commit comments