2020-01-11 21:30:23 +00:00
|
|
|
#include "AngelScripResolver.hpp"
|
|
|
|
#include "../../extern/angelscript_addons/scripthelper/scripthelper.h"
|
2020-01-13 18:21:41 +00:00
|
|
|
#include "../../extern/angelscript_addons/scriptstdstring/scriptstdstring.h"
|
2020-01-13 18:52:32 +00:00
|
|
|
#include "TypeRegistry/Library/RegisterGrowthRateTypes.hpp"
|
|
|
|
#include "TypeRegistry/Library/RegisterItemTypes.hpp"
|
|
|
|
#include "TypeRegistry/Library/RegisterMoveTypes.hpp"
|
|
|
|
#include "TypeRegistry/Library/RegisterPokemonTypes.hpp"
|
2020-01-11 21:30:23 +00:00
|
|
|
|
2020-01-13 18:43:34 +00:00
|
|
|
CreatureLib::Battling::ScriptResolver* PkmnLib::Battling::BattleLibrary::CreateScriptResolver() {
|
2020-01-11 21:30:23 +00:00
|
|
|
return new AngelScripResolver();
|
|
|
|
}
|
2020-01-12 17:20:59 +00:00
|
|
|
|
2020-01-11 21:30:23 +00:00
|
|
|
void AngelScripResolver::Initialize(CreatureLib::Battling::BattleLibrary* library) {
|
|
|
|
_engine = asCreateScriptEngine();
|
|
|
|
|
|
|
|
_engine->SetEngineProperty(asEP_DISALLOW_EMPTY_LIST_ELEMENTS, true);
|
|
|
|
_engine->SetEngineProperty(asEP_DISALLOW_VALUE_ASSIGN_FOR_REF_TYPE, true);
|
|
|
|
_engine->SetEngineProperty(asEP_ALWAYS_IMPL_DEFAULT_CONSTRUCT, true);
|
|
|
|
_engine->SetEngineProperty(asEP_AUTO_GARBAGE_COLLECT, false);
|
|
|
|
|
|
|
|
int32_t r = _engine->SetMessageCallback(asFUNCTION(MessageCallback), nullptr, asCALL_CDECL);
|
|
|
|
if (r < 0)
|
|
|
|
throw CreatureException("Registering message callback failed.");
|
|
|
|
|
|
|
|
RegisterStdString(_engine);
|
|
|
|
r = _engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(Print), asCALL_CDECL);
|
2020-01-13 18:43:34 +00:00
|
|
|
if (r < 0)
|
|
|
|
throw CreatureException("Registering print function failed.");
|
2020-01-11 21:30:23 +00:00
|
|
|
|
|
|
|
RegisterExceptionRoutines(_engine);
|
|
|
|
|
|
|
|
RegisterPokemonTypes::Register(_engine);
|
2020-01-13 18:21:41 +00:00
|
|
|
RegisterItemTypes::Register(_engine);
|
2020-01-13 18:43:34 +00:00
|
|
|
RegisterMoveTypes::Register(_engine);
|
2020-01-13 18:52:32 +00:00
|
|
|
RegisterGrowthRateTypes::Register(_engine);
|
2020-01-11 21:30:23 +00:00
|
|
|
|
|
|
|
_mainModule = _engine->GetModule("pkmn", asGM_ALWAYS_CREATE);
|
|
|
|
|
|
|
|
_contextPool = new ContextPool(_engine);
|
|
|
|
}
|
|
|
|
AngelScriptTypeInfo* AngelScripResolver::GetTypeInfo(const std::string& name) {
|
|
|
|
auto find = _types.find(name);
|
2020-01-13 18:43:34 +00:00
|
|
|
if (find != _types.end()) {
|
2020-01-11 21:30:23 +00:00
|
|
|
return find->second;
|
|
|
|
}
|
|
|
|
auto type = _mainModule->GetTypeInfoByDecl(name.c_str());
|
2020-01-13 18:43:34 +00:00
|
|
|
if (type == nullptr) {
|
2020-01-11 21:30:23 +00:00
|
|
|
_types.insert({name, nullptr});
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
auto typeinfo = new AngelScriptTypeInfo(type);
|
|
|
|
_types.insert({name, typeinfo});
|
|
|
|
return typeinfo;
|
|
|
|
}
|
|
|
|
void AngelScripResolver::MessageCallback(const asSMessageInfo* msg, void* param) {
|
|
|
|
const char* type = "ERR ";
|
|
|
|
if (msg->type == asMSGTYPE_WARNING)
|
|
|
|
type = "WARN";
|
|
|
|
else if (msg->type == asMSGTYPE_INFORMATION)
|
|
|
|
type = "INFO";
|
|
|
|
printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);
|
|
|
|
}
|
|
|
|
CreatureLib::Battling::Script* AngelScripResolver::LoadScript(ScriptCategory category, const std::string& scriptName) {
|
|
|
|
auto typeInfo = GetTypeInfo(scriptName);
|
2020-01-13 18:43:34 +00:00
|
|
|
if (typeInfo == nullptr)
|
|
|
|
return nullptr;
|
2020-01-11 21:30:23 +00:00
|
|
|
auto ctx = _contextPool->RequestContext();
|
|
|
|
auto obj = typeInfo->Instantiate(ctx);
|
|
|
|
_contextPool->ReturnContextToPool(ctx);
|
|
|
|
return new AngelScriptScript(scriptName, typeInfo, obj, _contextPool);
|
|
|
|
}
|
|
|
|
void AngelScripResolver::FinalizeModule() {
|
|
|
|
int r = _mainModule->Build();
|
|
|
|
if (r < 0)
|
|
|
|
throw CreatureException("Building Script Module failed.");
|
|
|
|
}
|
|
|
|
void AngelScripResolver::CreateScript(const char* scriptName) {
|
|
|
|
auto scriptString = _loadFunc(scriptName);
|
|
|
|
_mainModule->AddScriptSection(scriptName, scriptString);
|
|
|
|
}
|