/* * set audio volume with given channel * * @param audio channel index * @param audio volume (0 to 1) * @return EMO_NO_ERROR if succeeds */ SQInteger emoSetAudioChannelVolume(HSQUIRRELVM v) { if (!engine->audio->isRunning()) { sq_pushinteger(v, ERR_AUDIO_ENGINE_CLOSED); return 1; } SQInteger channelIndex; float channelVolume; if (sq_gettype(v, 2) != OT_NULL && sq_gettype(v, 3) != OT_NULL) { sq_getinteger(v, 2, &channelIndex); sq_getfloat(v, 3, &channelVolume); } else { sq_pushinteger(v, ERR_INVALID_PARAM_TYPE); return 1; } if (channelIndex >= engine->audio->getChannelCount()) { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } SLint16 volume = (1 - channelVolume) * SL_MILLIBEL_MIN; if (!engine->audio->setChannelVolume(channelIndex, volume)) { sq_pushinteger(v, ERR_AUDIO_ENGINE_STATUS); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
// 脚本调用原型: // VApiHandle VApiHwFindControl(HANDLE hWnd, string CtrlName); SQInteger ViHwFindControl(HSQUIRRELVM v) { VApiHandle hRet = 0; const SQChar* szCtrlName = NULL; SQInteger nargs = sq_gettop(v); SQInteger nWnd = 0; HANDLE hWnd = NULL; CScriptMgr* pMgr = NULL; CPaintManagerUI* pPM = NULL; if (!v || 2 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_STRING != sq_gettype(v, 3)) {goto _Exit_;} sq_getinteger(v, 2, &nWnd); sq_getstring(v, 3, &szCtrlName); if (-1 == nWnd) { pMgr = (CScriptMgr*)sq_getforeignptr(v); if (!pMgr) {goto _Exit_;} pPM = pMgr->GetManager(); } else { pPM = QiHwHandleToWin(nWnd)->pWinObj->GetPM(); } if (!pPM) {goto _Exit_;} // fixbug - 未验证pm合法性 hRet = QiHwCtrlToHandle(pPM->FindControl(szCtrlName)); _Exit_: sq_pushinteger(v, hRet); return 1; }
static SQInteger _file_constructor(HSQUIRRELVM v) { const SQChar *filename,*mode; bool owns = true; SQFile *f; SQFILE newf; if(sq_gettype(v,2) == OT_STRING && sq_gettype(v,3) == OT_STRING) { sq_getstring(v, 2, &filename); sq_getstring(v, 3, &mode); newf = sqstd_fopen(filename, mode); if(!newf) return sq_throwerror(v, _SC("cannot open file")); } else if(sq_gettype(v,2) == OT_USERPOINTER) { owns = !(sq_gettype(v,3) == OT_NULL); sq_getuserpointer(v,2,&newf); } else { return sq_throwerror(v,_SC("wrong parameter")); } f = new SQFile(newf,owns); if(SQ_FAILED(sq_setinstanceup(v,1,f))) { delete f; return sq_throwerror(v, _SC("cannot create blob with negative size")); } sq_setreleasehook(v,1,_file_releasehook); return 0; }
/* * set preference value with given key * * @param preference key * @param preference value * @return EMO_NO_ERROR if succeeds */ SQInteger emoDatabaseSetPreference(HSQUIRRELVM v) { const SQChar* key; SQInteger nargs = sq_gettop(v); if (nargs >= 2 && sq_gettype(v, 2) != OT_NULL) { sq_tostring(v, 2); sq_getstring(v, -1, &key); sq_poptop(v); } else { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } const SQChar* value; if (nargs >= 3 && sq_gettype(v, 3) != OT_NULL) { sq_tostring(v, 3); sq_getstring(v, -1, &value); sq_poptop(v); } else { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } if (!engine->database->setPreference(key, value)) { sq_pushinteger(v, ERR_DATABASE); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
/* * open database with given name * if database is not found, creates new database with given name * file mode is one of FILE_MODE_PRIVATE, FILE_MODE_WORLD_READABLE * or FILE_MODE_WORLD_WRITABLE * * @param database name * @param file mode * @return EMO_NO_ERROR if succeeds */ SQInteger emoDatabaseOpenOrCreate(HSQUIRRELVM v) { const SQChar* name; SQInteger nargs = sq_gettop(v); if (nargs >= 2 && sq_gettype(v, 2) == OT_STRING) { sq_tostring(v, 2); sq_getstring(v, -1, &name); sq_poptop(v); } else { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } SQInteger mode = FILE_MODE_PRIVATE; if (nargs >= 3 && sq_gettype(v, 3) == OT_INTEGER) { sq_getinteger(v, 3, &mode); } if (!engine->database->openOrCreate(name, mode)) { sq_pushinteger(v, ERR_DATABASE_OPEN); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
int AnimSquirrel::playAnim(SQVM* v) { int ID, stage, returnVal; returnVal = 0; const char* anim; float weight, duration, speed, timeoffset; SQInteger nargs = sq_gettop(v); if(nargs == 8) { if(sq_gettype(v,2) == OT_INTEGER && sq_gettype(v,3) == OT_STRING && sq_gettype(v,4) == OT_INTEGER) { sq_getinteger(v,2,&ID); sq_getinteger(v,4,&stage); sq_getstring(v,3,&anim); sq_getfloat(v,5,&weight); sq_getfloat(v,6,&duration); sq_getfloat(v,7,&speed); sq_getfloat(v,8,&timeoffset); returnVal = GameEngine::playAnim(ID,anim,stage,weight,duration,speed,timeoffset); } } sq_pushinteger(v,returnVal); return 1; }
SQInteger ScriptText::_set(HSQUIRRELVM vm) { int32 k; if (sq_gettype(vm, 2) == OT_STRING) { const SQChar *key; sq_getstring(vm, 2, &key); const char *key_string = SQ2OTTD(key); if (strncmp(key_string, "param_", 6) != 0 || strlen(key_string) > 8) return SQ_ERROR; k = atoi(key_string + 6); } else if (sq_gettype(vm, 2) == OT_INTEGER) { SQInteger key; sq_getinteger(vm, 2, &key); k = (int32)key; } else { return SQ_ERROR; } if (k > SCRIPT_TEXT_MAX_PARAMETERS) return SQ_ERROR; if (k < 1) return SQ_ERROR; k--; return this->_SetParam(k, vm); }
// BOOL ViCbAddCtrl(HANDLE hCtrl, HANDLE hParent) SQInteger ViCbAddCtrl(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger hCtrl = 0; SQInteger hParent = 0; CContainerUI* pParentCtrl = NULL; CScriptMgr* pMgr = NULL; CPaintManagerUI* pPM = NULL; CControlUI* pCtrl = NULL; SQBool bRet = FALSE; if (!v || 2 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 3)) {goto _Exit_;} sq_getinteger(v, 2, &hCtrl); sq_getinteger(v, 3, &hParent); pCtrl = QiHwHandleToCtrl(hCtrl); pParentCtrl = (CContainerUI*)QiHwHandleToCtrl(hParent); if (!pCtrl) {goto _Exit_;} if (NULL == pParentCtrl) { pMgr = (CScriptMgr*)sq_getforeignptr(v); if (!pMgr) {goto _Exit_;} pPM = pMgr->GetManager(); if (!pPM) {goto _Exit_;} pParentCtrl = (CContainerUI*)pPM->GetRoot(); } if (!pParentCtrl || !pParentCtrl->IsContainer()) {goto _Exit_;} bRet = (SQBool)pParentCtrl->Add(pCtrl); _Exit_: sq_pushbool(v, bRet); return 1; }
/* * SQInteger loadAudio(SQInteger audioIndex, SQChar* filename); * * @param audio channel index * @param file name to be loaded * @return EMO_NO_ERROR if succeeds */ SQInteger emoLoadAudio(HSQUIRRELVM v) { if (!engine->audio->isRunning()) { sq_pushinteger(v, ERR_AUDIO_ENGINE_CLOSED); return 1; } SQInteger channelIndex; const SQChar* filename; if (sq_gettype(v, 2) != OT_NULL && sq_gettype(v, 3) == OT_STRING) { sq_getinteger(v, 2, &channelIndex); sq_tostring(v, 3); sq_getstring(v, -1, &filename); } else { sq_pushinteger(v, ERR_INVALID_PARAM_TYPE); return 1; } if (channelIndex >= engine->audio->getChannelCount()) { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } if (!engine->audio->createChannelFromAsset(filename, channelIndex)) { sq_pushinteger(v, engine->getLastError()); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
void TimeScheduler::update(float time) { while(!schedule.empty() && schedule.front().wakeup_time < time) { HSQOBJECT thread_ref = schedule.front().thread_ref; sq_pushobject(global_vm, thread_ref); sq_getweakrefval(global_vm, -1); HSQUIRRELVM scheduled_vm; if(sq_gettype(global_vm, -1) == OT_THREAD && SQ_SUCCEEDED(sq_getthread(global_vm, -1, &scheduled_vm))) { if(SQ_FAILED(sq_wakeupvm(scheduled_vm, SQFalse, SQFalse, SQTrue, SQFalse))) { std::ostringstream msg; msg << "Error waking VM: "; sq_getlasterror(scheduled_vm); if(sq_gettype(scheduled_vm, -1) != OT_STRING) { msg << "(no info)"; } else { const char* lasterr; sq_getstring(scheduled_vm, -1, &lasterr); msg << lasterr; } log_warning << msg.str() << std::endl; sq_pop(scheduled_vm, 1); } } sq_release(global_vm, &thread_ref); sq_pop(global_vm, 2); std::pop_heap(schedule.begin(), schedule.end()); schedule.pop_back(); } }
int SquirrelScriptContext::SquirrelClassMethodCallback(HSQUIRRELVM vm) { // Get class info MultiScriptAssert( sq_gettype(vm, -1) == OT_USERPOINTER ); void* userPtr = NULL; sq_getuserpointer(vm, -1, &userPtr); sq_pop(vm, 1); SquirrelClassInfo* classInfo = (SquirrelClassInfo*) userPtr; // Get method index MultiScriptAssert( sq_gettype(vm, -1) == OT_INTEGER ); int methodIndex; sq_getinteger(vm, -1, &methodIndex); sq_pop(vm, 1); // Get the instance MultiScriptAssert( sq_gettype(vm, 1) == OT_INSTANCE ); sq_getinstanceup(vm, 1, &userPtr, 0); SquirrelScriptObject* scriptObject = (SquirrelScriptObject*) userPtr; MultiScriptAssert(scriptObject->m_objectPtr); SquirrelScriptStack stack(classInfo->m_context, false); const bool result = classInfo->m_desc->m_methods[methodIndex].m_method(scriptObject, &stack); MultiScriptAssert( result ); return stack.m_numPushed; }
/* * Runtime logging * * @param log level * @param log message */ SQInteger emoRuntimeLog(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger level; const SQChar *message; if (nargs < 3) return 0; if (sq_gettype(v, 2) == OT_INTEGER && sq_gettype(v, 3) == OT_STRING) { sq_getinteger(v, 2, &level); sq_tostring(v, 3); sq_getstring(v, -1, &message); sq_poptop(v); switch (level) { case LOG_INFO: LOGI((char*) message); break; case LOG_ERROR: LOGE((char*) message); break; case LOG_WARN: LOGW((char*) message); break; } } return 0; }
////////////////////////////////////////////////////////////////////////// // ViIp 接口表示CFastImagePanelUI类的成员函数 // BOOL ViIpSetImgByMem(VApiHandle hImgPaneCtrl, VApiHandle hImg) SQInteger ViIpSetImgByMem(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); BOOL bRet = FALSE; SQInteger hImg = 0; CUIImage* pImg = NULL; CFastImagePanelUI* pImgPaneCtrl = NULL; SQInteger hImgPaneCtrl = NULL; if (!v || 2 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 3)) {goto _Exit_;} sq_getinteger(v, 2, &hImgPaneCtrl); sq_getinteger(v, 3, &hImg); pImg = (CUIImage*)QiHwHandleToObj(hImg); pImgPaneCtrl = (CFastImagePanelUI*)QiHwHandleToObj(hImgPaneCtrl); if (!pImg || !pImgPaneCtrl) {goto _Exit_;} bRet = pImgPaneCtrl->SetImgByMem(pImg); _Exit_: sq_pushbool(v, bRet); return 1; }
// BOOL TwStepTween(HANDLE hTween, long currentMillis) SQInteger TwStepTween(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQBool bRet = FALSE; SQInteger nTweener = NULL; SQInteger currentMillis = 0; Tweener* pTweener = NULL; if (!v || 2 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 3)) {goto _Exit_;} sq_getinteger(v, 2, &nTweener); sq_getinteger(v, 3, ¤tMillis); pTweener = (Tweener*)QiHwHandleToObj(nTweener); if (!pTweener) {goto _Exit_;} pTweener->step(currentMillis); bRet = TRUE; _Exit_: sq_pushbool(v, bRet); return 1; }
// BOOL ViCbSetPos(VApiHandle hWnd, int x0, int y0, int x1, int y1) SQInteger ViCbSetPos(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger Handle = 0; CControlUI* pCtrl = NULL; int x0 = 0; int y0 = 0; int x1 = 0; int y1 = 0; RECT rc = {0}; if (!v || 5 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 3)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 4)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 5)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 6)) {goto _Exit_;} sq_getinteger(v, 2, &Handle); sq_getinteger(v, 3, &x0); sq_getinteger(v, 4, &y0); sq_getinteger(v, 5, &x1); sq_getinteger(v, 6, &y1); pCtrl = QiHwHandleToCtrl(Handle); if (!pCtrl) {goto _Exit_;} rc.left = x0; rc.top = y0; rc.right = x1; rc.bottom = y1; pCtrl->SetPos(rc); _Exit_: sq_pushbool(v, TRUE); return 1; }
/* * seek audio with given channel * * @param audio channel index * @param seek offset (milliseconds from the beginning of the audio) * @return EMO_NO_ERROR if succeeds */ SQInteger emoSeekAudioChannel(HSQUIRRELVM v) { if (!engine->audio->isRunning()) { sq_pushinteger(v, ERR_AUDIO_ENGINE_CLOSED); return 1; } SQInteger channelIndex; SQInteger seekPosition; if (sq_gettype(v, 2) != OT_NULL && sq_gettype(v, 3) != OT_NULL) { sq_getinteger(v, 2, &channelIndex); sq_getinteger(v, 3, &seekPosition); } else { sq_pushinteger(v, ERR_INVALID_PARAM_TYPE); return 1; } if (channelIndex >= engine->audio->getChannelCount()) { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } if (!engine->audio->seekChannel(channelIndex, seekPosition, SL_SEEKMODE_ACCURATE)) { sq_pushinteger(v, ERR_AUDIO_ENGINE_STATUS); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
/* * compile script from path * * @param script file name */ SQInteger emoRuntimeCompile(HSQUIRRELVM v) { if (sq_gettype(v, 2) == OT_STRING) { const SQChar *fname; sq_tostring(v, 2); sq_getstring(v, -1, &fname); sq_poptop(v); // check if the file type exists if (sq_gettype(v, 3) == OT_INTEGER) { SQInteger fileType = TYPE_ASSET; sq_getinteger(v, 3, &fileType); if (fileType == TYPE_ASSET) { // load script from resource loadScriptFromAsset((char*) fname); } else if (fileType == TYPE_DOCUMENT) { // load script from user document directory loadScriptFromUserDocument(fname); } else { // load script from path loadScript(fname); } } else { // load script from path loadScript(fname); } } return 0; }
// BOOL TwAddProperty(HANDLE hTweenParam, float valor, float valorFinal) SQInteger TwAddProperty(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQBool bRet = FALSE; TweenerParam* pTweenParam = NULL; SQInteger nTweenParam = NULL; SQInteger fValor = 0; SQInteger fValorFinal = 0; TweenerParam* pParam = NULL; if (!v || 3 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 3)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 4)) {goto _Exit_;} sq_getinteger(v, 2, &nTweenParam); sq_getinteger(v, 3, &fValor); sq_getinteger(v, 4, &fValorFinal); pTweenParam = (TweenerParam*)QiHwHandleToObj(nTweenParam); if (!pTweenParam) {goto _Exit_;} pTweenParam->addProperty(fValor, fValorFinal); bRet = TRUE; _Exit_: sq_pushbool(v, bRet); return 1; }
// HANDLE TwCreateTweenParam(float fTime, short nTransition = EXPO, short nEquation = EASE_OUT, float fDelay = 0) SQInteger TwCreateTweenParam(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger nRet = NULL; SQInteger fTime = 0; SQInteger nTransition = EXPO; SQInteger nEquation = EASE_OUT; SQInteger fDelay = 0; TweenerParam* pParam = NULL; if (!v || 4 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 3)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 4)) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 5)) {goto _Exit_;} sq_getinteger(v, 2, &fTime); sq_getinteger(v, 3, &nTransition); sq_getinteger(v, 4, &nEquation); sq_getinteger(v, 5, &fDelay); pParam = new TweenerParam(fTime, nTransition, nEquation, fDelay); if (!pParam) {goto _Exit_;} nRet = QiHwObjToHandle(pParam); _Exit_: sq_pushinteger(v, nRet); return 1; }
int SquirrelScriptContext::SquirrelClassToStringMethodCallback(HSQUIRRELVM vm) { // Get class info MultiScriptAssert( sq_gettype(vm, -1) == OT_USERPOINTER ); void* userPtr = NULL; sq_getuserpointer(vm, -1, &userPtr); sq_pop(vm, 1); SquirrelClassInfo* classInfo = (SquirrelClassInfo*) userPtr; // Get the instance MultiScriptAssert( sq_gettype(vm, 1) == OT_INSTANCE ); sq_getinstanceup(vm, 1, &userPtr, 0); SquirrelScriptObject* scriptObject = (SquirrelScriptObject*) userPtr; MultiScriptAssert(scriptObject->m_objectPtr); // Invoke to-string method char buffer[1 << 8]; if (classInfo->m_desc->m_toStringMethod) { SquirrelScriptStack stack(classInfo->m_context, false); const bool result = classInfo->m_desc->m_toStringMethod(scriptObject, buffer, 1 << 8); MultiScriptAssert( result ); MultiScriptAssert( stack.m_numPushed == 0 ); } else MultiScriptSprintf(buffer, 1 << 8, "[%s]", classInfo->m_desc->m_name); sq_pushstring(vm, buffer, -1); return 1; }
/** * squirrel から吉里吉里オブジェクトを取得 */ bool TJSObject::getVariant(HSQUIRRELVM v, SQInteger idx, tTJSVariant *variant) { if (sq_gettype(v, idx) == OT_CLASS) { if (idx < 0) { idx = sq_gettop(v) + 1 + idx; } bool ret = false; // クラス属性からオブジェクト情報を引き出す sq_pushnull(v); if (SQ_SUCCEEDED(sq_getattributes(v, idx))) { sq_pushstring(v, tjsClassAttrName, -1); if (SQ_SUCCEEDED(sq_get(v,-2))) { if (SQ_SUCCEEDED(sq_getvariant(v,-1, variant))) { ret = true; } sq_pop(v,1); } sq_pop(v,1); } else { // XXX sq_pop(v,1); } return ret; } else if (sq_gettype(v, idx) == OT_INSTANCE) { TJSObject *obj = SQClassType<TJSObject>::getInstance(v, idx); if (obj && obj->instance.AsObjectClosureNoAddRef().IsValid(0, NULL, NULL, NULL) == TJS_S_TRUE) { *variant = obj->instance; return true; } } return false; }
// write SQInteger file_put_contents(HSQUIRRELVM v) { // function parameters const SQChar* filename; const SQChar* contents; // internal structures apr_file_t* file; apr_size_t nbytes; apr_status_t status; request_rec* r = get_request_rec(v); // for error messages char error[120]; char errorMessage[120]; ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "file_put_contents()"); // grab filename param if( sq_gettype(v, 2) != OT_STRING ) { return SQ_ERROR; } else if( SQ_FAILED(sq_getstring(v, 2, &filename)) ) { return SQ_ERROR; } // grab contents param if( sq_gettype(v, 3) != OT_STRING ) { return SQ_ERROR; } else if( SQ_FAILED(sq_getstring(v, 3, &contents)) ) { return SQ_ERROR; } nbytes = strlen(contents); ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, " file_put_contents('%s', '%s') %d", filename, contents, (int)nbytes); if( (status = apr_file_open(&file, filename, APR_WRITE|APR_CREATE, APR_OS_DEFAULT, r->pool)) != APR_SUCCESS ) { apr_strerror(status, error, sizeof error); ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, " file_put_contents() failed: %s", error); sprintf(errorMessage, "file_put_contents() failed: %s", error); errorfunc(v, errorMessage); sq_pushbool(v, SQFalse); } else if( (status = apr_file_write(file, contents, &nbytes)) != APR_SUCCESS ) { apr_strerror(status, error, sizeof error); ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, " file_put_contents() failed: %s", error); sprintf(errorMessage, "file_put_contents() failed: %s", error); errorfunc(v, errorMessage); sq_pushbool(v, SQFalse); } else { sq_pushinteger(v, nbytes); ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, " file_put_contents() wrote %d bytes", (int)nbytes); } ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "file_put_contents() returning 1"); return 1; }
/* * get boolean value from the stack. * this function accepts both integer(1,0) and bool(true,false). * returns true if succeeds. */ bool getBool(HSQUIRRELVM v, int idx, SQBool* value) { if (sq_gettype(v, idx) == OT_INTEGER) { SQInteger val; sq_getinteger(v, idx, &val); *value = (val == 1); } else if (sq_gettype(v, idx) == OT_BOOL) { sq_getbool(v, idx, value); } else { return false; } return true; }
//------------------------------------------------------------------------------ void SN_API getTable(HSQUIRRELVM vm, Variant & out_v, SQInteger index) { out_v.setDictionary(); Variant::Dictionary & d = out_v.getDictionary(); sq_push(vm, index); sq_pushnull(vm); while (SQ_SUCCEEDED(sq_next(vm, -2))) { if (sq_gettype(vm, -2) == OT_STRING) { const SQChar * key = nullptr; sq_getstring(vm, -2, &key); Variant & val = d[key]; getVariant(vm, val, -1); } else { SN_WARNING("non-string keys in tables are not supported by getVariant"); } sq_pop(vm, 2); } sq_pop(vm, 2); // Pop iterator and table }
// int VwGetPosHight(VApiHandle hWnd) SQInteger VwGetPosHight(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger nWnd = 0; WinMgrItem* pWin = NULL; HWND hWnd = NULL; SQInteger nRet = 0; RECT rc = {0}; if (!v || 1 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} sq_getinteger(v, 2, &nWnd); if (-1 == nWnd) { CScriptMgr* pMgr = (CScriptMgr*)sq_getforeignptr(v); if (!pMgr) {goto _Exit_;} CPaintManagerUI* pPM = pMgr->GetManager(); if (!pPM) {goto _Exit_;} hWnd = pPM->GetPaintWindow(); } else { hWnd = QiHwHandleToWin(nWnd)->pWinObj->GetHWND(); } ::GetWindowRect(hWnd, &rc); nRet = rc.bottom - rc.top; _Exit_: sq_pushinteger(v, nRet); return 1; }
static SQRESULT sq_mysql_result_col_value(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_result_INSTANCE(); SQObjectType ptype = sq_gettype(v, 2); int col = -1; if(ptype == OT_STRING){ SQ_GET_STRING(v, 2, col_name); col = get_field_idx(self, col_name); } else { SQ_GET_INTEGER(v, 2, idx); col = idx; } if(col < 0) return sq_throwerror(v, _SC("invalid col index/name")); sq_pushstring(v, _curr_row_key, -1); if(sq_get(v, 1) == SQ_OK){ SQ_GET_INTEGER(v, -1, curr_row); if(curr_row < dlmysql_num_rows(self)){ dlmysql_data_seek(self, curr_row); const MYSQL_ROW res_row = dlmysql_fetch_row(self); unsigned long *lengths = dlmysql_fetch_lengths(self); sq_pushstring(v, (const SQChar*)res_row[col], lengths[col]); return 1; } } return SQ_ERROR; }
// HANDLE TwAddTween(HANDLE hTweenParam) SQInteger TwAddTween(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger nRet = 0; TweenerParam* pTweenParam = NULL; SQInteger nTweenParam = NULL; Tweener* pTweener = NULL; pTweener = new Tweener(); if (!pTweener) {goto _Exit_;} if (!v || 1 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} sq_getinteger(v, 2, &nTweenParam); pTweenParam = (TweenerParam*)QiHwHandleToObj(nTweenParam); if (!pTweenParam) {goto _Exit_;} pTweener->addTween(*pTweenParam); delete pTweenParam; nRet = QiHwObjToHandle(pTweener); _Exit_: sq_pushinteger(v, nRet); return 1; }
/* * Set Runtime log level * * @param log level * @param EMO_NO_ERROR if succeeds */ SQInteger emoRuntimeSetLogLevel(HSQUIRRELVM v) { if (sq_gettype(v, 2) == OT_INTEGER) { SQInteger level; sq_getinteger(v, 2, &level); switch (level) { case LOG_INFO: case LOG_WARN: case LOG_ERROR: engine->logLevel = level; break; default: sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } } else { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
// void VwUpdateLayout(HWND hWnd) SQInteger VwUpdateLayout(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger nWnd = 0; HWND hWnd = NULL; CPaintManagerUI* pPM = NULL; if (!v || 1 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} sq_getinteger(v, 2, &nWnd); if (-1 == nWnd) { CScriptMgr* pMgr = (CScriptMgr*)sq_getforeignptr(v); if (!pMgr) {goto _Exit_;} pPM = pMgr->GetManager(); if (!pPM) {goto _Exit_;} } else { pPM = QiHwHandleToWin(nWnd)->pWinObj->GetPM(); if (!pPM) {goto _Exit_;} } pPM->UpdateLayout(); _Exit_: return 1; }
int SquirrelScriptContext::SquirrelClassConstructorCallback(HSQUIRRELVM vm) { MultiScriptAssert( sq_gettype(vm, -1) == OT_USERPOINTER ); // Get class info void* userPtr = NULL; sq_getuserpointer(vm, -1, &userPtr); sq_pop(vm, 1); SquirrelClassInfo* classInfo = (SquirrelClassInfo*) userPtr; // Construct object SquirrelScriptObject* scriptObject = new SquirrelScriptObject(); scriptObject->m_classInfo = classInfo; SquirrelScriptStack stack(classInfo->m_context, false); classInfo->m_desc->m_constructor(&stack, scriptObject); MultiScriptAssert( scriptObject->m_objectPtr ); MultiScriptAssert( stack.m_numPushed == 0 ); // There is already an instance on the stack (pushed automatically when constructor was invoked from script) // Attach our object to created instance sq_setinstanceup(vm, -1, scriptObject); // Set garbage collection callback for this instance sq_setreleasehook(vm, -1, SquirrelClassGCCallback); return 0; }