changeset 18765:5fbaf80f0375 draft

(svn r23613) -Add: allow IsDeveloperOnly in info.nut, to indicate if you can select this GS via the GUI (optional, defaults to false)
author truebrain <truebrain@openttd.org>
date Mon, 19 Dec 2011 20:57:08 +0000
parents bd2a1a20a792
children 327b85ab521d
files src/game/game_info.cpp src/game/game_info.hpp src/script/api/script_info_docs.hpp src/script/script_info.hpp src/script/script_scanner.cpp
diffstat 5 files changed, 36 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/game/game_info.cpp
+++ b/src/game/game_info.cpp
@@ -67,7 +67,12 @@
 	} else {
 		info->min_loadable_version = info->GetVersion();
 	}
-
+	/* When there is an IsSelectable function, call it. */
+	if (info->engine->MethodExists(*info->SQ_instance, "IsDeveloperOnly")) {
+		if (!info->engine->CallBoolMethod(*info->SQ_instance, "IsDeveloperOnly", &info->is_developer_only, MAX_GET_OPS)) return SQ_ERROR;
+	} else {
+		info->is_developer_only = false;
+	}
 	/* Try to get the API version the AI is written for. */
 	if (!info->CheckMethod("GetAPIVersion")) return SQ_ERROR;
 	if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetAPIVersion", &info->api_version, MAX_GET_OPS)) return SQ_ERROR;
@@ -85,6 +90,7 @@
 
 GameInfo::GameInfo() :
 	min_loadable_version(0),
+	is_developer_only(false),
 	api_version(NULL)
 {
 }
--- a/src/game/game_info.hpp
+++ b/src/game/game_info.hpp
@@ -41,8 +41,11 @@
 	 */
 	const char *GetAPIVersion() const { return this->api_version; }
 
+	/* virtual */ bool IsDeveloperOnly() const { return this->is_developer_only; }
+
 private:
 	int min_loadable_version; ///< The Game can load savegame data if the version is equal or greater than this.
+	bool is_developer_only;   ///< Is the script selectable by non-developers?
 	const char *api_version;  ///< API version used by this Game.
 };
 
--- a/src/script/api/script_info_docs.hpp
+++ b/src/script/api/script_info_docs.hpp
@@ -130,6 +130,19 @@
 	bool UseAsRandomAI();
 
 	/**
+	 * Can a non-developer select Script for a new game.
+	 *
+	 * The idea behind this function is to 'forbid' using your script with a new
+	 *  game if you for example specificly wrote it for a certain scenario.
+	 *
+	 * @return True if the Script can be selected from the GUI as non-developer.
+	 * @note This function is optional. Default is false.
+	 *
+	 * @api -ai
+	 */
+	bool IsDeveloperOnly();
+
+	/**
 	 * Gets the name of main class of the Script so OpenTTD knows
 	 * what class to instantiate.
 	 *
--- a/src/script/script_info.hpp
+++ b/src/script/script_info.hpp
@@ -142,6 +142,10 @@
 	 */
 	int GetSettingDefaultValue(const char *name) const;
 
+	/**
+	 * Can this script be selected by developers only?
+	 */
+	virtual bool IsDeveloperOnly() const { return false; }
 
 protected:
 	class Squirrel *engine;           ///< Engine used to register for Squirrel.
--- a/src/script/script_scanner.cpp
+++ b/src/script/script_scanner.cpp
@@ -13,6 +13,7 @@
 #include "../debug.h"
 #include "../string_func.h"
 #include "../fileio_func.h"
+#include "../settings_type.h"
 #include <sys/stat.h>
 
 #include "../script/squirrel.hpp"
@@ -144,12 +145,14 @@
 
 	this->info_list[strdup(script_name)] = info;
 
-	/* Add the script to the 'unique' script list, where only the highest version
-	 *  of the script is registered. */
-	if (this->info_single_list.find(script_original_name) == this->info_single_list.end()) {
-		this->info_single_list[strdup(script_original_name)] = info;
-	} else if (this->info_single_list[script_original_name]->GetVersion() < info->GetVersion()) {
-		this->info_single_list[script_original_name] = info;
+	if (!info->IsDeveloperOnly() || _settings_client.gui.ai_developer_tools) {
+		/* Add the script to the 'unique' script list, where only the highest version
+		 *  of the script is registered. */
+		if (this->info_single_list.find(script_original_name) == this->info_single_list.end()) {
+			this->info_single_list[strdup(script_original_name)] = info;
+		} else if (this->info_single_list[script_original_name]->GetVersion() < info->GetVersion()) {
+			this->info_single_list[script_original_name] = info;
+		}
 	}
 }