From 971fcd352a872109a72c545cc9517c8980918b17 Mon Sep 17 00:00:00 2001 From: aura Date: Mon, 13 Jul 2026 19:57:37 +0200 Subject: add scaling rpm down when redline is hit below set point --- src/overlay.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 8 deletions(-) (limited to 'src/overlay.cpp') diff --git a/src/overlay.cpp b/src/overlay.cpp index d1469b2..07691b1 100644 --- a/src/overlay.cpp +++ b/src/overlay.cpp @@ -51,34 +51,75 @@ void overlay_handle_teleport( OVERLAY_DATA* d ) { } } -void overlay_handle_redline( OVERLAY_DATA* d ) { +void overlay_handle_redline( OVERLAY_DATA* d, F64 dt, F64 now ) { TELEMETRY* t = &d->telem; + if( !t->car_ordinal || !t->race_on ) + return; - if( !d->cfg.autoscale_rpm || d->valid_redline < 0.86f ) { + if( !d->cfg.autoscale_rpm ) { d->valid_redline = 0.86f; return; } + if( d->candidate_redline > 0.1f && now - d->redlinebang_time > .175f ) { + d->redlinechange_time = now; + d->target_redline = d->candidate_redline; + d->candidate_redline = 0.f; + } + + if( d->valid_redline != d->target_redline ) { + F64 diff = d->target_redline - d->valid_redline; + if( fabs( diff ) > 0.001f ) { + F64 max = diff > 0 ? 0.1 : 0.0015 * dt; + if( diff > 0 && diff > max ) diff = max; + if( diff < 0 && diff < -max ) diff = -max; + d->valid_redline += diff; + } + } + if( t->gear != d->last_gear ) { + d->candidate_redline = 0.f; + d->last_shifttime = now; + if( t->gear != 0 && t->gear != 11 && t->gear > d->last_valid_gear ) d->valid_shift = 1; else d->valid_shift = 0; } + F64 rpmr = (F64)(t->rpm) / t->rpm_max; + F64 rpmo = (F64)(t->rpm - d->cfg.rpm_off) / t->rpm_max; if( d->valid_shift ) { - F64 rpmr = (F64)(t->rpm) / t->rpm_max; - if( rpmr >= 0.99f ) + if( rpmr >= 0.98f ) { d->valid_redline = 0.86f; - rpmr = (F64)(t->rpm - (I32)d->cfg.rpm_off) / t->rpm_max; - if( rpmr > d->valid_redline ) { - d->valid_redline = rpmr; + d->target_redline = 0.86f; + } + if( rpmo > d->target_redline ) { + d->target_redline = rpmo; + } + } + + if( d->candidate_redline > 0.f && rpmo >= d->candidate_redline ) + d->candidate_redline = rpmo; + else if( !d->candidate_redline ) { + F32 geartime = now - d->last_shifttime; + if( geartime > 0.9f && rpmo < d->valid_redline && t->power * 0.001341022 <= 1.f && t->accel >= 230 && t->gear != 11 ) { + d->candidate_redline = (F32)rpmo; + if( d->candidate_redline < d->valid_redline - 0.01f ) + d->candidate_redline = d->valid_redline - 0.01f; + + d->redlinebang_time = now; } } d->last_gear = t->gear; if( t->gear != 11 ) d->last_valid_gear = t->gear; + + if( d->valid_redline < 0.65f ) + d->valid_redline = 0.65f; + if( d->target_redline < 0.65f ) + d->target_redline = 0.65f; } void overlay_handle_car_changed( OVERLAY_DATA* d ) { @@ -96,6 +137,8 @@ void overlay_handle_car_changed( OVERLAY_DATA* d ) { d->peak_boost_bar = 0.0; d->boost_since = 0.0; d->valid_redline = 0.86; + d->target_redline = 0.86; + d->candidate_redline = 0.f; } } @@ -175,7 +218,7 @@ void overlay_update( OVERLAY_DATA* d, F64 now, F64 dt ) { d->was_live = live; overlay_handle_car_changed( d ); - overlay_handle_redline( d ); + overlay_handle_redline( d, dt, now ); overlay_update_rpm_boost( d, live, dt, now ); if( !t->extended ) -- cgit v1.2.3