From 422a1ad24286594285ec6dc14182dd29a92ea21a Mon Sep 17 00:00:00 2001 From: alberth Date: Fri, 6 Aug 2010 20:26:01 +0000 Subject: [PATCH] (svn r20392) -Fix [FS#3993]: Prevent buying bankrupt companies when you'd get too many vehicles. --- src/company_cmd.cpp | 22 +++++++++++++++++++++- src/company_func.h | 1 + src/economy.cpp | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 9df78ebe7e..1ac0c4eb78 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -584,6 +584,25 @@ void InitializeCompanies() _cur_company_tick_index = 0; } +/** + * May company \a cbig buy company \a csmall? + * @param cbig Company buying \a csmall. + * @param csmall Company getting bought. + * @return Return \c true if it is allowed. + */ +bool MayCompanyTakeOver(CompanyID cbig, CompanyID csmall) +{ + uint big_counts[4], small_counts[4]; + CountCompanyVehicles(cbig, big_counts); + CountCompanyVehicles(csmall, small_counts); + + /* Do the combined vehicle counts stay within the limits? */ + return big_counts[VEH_TRAIN] + small_counts[VEH_TRAIN] <= _settings_game.vehicle.max_trains && + big_counts[VEH_ROAD] + small_counts[VEH_ROAD] <= _settings_game.vehicle.max_roadveh && + big_counts[VEH_SHIP] + small_counts[VEH_SHIP] <= _settings_game.vehicle.max_ships && + big_counts[VEH_AIRCRAFT] + small_counts[VEH_AIRCRAFT] <= _settings_game.vehicle.max_aircraft; +} + /** * Handle the bankruptcy take over of a company. * Companies going bankrupt will ask the other companies in order of their @@ -623,7 +642,8 @@ static void HandleBankruptcyTakeover(Company *c) FOR_ALL_COMPANIES(c2) { if (c2->bankrupt_asked == 0 && // Don't ask companies going bankrupt themselves !HasBit(c->bankrupt_asked, c2->index) && - best_performance < c2->old_economy[1].performance_history) { + best_performance < c2->old_economy[1].performance_history && + MayCompanyTakeOver(c2->index, c->index)) { best_performance = c2->old_economy[1].performance_history; best = c2; } diff --git a/src/company_func.h b/src/company_func.h index 6fcf348f51..0541227885 100644 --- a/src/company_func.h +++ b/src/company_func.h @@ -16,6 +16,7 @@ #include "tile_type.h" #include "gfx_type.h" +bool MayCompanyTakeOver(CompanyID cbig, CompanyID small); void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner); void GetNameOfOwner(Owner owner, TileIndex tile); void SetLocalCompany(CompanyID new_company); diff --git a/src/economy.cpp b/src/economy.cpp index ed9212cd22..a9a61850d2 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1600,6 +1600,9 @@ CommandCost CmdBuyCompany(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 /* Do not allow companies to take over themselves */ if (target_company == _current_company) return CMD_ERROR; + /* Disable taking over when not allowed. */ + if (!MayCompanyTakeOver(_current_company, target_company)) return CMD_ERROR; + /* Get the cost here as the company is deleted in DoAcquireCompany. */ CommandCost cost(EXPENSES_OTHER, c->bankrupt_value);