/* Сохранение состояния в память */ 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 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(); }
fpos_t seekByteArray(void *cookie, fpos_t offs, int whence) { return AS3_ByteArray_seek((AS3_Val)cookie, offs, whence); }