From 6540948aced498d8530ccac32e7b827c789716cc Mon Sep 17 00:00:00 2001 From: benda Date: Sat, 14 May 2022 09:57:47 -0500 Subject: [PATCH] Fix: Company values do not properly account for shares (#9770) Co-authored-by: Charles Pigott --- src/company_base.h | 1 + src/economy.cpp | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/company_base.h b/src/company_base.h index dd2cfc23b8..5e6d9a8c85 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -167,6 +167,7 @@ struct Company : CompanyProperties, CompanyPool::PoolItem<&_company_pool> { }; Money CalculateCompanyValue(const Company *c, bool including_loan = true); +Money CalculateCompanyValueExcludingShares(const Company *c, bool including_loan = true); extern uint _next_competitor_start; extern uint _cur_company_tick_index; diff --git a/src/economy.cpp b/src/economy.cpp index e3a023f591..ca2e5591d1 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -103,14 +103,33 @@ static PriceMultipliers _price_base_multiplier; /** * Calculate the value of the company. That is the value of all - * assets (vehicles, stations, etc) and money minus the loan, + * assets (vehicles, stations, shares) and money minus the loan, * except when including_loan is \c false which is useful when * we want to calculate the value for bankruptcy. - * @param c the company to get the value of. + * @param c the company to get the value of. * @param including_loan include the loan in the company value. * @return the value of the company. */ Money CalculateCompanyValue(const Company *c, bool including_loan) +{ + Money owned_shares_value = 0; + + for (const Company *co : Company::Iterate()) { + uint8 shares_owned = 0; + + for (uint8 i = 0; i < 4; i++) { + if (co->share_owners[i] == c->index) { + shares_owned++; + } + } + + owned_shares_value += (CalculateCompanyValueExcludingShares(co) / 4) * shares_owned; + } + + return std::max(owned_shares_value + CalculateCompanyValueExcludingShares(c), 1); +} + +Money CalculateCompanyValueExcludingShares(const Company *c, bool including_loan) { Owner owner = c->index;