Adds caching for expensive type resolution.
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
7e9e574577
commit
e5ea2bbc90
|
@ -1,4 +1,5 @@
|
||||||
#include "AngelScriptEvolutionScript.hpp"
|
#include "AngelScriptEvolutionScript.hpp"
|
||||||
|
#include "AngelScriptFunctionCall.hpp"
|
||||||
#include "AngelScriptResolver.hpp"
|
#include "AngelScriptResolver.hpp"
|
||||||
|
|
||||||
void AngelScriptEvolutionScript::DoesEvolveFromLevelUp(
|
void AngelScriptEvolutionScript::DoesEvolveFromLevelUp(
|
||||||
|
@ -8,7 +9,7 @@ void AngelScriptEvolutionScript::DoesEvolveFromLevelUp(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__DoesEvolveFromLevelUp.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__DoesEvolveFromLevelUp.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {
|
[&]([[maybe_unused]] asIScriptContext* ctx) {
|
||||||
ctx->SetArgObject(0, (void*)evolution.GetRaw());
|
ctx->SetArgObject(0, (void*)evolution.GetRaw());
|
||||||
ctx->SetArgObject(1, (void*)pokemon.GetRaw());
|
ctx->SetArgObject(1, (void*)pokemon.GetRaw());
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef PKMNLIB_ANGELSCRIPTEVOLUTIONSCRIPT_HPP
|
#ifndef PKMNLIB_ANGELSCRIPTEVOLUTIONSCRIPT_HPP
|
||||||
#define PKMNLIB_ANGELSCRIPTEVOLUTIONSCRIPT_HPP
|
#define PKMNLIB_ANGELSCRIPTEVOLUTIONSCRIPT_HPP
|
||||||
|
#include <angelscript.h>
|
||||||
#include "../../Battling/Pokemon/Pokemon.hpp"
|
#include "../../Battling/Pokemon/Pokemon.hpp"
|
||||||
#include "../../Library/Evolutions/EvolutionData.hpp"
|
#include "../../Library/Evolutions/EvolutionData.hpp"
|
||||||
#include "AngelScriptFunctionCall.hpp"
|
|
||||||
|
|
||||||
class AngelScriptResolver;
|
class AngelScriptResolver;
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
#ifndef PKMNLIB_ANGELSCRIPTFUNCTIONCALL_HPP
|
#ifndef PKMNLIB_ANGELSCRIPTFUNCTIONCALL_HPP
|
||||||
#define PKMNLIB_ANGELSCRIPTFUNCTIONCALL_HPP
|
#define PKMNLIB_ANGELSCRIPTFUNCTIONCALL_HPP
|
||||||
|
|
||||||
|
#include "AngelScriptResolver.hpp"
|
||||||
#include "ContextPool.hpp"
|
#include "ContextPool.hpp"
|
||||||
|
|
||||||
class AngelScriptUtils {
|
class AngelScriptUtils {
|
||||||
public:
|
public:
|
||||||
static void AngelscriptFunctionCall(asIScriptFunction* func, ContextPool* ctxPool, asIScriptObject* obj,
|
static void AngelscriptFunctionCall(asIScriptFunction* func, ContextPool* ctxPool, asIScriptObject* obj,
|
||||||
const ArbUt::StringView& scriptName,
|
AngelScriptResolver* resolver, const ArbUt::StringView& scriptName,
|
||||||
const std::function<void(asIScriptContext*)>& setup,
|
const std::function<void(asIScriptContext*)>& setup,
|
||||||
const std::function<void(asIScriptContext*)>& onEnd) {
|
const std::function<void(asIScriptContext*)>& onEnd) {
|
||||||
auto ctx = asGetActiveContext();
|
auto ctx = asGetActiveContext();
|
||||||
|
@ -17,6 +18,9 @@ public:
|
||||||
} else {
|
} else {
|
||||||
ctx->PushState();
|
ctx->PushState();
|
||||||
}
|
}
|
||||||
|
if (ctx->GetUserData() == nullptr) {
|
||||||
|
ctx->SetUserData(resolver->GetUserdata());
|
||||||
|
}
|
||||||
ctx->Prepare(func);
|
ctx->Prepare(func);
|
||||||
ctx->SetObject(obj);
|
ctx->SetObject(obj);
|
||||||
setup(ctx);
|
setup(ctx);
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#include "AngelScriptItemUseScript.hpp"
|
#include "AngelScriptItemUseScript.hpp"
|
||||||
|
#include "AngelScriptFunctionCall.hpp"
|
||||||
#include "AngelScriptResolver.hpp"
|
#include "AngelScriptResolver.hpp"
|
||||||
|
#include "AngelscriptUserdata.hpp"
|
||||||
|
|
||||||
CScriptArray*
|
CScriptArray*
|
||||||
AngelScriptItemUseScript::GetEffectParameters(const ArbUt::List<CreatureLib::Library::EffectParameter*>& ls) {
|
AngelScriptItemUseScript::GetEffectParameters(const ArbUt::List<CreatureLib::Library::EffectParameter*>& ls) {
|
||||||
asITypeInfo* t = _resolver->GetBaseType("array<EffectParameter@>"_cnc);
|
auto* ud = _resolver->GetUserdata();
|
||||||
CScriptArray* arr = CScriptArray::Create(t, ls.Count());
|
auto* arr = ud->CreateArray("array<EffectParameter@>"_cnc, ls.Count());
|
||||||
for (size_t i = 0; i < ls.Count(); i++) {
|
for (size_t i = 0; i < ls.Count(); i++) {
|
||||||
arr->SetValue(i, (void**)&ls[i]);
|
arr->SetValue(i, (void**)&ls[i]);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +17,7 @@ void AngelScriptItemUseScript::OnInitialize(const ArbUt::List<CreatureLib::Libra
|
||||||
if (__OnInitialize.Exists) {
|
if (__OnInitialize.Exists) {
|
||||||
CScriptArray* arr = nullptr;
|
CScriptArray* arr = nullptr;
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__OnInitialize.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__OnInitialize.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {
|
[&]([[maybe_unused]] asIScriptContext* ctx) {
|
||||||
arr = GetEffectParameters(parameters);
|
arr = GetEffectParameters(parameters);
|
||||||
ctx->SetArgAddress(0, arr);
|
ctx->SetArgAddress(0, arr);
|
||||||
|
@ -32,7 +34,7 @@ bool AngelScriptItemUseScript::IsItemUsable() const {
|
||||||
}
|
}
|
||||||
bool res = false;
|
bool res = false;
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__IsItemUsable.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__IsItemUsable.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {},
|
[&]([[maybe_unused]] asIScriptContext* ctx) {},
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
||||||
return res;
|
return res;
|
||||||
|
@ -44,7 +46,7 @@ bool AngelScriptItemUseScript::IsCreatureUseItem() const {
|
||||||
}
|
}
|
||||||
bool res = false;
|
bool res = false;
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__IsPokemonUseItem.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__IsPokemonUseItem.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {},
|
[&]([[maybe_unused]] asIScriptContext* ctx) {},
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
||||||
return res;
|
return res;
|
||||||
|
@ -55,7 +57,7 @@ bool AngelScriptItemUseScript::IsUseValidForCreature(CreatureLib::Battling::Crea
|
||||||
}
|
}
|
||||||
bool res = false;
|
bool res = false;
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__IsUseValidForPokemon.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__IsUseValidForPokemon.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) { ctx->SetArgObject(0, (void*)creature); },
|
[&]([[maybe_unused]] asIScriptContext* ctx) { ctx->SetArgObject(0, (void*)creature); },
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
||||||
return res;
|
return res;
|
||||||
|
@ -66,7 +68,7 @@ bool AngelScriptItemUseScript::IsHoldable() const {
|
||||||
}
|
}
|
||||||
bool res = false;
|
bool res = false;
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__IsHoldable.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__IsHoldable.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {},
|
[&]([[maybe_unused]] asIScriptContext* ctx) {},
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
[&]([[maybe_unused]] asIScriptContext* ctx) { res = ctx->GetReturnByte() == 1; });
|
||||||
return res;
|
return res;
|
||||||
|
@ -76,7 +78,7 @@ void AngelScriptItemUseScript::OnUse() const {
|
||||||
CreatureLib::Battling::ItemUseScript::OnUse();
|
CreatureLib::Battling::ItemUseScript::OnUse();
|
||||||
}
|
}
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__OnUse.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__OnUse.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {}, [&]([[maybe_unused]] asIScriptContext* ctx) {});
|
[&]([[maybe_unused]] asIScriptContext* ctx) {}, [&]([[maybe_unused]] asIScriptContext* ctx) {});
|
||||||
}
|
}
|
||||||
void AngelScriptItemUseScript::OnCreatureUse(CreatureLib::Battling::Creature* creature) const {
|
void AngelScriptItemUseScript::OnCreatureUse(CreatureLib::Battling::Creature* creature) const {
|
||||||
|
@ -84,7 +86,7 @@ void AngelScriptItemUseScript::OnCreatureUse(CreatureLib::Battling::Creature* cr
|
||||||
CreatureLib::Battling::ItemUseScript::OnUse();
|
CreatureLib::Battling::ItemUseScript::OnUse();
|
||||||
}
|
}
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
__OnPokemonUse.Function, _resolver->GetContextPool(), _scriptObject, ""_cnc,
|
__OnPokemonUse.Function, _resolver->GetContextPool(), _scriptObject, _resolver, ""_cnc,
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) { ctx->SetArgObject(0, (void*)creature); },
|
[&]([[maybe_unused]] asIScriptContext* ctx) { ctx->SetArgObject(0, (void*)creature); },
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {});
|
[&]([[maybe_unused]] asIScriptContext* ctx) {});
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include <CreatureLib/Battling/ScriptHandling/ItemUseScript.hpp>
|
#include <CreatureLib/Battling/ScriptHandling/ItemUseScript.hpp>
|
||||||
#include "../../../extern/angelscript_addons/scriptarray/scriptarray.h"
|
#include "../../../extern/angelscript_addons/scriptarray/scriptarray.h"
|
||||||
#include "AngelScriptFunctionCall.hpp"
|
|
||||||
|
|
||||||
class AngelScriptResolver;
|
class AngelScriptResolver;
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,10 @@
|
||||||
#include "../../Battling/PkmnScriptCategory.hpp"
|
#include "../../Battling/PkmnScriptCategory.hpp"
|
||||||
#include "../../Battling/Pokemon/Pokemon.hpp"
|
#include "../../Battling/Pokemon/Pokemon.hpp"
|
||||||
#include "AngelScriptMetadata.hpp"
|
#include "AngelScriptMetadata.hpp"
|
||||||
|
#include "AngelscriptUserdata.hpp"
|
||||||
#include "ByteCodeHandling/FileByteCodeStream.hpp"
|
#include "ByteCodeHandling/FileByteCodeStream.hpp"
|
||||||
#include "ByteCodeHandling/MemoryByteCodeStream.hpp"
|
#include "ByteCodeHandling/MemoryByteCodeStream.hpp"
|
||||||
|
#include "ContextPool.hpp"
|
||||||
#include "TypeRegistry/BasicScriptClass.hpp"
|
#include "TypeRegistry/BasicScriptClass.hpp"
|
||||||
#include "TypeRegistry/Battling/RegisterBattleClass.hpp"
|
#include "TypeRegistry/Battling/RegisterBattleClass.hpp"
|
||||||
#include "TypeRegistry/Battling/RegisterBattleLibrary.hpp"
|
#include "TypeRegistry/Battling/RegisterBattleLibrary.hpp"
|
||||||
|
@ -48,6 +50,22 @@ static void TranslateException(asIScriptContext* ctx, void* /*userParam*/) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AngelScriptResolver::AngelScriptResolver() : _userData(new AngelscriptUserdata(this)) {}
|
||||||
|
|
||||||
|
AngelScriptResolver::~AngelScriptResolver() {
|
||||||
|
for (const auto& ius : _itemUseScripts) {
|
||||||
|
delete ius.second;
|
||||||
|
}
|
||||||
|
delete _contextPool;
|
||||||
|
for (const auto& category : _typeDatabase) {
|
||||||
|
for (const auto& type : category.second) {
|
||||||
|
delete type.second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete _userData;
|
||||||
|
_engine->ShutDownAndRelease();
|
||||||
|
}
|
||||||
|
|
||||||
void AngelScriptResolver::Initialize(CreatureLib::Battling::BattleLibrary* arg, bool includeStandard) {
|
void AngelScriptResolver::Initialize(CreatureLib::Battling::BattleLibrary* arg, bool includeStandard) {
|
||||||
for (auto scriptCategory : ScriptCategoryHelper::GetValues()) {
|
for (auto scriptCategory : ScriptCategoryHelper::GetValues()) {
|
||||||
_typeDatabase.Insert(scriptCategory, {});
|
_typeDatabase.Insert(scriptCategory, {});
|
||||||
|
@ -101,7 +119,7 @@ void AngelScriptResolver::Initialize(CreatureLib::Battling::BattleLibrary* arg,
|
||||||
_engine->RegisterGlobalProperty("const StaticLibrary@ StaticLib", (void*)staticLib.get());
|
_engine->RegisterGlobalProperty("const StaticLibrary@ StaticLib", (void*)staticLib.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
_contextPool = new ContextPool(_engine);
|
_contextPool = new ContextPool(_engine, _userData);
|
||||||
|
|
||||||
asPrepareMultithread();
|
asPrepareMultithread();
|
||||||
}
|
}
|
||||||
|
@ -209,6 +227,7 @@ AngelScriptResolver::LoadEvolutionScript(const ArbUt::StringView& view) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
auto* ctx = _contextPool->RequestContext();
|
auto* ctx = _contextPool->RequestContext();
|
||||||
|
|
||||||
auto* factory = typeInfoOption.value().get()->GetFactoryByIndex(0);
|
auto* factory = typeInfoOption.value().get()->GetFactoryByIndex(0);
|
||||||
ctx->Prepare(factory);
|
ctx->Prepare(factory);
|
||||||
auto result = ctx->Execute();
|
auto result = ctx->Execute();
|
||||||
|
@ -441,4 +460,4 @@ i32 AngelScriptResolver::IncludeCallback(const char* include, const char*, CScri
|
||||||
return -102;
|
return -102;
|
||||||
}
|
}
|
||||||
return builder->AddSectionFromFile((const char*)path.c_str());
|
return builder->AddSectionFromFile((const char*)path.c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include "AngelScriptScript.hpp"
|
#include "AngelScriptScript.hpp"
|
||||||
#include "AngelScriptTypeInfo.hpp"
|
#include "AngelScriptTypeInfo.hpp"
|
||||||
|
|
||||||
|
class AngelscriptUserdata;
|
||||||
|
|
||||||
class AngelScriptResolver final : public PkmnLib::Battling::ScriptResolver {
|
class AngelScriptResolver final : public PkmnLib::Battling::ScriptResolver {
|
||||||
private:
|
private:
|
||||||
asIScriptEngine* _engine = nullptr;
|
asIScriptEngine* _engine = nullptr;
|
||||||
|
@ -21,6 +23,7 @@ private:
|
||||||
ContextPool* _contextPool = nullptr;
|
ContextPool* _contextPool = nullptr;
|
||||||
CScriptBuilder _builder = {};
|
CScriptBuilder _builder = {};
|
||||||
std::string _sourceDirectory = {};
|
std::string _sourceDirectory = {};
|
||||||
|
AngelscriptUserdata* _userData;
|
||||||
|
|
||||||
ArbUt::Dictionary<ScriptCategory, ArbUt::Dictionary<ArbUt::StringView, AngelScriptTypeInfo*>> _typeDatabase;
|
ArbUt::Dictionary<ScriptCategory, ArbUt::Dictionary<ArbUt::StringView, AngelScriptTypeInfo*>> _typeDatabase;
|
||||||
ArbUt::Dictionary<ArbUt::StringView, asITypeInfo*> _baseTypes;
|
ArbUt::Dictionary<ArbUt::StringView, asITypeInfo*> _baseTypes;
|
||||||
|
@ -42,18 +45,8 @@ private:
|
||||||
const ArbUt::StringView& effectName);
|
const ArbUt::StringView& effectName);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~AngelScriptResolver() override {
|
AngelScriptResolver();
|
||||||
for (const auto& ius : _itemUseScripts) {
|
~AngelScriptResolver() override;
|
||||||
delete ius.second;
|
|
||||||
}
|
|
||||||
delete _contextPool;
|
|
||||||
for (const auto& category : _typeDatabase) {
|
|
||||||
for (const auto& type : category.second) {
|
|
||||||
delete type.second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_engine->ShutDownAndRelease();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Initialize(CreatureLib::Battling::BattleLibrary* library) override { Initialize(library, true); }
|
void Initialize(CreatureLib::Battling::BattleLibrary* library) override { Initialize(library, true); }
|
||||||
void Initialize(CreatureLib::Battling::BattleLibrary* library, bool includeStandard);
|
void Initialize(CreatureLib::Battling::BattleLibrary* library, bool includeStandard);
|
||||||
|
@ -112,5 +105,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
inline ContextPool* GetContextPool() const noexcept { return _contextPool; }
|
inline ContextPool* GetContextPool() const noexcept { return _contextPool; }
|
||||||
|
|
||||||
|
inline AngelscriptUserdata* GetUserdata() const noexcept { return _userData; }
|
||||||
};
|
};
|
||||||
#endif // PKMNLIB_ANGELSCRIPRESOLVER_HPP
|
#endif // PKMNLIB_ANGELSCRIPRESOLVER_HPP
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
#include "AngelScriptScript.hpp"
|
#include "AngelScriptScript.hpp"
|
||||||
#include "AngelScriptFunctionCall.hpp"
|
#include "AngelScriptFunctionCall.hpp"
|
||||||
#include "AngelScriptResolver.hpp"
|
#include "AngelScriptResolver.hpp"
|
||||||
|
#include "AngelscriptUserdata.hpp"
|
||||||
|
|
||||||
#define CALL_HOOK(name, setup) \
|
#define CALL_HOOK(name, setup) \
|
||||||
auto s = _type->Get##name(); \
|
auto s = _type->Get##name(); \
|
||||||
if (!s.Exists) \
|
if (!s.Exists) \
|
||||||
return; \
|
return; \
|
||||||
AngelScriptUtils::AngelscriptFunctionCall( \
|
AngelScriptUtils::AngelscriptFunctionCall( \
|
||||||
s.Function, _ctxPool, _obj, GetName(), [&]([[maybe_unused]] asIScriptContext* ctx) { setup }, \
|
s.Function, _ctxPool, _obj, _resolver, GetName(), [&]([[maybe_unused]] asIScriptContext* ctx) { setup }, \
|
||||||
[&]([[maybe_unused]] asIScriptContext* ctx) {});
|
[&]([[maybe_unused]] asIScriptContext* ctx) {});
|
||||||
|
|
||||||
CScriptArray* AngelScriptScript::GetEffectParameters(const ArbUt::List<CreatureLib::Library::EffectParameter*>& ls) {
|
CScriptArray* AngelScriptScript::GetEffectParameters(const ArbUt::List<CreatureLib::Library::EffectParameter*>& ls) {
|
||||||
asITypeInfo* t = _resolver->GetBaseType("array<EffectParameter@>"_cnc);
|
auto arr = _resolver->GetUserdata()->CreateArray("array<EffectParameter@>"_cnc, ls.Count());
|
||||||
CScriptArray* arr = CScriptArray::Create(t, ls.Count());
|
|
||||||
for (size_t i = 0; i < ls.Count(); i++) {
|
for (size_t i = 0; i < ls.Count(); i++) {
|
||||||
arr->SetValue(i, (void**)&ls[i]);
|
arr->SetValue(i, (void**)&ls[i]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,10 @@
|
||||||
#include "../../../extern/angelscript_addons/scriptarray/scriptarray.h"
|
#include "../../../extern/angelscript_addons/scriptarray/scriptarray.h"
|
||||||
#include "../../Battling/PkmnScript.hpp"
|
#include "../../Battling/PkmnScript.hpp"
|
||||||
#include "AngelScriptTypeInfo.hpp"
|
#include "AngelScriptTypeInfo.hpp"
|
||||||
#include "ContextPool.hpp"
|
|
||||||
|
|
||||||
class AngelScriptResolver;
|
class AngelScriptResolver;
|
||||||
|
class ContextPool;
|
||||||
|
|
||||||
class AngelScriptScript final : public PkmnLib::Battling::PkmnScript {
|
class AngelScriptScript final : public PkmnLib::Battling::PkmnScript {
|
||||||
private:
|
private:
|
||||||
AngelScriptResolver* _resolver = nullptr;
|
AngelScriptResolver* _resolver = nullptr;
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef PKMNLIB_ANGELSCRIPTUSERDATA_HPP
|
||||||
|
#define PKMNLIB_ANGELSCRIPTUSERDATA_HPP
|
||||||
|
#include <Arbutils/Collections/Dictionary.hpp>
|
||||||
|
#include "AngelScriptResolver.hpp"
|
||||||
|
|
||||||
|
class AngelscriptUserdata {
|
||||||
|
AngelScriptResolver* _resolver;
|
||||||
|
ArbUt::Dictionary<ArbUt::StringView, asITypeInfo*> _cachedTypes;
|
||||||
|
|
||||||
|
public:
|
||||||
|
AngelscriptUserdata(AngelScriptResolver* r) : _resolver(r) {}
|
||||||
|
|
||||||
|
~AngelscriptUserdata() {
|
||||||
|
for (auto& t : _cachedTypes) {
|
||||||
|
t.second->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asITypeInfo* GetType(const ArbUt::StringView& name) {
|
||||||
|
auto v = _cachedTypes.TryGet(name);
|
||||||
|
if (v.has_value()) {
|
||||||
|
return v.value();
|
||||||
|
}
|
||||||
|
auto t = _resolver->GetBaseType(name);
|
||||||
|
t->AddRef();
|
||||||
|
_cachedTypes.Set(name, t);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CScriptArray* CreateArray(const ArbUt::StringView& name, size_t length) {
|
||||||
|
auto t = GetType(name);
|
||||||
|
return CScriptArray::Create(t, length);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PKMNLIB_ANGELSCRIPTUSERDATA_HPP
|
|
@ -4,6 +4,7 @@
|
||||||
#include <angelscript.h>
|
#include <angelscript.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include "AngelscriptUserdata.hpp"
|
||||||
|
|
||||||
class ContextPool {
|
class ContextPool {
|
||||||
struct CtxThreadedPoolStorage {
|
struct CtxThreadedPoolStorage {
|
||||||
|
@ -19,6 +20,7 @@ class ContextPool {
|
||||||
|
|
||||||
ArbUt::Dictionary<std::thread::id, CtxThreadedPoolStorage*> _pool;
|
ArbUt::Dictionary<std::thread::id, CtxThreadedPoolStorage*> _pool;
|
||||||
asIScriptEngine* _engine;
|
asIScriptEngine* _engine;
|
||||||
|
AngelscriptUserdata* _userData;
|
||||||
|
|
||||||
CtxThreadedPoolStorage* GetThreadPool() {
|
CtxThreadedPoolStorage* GetThreadPool() {
|
||||||
auto id = std::this_thread::get_id();
|
auto id = std::this_thread::get_id();
|
||||||
|
@ -30,7 +32,7 @@ class ContextPool {
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ContextPool(asIScriptEngine* engine) : _engine(engine) {}
|
ContextPool(asIScriptEngine* engine, AngelscriptUserdata* userData) : _engine(engine), _userData(userData) {}
|
||||||
|
|
||||||
~ContextPool() {
|
~ContextPool() {
|
||||||
for (const auto& kv : _pool) {
|
for (const auto& kv : _pool) {
|
||||||
|
@ -48,6 +50,7 @@ public:
|
||||||
pool->Pool.pop_back();
|
pool->Pool.pop_back();
|
||||||
} else {
|
} else {
|
||||||
ctx = _engine->CreateContext();
|
ctx = _engine->CreateContext();
|
||||||
|
ctx->SetUserData(_userData);
|
||||||
}
|
}
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "../../../../Battling/Pokemon/Pokemon.hpp"
|
#include "../../../../Battling/Pokemon/Pokemon.hpp"
|
||||||
#include "../../AngelScriptResolver.hpp"
|
#include "../../AngelScriptResolver.hpp"
|
||||||
#include "../../AngelScriptScript.hpp"
|
#include "../../AngelScriptScript.hpp"
|
||||||
|
#include "../../AngelscriptUserdata.hpp"
|
||||||
#include "../HelperFile.hpp"
|
#include "../HelperFile.hpp"
|
||||||
|
|
||||||
void RegisterBattleClass::Register(asIScriptEngine* engine) {
|
void RegisterBattleClass::Register(asIScriptEngine* engine) {
|
||||||
|
@ -99,17 +100,29 @@ void RegisterBattleClass::RegisterBattleSide(asIScriptEngine* engine) {
|
||||||
void RegisterBattleClass::RegisterBattle(asIScriptEngine* engine) {
|
void RegisterBattleClass::RegisterBattle(asIScriptEngine* engine) {
|
||||||
REGISTER_GETTER("Battle", "const BattleLibrary@ get_Library() const property", CreatureLib::Battling::Battle,
|
REGISTER_GETTER("Battle", "const BattleLibrary@ get_Library() const property", CreatureLib::Battling::Battle,
|
||||||
GetLibrary);
|
GetLibrary);
|
||||||
REGISTER_GETTER("Battle", "bool get_CanFlee() const property", CreatureLib::Battling::Battle,
|
REGISTER_GETTER("Battle", "bool get_CanFlee() const property", CreatureLib::Battling::Battle, CanFlee);
|
||||||
CanFlee);
|
REGISTER_GETTER("Battle", "uint get_CurrentTurn() const property", CreatureLib::Battling::Battle, GetCurrentTurn);
|
||||||
REGISTER_GETTER("Battle", "uint get_CurrentTurn() const property", CreatureLib::Battling::Battle,
|
REGISTER_GETTER("Battle", "BattleRandom@ get_Random() const property", CreatureLib::Battling::Battle, GetRandom);
|
||||||
GetCurrentTurn);
|
|
||||||
REGISTER_GETTER("Battle", "BattleRandom@ get_Random() const property", CreatureLib::Battling::Battle,
|
|
||||||
GetRandom);
|
|
||||||
REGISTER_GETTER("Battle", "ChoiceQueue@ get_TurnQueue() const property", CreatureLib::Battling::Battle,
|
REGISTER_GETTER("Battle", "ChoiceQueue@ get_TurnQueue() const property", CreatureLib::Battling::Battle,
|
||||||
GetCurrentTurnQueue);
|
GetCurrentTurnQueue);
|
||||||
|
{
|
||||||
|
auto l = [](const CreatureLib::Battling::Battle* b) {
|
||||||
|
const auto& ls = b->GetSides();
|
||||||
|
auto* ctx = asGetActiveContext();
|
||||||
|
auto* ud = (AngelscriptUserdata*)ctx->GetUserData();
|
||||||
|
auto* arr = ud->CreateArray("array<BattleSide@>"_cnc, ls.Count());
|
||||||
|
for (size_t i = 0; i < ls.Count(); i++) {
|
||||||
|
arr->SetValue(i, ls[i].GetRaw());
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
};
|
||||||
|
Ensure(engine->RegisterObjectMethod("Battle", "const array<BattleSide@>& get_Sides() const property",
|
||||||
|
asFUNCTIONPR(l, (const CreatureLib::Battling::Battle*), CScriptArray*),
|
||||||
|
asCALL_CDECL_OBJFIRST) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
auto r = engine->RegisterObjectMethod("Battle", "bool CanUse(BaseTurnChoice@ choice)",
|
auto r = engine->RegisterObjectMethod("Battle", "bool CanUse(BaseTurnChoice@ choice)",
|
||||||
asMETHOD(PkmnLib::Battling::Battle, CanUse), asCALL_THISCALL);
|
asMETHOD(PkmnLib::Battling::Battle, CanUse), asCALL_THISCALL);
|
||||||
Ensure(r >= 0);
|
Ensure(r >= 0);
|
||||||
r = engine->RegisterObjectMethod("Battle", "ref@ AddVolatile(const constString &in name)",
|
r = engine->RegisterObjectMethod("Battle", "ref@ AddVolatile(const constString &in name)",
|
||||||
asFUNCTION(AddVolatileWrapper), asCALL_CDECL_OBJFIRST);
|
asFUNCTION(AddVolatileWrapper), asCALL_CDECL_OBJFIRST);
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "../../../../Battling/Pokemon/Pokemon.hpp"
|
#include "../../../../Battling/Pokemon/Pokemon.hpp"
|
||||||
#include "../../AngelScriptResolver.hpp"
|
#include "../../AngelScriptResolver.hpp"
|
||||||
#include "../../AngelScriptScript.hpp"
|
#include "../../AngelScriptScript.hpp"
|
||||||
|
#include "../../AngelscriptUserdata.hpp"
|
||||||
#include "../HelperFile.hpp"
|
#include "../HelperFile.hpp"
|
||||||
|
|
||||||
void RegisterPokemonClass::Register(asIScriptEngine* engine) {
|
void RegisterPokemonClass::Register(asIScriptEngine* engine) {
|
||||||
|
@ -63,10 +64,9 @@ ENUM__SIZE_WRAPPER(Pkmn_GenderWrapper, PkmnLib::Battling::Pokemon, GetGender)
|
||||||
CScriptArray* GetMoves(const PkmnLib::Battling::Pokemon* obj) {
|
CScriptArray* GetMoves(const PkmnLib::Battling::Pokemon* obj) {
|
||||||
asIScriptContext* ctx = asGetActiveContext();
|
asIScriptContext* ctx = asGetActiveContext();
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
asIScriptEngine* engine = ctx->GetEngine();
|
|
||||||
asITypeInfo* t = engine->GetTypeInfoByDecl("array<LearnedMove@>");
|
|
||||||
auto a = obj->GetMoves();
|
auto a = obj->GetMoves();
|
||||||
CScriptArray* arr = CScriptArray::Create(t, a.Count());
|
auto ud = (AngelscriptUserdata*)ctx->GetUserData();
|
||||||
|
CScriptArray* arr = ud->CreateArray("array<LearnedMove@>"_cnc, a.Count());
|
||||||
for (size_t i = 0; i < a.Count(); i++) {
|
for (size_t i = 0; i < a.Count(); i++) {
|
||||||
arr->SetValue(i, &a[i]);
|
arr->SetValue(i, &a[i]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "../../extern/doctest.hpp"
|
#include "../../extern/doctest.hpp"
|
||||||
#include "../../src/Battling/Pokemon/CreatePokemon.hpp"
|
#include "../../src/Battling/Pokemon/CreatePokemon.hpp"
|
||||||
#include "../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../TestLibrary/TestLibrary.hpp"
|
#include "../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
#define AS_CLASS(name, contents) \
|
#define AS_CLASS(name, contents) \
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifdef TESTS_BUILD
|
#ifdef TESTS_BUILD
|
||||||
#include "../../extern/doctest.hpp"
|
#include "../../extern/doctest.hpp"
|
||||||
#include "../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../TestLibrary/TestLibrary.hpp"
|
#include "../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "../../../../src/Battling/Battle/Battle.hpp"
|
#include "../../../../src/Battling/Battle/Battle.hpp"
|
||||||
#include "../../../../src/Battling/Pokemon/CreatePokemon.hpp"
|
#include "../../../../src/Battling/Pokemon/CreatePokemon.hpp"
|
||||||
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../../../TestLibrary/TestLibrary.hpp"
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "../../../../extern/doctest.hpp"
|
#include "../../../../extern/doctest.hpp"
|
||||||
#include "../../../../src/Battling/Pokemon/CreatePokemon.hpp"
|
#include "../../../../src/Battling/Pokemon/CreatePokemon.hpp"
|
||||||
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../../../TestLibrary/TestLibrary.hpp"
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifdef TESTS_BUILD
|
#ifdef TESTS_BUILD
|
||||||
#include "../../../../extern/doctest.hpp"
|
#include "../../../../extern/doctest.hpp"
|
||||||
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../../../TestLibrary/TestLibrary.hpp"
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifdef TESTS_BUILD
|
#ifdef TESTS_BUILD
|
||||||
#include "../../../../extern/doctest.hpp"
|
#include "../../../../extern/doctest.hpp"
|
||||||
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../../../TestLibrary/TestLibrary.hpp"
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifdef TESTS_BUILD
|
#ifdef TESTS_BUILD
|
||||||
#include "../../../../extern/doctest.hpp"
|
#include "../../../../extern/doctest.hpp"
|
||||||
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../../../TestLibrary/TestLibrary.hpp"
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifdef TESTS_BUILD
|
#ifdef TESTS_BUILD
|
||||||
#include "../../../../extern/doctest.hpp"
|
#include "../../../../extern/doctest.hpp"
|
||||||
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../../../TestLibrary/TestLibrary.hpp"
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifdef TESTS_BUILD
|
#ifdef TESTS_BUILD
|
||||||
#include "../../../../extern/doctest.hpp"
|
#include "../../../../extern/doctest.hpp"
|
||||||
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
||||||
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
||||||
#include "../../../TestLibrary/TestLibrary.hpp"
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
static std::unordered_map<const char*, const char*> _scripts =
|
static std::unordered_map<const char*, const char*> _scripts =
|
||||||
|
|
Loading…
Reference in New Issue