changeset 19561:aad95c6709bb draft

(svn r24468) -Add [FS#5219]: API compatibility scripts for Goal Scripts (Hirundo)
author yexo <yexo@openttd.org>
date Mon, 13 Aug 2012 19:22:26 +0000
parents b64f37b0e118
children 1719163df01c
files src/ai/ai_instance.cpp src/ai/ai_instance.hpp src/game/game_instance.cpp src/script/script_instance.cpp src/script/script_instance.hpp
diffstat 5 files changed, 38 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/ai/ai_instance.cpp
+++ b/src/ai/ai_instance.cpp
@@ -81,7 +81,6 @@
 
 #include "../company_base.h"
 #include "../company_func.h"
-#include "../fileio_func.h"
 
 AIInstance::AIInstance() :
 	ScriptInstance("AI")
@@ -194,29 +193,7 @@
 	SQAIWaypointList_Register(this->engine);
 	SQAIWaypointList_Vehicle_Register(this->engine);
 
-	if (!this->LoadCompatibilityScripts(this->versionAPI)) this->Died();
-}
-
-bool AIInstance::LoadCompatibilityScripts(const char *api_version)
-{
-	char script_name[32];
-	seprintf(script_name, lastof(script_name), "compat_%s.nut", api_version);
-	char buf[MAX_PATH];
-	Searchpath sp;
-	FOR_ALL_SEARCHPATHS(sp) {
-		FioAppendDirectory(buf, MAX_PATH, sp, AI_DIR);
-		ttd_strlcat(buf, script_name, MAX_PATH);
-		if (!FileExists(buf)) continue;
-
-		if (this->engine->LoadScript(buf)) return true;
-
-		ScriptLog::Error("Failed to load API compatibility script");
-		DEBUG(script, 0, "Error compiling / running API compatibility script: %s", buf);
-		return false;
-	}
-
-	ScriptLog::Warning("API compatibility script not found");
-	return true;
+	if (!this->LoadCompatibilityScripts(this->versionAPI, AI_DIR)) this->Died();
 }
 
 void AIInstance::Died()
--- a/src/ai/ai_instance.hpp
+++ b/src/ai/ai_instance.hpp
@@ -29,17 +29,10 @@
 	/* virtual */ ScriptInfo *FindLibrary(const char *library, int version);
 
 private:
-	const char *versionAPI; ///< Current API used by this script.
-
 	/* virtual */ void RegisterAPI();
 	/* virtual */ void Died();
 	/* virtual */ CommandCallback *GetDoCommandCallback();
 	/* virtual */ void LoadDummyScript();
-
-	/**
-	 * Load squirrel scripts to emulate an older API.
-	 */
-	bool LoadCompatibilityScripts(const char *api_version);
 };
 
 #endif /* AI_INSTANCE_HPP */
--- a/src/game/game_instance.cpp
+++ b/src/game/game_instance.cpp
@@ -89,6 +89,8 @@
 
 void GameInstance::Initialize(GameInfo *info)
 {
+	this->versionAPI = info->GetAPIVersion();
+
 	/* Register the GameController */
 	SQGSController_Register(this->engine);
 
@@ -192,6 +194,8 @@
 	SQGSWindow_Register(this->engine);
 
 	RegisterGameTranslation(this->engine);
+
+	if (!this->LoadCompatibilityScripts(this->versionAPI, GAME_DIR)) this->Died();
 }
 
 int GameInstance::GetSetting(const char *name)
--- a/src/script/script_instance.cpp
+++ b/src/script/script_instance.cpp
@@ -27,6 +27,7 @@
 
 #include "../company_base.h"
 #include "../company_func.h"
+#include "../fileio_func.h"
 
 ScriptStorage::~ScriptStorage()
 {
@@ -104,6 +105,28 @@
 	squirrel_register_std(this->engine);
 }
 
+bool ScriptInstance::LoadCompatibilityScripts(const char *api_version, Subdirectory dir)
+{
+	char script_name[32];
+	seprintf(script_name, lastof(script_name), "compat_%s.nut", api_version);
+	char buf[MAX_PATH];
+	Searchpath sp;
+	FOR_ALL_SEARCHPATHS(sp) {
+		FioAppendDirectory(buf, MAX_PATH, sp, dir);
+		ttd_strlcat(buf, script_name, MAX_PATH);
+		if (!FileExists(buf)) continue;
+
+		if (this->engine->LoadScript(buf)) return true;
+
+		ScriptLog::Error("Failed to load API compatibility script");
+		DEBUG(script, 0, "Error compiling / running API compatibility script: %s", buf);
+		return false;
+	}
+
+	ScriptLog::Warning("API compatibility script not found");
+	return true;
+}
+
 ScriptInstance::~ScriptInstance()
 {
 	ScriptObject::ActiveInstance active(this);
--- a/src/script/script_instance.hpp
+++ b/src/script/script_instance.hpp
@@ -17,6 +17,7 @@
 
 #include "../command_type.h"
 #include "../company_type.h"
+#include "../fileio_type.h"
 
 static const uint SQUIRREL_MAX_DEPTH = 25; ///< The maximum recursive depth for items stored in the savegame.
 
@@ -176,6 +177,7 @@
 
 protected:
 	class Squirrel *engine;               ///< A wrapper around the squirrel vm.
+	const char *versionAPI;               ///< Current API used by this script.
 
 	/**
 	 * Register all API functions to the VM.
@@ -183,6 +185,14 @@
 	virtual void RegisterAPI();
 
 	/**
+	 * Load squirrel scripts to emulate an older API.
+	 * @param api_version: API version to load scripts for
+	 * @param dir Subdirectory to find the scripts in
+	 * @return true iff script loading should proceed
+	 */
+	bool LoadCompatibilityScripts(const char *api_version, Subdirectory dir);
+
+	/**
 	 * Tell the script it died.
 	 */
 	virtual void Died();