summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoraura <nw@moneybot.cc>2026-07-13 19:57:37 +0200
committeraura <nw@moneybot.cc>2026-07-13 19:57:37 +0200
commit971fcd352a872109a72c545cc9517c8980918b17 (patch)
tree64cec6db8c4f30a4df7afc9e702c58d536cec4d7 /src
parent6fd8a952a00d3c9980311ef366fd2304b7be9f67 (diff)
add scaling rpm down when redline is hit below set point
Diffstat (limited to 'src')
-rw-r--r--src/hooks.cpp2
-rw-r--r--src/overlay.cpp59
-rw-r--r--src/overlay.h12
3 files changed, 61 insertions, 12 deletions
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;