Skip to content
This repository has been archived by the owner on Nov 7, 2022. It is now read-only.

Commit

Permalink
Clean VerbExecuteFunction
Browse files Browse the repository at this point in the history
  • Loading branch information
scemino committed Feb 28, 2021
1 parent ad74f15 commit a1d25d9
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 31 deletions.
72 changes: 41 additions & 31 deletions src/Scripting/VerbExecuteFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ VerbExecuteFunction::VerbExecuteFunction(Engine &engine,

bool VerbExecuteFunction::isElapsed() { return m_done; }

void VerbExecuteFunction::operator()(const ngf::TimeSpan &) {
m_done = true;
bool VerbExecuteFunction::needToExecuteVerb() {
auto executeVerb = true;
if (m_pVerb->id == VerbConstants::VERB_GIVE && m_pObject2) {
auto *pActor2 = dynamic_cast<Actor *>(m_pObject2);
Expand All @@ -26,52 +25,63 @@ void VerbExecuteFunction::operator()(const ngf::TimeSpan &) {
ScriptEngine::rawGet(pActor2, "selectable", selectable);
executeVerb = !selectable;
}
return executeVerb;
}

auto handled = false;
if (executeVerb) {
if (!ScriptEngine::rawExists(&m_actor, m_pVerb->func.data())) {
handled = false;
} else if (m_pVerb->id == VerbConstants::VERB_GIVE) {
handled = ScriptEngine::objCall(&m_actor, m_pVerb->func.data(), m_pObject1);
bool VerbExecuteFunction::callVerb() {
if (ScriptEngine::rawExists(&m_actor, m_pVerb->func.data())) {
if (m_pVerb->id == VerbConstants::VERB_GIVE) {
if (ScriptEngine::objCall(&m_actor, m_pVerb->func.data(), m_pObject1))
return true;
} else if (m_pVerb->id == VerbConstants::VERB_TALKTO) {
ScriptEngine::objCall(m_pObject1, m_pVerb->func.data());
handled = true;
}

if (!handled) {
auto count = ScriptEngine::getParameterCount(m_pObject1, m_pVerb->func.data());
if (!ScriptEngine::rawExists(m_pObject1, m_pVerb->func.data())) {
handled = false;
} else if (count == 2) {
handled = ScriptEngine::objCall(m_pObject1, m_pVerb->func.data(), m_pObject2);
} else {
handled = ScriptEngine::objCall(m_pObject1, m_pVerb->func.data());
}
return true;
}
}

if (handled) {
onPickup();
return;
auto count = ScriptEngine::getParameterCount(m_pObject1, m_pVerb->func.data());
if (!ScriptEngine::rawExists(m_pObject1, m_pVerb->func.data())) {
return false;
}
if (count == 2) {
return ScriptEngine::objCall(m_pObject1, m_pVerb->func.data(), m_pObject2);
}
return ScriptEngine::objCall(m_pObject1, m_pVerb->func.data());
}

if (m_pVerb->id == VerbConstants::VERB_GIVE) {
auto *pActor2 = dynamic_cast<Actor *>(m_pObject2);
if (!pActor2)
pActor2 = Entity::getActor(m_pObject2);
ScriptEngine::call("objectGive", m_pObject1, &m_actor, pActor2);
void VerbExecuteFunction::operator()(const ngf::TimeSpan &) {
m_done = true;

auto *pObject = dynamic_cast<Object *>(m_pObject1);
m_actor.giveTo(pObject, pActor2);
return;
if (needToExecuteVerb()) {
if (callVerb()) {
onPickup();
return;
}
}

if (callVerbGive())
return;

if (callVerbDefault(m_pObject1))
return;

callDefaultObjectVerb();
}

bool VerbExecuteFunction::callVerbGive() {
if (m_pVerb->id != VerbConstants::VERB_GIVE)
return false;

auto *pActor2 = dynamic_cast<Actor *>(m_pObject2);
if (!pActor2)
pActor2 = Entity::getActor(m_pObject2);
ScriptEngine::call("objectGive", m_pObject1, &m_actor, pActor2);

auto *pObject = dynamic_cast<Object *>(m_pObject1);
m_actor.giveTo(pObject, pActor2);
return true;
}

void VerbExecuteFunction::onPickup() {
if (m_pVerb->id != VerbConstants::VERB_PICKUP)
return;
Expand Down
3 changes: 3 additions & 0 deletions src/Scripting/VerbExecuteFunction.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ class VerbExecuteFunction : public Function {
bool isElapsed() final;
void operator()(const ngf::TimeSpan &) final;
void onPickup();
bool callVerb();
bool callVerbGive();
void callDefaultObjectVerb();
bool needToExecuteVerb();
static bool callVerbDefault(Entity *pEntity);

private:
Expand Down

0 comments on commit a1d25d9

Please sign in to comment.