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/hooks.cpp | 2 +- src/overlay.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++-------- src/overlay.h | 12 +++++++++--- 3 files changed, 61 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/hooks.cpp b/src/hooks.cpp index 25883b3..1b1c3cf 100644 --- a/src/hooks.cpp +++ b/src/hooks.cpp @@ -198,7 +198,7 @@ VKAPI_ATTR VkResult VKAPI_CALL hook_queue_present( udp_parse( &d->udp, &od->telem ); if( ++od->frame % 60 == 0 ) { if( config_poll( &od->cfg ) ) - od->valid_redline = 0.86; + od->valid_redline = od->target_redline = 0.86; } F64 now = t_nows(); 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 ) diff --git a/src/overlay.h b/src/overlay.h index c690c64..231d1a9 100644 --- a/src/overlay.h +++ b/src/overlay.h @@ -21,18 +21,24 @@ struct OVERLAY_DATA { I32 frame; F32 valid_redline; - I32 valid_shift; + U8 valid_shift; I32 shift_rpm; I32 last_gear; I32 last_valid_gear; + F64 last_shifttime; + F64 candidate_redline; + F64 redlinebang_time; + F64 redlinechange_time; + F64 target_redline; + U8 redline_downscaled; - U8 was_live; + U8 was_live; F64 live_since; F64 boost_since; I32 car_ordinal; F32 car_rpm_max; I32 prev_race_on; - U8 lc_armed; + U8 lc_armed; F64 prev_disp_rpm, rpm_vel; F64 prev_disp_bar, bar_vel; -- cgit v1.2.3