summaryrefslogtreecommitdiff
path: root/src/overlay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/overlay.cpp')
-rw-r--r--src/overlay.cpp59
1 files changed, 51 insertions, 8 deletions
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 )