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);