/* Ф-я предназначена только для вызова из CallBack'а QSP_CALL_SHOWMENU */ AS3_Val QSPSelectMenuItem(void *param, AS3_Val args) { int index; QSPVariant arg; AS3_ArrayValue(args, "IntType", &index); if (index >= 0 && index < qspCurMenuItems) { if (qspIsDisableCodeExec) return AS3_True(); arg.IsStr = QSP_FALSE; QSP_NUM(arg) = index + 1; qspExecLocByNameWithArgs(qspCurMenuLocs[index], &arg, 1); } return AS3_True(); }
/* Управление режимом отладки */ AS3_Val QSPEnableDebugMode(void *param, AS3_Val args) { QSP_BOOL isDebug; AS3_ArrayValue(args, "IntType", &isDebug); qspIsDebug = isDebug; return AS3_True(); }
/* Возможность изменения текста дополнительного описания */ AS3_Val QSPIsVarsDescChanged(void *param, AS3_Val args) { if (qspIsVarsDescChanged) return AS3_True(); else return AS3_False(); }
/* ------------------------------------------------------------ */ AS3_Val QSPIsInCallBack(void *param, AS3_Val args) { if (qspIsInCallBack) return AS3_True(); else return AS3_False(); }
AS3_Val QSPReturnValue(void *param, AS3_Val args) { AS3_Val resVal; AS3_ArrayValue(args, "AS3ValType", &resVal); qspSetReturnValue(resVal); return AS3_True(); }
/* Возможность изменения списка объектов */ AS3_Val QSPIsObjectsChanged(void *param, AS3_Val args) { if (qspIsObjectsChanged) return AS3_True(); else return AS3_False(); }
/* Инициализация */ AS3_Val QSPInit(void *param, AS3_Val args) { #ifdef _DEBUG mwInit(); #endif qspIsDebug = QSP_FALSE; qspRefreshCount = qspFullRefreshCount = 0; qspQstPath = qspQstFullPath = 0; qspQstPathLen = 0; qspQstCRC = 0; qspRealCurLoc = -1; qspRealActIndex = -1; qspRealLine = 0; qspMSCount = 0; qspLocs = 0; qspLocsNames = 0; qspLocsCount = 0; qspCurLoc = -1; qspTimerInterval = 0; qspCurIsShowObjs = qspCurIsShowActs = qspCurIsShowVars = qspCurIsShowInput = QSP_TRUE; setlocale(LC_ALL, QSP_LOCALE); qspSetSeed(0); qspPrepareExecution(); qspMemClear(QSP_TRUE); qspInitCallBacks(); qspInitStats(); qspInitMath(); return AS3_True(); }
/* Текст строки ввода */ AS3_Val QSPSetInputStrText(void *param, AS3_Val args) { QSP_CHAR *valWC; char *val; AS3_ArrayValue(args, "StrType", &val); valWC = qspC2W(val); qspCurInputLen = qspAddText(&qspCurInput, valWC, 0, -1, QSP_FALSE); free(valWC); return AS3_True(); }
/* Деинициализация */ AS3_Val QSPDeInit(void *param, AS3_Val args) { qspMemClear(QSP_FALSE); qspCreateWorld(0, 0); if (qspQstPath) free(qspQstPath); if (qspQstFullPath) free(qspQstFullPath); #ifdef _DEBUG mwTerm(); #endif return AS3_True(); }
/* Установка CALLBACK'ов */ AS3_Val QSPSetCallBack(void *param, AS3_Val args) { int type; AS3_Val thisVal; AS3_Val funcVal; QSP_CALLBACK callBack; AS3_ArrayValue(args, "IntType, AS3ValType, AS3ValType", &type, &thisVal, &funcVal); callBack.ThisVal = thisVal; callBack.FuncVal = funcVal; qspSetCallBack(type, callBack); return AS3_True(); }
/* Выполнение кода локации-обработчика строки ввода */ AS3_Val QSPExecUserInput(void *param, AS3_Val args) { QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType", &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); qspExecLocByVarNameWithArgs(QSP_FMT("USERCOM"), 0, 0); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* Перезапуск игры */ AS3_Val QSPRestartGame(void *param, AS3_Val args) { QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType", &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); qspNewGame(QSP_TRUE); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* Выполнение кода локации-счетчика */ AS3_Val QSPExecCounter(void *param, AS3_Val args) { QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType", &isRefresh); if (!qspIsInCallBack) { qspPrepareExecution(); qspExecLocByVarNameWithArgs(QSP_FMT("COUNTER"), 0, 0); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); } return AS3_True(); }
/* Загрузка новой игры из файла */ AS3_Val QSPLoadGameWorld(void *param, AS3_Val args) { char *fileName; QSP_CHAR *fileNameWC; AS3_ArrayValue(args, "StrType", &fileName); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspResetError(); if (qspIsDisableCodeExec) return AS3_False(); fileNameWC = qspC2W(fileName); qspOpenQuest(fileNameWC, QSP_FALSE); free(fileNameWC); if (qspErrorNum) return AS3_False(); return AS3_True(); }
/* Выполнение кода выбранного действия */ AS3_Val QSPExecuteSelActionCode(void *param, AS3_Val args) { QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType", &isRefresh); if (qspCurSelAction >= 0) { if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); qspExecAction(qspCurSelAction); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); } return AS3_True(); }
/* Загрузка состояния из файла */ AS3_Val QSPOpenSavedGame(void *param, AS3_Val args) { char *fileName; QSP_CHAR *fileNameWC; QSP_BOOL isRefresh; AS3_ArrayValue(args, "StrType, IntType", &fileName, &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); fileNameWC = qspC2W(fileName); qspOpenGameStatus(fileNameWC); free(fileNameWC); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* Выполнение строки кода */ AS3_Val QSPExecString(void *param, AS3_Val args) { char *s; QSP_CHAR *strWC; QSP_BOOL isRefresh; AS3_ArrayValue(args, "StrType, IntType", &s, &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); strWC = qspC2W(s); qspExecStringAsCodeWithArgs(strWC, 0, 0); free(strWC); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* Выполнение кода указанной локации */ AS3_Val QSPExecLocationCode(void *param, AS3_Val args) { char *name; QSP_CHAR *nameWC; QSP_BOOL isRefresh; AS3_ArrayValue(args, "StrType, IntType", &name, &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); nameWC = qspC2W(name); qspExecLocByName(nameWC, QSP_FALSE); free(nameWC); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* Установить индекс выбранного объекта */ AS3_Val QSPSetSelObjectIndex(void *param, AS3_Val args) { int ind; QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType, IntType", &ind, &isRefresh); if (ind >= 0 && ind < qspCurObjectsCount && ind != qspCurSelObject) { if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); qspCurSelObject = ind; qspExecLocByVarNameWithArgs(QSP_FMT("ONOBJSEL"), 0, 0); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); } return AS3_True(); }
/* Сохранение состояния в память */ AS3_Val QSPSaveGameAsData(void *param, AS3_Val args) { int len; QSP_BOOL isRefresh; AS3_Val data; QSP_CHAR *buf; AS3_ArrayValue(args, "AS3ValType, IntType", &data, &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); if (!(len = qspSaveGameStatusToString(&buf))) return AS3_False(); AS3_ByteArray_seek(data, 0, SEEK_SET); AS3_ByteArray_writeBytes(data, buf, len * sizeof(QSP_CHAR)); free(buf); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
static AS3_Val thunk_InitPeerDownloadInfo(void *gg_clientData, AS3_Val gg_args) { AS3_Val info; AS3_Val bytes; AS3_ArrayValue(gg_args, "AS3ValType, AS3ValType", &info, &bytes); AS3_Val isDownloadingVal = AS3_CallTS("readUnsignedByte", bytes, ""); if (AS3_IntValue(isDownloadingVal) == 1) { AS3_Val true = AS3_True(); AS3_SetS(info, "isDownloading", true); AS3_Release(true); } else { AS3_Val false = AS3_False(); AS3_SetS(info, "isDownloading", false); AS3_Release(false); } AS3_Val onLineTimeVal = AS3_CallTS("readUnsignedInt", bytes, ""); AS3_Val avgDownloadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_Val nowDownloadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_Val avgUploadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_Val nowUploadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_SetS(info, "onLineTime", onLineTimeVal); AS3_SetS(info, "avgDownload", avgDownloadVal); AS3_SetS(info, "nowDownload", nowDownloadVal); AS3_SetS(info, "avgUpload", avgUploadVal); AS3_SetS(info, "nowUpload", nowUploadVal); AS3_ByteArray_seek(bytes, 3, 1); // ignore 3 byte reserved bytes AS3_Release(isDownloadingVal); AS3_Release(onLineTimeVal); AS3_Release(avgDownloadVal); AS3_Release(nowDownloadVal); AS3_Release(avgUploadVal); AS3_Release(nowUploadVal); AS3_Release(bytes); AS3_Release(info); return NULL; }
/* Загрузка состояния из памяти */ AS3_Val QSPOpenSavedGameFromData(void *param, AS3_Val args) { AS3_Val data; int dataSize, dataLen; QSP_BOOL isRefresh; QSP_CHAR *ptr; AS3_ArrayValue(args, "AS3ValType, IntType, IntType", &data, &dataSize, &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); dataLen = dataSize / sizeof(QSP_CHAR); ptr = (QSP_CHAR *)malloc((dataLen + 1) * sizeof(QSP_CHAR)); AS3_ByteArray_seek(data, 0, SEEK_SET); AS3_ByteArray_readBytes(ptr, data, dataSize); ptr[dataLen] = 0; qspOpenGameStatusFromString(ptr); free(ptr); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* Показ / скрытие окон */ AS3_Val QSPShowWindow(void *param, AS3_Val args) { int type; QSP_BOOL isShow; AS3_ArrayValue(args, "IntType, IntType", &type, &isShow); switch (type) { case QSP_WIN_ACTS: qspCurIsShowActs = isShow; break; case QSP_WIN_OBJS: qspCurIsShowObjs = isShow; break; case QSP_WIN_VARS: qspCurIsShowVars = isShow; break; case QSP_WIN_INPUT: qspCurIsShowInput = isShow; break; } return AS3_True(); }
/* Загрузка новой игры из памяти */ AS3_Val QSPLoadGameWorldFromData(void *param, AS3_Val args) { char *ptr; AS3_Val data; int dataSize; char *fileName; QSP_CHAR *fileNameWC; AS3_ArrayValue(args, "AS3ValType, IntType, StrType", &data, &dataSize, &fileName); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspResetError(); if (qspIsDisableCodeExec) return AS3_False(); ptr = (char *)malloc(dataSize + 3); AS3_ByteArray_seek(data, 0, SEEK_SET); AS3_ByteArray_readBytes(ptr, data, dataSize); ptr[dataSize] = ptr[dataSize + 1] = ptr[dataSize + 2] = 0; fileNameWC = qspC2W(fileName); qspOpenQuestFromData(ptr, dataSize + 3, fileNameWC, QSP_FALSE); free(fileNameWC); free(ptr); if (qspErrorNum) return AS3_False(); return AS3_True(); }
/* * Take the Lua stack item at index i and convert it into an * ActionScript value. */ AS3_Val get_as3_value_from_lua_stack_type(lua_State * L, int i, int type) { /* WARNING: Panic alert! Use L*_FN checkers here! */ LCALL(L, stack); AS3_Val value; switch (type) { case LUA_TSTRING: /* strings */ { size_t length = 0; const char * str = lua_tolstring(L, i, &length); if (str == NULL) /* NOTE: This is unreachable. Assert instead */ { length = 6; str = "(null)"; } /* NOTE: Alchemy .5a truncates embedded zeroes in string * regardless to the passed length */ value = AS3_StringN(str, length); } break; case LUA_TBOOLEAN: /* booleans */ value = lua_toboolean(L, i) ? AS3_True() : AS3_False(); break; case LUA_TNUMBER: /* numbers */ value = AS3_Number(lua_tonumber(L, i)); break; case LUA_TNONE: /* fall through */ case LUA_TNIL: /* nil */ value = AS3_Null(); break; case LUA_TUSERDATA: /* userdata */ { void * userdata = lua_touserdata(L, i); lua_getfield(L, LUA_REGISTRYINDEX, AS3LUA_METATABLE); if (userdata == NULL || !lua_getmetatable(L, i)) { lua_pop(L, 1); /* Pop AS3LUA_METATABLE */ value = as3_value_from_foreign_userdata(L, i); } else if (!lua_rawequal(L, -2, -1)) { lua_pop(L, 2); /* Pop AS3LUA_METATABLE and userdata metatable */ value = as3_value_from_foreign_userdata(L, i); } else { lua_pop(L, 2); /* Pop AS3LUA_METATABLE and userdata metatable */ AS3LuaUserData * userdata = (AS3LuaUserData *)lua_touserdata(L, i); value = userdata->value; /* * We just created one more reference to the AS3 value, * as it still lives inside Lua. * (And will probably be collected by GC.) */ AS3_Acquire(value); } } break; case LUA_TFUNCTION: /* function */ value = setup_callback(L, i); break; case LUA_TLIGHTUSERDATA: /* TODO: blackbox this type */ case LUA_TTABLE: /* TODO: deal with this type */ case LUA_TTHREAD: /* TODO: blackbox this type */ value = AS3_String(lua_typename(L, type)); break; default: /* unreachable */ fatal_error("unknown Lua type"); break; } #ifdef DO_SPAM SPAM(("get_as3_value_from_lua_stack(): end")); AS3_Trace( AS3_Call( getQualifiedClassName_method, NULL, AS3_Array("AS3ValType", value) ) ); #endif /* DO_SPAM */ LCHECK_FN(L, stack, 0, fatal_error); return value; }