Vanilla Balance Mod Beta - Testers Wanted

Status
Not open for further replies.
This mod has now been released. All the changes are listed in the above link. If a Forum Admin is reading this, if you could remove the "Testers Wanted" and change it to "Development Discussion" thread, it would be appreciated.

UPDATED TO WORK WITH 1.3

Note: In attempts to fix the interviews and dilemmas, I have temporarily removed all non English languages from those two files. I hope to reinsert them into a later version (but when I do, they'll still be the vanilla text as I am unable to translate in any other language).

 
Last edited:
The AI take a random chassis at the End of the year.

I tested a lot and if u take the worst Engine, brake,.... u get a Minimum of 2 Stars. But the AI have 1 Star Thats impossible to choose that.
Maybe the ai get no Money at the end of the Season. I think it is Not ur mod.

But i did Not find the chassis whigtness.
 
So, I had a look at a couple of teams from my vanilla run, and looked at Octane and Ozu. Octane had a sub one star chassis, and Ozu, who had been demoted to ERS last year and was thus given their chassis (from what I gather, never been demoted), had a just over 1 star chassis. Seems to be a vailla thing, but then I can't understand why every other car on the grid were destroying their tyres. I'll do some more thorough testing.

EDIT: Every tyre compound that I use this season are lasting twice as long as the AI's for some reason...they even started using part used inters because they ran out. Going to get all the vanilla stuff back, run through a preseason and check what happens in vanilla

Frankly, I have no idea what the hell is going on.
 
Last edited:
The Chassis is really terrible.

i changed the active - passive whightness in the part components that is very good, the AI do the same as the Player.

But FLAMING do u know where u can Change the Chassis whigtness in the ressource??
 
Everything is fine in vanilla 1.2 - variances of about 2% per lap on soft tyres and 3% on supers, between the teams, for example.

Wow. How have I managed to make the AI tyre wear worse then the players? I don't quite understand that.

The only thing I can think of, is that they've all had such bad chassis, that they're all getting the -X laps penalty - instead of just the bottom third of the cars which was coded for the game. Either that or they're completely unable to manage thier temperatures.

I expected my mod would have some unexpected consequences, but at the moment this one is quite illogical. I made the change so that if the player had the worst chassis, they'd struggle a lot more with tyre wear. It shouldn't be possible for ALL the AI cars to have massive tyre wear problems, especially on inters which are effected far less anyway!

Of course, this was before the new AI. Do they actively manage their tyres better now to get their aimed 'target lap pitting' then they used to? In which case, this maybe why my changes no longer work - much like why my old fuel efficiency changes had to be removed.

Either way, I'll remove my 'chassis tyre life bonus/penalty increases' and upload a version without that, and see if that makes a positive difference. In your vanilla run, how better was your tyre wear compared to the AI?

The Chassis is really terrible.

i changed the active - passive whightness in the part components that is very good, the AI do the same as the Player.

But FLAMING do u know where u can Change the Chassis whigtness in the ressource??

I believe there's weightings in the team.txt. Lots of ones there such as HQ weightings, car weightings, driver weightings etc etc. I assume this is where they decide how to spend money. I believe Chassis Weightings is one of the options, but I may not be remembering it right.

As for them choosing random Chassis - I am not surprised if that's the case at all. In fact, in vanilla, Chassis Makeup is one of the most pointless things in the game as the strength of having a really good Chassis is really minor that I didn't feel it one little bit. As such, the AI may as well save money and take the lowest option - as it's not going to impede them as much.

I am at work for one more day before I have some time off to come back and study what's going on.

I'll see what I can do about fixing these two areas come Monday. The tyre wear one is puzzling but it seems reverting to Vanilla values will fix that (which is a shame, as removing the increased bonus/penalty on tyre life started to make the chassis important). I should be able to see how the AI is choosing their Chassis in the dll. If it is random like you believe, I should be able to see where it's being generated and perhaps 'help' the AI make better choices.

Either that or I go another direction with the chassis, make them equal and let players house rule to always buy the most expensive one they can. It'll help balance money a little, but it removes chassis from being a gameplay component. I'd prefer to make the chassis mean something, but at this time I am really struggling to see how I can do that.

So maybe I can change how Chassis and their stats work... Maybe I can make them increase more base stats instead instead of just the engine? (Though That's probably not possible). I'm open to ideas on this - especially if I can no longer change their strengths on fuel eff/heat management/tyre wear without handicapping the AI.
 
I changed in "the Part components" the wightness that the AI Takes the stat and stat max first and the Risk Level at Last. So i saw the ai inproved their car like the player - very well !!!

The AI also Build 1-2 Building in the First year. The spend the Season income in buildings too.

I changed in the Team wightness car improved for hq improved and it Works good too.

I think there is a chassis bug because the ai had a new chassis in Tier 1 which the player Can get in Tier 3.
i saved the Game before u design the new chassis. I changed the Team (kitano) take the worst chassis and i have 2-3 Stars. But if I changed the team after designing the new chassis the ai had a 1-1.5 chassis. So I think the chassis is random and the ai don not choose the 4 chassis parts.


Edit. There is no chassis wightness in the text.
 
I changed in "the Part components" the wightness that the AI Takes the stat and stat max first and the Risk Level at Last. So i saw the ai inproved their car like the player - very well !!!

The AI also Build 1-2 Building in the First year. The spend the Season income in buildings too.

I changed in the Team wightness car improved for hq improved and it Works good too.

I think there is a chassis bug because the ai had a new chassis in Tier 1 which the player Can get in Tier 3.
i saved the Game before u design the new chassis. I changed the Team (kitano) take the worst chassis and i have 2-3 Stars. But if I changed the team after designing the new chassis the ai had a 1-1.5 chassis. So I think the chassis is random and the ai don not choose the 4 chassis parts.


Edit. There is no chassis wightness in the text.

Ah, no Chassis Weightings then. I was mis-remembering then. That's the only place with weightings regarding what teams do differently. I haven't improved how the AI chooses their car parts directly, I chose to simply give the AI a general boost and handicap the player. That way, if the AI makes bad choices, the player can still catch up. If the AI makes good choices, they'll outpace the player... I am sure I have made the AI too strong for some users, but I currently like the change and I hope others will too.

I'll have a look in the DLL. See what they're (the AI) are doing.

Any ideas how to get AI sign a good drivers and not to replace them immediately ? (they just throw huge amont of money in trash)

None what-so-ever. Here's the code the AI uses if you want to take a look

Code:
    private void ReplaceDriver(global::Driver inCurDriver, global::Driver inNewDriver, bool inIsReplacement, bool inReplaceWithReserve)
    {
        if (!inNewDriver.contractManager.isNegotiating)
        {
            global::ContractPerson contractPerson = new global::ContractPerson();
            contractPerson.employeer = this.mTeam;
            contractPerson.SetPerson(inNewDriver);
            contractPerson.job = global::Contract.Job.Driver;
            global::Team team = inNewDriver.contract.GetTeam();
            global::ContractNegotiationScreen.NegotatiationType negotatiationType = (!inNewDriver.IsFreeAgent()) ? global::ContractNegotiationScreen.NegotatiationType.NewDriver : global::ContractNegotiationScreen.NegotatiationType.NewDriverUnemployed;
            if (inReplaceWithReserve)
            {
                negotatiationType = global::ContractNegotiationScreen.NegotatiationType.PromoteReserveDriver;
            }
            global::TeamAIController.NegotiationEntry negotiationEntry = new global::TeamAIController.NegotiationEntry
            {
                mPerson = inNewDriver,
                mPersonToFire = this.mTeam.contractManager.GetSlotForPerson(inCurDriver),
                mDraftContractPerson = contractPerson,
                mNegotiationType = negotatiationType,
                mTeamAtTimeOfNegotiation = team,
                mLastNegotiatedWith = global::Game.instance.time.now,
                mIsReplacementPerson = inIsReplacement
            };
            this.mNegotiations.Add(negotiationEntry);
            inNewDriver.contractManager.StartNegotiation(negotatiationType, this.mTeam);
            global::ContractDesiredValuesHelper desiredContractValues = inNewDriver.contractManager.contractEvaluation.desiredContractValues;
            contractPerson.hasQualifyingBonus = desiredContractValues.wantsQualifyingBonus;
            contractPerson.hasRaceBonus = desiredContractValues.wantsRaceBonus;
            contractPerson.hasSignOnFee = desiredContractValues.wantSignOnFee;
            contractPerson.signOnFee = (int)desiredContractValues.desiredSignOnFee;
            int num = 0;
            int num2 = 0;
            this.CalculateDesiredBonus(desiredContractValues.desiredQualifyingBonus[0], desiredContractValues.desiredQualifyingBonus[1], out num, out num2);
            contractPerson.qualifyingBonusTargetPosition = num;
            contractPerson.qualifyingBonus = num2;
            this.CalculateDesiredBonus(desiredContractValues.desiredRaceBonus[0], desiredContractValues.desiredRaceBonus[1], out num, out num2);
            contractPerson.raceBonusTargetPosition = num;
            contractPerson.raceBonus = num2;
            contractPerson.buyoutSplit = desiredContractValues.desiredBuyoutSplit;
            contractPerson.SetProposedStatus(inCurDriver.contract.currentStatus);
            float current_wages = (!inNewDriver.IsFreeAgent()) ? ((float)inNewDriver.contract.yearlyWages) : 0f;
            contractPerson.yearlyWages = (int)this.CalculateYearlyWage(ref desiredContractValues, current_wages);
            contractPerson.length = desiredContractValues.desiredContractLength;
            contractPerson.startDate = global::Game.instance.time.now;
            DateTime endDate = new DateTime(contractPerson.startDate.Year, 12, 31);
            if (this.NeedToAddOneYearToContract())
            {
                endDate = endDate.AddYears(1);
            }
            if (contractPerson.length == global::ContractPerson.ContractLength.Medium)
            {
                endDate = endDate.AddYears(1);
            }
            else if (contractPerson.length == global::ContractPerson.ContractLength.Long)
            {
                endDate = endDate.AddYears(2);
            }
            contractPerson.endDate = endDate;
            bool flag = inNewDriver.contractManager.IsAcceptingDraftContractAI(contractPerson, negotiationEntry.mNegotiationType);
            if (inIsReplacement && !inReplaceWithReserve)
            {
                this.UpdatePeopleApproached(inNewDriver, flag);
            }
            this.UpdateProposedContractState(inNewDriver, (!flag) ? global::ContractManagerPerson.ContractProposalState.ProposalRejected : global::ContractManagerPerson.ContractProposalState.ProposalAccepted);
            inNewDriver.contractManager.RemoveDraftProposal();
        }
    }
 
Last edited:
Code:
    public global::CarChassisStats FindSuppliersForNewChassis()
    {
        long num = this.mTeam.financeController.finance.currentBudget - this.mTeam.financeController.GetRacePaymentValue(global::TeamFinanceController.RacePaymentType.Medium) * 2L;
        List<global::Supplier> list = new List<global::Supplier>(global::Game.instance.supplierManager.GetSuppliersForTeam(global::Supplier.SupplierType.Engine, this.mTeam, true));
        List<global::Supplier> list2 = new List<global::Supplier>(global::Game.instance.supplierManager.GetSuppliersForTeam(global::Supplier.SupplierType.Brakes, this.mTeam, true));
        List<global::Supplier> list3 = new List<global::Supplier>(global::Game.instance.supplierManager.GetSuppliersForTeam(global::Supplier.SupplierType.Materials, this.mTeam, true));
        List<global::Supplier> list4 = new List<global::Supplier>(global::Game.instance.supplierManager.GetSuppliersForTeam(global::Supplier.SupplierType.Fuel, this.mTeam, true));
        for (int i = 0; i < list.Count; i++)
        {
            list[I].RollRandomBaseStatModifier();
        }
        list.Sort((global::Supplier x, global::Supplier y) => x.GetPrice(this.mTeam).CompareTo(y.GetPrice(this.mTeam)));
        list2.Sort((global::Supplier x, global::Supplier y) => x.GetPrice(this.mTeam).CompareTo(y.GetPrice(this.mTeam)));
        list3.Sort((global::Supplier x, global::Supplier y) => x.GetPrice(this.mTeam).CompareTo(y.GetPrice(this.mTeam)));
        list4.Sort((global::Supplier x, global::Supplier y) => x.GetPrice(this.mTeam).CompareTo(y.GetPrice(this.mTeam)));
        long num2 = 0L;
        int num3 = -1;
        global::Supplier supplier = null;
        global::Supplier supplier2 = null;
        global::Supplier supplier3 = null;
        global::Supplier supplier4 = null;
        bool flag = false;
        while (num2 <= num)
        {
            num3++;
            int num4 = Math.Min(num3, list2.Count - 1);
            int num5 = Math.Min(num3, list.Count - 1);
            int num6 = Math.Min(num3, list4.Count - 1);
            int num7 = Math.Min(num3, list3.Count - 1);
            long num8 = (long)(list2[num4].GetPrice(this.mTeam) + list[num5].GetPrice(this.mTeam) + list4[num6].GetPrice(this.mTeam) + list3[num7].GetPrice(this.mTeam));
            if (num8 >= num && num3 > 0)
            {
                break;
            }
            supplier = list2[num4];
            supplier2 = list[num5];
            supplier3 = list4[num6];
            supplier4 = list3[num7];
            num2 = (long)(supplier.GetPrice(this.mTeam) + supplier2.GetPrice(this.mTeam) + supplier3.GetPrice(this.mTeam) + supplier4.GetPrice(this.mTeam));
            if (num4 == list2.Count - 1 && num5 == list.Count - 1 && num6 == list4.Count - 1 && num7 == list3.Count - 1)
            {
                flag = true;
                break;
            }
        }
        if (!flag)
        {
            if (num3 < 0)
            {
                num3 = 0;
                supplier = list2[num3];
                supplier2 = list[num3];
                supplier3 = list4[num3];
                supplier4 = list3[num3];
            }
            else
            {
                if (num3 < list2.Count - 1)
                {
                    int num9 = list2[num3 + 1].GetPrice(this.mTeam) - supplier.GetPrice(this.mTeam);
                    if (num2 + (long)num9 < num)
                    {
                        supplier = list2[num3 + 1];
                        num2 += (long)num9;
                    }
                }
                if (num3 < list4.Count - 1)
                {
                    int num10 = list4[num3 + 1].GetPrice(this.mTeam) - supplier3.GetPrice(this.mTeam);
                    if (num2 + (long)num10 < num)
                    {
                        supplier3 = list4[num3 + 1];
                        num2 += (long)num10;
                    }
                }
                if (num3 < list3.Count - 1)
                {
                    int num11 = list3[num3 + 1].GetPrice(this.mTeam) - supplier4.GetPrice(this.mTeam);
                    if (num2 + (long)num11 < num)
                    {
                        supplier4 = list3[num3 + 1];
                        num2 += (long)num11;
                    }
                }
                if (num3 < list.Count - 1)
                {
                    int num12 = list[num3 + 1].GetPrice(this.mTeam) - supplier2.GetPrice(this.mTeam);
                    if (num2 + (long)num12 < num)
                    {
                        supplier2 = list[num3 + 1];
                        num2 += (long)num12;
                    }
                }
            }
        }
        global::CarChassisStats carChassisStats = new global::CarChassisStats();
        carChassisStats.supplierBrakes = supplier;
        carChassisStats.supplierEngine = supplier2;
        carChassisStats.supplierFuel = supplier3;
        carChassisStats.supplierMaterials = supplier4;
        carChassisStats.fuelEfficiency += carChassisStats.supplierBrakes.GetStat(global::CarChassisStats.Stats.FuelEfficiency) + carChassisStats.supplierEngine.GetStat(global::CarChassisStats.Stats.FuelEfficiency) + carChassisStats.supplierFuel.GetStat(global::CarChassisStats.Stats.FuelEfficiency) + carChassisStats.supplierMaterials.GetStat(global::CarChassisStats.Stats.FuelEfficiency);
        carChassisStats.improvability += carChassisStats.supplierBrakes.GetStat(global::CarChassisStats.Stats.Improvability) + carChassisStats.supplierEngine.GetStat(global::CarChassisStats.Stats.Improvability) + carChassisStats.supplierFuel.GetStat(global::CarChassisStats.Stats.Improvability) + carChassisStats.supplierMaterials.GetStat(global::CarChassisStats.Stats.Improvability);
        carChassisStats.tyreHeating += carChassisStats.supplierBrakes.GetStat(global::CarChassisStats.Stats.TyreHeating) + carChassisStats.supplierEngine.GetStat(global::CarChassisStats.Stats.TyreHeating) + carChassisStats.supplierFuel.GetStat(global::CarChassisStats.Stats.TyreHeating) + carChassisStats.supplierMaterials.GetStat(global::CarChassisStats.Stats.TyreHeating);
        carChassisStats.tyreWear += carChassisStats.supplierBrakes.GetStat(global::CarChassisStats.Stats.TyreWear) + carChassisStats.supplierEngine.GetStat(global::CarChassisStats.Stats.TyreWear) + carChassisStats.supplierFuel.GetStat(global::CarChassisStats.Stats.TyreWear) + carChassisStats.supplierMaterials.GetStat(global::CarChassisStats.Stats.TyreWear);
        return carChassisStats;
    }
[/I]

So the AI Chassis Stats aren't random per say... It's going to take me a while to understand what it's doing exactly but there appears to be some logic in it. So it appears to be a bigger mystery as to why the AI are able to get stars worse then the least possible stars.

As a new feature... I am reducing the default number of Scouting Slots from 3 to 1! There are remnants of the Mechanics and Designers being scoutable (kinda as expected) - code still exists for the AI to scout those two. I don't think its possible to reintroduce the game mechanics as a whole, so reducing the slots is the next best thing. It'll give the scouting facility some more appeal.
 
Last edited:
I changed in "the Part components" the wightness that the AI Takes the stat and stat max first and the Risk Level at Last. So i saw the ai inproved their car like the player - very well !!!

The AI also Build 1-2 Building in the First year. The spend the Season income in buildings too.

I changed in the Team wightness car improved for hq improved and it Works good too.

AI builds more HQ after you changed weightings of the parts in "part components" ?
 
I changed the wightness for hq too.

The Part components mean that the ai build at first stat and stat max parts and no -red zone or + reliability parts.

I hope flaming find out the code for the chassis because that's a little game breaker after the first season.
 
In HQ.txt i can only see which team have buildings and there is no improvement stats at all
here is all stats
(Team,Location,Size,Site space,Scene,Design Centre,Factory,Telemetry Centre,Test Track,Wind Tunnel,Simulator,Brakes Research Facility,Ride Handling Development,Scouting Facility,Staff Housing,Logistics Centre,Road Car Factory,Tour Centre,Theme Park,Helipad)
 
Team Index,HQ Design,HQ Factory,HQ Performance,HQ Staff,HQ Brand,Car Acceleration,Car Braking,Car Top Speed,Car Low Speed Cornering,Car Medium Speed Cornering,Car High Speed Cornering,Finance Car,Finance HQ,Finance Drivers,Aggressiveness,Style,Staff Retention
 
Hi Flaming

i changed the Season Price Money from 500 to 900. Now the Kitano has a better Chassis but only 2,5 stars. The get about 80 mio Price Money.

i hope u know the Chassis dll.

Which Programm do u edit the dll file??
 
Hi Flaming

i changed the Season Price Money from 500 to 900. Now the Kitano has a better Chassis but only 2,5 stars. The get about 80 mio Price Money.

i hope u know the Chassis dll.

Which Programm do u edit the dll file??

I lowered the prize money but increased merit payment differentiation in the mod, so the better cars should be getting more money as a result too. Problem with raising it to 900 is the fact that the player is going to end up with far far too much monies.

The code I quoted above was from one of the AI managers classes in the assembly, which I look at with ILSPY and modify the intrctions with Reflexi. It's fiddly though.
 
Status
Not open for further replies.

Latest News

Do you prefer licensed hardware?

  • Yes for me it is vital

  • Yes, but only if it's a manufacturer I like

  • Yes, but only if the price is right

  • No, a generic wheel is fine

  • No, I would be ok with a replica


Results are only viewable after voting.
Back
Top