/* Загрузка состояния из файла */ 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 QSPIsMainDescChanged(void *param, AS3_Val args) { if (qspIsMainDescChanged) return AS3_True(); else return AS3_False(); }
/* Выполнение кода указанной локации */ 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 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, 0); free(strWC); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* ------------------------------------------------------------ */ AS3_Val QSPIsInCallBack(void *param, AS3_Val args) { if (qspIsInCallBack) return AS3_True(); else return AS3_False(); }
/* Возможность изменения списка объектов */ AS3_Val QSPIsObjectsChanged(void *param, AS3_Val args) { if (qspIsObjectsChanged) return AS3_True(); else return AS3_False(); }
/* Сохранение состояния в память */ 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(); }
/* Установить индекс выбранного объекта */ 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 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 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(); }
/* Выполнение кода локации-счетчика */ 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(); }
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; }
/* * 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; }