changeset 19727:a80d140bf769 draft

(svn r24660) -Feature: do not display the preview window for disabled vehicle types (Eagle_rainbow)
author yexo <yexo@openttd.org>
date Thu, 01 Nov 2012 22:42:29 +0000
parents e54286d9613a
children beea94546d70
files src/engine.cpp
diffstat 1 files changed, 40 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -781,6 +781,25 @@
 	return best_company;
 }
 
+/**
+ * Checks if a vehicle type is disabled for all/ai companies.
+ * @param type The vehicle type which shall be checked.
+ * @param ai If true, check if the type is disabled for AI companies, otherwise check if
+ *           the vehicle type is disabled for human companies.
+ * @return Whether or not a vehicle type is disabled.
+ */
+static bool IsVehicleTypeDisabled(VehicleType type, bool ai)
+{
+	switch (type) {
+		case VEH_TRAIN:    return _settings_game.vehicle.max_trains == 0   || (ai && _settings_game.ai.ai_disable_veh_train);
+		case VEH_ROAD:     return _settings_game.vehicle.max_roadveh == 0  || (ai && _settings_game.ai.ai_disable_veh_roadveh);
+		case VEH_SHIP:     return _settings_game.vehicle.max_ships == 0    || (ai && _settings_game.ai.ai_disable_veh_ship);
+		case VEH_AIRCRAFT: return _settings_game.vehicle.max_aircraft == 0 || (ai && _settings_game.ai.ai_disable_veh_aircraft);
+
+		default: NOT_REACHED();
+	}
+}
+
 /** Daily check to offer an exclusive engine preview to the companies. */
 void EnginesDailyLoop()
 {
@@ -808,7 +827,12 @@
 
 				e->flags |= ENGINE_OFFER_WINDOW_OPEN;
 				e->preview_wait = 20;
-				AI::NewEvent(best_company, new ScriptEventEnginePreview(i));
+				/* AIs are intentionally not skipped for preview even if they cannot build a certain
+				 * vehicle type. This is done to not give poor performing human companies an "unfair"
+				 * boost that they wouldn't have gotten against other human companies. The check on
+				 * the line below is just to make AIs not notice that they have a preview if they
+				 * cannot build the vehicle. */
+				if (!IsVehicleTypeDisabled(e->type, true)) AI::NewEvent(best_company, new ScriptEventEnginePreview(i));
 				if (IsInteractiveCompany(best_company)) ShowEnginePreviewWindow(i);
 			}
 		}
@@ -889,11 +913,15 @@
 		FOR_ALL_COMPANIES(c) SetBit(c->avail_roadtypes, HasBit(e->info.misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 	}
 
-	AI::BroadcastNewEvent(new ScriptEventEngineAvailable(index));
+	/* Only broadcast event if AIs are able to build this vehicle type. */
+	if (!IsVehicleTypeDisabled(e->type, true)) AI::BroadcastNewEvent(new ScriptEventEngineAvailable(index));
 
-	SetDParam(0, GetEngineCategoryName(index));
-	SetDParam(1, index);
-	AddNewsItem(STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE, NT_NEW_VEHICLES, NF_VEHICLE, NR_ENGINE, index);
+	/* Only provide the "New Vehicle available" news paper entry, if engine can be built. */
+	if (!IsVehicleTypeDisabled(e->type, false)) {
+		SetDParam(0, GetEngineCategoryName(index));
+		SetDParam(1, index);
+		AddNewsItem(STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE, NT_NEW_VEHICLES, NF_VEHICLE, NR_ENGINE, index);
+	}
 
 	/* Update the toolbar. */
 	if (e->type == VEH_ROAD) InvalidateWindowData(WC_BUILD_TOOLBAR, TRANSPORT_ROAD);
@@ -919,7 +947,13 @@
 				/* Introduce it to all companies */
 				NewVehicleAvailable(e);
 			} else if (!(e->flags & (ENGINE_AVAILABLE | ENGINE_EXCLUSIVE_PREVIEW)) && _date >= e->intro_date) {
-				/* Introduction date has passed.. show introducing dialog to one companies. */
+				/* Introduction date has passed...
+				 * Check if it is allowed to build this vehicle type at all
+				 * based on the current game settings. If not, it does not
+				 * make sense to show the preview dialog to any company. */
+				if (IsVehicleTypeDisabled(e->type, false)) continue;
+
+				/* Show preview dialog to one of the companies. */
 				e->flags |= ENGINE_EXCLUSIVE_PREVIEW;
 
 				/* Do not introduce new rail wagons */