changeset 15075:ae3cd597c26f draft

(svn r19701) -Fix [FS#3787]: Check for industry availability more thoroughly and cancel object placement when selecting not available industries.
author frosch <frosch@openttd.org>
date Fri, 23 Apr 2010 21:47:03 +0000
parents 0f4ae56a4db2
children 8587c4a3ee44
files src/ai/api/ai_industrytype.cpp src/industry_cmd.cpp src/industry_gui.cpp
diffstat 3 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ai/api/ai_industrytype.cpp
+++ b/src/ai/api/ai_industrytype.cpp
@@ -14,6 +14,7 @@
 #include "../../command_type.h"
 #include "../../strings_func.h"
 #include "../../industry.h"
+#include "../../newgrf_industries.h"
 #include "../../core/random_func.hpp"
 
 /* static */ bool AIIndustryType::IsValidIndustryType(IndustryType industry_type)
@@ -88,6 +89,8 @@
 /* static */ bool AIIndustryType::CanBuildIndustry(IndustryType industry_type)
 {
 	if (!IsValidIndustryType(industry_type)) return false;
+
+	if (!::CheckIfCallBackAllowsAvailability(industry_type, IACT_USERCREATION)) return false;
 	if (!::GetIndustrySpec(industry_type)->IsRawIndustry()) return true;
 
 	/* raw_industry_construction == 1 means "Build as other industries" */
@@ -97,7 +100,9 @@
 /* static */ bool AIIndustryType::CanProspectIndustry(IndustryType industry_type)
 {
 	if (!IsValidIndustryType(industry_type)) return false;
+
 	if (!::GetIndustrySpec(industry_type)->IsRawIndustry()) return false;
+	if (!::CheckIfCallBackAllowsAvailability(industry_type, IACT_USERCREATION)) return false;
 
 	/* raw_industry_construction == 2 means "prospect" */
 	return _settings_game.construction.raw_industry_construction == 2;
--- a/src/industry_cmd.cpp
+++ b/src/industry_cmd.cpp
@@ -1764,6 +1764,10 @@
 		return CMD_ERROR;
 	}
 
+	if (_game_mode != GM_EDITOR && !CheckIfCallBackAllowsAvailability(it, IACT_USERCREATION)) {
+		return CMD_ERROR;
+	}
+
 	Industry *ind = NULL;
 	if (_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indspec->IsRawIndustry()) {
 		if (flags & DC_EXEC) {
--- a/src/industry_gui.cpp
+++ b/src/industry_gui.cpp
@@ -463,8 +463,10 @@
 
 					this->SetDirty();
 
-					if ((_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indsp != NULL && indsp->IsRawIndustry()) ||
-							this->selected_type == INVALID_INDUSTRYTYPE) {
+					if (GetCallbackWnd() == this &&
+							((_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indsp != NULL && indsp->IsRawIndustry()) ||
+							this->selected_type == INVALID_INDUSTRYTYPE ||
+							!this->enabled[this->selected_index])) {
 						/* Reset the button state if going to prospecting or "build many industries" */
 						this->RaiseButtons();
 						ResetObjectToPlace();