This is a followup to https://stunodracing.net/index.php?threads/new-season-ratings.13098/
I have completely reworked the formula, described below. It makes for much more interesting and varied results, and is less linear than my original posting. Almost all categories are based on average finish, with some variation. All ratings (save pit strategy) are multiplied by ratio of race starts to account for partial starters. This works nicely and all drivers fall roughly where they should in final standings, though perhaps without the same stats (this is outside the bounds of "season" ratings... if you're looking for results that can replicate stats like that, use single race ratings). Note that track type is NOT set to NR2003 as this evens out the track ratings a bit.
Ratings - https://nnracing.com/filelibrary.asp?fileid=83329
Script - https://nnracing.com/filelibrary.asp?fileid=83330
Aggression uses a top5 and top10 modifier. Drivers with more T5/T10 are considered more aggressive.
Consistency uses lead lap finishes. While this does not technically align with what consistency does in the game (run consistent laps), it does create a linear spread of consistency through the field.
Finishing (and qualifying) use a larger avfn modifier (60/40), with wins/poles as the overall modifier. I am confused what finishing actually does, along with everyone else, but this seems to work ok.
All four track types use the same 40/20 formula, added to a base amount of 20/60. This means good average finish at a track type might have 50/75 for that type. I found that more than 80 or 90 drivers do too well on tracks and results become predictable and boring. While minimum often is below 50 (especially for partial starters), I have not found a dramatic increase in wrecks, given the rest of the ratings.
Unlike my previous version (modeled more closely to Ethone's), this version has a larger vehicle ratings spread with a sliding max. This method was inspired by the ratings for the pwf bgn and cts carsets.
I really would rather prefer to use a real life stat to create a differential between chassis and engine (as is the case with papyrus/pwf ratings), I could not find a suitable method that didn't give some driver an advantage/disadvantage in a way that seriously affected final season standings. I again borrowed from pwf carsets and made the chassis min 5 points lower. Does anyone know why chassis is often lower than engine, and why this difference makes for better racing? My guess is that more power (engine) going into a corner where grip (chassis) becomes important leads to more "human" like racing where the AI have to check up more, ie take corners less perfectly. But I honestly have no idea.
Engine is the same as aero, with the reasoning the same as above.
Reliability is the inverse of chassis, with a 5 point bump up. This is to reduce so many blown engines or otherwise which often have a sever effect on final standings.
In order to add some variability to pit consistency and speed, one is the average of avst and avfn, and the other is just avfn. The base value is 40/80, which is an increase from my previous version, but I found that these higher ratings seem to mix up the field less, which aligns better with real life pitting. It also seems to result in less penalties for the AI?
As noted above. Speed uses only avfn.
Strategy uses the difference between avst and avfn. Often this is close to 0, leaving the strategy to fall around 40/80, a spread that results in interest pit strategies eg drivers pit over several laps rather than all at once. The only rating that does not get multiplied by ratio of race starts.
I also attached a script that I adopted from dooper, who I believe runs the nr2k3 weebly site (https://nr2k3.weebly.com/scoring.html) which I found on nnracing. The changes make it spit out results that mirror exactly the racing reference site. For example, check out the 97 standings - https://pastebin.com/GmXNLX2s with https://www.racing-reference.info/standings/1997/W/. These really helps to see how the ratings are performing against the real life ratings that they're based on. If anyone needs help running the script, let me know as it takes some technical know how (ie using command prompt).
I have completely reworked the formula, described below. It makes for much more interesting and varied results, and is less linear than my original posting. Almost all categories are based on average finish, with some variation. All ratings (save pit strategy) are multiplied by ratio of race starts to account for partial starters. This works nicely and all drivers fall roughly where they should in final standings, though perhaps without the same stats (this is outside the bounds of "season" ratings... if you're looking for results that can replicate stats like that, use single race ratings). Note that track type is NOT set to NR2003 as this evens out the track ratings a bit.
Ratings - https://nnracing.com/filelibrary.asp?fileid=83329
Script - https://nnracing.com/filelibrary.asp?fileid=83330
XML:
<DriverAggressionMin>
var rating = 0;
rating = 20 + ((((1 - @avgFinish / @avgNumberOfStarters) * 40) + ((@top5 / @raceStarts) * 20) + ((@top10 / @raceStarts) * 20)) * @percRaceStarts);
</DriverAggressionMin>
<DriverAggressionMax>
var rating = 0;
rating = 60 + ((((1 - @avgFinish / @avgNumberOfStarters) * 20) + ((@top5 / @raceStarts) * 10) + ((@top10 / @raceStarts) * 10)) * @percRaceStarts);
</DriverAggressionMax>
Aggression uses a top5 and top10 modifier. Drivers with more T5/T10 are considered more aggressive.
XML:
<DriverConsistencyMin>
var rating = 0;
rating = 20 + ((((1 - @avgFinish / @avgNumberOfStarters) * 40) + ((@leadLapFinishes / @raceStarts) * 20)) * @percRaceStarts);
</DriverConsistencyMin>
<DriverConsistencyMax>
var rating = 0;
rating = 60 + ((((1 - @avgFinish / @avgNumberOfStarters) * 20) + ((@leadLapFinishes / @raceStarts) * 10)) * @percRaceStarts);
</DriverConsistencyMax>
Consistency uses lead lap finishes. While this does not technically align with what consistency does in the game (run consistent laps), it does create a linear spread of consistency through the field.
XML:
<DriverFinishingMin>
var rating = 0;
rating = 20 + (((((1 - @avgFinish / @avgNumberOfStarters) * 60)) + (((@wins / @raceStarts) * 20))) * @percRaceStarts);
</DriverFinishingMin>
<DriverFinishingMax>
var rating = 0;
rating = 60 + (((((1 - @avgFinish / @avgNumberOfStarters) * 40)) + (((@wins / @raceStarts) * 10))) * @percRaceStarts);
</DriverFinishingMax>
XML:
<DriverQualifyingMin>
var rating = 0;
rating = 20 + (((((1 - @avgStart / @avgNumberOfStarters) * 60)) + (((@poles / @raceStarts) * 20))) * @percRaceStarts);
</DriverQualifyingMin>
<DriverQualifyingMax>
var rating = 0;
rating = 60 + (((((1 - @avgStart / @avgNumberOfStarters) * 40)) + (((@poles / @raceStarts) * 10))) * @percRaceStarts);
</DriverQualifyingMax>
Finishing (and qualifying) use a larger avfn modifier (60/40), with wins/poles as the overall modifier. I am confused what finishing actually does, along with everyone else, but this seems to work ok.
XML:
<DriverTrackTypeMin>
var rating = 0;
if(@avgFinish* != null)
rating = 20 + ((((1 - @avgFinish* / @avgNumberOfStarters) * 40)) * @percRaceStarts);
</DriverRoadCourseMin>
<DriverRoadCourseMax>
var rating = 0;
if(@avgFinish* != null)
rating = 60 + ((((1 - @avgFinish* / @avgNumberOfStarters) * 20)) * @percRaceStarts);
</DriverRoadCourseMax>
All four track types use the same 40/20 formula, added to a base amount of 20/60. This means good average finish at a track type might have 50/75 for that type. I found that more than 80 or 90 drivers do too well on tracks and results become predictable and boring. While minimum often is below 50 (especially for partial starters), I have not found a dramatic increase in wrecks, given the rest of the ratings.
XML:
<VehicleAeroMin>
var rating = 0;
rating = 50 + (((((1 - @avgFinish / @avgNumberOfStarters) * 20))) * @percRaceStarts);
</VehicleAeroMin>
<VehicleAeroMax>
var rating = 0;
rating = 80 + ((((1 - @avgFinish / @avgNumberOfStarters) * 10)) * @percRaceStarts);
</VehicleAeroMax>
Unlike my previous version (modeled more closely to Ethone's), this version has a larger vehicle ratings spread with a sliding max. This method was inspired by the ratings for the pwf bgn and cts carsets.
XML:
<VehicleChassisMin>
var rating = 0;
rating = 45 + ((((1 - @avgFinish / @avgNumberOfStarters) * 20)) * @percRaceStarts);
</VehicleChassisMin>
<VehicleChassisMax>
var rating = 0;
rating = 80 + ((((1 - @avgFinish / @avgNumberOfStarters) * 10)) * @percRaceStarts);
</VehicleChassisMax>
I really would rather prefer to use a real life stat to create a differential between chassis and engine (as is the case with papyrus/pwf ratings), I could not find a suitable method that didn't give some driver an advantage/disadvantage in a way that seriously affected final season standings. I again borrowed from pwf carsets and made the chassis min 5 points lower. Does anyone know why chassis is often lower than engine, and why this difference makes for better racing? My guess is that more power (engine) going into a corner where grip (chassis) becomes important leads to more "human" like racing where the AI have to check up more, ie take corners less perfectly. But I honestly have no idea.
XML:
<VehicleEngineMin>
var rating = 0;
rating = 50 + ((((1 - @avgFinish / @avgNumberOfStarters) * 20)) * @percRaceStarts);
</VehicleEngineMin>
<VehicleEngineMax>
var rating = 0;
rating = 80 + ((((1 - @avgFinish / @avgNumberOfStarters) * 10)) * @percRaceStarts);
</VehicleEngineMax>
Engine is the same as aero, with the reasoning the same as above.
XML:
<VehicleReliabilityMin>
var rating = 0;
rating = 55 + ((((1 - @avgFinish / @avgNumberOfStarters) * 20)) * @percRaceStarts);
</VehicleReliabilityMin>
<VehicleReliabilityMax>
var rating = 0;
rating = 80 + ((((1 - @avgFinish / @avgNumberOfStarters) * 10)) * @percRaceStarts);
</VehicleReliabilityMax>
Reliability is the inverse of chassis, with a 5 point bump up. This is to reduce so many blown engines or otherwise which often have a sever effect on final standings.
XML:
<PitcrewConsistencyMin>
var rating = 0;
rating = 40 + (((1 - ((@avgStart + @avgFinish) / 2) / @avgNumberOfStarters) * 40) * @percRaceStarts);
</PitcrewConsistencyMin>
<PitcrewConsistencyMax>
var rating = 0;
rating = 80 + (((1 - ((@avgStart + @avgFinish) / 2) / @avgNumberOfStarters) * 20) * @percRaceStarts);
</PitcrewConsistencyMax>
In order to add some variability to pit consistency and speed, one is the average of avst and avfn, and the other is just avfn. The base value is 40/80, which is an increase from my previous version, but I found that these higher ratings seem to mix up the field less, which aligns better with real life pitting. It also seems to result in less penalties for the AI?
XML:
<PitcrewSpeedMin>
var rating = 0;
rating = 40 + (((1 - @avgFinish / @avgNumberOfStarters) * 40) * @percRaceStarts);
</PitcrewSpeedMin>
<PitcrewSpeedMax>
var rating = 0;
rating = 80 + (((1 - @avgFinish / @avgNumberOfStarters) * 20) * @percRaceStarts);
</PitcrewSpeedMax>
As noted above. Speed uses only avfn.
XML:
<PitcrewStrategyMin>
var rating = 0;
rating = 40 + (((@avgStart - @avgFinish) / @avgNumberOfStarters) * 40);
</PitcrewStrategyMin>
<PitcrewStrategyMax>
var rating = 0;
rating = 80 + (((@avgStart - @avgFinish) / @avgNumberOfStarters) * 20);
</PitcrewStrategyMax>
Strategy uses the difference between avst and avfn. Often this is close to 0, leaving the strategy to fall around 40/80, a spread that results in interest pit strategies eg drivers pit over several laps rather than all at once. The only rating that does not get multiplied by ratio of race starts.
I also attached a script that I adopted from dooper, who I believe runs the nr2k3 weebly site (https://nr2k3.weebly.com/scoring.html) which I found on nnracing. The changes make it spit out results that mirror exactly the racing reference site. For example, check out the 97 standings - https://pastebin.com/GmXNLX2s with https://www.racing-reference.info/standings/1997/W/. These really helps to see how the ratings are performing against the real life ratings that they're based on. If anyone needs help running the script, let me know as it takes some technical know how (ie using command prompt).