//Returns 0 if the call terminated. If the caller provides a callback and the thread does not terminate, //it will continue to run. Otherwise it will be killed. Returns 1 in this case. int CCobInstance::RealCall(int functionId, vector<int> &args, CBCobThreadFinish cb, void *p1, void *p2) { CCobThread *t = new CCobThread(script, this); t->Start(functionId, args, false); #if COB_DEBUG > 0 if (COB_DEBUG_FILTER) logOutput.Print("Calling %s:%s", script.name.c_str(), script.scriptNames[functionId].c_str()); #endif int res = t->Tick(30); t->CommitAnims(30); //Make sure this is run even if the call terminates instantly if (cb) t->SetCallback(cb, p1, p2); if (res == -1) { //Retrieve parameter values from stack for (unsigned int i = 0; i < args.size(); ++i) { args[i] = t->GetStackVal(i); } delete t; return 0; } else { //It has already added itself to the correct scheduler (global for sleep, or local for anim) return 1; } }
/** * @brief Calls a cob script function * @param functionId int cob script function id * @param args vector<int> function arguments * @param cb CBCobThreadFinish Callback function * @param p1 void* callback argument #1 * @param p2 void* callback argument #2 * @return 0 if the call terminated. If the caller provides a callback and the thread does not terminate, * it will continue to run. Otherwise it will be killed. Returns 1 in this case. */ int CCobInstance::RealCall(int functionId, vector<int> &args, CBCobThreadFinish cb, void *p1, void *p2) { if (functionId < 0 || size_t(functionId) >= script.scriptNames.size()) { if (cb) { // in case the function doesnt exist the callback should still be called (*cb)(0, p1, p2); } return -1; } CCobThread *t = new CCobThread(script, this); t->Start(functionId, args, false); #if COB_DEBUG > 0 if (COB_DEBUG_FILTER) logOutput.Print("Calling %s:%s", script.name.c_str(), script.scriptNames[functionId].c_str()); #endif int res = t->Tick(30); t->CommitAnims(30); // Make sure this is run even if the call terminates instantly if (cb) t->SetCallback(cb, p1, p2); if (res == -1) { unsigned int i = 0, argc = t->CheckStack(args.size()); // Retrieve parameter values from stack for (; i < argc; ++i) args[i] = t->GetStackVal(i); // Set erroneous parameters to 0 for (; i < args.size(); ++i) args[i] = 0; delete t; return 0; } else { // It has already added itself to the correct scheduler (global for sleep, or local for anim) return 1; } }