Continue porting overworld to scripting
This commit is contained in:
parent
4c02204eff
commit
1ada542fa5
@ -177,7 +177,17 @@ namespace Scripting
|
||||
void ScriptEngine::runFunction(std::string function_name)
|
||||
{
|
||||
std::function<void(asIScriptContext*)> callback;
|
||||
runFunction(function_name, callback);
|
||||
std::function<void(asIScriptContext*)> get_return_value;
|
||||
runFunction(function_name, callback, get_return_value);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void ScriptEngine::runFunction(std::string function_name,
|
||||
std::function<void(asIScriptContext*)> callback)
|
||||
{
|
||||
std::function<void(asIScriptContext*)> get_return_value;
|
||||
runFunction(function_name, callback, get_return_value);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -185,7 +195,9 @@ namespace Scripting
|
||||
/** runs the specified script
|
||||
* \param string scriptName = name of script to run
|
||||
*/
|
||||
void ScriptEngine::runFunction(std::string function_name, std::function<void(asIScriptContext*)> callback)
|
||||
void ScriptEngine::runFunction(std::string function_name,
|
||||
std::function<void(asIScriptContext*)> callback,
|
||||
std::function<void(asIScriptContext*)> get_return_value)
|
||||
{
|
||||
int r; //int for error checking
|
||||
|
||||
@ -199,11 +211,11 @@ namespace Scripting
|
||||
if (cached_script == m_loaded_files.end())
|
||||
{
|
||||
// Compile the script code
|
||||
Log::debug("Scripting", "Compiling script '%s' (was not in cache)", script_filename.c_str());
|
||||
Log::info("Scripting", "Checking for script file '%s'", script_filename.c_str());
|
||||
r = compileScript(m_engine, script_filename);
|
||||
if (r < 0)
|
||||
{
|
||||
Log::debug("Scripting", "Script '%s' is not available", script_filename.c_str());
|
||||
Log::info("Scripting", "Script '%s' is not available", script_filename.c_str());
|
||||
m_loaded_files[script_filename] = false;
|
||||
m_functions_cache[function_name] = NULL; // remember that this script is unavailable
|
||||
return;
|
||||
@ -306,6 +318,9 @@ namespace Scripting
|
||||
// Retrieve the return value from the context here (for scripts that return values)
|
||||
// <type> returnValue = ctx->getReturnType(); for example
|
||||
//float returnValue = ctx->GetReturnFloat();
|
||||
|
||||
if (get_return_value)
|
||||
get_return_value(ctx);
|
||||
}
|
||||
|
||||
// We must release the contexts when no longer using them
|
||||
|
@ -53,7 +53,11 @@ namespace Scripting
|
||||
~ScriptEngine();
|
||||
|
||||
void runFunction(std::string function_name);
|
||||
void runFunction(std::string function_name, std::function<void(asIScriptContext*)> callback);
|
||||
void runFunction(std::string function_name,
|
||||
std::function<void(asIScriptContext*)> callback);
|
||||
void runFunction(std::string function_name,
|
||||
std::function<void(asIScriptContext*)> callback,
|
||||
std::function<void(asIScriptContext*)> get_return_value);
|
||||
void evalScript(std::string script_fragment);
|
||||
void cleanupCache();
|
||||
|
||||
|
@ -1116,6 +1116,8 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
// some static meshes are conditional
|
||||
std::string condition;
|
||||
n->get("if", &condition);
|
||||
|
||||
// TODO: convert "if" and "ifnot" to scripting.
|
||||
if (condition == "splatting")
|
||||
{
|
||||
if (!irr_driver->supportsSplatting()) continue;
|
||||
@ -1193,15 +1195,15 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
|
||||
if (!shown) continue;
|
||||
}
|
||||
else if (condition == "allchallenges")
|
||||
{
|
||||
// allow ONE unsolved challenge : the last one
|
||||
if (getNumOfCompletedChallenges() < m_challenges.size() - 1)
|
||||
continue;
|
||||
}
|
||||
else if (condition.size() > 0)
|
||||
{
|
||||
Log::error("track", "Unknown condition <%s>\n", condition.c_str());
|
||||
unsigned char result = -1;
|
||||
Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
|
||||
std::function<void(asIScriptContext*)> null_callback;
|
||||
script_engine->runFunction("bool " + condition + "()", null_callback,
|
||||
[&](asIScriptContext* ctx) { result = ctx->GetReturnByte(); });
|
||||
if (result == 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string neg_condition;
|
||||
@ -1210,18 +1212,18 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
{
|
||||
if (irr_driver->supportsSplatting()) continue;
|
||||
}
|
||||
else if (neg_condition == "allchallenges")
|
||||
{
|
||||
// allow ONE unsolved challenge : the last one
|
||||
if (getNumOfCompletedChallenges() >= m_challenges.size() - 1)
|
||||
continue;
|
||||
}
|
||||
else if (neg_condition.size() > 0)
|
||||
{
|
||||
Log::error("track", "Unknown condition <%s>\n",
|
||||
neg_condition.c_str());
|
||||
unsigned char result = -1;
|
||||
Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
|
||||
std::function<void(asIScriptContext*)> null_callback;
|
||||
script_engine->runFunction("bool " + neg_condition + "()", null_callback,
|
||||
[&](asIScriptContext* ctx) { result = ctx->GetReturnByte(); });
|
||||
if (result != 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
bool tangent = false;
|
||||
n->get("tangents", &tangent);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user