changeset 15725:597cad644741 draft

(svn r20392) -Fix [FS#3993]: Prevent buying bankrupt companies when you'd get too many vehicles.
author alberth <alberth@openttd.org>
date Fri, 06 Aug 2010 20:26:01 +0000
parents db6f7934da37
children 88dadfb384f8
files src/company_cmd.cpp src/company_func.h src/economy.cpp
diffstat 3 files changed, 25 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/company_cmd.cpp
+++ b/src/company_cmd.cpp
@@ -585,6 +585,25 @@
 }
 
 /**
+ * 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
  * performance rating, so better performing companies get the 'do you want to
@@ -623,7 +642,8 @@
 	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;
 		}
--- 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);
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1600,6 +1600,9 @@
 	/* 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);