1- #define MARKCONGESTEDSEGMENTSx
1+ #define MARKCONGESTEDSEGMENTS
22#define ABSDENSITY
33#define RELDENSITYx
44
@@ -25,7 +25,7 @@ class CustomRoadAI : RoadBaseAI {
2525 public static uint [ ] [ ] maxLaneDensities ;
2626#endif
2727
28- public static byte [ ] [ ] laneMeanSpeeds ;
28+ public static ushort [ ] [ ] laneMeanSpeeds ; // per ten thousands
2929#if RELDENSITY
3030 public static byte [ ] [ ] laneMeanRelDensities ;
3131#endif
@@ -142,12 +142,15 @@ public void CustomSegmentSimulationStep(ushort segmentID, ref NetSegment data) {
142142#endif
143143 currentLaneSpeeds [ segmentID ] = new uint [ numLanes ] ;
144144 currentLaneDensities [ segmentID ] = new uint [ numLanes ] ;
145- laneMeanSpeeds [ segmentID ] = new byte [ numLanes ] ;
145+ laneMeanSpeeds [ segmentID ] = new ushort [ numLanes ] ;
146146#if RELDENSITY
147147 laneMeanRelDensities [ segmentID ] = new byte [ numLanes ] ;
148148#endif
149149#if ABSDENSITY
150150 laneMeanAbsDensities [ segmentID ] = new byte [ numLanes ] ;
151+
152+ for ( int i = 0 ; i < numLanes ; ++ i )
153+ laneMeanSpeeds [ segmentID ] [ i ] = 5000 ;
151154#endif
152155 }
153156
@@ -183,36 +186,30 @@ public void CustomSegmentSimulationStep(ushort segmentID, ref NetSegment data) {
183186 //currentMeanDensity = (byte)Math.Min(100u, (uint)((currentDensities * 100u) / Math.Max(1u, maxDens))); // 0 .. 100
184187
185188 //byte currentMeanSpeed = (byte)(InStartupPhase ? 10 : 100);
186- byte currentMeanSpeed = 100 ;
189+ uint currentMeanSpeed = 10000 ;
187190 // we use integer division here because it's faster
188191 if ( currentBuf > 0 ) {
189192 uint currentSpeeds = currentLaneSpeeds [ segmentID ] [ laneIndex ] ;
190- currentMeanSpeed = ( byte ) Math . Min ( 100u , ( ( currentSpeeds * 100u ) / currentBuf ) / ( ( uint ) ( Math . Max ( SpeedLimitManager . Instance ( ) . GetLockFreeGameSpeedLimit ( segmentID , laneIndex , curLaneId , data . Info . m_lanes [ laneIndex ] ) * 8f , 1f ) ) ) ) ; // 0 .. 100 , m_speedLimit of highway is 2, actual max. vehicle speed on highway is 16, that's why we use x*8 == x<<3 (don't ask why CO uses different units for velocity)
193+ currentMeanSpeed = ( uint ) Math . Min ( 10000u , ( ( currentSpeeds * 10000 ) / currentBuf ) / ( ( uint ) ( Math . Max ( SpeedLimitManager . Instance ( ) . GetLockFreeGameSpeedLimit ( segmentID , laneIndex , curLaneId , data . Info . m_lanes [ laneIndex ] ) * 8f , 1f ) ) ) ) ; // 0 .. 10000 , m_speedLimit of highway is 2, actual max. vehicle speed on highway is 16, that's why we use x*8 == x<<3 (don't ask why CO uses different units for velocity)
191194 }
192195
196+ //laneMeanSpeeds[segmentID][laneIndex] = currentMeanSpeed;
197+ ushort previousMeanSpeed = laneMeanSpeeds [ segmentID ] [ laneIndex ] ;
198+ uint speedUpdateSmoothing = currentMeanSpeed > previousMeanSpeed ? ( uint ) Options . someValue19 : ( uint ) Options . someValue17 ;
199+ laneMeanSpeeds [ segmentID ] [ laneIndex ] = ( ushort ) Math . Max ( 0 , Math . Min ( ( ( uint ) previousMeanSpeed * speedUpdateSmoothing + ( uint ) currentMeanSpeed ) / ( speedUpdateSmoothing + 1 ) , 10000 ) ) ;
200+
193201#if MARKCONGESTEDSEGMENTS
194- if ( currentMeanSpeed <= 30 ) {
202+ if ( laneMeanSpeeds [ segmentID ] [ laneIndex ] <= 6000 ) { // <= 60 %
195203 setCongested = true ;
196- } else if ( currentMeanSpeed >= 60 ) {
204+ } else if ( currentMeanSpeed >= 7000 ) { // >= 70 %
197205 unsetCongested = true ;
198206 }
199207#endif
200208
201- /*if (segmentID == 22980) {
202- Log._Debug($"Lane {curLaneId}: currentMeanSpeed={currentMeanSpeed} currentMeanDensity={currentMeanDensity}");
203- }*/
204-
205- //laneMeanSpeeds[segmentID][laneIndex] = currentMeanSpeed;
206- byte previousMeanSpeed = laneMeanSpeeds [ segmentID ] [ laneIndex ] ;
207- if ( currentMeanSpeed > previousMeanSpeed )
208- laneMeanSpeeds [ segmentID ] [ laneIndex ] = ( byte ) Math . Min ( ( int ) previousMeanSpeed + 10 , 100 ) ;
209- else if ( currentMeanSpeed == 0 || currentMeanSpeed < previousMeanSpeed )
210- laneMeanSpeeds [ segmentID ] [ laneIndex ] = ( byte ) Math . Max ( ( int ) previousMeanSpeed - 10 , 0 ) ;
211-
212209#if ABSDENSITY
213210
214211 if ( maxLaneDensity > 0 )
215- laneMeanAbsDensities [ segmentID ] [ laneIndex ] = ( byte ) ( ( Math . Min ( currentDensity * 100 / maxLaneDensity , 100 ) + laneMeanAbsDensities [ segmentID ] [ laneIndex ] * ( uint ) Options . someValue9 ) / ( ( uint ) Options . someValue9 + 1 ) ) ;
212+ laneMeanAbsDensities [ segmentID ] [ laneIndex ] = ( byte ) Math . Min ( currentDensity * 100 / maxLaneDensity , 100 ) ;
216213 else
217214 laneMeanAbsDensities [ segmentID ] [ laneIndex ] /= ( byte ) Options . someValue8 ;
218215#endif
@@ -986,7 +983,7 @@ internal static void OnBeforeLoadData() {
986983#endif
987984 currentLaneSpeeds = new uint [ NetManager . MAX_SEGMENT_COUNT ] [ ] ;
988985 currentLaneDensities = new uint [ NetManager . MAX_SEGMENT_COUNT ] [ ] ;
989- laneMeanSpeeds = new byte [ NetManager . MAX_SEGMENT_COUNT ] [ ] ;
986+ laneMeanSpeeds = new ushort [ NetManager . MAX_SEGMENT_COUNT ] [ ] ;
990987#if RELDENSITY
991988 laneMeanRelDensities = new byte [ NetManager . MAX_SEGMENT_COUNT ] [ ] ;
992989#endif
@@ -1006,7 +1003,7 @@ internal static void resetTrafficStats() {
10061003 for ( ushort i = 0 ; i < NetManager . MAX_SEGMENT_COUNT ; ++ i ) {
10071004 if ( currentLaneTrafficBuffer [ i ] != null ) {
10081005 for ( int k = 0 ; k < currentLaneTrafficBuffer [ i ] . Length ; ++ k ) {
1009- laneMeanSpeeds [ i ] [ k ] = 50 ;
1006+ laneMeanSpeeds [ i ] [ k ] = 10000 ;
10101007 currentLaneTrafficBuffer [ i ] [ k ] = 0 ;
10111008#if ABSDENSITY
10121009 maxLaneDensities [ i ] [ k ] = 0 ;
0 commit comments