Reworks setting script owner to something a lot more clean
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
This commit is contained in:
parent
66c742e225
commit
e18767995c
|
@ -19,15 +19,26 @@ AngelScriptScript::AngelScriptScript(const ArbUt::OptionalBorrowedPtr<void>& own
|
||||||
AngelScriptResolver* resolver, AngelScriptTypeInfo* type, asIScriptObject* obj,
|
AngelScriptResolver* resolver, AngelScriptTypeInfo* type, asIScriptObject* obj,
|
||||||
ContextPool* ctxPool)
|
ContextPool* ctxPool)
|
||||||
: PkmnLib::Battling::PkmnScript(owner), _resolver(resolver), _type(type), _ctxPool(ctxPool), _obj(obj) {
|
: PkmnLib::Battling::PkmnScript(owner), _resolver(resolver), _type(type), _ctxPool(ctxPool), _obj(obj) {
|
||||||
if (_type->GetGetOwner().Exists && owner.HasValue()) {
|
if (_type->GetSetOwner().Exists && owner.HasValue()) {
|
||||||
if (ownerType == nullptr) {
|
if (ownerType == nullptr) {
|
||||||
THROW("Script was created with owner value, but with unknown owner type.")
|
THROW("Script was created with owner value, but with unknown owner type.")
|
||||||
}
|
}
|
||||||
auto* handle = GetAngelscriptOwner();
|
_ownerHandle = new CScriptHandle(owner.GetValue(), ownerType);
|
||||||
handle->Set(owner.GetValue(), ownerType);
|
SetAngelscriptOwner(_ownerHandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CreatureLib::Battling::BattleScript* AngelScriptScript::Clone(const ArbUt::OptionalBorrowedPtr<void>& owner) {
|
||||||
|
auto* ctx = _ctxPool->RequestContext();
|
||||||
|
auto* obj = _type->Instantiate(ctx);
|
||||||
|
if (_obj != nullptr) {
|
||||||
|
obj->CopyFrom(_obj);
|
||||||
|
}
|
||||||
|
_ctxPool->ReturnContextToPool(ctx);
|
||||||
|
|
||||||
|
return new AngelScriptScript(owner, GetAngelscriptOwner()->GetType(), _resolver, _type, obj, _ctxPool);
|
||||||
|
}
|
||||||
|
|
||||||
CScriptHandle* AngelScriptScript::GetAngelscriptOwner() {
|
CScriptHandle* AngelScriptScript::GetAngelscriptOwner() {
|
||||||
CScriptHandle* handle = nullptr;
|
CScriptHandle* handle = nullptr;
|
||||||
AngelScriptUtils::AngelscriptFunctionCall(
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
|
@ -36,6 +47,20 @@ CScriptHandle* AngelScriptScript::GetAngelscriptOwner() {
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AngelScriptScript::SetAngelscriptOwner(CScriptHandle* owner) {
|
||||||
|
AngelScriptUtils::AngelscriptFunctionCall(
|
||||||
|
_type->GetSetOwner().Function, _ctxPool, _obj, _resolver, GetName(),
|
||||||
|
[&](asIScriptContext* ctx) { ctx->SetArgObject(0, owner); }, [&](asIScriptContext*) {});
|
||||||
|
}
|
||||||
|
|
||||||
|
AngelScriptScript::~AngelScriptScript() {
|
||||||
|
if (_ownerHandle != nullptr){
|
||||||
|
delete _ownerHandle;
|
||||||
|
}
|
||||||
|
_obj->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AngelScriptScript::OnInitialize(const CreatureLib::Battling::BattleLibrary* library,
|
void AngelScriptScript::OnInitialize(const CreatureLib::Battling::BattleLibrary* library,
|
||||||
const ArbUt::List<CreatureLib::Library::EffectParameter*>& parameters) {
|
const ArbUt::List<CreatureLib::Library::EffectParameter*>& parameters) {
|
||||||
CALL_HOOK(OnInitialize, {
|
CALL_HOOK(OnInitialize, {
|
||||||
|
@ -356,23 +381,13 @@ void AngelScriptScript::PreventOpponentSwitch(const CreatureLib::Battling::Switc
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
void AngelScriptScript::OnEndTurn() { CALL_HOOK(OnEndTurn, {}) }
|
void AngelScriptScript::OnEndTurn() { CALL_HOOK(OnEndTurn, {}) }
|
||||||
void AngelScriptScript::ModifyNumberOfHits(CreatureLib::Battling::AttackTurnChoice* choice,
|
void AngelScriptScript::ModifyNumberOfHits(CreatureLib::Battling::AttackTurnChoice* choice, u8* numberOfHits) {
|
||||||
u8* numberOfHits){CALL_HOOK(ModifyNumberOfHits,
|
CALL_HOOK(ModifyNumberOfHits, {
|
||||||
{
|
|
||||||
ctx->SetArgObject(0, (void*)choice);
|
ctx->SetArgObject(0, (void*)choice);
|
||||||
ctx->SetArgAddress(1, numberOfHits);
|
ctx->SetArgAddress(1, numberOfHits);
|
||||||
})}
|
})
|
||||||
|
|
||||||
CreatureLib::Battling::BattleScript* AngelScriptScript::Clone(const ArbUt::OptionalBorrowedPtr<void>& owner) {
|
|
||||||
auto* ctx = _ctxPool->RequestContext();
|
|
||||||
auto* obj = _type->Instantiate(ctx);
|
|
||||||
if (_obj != nullptr) {
|
|
||||||
obj->CopyFrom(_obj);
|
|
||||||
}
|
}
|
||||||
_ctxPool->ReturnContextToPool(ctx);
|
|
||||||
|
|
||||||
return new AngelScriptScript(owner, GetAngelscriptOwner()->GetType(), _resolver, _type, obj, _ctxPool);
|
|
||||||
}
|
|
||||||
void AngelScriptScript::OnDamage(CreatureLib::Battling::Creature* creature, CreatureLib::Battling::DamageSource source,
|
void AngelScriptScript::OnDamage(CreatureLib::Battling::Creature* creature, CreatureLib::Battling::DamageSource source,
|
||||||
[[maybe_unused]] u32 oldHealth, [[maybe_unused]] u32 newHealth) {
|
[[maybe_unused]] u32 oldHealth, [[maybe_unused]] u32 newHealth) {
|
||||||
CALL_HOOK(OnDamage, {
|
CALL_HOOK(OnDamage, {
|
||||||
|
|
|
@ -18,6 +18,7 @@ private:
|
||||||
AngelScriptResolver* _resolver = nullptr;
|
AngelScriptResolver* _resolver = nullptr;
|
||||||
AngelScriptTypeInfo* _type = nullptr;
|
AngelScriptTypeInfo* _type = nullptr;
|
||||||
ContextPool* _ctxPool = nullptr;
|
ContextPool* _ctxPool = nullptr;
|
||||||
|
CScriptHandle* _ownerHandle = nullptr;
|
||||||
|
|
||||||
asIScriptObject* _obj = nullptr;
|
asIScriptObject* _obj = nullptr;
|
||||||
NativeArray<ArbUt::List<CreatureLib::Library::EffectParameter*>>*
|
NativeArray<ArbUt::List<CreatureLib::Library::EffectParameter*>>*
|
||||||
|
@ -28,7 +29,7 @@ public:
|
||||||
AngelScriptResolver* resolver, AngelScriptTypeInfo* type, asIScriptObject* obj,
|
AngelScriptResolver* resolver, AngelScriptTypeInfo* type, asIScriptObject* obj,
|
||||||
ContextPool* ctxPool);
|
ContextPool* ctxPool);
|
||||||
|
|
||||||
~AngelScriptScript() override { _obj->Release(); }
|
~AngelScriptScript() override;
|
||||||
|
|
||||||
BattleScript* Clone(const ArbUt::OptionalBorrowedPtr<void>& owner) override;
|
BattleScript* Clone(const ArbUt::OptionalBorrowedPtr<void>& owner) override;
|
||||||
|
|
||||||
|
@ -47,6 +48,7 @@ public:
|
||||||
ContextPool* GetContextPool() { return _ctxPool; }
|
ContextPool* GetContextPool() { return _ctxPool; }
|
||||||
|
|
||||||
CScriptHandle* GetAngelscriptOwner();
|
CScriptHandle* GetAngelscriptOwner();
|
||||||
|
void SetAngelscriptOwner(CScriptHandle*);
|
||||||
void OnInitialize(const CreatureLib::Battling::BattleLibrary*,
|
void OnInitialize(const CreatureLib::Battling::BattleLibrary*,
|
||||||
const ArbUt::List<CreatureLib::Library::EffectParameter*>& parameters) override;
|
const ArbUt::List<CreatureLib::Library::EffectParameter*>& parameters) override;
|
||||||
void Stack() override;
|
void Stack() override;
|
||||||
|
|
|
@ -76,7 +76,19 @@ private:
|
||||||
FunctionInfo InitializeGetOwner() {
|
FunctionInfo InitializeGetOwner() {
|
||||||
auto t = _type;
|
auto t = _type;
|
||||||
while (t != nullptr) {
|
while (t != nullptr) {
|
||||||
auto val = t->GetMethodByDecl("ref@& GetOwner()", true);
|
auto val = t->GetMethodByDecl("const ref@& GetOwner()", true);
|
||||||
|
if (val != nullptr) {
|
||||||
|
return FunctionInfo{.Exists = true, .Function = val};
|
||||||
|
}
|
||||||
|
t = t->GetBaseType();
|
||||||
|
}
|
||||||
|
return FunctionInfo{.Exists = false, .Function = nullptr};
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionInfo InitializeSetOwner() {
|
||||||
|
auto t = _type;
|
||||||
|
while (t != nullptr) {
|
||||||
|
auto val = t->GetMethodByDecl("void SetOwner(ref@ owner)", true);
|
||||||
if (val != nullptr) {
|
if (val != nullptr) {
|
||||||
return FunctionInfo{.Exists = true, .Function = val};
|
return FunctionInfo{.Exists = true, .Function = val};
|
||||||
}
|
}
|
||||||
|
@ -86,9 +98,11 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
FunctionInfo __GetOwner = InitializeGetOwner();
|
FunctionInfo __GetOwner = InitializeGetOwner();
|
||||||
|
FunctionInfo __SetOwner = InitializeSetOwner();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const FunctionInfo& GetGetOwner() const { return __GetOwner; }
|
const FunctionInfo& GetGetOwner() const { return __GetOwner; }
|
||||||
|
const FunctionInfo& GetSetOwner() const { return __SetOwner; }
|
||||||
|
|
||||||
SCRIPT_HOOK_FUNCTION(OnInitialize,
|
SCRIPT_HOOK_FUNCTION(OnInitialize,
|
||||||
"void OnInitialize(const BattleLibrary@ library, const narray<EffectParameter@>@ parameters)");
|
"void OnInitialize(const BattleLibrary@ library, const narray<EffectParameter@>@ parameters)");
|
||||||
|
|
|
@ -8,7 +8,8 @@ void BasicScriptClass::Register(asIScriptEngine* engine) {
|
||||||
shared abstract class PkmnScript {
|
shared abstract class PkmnScript {
|
||||||
private ref@ __owner;
|
private ref@ __owner;
|
||||||
|
|
||||||
protected ref@& GetOwner() { return __owner; };
|
protected const ref@& GetOwner() { return __owner; };
|
||||||
|
protected void SetOwner(ref@ o) { @__owner = @o; };
|
||||||
|
|
||||||
// CreatureLib methods
|
// CreatureLib methods
|
||||||
void OnInitialize(const BattleLibrary@ library, const narray<EffectParameter@>@ parameters){};
|
void OnInitialize(const BattleLibrary@ library, const narray<EffectParameter@>@ parameters){};
|
||||||
|
|
|
@ -13,6 +13,7 @@ static std::unordered_map<const char*, const char*> _scripts =
|
||||||
void Test(){
|
void Test(){
|
||||||
auto mon = cast<Pokemon@>(GetOwner());
|
auto mon = cast<Pokemon@>(GetOwner());
|
||||||
if (mon is null){
|
if (mon is null){
|
||||||
|
print("mon was null");
|
||||||
throw("Owner was null!");
|
throw("Owner was null!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue